diff --git a/core/java/src/net/i2p/stat/Frequency.java b/core/java/src/net/i2p/stat/Frequency.java
index 50536fa4fd14089171ced8d5451b659cb1e9542a..721578ce6e1fc3944780f7ef0440dc064c86c767 100644
--- a/core/java/src/net/i2p/stat/Frequency.java
+++ b/core/java/src/net/i2p/stat/Frequency.java
@@ -150,4 +150,16 @@ public class Frequency {
     private final static long now() {
         return System.currentTimeMillis();
     }
+    
+    /**
+     * Appends the data of this frequency to the specified StringBuilder
+     * @param dest to append data to
+     * @since 0.9.23
+     */
+    synchronized void store(StringBuilder dest) {
+        dest.append("avgInterval:").append(_avgInterval).append(',');
+        dest.append("minAverageInterval").append(_minAverageInterval).append(',');
+        dest.append("lastEvent").append(_lastEvent).append(",");
+        dest.append("count").append(_count);
+    }
 }
diff --git a/core/java/src/net/i2p/stat/FrequencyStat.java b/core/java/src/net/i2p/stat/FrequencyStat.java
index d18a469dbd3c921a640cf7e06d3141db968747be..c2c49d6fbe0999c6e5480d5614b5d842f1ef8fcc 100644
--- a/core/java/src/net/i2p/stat/FrequencyStat.java
+++ b/core/java/src/net/i2p/stat/FrequencyStat.java
@@ -1,5 +1,10 @@
 package net.i2p.stat;
 
+import java.io.IOException;
+import java.io.OutputStream;
+
+import net.i2p.data.DataHelper;
+
 /** coordinate an event frequency over various periods */
 public class FrequencyStat {
     /** unique name of the statistic */
@@ -92,5 +97,34 @@ public class FrequencyStat {
         if ((obj == null) || !(obj instanceof FrequencyStat)) return false;
         return _statName.equals(((FrequencyStat)obj)._statName);
     }
+    
+    private final static String NL = System.getProperty("line.separator");
+    
+    /**
+     * Serializes this FrequencyStat to the provided OutputStream
+     * @param out to write to
+     * @param prefix to prepend to the stat
+     * @throws IOException if something goes wrong
+     * @since 0.9.23
+     */
+    public void store(OutputStream out, String prefix) throws IOException {
+        StringBuilder buf = new StringBuilder(1024);
+        buf.append(NL);
+        buf.append("################################################################################").append(NL);
+        buf.append("# Frequency: ").append(_groupName).append(": ").append(_statName).append(NL);
+        buf.append("# ").append(_description).append(NL);
+        buf.append("# ").append(NL).append(NL);
+        out.write(buf.toString().getBytes("UTF-8"));
+        buf.setLength(0);
+        for (Frequency r: _frequencies){
+            buf.append("#######").append(NL);
+            buf.append("# Period : ").append(DataHelper.formatDuration(r.getPeriod())).append(" for rate ")
+                .append(_groupName).append(" - ").append(_statName).append(NL);
+            buf.append(NL);
+            r.store(buf);
+            out.write(buf.toString().getBytes("UTF-8"));
+            buf.setLength(0);
+        }
+    }
 
 }
diff --git a/core/java/src/net/i2p/stat/StatManager.java b/core/java/src/net/i2p/stat/StatManager.java
index f0f59a1b911675f4a1e78a4acfd8d10f7b3c9ce9..7f6d9859b6aef0ff5a8825c87ebdcff93574e883 100644
--- a/core/java/src/net/i2p/stat/StatManager.java
+++ b/core/java/src/net/i2p/stat/StatManager.java
@@ -1,5 +1,7 @@
 package net.i2p.stat;
 
+import java.io.IOException;
+import java.io.OutputStream;
 import java.text.Collator;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -247,4 +249,18 @@ public class StatManager {
     public boolean ignoreStat(String statName) {
         return _context.isRouterContext() && !_context.getBooleanProperty(PROP_STAT_FULL);
     }
+    
+    /**
+     * Serializes all Frequencies and Rates to the provided OutputStream
+     * @param out to write to
+     * @param prefix to use when serializing
+     * @throws IOException if something goes wrong
+     * @since 0.9.23
+     */
+    public void store(OutputStream out, String prefix) throws IOException {
+        for (FrequencyStat fs : _frequencyStats.values())
+            fs.store(out, prefix);
+        for (RateStat rs : _rateStats.values())
+            rs.store(out,prefix);
+    }
 }