diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHelper.java
index 3af4ffafb5f9c0e519c3f99c01371b3b8672d801..a583c3ed4243c65f7ff6aeda8872656535f2b85d 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHelper.java
@@ -35,16 +35,13 @@ public class ConfigStatsHelper extends HelperBase {
     /**
      * Configure this bean to query a particular router context
      *
-     * @param contextId begging few characters of the routerHash, or null to pick
+     * @param contextId beginning few characters of the routerHash, or null to pick
      *                  the first one we come across.
      */
+    @Override
     public void setContextId(String contextId) {
-        try {
-            _context = ContextHelper.getContext(contextId);
-            _log = _context.logManager().getLog(ConfigStatsHelper.class);
-        } catch (Throwable t) {
-            t.printStackTrace();
-        }
+        super.setContextId(contextId);
+        _log = _context.logManager().getLog(ConfigStatsHelper.class);
         
         _stats = new ArrayList();
         Map groups = _context.statManager().getStatsByGroup();
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/HelperBase.java b/apps/routerconsole/java/src/net/i2p/router/web/HelperBase.java
index db5aa9ba249f9f7f35a3ac62ae53c214f0797732..848e48d50dfb38540ce0ab973953418e0f9a299b 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/HelperBase.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/HelperBase.java
@@ -14,7 +14,7 @@ public abstract class HelperBase {
     /**
      * Configure this bean to query a particular router context
      *
-     * @param contextId begging few characters of the routerHash, or null to pick
+     * @param contextId beginning few characters of the routerHash, or null to pick
      *                  the first one we come across.
      */
     public void setContextId(String contextId) {
@@ -25,5 +25,8 @@ public abstract class HelperBase {
         }
     }
 
+    /** might be useful in the jsp's */
+    //public RouterContext getContext() { return _context; }
+
     public void setWriter(Writer out) { _out = out; }
 }
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java
index bbf9852c3905fd908a3585b36eb5be71a7ce3241..22ee8a38b456e927a15f2a24bd1ccfd1f228aa26 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java
@@ -205,6 +205,7 @@ public class RouterConsoleRunner {
         }
     }
     
+/*******
     public void stopConsole() {
         try {
             _server.stop();
@@ -212,6 +213,7 @@ public class RouterConsoleRunner {
             ie.printStackTrace();
         }
     }
+********/
     
     public static Properties webAppProperties() {
         Properties rv = new Properties();
diff --git a/router/java/src/net/i2p/router/CommSystemFacade.java b/router/java/src/net/i2p/router/CommSystemFacade.java
index e8a45724e0a12af3179c821395d4e5fe9f0624e2..407cb28b21347cfb2c6f04499c8fbfa5f300f655 100644
--- a/router/java/src/net/i2p/router/CommSystemFacade.java
+++ b/router/java/src/net/i2p/router/CommSystemFacade.java
@@ -64,7 +64,9 @@ public abstract class CommSystemFacade implements Service {
     public void queueLookup(byte[] ip) {}
     public String getCountry(Hash peer) { return null; }
     public String getCountryName(String code) { return code; }
-    public String renderPeerHTML(Hash peer) { return null; }
+    public String renderPeerHTML(Hash peer) {
+        return peer.toBase64().substring(0, 4);
+    }
     
     /** 
      * Tell other transports our address changed
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
index 621ec27369be33f7aea63ead8a378a4d5fdd337a..644dcbb39c4fa44649f6a64ec53928b9c3b29bee 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
@@ -481,6 +481,8 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
     private static final long PUBLISH_DELAY = 3*1000;
     public void publish(LeaseSet localLeaseSet) {
         if (!_initialized) return;
+        if (_context.router().gracefulShutdownInProgress())
+            return;
         Hash h = localLeaseSet.getDestination().calculateHash();
         try {
             store(h, localLeaseSet);
@@ -517,6 +519,8 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
      */
     public void publish(RouterInfo localRouterInfo) throws IllegalArgumentException {
         if (!_initialized) return;
+        if (_context.router().gracefulShutdownInProgress())
+            return;
         // This isn't really used for anything
         // writeMyInfo(localRouterInfo);
         if (_context.router().isHidden()) return; // DE-nied!
@@ -1072,6 +1076,10 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
         out.flush();
     }
     
+    /**
+     *  Be careful to use stripHTML for any displayed routerInfo data
+     *  to prevent vulnerabilities
+     */
     private void renderRouterInfo(StringBuilder buf, RouterInfo info, boolean isUs, boolean full) {
         String hash = info.getIdentity().getHash().toBase64();
         buf.append("<a name=\"").append(hash.substring(0, 6)).append("\" ></a>");
@@ -1096,7 +1104,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
         }
         for (Iterator iter = info.getAddresses().iterator(); iter.hasNext(); ) {
             RouterAddress addr = (RouterAddress)iter.next();
-            buf.append(addr.getTransportStyle()).append(": ");
+            buf.append(DataHelper.stripHTML(addr.getTransportStyle())).append(": ");
             for (Iterator optIter = addr.getOptions().keySet().iterator(); optIter.hasNext(); ) {
                 String name = (String)optIter.next();
                 String val = addr.getOptions().getProperty(name);
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/StartExplorersJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/StartExplorersJob.java
index 25b82e6976448338fa18f743269508077e31de57..bb09e6e2d270c8b14e07b4c643cd12d3b9185e57 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/StartExplorersJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/StartExplorersJob.java
@@ -42,7 +42,8 @@ class StartExplorersJob extends JobImpl {
     
     public String getName() { return "Start Explorers Job"; }
     public void runJob() {
-        if (! ((FloodfillNetworkDatabaseFacade)_facade).floodfillEnabled()) {
+        if (! (((FloodfillNetworkDatabaseFacade)_facade).floodfillEnabled() ||
+               getContext().router().gracefulShutdownInProgress())) {
             Set toExplore = selectKeysToExplore();
             if (_log.shouldLog(Log.DEBUG))
                 _log.debug("Keys to explore during this run: " + toExplore);
diff --git a/router/java/src/net/i2p/router/transport/VMCommSystem.java b/router/java/src/net/i2p/router/transport/VMCommSystem.java
index ab16b8c797741be8af18705488fa8ee96cf4d69b..bbaefc3c3bd3f89859950e76e461fd3b001aa942 100644
--- a/router/java/src/net/i2p/router/transport/VMCommSystem.java
+++ b/router/java/src/net/i2p/router/transport/VMCommSystem.java
@@ -1,7 +1,9 @@
 package net.i2p.router.transport;
 
 import java.io.ByteArrayInputStream;
+import java.io.IOException;
 import java.io.OutputStream;
+import java.io.Writer;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
@@ -150,5 +152,7 @@ public class VMCommSystem extends CommSystemFacade {
         _commSystemFacades.put(_context.routerHash(), this);
     }
     
-    public void renderStatusHTML(OutputStream out) {}
+    public void renderStatusHTML(Writer out, String urlBase, int sortFlags) throws IOException { 
+        out.write("Dummy! i2p.vmCommSystem=true!");
+    }
 }
diff --git a/router/java/src/net/i2p/router/tunnel/pool/ExploratoryPeerSelector.java b/router/java/src/net/i2p/router/tunnel/pool/ExploratoryPeerSelector.java
index 8971b8ba3efabcbd8eeecc5b55184ab65cde047f..073088fb304f566687adce31106d3e7f1c7ef76d 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/ExploratoryPeerSelector.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/ExploratoryPeerSelector.java
@@ -73,6 +73,9 @@ class ExploratoryPeerSelector extends TunnelPeerSelector {
         // no need to explore too wildly at first
         if (ctx.router().getUptime() <= 5*60*1000)
             return true;
+        // or at the end
+        if (ctx.router().gracefulShutdownInProgress())
+            return true;
         // ok, if we aren't explicitly asking for it, we should try to pick peers
         // randomly from the 'not failing' pool.  However, if we are having a
         // hard time building exploratory tunnels, lets fall back again on the