Index: /src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java
===================================================================
--- /src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 220)
+++ /src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 221)
@@ -4,4 +4,6 @@
 import java.awt.Graphics;
 import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.geom.Line2D;
 
 import org.openstreetmap.josm.Main;
@@ -68,5 +70,5 @@
 	 */
 	public void visit(Segment ls) {
-		drawSegment(ls, getPreferencesColor("segment", darkgreen));
+		drawSegment(ls, getPreferencesColor("segment", darkgreen), Main.pref.getBoolean("draw.segment.direction"));
 	}
 
@@ -85,10 +87,12 @@
 		}
 
+		boolean showDirectionArrow = Main.pref.getBoolean("draw.segment.direction");
+		boolean showOrderNumber = Main.pref.getBoolean("draw.segment.order_number");
 		int orderNumber = 0;
 		for (Segment ls : w.segments) {
 			orderNumber++;
 			if (!ls.selected) // selected already in good color
-				drawSegment(ls, w.selected ? getPreferencesColor("selected", Color.WHITE) : wayColor);
-			if (!ls.incomplete && Main.pref.getBoolean("draw.segment.order_number"))
+				drawSegment(ls, w.selected ? getPreferencesColor("selected", Color.WHITE) : wayColor, showDirectionArrow);
+			if (!ls.incomplete && showOrderNumber)
 				drawOrderNumber(ls, orderNumber);
 		}
@@ -104,9 +108,13 @@
 		int x = (p1.x+p2.x)/2 - 4*strlen;
 		int y = (p1.y+p2.y)/2 + 4;
-		Color c = g.getColor();
-		g.setColor(Color.black);
-		g.fillRect(x-1,y-12,8*strlen+1,14);
-		g.setColor(c);
-		g.drawString(""+orderNumber,x,y);
+
+		Rectangle screen = g.getClipBounds();
+		if (screen.contains(x,y)) {
+			Color c = g.getColor();
+			g.setColor(getPreferencesColor("background", Color.BLACK));
+			g.fillRect(x-1, y-12, 8*strlen+1, 14);
+			g.setColor(c);
+			g.drawString(""+orderNumber, x, y);
+		}
     }
 
@@ -120,5 +128,8 @@
 		Point p = nc.getPoint(n.eastNorth);
 		g.setColor(color);
-		g.drawRect(p.x-1, p.y-1, 2, 2);
+		Rectangle screen = g.getClipBounds();
+
+		if ( screen.contains(p.x, p.y) )
+			g.drawRect(p.x-1, p.y-1, 2, 2);
 	}
 
@@ -126,5 +137,5 @@
 	 * Draw a line with the given color.
 	 */
-	protected void drawSegment(Segment ls, Color col) {
+	protected void drawSegment(Segment ls, Color col, boolean showDirection) {
 		if (ls.incomplete)
 			return;
@@ -134,10 +145,16 @@
 		Point p1 = nc.getPoint(ls.from.eastNorth);
 		Point p2 = nc.getPoint(ls.to.eastNorth);
-		g.drawLine(p1.x, p1.y, p2.x, p2.y);
-
-		if (Main.pref.getBoolean("draw.segment.direction")) {
-			double t = Math.atan2(p2.y-p1.y, p2.x-p1.x) + Math.PI;
-	        g.drawLine(p2.x,p2.y, (int)(p2.x + 10*Math.cos(t-PHI)), (int)(p2.y + 10*Math.sin(t-PHI)));
-	        g.drawLine(p2.x,p2.y, (int)(p2.x + 10*Math.cos(t+PHI)), (int)(p2.y + 10*Math.sin(t+PHI)));
+		
+		Rectangle screen = g.getClipBounds();
+		Line2D line = new Line2D.Double(p1.x, p1.y, p2.x, p2.y);
+		if (screen.contains(p1.x, p1.y, p2.x, p2.y) || screen.intersectsLine(line))
+		{
+			g.drawLine(p1.x, p1.y, p2.x, p2.y);
+	
+			if (showDirection) {
+				double t = Math.atan2(p2.y-p1.y, p2.x-p1.x) + Math.PI;
+		        g.drawLine(p2.x,p2.y, (int)(p2.x + 10*Math.cos(t-PHI)), (int)(p2.y + 10*Math.sin(t-PHI)));
+		        g.drawLine(p2.x,p2.y, (int)(p2.x + 10*Math.cos(t+PHI)), (int)(p2.y + 10*Math.sin(t+PHI)));
+			}
 		}
 	}
