Index: trunk/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java	(revision 15335)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java	(revision 15336)
@@ -15,4 +15,5 @@
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 
@@ -33,5 +34,4 @@
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.spi.preferences.Config;
-import org.openstreetmap.josm.tools.Logging;
 
 /**
@@ -200,6 +200,6 @@
     }
 
-    protected Map<Node, Way> getWayEndNodesNearOtherHighway() {
-        Map<Node, Way> map = new HashMap<>();
+    protected Map<Node, MyWaySegment> getWayEndNodesNearOtherHighway() {
+        Map<Node, MyWaySegment> map = new HashMap<>();
         for (MyWaySegment s : waySegments) {
             if (isCanceled()) {
@@ -217,5 +217,5 @@
                 // to handle intersections of 't' shapes and similar
                 if (!en.isConnectedTo(s.w.getNodes(), 3 /* hops */, null)) {
-                    map.put(en, s.w);
+                    addIfNewOrCloser(map, en, s);
                 }
             }
@@ -224,6 +224,6 @@
     }
 
-    protected Map<Node, Way> getWayEndNodesNearOtherWay() {
-        Map<Node, Way> map = new HashMap<>();
+    protected Map<Node, MyWaySegment> getWayEndNodesNearOtherWay() {
+        Map<Node, MyWaySegment> map = new HashMap<>();
         for (MyWaySegment s : waySegments) {
             if (isCanceled()) {
@@ -234,5 +234,5 @@
                 for (Node en : s.nearbyNodes(mindist)) {
                     if (!en.isConnectedTo(s.w.getNodes(), 3 /* hops */, null)) {
-                        map.put(en, s.w);
+                        addIfNewOrCloser(map, en, s);
                     }
                 }
@@ -242,6 +242,6 @@
     }
 
-    protected Map<Node, Way> getWayNodesNearOtherWay() {
-        Map<Node, Way> map = new HashMap<>();
+    protected Map<Node, MyWaySegment> getWayNodesNearOtherWay() {
+        Map<Node, MyWaySegment> map = new HashMap<>();
         for (MyWaySegment s : waySegments) {
             if (isCanceled()) {
@@ -251,5 +251,5 @@
             for (Node en : s.nearbyNodes(minmiddledist)) {
                 if (!en.isConnectedTo(s.w.getNodes(), 3 /* hops */, null)) {
-                    map.put(en, s.w);
+                    addIfNewOrCloser(map, en, s);
                 }
             }
@@ -258,13 +258,26 @@
     }
 
-    protected final void addErrors(Severity severity, Map<Node, Way> errorMap, String message) {
-        for (Map.Entry<Node, Way> error : errorMap.entrySet()) {
+    private void addIfNewOrCloser(Map<Node, MyWaySegment> map, Node node, MyWaySegment ws) {
+        MyWaySegment old = map.get(node);
+        if (old != null) {
+            double d1 = ws.getDist(node);
+            double d2 = old.getDist(node);
+            if (d1 > d2) {
+                // keep old value
+                return;
+            }
+        }
+        map.put(node, ws);
+    }
+
+    protected final void addErrors(Severity severity, Map<Node, MyWaySegment> errorMap, String message) {
+        for (Entry<Node, MyWaySegment> error : errorMap.entrySet()) {
             Node node = error.getKey();
-            Way way = error.getValue();
-            if (partialSelection && !nodesToTest.contains(node) && !waysToTest.contains(way))
+            MyWaySegment ws = error.getValue();
+            if (partialSelection && !nodesToTest.contains(node) && !waysToTest.contains(ws.w))
                 continue;
             errors.add(TestError.builder(this, severity, code)
                     .message(message)
-                    .primitives(node, way)
+                    .primitives(node, ws.w)
                     .highlight(node)
                     .build());
@@ -328,22 +341,24 @@
         }
 
-        public boolean nearby(Node n, double dist) {
-            if (w == null) {
-                Logging.debug("way null");
-                return false;
-            }
+        double getDist(Node n) {
+            EastNorth coord = n.getEastNorth();
+            if (coord == null)
+                return Double.NaN;
+            EastNorth en1 = n1.getEastNorth();
+            EastNorth en2 = n2.getEastNorth();
+            return Line2D.ptSegDist(en1.getX(), en1.getY(), en2.getX(), en2.getY(), coord.getX(), coord.getY());
+
+        }
+
+        boolean nearby(Node n, double dist) {
             if (w.containsNode(n))
                 return false;
             if (n.isKeyTrue("noexit"))
                 return false;
-            EastNorth coord = n.getEastNorth();
-            if (coord == null)
-                return false;
-            EastNorth en1 = n1.getEastNorth();
-            EastNorth en2 = n2.getEastNorth();
-            return Line2D.ptSegDist(en1.getX(), en1.getY(), en2.getX(), en2.getY(), coord.getX(), coord.getY()) < dist;
-        }
-
-        public BBox getBounds(double fudge) {
+            double d = getDist(n);
+            return !Double.isNaN(d) && d < dist;
+        }
+
+        BBox getBounds(double fudge) {
             double x1 = n1.getCoor().lon();
             double x2 = n2.getCoor().lon();
@@ -365,5 +380,5 @@
         }
 
-        public Collection<Node> nearbyNodes(double dist) {
+        Collection<Node> nearbyNodes(double dist) {
             /*
              * We know that any point near the line segment must be at
