Index: /applications/editors/josm/plugins/merge-overlap/build.xml
===================================================================
--- /applications/editors/josm/plugins/merge-overlap/build.xml	(revision 33847)
+++ /applications/editors/josm/plugins/merge-overlap/build.xml	(revision 33848)
@@ -4,5 +4,5 @@
     <property name="commit.message" value="MergeOverlap: help shortcut parser, rebuild"/>
     <!-- enter the *lowest* JOSM version this plugin is currently compatible with -->
-    <property name="plugin.main.version" value="12463"/>
+    <property name="plugin.main.version" value="12840"/>
     
     <!-- Configure these properties (replace "..." accordingly).
Index: /applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/MergeOverlapAction.java
===================================================================
--- /applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/MergeOverlapAction.java	(revision 33847)
+++ /applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/MergeOverlapAction.java	(revision 33848)
@@ -9,10 +9,8 @@
 import java.awt.event.KeyEvent;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
@@ -21,17 +19,11 @@
 import java.util.Set;
 
-import javax.swing.JOptionPane;
-
-import mergeoverlap.hack.MyCombinePrimitiveResolverDialog;
-
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
-import org.openstreetmap.josm.actions.SplitWayAction;
-import org.openstreetmap.josm.actions.SplitWayAction.SplitWayResult;
-import org.openstreetmap.josm.command.AddCommand;
 import org.openstreetmap.josm.command.ChangeCommand;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.DeleteCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.command.SplitWayCommand;
 import org.openstreetmap.josm.corrector.ReverseWayTagCorrector;
 import org.openstreetmap.josm.data.osm.Node;
@@ -39,11 +31,12 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.TagCollection;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.tools.Pair;
 import org.openstreetmap.josm.tools.Shortcut;
 import org.openstreetmap.josm.tools.UserCancelException;
