diff --git a/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java
index 9a1aae4a93461eca633e1a2f3d476cb8954f928d..420d6bbeaced2286351073b79aa59725a786c282 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java
@@ -35,7 +35,7 @@ public class HomeHelper extends HelperBase {
         _x("Help") + S + _x("I2P Router Help") + S + "/help" + S + I + "support.png" + S +
         _x("Manage Plugins") + S + _x("Install and configure I2P plugins") + S + "/configplugins" + S + I + "plugin.png" + S +
         _x("Router Console") + S + _x("I2P Router Console") + S + "/console" + S + I + "info/console.png" + S +
-        _x("Torrents") + S + _x("Built-in anonymous BitTorrent Client") + S + "/i2psnark/" + S + I + "magnet.png" + S +
+        _x("Torrents") + S + _x("Built-in anonymous BitTorrent Client") + S + "/i2psnark/" + S + I + "i2psnark.png" + S +
         _x("Web Server") + S + _x("Local web server for hosting your own content on I2P") + S + "http://127.0.0.1:7658/" + S + I + "server_32x32.png" + S +
         "";
 
@@ -61,7 +61,7 @@ public class HomeHelper extends HelperBase {
         _x("Open4You") + S + _x("Free eepsite hosting with PHP and MySQL") + S + "http://open4you.i2p/" + S + I + "open4you-logo.png" + S +
         _x("Pastebin") + S + _x("Encrypted I2P Pastebin") + S + "http://zerobin.i2p/" + S + I + "paste_plain.png" + S +
         _x("Planet I2P") + S + _x("I2P News") + S + "http://planet.i2p/" + S + I + "world.png" + S +
-        _x("I2P Plugins") + S + _x("Add-on directory") + S + "http://i2pwiki.i2p/index.php?title=Plugins" + S + I + "plugin.png" + S +
+        _x("I2P Plugins") + S + _x("Add-on directory") + S + "http://i2pwiki.i2p/index.php?title=Plugins" + S + I + "info/plugin_link.png" + S +
         _x("Postman's Tracker") + S + _x("Bittorrent tracker") + S + "http://tracker2.postman.i2p/" + S + I + "magnet.png" + S +
         _x("Project Website") + S + _x("I2P home page") + S + "http://i2p-projekt.i2p/" + S + I + "info_rhombus.png" + S +
         //_x("lenta news [ru]") + S + _x("Russian News Feed") + S + "http://lenta.i2p/" + S + I + "lenta_main_logo.png" + S +
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java
index 615316a024a6c8f019770d0b9a5559d7efc388ab..4f57dcf4ee7b06836038235f61375ff77bd369e9 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java
@@ -309,7 +309,7 @@ class NetDbRenderer {
             buf.append("<table class=\"leaseset\">\n")
                .append("<tr><th><b>").append(_t("LeaseSet")).append(":</b>&nbsp;<code>").append(key.toBase64()).append("</code></th>");
             if (_context.clientManager().isLocal(dest)) {
-                buf.append("<th><b><a href=\"tunnels#" + key.toBase64().substring(0,4) + "\">" + _t("Local") + "</a> ");
+                buf.append("<th><a href=\"tunnels#" + key.toBase64().substring(0,4) + "\">" + _t("Local") + "</a> ");
                 boolean unpublished = ! _context.clientManager().shouldPublishLeaseSet(key);
                 if (unpublished)
                     buf.append(_t("Unpublished") + ' ');
@@ -319,13 +319,13 @@ class NetDbRenderer {
                     buf.append(in.getDestinationNickname());
                 else
                     buf.append(dest.toBase64().substring(0, 6));
-                buf.append("</th></tr>\n<tr><td>");
+                buf.append("</th></tr>\n<tr><td colspan=\"2\">");
                 String b32 = dest.toBase32();
                 buf.append("<a href=\"http://").append(b32).append("\">").append(b32).append("</a></td>");
                 if (!unpublished) {
                     String host = _context.namingService().reverseLookup(dest);
                     if (host == null) {
-                        buf.append("<td>").append("<a title=\"").append(_t("Add to addressbook"))
+                        buf.append("<td class=\"addtobook\" colspan=\"2\">").append("<a title=\"").append(_t("Add to addressbook"))
                            .append("\" href=\"/susidns/addressbook.jsp?book=private&amp;destination=")
                            .append(dest.toBase64()).append("#add\">").append(_t("Add to local addressbook")).append("</a></td>");
                     }
@@ -340,7 +340,7 @@ class NetDbRenderer {
                     buf.append("<code>").append(dest.toBase64().substring(0, 6)).append("</code></th>")
                        .append("</tr>\n<tr>")
                        .append("<td><a href=\"http://").append(b32).append("\">").append(b32).append("</a></td>\n")
-                       .append("<td><a title=\"").append(_t("Add to addressbook"))
+                       .append("<td class=\"addtobook\"><a title=\"").append(_t("Add to addressbook"))
                        .append("\" href=\"/susidns/addressbook.jsp?book=private&amp;destination=")
                        .append(dest.toBase64()).append("#add\">").append(_t("Add to local addressbook")).append("</a></td>");
                 }
@@ -361,7 +361,7 @@ class NetDbRenderer {
                     if (c++ == medianCount)
                         median = dist;
                 }
-                buf.append(" <b>Distance: </b><span id=\"distance\">").append(fmt.format(biLog2(dist))).append("</span></b>");
+                buf.append(" <b>Distance: </b><span id=\"distance\">").append(fmt.format(biLog2(dist))).append("</span>");
                 buf.append("</td></tr>\n<tr><td colspan=\"2\">");
                 //buf.append(dest.toBase32()).append("<br>");
                 buf.append("<b>Signature type:</b> ").append(dest.getSigningPublicKey().getType());
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java b/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java
index 568253bfeb482aac00cfb522a2aa265ba2ebb938..271a96d553bf220699247daafae25f29545495cb 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java
@@ -82,7 +82,7 @@ public class StatsGenerator {
             out.write(buf.toString());
             buf.setLength(0);
             for (String stat : stats) {
-                buf.append("<li><b><a name=\"");
+                buf.append("<li class=\"statsName\"><b><a name=\"");
                 buf.append(stat);
                 buf.append("\">");
                 buf.append(stat);
@@ -152,9 +152,9 @@ public class StatsGenerator {
         RateStat rate = _context.statManager().getRate(name);
         String d = rate.getDescription();
         if (! "".equals(d)) {
-            buf.append("<i>");
+            buf.append("<span class=\"statsLongName\"><i>");
             buf.append(d);
-            buf.append("</i><br>");
+            buf.append("</i></span><br>");
         }
         if (rate.getLifetimeEventCount() <= 0) {
             buf.append("<ul><li class=\"noevents\">").append(_t("No lifetime events")).append("</li></ul>\n");
@@ -177,14 +177,14 @@ public class StatsGenerator {
                 buf.append(_t("Highest average"));
                 buf.append(": ");
                 buf.append(num(curRate.getExtremeAverageValue()));
-                buf.append("; ");
+                buf.append(". ");
 
                 // This is rarely interesting
                 // Don't bother to translate
                 if (showAll) {
                     buf.append("Highest total in a period: ");
                     buf.append(num(curRate.getExtremeTotalValue()));
-                    buf.append("; ");
+                    buf.append(". ");
                 }
 
                 // Saturation stats, which nobody understands, even when it isn't meaningless
@@ -198,32 +198,34 @@ public class StatsGenerator {
                     buf.append(pct(curRate.getExtremeEventSaturation()));
                     buf.append("; Peak saturated limit: ");
                     buf.append(num(curRate.getExtremeSaturationLimit()));
-                    buf.append("; ");
+                    buf.append(". ");
                 }
 
+                buf.append("<span class=\"nowrap\">");
                 buf.append(ngettext("There was 1 event in this period.", "There were {0} events in this period.", (int)curRate.getLastEventCount()));
-                buf.append(' ');
+                buf.append("</span> <span class=\"nowrap\">");
                 buf.append(_t("The period ended {0} ago.", DataHelper.formatDuration2(now - curRate.getLastCoalesceDate())));
+                buf.append("</span>");
             } else {
-                buf.append(" <i>").append(_t("No events")).append("</i> ");
+                buf.append(" <i>").append(_t("No events")).append(" </i>");
             }
             long numPeriods = curRate.getLifetimePeriods();
             if (numPeriods > 0) {
                 double avgFrequency = curRate.getLifetimeEventCount() / (double)numPeriods;
-                buf.append(" (").append(_t("Average event count")).append(": ");
+                buf.append("&nbsp;<span class=\"nowrap\">(").append(_t("Average event count")).append(": ");
                 buf.append(num(avgFrequency));
                 buf.append("; ").append(_t("Events in peak period")).append(": ");
                 // This isn't really the highest event count, but the event count during the period with the highest total value.
                 buf.append(curRate.getExtremeEventCount());
-                buf.append(")");
+                buf.append(")</span>");
             }
             if (curRate.getSummaryListener() != null) {
-                buf.append("<br><a href=\"graph?stat=").append(name)
+                buf.append("<br><span class=\"statsViewGraphs\"><a href=\"graph?stat=").append(name)
                    .append('.').append(periods[i]);
-                buf.append("\">").append(_t("Graph Data")).append("</a> - ");
+                buf.append("&amp;w=600&amp;h=200\">").append(_t("Graph Data")).append("</a> - ");
                 buf.append(" <a href=\"graph?stat=").append(name)
                    .append('.').append(periods[i]);
-                buf.append("&amp;showEvents=true\">").append(_t("Graph Event Count")).append("</a>");
+                buf.append("&amp;w=600&amp;h=200&amp;showEvents=true\">").append(_t("Graph Event Count")).append("</a></span>");
                 // This can really blow up your browser if you click on it
                 //buf.append(" - <a href=\"viewstat.jsp?stat=").append(name);
                 //buf.append("&amp;period=").append(periods[i]);
diff --git a/history.txt b/history.txt
index 69ddc3142152e714073e6ea1629ddcc7f60adf3e..233c2fb85d952107368b76f7d762224604b2c5ff 100644
--- a/history.txt
+++ b/history.txt
@@ -1,3 +1,15 @@
+2017-06-03 str4d
+ * Console:
+   - Add spans to /stats page to avoid summary info breaking mid-sentence, and
+     to aid presentation
+   - Adjust /stats CSS so information isn't over-dense
+   - Set graph size for generated graphs on /stats to 600x200
+   - Fix netdb leaseset tables
+     - Ensure we only iconify add to addressbook links and not b32 dests
+   - Individual icons for I2PSnark and I2P Plugins on /home
+   - Add div to upnpstatus on peers to comply with layout
+   - Fix various unclosed/erroneous tags
+
 2017-05-25 zzz
  * Crypto: Fix AES NPE on 4-core RPi 2nd try (ticket #1989)
 
diff --git a/installer/resources/themes/console/classic/console.css b/installer/resources/themes/console/classic/console.css
index 27af6e7908fdabb0c20f7581d41ad991e203c37f..14e98137e21148da5a4b83178bbe7534442b837a 100644
--- a/installer/resources/themes/console/classic/console.css
+++ b/installer/resources/themes/console/classic/console.css
@@ -3084,7 +3084,6 @@ div.joblog li {
 
 div.joblog ul {
      word-wrap: break-word !important;
-     text-align: justify;
 }
 
 div.joblog li:first-child {
@@ -4236,12 +4235,12 @@ a.viewfullentry:hover {
      width: 10px;
 }
 
-table.leaseset {
+.leaseset {
      font-size: 9pt;
      margin: 5px 0 10px;
 }
 
-table.leaseset:last-child {
+.leaseset:last-child {
      margin-bottom: 5px;
 }
 
@@ -4256,19 +4255,23 @@ table.leaseset:last-child {
      padding-right: 5px;
 }
 
-.leaseset tr:nth-child(2) td:last-child a:not(old) {
+.addtobook {
+     text-align: right;
+}
+
+.addtobook a:not(old) {
      font-size: 0;
 }
 
-.leaseset tr:nth-child(2) td:last-child a::after {
+.addtobook a::after {
      content: url(/themes/console/images/buttons/add_address.png);
 }
 
-.leaseset tr:nth-child(2) td:last-child a:hover {
+.addtobook a:hover {
      filter: drop-shadow(0 0 1px #f60);
 }
 
-div#noleasesets {
+#noleasesets {
      border: 1px solid #89f;
      padding: 20px;
      font-weight: bold;
@@ -4277,14 +4280,14 @@ div#noleasesets {
      text-align: center;
 }
 
-div#sybilnav, div#sybils_summary {
+#sybilnav, #sybils_summary {
      border: 1px solid #89f;
      padding: 10px;
      margin-bottom: 10px;
      background: #fff;
 }
 
-div#sybilnav {
+#sybilnav {
      padding: 5px 5px 0;
 }
 
@@ -4303,11 +4306,11 @@ div#sybilnav {
      line-height: 100%;
 }
 
-table.sybil_routerinfo {
+.sybil_routerinfo {
      margin-bottom: 10px;
 }
 
-table.sybil_routerinfo:last-child {
+.sybil_routerinfo:last-child {
      margin-bottom: 5px;
 }
 
@@ -4315,7 +4318,7 @@ table.sybil_routerinfo:last-child {
      padding: 1px 1px 1px 6px !important;
 }
 
-table.sybil_routerinfo:first-of-type th {
+.sybil_routerinfo:first-of-type th {
      padding: 6px !important;
 }
 
@@ -4351,7 +4354,7 @@ table.sybil_routerinfo:first-of-type th {
      font-weight: normal;
 }
 
-div#sybilnav {
+#sybilnav {
      background: #eff1ff;
      -moz-columns: 4 200px;
      -webkit-columns: 4 200px;
@@ -4490,7 +4493,7 @@ h3.stats {
      border-radius: 0;
 }
 
-ul.statlist {
+.statlist {
      border: 1px solid #89f;
      padding: 0 10px 0 0;
      margin-left: 0 !important;
@@ -4498,11 +4501,11 @@ ul.statlist {
      background: #eff1ff;
 }
 
-ul.statlist:last-of-type {
+.statlist:last-of-type {
      margin-bottom: -22px !important;
 }
 
-ul.statlist a[name], ul.statlist b, ul.statlist li b, ul.statlist a[name]:hover {
+.statlist a[name], .statlist b, .statlist li b, .statlist a[name]:hover {
      text-decoration: none;
      letter-spacing: normal;
      font-size: 9pt;
@@ -4513,35 +4516,33 @@ ul.statlist a[name], ul.statlist b, ul.statlist li b, ul.statlist a[name]:hover
      display: none !important;
 }
 
-ul.statlist li b, ul.statlist b a:hover, h3.stats a:hover  {
+.statlist li b, .statlist b a:hover, h3.stats a:hover  {
      color: #0c153d !important;
 }
 
-ul.statlist li::before {
+.statlist li::before {
      content: "\2B26\00A0";
      margin-left: 5px;
      font-size: 14pt;
      line-height: 60%;
      vertical-align: baseline;
      color: #0c153d;
-     filter: drop-shadow(0 0 1px #ccc);
 }
 
-ul.statlist li {
+.statlist li {
      margin-left: 5px;
      padding: 2px;
      list-style: none;
 }
 
-ul.statlist li li {
+.statlist li li {
      margin-left: 16px;
      margin-right: -20px;
      margin-top: 2px;
-     line-height: 130% !important;
+     line-height: 150% !important;
      list-style: none;
-     padding: 2px 0;
-     border-top: 1px dotted #89f;
-     text-align: justify;
+     padding: 2px 0 2px 5px;
+     text-align: left;
 }
 
 .statlist li li:first-child {
@@ -4550,7 +4551,7 @@ ul.statlist li li {
      padding-top: 2px;
 }
 
-ul.statlist li li::before {
+.statlist li li::before {
      content: "\279F\00A0";
      vertical-align: baseline;
      margin-left: 3px;
@@ -4561,7 +4562,6 @@ ul.statlist li li::before {
      color: #33a;
      font-size: 14pt;
      margin-left: 4px;
-     filter: drop-shadow(0 0 1px #ccc);
 }
 
 .main#stats a[href^="graph?"]:hover::before {
@@ -4572,27 +4572,33 @@ ul.statlist li li::before {
      display: none;
 }
 
-ul.statlist li li:last-child {
+.statlist li li:last-child {
      padding-bottom: 2px;
-     border: 1px dotted #89f;
+     padding-left: 5px;
+     border: 1px solid rgba(136, 153, 255, 0.3);
      background: #fff;
      background: linear-gradient(to right, #fff 0%, #eef 70%, #ddf 100%);
      box-shadow: inset 0 0 0 1px #fff;
 }
 
-ul.statlist li:last-child {
+.statlist li li.noevents {
+     margin-top: 15px !important;
+}
+
+.statlist li:last-child {
      padding-bottom: 15px;
      margin-top: 2px;
 }
 
-ul.statlist li:first-child {
+.statlist li:first-child {
      margin-top: -5px;
 }
 
-ul.statlist li li:last-child::before {
+.statlist li li:last-child::before {
      content: "\27A1\00A0";
      margin-left: 2px;
      vertical-align: text-top;
+     vertical-align: calc(20% - 3px);
 }
 
 .statlist a[href*="graph"] {
@@ -4607,6 +4613,15 @@ ul.statlist li li:last-child::before {
      content: "\00A0";
 }
 
+.statsViewGraphs {
+     margin-left: 20px;
+}
+
+.nowrap {
+     display: inline-block;
+     white-space: nowrap;
+}
+
 #gatherstats + form {
      background: #fff;
 }
@@ -5625,8 +5640,8 @@ table.sybil_routerinfo:last-child {
 
 @media screen and (min-width: 1500px) {
 body, .main, .main td, .news p, #news p, .tab, .tab2, .main li b, div.joblog li, .themelabel, .ui_lang, .applabel a, .statusnotes, .routersummary button.download,
-#peerdefs, #profile_defs, #thresholds, #configinfo, .infohelp, .infowarn, button, input, select, textarea, code, tt, pre, .netdbentry th, .configtable th, ul.statlist a[name],
-ul.statlist b, ul.statlist li b, ul.statlist a[name]:hover, div.messages, th {
+#peerdefs, #profile_defs, #thresholds, #configinfo, .infohelp, .infowarn, button, input, select, textarea, code, tt, pre, .netdbentry th, .configtable th, .statlist a[name],
+.statlist b, .statlist li b, .statlist a[name]:hover, div.messages, th {
      font-size: 10pt !important;
 }
 
diff --git a/installer/resources/themes/console/dark/console.css b/installer/resources/themes/console/dark/console.css
index 85d14f4d90ee7b8bf5c5f580ad3bd01cddc1dfc8..6fb576bca8b102c3aa59dd1f19cc534f8b53db3d 100644
--- a/installer/resources/themes/console/dark/console.css
+++ b/installer/resources/themes/console/dark/console.css
@@ -2040,7 +2040,6 @@ h3.stats {
 
 div.joblog li {
      word-wrap: break-word !important;
-     text-align: justify !important;
      line-height: 120% !important;
      margin: 2px 0 2px 30px;
      padding: 2px 20px 2px 0;
@@ -2048,7 +2047,6 @@ div.joblog li {
 
 div.joblog ul {
      word-wrap: break-word !important;
-     text-align: justify;
      margin: 5px 0 -10px;
 }
 
@@ -2145,6 +2143,15 @@ ul.statlist li li:last-child::before {
      display: none;
 }
 
+.nowrap {
+     white-space: nowrap;
+}
+
+.statsLongName {
+     color: #dd0;
+     font-weight: bold;
+}
+
 .main#stats form {
      background: #000;
      border: 1px solid #494;
@@ -4787,34 +4794,38 @@ div.debugcontainer {
      filter: none;
 }
 
-table#leasesetdebug, table#leasesetsummary {
+#leasesetdebug, #leasesetsummary {
      margin-bottom: 10px;
 }
 
-table.leaseset th {
+.leaseset th {
      font-weight: normal;
      padding: 5px;
      text-align: left;
 }
 
-table.leaseset th:last-child, table.leaseset td:nth-child(2) {
+.leaseset th:last-child, .leaseset td:nth-child(2) {
      text-align: right;
      padding-right: 5px;
 }
 
-.leaseset tr:nth-child(2) td:last-child a:not(old) {
+.addtobook {
+     text-align: right;
+}
+
+.addtobook a:not(old) {
      font-size: 0;
 }
 
-.leaseset tr:nth-child(2) td:last-child a::after {
+.addtobook a::after {
      content: url(/themes/console/images/buttons/add_address.png);
 }
 
-.leaseset tr:nth-child(2) td:last-child a:hover {
+.addtobook a:hover {
      filter: drop-shadow(0 0 1px #f60);
 }
 
-table#leasesetdebug th, table#leasesetsummary th {
+#leasesetdebug th, #leasesetsummary th {
      font-weight: bold;
      text-transform: uppercase;
      font-size: 10pt;
@@ -4823,7 +4834,7 @@ table#leasesetdebug th, table#leasesetsummary th {
      padding: 5px 5px 5px 10px;
 }
 
-table#leasesetdebug th a, table#leasesetsummary a {
+#leasesetdebug th a, #leasesetsummary a {
      font-size: 9pt;
      text-transform: capitalize;
      letter-spacing: normal;
@@ -4836,33 +4847,33 @@ table#leasesetdebug th a, table#leasesetsummary a {
      padding-left: 10px;
 }
 
-table#leasesetdebug th:first-child, table#leasesetsummary th:first-child {
+#leasesetdebug th:first-child, #leasesetsummary th:first-child {
      text-align:left;
      white-space: nowrap;
 }
 
-table#leasesetdebug th:last-child, table#leasesetsummary th:last-child {
+#leasesetdebug th:last-child, #leasesetsummary th:last-child {
      text-align:right;
      white-space: nowrap;
 }
 
-table#leasesetdebug td:nth-child(odd) {
+#leasesetdebug td:nth-child(odd) {
      width: 200px;
      white-space: nowrap;
      text-align: right;
      border-right: 1px inset #131;
 }
 
-table#leasesetdebug td:nth-child(even) {
+#leasesetdebug td:nth-child(even) {
      text-align: left;
      white-space: nowrap;
 }
 
-table#leasesetdebug td:nth-child(2) {
+#leasesetdebug td:nth-child(2) {
      width: 10px;
 }
 
-div#noleasesets {
+#noleasesets {
      background: #000 url(images/infohelp.png) 12px center no-repeat;
      padding: 15px 15px 15px 50px;
      border: 1px solid #494;
@@ -4870,7 +4881,7 @@ div#noleasesets {
      text-align: left;
 }
 
-div#sybilnav, div#sybils_summary {
+#sybilnav, #sybils_summary {
      border: 1px solid #494;
      padding: 10px;
      margin-bottom: 10px;
@@ -4878,7 +4889,7 @@ div#sybilnav, div#sybils_summary {
      background: #000;
 }
 
-div#sybilnav {
+#sybilnav {
      -moz-columns: 4 200px;
      -webkit-columns: 4 200px;
      columns: 4 200px;
@@ -4941,7 +4952,7 @@ div#sybilnav {
      padding-bottom: 2px;
 }
 
-table.sybil_routerinfo {
+.sybil_routerinfo {
      margin-bottom: 10px;
 }
 
@@ -4954,7 +4965,7 @@ table.sybil_routerinfo {
      white-space: nowrap;
 }
 
-table.sybil_routerinfo:first-of-type th {
+.sybil_routerinfo:first-of-type th {
      padding: 8px 6px !important;
 }
 
diff --git a/installer/resources/themes/console/images/i2psnark.png b/installer/resources/themes/console/images/i2psnark.png
new file mode 100644
index 0000000000000000000000000000000000000000..5528ff1a954413e0a9dfc79d507469742f997004
Binary files /dev/null and b/installer/resources/themes/console/images/i2psnark.png differ
diff --git a/installer/resources/themes/console/light/console.css b/installer/resources/themes/console/light/console.css
index 8a963523f25ae6f2312e6f66f573f8818eee66ed..4e61627586a913a878da593208908dc606d54df3 100644
--- a/installer/resources/themes/console/light/console.css
+++ b/installer/resources/themes/console/light/console.css
@@ -574,12 +574,22 @@ div.logo {
      box-shadow: inset 0 0 0 1px #bbf;
 }
 
+div.logo:not(old) {
+     background: linear-gradient(to bottom, rgba(255,255,255,0.8), rgba(255,255,255,0.3)), url(images/noise.png) #fff;
+     background-size: 100% 100%, 50px 50px;
+}
+
 .logo hr {
      margin: 8px -10px;
      background: #7789bf;
      height: 1px
 }
 
+.warning hr {
+     background: #7789bf;
+     background: linear-gradient(to right, #7789bf, #c2c4ef);
+}
+
 .logo a {
      display: inline-block !important;
      width: 100%;
@@ -606,7 +616,7 @@ div.warning {
 }
 
 .warning:not(old) {
-     background:  url("/themes/console/images/itoopie_sm.png") no-repeat scroll 10px center, linear-gradient(to bottom, rgba(255,255,255,0.8), rgba(255,255,255,0.3)), url(images/noise.png) #fff;
+     background: url("/themes/console/images/itoopie_sm.png") no-repeat scroll 10px center, linear-gradient(to bottom, rgba(255,255,255,0.8), rgba(255,255,255,0.3)), url(images/noise.png) #fff;
      background-size: 54px auto, 100% 100%, 50px 50px;
      background-position: 10px calc(50% + 16px);
 }
@@ -615,7 +625,7 @@ div.warning {
      text-align: left;
      margin: -9px -24px 20px !important;
      border: none;
-     border-bottom: 1px solid #7789bf;
+     border-bottom: 1px solid #447;
      border-radius: 2px 2px 0 0;
      padding: 10px 10px 8px;
      font-size: 10.5pt;
@@ -793,8 +803,9 @@ div.warning {
      letter-spacing: 0;
      word-spacing: 0;
      background: none;
+     border-radius: 0;
      border: none;
-     border-bottom: 1px solid #7778bf;
+     border-bottom: 1px solid #447 !important;
      padding-left: 0;
      margin-bottom: -5px;
 }
@@ -2544,6 +2555,8 @@ p#enablefullstats, p#gatherstats {
       background-size: 28px 28px !important;
 }
 
+/* stats page */
+
 p#gatherstats + form, ul.statlist {
      border: 1px solid #7778bf;
      padding: 10px;
@@ -2571,6 +2584,13 @@ ul.statlist {
      box-shadow: inset 0 0 0 1px #fff;
 }
 
+.joblog .statlist li {
+     line-height: 140% !important;
+     padding-top: 6px;
+     padding-bottom: 0;
+     margin-right: 5px;
+}
+
 .statlist li:not(old) {
      list-style: none !important;
 }
@@ -2578,18 +2598,18 @@ ul.statlist {
 .statlist li::before, .statlist li a[href^="graph"]::before {
      content: "";
      display: inline-block;
-     height: 5px;
-     width: 5px;
-     box-shadow: inset 0 0 0 1px #fff;
-     margin-left: -35px;
+     height: 4px !important;
+     width: 4px !important;
+     margin-left: -17px;
      margin-right: 10px;
-     margin-top: -2px;
+     margin-top: -4px;
      transform: rotate(45deg);
      vertical-align: middle;
+     opacity: 0.8;
 }
 
 .statlist li::before {
-     background: #335;
+     background: #779;
      border: 1px solid #335;
 }
 
@@ -2598,7 +2618,7 @@ ul.statlist {
      border: 1px solid #3b6bbf;
 }
 
-.statlist li a[href*="&"]::before  {
+.statlist li a[href$="&showEvents=true"]::before {
      display: none;
 }
 
@@ -2609,12 +2629,51 @@ ul.statlist {
      vertical-align: middle;
 }
 
+.statlist li.statsName::before {
+     background: #446;
+     box-shadow: inset 0 0 0 1px #fff !important;
+     height: 6px !important;
+     width: 6px !important;
+     opacity: 1;
+}
+
+.statlist li li:last-child::before {
+     background: #335;
+}
+
+.statsName i {
+     color: #050;
+     font-weight: bold;
+}
+
+.statsName li i {
+     color: inherit;
+     font-weight: normal;
+}
+
+.statsViewGraphs {
+     display: inline-block;
+     margin: 0 0 -5px 18px;
+}
+
+.statsLongName {
+     display: inline-block;
+}
+
+.statsLongName::first-letter {
+     text-transform: uppercase;
+}
+
+.nowrap {
+     display: inline-block;
+     white-space: nowrap;
+}
+
 .statlist > li::after {
      content: "";
      display: block;
      width: 100%;
      height: 1px;
-     margin-top: -5px;
      border-top: 1px dotted #ddf;
 }
 
@@ -2629,10 +2688,12 @@ li.noevents::after {
 }
 
 li.noevents {
-     margin: 5px 0 5px 15px !important;
+     margin: 0 0 5px 40px !important;
      font-style: italic;
 }
 
+/* end stats page */
+
 h1 {
      text-align: left;
      color: #31334f;
@@ -3568,11 +3629,6 @@ h3 + .statusnotes {
 div.joblog {
      border: 0;
      margin-top: 5px;
- }
-
-div.joblog i {
-     color: #050;
-     font-weight: bold;
 }
 
 div.joblog ul {
@@ -4329,7 +4385,7 @@ table#leasesetdebug th a:hover, table#leasesetsummary th a:hover {
      text-transform: none;
      letter-spacing: normal;
      word-spacing: normal;
-     background: linear-gradient(to bottom, #fff 50%, #eef 50%) !important;
+     background: linear-gradient(to bottom, #fff 50%, rgba(255, 255, 255, 0.6) 50%, rgba(240, 240, 240, 0.4)) #eef !important;
      background-size: 100% 100%;
      padding: 8px 5px;
      font-size: 9pt;
@@ -4366,11 +4422,11 @@ table#leasesetdebug th a:hover, table#leasesetsummary th a:hover {
      white-space: nowrap;
 }
 
-table#leasesetdebug, table.leaseset, table#leasesetsummary {
+#leasesetdebug, table.leaseset, #leasesetsummary {
      font-size: 9pt;
 }
 
-table#leasesetdebug td, table.leaseset td {
+#leasesetdebug td, table.leaseset td {
      padding: 5px !important;
 }
 
@@ -4378,19 +4434,19 @@ table#leasesetdebug td, table.leaseset td {
      margin-bottom: 10px;
 }
 
-table.leaseset th {
+.leaseset th {
      font-weight: normal;
      padding: 5px;
      text-align: left;
      font-size: 10pt;
 }
 
-table.leaseset th:last-child, table.leaseset td:nth-child(2) {
+.leaseset th:last-child, .leaseset td:nth-child(2) {
      text-align: right;
      padding-right: 5px;
 }
 
-table#leasesetdebug, table#leasesetsummary {
+#leasesetdebug, #leasesetsummary {
      margin-bottom: 14px !important;
 }
 
@@ -4398,7 +4454,7 @@ table#leasesetdebug, table#leasesetsummary {
      margin-bottom: 5px;
 }
 
-table#leasesetdebug th, table#leasesetsummary th {
+#leasesetdebug th, #leasesetsummary th {
      font-weight: bold;
      padding: 8px;
      text-align: left;
@@ -4408,49 +4464,52 @@ table#leasesetdebug th, table#leasesetsummary th {
      word-spacing: 0.1em;
 }
 
-table#leasesetdebug th a {
+#leasesetdebug th a {
      font-size: 9pt;
      text-transform: capitalize;
      letter-spacing: normal;
      word-spacing: normal;
 }
 
-table#leasesetdebug th:last-child, table#leasesetsummary th:last-child {
+#leasesetdebug th:last-child, #leasesetsummary th:last-child {
      text-align:right;
      white-space: nowrap;
      font-size: 9pt;
 }
 
-table#leasesetdebug td:nth-child(odd) {
+#leasesetdebug td:nth-child(odd) {
      width: 200px;
      white-space: nowrap;
      text-align: right;
      border-right: 1px inset #cfd1ff;
 }
 
-table#leasesetdebug td:nth-child(even) {
+#leasesetdebug td:nth-child(even) {
      text-align: left;
      white-space: nowrap;
 }
 
-table#leasesetdebug td:nth-child(2) {
+#leasesetdebug td:nth-child(2) {
      width: 10px;
 }
 
-.leaseset tr:nth-child(2) td:last-child a:not(old) {
+.addtobook {
+     text-align: right;
+}
+
+.addtobook a:not(old) {
      font-size: 0;
 }
 
-.leaseset tr:nth-child(2) td:last-child a::after {
+.addtobook a::after {
      content: url(/themes/console/images/buttons/add_address.png);
-     filter: drop-shadow(0 0 1px #999);
 }
 
-.leaseset tr:nth-child(2) td:last-child a:hover {
+.addtobook a:hover {
      filter: drop-shadow(0 0 1px #f60);
 }
 
-div#noleasesets {
+#noleasesets {
      border: 1px solid #7778bf;
      padding: 20px;
      font-weight: bold;
@@ -4460,7 +4519,7 @@ div#noleasesets {
      text-align: center;
 }
 
-div#sybilnav {
+#sybilnav {
      -moz-columns: 4;
      -webkit-columns: 4;
      columns: 4;
@@ -4470,7 +4529,7 @@ div#sybilnav {
      border-radius: 2px;
 }
 
-div#sybilnav, div#sybils_summary {
+#sybilnav, #sybils_summary {
      border: 1px solid #7778bf;
      padding: 10px;
      margin-bottom: 10px;
@@ -4507,7 +4566,7 @@ h3.sybils  {
      display: inline-block;
 }
 
-table.sybil_routerinfo {
+.sybil_routerinfo {
      margin-bottom: 10px;
 }
 
@@ -4515,7 +4574,7 @@ table.sybil_routerinfo {
      padding: 1px 1px 1px 6px !important;
 }
 
-table.sybil_routerinfo:first-of-type th {
+.sybil_routerinfo:first-of-type th {
      padding: 6px !important;
 }
 
diff --git a/installer/resources/themes/console/midnight/console.css b/installer/resources/themes/console/midnight/console.css
index 2c69ac8de60e9afbd0ca647515204ad338fcd8d0..fe824e95477b45decd98bd48a64367a2df0521fc 100644
--- a/installer/resources/themes/console/midnight/console.css
+++ b/installer/resources/themes/console/midnight/console.css
@@ -1588,7 +1588,7 @@ div.sorry hr {
 
 .main#news {
      background: #000 url(images/earth.jpg) no-repeat scroll bottom right !important;
-     background-size: auto 200px !important;
+     background-size: auto 180px !important;
      padding-bottom: 0;
 }
 
@@ -1605,14 +1605,6 @@ div.sorry hr {
      min-width: 600px;
 }
 
-/*
-.newsentry font[size="-2"] {
-     letter-spacing: 0.15em;
-     font-style: italic;
-     text-transform: capitalize;
-}
-*/
-
 .main#news .newscontent {
      border: 1px solid #443da0;
      margin: -11px 0 10px;
@@ -1720,7 +1712,6 @@ div.sorry hr {
 
 .messages #newsDisplay {
      display: inline-block;
-     white-space: normal;
      margin-left: 45px;
 }
 
@@ -2453,7 +2444,6 @@ fieldset {
 
 div.joblog {
      border-radius: 2px 2px 0 0;
-     text-align: justify !important;
      overflow-y: hidden !important;
      margin-top: 10px !important;
  }
@@ -2472,7 +2462,6 @@ div.main li:last-child {
 
 div.joblog li {
      word-wrap: break-word !important;
-     text-align: justify !important;
      line-height: 120% !important;
      margin: 2px 0 2px 30px;
      padding: 2px 20px 2px 0;
@@ -2480,7 +2469,6 @@ div.joblog li {
 
 div.joblog ul {
      word-wrap: break-word !important;
-     text-align: justify;
      margin: 5px 0 -10px;
 }
 
@@ -3643,7 +3631,7 @@ h3.stats {
      border-radius: 0;
 }
 
-ul.statlist {
+.statlist {
      border: 1px solid #443da0;
      margin-bottom: -21px !important;
      margin-top: -11px !important;
@@ -3651,62 +3639,61 @@ ul.statlist {
      background: #000;
 }
 
-ul.statlist:last-of-type {
+div.main .statlist li:not(old) {
+     list-style: none !important;
+}
+
+.statlist:last-of-type {
      margin-bottom: -1px !important;
 }
 
 @media screen and (-webkit-min-device-pixel-ratio:0) {
-ul.statlist {
+.statlist {
      margin-bottom: -25px !important;
 }
 
-ul.statlist:last-of-type {
+.statlist:last-of-type {
      margin-bottom: -6px !important;
 }
 }
 
-ul.statlist a[name], ul.statlist b, ul.statlist li b, ul.statlist a[name]:hover {
-     color: #f3e8fc !important;
+.statlist a[name], .statlist b, .statlist li b, .statlist a[name]:hover {
      text-decoration: none;
      letter-spacing: normal;
 }
 
-ul.statlist li::before {
-     content: "\1F6C8\00A0";
+.statlist li::before {
      content: "\2B26\00A0";
      font-size: 14pt;
-     line-height: 50%;
      vertical-align: baseline;
-     color: #f3e8fc;
 }
 
-ul.statlist li {
-     line-height: 120% !important;
+.statlist li {
      list-style: none;
      margin-bottom: -3px;
 }
 
-ul.statlist li li {
+.statlist li li {
      margin-left: 16px;
      margin-right: -20px;
-     line-height: 120% !important;
+     line-height: 140% !important;
      list-style: none;
 }
 
-ul.statlist li li::before {
+.statlist li li::before {
      content: "\279F\00A0";
      vertical-align: baseline;
 }
 
-ul.statlist li li:last-child::before {
+.statlist li li:last-child::before {
      content: "\27A1\00A0";
 }
 
-ul.statlist li li:last-child {
+.statlist li li:last-child {
      padding-bottom: 5px !important;
 }
 
-.statlist a[href*="graph"]::before {
+.statlist a[href^="graph"]::before {
      content: "\27A1\00A0";
      font-size: 14pt;
 }
@@ -3725,11 +3712,34 @@ ul.statlist li li:last-child {
      margin-top: 10px;
 }
 
+.statlist li li b {
+     margin-right: 3px;
+}
+
 li.noevents {
      margin-top: 0 !important;
      margin-bottom: 10px !important;
 }
 
+.nowrap {
+     white-space: nowrap;
+}
+
+.statsViewGraphs {
+     display: inline-block;
+     margin: 5px 5px 0 20px;
+}
+
+.statsLongName {
+     color: #37a3df;
+     font-weight: bold;
+}
+
+p#gatherstats {
+     margin-top: 1px;
+     margin-bottom: 25px;
+}
+
 /* end stats */
 
 h3#exploratorytunnels {
@@ -3985,7 +3995,7 @@ table#externali2cp {
 }
 
 .infowarn#clientconf {
-     margin-bottom: -2px;
+     margin-bottom: 11px;
 }
 
 /* end /configclients */
@@ -5225,7 +5235,7 @@ span#distance {
      font-weight: bold;
 }
 
-table#leasesetdebug, table#leasesetsummary {
+#leasesetdebug, #leasesetsummary {
      margin-top: -4px;
      margin-bottom: 10px;
 }
@@ -5241,7 +5251,7 @@ table#leasesetdebug, table#leasesetsummary {
      padding-right: 5px;
 }
 
-table#leasesetdebug th, table#leasesetsummary th {
+#leasesetdebug th, #leasesetsummary th {
      font-weight: bold;
      text-transform: uppercase;
      font-size: 10pt;
@@ -5250,7 +5260,7 @@ table#leasesetdebug th, table#leasesetsummary th {
      padding: 8px 10px;
 }
 
-table#leasesetdebug th a, table#leasesetsummary a {
+#leasesetdebug th a, #leasesetsummary a {
      font-size: 9pt;
      text-transform: capitalize;
      letter-spacing: normal;
@@ -5263,47 +5273,51 @@ table#leasesetdebug th a, table#leasesetsummary a {
      padding-left: 10px;
 }
 
-table#leasesetdebug th:first-child, table#leasesetsummary th:first-child {
+#leasesetdebug th:first-child, #leasesetsummary th:first-child {
      text-align:left;
      white-space: nowrap;
 }
 
-table#leasesetdebug th:last-child, table#leasesetsummary th:last-child {
+#leasesetdebug th:last-child, #leasesetsummary th:last-child {
      text-align:right;
      white-space: nowrap;
 }
 
-table#leasesetdebug td:nth-child(odd) {
+#leasesetdebug td:nth-child(odd) {
      width: 200px;
      white-space: nowrap;
      text-align: right;
      border-right: 1px inset #120f35;
 }
 
-table#leasesetdebug td:nth-child(even) {
+#leasesetdebug td:nth-child(even) {
      text-align: left;
      white-space: nowrap;
 }
 
-table#leasesetdebug td:nth-child(2) {
+#leasesetdebug td:nth-child(2) {
      width: 10px;
 }
 
-table#leasesetdebug th a:not(old), table#leasesetsummary th a:not(old) {
+#leasesetdebug th a:not(old), #leasesetsummary th a:not(old) {
      font-size: 0;
 }
 
-table#leasesetdebug th a::after, table#leasesetsummary th a::after {
+#leasesetdebug th a::after, #leasesetsummary th a::after {
      content: url(/themes/console/images/buttons/floodfill.png);
      vertical-align: text-top;
      padding-right: 0;
 }
 
-.leaseset tr:nth-child(2) td:last-child a:not(old) {
+.addtobook {
+     text-align: right;
+}
+
+.addtobook a:not(old) {
      font-size: 0;
 }
 
-.leaseset tr:nth-child(2) td:last-child a::after {
+.addtobook a::after {
      content: url(/themes/console/images/buttons/add_address.png);
 }
 
@@ -5316,7 +5330,7 @@ a.viewfullentry::after {
      vertical-align: text-top;
 }
 
-div#noleasesets {
+#noleasesets {
      background: #000 url(/themes/console/images/info/infohelp.png) 12px center no-repeat !important;
      padding: 15px 15px 15px 50px !important;
      border: 1px solid #443da0;
@@ -5324,13 +5338,13 @@ div#noleasesets {
      text-align: left;
 }
 
-div#sybilnav, div#sybils_summary {
+#sybilnav, #sybils_summary {
      border: 1px solid #443da0;
      padding: 10px;
      margin-bottom: 10px;
 }
 
-div#sybilnav {
+#sybilnav {
      -moz-columns: 4 200px;
      -webkit-columns: 4 200px;
      columns: 4 200px;
@@ -5405,7 +5419,7 @@ div#sybilnav {
 
 /* end sybilnav */
 
-table.sybil_routerinfo {
+.sybil_routerinfo {
      margin-bottom: 10px;
 }
 
@@ -5417,7 +5431,7 @@ table.sybil_routerinfo {
      text-align: left;
 }
 
-table.sybil_routerinfo:first-of-type th {
+.sybil_routerinfo:first-of-type th {
      padding: 6px !important;
 }
 
@@ -5560,10 +5574,6 @@ p#debugmode, p#sybilinfo {
      margin-top: -4px;
 }
 
-p#gatherstats {
-     margin-top: 1px;
-}
-
 td.optionsave {
      text-align: right;
      border-top: 1px solid #443da0;
@@ -5621,7 +5631,7 @@ h3#webappconfig {
 }
 
 p#webappconfigtext {
-     margin: 1px 0 -2px 0;
+     margin: 1px 0 15px 0;
      background: #000 url(/themes/console/images/info/java_edit.png) 12px center no-repeat !important;
      background-size: 28px 28px !important;
 }
@@ -6191,7 +6201,7 @@ div.app {
      min-width: 138px;
 }
 
-.app:hover {
+div.app:hover {
      cursor: pointer;
 }
 
diff --git a/router/java/src/net/i2p/router/transport/UPnP.java b/router/java/src/net/i2p/router/transport/UPnP.java
index 767bc12ba84ebf5c7d77110d998a9113e0afe252..fee429bf353fb1dda758b60b0b833f92b6864221 100644
--- a/router/java/src/net/i2p/router/transport/UPnP.java
+++ b/router/java/src/net/i2p/router/transport/UPnP.java
@@ -676,7 +676,7 @@ public class UPnP extends ControlPoint implements DeviceChangeListener, EventLis
 	/** warning - slow */
 	public String renderStatusHTML() {
 		final StringBuilder sb = new StringBuilder();
-		sb.append("<h3><a name=\"upnp\"></a>").append(_t("UPnP Status")).append("</h3>");
+		sb.append("<h3 id=\"upnp\">").append(_t("UPnP Status")).append("</h3><div id=\"upnpscan\">");
 		
 		synchronized(_otherUDNs) {
 			if (!_otherUDNs.isEmpty()) {
@@ -727,7 +727,7 @@ public class UPnP extends ControlPoint implements DeviceChangeListener, EventLis
 			}
 		}
 		
-		sb.append("</p>");
+		sb.append("</p></div>");
 		return sb.toString();
 	}