diff --git a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
index 88374cf496e58ab7e1feb7c03382ad85b2e15251..f31bcce373bf3ce51122433ec8f47a6cb6355fb5 100644
--- a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
+++ b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
@@ -390,24 +390,40 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
         RouterInfo ri = _context.netDb().lookupRouterInfoLocally(peer);
         if (ri == null)
             return null;
-        ip = getIP(ri);
+        ip = getValidIP(ri);
         if (ip != null)
             return _geoIP.get(ip);
         return null;
     }
 
+    /**
+     *  Return first IP (v4 or v6) we find, any transport.
+     *  Not validated, may be local, etc.
+     */
     private static byte[] getIP(RouterInfo ri) {
-        // Return first IP (v4 or v6) we find, any transport
-        // Assume IPv6 doesn't have geoIP for now
         for (RouterAddress ra : ri.getAddresses()) {
             byte[] rv = ra.getIP();
-            //if (rv != null && rv.length == 4)
             if (rv != null)
                 return rv;
         }
         return null;
     }
 
+    /**
+     *  Return first valid IP (v4 or v6) we find, any transport.
+     *  Local and other invalid IPs will not be returned.
+     *
+     *  @since 0.9.18
+     */
+    private static byte[] getValidIP(RouterInfo ri) {
+        for (RouterAddress ra : ri.getAddresses()) {
+            byte[] rv = ra.getIP();
+            if (rv != null && TransportUtil.isPubliclyRoutable(rv, true))
+                return rv;
+        }
+        return null;
+    }
+
     /** full name for a country code, or the code if we don't know the name */
     @Override
     public String getCountryName(String c) {