+
+import mergeoverlap.hack.MyCombinePrimitiveResolverDialog;
 
 /**
@@ -162,8 +155,8 @@
             }
             if (!nodes.isEmpty() && !way.isClosed() || nodes.size() >= 2) {
-                List<List<Node>> wayChunks = SplitWayAction.buildSplitChunks(way, new ArrayList<>(nodes));
-                SplitWayResult result = splitWay(getLayerManager().getEditLayer(), way, wayChunks);
-
-                cmds.add(result.getCommand());
+                List<List<Node>> wayChunks = SplitWayCommand.buildSplitChunks(way, new ArrayList<>(nodes));
+                SplitWayCommand result = SplitWayCommand.splitWay(way, wayChunks, Collections.emptyList());
+
+                cmds.add(result);
                 sel.remove(way);
                 sel.add(result.getOriginalWay());
@@ -238,5 +231,5 @@
         Main.main.undoRedo.add(new SequenceCommand(tr("Merge Overlap (combine)"), cmds));
         getLayerManager().getEditDataSet().setSelected(sel);
-        Main.map.repaint();
+        MainApplication.getMap().repaint();
 
         relations.clear();
@@ -294,175 +287,4 @@
 
     /**
-     * Splits a way
-     * 
-     * @param layer
-     * @param way
-     * @param wayChunks
-     * @return
-     */
-    private SplitWayResult splitWay(OsmDataLayer layer, Way way, List<List<Node>> wayChunks) {
-        // build a list of commands, and also a new selection list
-        Collection<Command> commandList = new ArrayList<>(wayChunks.size());
-
-        Iterator<List<Node>> chunkIt = wayChunks.iterator();
-        Collection<String> nowarnroles = Main.pref.getCollection("way.split.roles.nowarn",
-                Arrays.asList(new String[] { "outer", "inner", "forward", "backward" }));
-
-        // First, change the original way
-        Way changedWay = new Way(way);
-        oldWays.put(changedWay, way);
-        changedWay.setNodes(chunkIt.next());
-        commandList.add(new ChangeCommand(way, changedWay));
-
-        List<Way> newWays = new ArrayList<>();
-        // Second, create new ways
-        while (chunkIt.hasNext()) {
-            Way wayToAdd = new Way();
-            wayToAdd.setKeys(way.getKeys());
-            newWays.add(wayToAdd);
-            wayToAdd.setNodes(chunkIt.next());
-            commandList.add(new AddCommand(layer, wayToAdd));
-        }
-        boolean warnmerole = false;
-        boolean warnme = false;
-        // now copy all relations to new way also
-
-        for (Relation r : getParentRelations(way)) {
-            if (!r.isUsable()) {
-                continue;
-            }
-            Relation c = null;
-            String type = r.get("type");
-            if (type == null) {
-                type = "";
-            }
-
-            int ic = 0, ir = 0;
-            List<RelationMember> relationMembers = r.getMembers();
-            for (RelationMember rm : relationMembers) {
-                if (rm.isWay() && rm.getMember() == way) {
-                    boolean insert = true;
-                    if ("restriction".equals(type)) {
-                        /*
-                         * this code assumes the restriction is correct. No real
-                         * error checking done
-                         */
-                        String role = rm.getRole();
-                        if ("from".equals(role) || "to".equals(role)) {
-                            OsmPrimitive via = null;
-                            for (RelationMember rmv : r.getMembers()) {
-                                if ("via".equals(rmv.getRole())) {
-                                    via = rmv.getMember();
-                                }
-                            }
-                            List<Node> nodes = new ArrayList<>();
-                            if (via != null) {
-                                if (via instanceof Node) {
-                                    nodes.add((Node) via);
-                                } else if (via instanceof Way) {
-                                    nodes.add(((Way) via).lastNode());
-                                    nodes.add(((Way) via).firstNode());
-                                }
-                            }
-                            Way res = null;
-                            for (Node n : nodes) {
-                                if (changedWay.isFirstLastNode(n)) {
-                                    res = way;
-                                }
-                            }
-                            if (res == null) {
-                                for (Way wayToAdd : newWays) {
-                                    for (Node n : nodes) {
-                                        if (wayToAdd.isFirstLastNode(n)) {
-                                            res = wayToAdd;
-                                        }
-                                    }
-                                }
-                                if (res != null) {
-                                    if (c == null) {
-                                        c = getNew(r);
-                                    }
-                                    c.addMember(new RelationMember(role, res));
-                                    c.removeMembersFor(way);
-                                    insert = false;
-                                }
-                            } else {
-                                insert = false;
-                            }
-                        } else if (!"via".equals(role)) {
-                            warnme = true;
-                        }
-                    } else if (!("route".equals(type)) && !("multipolygon".equals(type))) {
-                        warnme = true;
-                    }
-                    if (c == null) {
-                        c = getNew(r);
-                    }
-
-                    if (insert) {
-                        if (rm.hasRole() && !nowarnroles.contains(rm.getRole())) {
-                            warnmerole = true;
-                        }
-
-                        Boolean backwards = null;
-                        int k = 1;
-                        while (ir - k >= 0 || ir + k < relationMembers.size()) {
-                            if ((ir - k >= 0) && relationMembers.get(ir - k).isWay()) {
-                                Way w = relationMembers.get(ir - k).getWay();
-                                if ((w.lastNode() == way.firstNode()) || w.firstNode() == way.firstNode()) {
-                                    backwards = false;
-                                } else if ((w.firstNode() == way.lastNode()) || w.lastNode() == way.lastNode()) {
-                                    backwards = true;
-                                }
-                                break;
-                            }
-                            if ((ir + k < relationMembers.size()) && relationMembers.get(ir + k).isWay()) {
-                                Way w = relationMembers.get(ir + k).getWay();
-                                if ((w.lastNode() == way.firstNode()) || w.firstNode() == way.firstNode()) {
-                                    backwards = true;
-                                } else if ((w.firstNode() == way.lastNode()) || w.lastNode() == way.lastNode()) {
-                                    backwards = false;
-                                }
-                                break;
-                            }
-                            k++;
-                        }
-
-                        int j = ic;
-                        for (Way wayToAdd : newWays) {
-                            RelationMember em = new RelationMember(rm.getRole(), wayToAdd);
-                            j++;
-                            if ((backwards != null) && backwards) {
-                                c.addMember(ic, em);
-                            } else {
-                                c.addMember(j, em);
-                            }
-                        }
-                        ic = j;
-                    }
-                }
-                ic++;
-                ir++;
-            }
-
-            if (c != null) {
-                // commandList.add(new ChangeCommand(layer, r, c));
-                newRelations.put(r, c);
-            }
-        }
-        if (warnmerole) {
-            JOptionPane.showMessageDialog(Main.parent,
-                tr("<html>A role based relation membership was copied to all new ways.<br>You should verify this and correct it when necessary.</html>"),
-                tr("Warning"), JOptionPane.WARNING_MESSAGE);
-        } else if (warnme) {
-            JOptionPane.showMessageDialog(Main.parent,
-                tr("<html>A relation membership was copied to all new ways.<br>You should verify this and correct it when necessary.</html>"),
-                tr("Warning"), JOptionPane.WARNING_MESSAGE);
-        }
-
-        return new SplitWayResult(new SequenceCommand(tr("Split way"), commandList), null, changedWay, newWays);
-    }
-
-    /**
      * @param ways
      * @return null if ways cannot be combined. Otherwise returns the combined
@@ -639,8 +461,4 @@
     }
 
-    private Relation getNew(Relation r) {
-        return getNew(r, newRelations);
-    }
-
     public static Relation getNew(Relation r, Map<Relation, Relation> newRelations) {
         if (newRelations.containsValue(r)) {
Index: /applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/MergeOverlapPlugin.java
===================================================================
--- /applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/MergeOverlapPlugin.java	(revision 33847)
+++ /applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/MergeOverlapPlugin.java	(revision 33848)
@@ -1,5 +1,5 @@
 package mergeoverlap;
 
-import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MainMenu;
 import org.openstreetmap.josm.plugins.Plugin;
@@ -17,5 +17,5 @@
     public MergeOverlapPlugin(PluginInformation info) {
         super(info);
-        MainMenu.add(Main.main.menu.moreToolsMenu, new MergeOverlapAction());
+        MainMenu.add(MainApplication.getMenu().moreToolsMenu, new MergeOverlapAction());
     }
 }
