Index: /trunk/src/org/openstreetmap/josm/data/validation/tests/MultipolygonTest.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/validation/tests/MultipolygonTest.java	(revision 16760)
+++ /trunk/src/org/openstreetmap/josm/data/validation/tests/MultipolygonTest.java	(revision 16761)
@@ -562,5 +562,5 @@
 
     /**
-    * Determine multipolygon ways which are intersecting (crossing without a common node).
+    * Determine multipolygon ways which are intersecting (crossing without a common node) or sharing one or more way segments.
     * This should only be used for relations with incomplete members.
     * See also {@link CrossingWays}
@@ -568,14 +568,27 @@
      */
     private void findIntersectingWaysIncomplete(Relation r) {
-        for (Entry<List<Way>, List<WaySegment>> entry : findIntersectingWays(r, false).entrySet()) {
-            List<Way> ways = entry.getKey();
-            if (ways.size() != 2)
-                continue;
-
-            errors.add(TestError.builder(this, Severity.ERROR, CROSSING_WAYS)
-                    .message(tr("Intersection between multipolygon ways"))
-                    .primitives(Arrays.asList(r, ways.get(0), ways.get(1)))
-                    .highlightWaySegments(entry.getValue())
-                    .build());
+        Set<OsmPrimitive> outerWays = r.getMembers().stream()
+                .filter(m -> m.getRole().isEmpty() || "outer".equals(m.getRole()))
+                .map(RelationMember::getMember)
+                .collect(Collectors.toSet());
+        for (int loop = 0; loop < 2; loop++) {
+            for (Entry<List<Way>, List<WaySegment>> entry : findIntersectingWays(r, loop == 1).entrySet()) {
+                List<Way> ways = entry.getKey();
+                if (ways.size() != 2)
+                    continue;
+                if (loop == 0) {
+                errors.add(TestError.builder(this, Severity.ERROR, CROSSING_WAYS)
+                        .message(tr("Intersection between multipolygon ways"))
+                        .primitives(Arrays.asList(r, ways.get(0), ways.get(1)))
+                        .highlightWaySegments(entry.getValue())
+                        .build());
+                } else if (outerWays.contains(ways.get(0)) || outerWays.contains(ways.get(1))) {
+                    errors.add(TestError.builder(this, Severity.ERROR, CROSSING_WAYS)
+                            .message(tr("Multipolygon outer way shares segment with other ring"))
+                            .primitives(Arrays.asList(r, ways.get(0), ways.get(1)))
+                            .highlightWaySegments(entry.getValue()).build());
+                }
+
+            }
         }
     }
