diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
index d249dc9687c77116cf3c4a8ea3220958b93e34b7..cb43e3dc8af3334dfcf9b4efb1b950b683c2d7b4 100644
--- a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
+++ b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
@@ -76,6 +76,7 @@ public class ProfileOrganizer {
      */
     public static final String PROP_MINIMUM_FAST_PEERS = "profileOrganizer.minFastPeers";
     public static final int DEFAULT_MINIMUM_FAST_PEERS = 8;
+    /** this is misnamed, it is really the max minimum number. */
     private static final int DEFAULT_MAXIMUM_FAST_PEERS = 16;
     /**
      * Defines the minimum number of 'high capacity' peers that the organizer should 
@@ -674,6 +675,7 @@ public class ProfileOrganizer {
 
             locked_unfailAsNecessary();
             locked_promoteFastAsNecessary();
+            locked_demoteFastAsNecessary();
 
             Collections.shuffle(_notFailingPeersList, _context.random());
 
@@ -747,6 +749,28 @@ public class ProfileOrganizer {
         return;
     }
     
+    /**
+     * We want to put a cap on the fast pool, to use only a small set of routers
+     * for client tunnels for anonymity reasons. Also, unless we use only a small
+     * number, we don't really find out who the fast ones are.
+     * @since 0.7.10
+     */
+    private void locked_demoteFastAsNecessary() {
+        int maxFastPeers = getMaximumFastPeers();
+        int numToDemote = _fastPeers.size() - maxFastPeers;
+        if (numToDemote > 0) {
+            if (_log.shouldLog(Log.INFO))
+                _log.info("Need to explicitly demote " + numToDemote + " peers from the fast group");
+            // sort by speed, slowest-first
+            Set<PeerProfile> sorted = new TreeSet(new SpeedComparator());
+            sorted.addAll(_fastPeers.values());
+            Iterator<PeerProfile> iter = sorted.iterator();
+            for (int i = 0; i < numToDemote; i++) {
+                _fastPeers.remove(iter.next().getPeer());
+            }
+        }
+    }
+    
     /** how many not failing/active peers must we have? */
     private final static int MIN_NOT_FAILING_ACTIVE = 3;
     /**
@@ -916,6 +940,7 @@ public class ProfileOrganizer {
             locked_calculateSpeedThresholdMean(reordered);
             return;
         }
+/*****
         Set speeds = new TreeSet();
         for (Iterator iter = reordered.iterator(); iter.hasNext(); ) {
             PeerProfile profile = (PeerProfile)iter.next();
@@ -939,6 +964,7 @@ public class ProfileOrganizer {
         }
         if (_log.shouldLog(Log.INFO))
             _log.info("Threshold value for speed: " + _thresholdSpeedValue + " out of speeds: " + speeds);
+*****/
     }
     
     private void locked_calculateSpeedThresholdMean(Set reordered) {
@@ -1196,6 +1222,10 @@ public class ProfileOrganizer {
         return _context.getProperty(PROP_MINIMUM_FAST_PEERS, def);
     }
     
+    /** fixme add config  @since 0.7.10 */
+    protected int getMaximumFastPeers() {
+        return 30;
+    }
     
     /**
      * Defines the minimum number of 'fast' peers that the organizer should select.  If
diff --git a/router/java/src/net/i2p/router/peermanager/SpeedComparator.java b/router/java/src/net/i2p/router/peermanager/SpeedComparator.java
new file mode 100644
index 0000000000000000000000000000000000000000..793501e235cca1c72efbcea9933d4d078b8ef00a
--- /dev/null
+++ b/router/java/src/net/i2p/router/peermanager/SpeedComparator.java
@@ -0,0 +1,22 @@
+package net.i2p.router.peermanager;
+
+import java.util.Comparator;
+
+/**
+ * Order profiles by their speed (lowest first).
+ * @since 0.7.10
+ */
+class SpeedComparator implements Comparator<PeerProfile> {
+
+    public int compare(PeerProfile left, PeerProfile right) {
+
+        double lval = left.getSpeedValue();
+        double rval = right.getSpeedValue();
+
+        if (lval > rval)
+            return 1;
+        if (lval < rval)
+            return -1;
+        return 0;
+    }
+}