Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/ArrowPaintHelper.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/ArrowPaintHelper.java	(revision 12153)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/ArrowPaintHelper.java	(revision 12154)
@@ -49,3 +49,12 @@
         }
     }
+
+    /**
+     * Gets the length of the arrow along the line segment.
+     * @return the length along the line
+     * @since 12154
+     */
+    public double getOnLineLength() {
+        return length * cos;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 12153)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 12154)
@@ -1222,4 +1222,8 @@
         Iterator<MapViewPoint> it = new OffsetIterator(mapState, wayNodes, offset);
         boolean initialMoveToNeeded = true;
+        ArrowPaintHelper drawArrowHelper = null;
+        if (showOrientation) {
+            drawArrowHelper = new ArrowPaintHelper(PHI, 10 + line.getLineWidth());
+        }
         while (it.hasNext()) {
             MapViewPoint p = it.next();
@@ -1235,8 +1239,16 @@
 
                 /* draw arrow */
-                if (showHeadArrowOnly ? !it.hasNext() : showOrientation) {
-                    //TODO: Cache
-                    ArrowPaintHelper drawHelper = new ArrowPaintHelper(PHI, 10 + line.getLineWidth());
-                    drawHelper.paintArrowAt(orientationArrows, p2, p1);
+                if (drawArrowHelper != null) {
+                    boolean drawArrow;
+                    if (showHeadArrowOnly) {
+                        // always draw last arrow - no matter how short the segment is
+                        drawArrow = !it.hasNext();
+                    } else {
+                        // draw arrows in between only if there is enough space
+                        drawArrow = p1.distanceToInView(p2) > drawArrowHelper.getOnLineLength() * 1.3;
+                    }
+                    if (drawArrow) {
+                        drawArrowHelper.paintArrowAt(orientationArrows, p2, p1);
+                    }
                 }
             }
