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 3cc9850335a317ddd7cf5eee8b9b71139bcfad28..b323f6b78abe76800e0eb5f9f302b90c48ed9295 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java
@@ -3,10 +3,14 @@ package net.i2p.router.web;
 import java.io.IOException;
 import java.io.Writer;
 import java.text.DecimalFormat;
+import java.text.Collator;
 import java.util.Arrays;
+import java.util.Comparator;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeMap;
 
 import net.i2p.data.DataHelper;
 import net.i2p.router.RouterContext;
@@ -14,18 +18,15 @@ import net.i2p.stat.Frequency;
 import net.i2p.stat.FrequencyStat;
 import net.i2p.stat.Rate;
 import net.i2p.stat.RateStat;
-import net.i2p.util.Log;
 
 /**
  * Dump the stats to the web admin interface
  */
 public class StatsGenerator {
-    private Log _log;
     private RouterContext _context;
 
     public StatsGenerator(RouterContext context) {
         _context = context;
-        _log = context.logManager().getLog(StatsGenerator.class);
     }
     
     public void generateStatsPage(Writer out, boolean showAll) throws IOException {
@@ -35,10 +36,10 @@ public class StatsGenerator {
         out.write(buf.toString());
         buf.setLength(0);
         
-        Map groups = _context.statManager().getStatsByGroup();
-        for (Iterator iter = groups.entrySet().iterator(); iter.hasNext(); ) {
-            Map.Entry entry = (Map.Entry)iter.next();
-            String group = (String)entry.getKey();
+        Map<String, SortedSet<String>> unsorted = _context.statManager().getStatsByGroup();
+        Map<String, Set<String>> groups = new TreeMap(new AlphaComparator());
+        groups.putAll(unsorted);
+        for (String group : groups.keySet()) {
             buf.append("<option value=\"#").append(group).append("\">");
             buf.append(_(group)).append("</option>\n");
             // let's just do the groups
@@ -66,9 +67,9 @@ public class StatsGenerator {
         out.write(buf.toString());
         buf.setLength(0);
         
-        for (Iterator iter = groups.keySet().iterator(); iter.hasNext(); ) {
-            String group = (String)iter.next();
-            Set stats = (Set)groups.get(group);
+        for (Map.Entry<String, Set<String>> entry : groups.entrySet()) {
+            String group = entry.getKey();
+            Set<String> stats = entry.getValue();
             buf.append("<h3><a name=\"");
             buf.append(group);
             buf.append("\">");
@@ -77,8 +78,7 @@ public class StatsGenerator {
             buf.append("<ul>");
             out.write(buf.toString());
             buf.setLength(0);
-            for (Iterator statIter = stats.iterator(); statIter.hasNext(); ) {
-                String stat = (String)statIter.next();
+            for (String stat : stats) {
                 buf.append("<li><b><a name=\"");
                 buf.append(stat);
                 buf.append("\">");
@@ -250,6 +250,18 @@ public class StatsGenerator {
     private final static DecimalFormat _pct = new DecimalFormat("#0.00%");
     private final static String pct(double num) { synchronized (_pct) { return _pct.format(num); } }
 
+    /**
+     *  Translated sort
+     *  @since 0.9.3
+     */
+    private class AlphaComparator implements Comparator<String> {
+        public int compare(String lhs, String rhs) {
+            String lname = _(lhs);
+            String rname = _(rhs);
+            return Collator.getInstance().compare(lname, rname);
+        }
+    }
+
     /** translate a string */
     private String _(String s) {
         return Messages.getString(s, _context);
diff --git a/core/java/src/net/i2p/stat/StatManager.java b/core/java/src/net/i2p/stat/StatManager.java
index ec83bd0e66de76366687e83a4d0ead20fc9a2ec2..b63879c7aed8c1b535879eb073fb6d8278e3f60f 100644
--- a/core/java/src/net/i2p/stat/StatManager.java
+++ b/core/java/src/net/i2p/stat/StatManager.java
@@ -1,12 +1,11 @@
 package net.i2p.stat;
 
-import java.text.Collator;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 import java.util.SortedSet;
-import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -212,19 +211,28 @@ public class StatManager {
         return _frequencyStats.containsKey(statName);
     }
 
-    /** Group name (String) to a Set of stat names, ordered alphabetically */
+    /**
+     * Group name (untranslated String) to a SortedSet of untranslated stat names.
+     * Map is unsorted.
+     */
     public Map<String, SortedSet<String>> getStatsByGroup() {
-        Map<String, SortedSet<String>> groups = new TreeMap(Collator.getInstance());
-        for (Iterator<FrequencyStat> iter = _frequencyStats.values().iterator(); iter.hasNext();) {
-            FrequencyStat stat = iter.next();
-            if (!groups.containsKey(stat.getGroupName())) groups.put(stat.getGroupName(), new TreeSet());
-            Set<String> names = groups.get(stat.getGroupName());
+        Map<String, SortedSet<String>> groups = new HashMap(32);
+        for (FrequencyStat stat : _frequencyStats.values()) {
+            String gname = stat.getGroupName();
+            SortedSet<String> names = groups.get(gname);
+            if (names == null) {
+                names = new TreeSet();
+                groups.put(gname, names);
+            }
             names.add(stat.getName());
         }
-        for (Iterator<RateStat> iter = _rateStats.values().iterator(); iter.hasNext();) {
-            RateStat stat = iter.next();
-            if (!groups.containsKey(stat.getGroupName())) groups.put(stat.getGroupName(), new TreeSet());
-            Set<String> names = groups.get(stat.getGroupName());
+        for (RateStat stat : _rateStats.values()) {
+            String gname = stat.getGroupName();
+            SortedSet<String> names = groups.get(gname);
+            if (names == null) {
+                names = new TreeSet();
+                groups.put(gname, names);
+            }
             names.add(stat.getName());
         }
         return groups;