Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 859)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 860)
@@ -30,4 +30,5 @@
 import org.openstreetmap.josm.data.osm.WaySegment;
 import org.openstreetmap.josm.data.osm.visitor.AllNodesVisitor;
+import org.openstreetmap.josm.data.osm.visitor.SimplePaintVisitor;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.MapView;
@@ -240,7 +241,5 @@
 					Point p1 = c.getPoint(w.nodes.get(nearestWaySeg.lowerIndex).eastNorth);
 					Point p2 = c.getPoint(w.nodes.get(nearestWaySeg.lowerIndex+1).eastNorth);
-					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 > Main.pref.getInteger("mappaint.node.virtual-space", 70))
+					if(SimplePaintVisitor.isLargeSegment(p1, p2, Main.pref.getInteger("mappaint.node.virtual-space", 70)))
 					{
 						Point pc = new Point((p1.x+p2.x)/2, (p1.y+p2.y)/2);
Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 859)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 860)
@@ -357,16 +357,5 @@
 		Point p1 = nc.getPoint(n1.eastNorth);
 		Point p2 = nc.getPoint(n2.eastNorth);
-		if (!isSegmentVisible(p1, p2)) {
-			return;
-		}
-		int strlen = (""+orderNumber).length();
-		int x = (p1.x+p2.x)/2 - 4*strlen;
-		int y = (p1.y+p2.y)/2 + 4;
-
-		Color c = g.getColor();
-		g.setColor(backgroundColor);
-		g.fillRect(x-1, y-12, 8*strlen+1, 14);
-		g.setColor(c);
-		g.drawString(""+orderNumber, x, y);
+		drawOrderNumber(p1, p2, orderNumber);
 	}
 }
Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 859)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 860)
@@ -75,4 +75,5 @@
 	protected int virtualNodeSize;
 	protected int virtualNodeSpace;
+	protected int segmentNumberSpace;
 	protected int taggedNodeRadius;
 	protected int taggedNodeSize;
@@ -109,4 +110,5 @@
 		virtualNodeSize = virtual ? Main.pref.getInteger("mappaint.node.virtual-size", 4) / 2 : 0;
 		virtualNodeSpace = Main.pref.getInteger("mappaint.node.virtual-space", 70);
+		segmentNumberSpace = Main.pref.getInteger("mappaint.segmentnumber.space", 40);
 
 		((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
@@ -171,4 +173,11 @@
 	}
 
+	public static Boolean isLargeSegment(Point p1, Point p2, int space)
+	{
+		int xd = p1.x-p2.x; if(xd < 0) xd = -xd;
+		int yd = p1.y-p2.y; if(yd < 0) yd = -yd;
+		return (xd+yd > space);
+	}
+
 	public void visitVirtual(Way w) {
 		Iterator<Node> it = w.nodes.iterator();
@@ -178,17 +187,12 @@
 			{
 				Point p = nc.getPoint(it.next().eastNorth);
-				if(isSegmentVisible(lastP, p))
+				if(isSegmentVisible(lastP, p) && isLargeSegment(lastP, p, virtualNodeSpace))
 				{
-					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);
-					}
+					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,14 +286,21 @@
 	 */
 	protected void drawOrderNumber(Point p1, Point p2, int orderNumber) {
-		int strlen = (""+orderNumber).length();
-		int x = (p1.x+p2.x)/2 - 4*strlen;
-		int y = (p1.y+p2.y)/2 + 4;
-
-		if (isSegmentVisible(p1, p2)) {
+		if (isSegmentVisible(p1, p2) && isLargeSegment(p1, p2, segmentNumberSpace)) {
+			String on = Integer.toString(orderNumber);
+			int strlen = on.length();
+			int x = (p1.x+p2.x)/2 - 4*strlen;
+			int y = (p1.y+p2.y)/2 + 4;
+
+			if(virtualNodeSize != 0 && isLargeSegment(p1, p2, virtualNodeSpace))
+			{
+				y = (p1.y+p2.y)/2 - virtualNodeSize - 3;
+			}
+
+			displaySegments(currentColor); // draw nodes on top!
 			Color c = g.getColor();
 			g.setColor(backgroundColor);
 			g.fillRect(x-1, y-12, 8*strlen+1, 14);
 			g.setColor(c);
-			g.drawString(""+orderNumber, x, y);
+			g.drawString(on, x, y);
 		}
 	}
Index: /trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 859)
+++ /trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 860)
@@ -188,4 +188,6 @@
 				double perDist = a-(a-b+c)*(a-b+c)/4/c; // perpendicular distance squared
 				if (perDist < snapDistance && a < c+snapDistance && b < c+snapDistance) {
+					if(w.selected) // prefer selected ways a little bit
+						perDist -= 0.00001;
 					List<WaySegment> l;
 					if (nearest.containsKey(perDist)) {
