diff --git a/apps/routerconsole/jsp/default.css b/apps/routerconsole/jsp/default.css
index 527a7c9bea4a947a9655e516fd0d696381c7e47d..9b1db4cdb23689cdfe5e655b98f778fe8e5bdd08 100644
--- a/apps/routerconsole/jsp/default.css
+++ b/apps/routerconsole/jsp/default.css
@@ -1,3 +1,9 @@
+/***
+html {
+	font-size: 14px;
+}
+***/
+
 body {
 	font-family: Verdana, Tahoma, Helvetica, sans-serif;
 	margin: 1em 0em;
@@ -5,6 +11,7 @@ body {
 	text-align: center;
 	background-color: white;
 	color: black;
+	font-size: 100%;
 }
 
 .hide {
@@ -30,23 +37,24 @@ div.toolbar {
 	font-weight: bold;
 }
 
-div.routersummary {
-	/* width: 8em; */
-	/* height: 5em; */
-	/* position: fixed; */
+div.routersummaryouter {
 	float: left;
-	width: 200px;
-	/* left: 1em; */
-	/* top: 1em; */
+	width: 215px;
+	margin: 0;
+	padding: 0;
+	border: 0;
+	clear: left; /* fixes a bug in Opera */
+	overflow: auto;
+}
+
+div.routersummary {
+	background-color: #fafaff;
+	width: 195px;
+	color: inherit;
 	margin: 0em;
-	padding: .5em;
+	padding: 5px;
 	text-align: left;
 	border: medium solid #efefff;
-	background-color: #fafaff;
-	color: inherit;
-	font-size: small;
-	clear: left; /* fixes a bug in Opera */
-	overflow: auto;
 }
 
 div.warning {
@@ -67,6 +75,10 @@ div.main {
 	color: inherit;
 }
 
+div.main textarea {
+	width: 100%;
+}
+
 div.news {
 	margin: 0em 1em 1em 224px;
 	padding: .5em 1em;
diff --git a/apps/routerconsole/jsp/summary.jsp b/apps/routerconsole/jsp/summary.jsp
index c3b7f8a74cb322187bb26b4109857852e49ba3cd..46bbd0ee4a74dab799a48b6f203088d5cc1cf739 100644
--- a/apps/routerconsole/jsp/summary.jsp
+++ b/apps/routerconsole/jsp/summary.jsp
@@ -1,102 +1,30 @@
-<%@page import="net.i2p.router.web.SummaryHelper" %>
-<jsp:useBean class="net.i2p.router.web.SummaryHelper" id="helper" scope="request" />
-<jsp:setProperty name="helper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
-
-<jsp:useBean class="net.i2p.router.web.ReseedHandler" id="reseed" scope="request" />
-<jsp:setProperty name="reseed" property="*" />
-<jsp:useBean class="net.i2p.router.web.UpdateHandler" id="update" scope="request" />
-<jsp:setProperty name="update" property="*" />
-<jsp:setProperty name="update" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
-<jsp:useBean class="net.i2p.router.web.ConfigUpdateHelper" id="uhelper" scope="request" />
-<jsp:setProperty name="uhelper" property="*" />
-<jsp:setProperty name="uhelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
-
+<% // put width here too to prevent bad layout at startup %>
+<div class="routersummaryouter" style="width: 215px;">
+<%
+    // skip the iframe if refresh disabled
+    String d = request.getParameter("refresh");
+    String newDelay = "";
+    if (d == null || "".equals(d))
+        d = System.getProperty("routerconsole.summaryRefresh");
+    else
+        // pass the new delay parameter to the iframe
+        newDelay = "?refresh=" + d;
+    if (!"0".equals(d))
+        out.print("<iframe src=\"summaryframe.jsp" + newDelay + "\" height=\"1000\" width=\"100%\" scrolling=\"auto\" frameborder=\"0\" allowtransparency=\"true\">\n");
+%>
 <div class="routersummary">
- <center><b><a href="config.jsp">Configuration</a>&nbsp;&nbsp;<a href="help.jsp">Help</a></b></center>
- <hr />
-
- <u><b>General</b></u><br />
- <b>Ident:</b> (<a title="Your router identity is <jsp:getProperty name="helper" property="ident" />, never reveal it to anyone" href="netdb.jsp?r=.">view</a>)<br />
- <b>Version:</b> <jsp:getProperty name="helper" property="version" /><br />
- <b>Uptime:</b> <jsp:getProperty name="helper" property="uptime" /><br />
- <b>Now:</b> <jsp:getProperty name="helper" property="time" /><br />
- <b>Reachability:</b> <a href="config.jsp#help"><jsp:getProperty name="helper" property="reachability" /></a><%
-    if (helper.updateAvailable()) {
-        // display all the time so we display the final failure message
-        out.print("<br />" + update.getStatus());
-        if ("true".equals(System.getProperty("net.i2p.router.web.UpdateHandler.updateInProgress", "false"))) {
-        } else if(!update.isDone()) {
-            long nonce = new java.util.Random().nextLong();
-            String prev = System.getProperty("net.i2p.router.web.UpdateHandler.nonce");
-            if (prev != null) System.setProperty("net.i2p.router.web.UpdateHandler.noncePrev", prev);
-            System.setProperty("net.i2p.router.web.UpdateHandler.nonce", nonce+"");
-            String uri = request.getRequestURI();
-            out.print("<p><form action=\"" + uri + "\" method=\"GET\">\n");
-            out.print("<input type=\"hidden\" name=\"updateNonce\" value=\"" + nonce + "\" >\n");
-            out.print("<input type=\"submit\" value=\"Download " + uhelper.getUpdateVersion() + " Update\" ></form></p>\n");
-        }
+<%@include file="summarynoframe.jsp" %>
+<%
+    // d defined above
+    if (!"0".equals(d)) {
+        out.print("</div></iframe>\n");
+    } else {
+        // since we don't have an iframe this will reload the base page, and
+        // the new delay will be passed to the iframe above
+        out.print("<hr /><p><form action=\"" + request.getRequestURI() + "\" method=\"GET\">\n");
+        out.print("<b>Refresh (s):</b> <input size=\"3\" type=\"text\" name=\"refresh\" value=\"60\" />\n");
+        out.print("<button type=\"submit\">Enable</button>\n");
+        out.print("</form></p></div>\n");
     }
- %>
- <p>
- <%=net.i2p.router.web.ConfigRestartBean.renderStatus(request.getRequestURI(), request.getParameter("action"), request.getParameter("consoleNonce"))%>
- </p>
- <hr />
- 
- <u><b><a href="peers.jsp">Peers</a></b></u><br />
- <b>Active:</b> <jsp:getProperty name="helper" property="activePeers" />/<jsp:getProperty name="helper" property="activeProfiles" /><br />
- <b>Fast:</b> <jsp:getProperty name="helper" property="fastPeers" /><br />
- <b>High capacity:</b> <jsp:getProperty name="helper" property="highCapacityPeers" /><br />
- <b>Well integrated:</b> <jsp:getProperty name="helper" property="wellIntegratedPeers" /><br />
- <b>Known:</b> <jsp:getProperty name="helper" property="allPeers" /><br /><%
-    if (helper.getActivePeers() <= 0) {
-        %><b><a href="config.jsp">check your NAT/firewall</a></b><br /><%
-    }
-    // If showing the reseed link is allowed
-    if (helper.allowReseed()) {
-        if ("true".equals(System.getProperty("net.i2p.router.web.ReseedHandler.reseedInProgress", "false"))) {
-            // While reseed occurring, show status message instead
-            out.print("<i>" + System.getProperty("net.i2p.router.web.ReseedHandler.statusMessage","") + "</i><br />");
-        } else {
-            // While no reseed occurring, show reseed link
-            long nonce = new java.util.Random().nextLong();
-            String prev = System.getProperty("net.i2p.router.web.ReseedHandler.nonce");
-            if (prev != null) System.setProperty("net.i2p.router.web.ReseedHandler.noncePrev", prev);
-            System.setProperty("net.i2p.router.web.ReseedHandler.nonce", nonce+"");
-            String uri = request.getRequestURI();
-            out.print("<p><form action=\"" + uri + "\" method=\"GET\">\n");
-            out.print("<input type=\"hidden\" name=\"reseedNonce\" value=\"" + nonce + "\" >\n");
-            out.print("<button type=\"submit\" >Reseed</button></form></p>\n");
-        }
-    }
-    // If a new reseed ain't running, and the last reseed had errors, show error message
-    if ("false".equals(System.getProperty("net.i2p.router.web.ReseedHandler.reseedInProgress", "false"))) {
-        String reseedErrorMessage = System.getProperty("net.i2p.router.web.ReseedHandler.errorMessage","");
-        if (reseedErrorMessage.length() > 0) {
-            out.print("<i>" + reseedErrorMessage + "</i><br />");
-        }
-    }
- %><hr />
- 
- <u><b><a href="config.jsp" title="Configure the bandwidth limits">Bandwidth in/out</a></b></u><br />
- <b>1s:</b> <jsp:getProperty name="helper" property="inboundSecondKBps" />/<jsp:getProperty name="helper" property="outboundSecondKBps" />KBps<br />
- <b>5m:</b> <jsp:getProperty name="helper" property="inboundFiveMinuteKBps" />/<jsp:getProperty name="helper" property="outboundFiveMinuteKBps" />KBps<br />
- <b>Total:</b> <jsp:getProperty name="helper" property="inboundLifetimeKBps" />/<jsp:getProperty name="helper" property="outboundLifetimeKBps" />KBps<br />
- <b>Used:</b> <jsp:getProperty name="helper" property="inboundTransferred" />/<jsp:getProperty name="helper" property="outboundTransferred" /><br />
- <hr />
- 
- <jsp:getProperty name="helper" property="destinations" />
- 
- <u><b>Tunnels in/out</b></u><br />
- <b>Exploratory:</b> <jsp:getProperty name="helper" property="inboundTunnels" />/<jsp:getProperty name="helper" property="outboundTunnels" /><br />
- <b>Client:</b> <jsp:getProperty name="helper" property="inboundClientTunnels" />/<jsp:getProperty name="helper" property="outboundClientTunnels" /><br />
- <b>Participating:</b> <jsp:getProperty name="helper" property="participatingTunnels" /><br />
- <hr />
- 
- <u><b>Congestion</b></u><br />
- <b>Job lag:</b> <jsp:getProperty name="helper" property="jobLag" /><br />
- <b>Message delay:</b> <jsp:getProperty name="helper" property="messageDelay" /><br />
- <b>Tunnel lag:</b> <jsp:getProperty name="helper" property="tunnelLag" /><br />
- <b>Handle backlog:</b> <jsp:getProperty name="helper" property="inboundBacklog" /><br />
- <b><jsp:getProperty name="helper" property="tunnelStatus" /></b><br />
- 
+%>
 </div>
diff --git a/apps/routerconsole/jsp/summaryframe.jsp b/apps/routerconsole/jsp/summaryframe.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..627fe328c8ad5888d96c3bf464b029f1ca443680
--- /dev/null
+++ b/apps/routerconsole/jsp/summaryframe.jsp
@@ -0,0 +1,68 @@
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<%
+/*
+ * All links in the summary bar must have target="_top"
+ * so they don't load in the iframe
+ */
+%>
+
+<html><head>
+<title>Summary Bar</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<%
+    // try hard to avoid an error page in the iframe after shutdown
+    String action = request.getParameter("action");
+    String d = request.getParameter("refresh");
+    boolean shutdownSoon = "shutdownImmediate".equals(action) || "restartImmediate".equals(action);
+    if (!shutdownSoon) {
+        if (d == null || "".equals(d)) {
+            d = System.getProperty("routerconsole.summaryRefresh");
+            if (d == null || "".equals(d))
+                d = "60";
+        } else {
+            System.setProperty("routerconsole.summaryRefresh", d);
+        }
+        // we probably don't get here if d == "0" since caught in summary.jsp, but just
+        // to be sure...
+        if (!"0".equals(d)) {
+            // doesn't work for restart or shutdown with no expl. tunnels,
+            // since the call to ConfigRestartBean.renderStatus() hasn't happened yet...
+            long timeleft = net.i2p.router.web.ConfigRestartBean.getRestartTimeRemaining();
+            long delay = 60;
+            try { delay = Long.parseLong(d); } catch (NumberFormatException nfe) {}
+            if (delay*1000 < timeleft + 5000)
+                out.print("<meta http-equiv=\"refresh\" content=\"" + d + "\" />\n");
+            else
+                shutdownSoon = true;
+        }
+    }
+%>
+<link rel="stylesheet" href="default.css" type="text/css" />
+</head>
+
+<body style="margin: 0;">
+
+<div class="routersummary">
+<%@include file="summarynoframe.jsp" %>
+<%
+    // d and shutdownSoon defined above
+    if (!shutdownSoon) {
+        out.print("<hr /><p><form action=\"summaryframe.jsp\" method=\"GET\">\n");
+        if ("0".equals(d)) {
+            out.print("<b>Refresh (s):<b> <input size=\"3\" type=\"text\" name=\"refresh\" value=\"60\" />\n");
+            out.print("<button type=\"submit\">Enable</button>\n");
+        } else {
+            // this will load in the iframe but subsequent pages will not have the iframe
+            out.print("<input type=\"hidden\" name=\"refresh\" value=\"0\" />\n");
+            out.print("<button type=\"submit\">Disable " + d + "s Refresh</button>\n");
+        }
+        out.print("</form></p>\n");
+    }
+%>
+</div>
+
+</body>
+</html>
diff --git a/apps/routerconsole/jsp/summarynoframe.jsp b/apps/routerconsole/jsp/summarynoframe.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..f3f8b800246fa7f02d8dede10c92cba8dbd92708
--- /dev/null
+++ b/apps/routerconsole/jsp/summarynoframe.jsp
@@ -0,0 +1,100 @@
+<%@page import="net.i2p.router.web.SummaryHelper" %>
+<jsp:useBean class="net.i2p.router.web.SummaryHelper" id="helper" scope="request" />
+<jsp:setProperty name="helper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
+
+<jsp:useBean class="net.i2p.router.web.ReseedHandler" id="reseed" scope="request" />
+<jsp:setProperty name="reseed" property="*" />
+<jsp:useBean class="net.i2p.router.web.UpdateHandler" id="update" scope="request" />
+<jsp:setProperty name="update" property="*" />
+<jsp:setProperty name="update" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
+<jsp:useBean class="net.i2p.router.web.ConfigUpdateHelper" id="uhelper" scope="request" />
+<jsp:setProperty name="uhelper" property="*" />
+<jsp:setProperty name="uhelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
+
+ <center><b><a href="config.jsp" target="_top">Configuration</a>&nbsp;&nbsp;<a href="help.jsp" target="_top">Help</a></b></center>
+ <hr />
+
+ <u><b>General</b></u><br />
+ <b>Ident:</b> (<a title="Your router identity is <jsp:getProperty name="helper" property="ident" />, never reveal it to anyone" href="netdb.jsp?r=." target="_top">view</a>)<br />
+ <b>Version:</b> <jsp:getProperty name="helper" property="version" /><br />
+ <b>Uptime:</b> <jsp:getProperty name="helper" property="uptime" /><br />
+ <b>Now:</b> <jsp:getProperty name="helper" property="time" /><br />
+ <b>Reachability:</b> <a href="config.jsp#help" target="_top"><jsp:getProperty name="helper" property="reachability" /></a><%
+    if (helper.updateAvailable()) {
+        // display all the time so we display the final failure message
+        out.print("<br />" + update.getStatus());
+        if ("true".equals(System.getProperty("net.i2p.router.web.UpdateHandler.updateInProgress", "false"))) {
+        } else if(!update.isDone()) {
+            long nonce = new java.util.Random().nextLong();
+            String prev = System.getProperty("net.i2p.router.web.UpdateHandler.nonce");
+            if (prev != null) System.setProperty("net.i2p.router.web.UpdateHandler.noncePrev", prev);
+            System.setProperty("net.i2p.router.web.UpdateHandler.nonce", nonce+"");
+            String uri = request.getRequestURI();
+            out.print("<p><form action=\"" + uri + "\" method=\"GET\">\n");
+            out.print("<input type=\"hidden\" name=\"updateNonce\" value=\"" + nonce + "\" />\n");
+            out.print("<input type=\"submit\" value=\"Download " + uhelper.getUpdateVersion() + " Update\" /></form></p>\n");
+        }
+    }
+ %>
+ <p>
+ <%=net.i2p.router.web.ConfigRestartBean.renderStatus(request.getRequestURI(), request.getParameter("action"), request.getParameter("consoleNonce"))%>
+ </p>
+ <hr />
+ 
+ <u><b><a href="peers.jsp" target="_top">Peers</a></b></u><br />
+ <b>Active:</b> <jsp:getProperty name="helper" property="activePeers" />/<jsp:getProperty name="helper" property="activeProfiles" /><br />
+ <b>Fast:</b> <jsp:getProperty name="helper" property="fastPeers" /><br />
+ <b>High capacity:</b> <jsp:getProperty name="helper" property="highCapacityPeers" /><br />
+ <b>Well integrated:</b> <jsp:getProperty name="helper" property="wellIntegratedPeers" /><br />
+ <b>Known:</b> <jsp:getProperty name="helper" property="allPeers" /><br /><%
+    if (helper.getActivePeers() <= 0) {
+        %><b><a href="config.jsp" target="_top">check your NAT/firewall</a></b><br /><%
+    }
+    // If showing the reseed link is allowed
+    if (helper.allowReseed()) {
+        if ("true".equals(System.getProperty("net.i2p.router.web.ReseedHandler.reseedInProgress", "false"))) {
+            // While reseed occurring, show status message instead
+            out.print("<i>" + System.getProperty("net.i2p.router.web.ReseedHandler.statusMessage","") + "</i><br />");
+        } else {
+            // While no reseed occurring, show reseed link
+            long nonce = new java.util.Random().nextLong();
+            String prev = System.getProperty("net.i2p.router.web.ReseedHandler.nonce");
+            if (prev != null) System.setProperty("net.i2p.router.web.ReseedHandler.noncePrev", prev);
+            System.setProperty("net.i2p.router.web.ReseedHandler.nonce", nonce+"");
+            String uri = request.getRequestURI();
+            out.print("<p><form action=\"" + uri + "\" method=\"GET\">\n");
+            out.print("<input type=\"hidden\" name=\"reseedNonce\" value=\"" + nonce + "\" />\n");
+            out.print("<button type=\"submit\" >Reseed</button></form></p>\n");
+        }
+    }
+    // If a new reseed ain't running, and the last reseed had errors, show error message
+    if ("false".equals(System.getProperty("net.i2p.router.web.ReseedHandler.reseedInProgress", "false"))) {
+        String reseedErrorMessage = System.getProperty("net.i2p.router.web.ReseedHandler.errorMessage","");
+        if (reseedErrorMessage.length() > 0) {
+            out.print("<i>" + reseedErrorMessage + "</i><br />");
+        }
+    }
+ %><hr />
+ 
+ <u><b><a href="config.jsp" title="Configure the bandwidth limits" target="_top">Bandwidth in/out</a></b></u><br />
+ <b>1s:</b> <jsp:getProperty name="helper" property="inboundSecondKBps" />/<jsp:getProperty name="helper" property="outboundSecondKBps" />KBps<br />
+ <b>5m:</b> <jsp:getProperty name="helper" property="inboundFiveMinuteKBps" />/<jsp:getProperty name="helper" property="outboundFiveMinuteKBps" />KBps<br />
+ <b>Total:</b> <jsp:getProperty name="helper" property="inboundLifetimeKBps" />/<jsp:getProperty name="helper" property="outboundLifetimeKBps" />KBps<br />
+ <b>Used:</b> <jsp:getProperty name="helper" property="inboundTransferred" />/<jsp:getProperty name="helper" property="outboundTransferred" /><br />
+ <hr />
+ 
+ <jsp:getProperty name="helper" property="destinations" />
+ 
+ <u><b>Tunnels in/out</b></u><br />
+ <b>Exploratory:</b> <jsp:getProperty name="helper" property="inboundTunnels" />/<jsp:getProperty name="helper" property="outboundTunnels" /><br />
+ <b>Client:</b> <jsp:getProperty name="helper" property="inboundClientTunnels" />/<jsp:getProperty name="helper" property="outboundClientTunnels" /><br />
+ <b>Participating:</b> <jsp:getProperty name="helper" property="participatingTunnels" /><br />
+ <hr />
+ 
+ <u><b>Congestion</b></u><br />
+ <b>Job lag:</b> <jsp:getProperty name="helper" property="jobLag" /><br />
+ <b>Message delay:</b> <jsp:getProperty name="helper" property="messageDelay" /><br />
+ <b>Tunnel lag:</b> <jsp:getProperty name="helper" property="tunnelLag" /><br />
+ <b>Handle backlog:</b> <jsp:getProperty name="helper" property="inboundBacklog" /><br />
+ <b><jsp:getProperty name="helper" property="tunnelStatus" /></b><br />
+