diff --git a/router/java/src/net/i2p/router/transport/TransportImpl.java b/router/java/src/net/i2p/router/transport/TransportImpl.java
index c4992209f77ce5ff2970cc18400bc8f5ae7e1bc7..7f32f3f72b232e41b352d6fde35905f70a8cb79c 100644
--- a/router/java/src/net/i2p/router/transport/TransportImpl.java
+++ b/router/java/src/net/i2p/router/transport/TransportImpl.java
@@ -26,6 +26,7 @@ import java.util.Set;
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ConcurrentHashMap;
 
 import net.i2p.data.DataHelper;
 import net.i2p.data.Hash;
@@ -101,8 +102,8 @@ public abstract class TransportImpl implements Transport {
             _sendPool = new ArrayBlockingQueue<OutNetMessage>(8);
         else
             _sendPool = null;
-        _unreachableEntries = new HashMap<Hash, Long>(32);
-        _wasUnreachableEntries = new HashMap<Hash, Long>(32);
+        _unreachableEntries = new ConcurrentHashMap<Hash, Long>(32);
+        _wasUnreachableEntries = new ConcurrentHashMap<Hash, Long>(32);
         _localAddresses = new ConcurrentHashSet<InetAddress>(4);
         _context.simpleTimer2().addPeriodicEvent(new CleanupUnreachable(), 2 * UNREACHABLE_PERIOD, UNREACHABLE_PERIOD / 2);
     }
@@ -850,17 +851,16 @@ public abstract class TransportImpl implements Transport {
     public void mayDisconnect(Hash peer) {}
 
     public boolean isUnreachable(Hash peer) {
-        synchronized (_unreachableEntries) {
-            Long when = _unreachableEntries.get(peer);
-            if (when == null) return false;
+        boolean rv;
+        Long when = _unreachableEntries.get(peer);
+        if ((rv = when != null)) {
             long now = _context.clock().now();
-            if (when.longValue() + UNREACHABLE_PERIOD < now) {
+            rv = when.longValue() + UNREACHABLE_PERIOD >= now;
+            if (!rv) {
                 _unreachableEntries.remove(peer);
-                return false;
-            } else {
-                return true;
             }
         }
+        return rv;
     }
 
     /** called when we can't reach a peer */
@@ -870,10 +870,8 @@ public abstract class TransportImpl implements Transport {
             status == Status.HOSED)
             return;
         Long now = Long.valueOf(_context.clock().now());
-        synchronized (_unreachableEntries) {
-            // This isn't very useful since it is cleared when they contact us
-            _unreachableEntries.put(peer, now);
-        }
+        // This isn't very useful since it is cleared when they contact us
+        _unreachableEntries.put(peer, now);
         // This is not cleared when they contact us
         markWasUnreachable(peer, true);
     }
@@ -882,9 +880,7 @@ public abstract class TransportImpl implements Transport {
     public void markReachable(Hash peer, boolean isInbound) {
         // if *some* transport can reach them, then we shouldn't banlist 'em
         _context.banlist().unbanlistRouter(peer);
-        synchronized (_unreachableEntries) {
-            _unreachableEntries.remove(peer);
-        }
+        _unreachableEntries.remove(peer);
         if (!isInbound)
             markWasUnreachable(peer, false);
     }
@@ -892,19 +888,15 @@ public abstract class TransportImpl implements Transport {
     private class CleanupUnreachable implements SimpleTimer.TimedEvent {
         public void timeReached() {
             long now = _context.clock().now();
-            synchronized (_unreachableEntries) {
-                for (Iterator<Long> iter = _unreachableEntries.values().iterator(); iter.hasNext(); ) {
-                    Long when = iter.next();
-                    if (when.longValue() + UNREACHABLE_PERIOD < now)
-                        iter.remove();
-                }
+            for (Iterator<Long> iter = _unreachableEntries.values().iterator(); iter.hasNext(); ) {
+                Long when = iter.next();
+                if (when.longValue() + UNREACHABLE_PERIOD < now)
+                    iter.remove();
             }
-            synchronized (_wasUnreachableEntries) {
-                for (Iterator<Long> iter = _wasUnreachableEntries.values().iterator(); iter.hasNext(); ) {
-                    Long when = iter.next();
-                    if (when.longValue() + WAS_UNREACHABLE_PERIOD < now)
-                        iter.remove();
-                }
+            for (Iterator<Long> iter = _wasUnreachableEntries.values().iterator(); iter.hasNext(); ) {
+                Long when = iter.next();
+                if (when.longValue() + WAS_UNREACHABLE_PERIOD < now)
+                    iter.remove();
             }
         }
     }
@@ -914,16 +906,14 @@ public abstract class TransportImpl implements Transport {
      * This is NOT reset if the peer contacts us.
      */
     public boolean wasUnreachable(Hash peer) {
-        synchronized (_wasUnreachableEntries) {
-            Long when = _wasUnreachableEntries.get(peer);
-            if (when != null) {
-                long now = _context.clock().now();
-                if (when.longValue() + WAS_UNREACHABLE_PERIOD < now) {
-                    _unreachableEntries.remove(peer);
-                    return false;
-                } else {
-                    return true;
-                }
+        Long when = _wasUnreachableEntries.get(peer);
+        if (when != null) {
+            long now = _context.clock().now();
+            if (when.longValue() + WAS_UNREACHABLE_PERIOD < now) {
+                _unreachableEntries.remove(peer);
+                return false;
+            } else {
+                return true;
             }
         }
         RouterInfo ri = _context.netDb().lookupRouterInfoLocally(peer);
@@ -938,13 +928,9 @@ public abstract class TransportImpl implements Transport {
     private void markWasUnreachable(Hash peer, boolean yes) {
         if (yes) {
             Long now = Long.valueOf(_context.clock().now());
-            synchronized (_wasUnreachableEntries) {
-                _wasUnreachableEntries.put(peer, now);
-            }
+            _wasUnreachableEntries.put(peer, now);
         } else {
-            synchronized (_wasUnreachableEntries) {
-                _wasUnreachableEntries.remove(peer);
-            }
+            _wasUnreachableEntries.remove(peer);
         }
         if (_log.shouldDebug())
             _log.debug(this.getStyle() + " setting wasUnreachable to " + yes + " for " + peer,