Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java	(revision 17182)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java	(revision 17183)
@@ -589,9 +589,11 @@
             EastNorth b = ws.getSecondNode().getEastNorth();
             n.setEastNorth(Geometry.closestPointToSegment(a, b, n.getEastNorth()));
-            List<Node> modnodes = ws.way.getNodes();
-            modnodes.add(ws.lowerIndex+1, n);
+            Way wnew = new Way(ws.way);
+            wnew.addNode(ws.lowerIndex+1, n);
             DataSet ds = ws.way.getDataSet();
             UndoRedoHandler.getInstance().add(new SequenceCommand(tr("Add a new node to an existing way"),
-                    new AddCommand(ds, n), new ChangeNodesCommand(ds, ws.way, modnodes)));
+                    new AddCommand(ds, n), new ChangeNodesCommand(ds, ws.way, wnew.getNodes())));
+            wnew.setNodes(null); // see #19855
+
         }
     }
@@ -637,7 +639,7 @@
         // create extrusion
         Collection<Command> cmds = new LinkedList<>();
-        List<Node> modNodes = selectedSegment.way.getNodes();
+        Way wnew = new Way(selectedSegment.way);
         boolean wayWasModified = false;
-        boolean wayWasSingleSegment = modNodes.size() == 2;
+        boolean wayWasSingleSegment = wnew.getNodesCount() == 2;
         int insertionPoint = selectedSegment.lowerIndex + 1;
 
@@ -659,6 +661,6 @@
             Node n1Old = selectedSegment.getFirstNode();
             Node n1New = new Node(ProjectionRegistry.getProjection().eastNorth2latlon(newN1en));
-            modNodes.add(insertionPoint, n1New);
-            modNodes.remove(n1Old);
+            wnew.addNode(insertionPoint, n1New);
+            wnew.removeNode(n1Old);
             wayWasModified = true;
             cmds.add(new AddCommand(ds, n1New));
@@ -667,5 +669,5 @@
             //introduce new node
             Node n1New = new Node(ProjectionRegistry.getProjection().eastNorth2latlon(newN1en));
-            modNodes.add(insertionPoint, n1New);
+            wnew.addNode(insertionPoint, n1New);
             wayWasModified = true;
             insertionPoint++;
@@ -689,6 +691,6 @@
             Node n2Old = selectedSegment.getSecondNode();
             Node n2New = new Node(ProjectionRegistry.getProjection().eastNorth2latlon(newN2en));
-            modNodes.add(insertionPoint, n2New);
-            modNodes.remove(n2Old);
+            wnew.addNode(insertionPoint, n2New);
+            wnew.removeNode(n2Old);
             wayWasModified = true;
             cmds.add(new AddCommand(ds, n2New));
@@ -697,5 +699,5 @@
             //introduce new node
             Node n2New = new Node(ProjectionRegistry.getProjection().eastNorth2latlon(newN2en));
-            modNodes.add(insertionPoint, n2New);
+            wnew.addNode(insertionPoint, n2New);
             wayWasModified = true;
             cmds.add(new AddCommand(ds, n2New));
@@ -705,10 +707,11 @@
         //the way was a single segment, close the way
         if (wayWasSingleSegment) {
-            modNodes.add(modNodes.get(0));
+            wnew.addNode(selectedSegment.getFirstNode());
             wayWasModified = true;
         }
         if (wayWasModified) {
             // we only need to change the way if its node list was really modified
-            cmds.add(new ChangeNodesCommand(selectedSegment.way, modNodes));
+            cmds.add(new ChangeNodesCommand(selectedSegment.way, wnew.getNodes()));
+            wnew.setNodes(null); // see #19855
         }
         Command c = new SequenceCommand(tr("Extrude Way"), cmds);
