Index: src/org/openstreetmap/josm/tools/Geometry.java
===================================================================
--- src/org/openstreetmap/josm/tools/Geometry.java	(revision 17456)
+++ src/org/openstreetmap/josm/tools/Geometry.java	(working copy)
@@ -633,15 +633,31 @@
         Area inter = new Area(a1);
         inter.intersect(a2);
 
+        boolean b1InsideB2 = a2.getBounds2D().contains(a1.getBounds2D());
+        boolean b2InsideB1 = a1.getBounds2D().contains(a2.getBounds2D());
+
         if (inter.isEmpty() || !checkIntersection(inter, eps)) {
             return new Pair<>(PolygonIntersection.OUTSIDE, inter);
-        } else if (a2.getBounds2D().contains(a1.getBounds2D()) && inter.equals(a1)) {
+        } else if (b1InsideB2 && inter.equals(a1)) {
             return new Pair<>(PolygonIntersection.FIRST_INSIDE_SECOND, inter);
-        } else if (a1.getBounds2D().contains(a2.getBounds2D()) && inter.equals(a2)) {
+        } else if (b2InsideB1 && inter.equals(a2)) {
             return new Pair<>(PolygonIntersection.SECOND_INSIDE_FIRST, inter);
-        } else {
-            return new Pair<>(PolygonIntersection.CROSSING, inter);
+        } else if (b1InsideB2) {
+            // see #20054
+            Area doubleCheck = new Area(inter);
+            doubleCheck.subtract(a1);
+            if (doubleCheck.isEmpty() || !checkIntersection(doubleCheck, eps)) {
+                return new Pair<>(PolygonIntersection.FIRST_INSIDE_SECOND, inter);
+            }
+        } else if (b2InsideB1) {
+            // see #20054
+            Area doubleCheck = new Area(inter);
+            doubleCheck.subtract(a2);
+            if (doubleCheck.isEmpty() || !checkIntersection(doubleCheck, eps)) {
+                return new Pair<>(PolygonIntersection.SECOND_INSIDE_FIRST, inter);
+            }
         }
+        return new Pair<>(PolygonIntersection.CROSSING, inter);
     }
 
     /**
