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 4ef42c00856565c8d49639cae584bc190280c169..d2c1827a4570a5f619e9e0d2199b2104c7f7e440 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java
@@ -157,6 +157,7 @@ public class NetDbRenderer {
         
         ObjectCounter<String> versions = new ObjectCounter();
         ObjectCounter<String> countries = new ObjectCounter();
+        int[] transportCount = new int[8];
         
         Set routers = new TreeSet(new RouterInfoComparator());
         routers.addAll(_context.netDb().getRouters());
@@ -176,10 +177,12 @@ public class NetDbRenderer {
                 String country = _context.commSystem().getCountry(key);
                 if(country != null)
                     countries.increment(country);
+                transportCount[classifyTransports(ri)]++;
             }
         }
             
-        buf.append("<table border=\"0\" cellspacing=\"30\"><tr><td>");
+        buf.append("<table border=\"0\" cellspacing=\"30\"><tr><th colspan=\"3\">").append(_("Network Database Router Statistics")).append("</th><tr><td>");
+        // versions table
         List<String> versionList = new ArrayList(versions.objects());
         if (versionList.size() > 0) {
             Collections.sort(versionList, Collections.reverseOrder(new TrustedUpdate.VersionComparator()));
@@ -196,6 +199,22 @@ public class NetDbRenderer {
         out.write(buf.toString());
         buf.setLength(0);
             
+        // transports table
+        buf.append("<table>\n");
+        buf.append("<tr><th align=\"left\">" + _("Addresses") + "</th><th>" + _("Count") + "</th></tr>\n");
+        for (int i = 0; i < 8; i++) {
+            int num = transportCount[i];
+            if (num > 0) {
+                buf.append("<tr><td>").append(_(TNAMES[i]));
+                buf.append("</td><td align=\"center\">").append(num).append("</td></tr>\n");
+            }
+        }
+        buf.append("</table>\n");
+        buf.append("</td><td>");
+        out.write(buf.toString());
+        buf.setLength(0);
+
+        // country table
         List<String> countryList = new ArrayList(countries.objects());
         if (countryList.size() > 0) {
             Collections.sort(countryList, new CountryComparator());
@@ -210,6 +229,7 @@ public class NetDbRenderer {
             }
             buf.append("</table>\n");
         }
+
         buf.append("</td></tr></table>");
         out.write(buf.toString());
         out.flush();
@@ -277,11 +297,42 @@ public class NetDbRenderer {
         buf.append("</td></tr>\n");
     }
 
+    private static final int SSU = 1;
+    private static final int SSUI = 2;
+    private static final int NTCP = 4;
+    private static final String[] TNAMES = { _x("Hidden or starting up"), _x("SSU"), _x("SSU with introducers"), "",
+                                  _x("NTCP"), _x("NTCP and SSU"), _x("NTCP and SSU with introducers"), "" };
+    /**
+     *  what transport types
+     */
+    private int classifyTransports(RouterInfo info) {
+        int rv = 0;
+        String hash = info.getIdentity().getHash().toBase64();
+        for (Iterator iter = info.getAddresses().iterator(); iter.hasNext(); ) {
+            RouterAddress addr = (RouterAddress)iter.next();
+            String style = addr.getTransportStyle();
+            if (style.equals("NTCP")) {
+                rv |= NTCP;
+            } else if (style.equals("SSU")) {
+                if (addr.getOptions().getProperty("iport0") != null)
+                    rv |= SSUI;
+                else
+                    rv |= SSU;
+            }
+        }
+        return rv;
+    }
+
     /** translate a string */
     private String _(String s) {
         return Messages.getString(s, _context);
     }
 
+    /** tag only */
+    private static final String _x(String s) {
+        return s;
+    }
+
     /**
      *  translate a string with a parameter
      *  This is a lot more expensive than _(s), so use sparingly.