diff --git a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
index d20c978467c3c04d9f971a27fdcb02bd7e6ea661..c94178004c848379a2e0c0fa4a4e699600ebd171 100644
--- a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
+++ b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
@@ -285,9 +285,10 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
         _log.warn("Halting NTCP to change address");
         t.stopListening();
         newAddr.setOptions(newProps);
-        // Give NTCP Pumper time to stop so we don't end up with two...
-        // Need better way
-        try { Thread.sleep(5*1000); } catch (InterruptedException ie) {}
+        // Wait for NTCP Pumper to stop so we don't end up with two...
+        while (t.isAlive()) {
+            try { Thread.sleep(5*1000); } catch (InterruptedException ie) {}
+        }
         t.restartListening(newAddr);
         _log.warn("Changed NTCP Address and started up, address is now " + newAddr);
         return;     	
diff --git a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java
index d27a95172f4eff631fab2c3fa87bb3d911d334a8..9c75f53283e8c483e6ea74d5557c91ca548224f0 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java
@@ -85,6 +85,13 @@ public class EventPumper implements Runnable {
             _selector.wakeup();
     }
     
+    /**
+     *  Selector can take quite a while to close after calling stopPumping()
+     */
+    public boolean isAlive() {
+        return _alive || (_selector != null && _selector.isOpen());
+    }
+
     public void register(ServerSocketChannel chan) {
         if (_log.shouldLog(Log.DEBUG)) _log.debug("Registering server socket channel");
         synchronized (_wantsRegister) { _wantsRegister.add(chan); }
diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java
index 67b9296a9540f114f84769adb0ab56044ac6a310..4b5573917eb7f0c6afba5d4ecf22f015216476cd 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java
@@ -432,6 +432,10 @@ public class NTCPTransport extends TransportImpl {
         return bindAddress();
     }
 
+    public boolean isAlive() {
+        return _pumper.isAlive();
+    }
+
     private RouterAddress bindAddress() {
         if (_myAddress != null) {
             try {
@@ -538,6 +542,10 @@ public class NTCPTransport extends TransportImpl {
         }
     }
     
+    /**
+     *  This doesn't (completely) block, caller should check isAlive()
+     *  before calling startListening() or restartListening()
+     */
     public void stopListening() {
         if (_log.shouldLog(Log.DEBUG)) _log.debug("Stopping ntcp transport");
         _pumper.stopPumping();