diff --git a/android/README.txt b/android/README.txt
index e8886a57988c11c4ef34f68456640a73d79a69dc..eeb48885b24e65edc631b71ff4b19b17c62fc78d 100644
--- a/android/README.txt
+++ b/android/README.txt
@@ -1,9 +1,13 @@
-These instructions are for the 1.5 SDK.
+These instructions are for the 1.5 Android SDK.
 The build file is not compatible with the 1.1 SDK any more.
+1.6 and 2.0 SDKs are untested.
 
 #Unzip the android SDK in ../../
 #So then the android tools will be in ../../android-sdk-linux_x86-1.5_r2/tools/
 
+# create a file local.properties with the following line:
+# sdk-location=/path/to/your/android-sdk-linux_x86-1.5_r2
+
 #then build the android apk file:
 ant debug
 
diff --git a/apps/routerconsole/java/bmsg.sh b/apps/routerconsole/java/bmsg.sh
index e66bcc317adb29d70fef623af25f0a783bced5f1..989bc1a30ba8b0a523d1cf98458844b5adf968ac 100644
--- a/apps/routerconsole/java/bmsg.sh
+++ b/apps/routerconsole/java/bmsg.sh
@@ -19,6 +19,20 @@ CLASS=net.i2p.router.web.messages
 TMPFILE=build/javafiles.txt
 export TZ=UTC
 
+#
+# generate strings/Countries.java from ../../../installer/resources/countries.txt
+#
+CFILE=../../../installer/resources/countries.txt
+JFILE=build/Countries.java
+if [ $CFILE -nt $JFILE -o ! -s $JFILE ]
+then
+	mkdir -p build
+        echo '// Automatically generated pseudo-java for xgettext - do not edit' > $JFILE
+	echo '// Translators may wish to translate a few of these, do not bother to translate all of them!!' >> $JFILE
+	sed 's/..,\(..*\)/_("\1");/' $CFILE >> $JFILE
+fi
+
+JPATHS="src ../jsp/WEB-INF strings $JFILE"
 for i in ../locale/messages_*.po
 do
 	# get language
@@ -26,7 +40,7 @@ do
 	LG=${LG%.po}
 
 	# make list of java files newer than the .po file
-	find src ../jsp/WEB-INF strings -name *.java -newer $i > $TMPFILE
+	find $JPATHS -name *.java -newer $i > $TMPFILE
 	if [ -s build/obj/net/i2p/router/web/messages_$LG.class -a \
 	     build/obj/net/i2p/router/web/messages_$LG.class -nt $i -a \
 	     ! -s $TMPFILE ]
@@ -48,7 +62,7 @@ do
 	# In a jsp, you must use a helper or handler that has the context set.
 	# To start a new translation, copy the header from an old translation to the new .po file,
 	# then ant distclean updater.
-	find src ../jsp/WEB-INF strings -name *.java > $TMPFILE
+	find $JPATHS -name *.java > $TMPFILE
 	xgettext -f $TMPFILE -F -L java --from-code=UTF-8 \
                  --keyword=_ --keyword=_x --keyword=intl._ --keyword=intl.title \
                  --keyword=handler._ --keyword=formhandler._ \
diff --git a/apps/routerconsole/java/bundle-messages.sh b/apps/routerconsole/java/bundle-messages.sh
index 82071200b3905ffa9654dd39aaf00d2e404bf2cf..cb08afe2de439e80d6a3a91bcae186238a18ee50 100755
--- a/apps/routerconsole/java/bundle-messages.sh
+++ b/apps/routerconsole/java/bundle-messages.sh
@@ -8,6 +8,20 @@ CLASS=net.i2p.router.web.messages
 TMPFILE=build/javafiles.txt
 export TZ=UTC
 
+#
+# generate strings/Countries.java from ../../../installer/resources/countries.txt
+#
+CFILE=../../../installer/resources/countries.txt
+JFILE=build/Countries.java
+if [ $CFILE -nt $JFILE -o ! -s $JFILE ]
+then
+	mkdir -p build
+        echo '// Automatically generated pseudo-java for xgettext - do not edit' > $JFILE
+	echo '// Translators may wish to translate a few of these, do not bother to translate all of them!!' >> $JFILE
+	sed 's/..,\(..*\)/_("\1");/' $CFILE >> $JFILE
+fi
+
+JPATHS="src ../jsp/WEB-INF strings $JFILE"
 for i in ../locale/messages_*.po
 do
 	# get language
@@ -15,7 +29,7 @@ do
 	LG=${LG%.po}
 
 	# make list of java files newer than the .po file
-	find src ../jsp/WEB-INF strings -name *.java -newer $i > $TMPFILE
+	find $JPATHS -name *.java -newer $i > $TMPFILE
 	if [ -s build/obj/net/i2p/router/web/messages_$LG.class -a \
 	     build/obj/net/i2p/router/web/messages_$LG.class -nt $i -a \
 	     ! -s $TMPFILE ]
@@ -37,7 +51,7 @@ do
 	# In a jsp, you must use a helper or handler that has the context set.
 	# To start a new translation, copy the header from an old translation to the new .po file,
 	# then ant distclean updater.
