Index: trunk/src/org/openstreetmap/josm/data/validation/TestError.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/TestError.java	(revision 15937)
+++ trunk/src/org/openstreetmap/josm/data/validation/TestError.java	(revision 15938)
@@ -2,5 +2,8 @@
 package org.openstreetmap.josm.data.validation;
 
+import java.awt.geom.Area;
+import java.awt.geom.PathIterator;
 import java.text.MessageFormat;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -12,4 +15,5 @@
 
 import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -189,4 +193,16 @@
 
         /**
+         * Sets an area to highlight when selecting this error.
+         *
+         * @param highlighted the area to highlight
+         * @return {@code this}
+         */
+        public Builder highlight(Area highlighted) {
+            CheckParameterUtil.ensureParameterNotNull(highlighted, "highlighted");
+            this.highlighted = Collections.singleton(highlighted);
+            return this;
+        }
+
+        /**
          * Sets a supplier to obtain a command to fix the error.
          *
@@ -422,7 +438,54 @@
             } else if (o instanceof List<?>) {
                 v.visit((List<Node>) o);
+            } else if (o instanceof Area) {
+                for (List<Node> l : getHiliteNodesForArea((Area) o)) {
+                    v.visit(l);
+                }
             }
         }
     }
+
+    /**
+     * Calculate list of node pairs describing the area.
+     * @param area the area
+     * @return list of node pairs describing the area
+     */
+    private  static List<List<Node>> getHiliteNodesForArea(Area area) {
+        List<List<Node>> hilite = new ArrayList<>();
+        PathIterator pit = area.getPathIterator(null);
+        double[] res = new double[6];
+        List<Node> nodes = new ArrayList<>();
+        while (!pit.isDone()) {
+            int type = pit.currentSegment(res);
+            Node n = new Node(new EastNorth(res[0], res[1]));
+            switch (type) {
+            case PathIterator.SEG_MOVETO:
+                if (!nodes.isEmpty()) {
+                    hilite.add(nodes);
+                }
+                nodes = new ArrayList<>();
+                nodes.add(n);
+                break;
+            case PathIterator.SEG_LINETO:
+                nodes.add(n);
+                break;
+            case PathIterator.SEG_CLOSE:
+                if (!nodes.isEmpty()) {
+                    nodes.add(nodes.get(0));
+                    hilite.add(nodes);
+                    nodes = new ArrayList<>();
+                }
+                break;
+            default:
+                break;
+            }
+            pit.next();
+        }
+        if (nodes.size() > 1) {
+            hilite.add(nodes);
+        }
+        return hilite;
+    }
+
 
     /**
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java	(revision 15937)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java	(revision 15938)
@@ -4,4 +4,5 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.geom.Area;
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -619,4 +620,10 @@
                                 errorBuilder = errorBuilder.fix(() -> fix);
                             }
+                            if (env.intersections != null) {
+                                Area is = env.intersections.get(c);
+                                if (is != null) {
+                                    errorBuilder = errorBuilder.highlight(is);
+                                }
+                            }
                             res.add(errorBuilder.primitives(p, (OsmPrimitive) c).build());
                         }
@@ -743,6 +750,5 @@
                         && e.getPrimitives().size() == toAdd.getPrimitives().size()
                         && e.getPrimitives().containsAll(toAdd.getPrimitives())
-                        && e.getHighlighted().size() == toAdd.getHighlighted().size()
-                        && e.getHighlighted().containsAll(toAdd.getHighlighted())) {
+                        && highlightedIsEqual(e.getHighlighted(), toAdd.getHighlighted())) {
                     isDup = true;
                     break;
@@ -752,4 +758,19 @@
         if (!isDup)
             errors.add(toAdd);
+    }
+
+    private static boolean highlightedIsEqual(Collection<?> highlighted, Collection<?> highlighted2) {
+        if (highlighted.size() == highlighted2.size()) {
+            if (!highlighted.isEmpty()) {
+                Object h1 = highlighted.iterator().next();
+                Object h2 = highlighted2.iterator().next();
+                if (h1 instanceof Area && h2 instanceof Area) {
+                    return ((Area) h1).equals((Area) h2);
+                }
+                return highlighted.containsAll(highlighted2);
+            }
+            return true;
+        }
+        return false;
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/Environment.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/Environment.java	(revision 15937)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/Environment.java	(revision 15938)
@@ -2,5 +2,8 @@
 package org.openstreetmap.josm.gui.mappaint;
 
+import java.awt.geom.Area;
+import java.util.HashMap;
 import java.util.LinkedHashSet;
+import java.util.Map;
 import java.util.Set;
 
@@ -67,4 +70,9 @@
      */
     public Set<IPrimitive> children;
