Index: trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java	(revision 3141)
+++ trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java	(revision 3142)
@@ -22,4 +22,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.command.ChangeNodesCommand;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.DeleteCommand;
@@ -130,5 +131,5 @@
      * @return a list of commands; null, if the ways could not be fixed
      */
-    protected static List<Command> fixParentWays(Collection<OsmPrimitive> nodesToDelete, Node targetNode) {
+    protected static List<Command> fixParentWays(Collection<Node> nodesToDelete, Node targetNode) {
         List<Command> cmds = new ArrayList<Command>();
         Set<Way> waysToDelete = new HashSet<Way>();
@@ -180,7 +181,5 @@
                 waysToDelete.add(w);
             } else {
-                Way newWay = new Way(w);
-                newWay.setNodes(newNodes);
-                cmds.add(new ChangeCommand(w, newWay));
+                cmds.add(new ChangeNodesCommand(w, newNodes));
             }
         }
@@ -240,5 +239,5 @@
         // the nodes we will have to delete
         //
-        Collection<OsmPrimitive> nodesToDelete = new HashSet<OsmPrimitive>(nodes);
+        Collection<Node> nodesToDelete = new HashSet<Node>(nodes);
         nodesToDelete.remove(targetNode);
 
Index: trunk/src/org/openstreetmap/josm/command/ChangeNodesCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/ChangeNodesCommand.java	(revision 3142)
+++ trunk/src/org/openstreetmap/josm/command/ChangeNodesCommand.java	(revision 3142)
@@ -0,0 +1,57 @@
+// License: GPL. See LICENSE file for details.
+package org.openstreetmap.josm.command;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.util.Collection;
+import java.util.List;
+
+import javax.swing.JLabel;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.MutableTreeNode;
+
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.gui.DefaultNameFormatter;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+/**
+ * Command that changes the nodes list of a way.
+ * The same can be done with ChangeCommand, but this is more
+ * efficient. (Needed for the duplicate node fixing
+ * tool of the validator plugin, when processing large data sets.)
+ *
+ * @author Imi
+ */
+public class ChangeNodesCommand extends Command {
+
+    private final Way way;
+    private final List<Node> newNodes;
+
+    public ChangeNodesCommand(Way way, List<Node> newNodes) {
+        super();
+        this.way = way;
+        this.newNodes = newNodes;
+    }
+
+    @Override public boolean executeCommand() {
+        super.executeCommand();
+        way.setNodes(newNodes);
+        way.setModified(true);
+        return true;
+    }
+
+    @Override public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, Collection<OsmPrimitive> added) {
+        modified.add(way);
+    }
+
+    @Override public MutableTreeNode description() {
+        String msg = tr("Changed nodes of {0}", way.getDisplayName(DefaultNameFormatter.getInstance()));
+        return new DefaultMutableTreeNode(
+                new JLabel(msg,
+                        ImageProvider.get(OsmPrimitiveType.WAY),
+                        JLabel.HORIZONTAL));
+    }
+}
