diff --git a/apps/i2psnark/java/src/org/klomp/snark/UpdateHandler.java b/apps/i2psnark/java/src/org/klomp/snark/UpdateHandler.java
index ecb27c55d05e00f4034d1359a3784b7927f62aef..4e5b56a41990e5b6a483dacbbef9633994f58b4c 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/UpdateHandler.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/UpdateHandler.java
@@ -47,7 +47,6 @@ class UpdateHandler implements Updater {
             return null;
         UpdateRunner update = new UpdateRunner(_context, _umgr, _smgr, updateSources, newVersion);
         _umgr.notifyProgress(update, "<b>" + _smgr.util().getString("Updating") + "</b>");
-        update.start();
         return update;
     }
 }
diff --git a/apps/i2psnark/java/src/org/klomp/snark/UpdateRunner.java b/apps/i2psnark/java/src/org/klomp/snark/UpdateRunner.java
index a676f33ab8059d7ee3b37f921e83aeda60f55ff9..9699b70d7e9fe86e611eadfe1e6747aded82f14e 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/UpdateRunner.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/UpdateRunner.java
@@ -77,11 +77,6 @@ class UpdateRunner implements UpdateTask, CompleteListener {
      *  If it is, get the whole thing.
      */
     private void update() {
-        if (_urls.isEmpty()) {
-            _umgr.notifyTaskFailed(this, "", null);
-            return;
-        }
-
         for (URI uri : _urls) {
             _currentURI = uri;
             String updateURL = uri.toString();
@@ -102,7 +97,9 @@ class UpdateRunner implements UpdateTask, CompleteListener {
                     new Timeout();
                     break;
                 }
-            } catch (IllegalArgumentException iae) {}
+            } catch (IllegalArgumentException iae) {
+                _log.error("Invalid update URL", iae);
+            }
         }
         if (_snark == null)
             fatal("No valid URLs");
@@ -232,4 +229,9 @@ class UpdateRunner implements UpdateTask, CompleteListener {
     private void updateStatus(String s) {
         _umgr.notifyProgress(this, s);
     }
+
+    @Override
+    public String toString() {
+        return getClass().getName() + ' ' + getType() + ' ' + getID() + ' ' + getMethod() + ' ' + getURI();
+    }
 }
diff --git a/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java b/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java
index 7ba50c305ef963461a13aa3ca817c11dad3fc9e2..c264e61d33828e896f65f61ed8aeac44d16098bd 100644
--- a/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java
+++ b/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java
@@ -184,6 +184,7 @@ public class ConsoleUpdateManager implements UpdateManager {
                          if (_log.shouldLog(Log.INFO))
                              _log.info("Starting " + r);
                         _activeCheckers.add(t);
+                        t.start();
                     }
                 }
                 if (t != null) {
@@ -226,6 +227,7 @@ public class ConsoleUpdateManager implements UpdateManager {
                          if (_log.shouldLog(Log.INFO))
                              _log.info("Starting " + r);
                         _activeCheckers.add(t);
+                        t.start();
                         break;
                     }
                 }
@@ -517,6 +519,7 @@ public class ConsoleUpdateManager implements UpdateManager {
                         if (_log.shouldLog(Log.INFO))
                             _log.info("Starting " + r);
                         _downloaders.put(t, toTry);
+                        t.start();
                         return t;
                     } else {
                         if (_log.shouldLog(Log.WARN))
diff --git a/apps/routerconsole/java/src/net/i2p/router/update/NewsHandler.java b/apps/routerconsole/java/src/net/i2p/router/update/NewsHandler.java
index 5a3ed7501f19c7afa089a3a0657f22fdac9559c3..d54948a8481922f7f9b647ae5f7fc33294f3b070 100644
--- a/apps/routerconsole/java/src/net/i2p/router/update/NewsHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/update/NewsHandler.java
@@ -46,7 +46,6 @@ class NewsHandler extends UpdateHandler implements Checker {
             updateSources.add(new URI(BACKUP_NEWS_URL));
         } catch (URISyntaxException use) {}
         UpdateRunner update = new NewsFetcher(_context, _mgr, updateSources);
-        update.start();
         return update;
     }
 }
diff --git a/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateChecker.java b/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateChecker.java
index 56dd2e8a3dceee2d28e021de97f3b490cd498fe7..a9625feb9adef09f7484b441f65786e856428646 100644
--- a/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateChecker.java
+++ b/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateChecker.java
@@ -46,6 +46,9 @@ class PluginUpdateChecker extends UpdateRunner {
 
     @Override
     public UpdateType getType() { return UpdateType.PLUGIN; }
+
+    @Override
+    public String getID() { return _appName; }
     
     @Override
     public void run() {
diff --git a/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateHandler.java
index 3f38724efd31afafe57da7e0d6ecfc7e8c59bb33..12847fc8e2dbe99cb777896e6fd9e82169f08fa6 100644
--- a/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateHandler.java
@@ -57,7 +57,6 @@ class PluginUpdateHandler implements Checker, Updater {
         }
 
         UpdateRunner update = new PluginUpdateChecker(_context, _mgr, updateSources, appName, oldVersion);
-        update.start();
         return update;
     }
     
@@ -78,7 +77,6 @@ class PluginUpdateHandler implements Checker, Updater {
         UpdateRunner update = new PluginUpdateRunner(_context, _mgr, updateSources, appName, oldVersion);
         // set status before thread to ensure UI feedback
         _mgr.notifyProgress(update, "<b>" + _mgr._("Updating") + "</b>");
-        update.start();
         return update;
     }
 }
