diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
index e1785034cd9a9565c8621e3588f6e434970feca8..9dbe74836dd391cfd4830d54447254799ddcde36 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
@@ -511,6 +511,12 @@ public class PeerCoordinator implements PeerListener
           {
             // Unchoke some random other peer
             unchokePeer();
+            
+            // 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);                
+            }
           }
       }
 
diff --git a/apps/i2psnark/java/src/org/klomp/snark/Piece.java b/apps/i2psnark/java/src/org/klomp/snark/Piece.java
index 817bdce83f5a567ee74f3b37b92e7856b3d87122..c6189eb634d456d7632da6bf0c961e7e073d2565 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/Piece.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/Piece.java
@@ -31,6 +31,7 @@ public class Piece implements Comparable {
     public int getId() { return this.id; }
     public Set getPeers() { return this.peers; }
     public boolean addPeer(Peer peer) { return this.peers.add(peer.getPeerID()); }
+    public boolean removePeer(Peer peer) { return this.peers.remove(peer.getPeerID()); }
     public boolean isRequested() { return this.requested; }
     public void setRequested(boolean requested) { this.requested = requested; } 
 }