-	find src ../jsp/WEB-INF strings -name *.java > $TMPFILE
+	find $JPATHS -name *.java > $TMPFILE
 	xgettext -f $TMPFILE -F -L java --from-code=UTF-8 \
                  --keyword=_ --keyword=_x --keyword=intl._ --keyword=intl.title \
                  --keyword=handler._ --keyword=formhandler._ \
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHandler.java
index 41c8e7587709db16f0100079fad1b9a4eca81bba..11bc0b670a7ba59107c77dad0ddae60e10d1d1fc 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHandler.java
@@ -118,7 +118,7 @@ public class ConfigStatsHandler extends FormHandler {
             addFormNotice(_("Stat filter and location updated successfully to") + ": " + stats.toString());
         else
             addFormError(_("Failed to update the stat filter and location"));
-        addFormNotice("Graph list updated, may take up to 60s to be reflected here and on the <a href=\"graphs.jsp\">Graphs Page</a>");
+        addFormNotice(_("Graph list updated, may take up to 60s to be reflected here and on the <a href=\"graphs.jsp\">Graphs Page</a>"));
     }
     
 }
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java
index fd49aa7ad051240a5ca990f555d60a3f5f73368a..ef61f06632b8f3d72db742de162c5cd1ee8ba1bd 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java
@@ -7,13 +7,17 @@ import java.io.OutputStreamWriter;
 
 public class NetDbHelper extends HelperBase {
     private String _routerPrefix;
-    private boolean _full = false;
+    private int _full;
     private boolean _lease = false;
     
     public NetDbHelper() {}
     
     public void setRouter(String r) { _routerPrefix = r; }
-    public void setFull(String f) { _full = "1".equals(f); }
+    public void setFull(String f) {
+        try {
+            _full = Integer.parseInt(f);
+        } catch (NumberFormatException nfe) {}
+    }
     public void setLease(String l) { _lease = "1".equals(l); }
     
     public String getNetDbSummary() {
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 e551b15f03222b57d79396da5dceffc32b486b0d..4ef42c00856565c8d49639cae584bc190280c169 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java
@@ -77,10 +77,6 @@ public class NetDbRenderer {
         out.flush();
     }
 
-    public void renderStatusHTML(Writer out) throws IOException {
-        renderStatusHTML(out, true);
-    }
-
     public void renderLeaseSetHTML(Writer out) throws IOException {
         StringBuilder buf = new StringBuilder(4*1024);
         buf.append("<h2>" + _("Network Database Contents") + "</h2>\n");
@@ -131,7 +127,10 @@ public class NetDbRenderer {
         out.flush();
     }
 
-    public void renderStatusHTML(Writer out, boolean full) throws IOException {
+    /**
+     *  @param mode 0: our info and charts only; 1: full routerinfos and charts; 2: abbreviated routerinfos and charts
+     */
+    public void renderStatusHTML(Writer out, int mode) throws IOException {
         out.write("<h2>" + _("Network Database Contents") + " (<a href=\"netdb.jsp?l=1\">" + _("View LeaseSets") + "</a>)</h2>\n");
         if (!_context.netDb().isInitialized()) {
             out.write(_("Not initialized"));
@@ -139,13 +138,16 @@ public class NetDbRenderer {
             return;
         }
         
+        boolean full = mode == 1;
+        boolean shortStats = mode == 2;
+        boolean showStats = full || shortStats;
         Hash us = _context.routerHash();
         out.write("<a name=\"routers\" ></a><h3>" + _("Routers") + " (<a href=\"netdb.jsp");
-        if (full)
-            out.write("#routers\" >" + _("view without"));
+        if (full || !showStats)
+            out.write("?f=2#routers\" >" + _("Show all routers"));
         else
-            out.write("?f=1#routers\" >" + _("view with"));
-        out.write(' ' + _("stats") + "</a>)</h3>\n");
+            out.write("?f=1#routers\" >" + _("Show all routers with full stats"));
+        out.write("</a>)</h3>\n");
         
         StringBuilder buf = new StringBuilder(8192);
         RouterInfo ourInfo = _context.router().getRouterInfo();
@@ -163,9 +165,11 @@ public class NetDbRenderer {
             Hash key = ri.getIdentity().getHash();
             boolean isUs = key.equals(us);
             if (!isUs) {
-                renderRouterInfo(buf, ri, false, full);
-                out.write(buf.toString());
-                buf.setLength(0);
+                if (showStats) {
+                    renderRouterInfo(buf, ri, false, full);
+                    out.write(buf.toString());
+                    buf.setLength(0);
+                }
                 String routerVersion = ri.getOption("router.version");
                 if (routerVersion != null)
                     versions.increment(routerVersion);
@@ -194,14 +198,14 @@ public class NetDbRenderer {
             
         List<String> countryList = new ArrayList(countries.objects());
         if (countryList.size() > 0) {
-            Collections.sort(countryList);
+            Collections.sort(countryList, new CountryComparator());
             buf.append("<table>\n");
             buf.append("<tr><th align=\"left\">" + _("Country") + "</th><th>" + _("Count") + "</th></tr>\n");
             for (String country : countryList) {
                 int num = countries.count(country);
                 buf.append("<tr><td><img height=\"11\" width=\"16\" alt=\"").append(country.toUpperCase()).append("\"");
                 buf.append(" src=\"/flags.jsp?c=").append(country).append("\"> ");
-                buf.append(_context.commSystem().getCountryName(country));
+                buf.append(_(_context.commSystem().getCountryName(country)));
                 buf.append("</td><td align=\"center\">").append(num).append("</td></tr>\n");
             }
             buf.append("</table>\n");
@@ -211,6 +215,14 @@ public class NetDbRenderer {
         out.flush();
     }
     
+    /** sort by translated country name */
+    private class CountryComparator implements Comparator {
+         public int compare(Object l, Object r) {
+             return _(_context.commSystem().getCountryName((String)l))
+                    .compareTo(_(_context.commSystem().getCountryName((String)r)));
+        }
+    }
+
     /**
      *  Be careful to use stripHTML for any displayed routerInfo data
      *  to prevent vulnerabilities
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java
index f7cb64a0a10173c96c72d51cd85f3f6f06943a10..fe8a823b2317b7a9ec1831eb21698b5ab9fe5823 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java
@@ -171,28 +171,24 @@ class ProfileOrganizerRenderer {
 
         buf.append("<h2>").append(_("Floodfill and Integrated Peers")).append("</h2>\n");
         buf.append("<table>");
-                   buf.append("<tr>");
-                   buf.append("<th class=\"smallhead\">Peer</th>");
-                   buf.append("<th class=\"smallhead\">Caps</th>");
-                   buf.append("<th class=\"smallhead\">Integ. Value</th>");
-                   buf.append("<th class=\"smallhead\">Last Heard About</th>");
-                   buf.append("<th class=\"smallhead\">Last Heard From</th>");
-//                   "<th class=\"smallhead\">Last Successful Send</th>" +
-                   buf.append("<th class=\"smallhead\">Last Good Send</th>");        
-//                   "<th class=\"smallhead\">Last Failed Send</th>" +
-                   buf.append("<th class=\"smallhead\">Last Bad Send</th>");
-                   buf.append("<th class=\"smallhead\">10m Resp. Time</th>");
-                   buf.append("<th class=\"smallhead\">1h Resp. Time</th>");
-                   buf.append("<th class=\"smallhead\">1d Resp. Time</th>");
-//                   "<th class=\"smallhead\">Successful Lookups</th>" + 
-                   buf.append("<th class=\"smallhead\">Good Lookups</th>"); 
-//                   "<th>Failed Lookups</th>" +
-                   buf.append("<th class=\"smallhead\">Bad Lookups</th>");        
-                   buf.append("<th class=\"smallhead\">New Stores</th>");
-                   buf.append("<th class=\"smallhead\">Old Stores</th>");
-                   buf.append("<th class=\"smallhead\">1h Fail Rate</th>");
-                   buf.append("<th class=\"smallhead\">1d Fail Rate</th>");
-                   buf.append("</tr>");
+        buf.append("<tr>");
+        buf.append("<th class=\"smallhead\">").append(_("Peer")).append("</th>");
+        buf.append("<th class=\"smallhead\">").append(_("Caps")).append("</th>");
+        buf.append("<th class=\"smallhead\">").append(_("Integ. Value")).append("</th>");
+        buf.append("<th class=\"smallhead\">").append(_("Last Heard About")).append("</th>");
+        buf.append("<th class=\"smallhead\">").append(_("Last Heard From")).append("</th>");
+        buf.append("<th class=\"smallhead\">").append(_("Last Good Send")).append("</th>");        
+        buf.append("<th class=\"smallhead\">").append(_("Last Bad Send")).append("</th>");
+        buf.append("<th class=\"smallhead\">").append(_("10m Resp. Time")).append("</th>");
+        buf.append("<th class=\"smallhead\">").append(_("1h Resp. Time")).append("</th>");
+        buf.append("<th class=\"smallhead\">").append(_("1d Resp. Time")).append("</th>");
+        buf.append("<th class=\"smallhead\">").append(_("Last Good Lookup")).append("</th>"); 
+        buf.append("<th class=\"smallhead\">").append(_("Last Bad Lookup")).append("</th>");        
+        buf.append("<th class=\"smallhead\">").append(_("Last Good Store")).append("</th>");
+        buf.append("<th class=\"smallhead\">").append(_("Last Bad Store")).append("</th>");
+        buf.append("<th class=\"smallhead\">").append(_("1h Fail Rate")).append("</th>");
+        buf.append("<th class=\"smallhead\">").append(_("1d Fail Rate")).append("</th>");
+        buf.append("</tr>");
         for (Iterator iter = integratedPeers.iterator(); iter.hasNext();) {
             PeerProfile prof = (PeerProfile)iter.next();
             Hash peer = prof.getPeer();
@@ -221,10 +217,14 @@ class ProfileOrganizerRenderer {
             buf.append("<td align=\"right\">").append(avg(prof, 24*60*60*1000l)).append("</td>");
             DBHistory dbh = prof.getDBHistory();
             if (dbh != null) {
-                buf.append("<td align=\"right\">").append(dbh.getSuccessfulLookups()).append("</td>");
-                buf.append("<td align=\"right\">").append(dbh.getFailedLookups()).append("</td>");
-                buf.append("<td align=\"right\">").append(dbh.getUnpromptedDbStoreNew()).append("</td>");
-                buf.append("<td align=\"right\">").append(dbh.getUnpromptedDbStoreOld()).append("</td>");
+                time = now - dbh.getLastLookupSuccessful();
+                buf.append("<td align=\"right\">").append(DataHelper.formatDuration(time)).append("</td>");
+                time = now - dbh.getLastLookupFailed();
+                buf.append("<td align=\"right\">").append(DataHelper.formatDuration(time)).append("</td>");
+                time = now - dbh.getLastStoreSuccessful();
+                buf.append("<td align=\"right\">").append(DataHelper.formatDuration(time)).append("</td>");
+                time = now - dbh.getLastStoreFailed();
+                buf.append("<td align=\"right\">").append(DataHelper.formatDuration(time)).append("</td>");
                 buf.append("<td align=\"right\">").append(davg(dbh, 60*60*1000l)).append("</td>");
                 buf.append("<td align=\"right\">").append(davg(dbh, 24*60*60*1000l)).append("</td>");
             } else {
@@ -242,13 +242,13 @@ class ProfileOrganizerRenderer {
         buf.append("<b>").append(_("Integration")).append(":</b> ").append(num(_organizer.getIntegrationThreshold()))
            .append(" (").append(integrated).append(' ').append(_(" well integrated peers")).append(")</p>");
         buf.append("<h3>").append(_("Definitions")).append(":</h3><ul>");
-                   buf.append("<li><b>").append(_("groups")).append("</b>: ").append(_("as determined by the profile organizer")).append("</li>");
-                   buf.append("<li><b>").append(_("caps")).append("</b>: ").append(_("capabilities in the netDb, not used to determine profiles")).append("</li>");
-                   buf.append("<li><b>").append(_("speed")).append("</b>: ").append(_("peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel")).append("</li>");
-                   buf.append("<li><b>").append(_("capacity")).append("</b>: ").append(_("how many tunnels can we ask them to join in an hour?")).append("</li>");
-                   buf.append("<li><b>").append(_("integration")).append("</b>: ").append(_("how many new peers have they told us about lately?")).append("</li>");
-                   buf.append("<li><b>").append(_("status")).append("</b>: ").append(_("is the peer banned, or unreachable, or failing tunnel tests?")).append("</li>");
-                   buf.append("</ul></i>");
+        buf.append("<li><b>").append(_("groups")).append("</b>: ").append(_("as determined by the profile organizer")).append("</li>");
+        buf.append("<li><b>").append(_("caps")).append("</b>: ").append(_("capabilities in the netDb, not used to determine profiles")).append("</li>");
+        buf.append("<li><b>").append(_("speed")).append("</b>: ").append(_("peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel")).append("</li>");
+        buf.append("<li><b>").append(_("capacity")).append("</b>: ").append(_("how many tunnels can we ask them to join in an hour?")).append("</li>");
+        buf.append("<li><b>").append(_("integration")).append("</b>: ").append(_("how many new peers have they told us about lately?")).append("</li>");
+        buf.append("<li><b>").append(_("status")).append("</b>: ").append(_("is the peer banned, or unreachable, or failing tunnel tests?")).append("</li>");
+        buf.append("</ul></i>");
         out.write(buf.toString());
         out.flush();
     }
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 0faa74542e7a543996a069d538da8841e5ae3f78..2228f6078755f660ef956c7d1e45c2ffdd637787 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java
@@ -29,7 +29,7 @@ public class StatsGenerator {
     
     public void generateStatsPage(Writer out) throws IOException {
         StringBuilder buf = new StringBuilder(16*1024);
-        buf.append("<div class=\"joblog\"><form action=\"/oldstats.jsp\">");
+        buf.append("<div class=\"joblog\"><form action=\"/stats.jsp\">");
         buf.append("<select name=\"go\" onChange='location.href=this.value'>");
         out.write(buf.toString());
         buf.setLength(0);
@@ -39,11 +39,11 @@ public class StatsGenerator {
             Map.Entry entry = (Map.Entry)iter.next();
             String group = (String)entry.getKey();
             Set stats = (Set)entry.getValue();
-            buf.append("<option value=\"/oldstats.jsp#").append(group).append("\">");
+            buf.append("<option value=\"/stats.jsp#").append(group).append("\">");
             buf.append(group).append("</option>\n");
             for (Iterator statIter = stats.iterator(); statIter.hasNext(); ) {
                 String stat = (String)statIter.next();
-                buf.append("<option value=\"/oldstats.jsp#");
+                buf.append("<option value=\"/stats.jsp#");
                 buf.append(stat);
                 buf.append("\">...");
                 buf.append(stat);
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java
index 585cd40ad50723475dac923a0d540bb3441f1057..72856fedcd24d4768bfc30e1784a605e6b20c5ac 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java
@@ -118,7 +118,7 @@ public class SummaryBarRenderer {
                .append(_("Graphs"))
                .append("</a>\n" +
 
-                       "<a href=\"oldstats.jsp\" target=\"_top\" title=\"")
+                       "<a href=\"stats.jsp\" target=\"_top\" title=\"")
                .append(_("Textual router performance statistics"))
                .append("\">")
                .append(_("Stats"))
diff --git a/apps/routerconsole/jsp/oldstats.jsp b/apps/routerconsole/jsp/stats.jsp
similarity index 100%
rename from apps/routerconsole/jsp/oldstats.jsp
rename to apps/routerconsole/jsp/stats.jsp
diff --git a/apps/routerconsole/locale/messages_zh.po b/apps/routerconsole/locale/messages_zh.po
index 0c84c83c2f7dde059b629d8be20a6c953e2c6468..ba404660dc1a61daef522d50cec0f5db44b1ed66 100644
--- a/apps/routerconsole/locale/messages_zh.po
+++ b/apps/routerconsole/locale/messages_zh.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P routerconsole\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-05 00:36+0000\n"
+"POT-Creation-Date: 2009-11-08 02:16+0000\n"
 "PO-Revision-Date: \n"
 "Last-Translator: walking <walking@mail.i2p>\n"
 "Language-Team: \n"
@@ -36,15 +36,16 @@ msgstr "连网设置"
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:220
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:228
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fzh_jsp.java:220
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:220
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:223
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:216
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:216
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:216
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldstats_jsp.java:216
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:216
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:216
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summary_jsp.java:157
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:236
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:216
@@ -65,15 +66,16 @@ msgstr "刷新(秒)"
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:224
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:232
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fzh_jsp.java:224
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:224
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:227
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:220
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:220
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:220
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:224
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldstats_jsp.java:220
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:220
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:220
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summary_jsp.java:161
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:239
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:220
@@ -444,7 +446,7 @@ msgid "The router is currently testing whether your UDP port is firewalled."
 msgstr "路由器正在测试您的UDP端口是否被防火墙阻挡。"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:558
-#: src/net/i2p/router/web/NetDbRenderer.java:234
+#: src/net/i2p/router/web/NetDbRenderer.java:246
 #: src/net/i2p/router/web/SummaryHelper.java:96
 msgid "Hidden"
 msgstr "隐身"
@@ -1254,14 +1256,6 @@ msgstr "I2P 网络数据库概况"
 msgid "I2P Network Database Summary"
 msgstr "I2P 网络数据库概况"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldstats_jsp.java:105
-msgid "statistics"
-msgstr "统计数据"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldstats_jsp.java:242
-msgid "I2P Router Statistics"
-msgstr "I2P 路由器统计数据"
-
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:105
 msgid "peer connections"
 msgstr "节点连接"
@@ -1278,6 +1272,14 @@ msgstr "节点信息"
 msgid "I2P Network Peer Profiles"
 msgstr "I2P 网络节点信息"
 
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:105
+msgid "statistics"
+msgstr "统计数据"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:242
+msgid "I2P Router Statistics"
+msgstr "I2P 路由器统计数据"
+
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:245
 #, java-format
 msgid "Disable {0}s Refresh"
@@ -1291,6 +1293,931 @@ msgstr "隧道概况"
 msgid "I2P Tunnel Summary"
 msgstr "I2P 隧道概况"
 
+#: build/Countries.java:3
+msgid "Andorra"
+msgstr "安道尔"
+
+#: build/Countries.java:4
+msgid "United Arab Emirates"
+msgstr "阿联酋"
+
+#: build/Countries.java:5
+msgid "Afghanistan"
+msgstr "阿富汗"
+
+#: build/Countries.java:6
+msgid "Antigua and Barbuda"
+msgstr "安提瓜与巴布达"
+
+#: build/Countries.java:7
+msgid "Anguilla"
+msgstr "安格拉"
+
+#: build/Countries.java:8
+msgid "Albania"
+msgstr "阿尔巴尼亚"
+
+#: build/Countries.java:9
+msgid "Armenia"
+msgstr "亚美尼亚"
+
+#: build/Countries.java:10
+msgid "Netherlands Antilles"
+msgstr "荷兰属地"
+
+#: build/Countries.java:11
+msgid "Angola"
+msgstr "安哥拉"
+
+#: build/Countries.java:12
+msgid "Antarctica"
+msgstr "南极洲"
+
+#: build/Countries.java:13
+msgid "Argentina"
+msgstr "阿根廷"
+
+#: build/Countries.java:14
+msgid "American Samoa"
+msgstr "东萨摩亚"
+
+#: build/Countries.java:15
+msgid "Austria"
+msgstr "奥地利"
+
+#: build/Countries.java:16
+msgid "Australia"
+msgstr "澳大利亚"
+
+#: build/Countries.java:17
+msgid "Aruba"
+msgstr "阿鲁巴"
+
+#: build/Countries.java:19
+msgid "Azerbaijan"
+msgstr "阿塞拜疆"
+
+#: build/Countries.java:20
+msgid "Bosnia and Herzegovina"
+msgstr "波黑"
+
+#: build/Countries.java:21
+msgid "Barbados"
+msgstr "巴巴多斯"
+
+#: build/Countries.java:22
+msgid "Bangladesh"
+msgstr "孟加拉"
+
+#: build/Countries.java:23
+msgid "Belgium"
+msgstr "比利时"
+
+#: build/Countries.java:24
+msgid "Burkina Faso"
+msgstr "布基纳法索"
+
+#: build/Countries.java:25
+msgid "Bulgaria"
+msgstr "保加利亚"
+
+#: build/Countries.java:26
+msgid "Bahrain"
+msgstr "å·´æž—"
+
+#: build/Countries.java:27
+msgid "Burundi"
+msgstr "不丹"
+
+#: build/Countries.java:28
+msgid "Benin"
+msgstr "贝宁"
+
+#: build/Countries.java:29
+msgid "Bermuda"
+msgstr "百慕大"
+
+#: build/Countries.java:30
+msgid "Brunei Darussalam"
+msgstr "文莱达鲁萨兰"
+
+#: build/Countries.java:31
+msgid "Bolivia"
+msgstr "玻利维亚"
+
+#: build/Countries.java:32
+msgid "Brazil"
+msgstr "巴西"
+
+#: build/Countries.java:33
+msgid "Bahamas"
+msgstr "巴哈马"
+
+#: build/Countries.java:34
+msgid "Bhutan"
+msgstr "不丹"
+
+#: build/Countries.java:35
+msgid "Bouvet Island"
+msgstr "布韦群岛"
+
+#: build/Countries.java:36
+msgid "Botswana"
+msgstr "伯兹瓦纳"
+
+#: build/Countries.java:37
+msgid "Belarus"
+msgstr "白俄罗斯"
+
+#: build/Countries.java:38
+msgid "Belize"
+msgstr "伯利兹"
+
+#: build/Countries.java:39
+msgid "Canada"
+msgstr "加拿大"
+
+#: build/Countries.java:40
+msgid "The Democratic Republic of the Congo"
+msgstr "刚果"
+
+#: build/Countries.java:41
+msgid "Central African Republic"
+msgstr "中非"
+
+#: build/Countries.java:42
+msgid "Congo"
+msgstr "Congo"
+
+#: build/Countries.java:43
+msgid "Switzerland"
+msgstr "瑞士"
+
+#: build/Countries.java:44
+msgid "Cote D'Ivoire"
+msgstr "象牙海岸"
+
+#: build/Countries.java:45
+msgid "Cook Islands"
+msgstr "库克群岛"
+
+#: build/Countries.java:46
+msgid "Chile"
+msgstr "智利"
+
+#: build/Countries.java:47
+msgid "Cameroon"
+msgstr "喀麦隆"
+
+#: build/Countries.java:48
+msgid "China"
+msgstr "中国"
+
+#: build/Countries.java:49
+msgid "Colombia"
+msgstr "哥伦比亚"
+
+#: build/Countries.java:50
+msgid "Costa Rica"
+msgstr "哥斯达黎加"
+
+#: build/Countries.java:51
+msgid "Serbia and Montenegro"
+msgstr "塞尔维亚与黑山"
+
+#: build/Countries.java:52
+msgid "Cuba"
+msgstr "古巴"
+
+#: build/Countries.java:53
+msgid "Cape Verde"
+msgstr "佛得角"
+
+#: build/Countries.java:54
+msgid "Cyprus"
+msgstr "塞浦路斯"
+
+#: build/Countries.java:55
+msgid "Czech Republic"
+msgstr "捷克"
+
+#: build/Countries.java:56
+msgid "Germany"
+msgstr "德国"
+
+#: build/Countries.java:57
+msgid "Djibouti"
+msgstr "吉布提"
+
+#: build/Countries.java:58
+msgid "Denmark"
+msgstr "丹麦"
+
+#: build/Countries.java:59
+msgid "Dominica"
+msgstr "多米尼"
+
+#: build/Countries.java:60
+msgid "Dominican Republic"
+msgstr "多米尼加联邦"
+
+#: build/Countries.java:61
+msgid "Algeria"
+msgstr "阿尔及利亚"
+
+#: build/Countries.java:62
+msgid "Ecuador"
+msgstr "厄瓜多尔"
+
+#: build/Countries.java:63
+msgid "Estonia"
+msgstr "爱沙尼亚"
+
+#: build/Countries.java:64
+msgid "Egypt"
+msgstr "埃及"
+
+#: build/Countries.java:65
+msgid "Eritrea"
+msgstr "厄立特里亚"
+
+#: build/Countries.java:66
+msgid "Spain"
+msgstr "西班牙"
+
+#: build/Countries.java:67
+msgid "Ethiopia"
+msgstr "埃塞俄比亚"
+
+#: build/Countries.java:68
+msgid "Finland"
+msgstr "芬兰"
+
+#: build/Countries.java:69
+msgid "Fiji"
+msgstr "斐济"
+
+#: build/Countries.java:70
+msgid "Falkland Islands (Malvinas)"
+msgstr "福克兰群岛"
+
+#: build/Countries.java:71
+msgid "Federated States of Micronesia"
+msgstr "密克罗尼西亚"
+
+#: build/Countries.java:72
+msgid "Faroe Islands"
+msgstr "法罗群岛"
+
+#: build/Countries.java:73
+msgid "France"
+msgstr "法国"
+
+#: build/Countries.java:74
+msgid "Gabon"
+msgstr "加蓬"
+
+#: build/Countries.java:75
+msgid "United Kingdom"
+msgstr "英国"
+
+#: build/Countries.java:76
+msgid "Grenada"
+msgstr "格林纳达"
+
+#: build/Countries.java:77
+msgid "Georgia"
+msgstr "格鲁吉亚"
+
+#: build/Countries.java:78
+msgid "French Guiana"
+msgstr "圭亚那"
+
+#: build/Countries.java:79
+msgid "Ghana"
+msgstr "加纳"
+
+#: build/Countries.java:80
+msgid "Gibraltar"
+msgstr "直布罗陀"
+
+#: build/Countries.java:81
+msgid "Greenland"
+msgstr "格陵兰群岛"
+
+#: build/Countries.java:82
+msgid "Gambia"
+msgstr "冈比亚"
+
+#: build/Countries.java:83
+msgid "Guinea"
+msgstr "几内亚"
+
+#: build/Countries.java:84
+msgid "Guadeloupe"
+msgstr "瓜德罗普岛"
+
+#: build/Countries.java:85
+msgid "Equatorial Guinea"
+msgstr "赤道几内亚"
+
+#: build/Countries.java:86
+msgid "Greece"
+msgstr "希腊"
+
+#: build/Countries.java:87
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "南乔治亚岛和南桑德韦奇岛"
+
+#: build/Countries.java:88
+msgid "Guatemala"
+msgstr "危地马拉"
+
+#: build/Countries.java:89
+msgid "Guam"
+msgstr "关岛"
+
+#: build/Countries.java:90
+msgid "Guinea-Bissau"
+msgstr "几内亚比绍"
+
+#: build/Countries.java:91
+msgid "Guyana"
+msgstr "圭亚那"
+
+#: build/Countries.java:92
+msgid "Hong Kong"
+msgstr "香港"
+
+#: build/Countries.java:93
+msgid "Honduras"
+msgstr "洪都拉斯"
+
+#: build/Countries.java:94
+msgid "Croatia"
+msgstr "克罗蒂亚"
+
+#: build/Countries.java:95
+msgid "Haiti"
+msgstr "海地"
+
+#: build/Countries.java:96
+msgid "Hungary"
+msgstr "匈牙利"
+
+#: build/Countries.java:97
+msgid "Indonesia"
+msgstr "印尼"
+
+#: build/Countries.java:98
+msgid "Ireland"
+msgstr "爱尔兰"
+
+#: build/Countries.java:99
+msgid "Israel"
+msgstr "以色列"
+
+#: build/Countries.java:101
+msgid "India"
+msgstr "印度"
+
+#: build/Countries.java:102
+msgid "British Indian Ocean Territory"
+msgstr "英属印度洋地区"
+
+#: build/Countries.java:103
+msgid "Iraq"
+msgstr "伊拉克"
+
+#: build/Countries.java:104
+msgid "Islamic Republic of Iran"
+msgstr "伊朗"
+
+#: build/Countries.java:105
+msgid "Iceland"
+msgstr "冰岛"
+
+#: build/Countries.java:106
+msgid "Italy"
+msgstr "意大利"
+
+#: build/Countries.java:108
+msgid "Jamaica"
+msgstr "牙买加"
+
+#: build/Countries.java:109
+msgid "Jordan"
+msgstr "约旦"
+
+#: build/Countries.java:110
+msgid "Japan"
+msgstr "日本"
+
+#: build/Countries.java:111
+msgid "Kenya"
+msgstr "肯尼亚"
+
+#: build/Countries.java:112
+msgid "Kyrgyzstan"
+msgstr "吉尔吉斯斯坦"
+
+#: build/Countries.java:113
+msgid "Cambodia"
+msgstr "柬埔塞"
+
+#: build/Countries.java:114
+msgid "Kiribati"
+msgstr "基里巴斯"
+
+#: build/Countries.java:115
+msgid "Comoros"
+msgstr "科摩罗"
+
+#: build/Countries.java:116
+msgid "Saint Kitts and Nevis"
+msgstr "圣克里斯多福与尼维斯"
+
+#: build/Countries.java:117
+msgid "Republic of Korea"
+msgstr "韩国"
+
+#: build/Countries.java:118
+msgid "Kuwait"
+msgstr "科威特"
+
+#: build/Countries.java:119
+msgid "Cayman Islands"
+msgstr "开曼群岛"
+
+#: build/Countries.java:120
+msgid "Kazakhstan"
+msgstr "哈萨克斯坦"
+
+#: build/Countries.java:121
+msgid "Lao People'S Democratic Republic"
+msgstr "老挝"
+
+#: build/Countries.java:122
+msgid "Lebanon"
+msgstr "黎巴嫩"
+
+#: build/Countries.java:123
+msgid "Saint Lucia"
+msgstr "圣露西亚岛"
+
+#: build/Countries.java:124
+msgid "Liechtenstein"
+msgstr "列支敦士登"
+
+#: build/Countries.java:125
+msgid "Sri Lanka"
+msgstr "斯里兰卡"
+
+#: build/Countries.java:126
+msgid "Liberia"
+msgstr "利比里亚"
+
+#: build/Countries.java:127
+msgid "Lesotho"
+msgstr "莱索托"
+
+#: build/Countries.java:128
+msgid "Lithuania"
+msgstr "立陶宛"
+
+#: build/Countries.java:129
+msgid "Luxembourg"
+msgstr "卢森堡"
+
+#: build/Countries.java:130
+msgid "Latvia"
+msgstr "拉脱维亚"
+
+#: build/Countries.java:131
+msgid "Libyan Arab Jamahiriya"
+msgstr "利比亚"
+
+#: build/Countries.java:132
+msgid "Morocco"
+msgstr "摩洛哥"
+
+#: build/Countries.java:133
+msgid "Monaco"
+msgstr "摩纳哥"
+
+#: build/Countries.java:134
+msgid "Republic of Moldova"
+msgstr "摩尔多瓦"
+
+#: build/Countries.java:137
+msgid "Madagascar"
+msgstr "马达加斯加"
+
+#: build/Countries.java:138
+msgid "Marshall Islands"
+msgstr "马绍尔群岛"
+
+#: build/Countries.java:139
+msgid "The Former Yugoslav Republic of Macedonia"
+msgstr "前南斯拉夫之马其顿共和国"
+
+#: build/Countries.java:140
+msgid "Mali"
+msgstr "马里"
+
+#: build/Countries.java:141
+msgid "Myanmar"
+msgstr "缅甸"
+
+#: build/Countries.java:142
+msgid "Mongolia"
+msgstr "蒙古"
+
+#: build/Countries.java:143
+msgid "Macao"
+msgstr "澳门"
+
+#: build/Countries.java:144
+msgid "Northern Mariana Islands"
+msgstr "北马里亚纳群岛"
+
+#: build/Countries.java:145
+msgid "Martinique"
+msgstr "马提尼克岛"
+
+#: build/Countries.java:146
+msgid "Mauritania"
+msgstr "毛里塔尼亚"
+
+#: build/Countries.java:147
+msgid "Montserrat"
+msgstr "蒙特塞拉特"
+
+#: build/Countries.java:148
+msgid "Malta"
+msgstr "马尔他"
+
+#: build/Countries.java:149
+msgid "Mauritius"
+msgstr "毛里求斯"
+
+#: build/Countries.java:150
+msgid "Maldives"
+msgstr "马尔代夫"
+
+#: build/Countries.java:151
+msgid "Malawi"
+msgstr "马拉维"
+
+#: build/Countries.java:152
+msgid "Mexico"
+msgstr "墨西哥"
+
+#: build/Countries.java:153
+msgid "Malaysia"
+msgstr "马来西亚"
+
+#: build/Countries.java:154
+msgid "Mozambique"
+msgstr "莫桑比克"
+
+#: build/Countries.java:155
+msgid "Namibia"
+msgstr "纳米比亚"
+
+#: build/Countries.java:156
+msgid "New Caledonia"
+msgstr "新喀里多尼亚"
+
+#: build/Countries.java:157
+msgid "Niger"
+msgstr "尼日尔"
+
+#: build/Countries.java:158
+msgid "Norfolk Island"
+msgstr "尼加拉瓜"
+
+#: build/Countries.java:159
+msgid "Nigeria"
+msgstr "尼日利亚"
+
+#: build/Countries.java:160
+msgid "Nicaragua"
+msgstr "尼加拉瓜"
+
+#: build/Countries.java:161
+msgid "Netherlands"
+msgstr "荷兰"
+
+#: build/Countries.java:162
+msgid "Norway"
+msgstr "挪威"
+
+#: build/Countries.java:163
+msgid "Nepal"
+msgstr "尼泊尔"
+
+#: build/Countries.java:164
+msgid "Nauru"
+msgstr "瑙鲁"
+
+#: build/Countries.java:165
+msgid "Niue"
+msgstr "纽埃岛"
+
+#: build/Countries.java:166
+msgid "New Zealand"
+msgstr "新西兰"
+
+#: build/Countries.java:167
+msgid "Oman"
+msgstr "阿曼"
+
+#: build/Countries.java:168
+msgid "Panama"
+msgstr "巴拿马"
+
+#: build/Countries.java:169
+msgid "Peru"
+msgstr "秘鲁"
+
+#: build/Countries.java:170
+msgid "French Polynesia"
+msgstr "玻利尼西亚"
+
+#: build/Countries.java:171
+msgid "Papua New Guinea"
+msgstr "巴布亚新几内亚"
+
+#: build/Countries.java:172
+msgid "Philippines"
+msgstr "菲律宾"
+
+#: build/Countries.java:173
+msgid "Pakistan"
+msgstr "巴基斯坦"
+
+#: build/Countries.java:174
+msgid "Poland"
+msgstr "波兰"
+
+#: build/Countries.java:175
+msgid "Saint Pierre and Miquelon"
+msgstr "圣皮埃尔岛和密克隆"
+
+#: build/Countries.java:176
+msgid "Puerto Rico"
+msgstr "波多黎各"
+
+#: build/Countries.java:177
+msgid "Palestinian Territory"
+msgstr "巴勒斯坦地区"
+
+#: build/Countries.java:178
+msgid "Portugal"
+msgstr "葡萄牙"
+
+#: build/Countries.java:179
+msgid "Palau"
+msgstr "帕劳"
+
+#: build/Countries.java:180
+msgid "Paraguay"
+msgstr "巴拉圭"
+
+#: build/Countries.java:181
+msgid "Qatar"
+msgstr "卡塔尔"
+
+#: build/Countries.java:182
+msgid "Reunion"
+msgstr "留尼汪岛"
+
+#: build/Countries.java:183
+msgid "Romania"
+msgstr "罗马尼亚"
+
+#: build/Countries.java:184
+msgid "Serbia"
+msgstr "塞尔维亚"
+
+#: build/Countries.java:185
+msgid "Russian Federation"
+msgstr "俄联邦"
+
+#: build/Countries.java:186
+msgid "Rwanda"
+msgstr "卢旺达"
+
+#: build/Countries.java:187
+msgid "Saudi Arabia"
+msgstr "沙特阿拉伯"
+
+#: build/Countries.java:188
+msgid "Solomon Islands"
+msgstr "所罗门群岛"
+
+#: build/Countries.java:189
+msgid "Seychelles"
+msgstr "塞舌尔"
+
+#: build/Countries.java:190
+msgid "Sudan"
+msgstr "苏丹"
+
+#: build/Countries.java:191
+msgid "Sweden"
+msgstr "ç‘žå…¸"
+
+#: build/Countries.java:192
+msgid "Singapore"
+msgstr "新加坡"
+
+#: build/Countries.java:193
+msgid "Slovenia"
+msgstr "斯洛文尼亚"
+
+#: build/Countries.java:194
+msgid "Slovakia"
+msgstr "斯洛伐克"
+
+#: build/Countries.java:195
+msgid "Sierra Leone"
+msgstr "塞拉利昂"
+
+#: build/Countries.java:196
+msgid "San Marino"
+msgstr "圣马力诺"
+
+#: build/Countries.java:197
+msgid "Senegal"
+msgstr "塞内加尔"
+
+#: build/Countries.java:198
+msgid "Somalia"
+msgstr "索马里"
+
+#: build/Countries.java:199
+msgid "Suriname"
+msgstr "苏里南"
+
+#: build/Countries.java:200
+msgid "Sao Tome and Principe"
+msgstr "圣多美与普林西比共和国"
+
+#: build/Countries.java:201
+msgid "El Salvador"
+msgstr "萨尔瓦多"
+
+#: build/Countries.java:202
+msgid "Syrian Arab Republic"
+msgstr "叙利亚"
+
+#: build/Countries.java:203
+msgid "Swaziland"
+msgstr "斯威士兰"
+
+#: build/Countries.java:204
+msgid "Turks and Caicos Islands"
+msgstr "特克斯和凯科斯群岛"
+
+#: build/Countries.java:205
+msgid "Chad"
+msgstr "乍得"
+
+#: build/Countries.java:206
+msgid "French Southern Territories"
+msgstr "法属南半球领地"
+
+#: build/Countries.java:207
+msgid "Togo"
+msgstr "多哥"
+
+#: build/Countries.java:208
+msgid "Thailand"
+msgstr "泰国"
+
+#: build/Countries.java:209
+msgid "Tajikistan"
+msgstr "塔吉克斯坦"
+
+#: build/Countries.java:210
+msgid "Tokelau"
+msgstr "托克劳群岛"
+
+#: build/Countries.java:211
+msgid "Timor-Leste"
+msgstr "东帝汶"
+
+#: build/Countries.java:212
+msgid "Turkmenistan"
+msgstr "土库曼斯坦"
+
+#: build/Countries.java:213
+msgid "Tunisia"
+msgstr "突尼斯"
+
+#: build/Countries.java:214
+msgid "Tonga"
+msgstr "汤加"
+
+#: build/Countries.java:215
+msgid "Turkey"
+msgstr "土耳其"
+
+#: build/Countries.java:216
+msgid "Trinidad and Tobago"
+msgstr "特立尼达和多巴哥"
+
+#: build/Countries.java:217
+msgid "Tuvalu"
+msgstr "图瓦鲁"
+
+#: build/Countries.java:218
+msgid "Taiwan"
+msgstr "台湾"
+
+#: build/Countries.java:219
+msgid "United Republic of Tanzania"
+msgstr "坦桑尼亚"
+
+#: build/Countries.java:220
+msgid "Ukraine"
+msgstr "乌克兰"
+
+#: build/Countries.java:221
+msgid "Uganda"
+msgstr "乌干达"
+
+#: build/Countries.java:222
+msgid "United States Minor Outlying Islands"
+msgstr "美国本土外小岛屿"
+
+#: build/Countries.java:223
+msgid "United States"
+msgstr "美国"
+
+#: build/Countries.java:224
+msgid "Uruguay"
+msgstr "乌拉圭"
+
+#: build/Countries.java:225
+msgid "Uzbekistan"
+msgstr "乌兹别克斯坦"
+
+#: build/Countries.java:226
+msgid "Holy See (Vatican City State)"
+msgstr "梵地冈"
+
+#: build/Countries.java:227
+msgid "Saint Vincent and the Grenadines"
+msgstr "圣文森特和格林纳丁斯"
+
+#: build/Countries.java:228
+msgid "Venezuela"
+msgstr "委内瑞拉"
+
+#: build/Countries.java:229
+#: build/Countries.java:230
+msgid "Virgin Islands"
+msgstr "维京群岛"
+
+#: build/Countries.java:231
+msgid "Viet Nam"
+msgstr "越南"
+
+#: build/Countries.java:232
+msgid "Vanuatu"
+msgstr "瓦努阿图"
+
+#: build/Countries.java:233
+msgid "Wallis and Futuna"
+msgstr "瓦利斯群岛和富图纳群岛"
+
+#: build/Countries.java:234
+msgid "Samoa"
+msgstr "东萨摩亚"
+
+#: build/Countries.java:235
+msgid "Yemen"
+msgstr "也门"
+
+#: build/Countries.java:236
+msgid "Mayotte"
+msgstr "马约特"
+
+#: build/Countries.java:237
+msgid "South Africa"
+msgstr "南非"
+
+#: build/Countries.java:238
+msgid "Zambia"
+msgstr "赞比亚"
+
+#: build/Countries.java:239
+msgid "Zimbabwe"
+msgstr "津巴布韦"
+
 #: src/net/i2p/router/web/ConfigAdvancedHandler.java:57
 msgid "Error updating the configuration - please see the error logs"
 msgstr "配置更新出错 - 请查看错误日志"
@@ -1342,7 +2269,7 @@ msgstr "WebApp设置保存成功 - 程序重启后生效"
 #: src/net/i2p/router/web/ConfigClientsHandler.java:129
 #: src/net/i2p/router/web/ConfigClientsHelper.java:34
 msgid "WebApp"
-msgstr "Web程序(WebApp)"
+msgstr "Web程序"
 
 #: src/net/i2p/router/web/ConfigClientsHandler.java:131
 msgid "Failed to start"
@@ -1463,7 +2390,7 @@ msgid "Peers"
 msgstr "节点"
 
 #: src/net/i2p/router/web/ConfigNavHelper.java:19
-#: src/net/i2p/router/web/NetDbRenderer.java:256
+#: src/net/i2p/router/web/NetDbRenderer.java:268
 #: src/net/i2p/router/web/SummaryBarRenderer.java:124
 msgid "Stats"
 msgstr "统计数据"
@@ -1560,6 +2487,7 @@ msgstr "比特/秒"
 #: src/net/i2p/router/web/ConfigPeerHandler.java:33
 #: src/net/i2p/router/web/ConfigPeerHandler.java:35
 #: src/net/i2p/router/web/ProfileOrganizerRenderer.java:69
+#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:175
 #: src/net/i2p/router/web/TunnelRenderer.java:235
 msgid "Peer"
 msgstr "节点"
@@ -1604,7 +2532,7 @@ msgstr "立刻重启"
 
 #: src/net/i2p/router/web/ConfigRestartBean.java:43
 msgid "Restart"
-msgstr "重 启"
+msgstr "重 启"
 
 #: src/net/i2p/router/web/ConfigRestartBean.java:46
 msgid "Shutdown"
@@ -1710,6 +2638,10 @@ msgstr "统计数据过滤器及位置成功更新至"
 msgid "Failed to update the stat filter and location"
 msgstr "统计数据过滤器及地址更新失败"
 
+#: src/net/i2p/router/web/ConfigStatsHandler.java:121
+msgid "Graph list updated, may take up to 60s to be reflected here and on the <a href=\"graphs.jsp\">Graphs Page</a>"
+msgstr "曲线图列表已更新,更新后的内容可能需要最多 60s 的时间才能在这里及 <a href=\"graphs.jsp\">统计图表</a>页面中反映出来。"
+
 #: src/net/i2p/router/web/ConfigTunnelsHandler.java:137
 msgid "Updated settings for all pools."
 msgstr "隧道池更新完毕"
@@ -1966,125 +2898,121 @@ msgstr "路由器"
 msgid "not found in network database"
 msgstr "在网络数据库概况未找到"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:86
-#: src/net/i2p/router/web/NetDbRenderer.java:135
+#: src/net/i2p/router/web/NetDbRenderer.java:82
+#: src/net/i2p/router/web/NetDbRenderer.java:134
 msgid "Network Database Contents"
 msgstr "网络数据库内容"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:87
+#: src/net/i2p/router/web/NetDbRenderer.java:83
 msgid "View RouterInfo"
 msgstr "浏览 RouterInfo"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:88
+#: src/net/i2p/router/web/NetDbRenderer.java:84
 msgid "LeaseSets"
-msgstr "赁集(LeaseSet)"
+msgstr "赁集"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:96
+#: src/net/i2p/router/web/NetDbRenderer.java:92
 msgid "LeaseSet"
-msgstr "赁集(LeaseSet)"
+msgstr "赁集"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:98
+#: src/net/i2p/router/web/NetDbRenderer.java:94
 msgid "Local"
 msgstr "本地"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:100
+#: src/net/i2p/router/web/NetDbRenderer.java:96
 msgid "Unpublished"
 msgstr "未发布"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:101
-#: src/net/i2p/router/web/NetDbRenderer.java:108
+#: src/net/i2p/router/web/NetDbRenderer.java:97
+#: src/net/i2p/router/web/NetDbRenderer.java:104
 msgid "Destination"
 msgstr "目标"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:118
+#: src/net/i2p/router/web/NetDbRenderer.java:114
 #, java-format
 msgid "Expires in {0}"
 msgstr "{0} 后过期"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:120
+#: src/net/i2p/router/web/NetDbRenderer.java:116
 #, java-format
 msgid "Expired {0} ago"
 msgstr "{0}前过期"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:122
+#: src/net/i2p/router/web/NetDbRenderer.java:118
 #: src/net/i2p/router/web/TunnelRenderer.java:156
 msgid "Gateway"
 msgstr "网关"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:122
+#: src/net/i2p/router/web/NetDbRenderer.java:118
 msgid "Lease"
 msgstr "租赁"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:124
+#: src/net/i2p/router/web/NetDbRenderer.java:120
 msgid "Tunnel"
 msgstr "隧道"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:135
+#: src/net/i2p/router/web/NetDbRenderer.java:134
 msgid "View LeaseSets"
-msgstr "查看赁集(LeaseSet)"
+msgstr "查看赁集"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:137
+#: src/net/i2p/router/web/NetDbRenderer.java:136
 msgid "Not initialized"
 msgstr "未初始化"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:143
+#: src/net/i2p/router/web/NetDbRenderer.java:145
 msgid "Routers"
 msgstr "路由器"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:145
-msgid "view without"
-msgstr "查看不含"
-
 #: src/net/i2p/router/web/NetDbRenderer.java:147
-msgid "view with"
-msgstr "查看含"
+msgid "Show all routers"
+msgstr "显示所有路由器"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:148
-msgid "stats"
-msgstr "统计"
+#: src/net/i2p/router/web/NetDbRenderer.java:149
+msgid "Show all routers with full stats"
+msgstr "显示所有路由及统计"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:183
-#: src/net/i2p/router/web/NetDbRenderer.java:199
+#: src/net/i2p/router/web/NetDbRenderer.java:187
+#: src/net/i2p/router/web/NetDbRenderer.java:203
 msgid "Count"
 msgstr "计数"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:183
+#: src/net/i2p/router/web/NetDbRenderer.java:187
 #: src/net/i2p/router/web/SummaryBarRenderer.java:150
 msgid "Version"
 msgstr "版本"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:199
+#: src/net/i2p/router/web/NetDbRenderer.java:203
 msgid "Country"
 msgstr "国家"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:222
+#: src/net/i2p/router/web/NetDbRenderer.java:234
 msgid "Our info"
 msgstr "我方信息"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:224
+#: src/net/i2p/router/web/NetDbRenderer.java:236
 msgid "Peer info for"
 msgstr "节点信息"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:228
+#: src/net/i2p/router/web/NetDbRenderer.java:240
 msgid "Full entry"
 msgstr "完整项"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:234
+#: src/net/i2p/router/web/NetDbRenderer.java:246
 msgid "Updated"
 msgstr "已更新"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:234
-#: src/net/i2p/router/web/NetDbRenderer.java:236
+#: src/net/i2p/router/web/NetDbRenderer.java:246
+#: src/net/i2p/router/web/NetDbRenderer.java:248
 #: src/net/i2p/router/web/SummaryHelper.java:385
 msgid "ago"
 msgstr "前"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:236
-#: src/net/i2p/router/web/NetDbRenderer.java:238
+#: src/net/i2p/router/web/NetDbRenderer.java:248
+#: src/net/i2p/router/web/NetDbRenderer.java:250
 msgid "Published"
 msgstr "发布"
 
-#: src/net/i2p/router/web/NetDbRenderer.java:239
+#: src/net/i2p/router/web/NetDbRenderer.java:251
 msgid "Address(es)"
 msgstr "地址"
 
@@ -2167,6 +3095,66 @@ msgstr "节点信息"
 msgid "Floodfill and Integrated Peers"
 msgstr "种子节点与整合节点"
 
+#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:176
+msgid "Caps"
+msgstr "容量"
+
+#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:177
+msgid "Integ. Value"
+msgstr ""
+
+#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:178
+msgid "Last Heard About"
+msgstr ""
+
+#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:179
+msgid "Last Heard From"
+msgstr ""
+
+#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:180
+msgid "Last Good Send"
+msgstr "上一次发送成功"
+
+#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:181
+msgid "Last Bad Send"
+msgstr "上一次发送失败"
+
+#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:182
+msgid "10m Resp. Time"
+msgstr "10m响应时间"
+
+#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:183
+msgid "1h Resp. Time"
+msgstr "1h响应时间"
+
+#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:184
+msgid "1d Resp. Time"
+msgstr "1d响应时间"
+
+#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:185
+msgid "Last Good Lookup"
+msgstr "上一次查询成功"
+
+#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:186
+msgid "Last Bad Lookup"
+msgstr "上一次查询失败"
+
+#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:187
+msgid "Last Good Store"
+msgstr "上一次保存成功"
+
+#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:188
+msgid "Last Bad Store"
+msgstr "上一次保存失败"
+
+#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:189
+msgid "1h Fail Rate"
+msgstr "1h失败率"
+
+#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:190
+msgid "1d Fail Rate"
+msgstr "1d失败率"
+
 #: src/net/i2p/router/web/ProfileOrganizerRenderer.java:237
 msgid "Thresholds:"
 msgstr "临界值:"
@@ -2734,7 +3722,7 @@ msgstr "匿名网站"
 
 #: strings/Strings.java:37
 msgid "I2PSnark"
-msgstr "I2P Snark(匿名BT客户端)"
+msgstr "I2P Snark"
 
 #: strings/Strings.java:40
 msgid "classic"
@@ -2748,6 +3736,12 @@ msgstr "暗色调"
 msgid "light"
 msgstr "亮色调"
 
+#~ msgid "view without"
+#~ msgstr "查看不含"
+#~ msgid "view with"
+#~ msgstr "查看含"
+#~ msgid "stats"
+#~ msgstr "统计"
 #~ msgid "View"
 #~ msgstr "查看"
 #~ msgid "Not Failing"
diff --git a/build.xml b/build.xml
index d065d065520ff78651a90d5644be0bf02096d30f..bf7fe56763ca069d2e0fb95f3b36d53a7b11ec9e 100644
--- a/build.xml
+++ b/build.xml
@@ -410,6 +410,8 @@
         <copy file="build/i2ptunnel.war" todir="pkg-temp/webapps/" />
         <copy file="build/routerconsole.war" todir="pkg-temp/webapps/" />
         <copy file="build/addressbook.war" todir="pkg-temp/webapps/" />
+        <!-- decapitalized the file in 0.7.8 -->
+        <copy file="installer/resources/countries.txt" todir="pkg-temp/geoip/" />
     </target>
     <target name="prepupdateRouter" depends="buildrouter, deletepkg-temp">
         <copy file="build/i2p.jar" todir="pkg-temp/lib/" />
diff --git a/checklist.txt b/checklist.txt
index dd97e29dff2fcbcd37e1d7857442061dcdcd0897..011c539df54ec2184068176b28ae02eebc057a49 100644
--- a/checklist.txt
+++ b/checklist.txt
@@ -8,9 +8,9 @@ Deploy the Jetty archive, a clean checkout lacks it
 
 Change revision in:
 	history.txt
-	initialNews.xml
+	installer/resources/initialNews.xml
 	installer/install.xml
-	news.xml
+	installer/resources/news.xml
 	router/java/src/net/i2p/router/RouterVersion.java
 		(change to BUILD = 0 and EXTRA = "")
 	core/java/src/net/i2p/CoreVersion.java
@@ -23,6 +23,8 @@ Verify that no untrusted revisions were inadvertently
 blessed by a trusted party:
         mtn log --brief --no-graph --to t:i2p-0.7.(xx-1) | cut -d ' ' -f 2- | sort
 
+NOTE: Most tasks below here are now automated by 'ant release'
+
 Build and tag:
 	ant pkg
 	mtn ci
@@ -60,16 +62,18 @@ Generate PGP signatures:
 	gpg -b i2pupdate-0.7.xx.zip
 	gpg -b i2pupdate.sud
 
+(end of tasks automated by 'ant release')
+
 Distribute files to download locations and to www.i2p2.i2p
 
 Website files to change:
 	Sync with mtn.i2p2.i2p
 	announcements.html
-	announcements_de.html
-	download.html (change SHA256s)
-	download_de.html (change SHA256s)
+	announcements_*.html
+	download.html (change version numbers and SHA256s)
+	download_*.html (change version numbers and SHA256s)
 	index.html
-	index_de.html
+	index_*.html
 	hosts.txt (copy from mtn)
         release-x.y.z.html (new)
 	Sync with mtn.i2p2.i2p
diff --git a/history.txt b/history.txt
index 864f4e5e5c09f0c7440828d8a8447c8324dca20e..b76f3f063e91f41181e46363428368bda8d65760 100644
--- a/history.txt
+++ b/history.txt
@@ -1,3 +1,16 @@
+2009-11-08 zzz
+    * Console:
+      - countries.txt: Convert to mixed case, include in update
+      - netdb.jsp: Hide all routers by default, sort and tag country names
+      - oldstats.jsp: Move to stats.jsp
+      - profiles.jsp: Show new DBH times instead of counts
+    * Profiles:
+      - Track last good and bad lookup times
+        and last good and bad store times,
+        to prep for floodfill changes
+      - Don't reset last-heard-about at router startup
+    * Checklist and Android readme fixups
+
 2009-11-04 zzz
     * Build:
       - Move some files to installer/resources
diff --git a/installer/resources/countries.txt b/installer/resources/countries.txt
index c1ea54d83747f8174f63a80efeed7072c9feb101..c2d0e841c4b40a00c6ef033b547f244425a8de2c 100644
--- a/installer/resources/countries.txt
+++ b/installer/resources/countries.txt
@@ -1,237 +1,237 @@
-AD,ANDORRA
-AE,UNITED ARAB EMIRATES
-AF,AFGHANISTAN
-AG,ANTIGUA AND BARBUDA
-AI,ANGUILLA
-AL,ALBANIA
-AM,ARMENIA
-AN,NETHERLANDS ANTILLES
-AO,ANGOLA
-AQ,ANTARCTICA
-AR,ARGENTINA
-AS,AMERICAN SAMOA
-AT,AUSTRIA
-AU,AUSTRALIA
-AW,ARUBA
+AD,Andorra
+AE,United Arab Emirates
+AF,Afghanistan
+AG,Antigua and Barbuda
+AI,Anguilla
+AL,Albania
+AM,Armenia
+AN,Netherlands Antilles
+AO,Angola
+AQ,Antarctica
+AR,Argentina
+AS,American Samoa
+AT,Austria
+AU,Australia
+AW,Aruba
 AX,
-AZ,AZERBAIJAN
-BA,BOSNIA AND HERZEGOVINA
-BB,BARBADOS
-BD,BANGLADESH
-BE,BELGIUM
-BF,BURKINA FASO
-BG,BULGARIA
-BH,BAHRAIN
-BI,BURUNDI
-BJ,BENIN
-BM,BERMUDA
-BN,BRUNEI DARUSSALAM
-BO,BOLIVIA
-BR,BRAZIL
-BS,BAHAMAS
-BT,BHUTAN
-BV,BOUVET ISLAND
-BW,BOTSWANA
-BY,BELARUS
-BZ,BELIZE
-CA,CANADA
-CD,THE DEMOCRATIC REPUBLIC OF THE CONGO
-CF,CENTRAL AFRICAN REPUBLIC
-CG,CONGO
-CH,SWITZERLAND
-CI,COTE D'IVOIRE
-CK,COOK ISLANDS
-CL,CHILE
-CM,CAMEROON
-CN,CHINA
-CO,COLOMBIA
-CR,COSTA RICA
-CS,SERBIA AND MONTENEGRO
-CU,CUBA
-CV,CAPE VERDE
-CY,CYPRUS
-CZ,CZECH REPUBLIC
-DE,GERMANY
-DJ,DJIBOUTI
-DK,DENMARK
-DM,DOMINICA
-DO,DOMINICAN REPUBLIC
-DZ,ALGERIA
-EC,ECUADOR
-EE,ESTONIA
-EG,EGYPT
-ER,ERITREA
-ES,SPAIN
-ET,ETHIOPIA
-FI,FINLAND
-FJ,FIJI
-FK,FALKLAND ISLANDS (MALVINAS)
-FM,FEDERATED STATES OF MICRONESIA
-FO,FAROE ISLANDS
-FR,FRANCE
-GA,GABON
-GB,UNITED KINGDOM
-GD,GRENADA
-GE,GEORGIA
-GF,FRENCH GUIANA
-GH,GHANA
-GI,GIBRALTAR
-GL,GREENLAND
-GM,GAMBIA
-GN,GUINEA
-GP,GUADELOUPE
-GQ,EQUATORIAL GUINEA
-GR,GREECE
-GS,SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS
-GT,GUATEMALA
-GU,GUAM
-GW,GUINEA-BISSAU
-GY,GUYANA
-HK,HONG KONG
-HN,HONDURAS
-HR,CROATIA
-HT,HAITI
-HU,HUNGARY
-ID,INDONESIA
-IE,IRELAND
-IL,ISRAEL
+AZ,Azerbaijan
+BA,Bosnia and Herzegovina
+BB,Barbados
+BD,Bangladesh
+BE,Belgium
+BF,Burkina Faso
+BG,Bulgaria
+BH,Bahrain
+BI,Burundi
+BJ,Benin
+BM,Bermuda
+BN,Brunei Darussalam
+BO,Bolivia
+BR,Brazil
+BS,Bahamas
+BT,Bhutan
+BV,Bouvet Island
+BW,Botswana
+BY,Belarus
+BZ,Belize
+CA,Canada
+CD,The Democratic Republic of the Congo
+CF,Central African Republic
+CG,Congo
+CH,Switzerland
+CI,Cote D'Ivoire
+CK,Cook Islands
+CL,Chile
+CM,Cameroon
+CN,China
+CO,Colombia
+CR,Costa Rica
+CS,Serbia and Montenegro
+CU,Cuba
+CV,Cape Verde
+CY,Cyprus
+CZ,Czech Republic
+DE,Germany
+DJ,Djibouti
+DK,Denmark
+DM,Dominica
+DO,Dominican Republic
+DZ,Algeria
+EC,Ecuador
+EE,Estonia
+EG,Egypt
+ER,Eritrea
+ES,Spain
+ET,Ethiopia
+FI,Finland
+FJ,Fiji
+FK,Falkland Islands (Malvinas)
+FM,Federated States of Micronesia
+FO,Faroe Islands
+FR,France
+GA,Gabon
+GB,United Kingdom
+GD,Grenada
+GE,Georgia
+GF,French Guiana
+GH,Ghana
+GI,Gibraltar
+GL,Greenland
+GM,Gambia
+GN,Guinea
+GP,Guadeloupe
+GQ,Equatorial Guinea
+GR,Greece
+GS,South Georgia and the South Sandwich Islands
+GT,Guatemala
+GU,Guam
+GW,Guinea-Bissau
+GY,Guyana
+HK,Hong Kong
+HN,Honduras
+HR,Croatia
+HT,Haiti
+HU,Hungary
+ID,Indonesia
+IE,Ireland
+IL,Israel
 IM,
-IN,INDIA
-IO,BRITISH INDIAN OCEAN TERRITORY
-IQ,IRAQ
-IR,ISLAMIC REPUBLIC OF IRAN
-IS,ICELAND
-IT,ITALY
+IN,India
+IO,British Indian Ocean Territory
+IQ,Iraq
+IR,Islamic Republic of Iran
+IS,Iceland
+IT,Italy
 JE,
-JM,JAMAICA
-JO,JORDAN
-JP,JAPAN
-KE,KENYA
-KG,KYRGYZSTAN
-KH,CAMBODIA
-KI,KIRIBATI
-KM,COMOROS
-KN,SAINT KITTS AND NEVIS
-KR,REPUBLIC OF KOREA
-KW,KUWAIT
-KY,CAYMAN ISLANDS
-KZ,KAZAKHSTAN
-LA,LAO PEOPLE'S DEMOCRATIC REPUBLIC
-LB,LEBANON
-LC,SAINT LUCIA
-LI,LIECHTENSTEIN
-LK,SRI LANKA
-LR,LIBERIA
-LS,LESOTHO
-LT,LITHUANIA
-LU,LUXEMBOURG
-LV,LATVIA
-LY,LIBYAN ARAB JAMAHIRIYA
-MA,MOROCCO
-MC,MONACO
-MD,REPUBLIC OF MOLDOVA
+JM,Jamaica
+JO,Jordan
+JP,Japan
+KE,Kenya
+KG,Kyrgyzstan
+KH,Cambodia
+KI,Kiribati
+KM,Comoros
+KN,Saint Kitts and Nevis
+KR,Republic of Korea
+KW,Kuwait
+KY,Cayman Islands
+KZ,Kazakhstan
+LA,Lao People'S Democratic Republic
+LB,Lebanon
+LC,Saint Lucia
+LI,Liechtenstein
+LK,Sri Lanka
+LR,Liberia
+LS,Lesotho
+LT,Lithuania
+LU,Luxembourg
+LV,Latvia
+LY,Libyan Arab Jamahiriya
+MA,Morocco
+MC,Monaco
+MD,Republic of Moldova
 ME,
 MF,
-MG,MADAGASCAR
-MH,MARSHALL ISLANDS
-MK,THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA
-ML,MALI
-MM,MYANMAR
-MN,MONGOLIA
-MO,MACAO
-MP,NORTHERN MARIANA ISLANDS
-MQ,MARTINIQUE
-MR,MAURITANIA
-MS,MONTSERRAT
-MT,MALTA
-MU,MAURITIUS
-MV,MALDIVES
-MW,MALAWI
-MX,MEXICO
-MY,MALAYSIA
-MZ,MOZAMBIQUE
-NA,NAMIBIA
-NC,NEW CALEDONIA
-NE,NIGER
-NF,NORFOLK ISLAND
-NG,NIGERIA
-NI,NICARAGUA
-NL,NETHERLANDS
-NO,NORWAY
-NP,NEPAL
-NR,NAURU
-NU,NIUE
-NZ,NEW ZEALAND
-OM,OMAN
-PA,PANAMA
-PE,PERU
-PF,FRENCH POLYNESIA
-PG,PAPUA NEW GUINEA
-PH,PHILIPPINES
-PK,PAKISTAN
-PL,POLAND
-PM,SAINT PIERRE AND MIQUELON
-PR,PUERTO RICO
-PS,PALESTINIAN TERRITORY
-PT,PORTUGAL
-PW,PALAU
-PY,PARAGUAY
-QA,QATAR
-RE,REUNION
-RO,ROMANIA
-RS,SERBIA
-RU,RUSSIAN FEDERATION
-RW,RWANDA
-SA,SAUDI ARABIA
-SB,SOLOMON ISLANDS
-SC,SEYCHELLES
-SD,SUDAN
-SE,SWEDEN
-SG,SINGAPORE
-SI,SLOVENIA
-SK,SLOVAKIA
-SL,SIERRA LEONE
-SM,SAN MARINO
-SN,SENEGAL
-SO,SOMALIA
-SR,SURINAME
-ST,SAO TOME AND PRINCIPE
-SV,EL SALVADOR
-SY,SYRIAN ARAB REPUBLIC
-SZ,SWAZILAND
-TC,TURKS AND CAICOS ISLANDS
-TD,CHAD
-TF,FRENCH SOUTHERN TERRITORIES
-TG,TOGO
-TH,THAILAND
-TJ,TAJIKISTAN
-TK,TOKELAU
-TL,TIMOR-LESTE
-TM,TURKMENISTAN
-TN,TUNISIA
-TO,TONGA
-TR,TURKEY
-TT,TRINIDAD AND TOBAGO
-TV,TUVALU
-TW,TAIWAN
-TZ,UNITED REPUBLIC OF TANZANIA
-UA,UKRAINE
-UG,UGANDA
-UM,UNITED STATES MINOR OUTLYING ISLANDS
-US,UNITED STATES
-UY,URUGUAY
-UZ,UZBEKISTAN
-VA,HOLY SEE (VATICAN CITY STATE)
-VC,SAINT VINCENT AND THE GRENADINES
-VE,VENEZUELA
-VG,VIRGIN ISLANDS
-VI,VIRGIN ISLANDS
-VN,VIET NAM
-VU,VANUATU
-WF,WALLIS AND FUTUNA
-WS,SAMOA
-YE,YEMEN
-YT,MAYOTTE
-ZA,SOUTH AFRICA
-ZM,ZAMBIA
-ZW,ZIMBABWE
+MG,Madagascar
+MH,Marshall Islands
+MK,The Former Yugoslav Republic of Macedonia
+ML,Mali
+MM,Myanmar
+MN,Mongolia
+MO,Macao
+MP,Northern Mariana Islands
+MQ,Martinique
+MR,Mauritania
+MS,Montserrat
+MT,Malta
+MU,Mauritius
+MV,Maldives
+MW,Malawi
+MX,Mexico
+MY,Malaysia
+MZ,Mozambique
+NA,Namibia
+NC,New Caledonia
+NE,Niger
+NF,Norfolk Island
+NG,Nigeria
+NI,Nicaragua
+NL,Netherlands
+NO,Norway
+NP,Nepal
+NR,Nauru
+NU,Niue
+NZ,New Zealand
+OM,Oman
+PA,Panama
+PE,Peru
+PF,French Polynesia
+PG,Papua New Guinea
+PH,Philippines
+PK,Pakistan
+PL,Poland
+PM,Saint Pierre and Miquelon
+PR,Puerto Rico
+PS,Palestinian Territory
+PT,Portugal
+PW,Palau
+PY,Paraguay
+QA,Qatar
+RE,Reunion
+RO,Romania
+RS,Serbia
+RU,Russian Federation
+RW,Rwanda
+SA,Saudi Arabia
+SB,Solomon Islands
+SC,Seychelles
+SD,Sudan
+SE,Sweden
+SG,Singapore
+SI,Slovenia
+SK,Slovakia
+SL,Sierra Leone
+SM,San Marino
+SN,Senegal
+SO,Somalia
+SR,Suriname
+ST,Sao Tome and Principe
+SV,El Salvador
+SY,Syrian Arab Republic
+SZ,Swaziland
+TC,Turks and Caicos Islands
+TD,Chad
+TF,French Southern Territories
+TG,Togo
+TH,Thailand
+TJ,Tajikistan
+TK,Tokelau
+TL,Timor-Leste
+TM,Turkmenistan
+TN,Tunisia
+TO,Tonga
+TR,Turkey
+TT,Trinidad and Tobago
+TV,Tuvalu
+TW,Taiwan
+TZ,United Republic of Tanzania
+UA,Ukraine
+UG,Uganda
+UM,United States Minor Outlying Islands
+US,United States
+UY,Uruguay
+UZ,Uzbekistan
+VA,Holy See (Vatican City State)
+VC,Saint Vincent and the Grenadines
+VE,Venezuela
+VG,Virgin Islands
+VI,Virgin Islands
+VN,Viet Nam
+VU,Vanuatu
+WF,Wallis and Futuna
+WS,Samoa
+YE,Yemen
+YT,Mayotte
+ZA,South Africa
+ZM,Zambia
+ZW,Zimbabwe
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index 3e5e8985dd5771e110f3b6c0871a03c61fb5e850..983dd2f06586d3fc8f617c2486d95f6e6c0b86ef 100644
--- a/router/java/src/net/i2p/router/RouterVersion.java
+++ b/router/java/src/net/i2p/router/RouterVersion.java
@@ -18,7 +18,7 @@ public class RouterVersion {
     /** deprecated */
     public final static String ID = "Monotone";
     public final static String VERSION = CoreVersion.VERSION;
-    public final static long BUILD = 12;
+    public final static long BUILD = 13;
     /** for example "-test" */
     public final static String EXTRA = "";
     public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA;
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java b/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java
index a09bc4860c69e1bad3816bef6725e768ee72d0bc..38efb714fbe0be63ed9c6ad1b7a4d72abdc257ef 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java
@@ -90,7 +90,9 @@ class TransientDataStore implements DataStore {
         DataStructure old = null;
         old = _data.put(key, data);
         if (data instanceof RouterInfo) {
-            _context.profileManager().heardAbout(key);
+            // Don't do this here so we don't reset it at router startup;
+            // the StoreMessageJob calls this
+            //_context.profileManager().heardAbout(key);
             RouterInfo ri = (RouterInfo)data;
             if (old != null) {
                 RouterInfo ori = (RouterInfo)old;
diff --git a/router/java/src/net/i2p/router/peermanager/DBHistory.java b/router/java/src/net/i2p/router/peermanager/DBHistory.java
index b941e6faaf55381fe307c4f5b9fb50268244b4da..38d06a8905964e7bca6fe0af14eded67c4edbbcc 100644
--- a/router/java/src/net/i2p/router/peermanager/DBHistory.java
+++ b/router/java/src/net/i2p/router/peermanager/DBHistory.java
@@ -26,6 +26,10 @@ public class DBHistory {
     private long _lookupsReceived;
     private long _avgDelayBetweenLookupsReceived;
     private long _lastLookupReceived;
+    private long _lastLookupSuccessful;
+    private long _lastLookupFailed;
+    private long _lastStoreSuccessful;
+    private long _lastStoreFailed;
     private long _unpromptedDbStoreNew;
     private long _unpromptedDbStoreOld;
     private String _statGroup;
@@ -50,24 +54,47 @@ public class DBHistory {
         createRates(statGroup);
     }
     
-    /** how many times we have sent them a db lookup and received the value back from them */
+    /** how many times we have sent them a db lookup and received the value back from them
+     *  @deprecated unused
+     */
     public long getSuccessfulLookups() { return _successfulLookups; }
-    /** how many times we have sent them a db lookup and not received the value or a lookup reply */
+    /** how many times we have sent them a db lookup and not received the value or a lookup reply
+     *  @deprecated unused
+     */
     public long getFailedLookups() { return _failedLookups; }
-    /** how many peers that we have never seen before did lookups provide us with? */
+    /** how many peers that we have never seen before did lookups provide us with?
+     *  @deprecated unused
+     */
     public long getLookupReplyNew() { return _lookupReplyNew; }
-    /** how many peers that we have already seen did lookups provide us with? */
+    /** how many peers that we have already seen did lookups provide us with?
+     *  @deprecated unused
+     */
     public long getLookupReplyOld() { return _lookupReplyOld; }
-    /** how many peers that we explicitly asked the peer not to send us did they reply with? */
+    /** how many peers that we explicitly asked the peer not to send us did they reply with?
+     *  @deprecated unused
+     */
     public long getLookupReplyDuplicate() { return _lookupReplyDuplicate; }
-    /** how many peers that were incorrectly formatted / expired / otherwise illegal did lookups provide us with? */
+    /** how many peers that were incorrectly formatted / expired / otherwise illegal did lookups provide us with?
+     *  @deprecated unused
+     */
     public long getLookupReplyInvalid() { return _lookupReplyInvalid; }
-    /** how many lookups this peer has sent us? */
+    /** how many lookups this peer has sent us?
+     *  @deprecated unused
+     */
     public long getLookupsReceived() { return _lookupsReceived; }
-    /** how frequently do they send us lookup requests? */
+    /** how frequently do they send us lookup requests?
+     *  @deprecated unused
+     */
     public long getAvgDelayBetweenLookupsReceived() { return _avgDelayBetweenLookupsReceived; }
-    /** when did they last send us a request? */
+    /** when did they last send us a request?
+     *  @deprecated unused
+     */
     public long getLastLookupReceived() { return _lastLookupReceived; }
+    public long getLastLookupSuccessful() { return _lastLookupSuccessful; }
+    public long getLastLookupFailed() { return _lastLookupFailed; }
+    public long getLastStoreSuccessful() { return _lastStoreSuccessful; }
+    public long getLastStoreFailed() { return _lastStoreFailed; }
+
     /** how many times have they sent us data we didn't ask for and that we've never seen? */
     public long getUnpromptedDbStoreNew() { return _unpromptedDbStoreNew; }
     /** how many times have they sent us data we didn't ask for but that we have seen? */
@@ -87,14 +114,37 @@ public class DBHistory {
      */
     public void lookupSuccessful() {
         _successfulLookups++;
+        _lastLookupSuccessful = _context.clock().now();
     }
+
     /**
      * Note that the peer failed to respond to the db lookup in any way
      */
     public void lookupFailed() {
         _failedLookups++;
         _failedLookupRate.addData(1, 0);
+        _lastLookupFailed = _context.clock().now();
     }
+
+    /**
+     * Note that we successfully stored to a floodfill peer and verified the result
+     * by asking another floodfill peer
+     *
+     */
+    public void storeSuccessful() {
+        _lastStoreSuccessful = _context.clock().now();
+    }
+
+    /**
+     * Note that floodfill verify failed
+     */
+    public void storeFailed() {
+        // Fixme, redefined this to include both lookup and store fails,
+        // need to fix the javadocs
+        _failedLookupRate.addData(1, 0);
+        _lastStoreFailed = _context.clock().now();
+    }
+
     /**
      * Receive a lookup reply from the peer, where they gave us the specified info
      *
@@ -186,7 +236,7 @@ public class DBHistory {
         _invalidReplyRate.store(out, "dbHistory.invalidReplyRate");
     }
     
-    private void add(StringBuilder buf, String name, long val, String description) {
+    private static void add(StringBuilder buf, String name, long val, String description) {
         buf.append("# ").append(name.toUpperCase()).append(NL).append("# ").append(description).append(NL);
         buf.append("dbHistory.").append(name).append('=').append(val).append(NL).append(NL);
     }
@@ -224,8 +274,8 @@ public class DBHistory {
             _failedLookupRate = new RateStat("dbHistory.failedLookupRate", "How often does this peer to respond to a lookup?", statGroup, new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l });
         if (_invalidReplyRate == null)
             _invalidReplyRate = new RateStat("dbHistory.invalidReplyRate", "How often does this peer give us a bad (nonexistant, forged, etc) peer?", statGroup, new long[] { 30*60*1000l, 60*60*1000l, 24*60*60*1000l });
-            _failedLookupRate.setStatLog(_context.statManager().getStatLog());
-            _invalidReplyRate.setStatLog(_context.statManager().getStatLog());
+        _failedLookupRate.setStatLog(_context.statManager().getStatLog());
+        _invalidReplyRate.setStatLog(_context.statManager().getStatLog());
     }
     
     private final static long getLong(Properties props, String key) {
diff --git a/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java b/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java
index 5da853c6190484f731228d185444b76897219d46..2b97e2df787a4868140bbb8d884d452d0b6a5b9e 100644
--- a/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java
+++ b/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java
@@ -249,15 +249,18 @@ public class ProfileManagerImpl implements ProfileManager {
      * Note that we've confirmed a successful send of db data to the peer (though we haven't
      * necessarily requested it again from them, so they /might/ be lying)
      *
+     * This will force creation of DB stats
      */
     public void dbStoreSent(Hash peer, long responseTimeMs) {
         PeerProfile data = getProfile(peer);
         if (data == null) return;
         long now = _context.clock().now();
         data.setLastHeardFrom(now);
-        if (!data.getIsExpandedDB())
-            return;
         data.setLastSendSuccessful(now);
+        if (!data.getIsExpandedDB())
+            data.expandDBProfile();
+        DBHistory hist = data.getDBHistory();
+        hist.storeSuccessful();
         // we could do things like update some sort of "how many successful stores we've sent them"...
         // naah.. dont really care now
     }
@@ -266,8 +269,15 @@ public class ProfileManagerImpl implements ProfileManager {
      * Note that we were unable to confirm a successful send of db data to
      * the peer, at least not within our timeout period
      *
+     * This will force creation of DB stats
      */
     public void dbStoreFailed(Hash peer) {
+        PeerProfile data = getProfile(peer);
+        if (data == null) return;
+        if (!data.getIsExpandedDB())
+            data.expandDBProfile();
+        DBHistory hist = data.getDBHistory();
+        hist.storeSuccessful();
         // we could do things like update some sort of "how many successful stores we've
         // failed to send them"...
     }
diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java
index 4f64af95554f03b9f279c4438742e90091c9ecc6..debe7cff26b2a0fc07abadd697f36b7872bdab0d 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java
@@ -329,6 +329,7 @@ class BuildHandler {
         }
     }
     
+    /** @return handle time or -1 */
     private long handleRequest(BuildMessageState state) {
         long timeSinceReceived = System.currentTimeMillis()-state.recvTime;
         if (_log.shouldLog(Log.DEBUG))