Index: src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 1263)
+++ src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(working copy)
@@ -63,6 +63,7 @@
     protected Color backgroundColor;
     protected boolean showDirectionArrow;
     protected boolean showRelevantDirectionsOnly;
+    protected boolean showHeadArrowOnly;
     protected boolean showOrderNumber;
     protected boolean fillSelectedNode;
     protected boolean fillUnselectedNode;
@@ -100,6 +101,7 @@
     protected void getSettings(Boolean virtual) {
         showDirectionArrow = Main.pref.getBoolean("draw.segment.direction", true);
         showRelevantDirectionsOnly = Main.pref.getBoolean("draw.segment.relevant_directions_only", true);
+        showHeadArrowOnly = Main.pref.getBoolean("draw.segment.head_only", false);
         showOrderNumber = Main.pref.getBoolean("draw.segment.order_number", false);
         selectedNodeRadius = Main.pref.getInteger("mappaint.node.selected-size", 5) / 2;
         selectedNodeSize = selectedNodeRadius * 2;
@@ -291,6 +293,9 @@
 
         boolean showThisDirectionArrow = w.selected
         || (showDirectionArrow && (!showRelevantDirectionsOnly || w.hasDirectionKeys));
+        // head only takes over control if the option is true,
+        // the direction should be shown at all and not only because it's selected
+        boolean showOnlyHeadArrowOnly = showThisDirectionArrow && !w.selected && showHeadArrowOnly;
         Color wayColor;
 
         if (inactive) {
@@ -306,7 +311,8 @@
             Point lastP = nc.getPoint(it.next().eastNorth);
             for (int orderNumber = 1; it.hasNext(); orderNumber++) {
                 Point p = nc.getPoint(it.next().eastNorth);
-                drawSegment(lastP, p, w.selected && !inactive ? selectedColor : wayColor, showThisDirectionArrow);
+                drawSegment(lastP, p, w.selected && !inactive ? selectedColor : wayColor, 
+                    showOnlyHeadArrowOnly ? !it.hasNext() : showThisDirectionArrow);
                 if (showOrderNumber)
                     drawOrderNumber(lastP, p, orderNumber);
                 lastP = p;
Index: src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 1263)
+++ src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(working copy)
@@ -16,6 +16,7 @@
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.Locale;
+import java.util.Iterator;
 
 import javax.swing.ImageIcon;
 
@@ -196,6 +197,9 @@
         // (even if the tag is negated as in oneway=false) or the way is selected
         boolean showDirection = w.selected || ((!useRealWidth) && (showDirectionArrow
         && (!showRelevantDirectionsOnly || w.hasDirectionKeys)));
+        // head only takes over control if the option is true,
+        // the direction should be shown at all and not only because it's selected
+        boolean showOnlyHeadArrowOnly = showDirection && !w.selected && showHeadArrowOnly;
         int width = defaultSegmentWidth;
         int realWidth = 0; //the real width of the element in meters
         boolean dashed = false;
@@ -241,10 +245,13 @@
 
         // draw the way
         lastN = null;
-        for(Node n : w.nodes)
+        Iterator<Node> it = w.nodes.iterator();
+        while (it.hasNext())
         {
+            Node n = it.next();
             if(lastN != null)
-                drawSeg(lastN, n, color, showDirection, width, dashed);
+                drawSeg(lastN, n, color,
+                    showOnlyHeadArrowOnly ? !it.hasNext() : showDirection, width, dashed);
             lastN = n;
         }
 
Index: src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java	(revision 1263)
+++ src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java	(working copy)
@@ -31,6 +31,7 @@
     private JCheckBox drawGpsArrowsFast = new JCheckBox(tr("Fast drawing (looks uglier)"));
     private JTextField drawGpsArrowsMinDist = new JTextField(8);
     private JCheckBox interestingDirections = new JCheckBox(tr("Only interesting direction hints (e.g. with oneway tag)."));
+    private JCheckBox headArrow = new JCheckBox(tr("Only on the head of a way."));
     private JCheckBox segmentOrderNumber = new JCheckBox(tr("Draw segment order numbers"));
     private JCheckBox sourceBounds = new JCheckBox(tr("Draw boundaries of downloaded data"));
     private JCheckBox virtualNodes = new JCheckBox(tr("Draw virtual nodes in select mode"));
@@ -116,12 +117,15 @@
         // directionHint
         directionHint.addActionListener(new ActionListener(){
             public void actionPerformed(ActionEvent e) {
-                            if (directionHint.isSelected()){
-                                interestingDirections.setSelected(Main.pref.getBoolean("draw.segment.relevant_directions_only", true));
-                            }else{
-                                interestingDirections.setSelected(false);
-                            }
-                            interestingDirections.setEnabled(directionHint.isSelected());
+                if (directionHint.isSelected()){
+                    interestingDirections.setSelected(Main.pref.getBoolean("draw.segment.relevant_directions_only", true));
+                    headArrow.setSelected(Main.pref.getBoolean("draw.segment.head_only", false));
+                }else{
+                    interestingDirections.setSelected(false);
+                    headArrow.setSelected(false);
+                }
+                interestingDirections.setEnabled(directionHint.isSelected());
+                headArrow.setEnabled(directionHint.isSelected());
             }
         });
         directionHint.setToolTipText(tr("Draw direction hints for way segments."));
@@ -134,6 +138,12 @@
         interestingDirections.setEnabled(directionHint.isSelected());
         panel.add(interestingDirections, GBC.eop().insets(40,0,0,0));
 
+        // only on the head of a way
+        headArrow.setToolTipText(tr("Only on the head of a way."));
+        headArrow.setSelected(Main.pref.getBoolean("draw.segment.head_only", false));
+        headArrow.setEnabled(directionHint.isSelected());
+        panel.add(headArrow, GBC.eop().insets(40, 0, 0, 0));
+
         // segment order number
         segmentOrderNumber.setToolTipText(tr("Draw the order numbers of all segments within their way."));
         segmentOrderNumber.setSelected(Main.pref.getBoolean("draw.segment.order_number", false));
@@ -176,6 +186,7 @@
         Main.pref.put("draw.rawgps.large", largeGpsPoints.isSelected());
         Main.pref.put("draw.segment.direction", directionHint.isSelected());
         Main.pref.put("draw.segment.relevant_directions_only", interestingDirections.isSelected());
+        Main.pref.put("draw.segment.head_only", headArrow.isSelected());
         Main.pref.put("draw.segment.order_number", segmentOrderNumber.isSelected());
         Main.pref.put("draw.data.downloaded_area", sourceBounds.isSelected());
         Main.pref.put("draw.data.inactive_color", inactive.isSelected());
