Index: src/org/openstreetmap/josm/corrector/TagCorrector.java
===================================================================
--- src/org/openstreetmap/josm/corrector/TagCorrector.java	(revision 1615)
+++ src/org/openstreetmap/josm/corrector/TagCorrector.java	(working copy)
@@ -20,6 +20,7 @@
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.command.ChangeRelationMemberRoleCommand;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -167,25 +168,12 @@
                 for (OsmPrimitive primitive : roleCorrectionMap.keySet()) {
                     List<RoleCorrection> roleCorrections = roleCorrectionMap
                             .get(primitive);
-                    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;
-                                    changed = true;
-                                }
-                            }
+                    for (int i = 0; i < roleCorrections.size(); i++) {
+                        RoleCorrection roleCorrection = roleCorrections.get(i);
+                        if (roleTableMap.get(primitive).getCorrectionTableModel().getApply(i)) {
+                            commands.add(new ChangeRelationMemberRoleCommand(roleCorrection.relation, roleCorrection.position, roleCorrection.newRole));
                         }
-                        if (changed)
-                            commands.add(new ChangeCommand(relation, newRelation));
                     }
                 }
             } else if (answer != JOptionPane.NO_OPTION) {
Index: src/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommand.java
===================================================================
--- src/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommand.java	(revision 0)
+++ src/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommand.java	(revision 0)
@@ -0,0 +1,71 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.command;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.util.Collection;
+
+import javax.swing.JLabel;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.MutableTreeNode;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationMember;
+
+import org.openstreetmap.josm.data.osm.visitor.NameVisitor;
+
+/**
+ * Command that changes the role of a relation member
+ *
+ * @author Teemu Koskinen <teemu.koskinen@mbnet.fi>
+ */
+public class ChangeRelationMemberRoleCommand extends Command {
+
+    // The relation to be changed
+    private final Relation relation;
+    // Position of the member
+    private int position = -1;
+    // The new role
+    private final String newRole;
+    // The old role
+    private String oldRole;
+    // Old value of modified;
+    private Boolean oldModified;
+
+    public ChangeRelationMemberRoleCommand(Relation relation, int position, String newRole) {
+        this.relation = relation;
+        this.position = position;
+        this.newRole = newRole;
+    }
+
+    @Override public boolean executeCommand() {
+        if (position < 0 || position >= relation.members.size()) {
+            Main.debug("error changing the role");
+            return false;
+        }
+
+        oldRole = relation.members.get(position).role;
+        relation.members.get(position).role = newRole;
+
+        oldModified = relation.modified;
+        relation.modified = true;
+        return true;
+    }
+
+    @Override public void undoCommand() {
+        relation.members.get(position).role = oldRole;
+        relation.modified = oldModified;
+    }
+
+    @Override public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, Collection<OsmPrimitive> added) {
+        modified.add(relation);
+    }
+
+    @Override public MutableTreeNode description() {
+        NameVisitor v = new NameVisitor();
+        relation.visit(v);
+        return new DefaultMutableTreeNode(new JLabel(tr("ChangeRelationMemberRole")+" "+tr(v.className)+" "+v.name, v.icon, JLabel.HORIZONTAL));
+    }
+}
