Index: trunk/src/org/openstreetmap/josm/data/validation/tests/MultipolygonTest.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/MultipolygonTest.java	(revision 15182)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/MultipolygonTest.java	(revision 15183)
@@ -81,4 +81,6 @@
     /** set when used to build a multipolygon relation */
     private Relation createdRelation;
+    /** might be set when creating a relation and touching rings were found. */
+    private boolean repeatCheck;
 
     /**
@@ -250,5 +252,5 @@
             // we found no intersection or crossing between the polygons and they are closed
             // now we can calculate the nesting level to verify the roles with some simple node checks
-            checkRoles(r, allPolygons, wayMap, sharedNodes);
+            checkOrSetRoles(r, allPolygons, wayMap, sharedNodes);
         }
     }
@@ -461,5 +463,5 @@
      * @param sharedNodes all nodes shared by multiple ways of this multipolygon
      */
-    private void checkRoles(Relation r, List<PolyData> allPolygons, Map<Long, RelationMember> wayMap, Set<Node> sharedNodes) {
+    private void checkOrSetRoles(Relation r, List<PolyData> allPolygons, Map<Long, RelationMember> wayMap, Set<Node> sharedNodes) {
         PolygonLevelFinder levelFinder = new PolygonLevelFinder(sharedNodes);
         List<PolygonLevel> list = levelFinder.findOuterWays(allPolygons);
@@ -577,5 +579,7 @@
                         }
                     }
-                    if (loop == 0 || samePoly || (loop == 1 && !allInner)) {
+                    if (r == createdRelation && loop == 1 && !allInner) {
+                        repeatCheck = true;
+                    } else if (loop == 0 || samePoly || (loop == 1 && !allInner)) {
                         String msg = loop == 0 ? tr("Intersection between multipolygon ways")
                                 : samePoly ? tr("Multipolygon ring contains segments twice")
@@ -922,13 +926,16 @@
             r.addMember(new RelationMember("", w));
         }
-        errors.clear();
-        Multipolygon polygon = null;
-        boolean hasRepeatedMembers = checkRepeatedWayMembers(r);
-        if (!hasRepeatedMembers) {
-            polygon = new Multipolygon(r);
-            // don't check style consistency here
-            checkGeometryAndRoles(r, polygon);
-        }
-        createdRelation = null;
+        do {
+            repeatCheck = false;
+            errors.clear();
+            Multipolygon polygon = null;
+            boolean hasRepeatedMembers = checkRepeatedWayMembers(r);
+            if (!hasRepeatedMembers) {
+                polygon = new Multipolygon(r);
+                // don't check style consistency here
+                checkGeometryAndRoles(r, polygon);
+            }
+            createdRelation = null; // makes sure that repeatCheck is only set once
+        } while (repeatCheck);
         errors.removeIf(e->e.getSeverity() == Severity.OTHER);
         return r;