+
+    /**
+     * Intersection areas (only filled with CrossingFinder if children is not null)
+     */
+    public Map<IPrimitive, Area> intersections;
 
     /**
@@ -118,4 +126,5 @@
         this.context = other.getContext();
         this.children = other.children == null ? null : new LinkedHashSet<>(other.children);
+        this.intersections = other.intersections == null ? null : new HashMap<>(other.intersections);
     }
 
@@ -284,4 +293,5 @@
         count = null;
         children = null;
+        intersections = null;
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java	(revision 15937)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java	(revision 15938)
@@ -4,8 +4,10 @@
 import static org.openstreetmap.josm.data.projection.Ellipsoid.WGS84;
 
+import java.awt.geom.Area;
 import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -31,5 +33,7 @@
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Geometry;
+import org.openstreetmap.josm.tools.Geometry.PolygonIntersection;
 import org.openstreetmap.josm.tools.Logging;
+import org.openstreetmap.josm.tools.Pair;
 import org.openstreetmap.josm.tools.Utils;
 
@@ -298,4 +302,5 @@
 
             private final String layer;
+            private Area area;
 
             private CrossingFinder(Environment e) {
@@ -309,7 +314,18 @@
                 if (Objects.equals(layer, OsmUtils.getLayer(w))
                     && left.matches(new Environment(w).withParent(e.osm))
-                    && e.osm instanceof IWay && Geometry.PolygonIntersection.CROSSING.equals(
-                            Geometry.polygonIntersection(w.getNodes(), ((IWay<?>) e.osm).getNodes()))) {
-                    addToChildren(e, w);
+                    && e.osm instanceof IWay) {
+                    if (area == null) {
+                        area = Geometry.getAreaEastNorth(e.osm);
+                    }
+                    Pair<PolygonIntersection, Area> is = Geometry.polygonIntersectionResult(
+                            Geometry.getAreaEastNorth(w), area, Geometry.INTERSECTION_EPS_EAST_NORTH);
+                    if (Geometry.PolygonIntersection.CROSSING == is.a) {
+                        addToChildren(e, w);
+                        // store intersection area to improve highlight and zoom to problem
+                        if (e.intersections == null) {
+                            e.intersections = new HashMap<>();
+                        }
+                        e.intersections.put(w, is.b);
+                    }
                 }
             }
Index: trunk/src/org/openstreetmap/josm/tools/Geometry.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/Geometry.java	(revision 15937)
+++ trunk/src/org/openstreetmap/josm/tools/Geometry.java	(revision 15938)
@@ -30,4 +30,5 @@
 import org.openstreetmap.josm.data.osm.INode;
 import org.openstreetmap.josm.data.osm.IPrimitive;
+import org.openstreetmap.josm.data.osm.IRelation;
 import org.openstreetmap.josm.data.osm.IWay;
 import org.openstreetmap.josm.data.osm.MultipolygonBuilder;
@@ -553,4 +554,26 @@
 
     /**
+     * Calculate area in east/north space for given primitive. Uses {@link MultipolygonCache} for multipolygon relations.
+     * @param p the primitive
+     * @return the area in east/north space, might be empty if the primitive is incomplete or not closed or a node
+     * since 15938
+     */
+    public static Area getAreaEastNorth(IPrimitive p) {
+        if (p instanceof Way && ((Way) p).isClosed()) {
+            return Geometry.getArea(((Way) p).getNodes());
+        }
+        if (p.isMultipolygon() && !p.isIncomplete() && !((IRelation<?>) p).hasIncompleteMembers()) {
+            Multipolygon mp = MultipolygonCache.getInstance().get((Relation) p);
+            Path2D path = new Path2D.Double();
+            path.setWindingRule(Path2D.WIND_EVEN_ODD);
+            for (PolyData pd : mp.getCombinedPolygons()) {
+                path.append(pd.get(), false);
+            }
+            return new Area(path);
+        }
+        return new Area();
+    }
+
+    /**
      * Returns the Area of a polygon, from the multipolygon relation.
      * @param multipolygon the multipolygon relation
@@ -601,16 +624,27 @@
      */
     public static PolygonIntersection polygonIntersection(Area a1, Area a2, double eps) {
-
+        return polygonIntersectionResult(a1, a2, eps).a;
+    }
+
+    /**
+     * Calculate intersection area and kind of intersection between two polygons.
+     * @param a1 Area of first polygon
+     * @param a2 Area of second polygon
+     * @param eps an area threshold, everything below is considered an empty intersection
+     * @return pair with intersection kind and intersection area (never null, but maybe empty)
+     * @since 15938
+     */
+    public static Pair<PolygonIntersection, Area> polygonIntersectionResult(Area a1, Area a2, double eps) {
         Area inter = new Area(a1);
         inter.intersect(a2);
 
         if (inter.isEmpty() || !checkIntersection(inter, eps)) {
-            return PolygonIntersection.OUTSIDE;
+            return new Pair<>(PolygonIntersection.OUTSIDE, inter);
         } else if (a2.getBounds2D().contains(a1.getBounds2D()) && inter.equals(a1)) {
-            return PolygonIntersection.FIRST_INSIDE_SECOND;
+            return new Pair<>(PolygonIntersection.FIRST_INSIDE_SECOND, inter);
         } else if (a1.getBounds2D().contains(a2.getBounds2D()) && inter.equals(a2)) {
-            return PolygonIntersection.SECOND_INSIDE_FIRST;
+            return new Pair<>(PolygonIntersection.SECOND_INSIDE_FIRST, inter);
         } else {
-            return PolygonIntersection.CROSSING;
+            return new Pair<>(PolygonIntersection.CROSSING, inter);
         }
     }
