Index: trunk/src/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommand.java	(revision 2682)
+++ trunk/src/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommand.java	(revision 2683)
@@ -50,4 +50,5 @@
 
         oldRole = relation.getMember(position).getRole();
+        if (newRole.equals(oldRole)) return true;
         relation.setMember(position, new RelationMember(newRole, relation.getMember(position).getMember()));
 
@@ -58,5 +59,5 @@
 
     @Override public void undoCommand() {
-        relation.getMember(position).getRole().equals(oldRole);
+        relation.setMember(position, new RelationMember(oldRole, relation.getMember(position).getMember()));
         relation.setModified(oldModified);
     }
Index: trunk/src/org/openstreetmap/josm/command/Command.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/Command.java	(revision 2682)
+++ trunk/src/org/openstreetmap/josm/command/Command.java	(revision 2683)
@@ -92,5 +92,8 @@
     public void undoCommand() {
         for (Entry<OsmPrimitive, PrimitiveData> e : cloneMap.entrySet()) {
-            e.getKey().load(e.getValue());
+            OsmPrimitive primitive = e.getKey();
+            if (primitive.getDataSet() != null) {
+                e.getKey().load(e.getValue());
+            }
         }
     }
Index: trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
===================================================================
--- trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java	(revision 2682)
+++ trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java	(revision 2683)
@@ -5,4 +5,5 @@
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
@@ -68,15 +69,12 @@
     };
 
