Index: src/org/openstreetmap/josm/corrector/RoleCorrection.java
===================================================================
--- src/org/openstreetmap/josm/corrector/RoleCorrection.java	(revision 1613)
+++ src/org/openstreetmap/josm/corrector/RoleCorrection.java	(working copy)
@@ -7,12 +7,14 @@
 public class RoleCorrection implements Correction {
 
     public final Relation relation;
+    public final int position;
     public final RelationMember member;
     public final String newRole;
 
-    public RoleCorrection(Relation relation, RelationMember member,
-            String newRole) {
+    public RoleCorrection(Relation relation, int position,
+                          RelationMember member, String newRole) {
         this.relation = relation;
+        this.position = position;
         this.member = member;
         this.newRole = newRole;
     }
Index: src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
===================================================================
--- src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java	(revision 1613)
+++ src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java	(working copy)
@@ -111,10 +111,13 @@
         roleCorrectionMap.put(way, new ArrayList<RoleCorrection>());
 
         for (Relation relation : Main.ds.relations) {
+            int position = 0;
             for (RelationMember member : relation.members) {
                 if (!member.member.realEqual(oldway, true)
-                        || member.role.length() == 0)
+                        || member.role.length() == 0) {
+                    position++;
                     continue;
+                }
 
                 boolean found = false;
                 String newRole = null;
@@ -128,7 +131,9 @@
 
                 if (found)
                     roleCorrectionMap.get(way).add(
-                            new RoleCorrection(relation, member, newRole));
+                            new RoleCorrection(relation, position, member, newRole));
+
+                position++;
             }
         }
 
Index: src/org/openstreetmap/josm/corrector/TagCorrector.java
===================================================================
--- src/org/openstreetmap/josm/corrector/TagCorrector.java	(revision 1613)
+++ src/org/openstreetmap/josm/corrector/TagCorrector.java	(working copy)
@@ -167,19 +167,25 @@
                 for (OsmPrimitive primitive : roleCorrectionMap.keySet()) {
                     List<RoleCorrection> roleCorrections = roleCorrectionMap
                             .get(primitive);
-                    for (int i = 0; i < roleCorrections.size(); i++) {
-                        if (roleTableMap.get(primitive)
-                                .getCorrectionTableModel().getApply(i)) {
-                            RoleCorrection roleCorrection = roleCorrections
-                                    .get(i);
-                            Relation newRelation = new Relation(
-                                    roleCorrection.relation);
-                            for (RelationMember member : newRelation.members)
-                                if (member.equals(roleCorrection.member))
+                    for (Relation relation : Main.ds.relations) {
+                        Relation newRelation = new Relation(relation);
+                        Boolean changed = false;
+
+                        for (int i = 0; i < roleCorrections.size(); i++) {
+                            RoleCorrection roleCorrection = roleCorrections.get(i);
+                            if (roleCorrection.relation == relation &&
+                                    roleTableMap.get(primitive).getCorrectionTableModel().getApply(i)) {
+
+                                RelationMember member = newRelation.members.get(roleCorrection.position);
+
+                                if (member.equals(roleCorrection.member)) {
                                     member.role = roleCorrection.newRole;
-                            commands.add(new ChangeCommand(
-                                    roleCorrection.relation, newRelation));
+                                    changed = true;
+                                }
+                            }
                         }
+                        if (changed)
+                            commands.add(new ChangeCommand(relation, newRelation));
                     }
                 }
             } else if (answer != JOptionPane.NO_OPTION) {