diff --git a/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateRunner.java b/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateRunner.java
index ddf4a75a3b217adf13d4d6721db35ec48b467a69..6265496379e6ee6f403980aabd1e642ff5987a28 100644
--- a/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateRunner.java
+++ b/apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateRunner.java
@@ -74,6 +74,9 @@ class PluginUpdateRunner extends UpdateRunner {
     @Override
     public URI getURI() { return _uri; }
 
+    @Override
+    public String getID() { return _appName; }
+
         @Override
         protected void update() {
 
diff --git a/apps/routerconsole/java/src/net/i2p/router/update/UnsignedUpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/update/UnsignedUpdateHandler.java
index 15db5c9266adf658c2b7aae90fb10e9a5a2eb68e..0cfcbc94955389290409aca1fcfc24c4e4cea7d3 100644
--- a/apps/routerconsole/java/src/net/i2p/router/update/UnsignedUpdateHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/update/UnsignedUpdateHandler.java
@@ -71,7 +71,6 @@ class UnsignedUpdateHandler implements Checker, Updater {
         }
 
         UpdateRunner update = new UnsignedUpdateChecker(_context, _mgr, updateSources, ms);
-        update.start();
         return update;
     }
 
@@ -91,7 +90,6 @@ class UnsignedUpdateHandler implements Checker, Updater {
         UpdateRunner update = new UnsignedUpdateRunner(_context, _mgr, updateSources);
         // set status before thread to ensure UI feedback
         _mgr.notifyProgress(update, "<b>" + _mgr._("Updating") + "</b>");
-        update.start();
         return update;
     }
 }
diff --git a/apps/routerconsole/java/src/net/i2p/router/update/UpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/update/UpdateHandler.java
index 3af9837167d0c0b008453d3707beed0cdfaa7fb8..3ff73e4d31d73741d350834d1dcdc892ef7e4372 100644
--- a/apps/routerconsole/java/src/net/i2p/router/update/UpdateHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/update/UpdateHandler.java
@@ -44,7 +44,6 @@ class UpdateHandler implements Updater {
         UpdateRunner update = new UpdateRunner(_context, _mgr, updateSources);
         // set status before thread to ensure UI feedback
         _mgr.notifyProgress(update, "<b>" + _mgr._("Updating") + "</b>");
-        update.start();
         return update;
     }
 }
diff --git a/apps/routerconsole/java/src/net/i2p/router/update/UpdateRunner.java b/apps/routerconsole/java/src/net/i2p/router/update/UpdateRunner.java
index 813713220ca4d35195cee0be9d32491be78568b2..bb952bc50bd42f7601bf2bd4d9e9182dfaea8bfd 100644
--- a/apps/routerconsole/java/src/net/i2p/router/update/UpdateRunner.java
+++ b/apps/routerconsole/java/src/net/i2p/router/update/UpdateRunner.java
@@ -236,4 +236,9 @@ class UpdateRunner extends I2PAppThread implements UpdateTask, EepGet.StatusList
     protected String _(String s, Object o) {
         return _mgr._(s, o);
     }
+
+    @Override
+    public String toString() {
+        return getClass().getName() + ' ' + getType() + ' ' + getID() + ' ' + getMethod() + ' ' + getURI();
+    }
 }
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
index 1d0434441976134ea23a0b825bbb7965244bb016..63bf2a564679df06f9e30b4c7536e3eb26387933 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
@@ -652,8 +652,10 @@ public class SummaryHelper extends HelperBase {
         StringBuilder buf = new StringBuilder(512);
         // display all the time so we display the final failure message, and plugin update messages too
         String status = NewsHelper.getUpdateStatus();
+        boolean needSpace = false;
         if (status.length() > 0) {
             buf.append("<h4>").append(status).append("</h4>\n");
+            needSpace = true;
         }
         String dver = NewsHelper.updateVersionDownloaded();
         if (dver == null)
@@ -661,6 +663,10 @@ public class SummaryHelper extends HelperBase {
         if (dver != null &&
             !NewsHelper.isUpdateInProgress() &&
             !_context.router().gracefulShutdownInProgress()) {
+            if (needSpace)
+                buf.append("<hr>");
+            else
+                needSpace = true;
             buf.append("<h4><b>").append(_("Update downloaded")).append("<br>");
             if (_context.hasWrapper())
                 buf.append(_("Click Restart to install"));
@@ -675,6 +681,8 @@ public class SummaryHelper extends HelperBase {
             _context.portMapper().getPort(PortMapper.SVC_HTTP_PROXY) > 0 &&  // assume using proxy for now
             getAction() == null &&
             getUpdateNonce() == null) {
+                if (needSpace)
+                    buf.append("<hr>");
                 long nonce = _context.random().nextLong();
                 String prev = System.getProperty("net.i2p.router.web.UpdateHandler.nonce");
                 if (prev != null)
diff --git a/core/java/src/net/i2p/update/UpdateTask.java b/core/java/src/net/i2p/update/UpdateTask.java
index 97944b0e0cb9ffe3875e9d490ad06b96a410b7a1..f9b383062dcec7949a4407b69d05ef68fd226d2c 100644
--- a/core/java/src/net/i2p/update/UpdateTask.java
+++ b/core/java/src/net/i2p/update/UpdateTask.java
@@ -9,6 +9,11 @@ import java.net.URI;
  */
 public interface UpdateTask {
     
+    /**
+     *  Tasks must not start themselves in the constructor. Do it here.
+     */
+    public void start();
+
     public void shutdown();
 
     public boolean isRunning();