diff --git a/router/java/src/net/i2p/router/transport/TransportImpl.java b/router/java/src/net/i2p/router/transport/TransportImpl.java
index 7f32f3f72b232e41b352d6fde35905f70a8cb79c..b559ac3c93e1dc2d07d5bb6012b8640d712206f3 100644
--- a/router/java/src/net/i2p/router/transport/TransportImpl.java
+++ b/router/java/src/net/i2p/router/transport/TransportImpl.java
@@ -61,6 +61,8 @@ public abstract class TransportImpl implements Transport {
     /** map from routerIdentHash to timestamp (Long) that the peer was last unreachable */
     private final Map<Hash, Long>  _unreachableEntries;
     private final Map<Hash, Long> _wasUnreachableEntries;
+    // one-entry cache for reachable check
+    private volatile Hash _lastReachablePeer;
     private final Set<InetAddress> _localAddresses;
     /** global router ident -> IP */
     private static final Map<Hash, byte[]> _IPMap;
@@ -851,14 +853,18 @@ public abstract class TransportImpl implements Transport {
     public void mayDisconnect(Hash peer) {}
 
     public boolean isUnreachable(Hash peer) {
+        if (peer == _lastReachablePeer) return false;
         boolean rv;
         Long when = _unreachableEntries.get(peer);
         if ((rv = when != null)) {
             long now = _context.clock().now();
             rv = when.longValue() + UNREACHABLE_PERIOD >= now;
             if (!rv) {
+                _lastReachablePeer = peer;
                 _unreachableEntries.remove(peer);
             }
+        } else {
+            _lastReachablePeer = peer;
         }
         return rv;
     }
@@ -872,6 +878,8 @@ public abstract class TransportImpl implements Transport {
         Long now = Long.valueOf(_context.clock().now());
         // This isn't very useful since it is cleared when they contact us
         _unreachableEntries.put(peer, now);
+        if (peer == _lastReachablePeer)
+            _lastReachablePeer = null;
         // This is not cleared when they contact us
         markWasUnreachable(peer, true);
     }