Index: trunk/src/org/openstreetmap/josm/data/validation/tests/MultipolygonTest.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/MultipolygonTest.java	(revision 11836)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/MultipolygonTest.java	(revision 11837)
@@ -833,28 +833,41 @@
                     continue;
                 }
-
-                Node unsharedNode = getNonIntersectingNode(outerCandidate, inner);
-                if (unsharedNode != null) {
-                    if (checkIfNodeIsInsidePolygon(unsharedNode, outerCandidate)) {
+                boolean useIntersectionTest = false;
+                Node unsharedOuterNode = null;
+                Node unsharedInnerNode = getNonIntersectingNode(outerCandidate, inner);
+                if (unsharedInnerNode != null) {
+                    if (checkIfNodeIsInsidePolygon(unsharedInnerNode, outerCandidate)) {
                         innerCandidates.add(inner);
                     } else {
                         // inner is not inside outerCandidate, check if it contains outerCandidate
-                        unsharedNode = getNonIntersectingNode(inner, outerCandidate);
-                        if (unsharedNode != null) {
-                            if (checkIfNodeIsInsidePolygon(unsharedNode, inner)) {
-                                return null;
+                        unsharedOuterNode = getNonIntersectingNode(inner, outerCandidate);
+                        if (unsharedOuterNode != null) {
+                            if (checkIfNodeIsInsidePolygon(unsharedOuterNode, inner)) {
+                                return null; // outer is inside inner
                             }
                         } else {
-                            return null; // polygons have only common nodes
+                            useIntersectionTest = true;
                         }
                     }
                 } else {
                     // all nodes of inner are also nodes of outerCandidate
-                    unsharedNode = getNonIntersectingNode(inner, outerCandidate);
-                    if (unsharedNode == null) {
+                    unsharedOuterNode = getNonIntersectingNode(inner, outerCandidate);
+                    if (unsharedOuterNode == null) {
+                        return null; // all nodes shared -> same ways, maybe different direction
+                    } else {
+                        if (checkIfNodeIsInsidePolygon(unsharedOuterNode, inner)) {
+                            return null; // outer is inside inner
+                        } else {
+                            useIntersectionTest = true;
+                        }
+                    }
+                }
+                if (useIntersectionTest) {
+                    Main.warn("using complex test ");
+                    PolygonIntersection res = Geometry.polygonIntersection(inner.getNodes(), outerCandidate.getNodes());
+                    if (res == PolygonIntersection.FIRST_INSIDE_SECOND)
+                        innerCandidates.add(inner);
+                    else if (res == PolygonIntersection.SECOND_INSIDE_FIRST)
                         return null;
-                    } else {
-                        innerCandidates.add(inner);
-                    }
                 }
             }
