Index: src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java
===================================================================
--- src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java	(revision 10929)
+++ src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java	(working copy)
@@ -3,6 +3,7 @@
 
 import static org.openstreetmap.josm.data.projection.Ellipsoid.WGS84;
 
+import java.awt.geom.Area;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -19,6 +20,8 @@
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;
+import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon;
+import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon.PolyData;
 import org.openstreetmap.josm.data.osm.visitor.paint.relations.MultipolygonCache;
 import org.openstreetmap.josm.gui.mappaint.Environment;
 import org.openstreetmap.josm.gui.mappaint.Range;
@@ -248,11 +251,60 @@
 
             @Override
             public void visit(Way w) {
-                if (e.child == null && left.matches(new Environment(w).withParent(e.osm))) {
-                    if (e.osm instanceof Way && Geometry.PolygonIntersection.CROSSING.equals(
-                            Geometry.polygonIntersection(w.getNodes(), ((Way) e.osm).getNodes()))) {
-                        e.child = w;
+                if (e.parent.isMultipolygon()) {
+                    if (((Relation) e.parent).hasIncompleteMembers())
+                        return;
+                    if (e.child == null && left.matches(new Environment(w).withParent(w))) {
+                        Multipolygon polygon = MultipolygonCache.getInstance().get(Main.map.mapView, (Relation) e.parent);
+                        if (polygon == null)
+                            return;
+                        Area a = Geometry.getArea(w.getNodes());
+                        for (PolyData pd : polygon.getCombinedPolygons()) {
+                            Area b = new Area(pd.get());
+                            if (Geometry.PolygonIntersection.CROSSING.equals(Geometry.polygonIntersection(a, b))) {
+                                e.child = w;
+                                break;
+                            }
+                        }
                     }
+                    if (e.child == null) {
+                        for (OsmPrimitive parent : w.getReferrers()) {
+                            if (parent.isMultipolygon() && !parent.isIncomplete()) {
+                                if (e.parent == parent || ((Relation) parent).hasIncompleteMembers() )
+                                    return;
+                                if (left.matches(new Environment(parent).withParent(parent))) {
+                                    Multipolygon p1 = MultipolygonCache.getInstance().get(Main.map.mapView, (Relation) e.parent);
+                                    if (p1 == null)
+                                        return;
+                                    Multipolygon p2 = MultipolygonCache.getInstance().get(Main.map.mapView, (Relation) parent);
+                                    if (p2 == null)
+                                        return;
+                                    for (PolyData pd1 : p1.getCombinedPolygons()) {
+                                        Area a = new Area(pd1.get());
+                                        for (PolyData pd2 : p2.getCombinedPolygons()) {
+                                            Area b = new Area(pd2.get());
+                                            if (Geometry.PolygonIntersection.CROSSING.equals(Geometry.polygonIntersection(a, b))) {
+                                                e.child = w;
+                                                break;
+                                            }
+                                        }
+                                        if (e.child != null)
+                                            break;
+                                    }
+                                }
+                            }
+                            if (e.child != null)
+                                break;
+                        }
+                    }
+
+                } else {
+                    if (e.child == null && left.matches(new Environment(w).withParent(e.osm))) {
+                        if (e.osm instanceof Way && Geometry.PolygonIntersection.CROSSING.equals(
+                                Geometry.polygonIntersection(w.getNodes(), ((Way) e.osm).getNodes()))) {
+                            e.child = w;
+                        }
+                    }
                 }
             }
         }
@@ -348,6 +400,24 @@
                     crossingFinder.visit(e.osm.getDataSet().searchWays(e.osm.getBBox()));
                 }
                 return e.child != null;
+            } else if (ChildOrParentSelectorType.CROSSING.equals(type) && e.osm.isMultipolygon()) {
+                List<RelationMember> members = ((Relation) e.osm).getMembers();
+                for (int i = 0; i < members.size(); i++) {
+                    OsmPrimitive member = members.get(i).getMember();
+                    if (member instanceof Way) {
+                        Environment ew = new Environment(member);
+                        ew.parent = e.osm;
+                        final CrossingFinder crossingFinder = new CrossingFinder(ew);
+                        if (right instanceof OptimizedGeneralSelector
+                                && ((OptimizedGeneralSelector) right).matchesBase(OsmPrimitiveType.WAY)) {
+                            crossingFinder.visit(ew.osm.getDataSet().searchWays(ew.osm.getBBox()));
+                            if (ew.child != null) {
+                                e.child = ew.child;
+                            }
+                        }
+                    }
+                }
+                return e.child != null;
             } else if (ChildOrParentSelectorType.SIBLING.equals(type)) {
                 if (e.osm instanceof Node) {
                     for (Way w : Utils.filteredCollection(e.osm.getReferrers(true), Way.class)) {
