diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java
index 041387937def4805f64f966f4fb63b2ae3e4e1ad..90d772f68ce4c32c2bf9d34935f01a075f822a7b 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java
@@ -69,6 +69,7 @@ class PeerCheckerTask extends TimerTask
             if (!peer.isConnected())
               {
                 it.remove();
+                coordinator.removePeerFromPieces(peer);
                 continue;
               }
 
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
index 83c3329b6b796a6eb3feca590788a3562d211df3..51ea8ff028f187d4a4d063fefb8d56b363d3677e 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
@@ -153,6 +153,7 @@ public class PeerCoordinator implements PeerListener
             Peer peer = (Peer)it.next();
             peer.disconnect();
             it.remove();
+            removePeerFromPieces(peer);
           }
       }
   }
@@ -511,17 +512,23 @@ public class PeerCoordinator implements PeerListener
           {
             // Unchoke some random other peer
             unchokePeer();
-            synchronized(wantedPieces) {
-                // Don't count disconnected peers for the rarest-first calculations
-                for(Iterator iter = wantedPieces.iterator(); iter.hasNext(); ) {
-                    Piece piece = (Piece)iter.next();
-                    piece.removePeer(peer);
-                }
-            }
+            removePeerFromPieces(peer);
           }
       }
 
     if (listener != null)
       listener.peerChange(this, peer);
   }
+  
+  /** Called when a peer is removed, to prevent it from being used in 
+   * rarest-first calculations.
+   */
+  public void removePeerFromPieces(Peer peer) {
+      synchronized(wantedPieces) {
+          for(Iterator iter = wantedPieces.iterator(); iter.hasNext(); ) {
+              Piece piece = (Piece)iter.next();
+              piece.removePeer(peer);
+          }
+      } 
+  }
 }