Index: src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java	(revision 15060)
+++ src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java	(working copy)
@@ -747,6 +747,10 @@
                 final List<OsmPrimitive> primitives;
                 if (env.child instanceof OsmPrimitive) {
                     primitives = Arrays.asList(p, (OsmPrimitive) env.child);
+                } else if (env.children != null) {
+                    primitives = new ArrayList<>();
+                    primitives.add(p);
+                    env.children.forEach(c -> primitives.add((OsmPrimitive) c));
                 } else {
                     primitives = Collections.singletonList(p);
                 }
Index: src/org/openstreetmap/josm/gui/mappaint/Environment.java
===================================================================
--- src/org/openstreetmap/josm/gui/mappaint/Environment.java	(revision 15060)
+++ src/org/openstreetmap/josm/gui/mappaint/Environment.java	(working copy)
@@ -1,6 +1,9 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.mappaint;
 
+import java.util.LinkedHashSet;
+import java.util.Set;
+
 import org.openstreetmap.josm.data.osm.IPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.gui.mappaint.mapcss.Condition.Context;
@@ -60,6 +63,11 @@
     public Integer count;
 
     /**
+     * Set of matched children filled by ContainsFinder and CrossingFinder, null if nothing matched
+     */
+    public Set<IPrimitive> children;
+
+    /**
      * Creates a new uninitialized environment.
      */
     public Environment() {
@@ -108,6 +116,7 @@
         this.index = other.index;
         this.count = other.count;
         this.context = other.getContext();
+        this.children = other.children == null ? null : new LinkedHashSet<>(other.children);
     }
 
     /**
Index: src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java
===================================================================
--- src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java	(revision 15060)
+++ src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java	(working copy)
@@ -6,6 +6,7 @@
 import java.text.MessageFormat;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Objects;
@@ -302,7 +303,10 @@
                     && left.matches(new Environment(w).withParent(e.osm))
                     && e.osm instanceof IWay && Geometry.PolygonIntersection.CROSSING.equals(
                             Geometry.polygonIntersection(w.getNodes(), ((IWay<?>) e.osm).getNodes()))) {
-                    e.child = w;
+                    if (e.children == null) {
+                        e.children = new LinkedHashSet<>();
+                    }
+                    e.children.add(w);
                 }
             }
         }
@@ -319,7 +323,7 @@
                     && ((e.osm instanceof IWay && Geometry.nodeInsidePolygon(n, ((IWay<?>) e.osm).getNodes()))
                             || (e.osm instanceof Relation && (
                                     (Relation) e.osm).isMultipolygon() && Geometry.isNodeInsideMultiPolygon(n, (Relation) e.osm, null)))) {
-                    e.child = n;
+                    addChild(e, n);
                 }
             }
 
@@ -331,9 +335,15 @@
                             || (e.osm instanceof Relation && (
                                     (Relation) e.osm).isMultipolygon()
                                     && Geometry.isPolygonInsideMultiPolygon(w.getNodes(), (Relation) e.osm, null)))) {
-                    e.child = w;
+                    addChild(e, w);
                 }
             }
+            private void addChild(Environment e, IPrimitive p) {
+                if (e.children == null) {
+                    e.children = new LinkedHashSet<>();
+                }
+                e.children.add(p);
+            }
         }
 
         @Override
@@ -387,7 +397,7 @@
                     containsFinder.visit(e.osm.getDataSet().allPrimitives());
                 }
 
-                return e.child != null;
+                return e.children != null;
 
             } else if (ChildOrParentSelectorType.CROSSING == type && e.osm instanceof IWay) {
                 e.parent = e.osm;
@@ -396,7 +406,7 @@
                         && ((OptimizedGeneralSelector) right).matchesBase(OsmPrimitiveType.WAY)) {
                     crossingFinder.visit(e.osm.getDataSet().searchWays(e.osm.getBBox()));
                 }
-                return e.child != null;
+                return e.children != null;
             } else if (ChildOrParentSelectorType.SIBLING == type) {
                 if (e.osm instanceof INode) {
                     for (IPrimitive ref : e.osm.getReferrers(true)) {