+    private static ArrayList<String> reversibleTags = new ArrayList<String>(
+            Arrays.asList(new String[] {"oneway", "incline"}));
+
     public static boolean isReversible(Way way) {
-        ArrayList<OsmPrimitive> primitives = new ArrayList<OsmPrimitive>();
-        primitives.add(way);
-        primitives.addAll(way.getNodes());
-
-        for  (OsmPrimitive primitive : primitives) {
-            for (String key : primitive.keySet()) {
-                if (key.equals("oneway")) return false;
-                for (PrefixSuffixSwitcher prefixSuffixSwitcher : prefixSuffixSwitchers) {
-                    if (!key.equals(prefixSuffixSwitcher.apply(key))) return false;
-                }
+        for (String key : way.keySet()) {
+            if (reversibleTags.contains(key)) return false;
+            for (PrefixSuffixSwitcher prefixSuffixSwitcher : prefixSuffixSwitchers) {
+                if (!key.equals(prefixSuffixSwitcher.apply(key))) return false;
             }
         }
@@ -95,4 +93,14 @@
     }
 
+    public String invertNumber(String value) {
+        Pattern pattern = Pattern.compile("^([+-]?)(\\d.*)$", Pattern.CASE_INSENSITIVE);
+        Matcher matcher = pattern.matcher(value);
+        if (!matcher.matches()) return value;
+        String sign = matcher.group(1);
+        String rest = matcher.group(2);
+        sign = sign.equals("-") ? "" : "-";
+        return sign + rest;
+    }
+
     @Override
     public Collection<Command> execute(Way oldway, Way way) throws UserCancelException {
@@ -100,44 +108,42 @@
             new HashMap<OsmPrimitive, List<TagCorrection>>();
 
-        ArrayList<OsmPrimitive> primitives = new ArrayList<OsmPrimitive>();
-        primitives.add(way);
-        primitives.addAll(way.getNodes());
+        ArrayList<TagCorrection> tagCorrections = new ArrayList<TagCorrection>();
+        for (String key : way.keySet()) {
+            String newKey = key;
+            String value = way.get(key);
+            String newValue = value;
 
-        for (OsmPrimitive primitive : primitives) {
-            tagCorrectionsMap.put(primitive, new ArrayList<TagCorrection>());
-
-            for (String key : primitive.keySet()) {
-                String newKey = key;
-                String value = primitive.get(key);
-                String newValue = value;
-
-                if (key.equals("oneway")) {
-                    if (OsmUtils.isReversed(value)) {
-                        newValue = OsmUtils.trueval;
-                    } else {
-                        Boolean boolValue = OsmUtils.getOsmBoolean(value);
-                        if (boolValue != null && boolValue.booleanValue()) {
-                            newValue = OsmUtils.reverseval;
-                        }
-                    }
-                } else {
-                    for (PrefixSuffixSwitcher prefixSuffixSwitcher : prefixSuffixSwitchers) {
-                        newKey = prefixSuffixSwitcher.apply(key);
-                        if (!key.equals(newKey)) {
-                            break;
-                        }
+            if (key.equals("oneway")) {
+                if (OsmUtils.isReversed(value)) {
+                    newValue = OsmUtils.trueval;
+                } else if (OsmUtils.isTrue(value)) {
+                    newValue = OsmUtils.reverseval;
+                }
+            } else if (key.equals("incline")) {
+                PrefixSuffixSwitcher switcher = new PrefixSuffixSwitcher("up", "down");
+                newValue = switcher.apply(value);
+                if (newValue.equals(value)) {
+                    newValue = invertNumber(value);
+                }
+            } else {
+                for (PrefixSuffixSwitcher prefixSuffixSwitcher : prefixSuffixSwitchers) {
+                    newKey = prefixSuffixSwitcher.apply(key);
+                    if (!key.equals(newKey)) {
+                        break;
                     }
                 }
+            }
 
-                if (!key.equals(newKey) || !value.equals(newValue)) {
-                    tagCorrectionsMap.get(primitive).add(
-                            new TagCorrection(key, value, newKey, newValue));
-                }
+            if (!key.equals(newKey) || !value.equals(newValue)) {
+                tagCorrections.add(new TagCorrection(key, value, newKey, newValue));
             }
+        }
+        if (!tagCorrections.isEmpty()) {
+            tagCorrectionsMap.put(way, tagCorrections);
         }
 
         Map<OsmPrimitive, List<RoleCorrection>> roleCorrectionMap =
             new HashMap<OsmPrimitive, List<RoleCorrection>>();
-        roleCorrectionMap.put(way, new ArrayList<RoleCorrection>());
+        ArrayList<RoleCorrection> roleCorrections = new ArrayList<RoleCorrection>();
 
         Collection<OsmPrimitive> referrers = oldway.getReferrers();
@@ -166,10 +172,12 @@
 
                 if (found) {
-                    roleCorrectionMap.get(way).add(
-                            new RoleCorrection(relation, position, member, newRole));
+                    roleCorrections.add(new RoleCorrection(relation, position, member, newRole));
                 }
 
                 position++;
             }
+        }
+        if (!roleCorrections.isEmpty()) {
+            roleCorrectionMap.put(way, roleCorrections);
         }
 
Index: trunk/src/org/openstreetmap/josm/corrector/TagCorrector.java
===================================================================
--- trunk/src/org/openstreetmap/josm/corrector/TagCorrector.java	(revision 2682)
+++ trunk/src/org/openstreetmap/josm/corrector/TagCorrector.java	(revision 2683)
@@ -50,23 +50,5 @@
             String description) throws UserCancelException {
 
-        boolean hasCorrections = false;
-        for (List<TagCorrection> tagCorrectionList : tagCorrectionsMap.values()) {
-            if (!tagCorrectionList.isEmpty()) {
-                hasCorrections = true;
-                break;
-            }
-        }
-
-        if (!hasCorrections) {
-            for (List<RoleCorrection> roleCorrectionList : roleCorrectionMap
-                    .values()) {
-                if (!roleCorrectionList.isEmpty()) {
-                    hasCorrections = true;
-                    break;
-                }
-            }
-        }
-
-        if (hasCorrections) {
+        if (!tagCorrectionsMap.isEmpty() || !roleCorrectionMap.isEmpty()) {
             Collection<Command> commands = new ArrayList<Command>();
             Map<OsmPrimitive, TagCorrectionTable> tagTableMap =
@@ -74,6 +56,4 @@
             Map<OsmPrimitive, RoleCorrectionTable> roleTableMap =
                 new HashMap<OsmPrimitive, RoleCorrectionTable>();
-
-            //NameVisitor nameVisitor = new NameVisitor();
 
             final JPanel p = new JPanel(new GridBagLayout());
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmUtils.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmUtils.java	(revision 2682)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmUtils.java	(revision 2683)
@@ -35,3 +35,11 @@
         return REVERSE_VALUES.contains(value);
     }
+
+    public static boolean isTrue(String value) {
+        return TRUE_VALUES.contains(value);
+    }
+
+    public static boolean isFalse(String value) {
+        return FALSE_VALUES.contains(value);
+    }
 }
