diff --git a/router/java/src/net/i2p/router/transport/ntcp/Reader.java b/router/java/src/net/i2p/router/transport/ntcp/Reader.java
index 963f6b8f6384fce6e2e896441d88061f4488ff1c..68480538aaacedfed4676edccbef0600d0cc4e8e 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/Reader.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/Reader.java
@@ -3,6 +3,8 @@ package net.i2p.router.transport.ntcp;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -20,7 +22,7 @@ class Reader {
     private final RouterContext _context;
     private final Log _log;
     // TODO change to LBQ ??
-    private final List<NTCPConnection> _pendingConnections;
+    private final Set<NTCPConnection> _pendingConnections;
     private final Set<NTCPConnection> _liveReads;
     private final Set<NTCPConnection> _readAfterLive;
     private final List<Runner> _runners;
@@ -28,7 +30,7 @@ class Reader {
     public Reader(RouterContext ctx) {
         _context = ctx;
         _log = ctx.logManager().getLog(getClass());
-        _pendingConnections = new ArrayList(16);
+        _pendingConnections = new LinkedHashSet(16);
         _runners = new ArrayList(8);
         _liveReads = new HashSet(8);
         _readAfterLive = new HashSet(8);
@@ -60,7 +62,7 @@ class Reader {
             if (_liveReads.contains(con)) {
                 _readAfterLive.add(con);
                 already = true;
-            } else if (!_pendingConnections.contains(con)) {
+            } else {
                 _pendingConnections.add(con);
             }
             _pendingConnections.notifyAll();
@@ -99,7 +101,9 @@ class Reader {
                             if (_pendingConnections.isEmpty()) {
                                 _pendingConnections.wait();
                             } else {
-                                con = _pendingConnections.remove(0);
+                                Iterator<NTCPConnection> iter = _pendingConnections.iterator();
+                                con = iter.next();
+                                iter.remove();
                                 _liveReads.add(con);
                             }
                         }
diff --git a/router/java/src/net/i2p/router/transport/ntcp/Writer.java b/router/java/src/net/i2p/router/transport/ntcp/Writer.java
index c414d80de87984332c28badff302f2e3722a50b3..521b41a0f8687e6338c0cab4919677b89e65b6b9 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/Writer.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/Writer.java
@@ -1,7 +1,11 @@
 package net.i2p.router.transport.ntcp;
 
 import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Set;
 
 import net.i2p.router.RouterContext;
 import net.i2p.util.I2PThread;
@@ -15,17 +19,17 @@ import net.i2p.util.Log;
  */
 class Writer {
     private final Log _log;
-    private final List<NTCPConnection> _pendingConnections;
-    private final List<NTCPConnection> _liveWrites;
-    private final List<NTCPConnection> _writeAfterLive;
+    private final Set<NTCPConnection> _pendingConnections;
+    private final Set<NTCPConnection> _liveWrites;
+    private final Set<NTCPConnection> _writeAfterLive;
     private final List<Runner> _runners;
     
     public Writer(RouterContext ctx) {
         _log = ctx.logManager().getLog(getClass());
-        _pendingConnections = new ArrayList(16);
+        _pendingConnections = new LinkedHashSet(16);
         _runners = new ArrayList(5);
-        _liveWrites = new ArrayList(5);
-        _writeAfterLive = new ArrayList(5);
+        _liveWrites = new HashSet(5);
+        _writeAfterLive = new HashSet(5);
     }
     
     public void startWriting(int numWriters) {
@@ -58,15 +62,15 @@ class Writer {
                     _writeAfterLive.add(con);
                 }
                 already = true;
-            } else if (!_pendingConnections.contains(con)) {
-                _pendingConnections.add(con);
-                pending = true;
+            } else {
+                pending = _pendingConnections.add(con);
             }
             _pendingConnections.notifyAll();
         }
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("wantsWrite: " + con + " already live? " + already + " added to pending? " + pending + ": " + source);
     }
+
     public void connectionClosed(NTCPConnection con) {
         synchronized (_pendingConnections) {
             _writeAfterLive.remove(con);
@@ -98,7 +102,9 @@ class Writer {
                                     _log.debug("Done writing, but nothing pending, so wait");
                                 _pendingConnections.wait();
                             } else {
-                                con = _pendingConnections.remove(0);
+                                Iterator<NTCPConnection> iter = _pendingConnections.iterator();
+                                con = iter.next();
+                                iter.remove();
                                 _liveWrites.add(con);
                                 if (_log.shouldLog(Log.DEBUG))
                                     _log.debug("Switch to writing on: " + con);