Index: /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/TestError.java
===================================================================
--- /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/TestError.java	(revision 6301)
+++ /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/TestError.java	(revision 6302)
@@ -2,5 +2,5 @@
 
 import java.awt.*;
-import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
@@ -21,17 +21,21 @@
 	private String message;
 	/** The affected primitives */
-	private List<OsmPrimitive> primitives;
+	private List<? extends OsmPrimitive> primitives;
+	/** The primitives to be highlighted */
+	private List<?> highlighted;
 	/** The tester that raised this error */
 	private Test tester;
 	/** Internal code used by testers to classify errors */
-	private int internalCode;
+	private int internalCode = -1;
     /** If this error is selected */
     private boolean selected;
 	
-	/**
-	 * Constructor
-	 */
-	public TestError()
-	{
+	public TestError(Test tester, Severity severity, String message,
+			List<? extends OsmPrimitive> primitives, List<?> highlighted) {
+		this.tester = tester;
+		this.severity = severity;
+		this.message = message;
+		this.primitives = primitives;
+		this.highlighted = highlighted;
 	}
 
@@ -43,10 +47,7 @@
 	 * @param primitives The affected primitives
 	 */
-	public TestError(Test tester, Severity severity, String message, List<OsmPrimitive> primitives)
-	{
-		this.tester = tester;
-		this.severity = severity;
-		this.message = message;
-		this.primitives = primitives;
+	public TestError(Test tester, Severity severity, String message, List<? extends OsmPrimitive> primitives)
+	{
+		this(tester, severity, message, primitives, primitives);
 	}
 	
@@ -60,12 +61,5 @@
 	public TestError(Test tester, Severity severity, String message, OsmPrimitive primitive)
 	{
-		this.tester = tester;
-		this.severity = severity;
-		this.message = message;
-		
-		List<OsmPrimitive> primitives = new ArrayList<OsmPrimitive>();
-		primitives.add(primitive);
-		
-		this.primitives = primitives;
+		this(tester, severity, message, Collections.singletonList(primitive));
 	}
 	
@@ -106,5 +100,5 @@
 	 * @return the list of primitives affected by this error
 	 */
-	public List<OsmPrimitive> getPrimitives() 
+	public List<? extends OsmPrimitive> getPrimitives() 
 	{
 		return primitives;
@@ -199,8 +193,10 @@
     {
         PaintVisitor v = new PaintVisitor(g, mv);
-        for( OsmPrimitive p : primitives)
-        {
-            if( !p.deleted || !p.incomplete )
-                p.visit(v);
+        for (Object o : highlighted) {
+			if (o instanceof OsmPrimitive) {
+				v.visit((OsmPrimitive) o);
+			} else if (o instanceof WaySegment) {
+				v.visit((WaySegment) o);
+			}
         }
     }	
@@ -227,4 +223,10 @@
             this.mv = mv;
         }
+
+		public void visit(OsmPrimitive p) {
+            if (!p.deleted && !p.incomplete) {
+                p.visit(this);
+			}
+		}
 
         /**
@@ -278,5 +280,4 @@
         }
 
-
         
         /**
@@ -308,4 +309,13 @@
         }
 
+		public void visit(WaySegment ws) {
+			if (ws.lowerIndex < 0 || ws.lowerIndex >= ws.way.nodes.size()) return;
+			Node a = ws.way.nodes.get(ws.lowerIndex),
+				 b = ws.way.nodes.get(ws.lowerIndex + 1);
+			if (isSegmentVisible(a, b)) {
+				drawSegment(a, b, severity.getColor());
+			}
+		}
+
 		public void visit(Relation r)
 		{
Index: /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/CrossingWays.java
===================================================================
--- /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/CrossingWays.java	(revision 6301)
+++ /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/CrossingWays.java	(revision 6302)
@@ -87,8 +87,7 @@
 	                if( isCoastline1 != isCoastline2 ) continue;
 	                
-                    List<OsmPrimitive> primitives = new ArrayList<OsmPrimitive>();
-                    primitives.add(es1.ws.way);
-                    primitives.add(es2.ws.way);
-                    errors.add( new TestError(this, Severity.WARNING, tr("Crossing ways"), primitives) );
+                    errors.add(new TestError(this, Severity.WARNING, tr("Crossing ways"),
+						Arrays.asList(es1.ws.way, es2.ws.way),
+						Arrays.asList(es1.ws, es2.ws)));
 	            }
 	            segments.add(es1);
Index: /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/DuplicateNode.java
===================================================================
--- /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/DuplicateNode.java	(revision 6301)
+++ /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/DuplicateNode.java	(revision 6302)
@@ -68,5 +68,5 @@
 	public Command fixError(TestError testError)
 	{
-        Collection<OsmPrimitive> sel = testError.getPrimitives();
+        Collection<? extends OsmPrimitive> sel = testError.getPrimitives();
         Collection<OsmPrimitive> nodes = new ArrayList<OsmPrimitive>();
         
Index: /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/DuplicatedWayNodes.java
===================================================================
--- /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/DuplicatedWayNodes.java	(revision 6301)
+++ /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/DuplicatedWayNodes.java	(revision 6302)
@@ -11,4 +11,5 @@
 import org.openstreetmap.josm.command.ChangeCommand;
 import java.util.Collections;
+import java.util.Arrays;
 
 public class DuplicatedWayNodes extends Test {
@@ -28,5 +29,6 @@
 			}
 			if (lastN == n) {
-				errors.add(new TestError(this, Severity.ERROR, tr("Duplicated way nodes"), w));
+				errors.add(new TestError(this, Severity.ERROR, tr("Duplicated way nodes"),
+					Arrays.asList(w), Arrays.asList(n)));
 				break;
 			}
Index: /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java
===================================================================
--- /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java	(revision 6301)
+++ /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/OverlappingWays.java	(revision 6302)
@@ -4,8 +4,10 @@
 
 import java.util.List;
+import java.util.ArrayList;
 
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.WaySegment;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.tools.Pair;
@@ -23,5 +25,5 @@
 {
 	/** Bag of all way segments */
-	Bag<Pair<Node,Node>, OsmPrimitive> nodePairs;
+	Bag<Pair<Node,Node>, WaySegment> nodePairs;
 	
 	/**
@@ -40,5 +42,5 @@
 	public void startTest() 
 	{
-		nodePairs = new Bag<Pair<Node,Node>, OsmPrimitive>(1000);
+		nodePairs = new Bag<Pair<Node,Node>, WaySegment>(1000);
 	}
 
@@ -46,9 +48,12 @@
 	public void endTest() 
 	{
-		for (List<OsmPrimitive> duplicated : nodePairs.values())
+		for (List<WaySegment> duplicated : nodePairs.values())
 		{
 			if (duplicated.size() > 1)
 			{
-				errors.add( new TestError(this, Severity.OTHER, tr("Overlapping ways"), duplicated) );
+				List<OsmPrimitive> prims = new ArrayList<OsmPrimitive>();
+				for (WaySegment ws : duplicated) prims.add(ws.way);
+				errors.add(new TestError(this, Severity.OTHER,
+					tr("Overlapping ways"), prims, duplicated));
 			}
 		}
@@ -60,14 +65,13 @@
 	{
 		Node lastN = null;
+		int i = -2;
 		for (Node n : w.nodes) {
+			i++;
 			if (lastN == null) {
 				lastN = n;
 				continue;
 			}
-			if (n.hashCode() > lastN.hashCode()) {
-				nodePairs.add(new Pair<Node,Node>(lastN, n), w);
-			} else {
-				nodePairs.add(new Pair<Node,Node>(n, lastN), w);
-			}
+			nodePairs.add(Pair.sort(new Pair<Node,Node>(lastN, n)),
+				new WaySegment(w, i));
 			lastN = n;
 		}
Index: /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/SelfIntersectingWay.java
===================================================================
--- /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/SelfIntersectingWay.java	(revision 6301)
+++ /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/SelfIntersectingWay.java	(revision 6302)
@@ -4,4 +4,5 @@
 
 import java.util.HashSet;
+import java.util.Arrays;
 
 import org.openstreetmap.josm.data.osm.Way;
@@ -28,5 +29,6 @@
 			if (nodes.contains(n)) {
 				errors.add(new TestError(this,
-					Severity.WARNING, tr("Self-intersecting ways"), w, 0));
+					Severity.WARNING, tr("Self-intersecting ways"),
+					Arrays.asList(w), Arrays.asList(n)));
 				break;
 			} else {
Index: /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/SpellCheck.java
===================================================================
--- /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/SpellCheck.java	(revision 6301)
+++ /applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/SpellCheck.java	(revision 6302)
@@ -492,5 +492,5 @@
 		
 		int i = -1;
-		List<OsmPrimitive> primitives = testError.getPrimitives();
+		List<? extends OsmPrimitive> primitives = testError.getPrimitives();
 		for(OsmPrimitive p : primitives )
 		{
@@ -505,10 +505,10 @@
 				String value = prop.getValue();
 				if( value == null || value.trim().length() == 0 )
-					commands.add( new ChangePropertyCommand(primitives.subList(i, i+1), key, null) );
+					commands.add( new ChangePropertyCommand(Collections.singleton(primitives.get(i)), key, null) );
 				else
 				{
 					String replacementKey = spellCheckKeyData.get(key);
 					if( replacementKey != null )
-						commands.add( new ChangePropertyKeyCommand(primitives.subList(i, i+1), key, replacementKey) );					
+						commands.add( new ChangePropertyKeyCommand(Collections.singleton(primitives.get(i)), key, replacementKey) );					
 				}
 			}
