Index: trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 596)
+++ trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 597)
@@ -241,4 +241,5 @@
 				wayToAdd.keys = new HashMap<String, String>(selectedWay.keys);
 				wayToAdd.checkTagged();
+                                wayToAdd.checkDirectionTagged();
 			}
 			wayToAdd.nodes.addAll(chunkIt.next());
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 596)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 597)
@@ -264,4 +264,5 @@
 				wnew2.keys = new HashMap<String, String>(wnew.keys);
 				wnew2.checkTagged();
+                                wnew2.checkDirectionTagged();
 			}
 			wnew2.nodes.addAll(n2);
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 596)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 597)
@@ -83,4 +83,9 @@
 	
 	/**
+	 * true if this object has direction dependant tags (e.g. oneway)
+	 */
+	public boolean hasDirectionKeys = false;
+	
+	/**
 	 * If set to true, this object is currently selected.
 	 */
@@ -112,4 +117,11 @@
 	public static Collection<String> uninteresting = 
 		new HashSet<String>(Arrays.asList(new String[] {"source", "note", "created_by"}));
+	
+	/**
+	 * Contains a list of direction-dependent keys that do not make an object
+	 * direction dependent.
+	 */
+	public static Collection<String> directionKeys = 
+		new HashSet<String>(Arrays.asList(new String[] {"oneway", "incline", "incline_steep", "aerialway"}));
 	
 	/**
@@ -186,4 +198,5 @@
 		}
 		checkTagged();
+                checkDirectionTagged();
 	}
 	/**
@@ -197,4 +210,5 @@
 		}
 		checkTagged();
+                checkDirectionTagged();
 	}
 
@@ -266,4 +280,20 @@
 		}
 	}
+    /**
+     * Updates the "hasDirectionKeys" flag. "keys" property should probably be made private
+     * to make sure this gets called when keys are set.
+     */
+    public void checkDirectionTagged() {
+        hasDirectionKeys = false;
+        if (keys != null) {
+            for (Entry<String,String> e : keys.entrySet()) {
+                if (directionKeys.contains(e.getKey())) {
+                    hasDirectionKeys = true;
+                    break;
+                }
+            }
+        }
+
+    }
 	
 }
Index: trunk/src/org/openstreetmap/josm/data/osm/Way.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 596)
+++ trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 597)
@@ -53,5 +53,5 @@
 	 */
 	public Way(Way clone) {
-		cloneFrom(clone);
+            cloneFrom(clone);            
 	}
 	
@@ -75,4 +75,5 @@
 		nodes.clear();
 		nodes.addAll(((Way)osm).nodes);
+                checkDirectionTagged();
 	}
 
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 596)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 597)
@@ -75,4 +75,5 @@
 	protected Color backgroundColor;
 	protected boolean showDirectionArrow;
+    protected boolean showRelevantDirectionsOnly;
 	protected boolean showOrderNumber;
 	
@@ -136,11 +137,15 @@
 	public void visit(Way w) {
 		double circum = Main.map.mapView.getScale()*100*Main.proj.scaleFactor()*40041455; // circumference of the earth in meter
-		boolean showDirection = showDirectionArrow && w.selected;
-		if (useRealWidth && showDirection) showDirection = false;
+                // show direction arrows, if draw.segment.relevant_directions_only is not set, the way is tagged with a direction key
+                // (even if the tag is negated as in oneway=false) or the way is selected
+		boolean showDirection = (!useRealWidth)
+                                        && (w.selected || (showDirectionArrow
+                                                           && (!showRelevantDirectionsOnly || w.hasDirectionKeys)));
+
 		Color colour = untaggedColor;
 		int width = 2;
 		int realWidth = 0; //the real width of the element in meters 
 		boolean dashed = false;
-		boolean area=false;
+		boolean area = false;
 		ElemStyle wayStyle = MapPaintStyles.getStyle(w);
 
@@ -352,4 +357,5 @@
 		textColor = getPreferencesColor ("text", Color.WHITE);
 		showDirectionArrow = Main.pref.getBoolean("draw.segment.direction");
+		showRelevantDirectionsOnly = Main.pref.getBoolean("draw.segment.relevant_directions_only");
 		showOrderNumber = Main.pref.getBoolean("draw.segment.order_number");
 		useRealWidth = Main.pref.getBoolean("mappaint.useRealWidth",false);
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 596)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 597)
@@ -54,5 +54,6 @@
 	protected Color incompleteColor;
 	protected Color backgroundColor;
