Index: trunk/src/org/openstreetmap/josm/corrector/ReverseWayNoTagCorrector.java
===================================================================
--- trunk/src/org/openstreetmap/josm/corrector/ReverseWayNoTagCorrector.java	(revision 9538)
+++ trunk/src/org/openstreetmap/josm/corrector/ReverseWayNoTagCorrector.java	(revision 9539)
@@ -6,10 +6,13 @@
 
 import java.util.Arrays;
+import java.util.Map;
 
 import javax.swing.JOptionPane;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.data.osm.TagCollection;
+import org.openstreetmap.josm.data.osm.Tagged;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
@@ -34,5 +37,5 @@
      * Tags that imply a semantic meaning from the way direction and cannot be changed.
      */
-    public static final TagCollection directionalTags = new TagCollection(Arrays.asList(new Tag[]{
+    private static final TagCollection directionalTags = new TagCollection(Arrays.asList(new Tag[]{
             new Tag("natural", "coastline"),
             new Tag("natural", "cliff"),
@@ -41,9 +44,4 @@
             new Tag("barrier", "retaining_wall"),
             new Tag("man_made", "embankment"),
-            new Tag("waterway", "stream"),
-            new Tag("waterway", "river"),
-            new Tag("waterway", "ditch"),
-            new Tag("waterway", "drain"),
-            new Tag("waterway", "canal")
     }));
 
@@ -53,6 +51,17 @@
      * @return tags that imply a semantic meaning from <code>way</code> direction and cannot be changed
      */
-    public static TagCollection getDirectionalTags(Way way) {
-        return directionalTags.intersect(TagCollection.from(way));
+    public static TagCollection getDirectionalTags(Tagged way) {
+        final TagCollection collection = new TagCollection();
+        for (Map.Entry<String, String> entry : way.getKeys().entrySet()) {
+            final Tag tag = new Tag(entry.getKey(), entry.getValue());
+            final boolean isDirectional = directionalTags.contains(tag) || OsmPrimitive.directionalKeyPredicate.evaluate(tag);
+            if (isDirectional) {
+                final boolean cannotBeCorrected = ReverseWayTagCorrector.getTagCorrections(tag).isEmpty();
+                if (cannotBeCorrected) {
+                    collection.add(tag);
+                }
+            }
+        }
+        return collection;
     }
 
@@ -63,16 +72,6 @@
      * @return false if the semantic meaning change if the way is reversed, true otherwise.
      */
-    public static boolean isReversible(Way way) {
+    public static boolean isReversible(Tagged way) {
         return getDirectionalTags(way).isEmpty();
-    }
-
-    protected static String getHTML(TagCollection tags) {
-        if (tags.size() == 1) {
-            return tags.iterator().next().toString();
-        } else if (tags.size() > 1) {
-            return Utils.joinAsHtmlUnorderedList(tags);
-        } else {
-            return "";
-        }
     }
 
@@ -89,5 +88,5 @@
                 tags.size(),
                 way.getDisplayName(DefaultNameFormatter.getInstance()),
-                getHTML(tags)
+                Utils.joinAsHtmlUnorderedList(tags)
             );
         int ret = ConditionalOptionPaneUtil.showOptionDialog(
Index: trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
===================================================================
--- trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java	(revision 9538)
+++ trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java	(revision 9539)
@@ -20,4 +20,5 @@
 import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.data.osm.TagCollection;
+import org.openstreetmap.josm.data.osm.Tagged;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.tools.UserCancelException;
@@ -202,8 +203,5 @@
     }
 
-    @Override
-    public Collection<Command> execute(Way oldway, Way way) throws UserCancelException {
-        Map<OsmPrimitive, List<TagCorrection>> tagCorrectionsMap = new HashMap<>();
-
+    static List<TagCorrection> getTagCorrections(Tagged way) {
         List<TagCorrection> tagCorrections = new ArrayList<>();
         for (String key : way.keySet()) {
@@ -225,9 +223,8 @@
             }
         }
-        if (!tagCorrections.isEmpty()) {
-            tagCorrectionsMap.put(way, tagCorrections);
-        }
-
-        Map<OsmPrimitive, List<RoleCorrection>> roleCorrectionMap = new HashMap<>();
+        return tagCorrections;
+    }
+
+    static List<RoleCorrection> getRoleCorrections(Way oldway) {
         List<RoleCorrection> roleCorrections = new ArrayList<>();
 
@@ -263,4 +260,17 @@
             }
         }
+        return roleCorrections;
+    }
+
+    @Override
+    public Collection<Command> execute(Way oldway, Way way) throws UserCancelException {
+        Map<OsmPrimitive, List<TagCorrection>> tagCorrectionsMap = new HashMap<>();
+        List<TagCorrection> tagCorrections = getTagCorrections(way);
+        if (!tagCorrections.isEmpty()) {
+            tagCorrectionsMap.put(way, tagCorrections);
+        }
+
+        Map<OsmPrimitive, List<RoleCorrection>> roleCorrectionMap = new HashMap<>();
+        List<RoleCorrection> roleCorrections = getRoleCorrections(oldway);
         if (!roleCorrections.isEmpty()) {
             roleCorrectionMap.put(way, roleCorrections);
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 9538)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 9539)
@@ -238,4 +238,11 @@
         @Override public boolean evaluate(OsmPrimitive primitive) {
             return true;
+        }
+    };
+
+    public static final Predicate<Tag> directionalKeyPredicate = new Predicate<Tag>() {
+        @Override
+        public boolean evaluate(Tag tag) {
+            return directionKeys.match(tag);
         }
     };
@@ -803,5 +810,5 @@
         String reversedDirectionDefault = "oneway=\"-1\"";
 
-        String directionDefault = "oneway? | (aerialway=* aerialway!=station) | "+
+        String directionDefault = "oneway? | (aerialway=* -aerialway=station) | "+
                 "waterway=stream | waterway=river | waterway=ditch | waterway=wadi | waterway=drain | "+
                 "\"piste:type\"=downhill | \"piste:type\"=sled | man_made=\"piste:halfpipe\" | "+
