Index: CrossingWays.java
===================================================================
--- CrossingWays.java	(revision 8136)
+++ CrossingWays.java	(working copy)
@@ -22,6 +22,9 @@
 	Map<Point2D,List<ExtendedSegment>> cellSegments;
     /** The already detected errors */
 	HashSet<WaySegment> errorSegments;
+	/** The already detected ways in error */
+	Map<List<Way>, List<WaySegment>> ways_seen;
+
 	
 	/**
 	 * Constructor
@@ -38,6 +41,8 @@
 	{
 		cellSegments = new HashMap<Point2D,List<ExtendedSegment>>(1000);
         errorSegments = new HashSet<WaySegment>();
+		ways_seen = new HashMap<List<Way>, List<WaySegment>>(50);
+
 	}
 
 	@Override
@@ -45,6 +50,7 @@
 	{
 		cellSegments = null;
 		errorSegments = null;
+		ways_seen = null;
 	}
 
 	@Override
@@ -57,7 +63,7 @@
         boolean isCoastline1 = coastline1 != null && (coastline1.equals("water") || coastline1.equals("coastline"));
         String railway1 = w.get("railway"); 
         boolean isSubway1 = railway1 != null && railway1.equals("subway");
-        if( w.get("highway") == null && w.get("waterway") == null && !isSubway1 && !isCoastline1) 
+        if( w.get("highway") == null && w.get("waterway") == null && (railway1 == null || isSubway1)  && !isCoastline1) 
         	return;
         
         String layer1 = w.get("layer");
@@ -71,24 +77,42 @@
             {
 	            for( ExtendedSegment es2 : segments)
 	            {
-					if (errorSegments.contains(ws) && errorSegments.contains(es2.ws))
+			List<Way> prims;
+			List<WaySegment> highlight;
+
+			if (errorSegments.contains(ws) && errorSegments.contains(es2.ws))
 	            		continue;
 	            	
 	                String layer2 = es2.layer;
 	                String railway2 = es2.railway;
 	                String coastline2 = es2.coastline;
-					if (layer1 == null ? layer2 != null : !layer1.equals(layer2))
+			if (layer1 == null ? layer2 != null : !layer1.equals(layer2))
 	                	continue;
 	                
 	                if( !es1.intersects(es2) ) continue;
-		            if( isSubway1 && "subway".equals(railway2)) continue;
+		        if( isSubway1 && "subway".equals(railway2)) continue;
 		            
 		            boolean isCoastline2 = coastline2 != null && (coastline2.equals("water") || coastline2.equals("coastline"));
 	                if( isCoastline1 != isCoastline2 ) continue;
 	                
-                    errors.add(new TestError(this, Severity.WARNING, tr("Crossing ways"),
-						Arrays.asList(es1.ws.way, es2.ws.way),
-						Arrays.asList(es1.ws, es2.ws)));
+		    	prims = Arrays.asList(es1.ws.way, es2.ws.way);
+		    	if ((highlight = ways_seen.get(prims)) == null)
+                    	{
+
+		            highlight = new ArrayList<WaySegment>();
+			    highlight.add(es1.ws);
+			    highlight.add(es2.ws);
+
+                    	    errors.add(new TestError(this, Severity.WARNING, tr("Crossing ways"),
+						prims,
+						highlight ));
+			    ways_seen.put(prims, highlight);
+		        }
+		        else
+		        {
+			    highlight.add(es1.ws);
+			    highlight.add(es2.ws);
+		        }
 	            }
 	            segments.add(es1);
             }