-	protected boolean showDirectionArrow;
+    protected boolean showDirectionArrow;
+    protected boolean showRelevantDirectionsOnly;
 	protected boolean showOrderNumber;
 	
@@ -75,4 +76,5 @@
 		backgroundColor = getPreferencesColor("background", Color.BLACK);
 		showDirectionArrow = Main.pref.getBoolean("draw.segment.direction");
+		showRelevantDirectionsOnly = Main.pref.getBoolean("draw.segment.relevant_directions_only");
 		showOrderNumber = Main.pref.getBoolean("draw.segment.order_number");
 		
@@ -126,4 +128,10 @@
 		if (w.incomplete) return;
 
+                // show direction arrows, if draw.segment.relevant_directions_only is not set, the way is tagged with a direction key
+                // (even if the tag is negated as in oneway=false) or the way is selected
+
+                boolean showThisDirectionArrow = w.selected
+                                                 || (showDirectionArrow
+                                                     && (!showRelevantDirectionsOnly || w.hasDirectionKeys));
 		Color wayColor;
 		
@@ -141,5 +149,5 @@
 			for (int orderNumber = 1; it.hasNext(); orderNumber++) {
 				Point p = nc.getPoint(it.next().eastNorth);
-				drawSegment(lastP, p, w.selected && !inactive ? selectedColor : wayColor, showDirectionArrow || w.selected);
+				drawSegment(lastP, p, w.selected && !inactive ? selectedColor : wayColor, showThisDirectionArrow);
 				if (showOrderNumber)
 					drawOrderNumber(lastP, p, orderNumber);
Index: trunk/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java	(revision 596)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java	(revision 597)
@@ -18,4 +18,5 @@
 	private JCheckBox largeGpsPoints = new JCheckBox(tr("Draw large GPS points."));
 	private JCheckBox directionHint = new JCheckBox(tr("Draw Direction Arrows"));
+	private JCheckBox interestingDirections = new JCheckBox(tr("Only interesting direction hints (e.g. with oneway tag)."));
 	private JCheckBox segmentOrderNumber = new JCheckBox(tr("Draw segment order numbers"));
 	private JCheckBox sourceBounds = new JCheckBox(tr("Draw boundaries of downloaded data"));
@@ -47,7 +48,23 @@
 		
 		// directionHint
-		directionHint.setToolTipText(tr("Draw direction hints for all segments."));
+		directionHint.addActionListener(new ActionListener(){
+			public void actionPerformed(ActionEvent e) {
+                            if (directionHint.isSelected()){
+                                interestingDirections.setSelected(Main.pref.getBoolean("draw.segment.relevant_directions_only"));
+                            }else{
+                                interestingDirections.setSelected(false);
+                            }
+                            interestingDirections.setEnabled(directionHint.isSelected());
+			}
+		});
+		directionHint.setToolTipText(tr("Draw direction hints for segments."));
 		directionHint.setSelected(Main.pref.getBoolean("draw.segment.direction"));
 		gui.display.add(directionHint, GBC.eop().insets(20,0,0,0));
+
+		// only interesting directions
+		interestingDirections.setToolTipText(tr("Only interesting direction hints (e.g. with oneway tag)."));
+		interestingDirections.setSelected(Main.pref.getBoolean("draw.segment.relevant_directions_only"));
+		interestingDirections.setEnabled(directionHint.isSelected());
+		gui.display.add(interestingDirections, GBC.eop().insets(40,0,0,0));
 		
 		// segment order number
@@ -72,4 +89,5 @@
 		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.order_number", segmentOrderNumber.isSelected());
 		Main.pref.put("draw.data.downloaded_area", sourceBounds.isSelected());
Index: trunk/src/org/openstreetmap/josm/io/OsmReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmReader.java	(revision 596)
+++ trunk/src/org/openstreetmap/josm/io/OsmReader.java	(revision 597)
@@ -86,4 +86,5 @@
 			osm.visible = visible;
 			osm.checkTagged();
+                        osm.checkDirectionTagged();
 		}
 	}
