Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 856)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 857)
@@ -157,12 +157,12 @@
 					if(w.selected)
 					{
-						if(showDirection || virtualNodeSize != 0)
-							drawSeg(lastN, n, selectedColor, showDirection, width, false, false);
+						if(showDirection)
+							drawSeg(lastN, n, selectedColor, showDirection, width, dashed, false);
 					}
 					else
-						drawSeg(lastN, n, untaggedColor, showDirection, width, dashed, true);
+						drawSeg(lastN, n, colour, showDirection, width, dashed, true);
 				}
 				else
-					drawSeg(lastN, n, w.selected ? selectedColor : colour, showDirection, width, true, true);
+					drawSeg(lastN, n, w.selected ? selectedColor : colour, showDirection, width, dashed, true);
 			} else {
 				if (realWidth > 0 && useRealWidth && !showDirection) {
@@ -244,5 +244,4 @@
 			return;
 		}
-		drawVirtualNode(p1, p2, col);
 		if(drawway)
 		{
@@ -340,4 +339,13 @@
 			if (!osm.incomplete && !osm.deleted)
 				osm.visit(this);
+
+		if(virtualNodeSize != 0)
+		{
+			currentColor = nodeColor;
+			for (final OsmPrimitive osm : data.ways)
+				if (!osm.deleted)
+					visitVirtual((Way)osm);
+			displaySegments(null);
+		}
 	}
 
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 856)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 857)
@@ -134,12 +134,20 @@
 		displaySegments(null);
 
+		for (final OsmPrimitive osm : data.getSelected())
+			if (!osm.deleted)
+				osm.visit(this);
+		displaySegments(null);
+
 		for (final OsmPrimitive osm : data.nodes)
 			if (!osm.deleted && !osm.selected)
 				osm.visit(this);
-
-		for (final OsmPrimitive osm : data.getSelected())
-			if (!osm.deleted)
-				osm.visit(this);
-		displaySegments(null);
+		if(virtualNodeSize != 0)
+		{
+			currentColor = nodeColor;
+			for (final OsmPrimitive osm : data.ways)
+				if (!osm.deleted)
+					visitVirtual((Way)osm);
+			displaySegments(null);
+		}
 	}
 
@@ -161,4 +169,30 @@
 		else
 			drawNode(n, nodeColor, unselectedNodeSize, unselectedNodeRadius, fillUnselectedNode);
+	}
+
+	public void visitVirtual(Way w) {
+		Iterator<Node> it = w.nodes.iterator();
+		if (it.hasNext()) {
+			Point lastP = nc.getPoint(it.next().eastNorth);
+			while(it.hasNext())
+			{
+				Point p = nc.getPoint(it.next().eastNorth);
+				if(isSegmentVisible(lastP, p))
+				{
+					int xd = p.x-lastP.x; if(xd < 0) xd = -xd;
+					int yd = p.y-lastP.y; if(yd < 0) yd = -yd;
+					if(xd+yd > virtualNodeSpace)
+					{
+						int x = (p.x+lastP.x)/2;
+						int y = (p.y+lastP.y)/2;
+						currentPath.moveTo(x-5, y);
+						currentPath.lineTo(x+5, y);
+						currentPath.moveTo(x, y-5);
+						currentPath.lineTo(x, y+5);
+					}
+				}
+				lastP = p;
+			}
+		}
 	}
 
@@ -282,22 +316,4 @@
 	}
 
-	protected void drawVirtualNode(Point p1, Point p2, Color col)
-	{
-		if(virtualNodeSize > 0)
-		{
-			int xd = p2.x-p1.x; if(xd < 0) xd = -xd;
-			int yd = p2.y-p1.y; if(yd < 0) yd = -yd;
-			if(xd+yd > virtualNodeSpace)
-			{
-				int x = (p1.x+p2.x)/2;
-				int y = (p1.y+p2.y)/2;
-				currentPath.moveTo(x-5, y);
-				currentPath.lineTo(x+5, y);
-				currentPath.moveTo(x, y-5);
-				currentPath.lineTo(x, y+5);
-			}
-		}
-	}
-
 	/**
 	 * Draw a line with the given color.
@@ -308,6 +324,4 @@
 
 		if (isSegmentVisible(p1, p2)) {
-			drawVirtualNode(p1, p2, col);
-
 			currentPath.moveTo(p1.x, p1.y);
 			currentPath.lineTo(p2.x, p2.y);
