Index: /trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 18023)
+++ /trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 18024)
@@ -36,4 +36,13 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.WaySegment;
+import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
+import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
+import org.openstreetmap.josm.data.osm.event.DataSetListener;
+import org.openstreetmap.josm.data.osm.event.NodeMovedEvent;
+import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent;
+import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent;
+import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent;
+import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
+import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -146,5 +155,5 @@
 
             if (ExpertToggleAction.isExpert() && !selectedWay.isNew()) {
-                final ExtendedDialog dialog = new SegmentToKeepSelectionDialog(selectedWay, newWays, wayToKeep, sel);
+                final ExtendedDialog dialog = new SegmentToKeepSelectionDialog(selectedWay, newWays, wayToKeep, selectedNodes, sel);
                 dialog.toggleEnable("way.split.segment-selection-dialog");
                 if (!dialog.toggleCheckState()) {
@@ -166,10 +175,13 @@
         static final AtomicInteger DISPLAY_COUNT = new AtomicInteger();
         final transient Way selectedWay;
-        final transient List<Way> newWays;
         final JList<Way> list;
         final transient List<OsmPrimitive> selection;
-        final transient Way wayToKeep;
-
-        SegmentToKeepSelectionDialog(Way selectedWay, List<Way> newWays, Way wayToKeep, List<OsmPrimitive> selection) {
+        final transient List<Node> selectedNodes;
+        final SplitWayDataSetListener dataSetListener;
+        transient List<Way> newWays;
+        transient Way wayToKeep;
+
+        SegmentToKeepSelectionDialog(
+                Way selectedWay, List<Way> newWays, Way wayToKeep, List<Node> selectedNodes, List<OsmPrimitive> selection) {
             super(MainApplication.getMainFrame(), tr("Which way segment should reuse the history of {0}?", selectedWay.getId()),
                     new String[]{tr("Ok"), tr("Cancel")}, true);
@@ -177,7 +189,10 @@
             this.selectedWay = selectedWay;
             this.newWays = newWays;
+            this.selectedNodes = selectedNodes;
             this.selection = selection;
             this.wayToKeep = wayToKeep;
             this.list = new JList<>(newWays.toArray(new Way[0]));
+            this.dataSetListener = new SplitWayDataSetListener();
+
             configureList();
 
@@ -210,6 +225,9 @@
 
         protected void setHighlightedWaySegments(Collection<WaySegment> segments) {
-            selectedWay.getDataSet().setHighlightedWaySegments(segments);
-            MainApplication.getMap().mapView.repaint();
+            DataSet ds = selectedWay.getDataSet();
+            if (ds != null) {
+                ds.setHighlightedWaySegments(segments);
+                MainApplication.getMap().mapView.repaint();
+            }
         }
 
@@ -217,11 +235,18 @@
         public void setVisible(boolean visible) {
             super.setVisible(visible);
+            DataSet ds = selectedWay.getDataSet();
             if (visible) {
                 DISPLAY_COUNT.incrementAndGet();
                 list.setSelectedValue(wayToKeep, true);
+                if (ds != null) {
+                    ds.addDataSetListener(dataSetListener);
+                }
             } else {
+                if (ds != null) {
+                    ds.removeDataSetListener(dataSetListener);
+                }
                 setHighlightedWaySegments(Collections.emptyList());
                 DISPLAY_COUNT.decrementAndGet();
-                if (getValue() != 1) {
+                if (getValue() != 1 && selectedWay.getDataSet() != null) {
                     newWays.forEach(w -> w.setNodes(null)); // see 19885
                 }
@@ -235,4 +260,60 @@
             if (getValue() == 1) {
                 doSplitWay(selectedWay, list.getSelectedValue(), newWays, selection);
+            }
+        }
+
+        private class SplitWayDataSetListener implements DataSetListener {
+
+            @Override
+            public void primitivesAdded(PrimitivesAddedEvent event) {
+            }
+
+            @Override
+            public void primitivesRemoved(PrimitivesRemovedEvent event) {
+                if (event.getPrimitives().stream().anyMatch(p -> p instanceof Way)) {
+                    updateWaySegments();
+                }
+            }
+
+            @Override
+            public void tagsChanged(TagsChangedEvent event) {}
+
+            @Override
+            public void nodeMoved(NodeMovedEvent event) {}
+
+            @Override
+            public void wayNodesChanged(WayNodesChangedEvent event) {
+                updateWaySegments();
+            }
+
+            @Override
+            public void relationMembersChanged(RelationMembersChangedEvent event) {}
+
+            @Override
+            public void otherDatasetChange(AbstractDatasetChangedEvent event) {}
+
+            @Override
+            public void dataChanged(DataChangedEvent event) {}
+
+            private void updateWaySegments() {
+                if (!selectedWay.isUsable()) {
+                    setVisible(false);
+                    return;
+                }
+
+                List<List<Node>> chunks = SplitWayCommand.buildSplitChunks(selectedWay, selectedNodes);
+                if (chunks == null) {
+                    setVisible(false);
+                    return;
+                }
+
+                newWays = SplitWayCommand.createNewWaysFromChunks(selectedWay, chunks);
+                if (list.getSelectedIndex() < newWays.size()) {
+                    wayToKeep = newWays.get(list.getSelectedIndex());
+                } else {
+                    wayToKeep = SplitWayCommand.Strategy.keepLongestChunk().determineWayToKeep(newWays);
+                }
+                list.setListData(newWays.toArray(new Way[0]));
+                list.setSelectedValue(wayToKeep, true);
             }
         }
