diff --git a/core/java/src/net/i2p/stat/Rate.java b/core/java/src/net/i2p/stat/Rate.java
index 3eefe3d731b71b183c368c4114b6b78f727fc119..1bb8fcdc6e8f6f5ad7782a47521bef84160cc2c1 100644
--- a/core/java/src/net/i2p/stat/Rate.java
+++ b/core/java/src/net/i2p/stat/Rate.java
@@ -287,6 +287,15 @@ public class Rate {
         return 0.0D;
     }
 
+    /**
+     * @return the average or lifetime average depending on last event count
+     */
+    public synchronized double getAvgOrLifetimeAvg() {
+        if (getLastEventCount() > 0)
+            return getAverageValue();
+        return getLifetimeAverageValue();
+    }
+    
     /** 
      * During the last period, how much of the time was spent actually processing events in proportion 
      * to how many events could have occurred if there were no intervals?
@@ -407,12 +416,15 @@ public class Rate {
     
     /**
      * @param out where to store the computed averages.  
+     * @param useLifetime whether the lifetime average should be used if
+     * there are no events.
      */
-    public synchronized void computeAverages(RateAverages out) {
+    public synchronized void computeAverages(RateAverages out, boolean useLifetime) {
         
         final long total = _currentEventCount + _lastEventCount;
         if (total <= 0) {
-            out.setAverage(getAverageValue());
+            final double avg = useLifetime ? getAvgOrLifetimeAvg() : getAverageValue();
+            out.setAverage(avg);
             return;
         }
         
diff --git a/router/java/src/net/i2p/router/RouterThrottleImpl.java b/router/java/src/net/i2p/router/RouterThrottleImpl.java
index 527401f9c5d7c930d8b79348c898240c7afc0c87..7c9c37306b903128c162e4a61f7f9797f798843c 100644
--- a/router/java/src/net/i2p/router/RouterThrottleImpl.java
+++ b/router/java/src/net/i2p/router/RouterThrottleImpl.java
@@ -6,7 +6,6 @@ import net.i2p.stat.Rate;
 import net.i2p.stat.RateAverages;
 import net.i2p.stat.RateStat;
 import net.i2p.util.Log;
-import net.i2p.util.SimpleScheduler;
 import net.i2p.util.SimpleTimer;
 
 /**
@@ -146,7 +145,7 @@ class RouterThrottleImpl implements RouterThrottle {
 
         //Reject tunnels if the time to process messages and send them is too large. Too much time implies congestion.
         if(r != null) {
-            r.computeAverages(ra);
+            r.computeAverages(ra,false);
             
             int maxProcessingTime = _context.getProperty(PROP_MAX_PROCESSINGTIME, DEFAULT_MAX_PROCESSINGTIME);
 
@@ -176,11 +175,9 @@ class RouterThrottleImpl implements RouterThrottle {
             double tunnelGrowthFactor = getTunnelGrowthFactor();
             Rate avgTunnels = _context.statManager().getRate("tunnel.participatingTunnels").getRate(10*60*1000);
             if (avgTunnels != null) {
-                double avg = 0;
-                if (avgTunnels.getLastEventCount() > 0) 
-                    avg = avgTunnels.getAverageValue();
-                else
-                    avg = avgTunnels.getLifetimeAverageValue();
+                
+                double avg = avgTunnels.getAvgOrLifetimeAvg();
+                
                 int min = getMinThrottleTunnels();
                 if (avg < min)
                     avg = min;
@@ -217,11 +214,7 @@ class RouterThrottleImpl implements RouterThrottle {
         Rate tunnelTestTime10m = _context.statManager().getRate("tunnel.testSuccessTime").getRate(10*60*1000);
         if ( (tunnelTestTime1m != null) && (tunnelTestTime10m != null) && (tunnelTestTime1m.getLastEventCount() > 0) ) {
             double avg1m = tunnelTestTime1m.getAverageValue();
-            double avg10m = 0;
-            if (tunnelTestTime10m.getLastEventCount() > 0)
-                avg10m = tunnelTestTime10m.getAverageValue();
-            else
-                avg10m = tunnelTestTime10m.getLifetimeAverageValue();
+            double avg10m = tunnelTestTime10m.getAvgOrLifetimeAvg();
 
             if (avg10m < 5000)
                 avg10m = 5000; // minimum before complaining
@@ -268,11 +261,9 @@ class RouterThrottleImpl implements RouterThrottle {
         if (rs != null) {
             r = rs.getRate(60*1000);
             if (r != null) {
-                long count = r.getLastEventCount() + r.getCurrentEventCount();
-                if (count > 0)
-                    messagesPerTunnel = (r.getLastTotalValue() + r.getCurrentTotalValue()) / count;
-                else
-                    messagesPerTunnel = r.getLifetimeAverageValue();
+                ra.reset();
+                r.computeAverages(ra, true);
+                messagesPerTunnel = ra.getAverage();
             }
         }
         if (messagesPerTunnel < DEFAULT_MESSAGES_PER_TUNNEL_ESTIMATE)