Index: plugins/utilsplugin2/src/org/openstreetmap/josm/plugins/utilsplugin2/actions/SplitObjectAction.java
===================================================================
--- plugins/utilsplugin2/src/org/openstreetmap/josm/plugins/utilsplugin2/actions/SplitObjectAction.java	(revision 35800)
+++ plugins/utilsplugin2/src/org/openstreetmap/josm/plugins/utilsplugin2/actions/SplitObjectAction.java	(working copy)
@@ -276,9 +276,9 @@
      * @param allowInvalidSplit allow multipolygon splits that result in invalid multipolygons.
      * @return the new multipolygon relations after splitting + the executed commands
      * (already executed and added to the {@link UndoRedoHandler}).
-     * Relation and command lists are empty if split did not succeed.
+     * Returns null if split did not succeed.
      */
-    public static Pair<List<Relation>, List<Command>> splitMultipolygonAtWayChecked(
+    public static Pair<List<Relation>, SplitMultipolygonCommand> splitMultipolygonAtWayChecked(
             Relation mpRelation, Way splitWay, boolean allowInvalidSplit) {
 
         CheckParameterUtil.ensureParameterNotNull(mpRelation, "mpRelation");
@@ -286,9 +286,9 @@
         CheckParameterUtil.ensureThat(mpRelation.isMultipolygon(), "mpRelation.isMultipolygon");
 
         try {
-            Pair<List<Relation>, List<Command>> splitResult = splitMultipolygonAtWay(mpRelation, splitWay, allowInvalidSplit);
+            Pair<List<Relation>, SplitMultipolygonCommand> splitResult = splitMultipolygonAtWay(mpRelation, splitWay, allowInvalidSplit);
             List<Relation> mpRelations = splitResult.a;
-            List<Command> commands = splitResult.b;
+            SplitMultipolygonCommand splitCmd = splitResult.b;
 
             List<TestError> mpErrorsPostSplit = new ArrayList<>();
             for (Relation mp : mpRelations) {
@@ -310,11 +310,10 @@
                     for (TestError testError : mpErrorsPostSplit) {
                         showWarningNotification(testError.getMessage());
                     }
-                    for (int i = commands.size()-1; i >= 0; --i) {
-                        commands.get(i).undoCommand();
-                    }
 
-                    return new Pair<>(new ArrayList<>(), new ArrayList<>());
+                    splitCmd.undoCommand();
+
+                    return null;
                 } else {
                     showWarningNotification(tr("Multipolygon split created invalid multipolygons! Please review and fix these errors."));
                     for (TestError testError : mpErrorsPostSplit) {
@@ -323,17 +322,15 @@
                 }
             }
 
-            for (Command mpSplitCommand : commands) {
-                UndoRedoHandler.getInstance().add(mpSplitCommand, false);
-            }
+            UndoRedoHandler.getInstance().add(splitCmd, false);
+            mpRelation.getDataSet().setSelected(mpRelations);
 
-            mpRelation.getDataSet().setSelected(mpRelations);
             return splitResult;
 
         } catch (IllegalArgumentException e) {
             // Changes were already undone in splitMultipolygonAtWay
             showWarningNotification(e.getMessage());
-            return new Pair<>(new ArrayList<>(), new ArrayList<>());
+            return null;
         }
     }
 
@@ -349,7 +346,7 @@
      * @throws IllegalArgumentException if the multipolygon has errors and/or the splitWay is unsuitable for
      * splitting the multipolygon (e.g. because it crosses inners and {@code allowInvalidSplit == false}).
      */
-    public static Pair<List<Relation>, List<Command>> splitMultipolygonAtWay(Relation mpRelation,
+    public static Pair<List<Relation>, SplitMultipolygonCommand> splitMultipolygonAtWay(Relation mpRelation,
                                                                              Way splitWay,
                                                                              boolean allowInvalidSplit) throws IllegalArgumentException {
         CheckParameterUtil.ensureParameterNotNull(mpRelation, "mpRelation");
@@ -498,7 +495,9 @@
                 mpCreationCommands.add(new ChangeMembersCommand(mpRelation, mpMembers));
                 mpCreationCommands.add(new AddCommand(mpRelation.getDataSet(), newMpRelation));
 
-                SequenceCommand sequenceCommand = new SequenceCommand(mpRelation.getDataSet(), "Split Multipolygon", mpCreationCommands, false);
+                SequenceCommand sequenceCommand = new SequenceCommand(mpRelation.getDataSet(), 
+                    "Create new multipolygon and assign members", mpCreationCommands, false);
+                    
                 sequenceCommand.executeCommand();
                 commands.add(sequenceCommand);
 
@@ -506,7 +505,7 @@
             }
         }
 
-        return new Pair<>(mpRelations, commands);
+        return new Pair<>(mpRelations, new SplitMultipolygonCommand(commands));
     }
 
     /**
@@ -568,8 +567,11 @@
             } else
                 return false;
         }
-        return (node == 2 || ways == 1 || ways == 2) || //only 2 nodes selected. one split-way selected. split-way + way to split.
-               (multipolygons == 1 && ways == 1);
+
+        // When splitting closed ways: only 2 nodes selected. one split-way selected. split-way + way to split.
+        // When splitting multipolygons: 1 multipolygon + 1 split way
+        return ((multipolygons == 0) && (node == 2 || ways == 1 || ways == 2)) ||
+               ((multipolygons == 1) && (ways == 1));
     }
 
     @Override
@@ -590,4 +592,21 @@
         new Notification(msg)
         .setIcon(JOptionPane.WARNING_MESSAGE).show();
     }
+
+    private static class SplitMultipolygonCommand extends SequenceCommand {
+        SplitMultipolygonCommand(Collection<Command> sequence) {
+            super(tr("Split multipolygon"), sequence, true);
+            setSequenceComplete(true); // commands were already executed
+        }
+
+        @Override
+        public void undoCommand() {
+            getAffectedDataSet().update(super::undoCommand);
+        }
+
+        @Override
+        public boolean executeCommand() {
+            return getAffectedDataSet().update(super::executeCommand);
+        }
+    }
 }
