Index: trunk/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java	(revision 16792)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java	(revision 16793)
@@ -25,4 +25,5 @@
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.data.validation.OsmValidator;
 import org.openstreetmap.josm.data.validation.Severity;
@@ -69,4 +70,7 @@
     public static final int RELATION_LOOP    = 1710;
     // CHECKSTYLE.ON: SingleSpaceSeparator
+
+    // see 19312 comment:17
+    private static final BooleanProperty ALLOW_COMPLEX_LOOP = new BooleanProperty("validator.relation.allow.complex.dependency", false);
 
     /**
@@ -405,4 +409,7 @@
     @Override
     public void endTest() {
+        if (Boolean.TRUE.equals(ALLOW_COMPLEX_LOOP.get())) {
+            loops.removeIf(loop -> loop.size() > 2);
+        }
         loops.forEach(loop -> errors.add(TestError.builder(this, Severity.ERROR, RELATION_LOOP)
                 .message(loop.size() == 2 ? tr("Relation contains itself as a member")
@@ -465,4 +472,7 @@
         path.add(parent);
         test.checkLoop(child, path);
+        if (Boolean.TRUE.equals(ALLOW_COMPLEX_LOOP.get())) {
+            test.loops.removeIf(loop -> loop.size() > 2);
+        }
         if (test.loops.isEmpty())
             return Collections.emptyList();
