Index: /trunk/src/org/openstreetmap/josm/actions/CreateCircleAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/CreateCircleAction.java	(revision 17109)
+++ /trunk/src/org/openstreetmap/josm/actions/CreateCircleAction.java	(revision 17110)
@@ -16,5 +16,5 @@
 
 import org.openstreetmap.josm.command.AddCommand;
-import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.command.ChangeNodesCommand;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.SequenceCommand;
@@ -234,7 +234,5 @@
             cmds.add(new AddCommand(ds, newWay));
         } else {
-            Way newWay = new Way(existingWay);
-            newWay.setNodes(nodesToAdd);
-            cmds.add(new ChangeCommand(ds, existingWay, newWay));
+            cmds.add(new ChangeNodesCommand(ds, existingWay, nodesToAdd));
         }
 
Index: /trunk/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/SimplifyWayAction.java	(revision 17109)
+++ /trunk/src/org/openstreetmap/josm/actions/SimplifyWayAction.java	(revision 17110)
@@ -31,5 +31,5 @@
 import javax.swing.event.ChangeListener;
 
-import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.command.ChangeNodesCommand;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.DeleteCommand;
@@ -411,7 +411,5 @@
 
         Collection<Command> cmds = new LinkedList<>();
-        Way newWay = new Way(w);
-        newWay.setNodes(newNodes);
-        cmds.add(new ChangeCommand(w, newWay));
+        cmds.add(new ChangeNodesCommand(w, newNodes));
         cmds.add(new DeleteCommand(w.getDataSet(), delNodes));
         w.getDataSet().clearSelection(delNodes);
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyAction.java	(revision 17109)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyAction.java	(revision 17110)
@@ -490,4 +490,5 @@
                             UndoRedoHandler.getInstance().add(deleteCmd);
                         }
+                        newWay.setNodes(null);
                     } else {
                         UndoRedoHandler.getInstance().add(new ChangeCommand(targetWay, newWay));
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 17109)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 17110)
@@ -17,4 +17,5 @@
 import java.util.Iterator;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.Optional;
 
@@ -23,5 +24,5 @@
 import org.openstreetmap.josm.actions.MergeNodesAction;
 import org.openstreetmap.josm.command.AddCommand;
-import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.command.ChangeNodesCommand;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.MoveCommand;
@@ -1242,7 +1243,7 @@
             for (WaySegment virtualWay : virtualWays) {
                 Way w = virtualWay.way;
-                Way wnew = new Way(w);
-                wnew.addNode(virtualWay.lowerIndex + 1, virtualNode);
-                virtualCmds.add(new ChangeCommand(ds, w, wnew));
+                List<Node> modNodes = w.getNodes();
+                modNodes.add(virtualWay.lowerIndex + 1, virtualNode);
+                virtualCmds.add(new ChangeNodesCommand(ds, w, modNodes));
             }
             virtualCmds.add(new MoveCommand(ds, virtualNode, startEN, currentEN));
Index: /trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 17109)
+++ /trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 17110)
@@ -1096,4 +1096,5 @@
         update(() -> {
             clearSelection();
+            clearSelectionHistory();
             for (OsmPrimitive primitive : allPrimitives) {
                 primitive.setDataset(null);
Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/AbstractMapRenderer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/AbstractMapRenderer.java	(revision 17109)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/AbstractMapRenderer.java	(revision 17110)
@@ -13,4 +13,5 @@
 import org.openstreetmap.josm.data.osm.IWay;
 import org.openstreetmap.josm.data.osm.OsmData;
+import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.WaySegment;
 import org.openstreetmap.josm.gui.MapViewState;
@@ -149,5 +150,7 @@
             for (WaySegment wseg: data.getHighlightedVirtualNodes()) {
                 if (wseg.way.isUsable() && !wseg.way.isDisabled()) {
-                    visitVirtual(path, wseg.toWay());
+                    Way tmpWay = wseg.toWay();
+                    visitVirtual(path, tmpWay);
+                    tmpWay.setNodes(null);
                 }
             }
Index: /trunk/src/org/openstreetmap/josm/data/validation/tests/Coastlines.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/validation/tests/Coastlines.java	(revision 17109)
+++ /trunk/src/org/openstreetmap/josm/data/validation/tests/Coastlines.java	(revision 17110)
@@ -14,5 +14,5 @@
 import java.util.Set;
 
-import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.command.ChangeNodesCommand;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.data.osm.Node;
@@ -261,11 +261,9 @@
             if (it.hasNext()) {
                 Way way = (Way) it.next();
-                Way newWay = new Way(way);
-
-                List<Node> nodesCopy = newWay.getNodes();
+
+                List<Node> nodesCopy = way.getNodes();
                 Collections.reverse(nodesCopy);
-                newWay.setNodes(nodesCopy);
-
-                return new ChangeCommand(way, newWay);
+
+                return new ChangeNodesCommand(way, nodesCopy);
             }
         }
