Index: actions/upload/ValidateUploadHook.java
===================================================================
--- actions/upload/ValidateUploadHook.java	(revision 18225)
+++ actions/upload/ValidateUploadHook.java	(working copy)
@@ -54,7 +54,7 @@
         if (tests.isEmpty())
             return true;
 
-        AggregatePrimitivesVisitor v = new AggregatePrimitivesVisitor();
+        AggregatePrimitivesVisitor v = new AggregatePrimitivesVisitor(true);
         v.visit(apiDataSet.getPrimitivesToAdd());
         Collection<OsmPrimitive> selection = v.visit(apiDataSet.getPrimitivesToUpdate());
 
Index: actions/ValidateAction.java
===================================================================
--- actions/ValidateAction.java	(revision 18225)
+++ actions/ValidateAction.java	(working copy)
@@ -70,7 +70,7 @@
                 selection = getLayerManager().getActiveDataSet().allNonDeletedPrimitives();
                 lastSelection = null;
             } else {
-                AggregatePrimitivesVisitor v = new AggregatePrimitivesVisitor();
+                AggregatePrimitivesVisitor v = new AggregatePrimitivesVisitor(true);
                 selection = v.visit(selection);
                 lastSelection = selection;
             }
Index: data/validation/tests/CrossingWays.java
===================================================================
--- data/validation/tests/CrossingWays.java	(revision 18225)
+++ data/validation/tests/CrossingWays.java	(working copy)
@@ -15,6 +15,8 @@
 import java.util.stream.Collectors;
 
 import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmDataManager;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmUtils;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -80,6 +82,7 @@
     private final Map<Point2D, List<WaySegment>> cellSegments = new HashMap<>(1000);
     /** The already detected ways in error */
     private final Map<List<Way>, List<WaySegment>> seenWays = new HashMap<>(50);
+    protected boolean isSurroundingTest;
 
     protected final int code;
 
@@ -298,6 +301,7 @@
     @Override
     public void startTest(ProgressMonitor monitor) {
         super.startTest(monitor);
+        isSurroundingTest = false;
         cellSegments.clear();
         seenWays.clear();
     }
@@ -304,6 +308,15 @@
 
     @Override
     public void endTest() {
+        // see #20680: if only a selection was tested, test it also against the other suitable ways
+        if (partialSelection && !cellSegments.isEmpty() && !(this instanceof SelfCrossing)) {
+            isSurroundingTest = true; // don't add more ways to the spatial index
+            DataSet ds = OsmDataManager.getInstance().getActiveDataSet();
+            for (Way w : ds.getWays()) {
+                if (isPrimitiveUsable(w))
+                    visit(w);
+            }
+        }
         super.endTest();
         cellSegments.clear();
         seenWays.clear();
@@ -390,7 +403,8 @@
                         highlight.add(es2);
                     }
                 }
-                segments.add(es1);
+                if (!isSurroundingTest)
+                    segments.add(es1);
             }
         }
     }
Index: data/validation/util/AggregatePrimitivesVisitor.java
===================================================================
--- data/validation/util/AggregatePrimitivesVisitor.java	(revision 18225)
+++ data/validation/util/AggregatePrimitivesVisitor.java	(working copy)
@@ -21,8 +21,24 @@
 public class AggregatePrimitivesVisitor implements OsmPrimitiveVisitor {
     /** Aggregated data */
     private final Collection<OsmPrimitive> aggregatedData = new HashSet<>();
+    private final boolean collectParentWays;
 
     /**
+     * create new AggregatePrimitivesVisitor.
+     */
+    public AggregatePrimitivesVisitor() {
+        this(false);
+    }
+
+    /**
+     * create new AggregatePrimitivesVisitor.
+     * @param collectParentWays if true, parent ways of modified nodes are also collected
+     */
+    public AggregatePrimitivesVisitor(boolean collectParentWays) {
+        this.collectParentWays = collectParentWays;
+    }
+
+    /**
      * Visits a collection of primitives
      * @param data The collection of primitives
      * @return The aggregated primitives
@@ -40,6 +56,9 @@
         if (!aggregatedData.contains(n)) {
             aggregatedData.add(n);
         }
+        if (collectParentWays && n.isModified()) {
+            n.referrers(Way.class).filter(Way::isUsable).forEach(this::visit);
+        }
     }
 
     @Override
