Index: src/org/openstreetmap/josm/actions/JoinAreasAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/JoinAreasAction.java	(revision 15887)
+++ src/org/openstreetmap/josm/actions/JoinAreasAction.java	(working copy)
@@ -685,15 +685,45 @@
         Map<Node, Way> oldestWayMap = new HashMap<>();
 
         for (Way way : outerStartingWays) {
-            List<Way> splitWays = splitWayOnNodes(way, nodes, oldestWayMap);
-            preparedWays.addAll(markWayInsideSide(splitWays, false));
+            if (!splitWayOnNodes(way, nodes)) {
+                preparedWays.addAll(markWayInsideSide(Collections.singletonList(way), false));
+            }
         }
+        // remember number of split commands so far
+        int outerCmdsSize = cmds.size();
 
         for (Way way : innerStartingWays) {
-            List<Way> splitWays = splitWayOnNodes(way, nodes, oldestWayMap);
-            preparedWays.addAll(markWayInsideSide(splitWays, true));
+            if (!splitWayOnNodes(way, nodes)) {
+            }
         }
 
+        List<Command> savedCmds = new ArrayList<>(cmds);
+        commitCommands(marktr("Split ways into fragments"));
+
+        for (int i = 0; i < savedCmds.size(); i++) {
+            Command cmd = savedCmds.get(i);
+
+            if (cmd instanceof SplitWayCommand) {
+                SplitWayCommand split = (SplitWayCommand) cmd;
+                List<Way> result = new ArrayList<>();
+                Way way = split.getOriginalWay();
+                result.add(way);
+                result.addAll(split.getNewWays());
+
+                // see #9599
+                if (!way.isNew() && result.size() > 1) {
+                    for (Way part : result) {
+                        Node n = part.firstNode();
+                        Way old = oldestWayMap.get(n);
+                        if (old == null || old.getUniqueId() > way.getUniqueId()) {
+                            oldestWayMap.put(n, way);
+                        }
+                    }
+                }
+                preparedWays.addAll(markWayInsideSide(result, i >= outerCmdsSize));
+            }
+        }
+
         // Find boundary ways
         List<Way> discardedWays = new ArrayList<>();
         List<AssembledPolygon> boundaries = findBoundaryPolygons(preparedWays, discardedWays);
@@ -1109,12 +1139,10 @@
      * Uses {@link SplitWayCommand#splitWay} for the heavy lifting.
      * @param way way to split
      * @param nodes split points
-     * @param oldestWayMap  nodes from old ways (modified here)
-     * @return list of split ways (or original way if no splitting is done).
+     * @return true if split command was added
      */
-    private List<Way> splitWayOnNodes(Way way, Set<Node> nodes, Map<Node, Way> oldestWayMap) {
+    private boolean splitWayOnNodes(Way way, Set<Node> nodes) {
 
-        List<Way> result = new ArrayList<>();
         List<List<Node>> chunks = buildNodeChunks(way, nodes);
 
         if (chunks.size() > 1) {
@@ -1122,30 +1150,12 @@
                     Collections.<OsmPrimitive>emptyList(), SplitWayCommand.Strategy.keepFirstChunk());
 
             if (split != null) {
-                //execute the command, we need the results
+                // don't execute the command now
                 cmds.add(split);
-                commitCommands(marktr("Split ways into fragments"));
-
-                result.add(split.getOriginalWay());
-                result.addAll(split.getNewWays());
-
-                // see #9599
-                if (!way.isNew() && result.size() > 1) {
-                    for (Way part : result) {
-                        Node n = part.firstNode();
-                        Way old = oldestWayMap.get(n);
-                        if (old == null || old.getUniqueId() > way.getUniqueId()) {
-                            oldestWayMap.put(n, way);
-                        }
-                    }
-                }
+                return true;
             }
         }
-        if (result.isEmpty()) {
-            //nothing to split
-            result.add(way);
-        }
-        return result;
+        return false;
     }
 
     /**
@@ -1722,9 +1732,9 @@
                 cmds.add(commands.get(i));
             }
             ur.undo(cmds.size());
+            commitCommands(message == null ? marktr("Join Areas Function") : message);
         }
 
-        commitCommands(message == null ? marktr("Join Areas Function") : message);
         cmdsCount = 0;
     }
 
