Index: /trunk/scripts/I18nSimilarStrings.java
===================================================================
--- /trunk/scripts/I18nSimilarStrings.java	(revision 14133)
+++ /trunk/scripts/I18nSimilarStrings.java	(revision 14134)
@@ -5,9 +5,7 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Preferences;
-import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.preferences.JosmBaseDirectories;
 import org.openstreetmap.josm.data.preferences.JosmUrls;
 import org.openstreetmap.josm.data.validation.tests.SimilarNamedWays;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MainApplicationTest;
 import org.openstreetmap.josm.plugins.PluginHandlerTestIT;
@@ -34,5 +32,4 @@
         Config.setPreferencesInstance(pref);
         pref.init(false);
-        MainApplication.undoRedo = new UndoRedoHandler();
         MainApplicationTest.initContentPane();
         MainApplicationTest.initToolbar();
Index: /trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/Main.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/Main.java	(revision 14134)
@@ -71,6 +71,8 @@
     /**
      * The commands undo/redo handler.
-     */
-    public final UndoRedoHandler undoRedo = new UndoRedoHandler();
+     * @deprecated Use {@link UndoRedoHandler#getInstance}
+     */
+    @Deprecated
+    public final UndoRedoHandler undoRedo = UndoRedoHandler.getInstance();
 
     /**
Index: /trunk/src/org/openstreetmap/josm/actions/AddNodeAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/AddNodeAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/AddNodeAction.java	(revision 14134)
@@ -11,4 +11,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.AddCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -68,5 +69,5 @@
         // add the node
         DataSet ds = getLayerManager().getEditDataSet();
-        MainApplication.undoRedo.add(new AddCommand(ds, nnew));
+        UndoRedoHandler.getInstance().add(new AddCommand(ds, nnew));
         ds.setSelected(nnew);
         MapView mapView = MainApplication.getMap().mapView;
Index: /trunk/src/org/openstreetmap/josm/actions/AlignInCircleAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/AlignInCircleAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/AlignInCircleAction.java	(revision 14134)
@@ -20,4 +20,5 @@
 import org.openstreetmap.josm.command.MoveCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.PolarCoor;
@@ -26,5 +27,4 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.Notification;
 import org.openstreetmap.josm.tools.Geometry;
@@ -243,5 +243,5 @@
         }
 
-        MainApplication.undoRedo.add(new SequenceCommand(tr("Align Nodes in Circle"), cmds));
+        UndoRedoHandler.getInstance().add(new SequenceCommand(tr("Align Nodes in Circle"), cmds));
     }
 
Index: /trunk/src/org/openstreetmap/josm/actions/AlignInLineAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/AlignInLineAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/AlignInLineAction.java	(revision 14134)
@@ -20,4 +20,5 @@
 import org.openstreetmap.josm.command.MoveCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.PolarCoor;
@@ -26,5 +27,4 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.Notification;
 import org.openstreetmap.josm.tools.Logging;
@@ -175,5 +175,5 @@
             Command cmd = buildCommand(getLayerManager().getEditDataSet());
             if (cmd != null) {
-                MainApplication.undoRedo.add(cmd);
+                UndoRedoHandler.getInstance().add(cmd);
             }
         } catch (InvalidSelection except) {
Index: /trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java	(revision 14134)
@@ -25,4 +25,5 @@
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.corrector.ReverseWayTagCorrector;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
@@ -34,5 +35,4 @@
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.gui.ExtendedDialog;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.Notification;
 import org.openstreetmap.josm.gui.conflict.tags.CombinePrimitiveResolverDialog;
@@ -176,5 +176,5 @@
                 if (!reverseWayTagCommands.isEmpty()) {
                     // commands need to be executed for CombinePrimitiveResolverDialog
-                    MainApplication.undoRedo.add(new SequenceCommand(tr("Reverse Ways"), reverseWayTagCommands));
+                    UndoRedoHandler.getInstance().add(new SequenceCommand(tr("Reverse Ways"), reverseWayTagCommands));
                 }
                 wayTags = TagCollection.unionOfAllPrimitives(reversedTagWays);
@@ -195,5 +195,5 @@
             if (!reverseWayTagCommands.isEmpty()) {
                 // undo reverseWayTagCorrector and merge into SequenceCommand below
-                MainApplication.undoRedo.undo();
+                UndoRedoHandler.getInstance().undo();
             }
         }
@@ -239,5 +239,5 @@
             return;
         final Way selectedWay = combineResult.a;
-        MainApplication.undoRedo.add(combineResult.b);
+        UndoRedoHandler.getInstance().add(combineResult.b);
         if (selectedWay != null) {
             GuiHelper.runInEDT(() -> ds.setSelected(selectedWay));
Index: /trunk/src/org/openstreetmap/josm/actions/CreateCircleAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/CreateCircleAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/CreateCircleAction.java	(revision 14134)
@@ -22,4 +22,5 @@
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -30,5 +31,4 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.projection.ProjectionRegistry;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.Notification;
 import org.openstreetmap.josm.tools.Geometry;
@@ -244,5 +244,5 @@
         }
 
-        MainApplication.undoRedo.add(new SequenceCommand(tr("Create Circle"), cmds));
+        UndoRedoHandler.getInstance().add(new SequenceCommand(tr("Create Circle"), cmds));
     }
 
Index: /trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java	(revision 14134)
@@ -27,4 +27,5 @@
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.MultipolygonBuilder;
@@ -108,5 +109,5 @@
             // to avoid EDT violations
             SwingUtilities.invokeLater(() -> {
-                    MainApplication.undoRedo.add(command);
+                    UndoRedoHandler.getInstance().add(command);
 
                     // Use 'SwingUtilities.invokeLater' to make sure the relationListDialog
Index: /trunk/src/org/openstreetmap/josm/actions/DistributeAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/DistributeAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/DistributeAction.java	(revision 14134)
@@ -19,8 +19,8 @@
 import org.openstreetmap.josm.command.MoveCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.Notification;
 import org.openstreetmap.josm.tools.Logging;
@@ -98,5 +98,5 @@
 
         // Do it!
-        MainApplication.undoRedo.add(new SequenceCommand(tr("Distribute Nodes"), cmds));
+        UndoRedoHandler.getInstance().add(new SequenceCommand(tr("Distribute Nodes"), cmds));
     }
 
Index: /trunk/src/org/openstreetmap/josm/actions/FollowLineAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/FollowLineAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/FollowLineAction.java	(revision 14134)
@@ -15,4 +15,5 @@
 import org.openstreetmap.josm.command.SelectCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
@@ -114,5 +115,5 @@
                 newFollower.addNode(newPoint);
             }
-            MainApplication.undoRedo.add(new SequenceCommand(tr("Follow line"),
+            UndoRedoHandler.getInstance().add(new SequenceCommand(tr("Follow line"),
                     new ChangeCommand(ds, follower, newFollower),
                     new SelectCommand(ds, newFollower.isClosed() // see #10028 - unselect last node when closing a way
Index: /trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java	(revision 14134)
@@ -570,6 +570,6 @@
             makeCommitsOneAction(tr("Reverting changes"));
             if (addUndoRedo) {
-                MainApplication.undoRedo.undo();
-                MainApplication.undoRedo.redoCommands.clear();
+                UndoRedoHandler.getInstance().undo();
+                UndoRedoHandler.getInstance().redoCommands.clear();
             }
         }
@@ -835,5 +835,5 @@
     private void commitCommand(Command c) {
         if (Main.main != null && addUndoRedo) {
-            MainApplication.undoRedo.add(c);
+            UndoRedoHandler.getInstance().add(c);
         } else {
             c.executeCommand();
Index: /trunk/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java	(revision 14134)
@@ -23,4 +23,5 @@
 import org.openstreetmap.josm.command.MoveCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -162,5 +163,5 @@
 
         if (cmds.isEmpty()) return;
-        MainApplication.undoRedo.add(new SequenceCommand(getValue(NAME).toString(), cmds));
+        UndoRedoHandler.getInstance().add(new SequenceCommand(getValue(NAME).toString(), cmds));
     }
 
Index: /trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java	(revision 14134)
@@ -26,4 +26,5 @@
 import org.openstreetmap.josm.command.DeleteCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -98,5 +99,5 @@
             Command cmd = mergeNodes(selectedNodes, targetNode, targetLocationNode);
             if (cmd != null) {
-                MainApplication.undoRedo.add(cmd);
+                UndoRedoHandler.getInstance().add(cmd);
                 getLayerManager().getEditLayer().data.setSelected(targetNode);
             }
@@ -277,5 +278,5 @@
             Command cmd = mergeNodes(nodes, target, targetLocationNode);
             if (cmd != null) {
-                MainApplication.undoRedo.add(cmd);
+                UndoRedoHandler.getInstance().add(cmd);
                 layer.data.setSelected(target);
             }
Index: /trunk/src/org/openstreetmap/josm/actions/MirrorAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/MirrorAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/MirrorAction.java	(revision 14134)
@@ -17,8 +17,8 @@
 import org.openstreetmap.josm.command.MoveCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.Notification;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -80,5 +80,5 @@
         }
 
-        MainApplication.undoRedo.add(new SequenceCommand(tr("Mirror"), cmds));
+        UndoRedoHandler.getInstance().add(new SequenceCommand(tr("Mirror"), cmds));
     }
 
Index: /trunk/src/org/openstreetmap/josm/actions/MoveAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/MoveAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/MoveAction.java	(revision 14134)
@@ -14,4 +14,5 @@
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.MoveCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -136,5 +137,5 @@
         Collection<Node> affectedNodes = AllNodesVisitor.getAllNodes(selection);
 
-        Command c = MainApplication.undoRedo.getLastCommand();
+        Command c = UndoRedoHandler.getInstance().getLastCommand();
 
         ds.beginUpdate();
@@ -145,5 +146,5 @@
             } else {
                 c = new MoveCommand(ds, selection, distx, disty);
-                MainApplication.undoRedo.add(c);
+                UndoRedoHandler.getInstance().add(c);
             }
         } finally {
Index: /trunk/src/org/openstreetmap/josm/actions/MoveNodeAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/MoveNodeAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/MoveNodeAction.java	(revision 14134)
@@ -10,4 +10,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.MoveCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.Node;
@@ -51,5 +52,5 @@
 
         // move the node
-        MainApplication.undoRedo.add(new MoveCommand(n, coordinates));
+        UndoRedoHandler.getInstance().add(new MoveCommand(n, coordinates));
         MainApplication.getMap().mapView.repaint();
     }
Index: /trunk/src/org/openstreetmap/josm/actions/OpenLocationAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/OpenLocationAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/OpenLocationAction.java	(revision 14134)
@@ -35,6 +35,6 @@
 import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmUrlTask;
+import org.openstreetmap.josm.actions.downloadtasks.DownloadParams;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadSessionTask;
-import org.openstreetmap.josm.actions.downloadtasks.DownloadParams;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadTask;
 import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
Index: /trunk/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java	(revision 14134)
@@ -25,4 +25,5 @@
 import org.openstreetmap.josm.command.MoveCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.PolarCoor;
@@ -32,5 +33,4 @@
 import org.openstreetmap.josm.data.projection.ProjectionRegistry;
 import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.Notification;
 import org.openstreetmap.josm.tools.Geometry;
@@ -120,5 +120,5 @@
                 }
                 if (!commands.isEmpty()) {
-                    MainApplication.undoRedo.add(new SequenceCommand(tr("Orthogonalize / Undo"), commands));
+                    UndoRedoHandler.getInstance().add(new SequenceCommand(tr("Orthogonalize / Undo"), commands));
                 } else {
                     throw new InvalidUserInputException("Commands are empty");
@@ -168,5 +168,5 @@
 
         try {
-            MainApplication.undoRedo.add(orthogonalize(sel));
+            UndoRedoHandler.getInstance().add(orthogonalize(sel));
         } catch (InvalidUserInputException ex) {
             Logging.debug(ex);
Index: /trunk/src/org/openstreetmap/josm/actions/PreferenceToggleAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/PreferenceToggleAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/PreferenceToggleAction.java	(revision 14134)
@@ -7,7 +7,7 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.spi.preferences.PreferenceChangeEvent;
 import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener;
-import org.openstreetmap.josm.data.preferences.BooleanProperty;
 
 /**
Index: /trunk/src/org/openstreetmap/josm/actions/PurgeAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/PurgeAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/PurgeAction.java	(revision 14134)
@@ -29,9 +29,9 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.PurgeCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.IPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.PrimitiveRenderer;
 import org.openstreetmap.josm.gui.help.HelpUtil;
@@ -104,7 +104,7 @@
         }
 
-        MainApplication.undoRedo.add(cmd);
+        UndoRedoHandler.getInstance().add(cmd);
         if (clearUndoRedo) {
-            MainApplication.undoRedo.clean();
+            UndoRedoHandler.getInstance().clean();
             getLayerManager().getEditDataSet().clearSelectionHistory();
         }
Index: /trunk/src/org/openstreetmap/josm/actions/RedoAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/RedoAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/RedoAction.java	(revision 14134)
@@ -9,4 +9,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.UndoRedoHandler.CommandQueueListener;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -37,15 +38,15 @@
             return;
         map.repaint();
-        MainApplication.undoRedo.redo();
+        UndoRedoHandler.getInstance().redo();
     }
 
     @Override
     protected void updateEnabledState() {
-        setEnabled(Main.main != null && !MainApplication.undoRedo.redoCommands.isEmpty());
+        setEnabled(Main.main != null && !UndoRedoHandler.getInstance().redoCommands.isEmpty());
     }
 
     @Override
     public void commandChanged(int queueSize, int redoSize) {
-        if (MainApplication.undoRedo.redoCommands.isEmpty()) {
+        if (UndoRedoHandler.getInstance().redoCommands.isEmpty()) {
             putValue(NAME, tr("Redo"));
             setTooltip(tr("Redo the last undone action."));
@@ -53,5 +54,5 @@
             putValue(NAME, tr("Redo ..."));
             setTooltip(tr("Redo {0}",
-                    MainApplication.undoRedo.redoCommands.getFirst().getDescriptionText()));
+                    UndoRedoHandler.getInstance().redoCommands.getFirst().getDescriptionText()));
         }
     }
Index: /trunk/src/org/openstreetmap/josm/actions/ReverseWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/ReverseWayAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/ReverseWayAction.java	(revision 14134)
@@ -21,9 +21,9 @@
 import org.openstreetmap.josm.corrector.ReverseWayNoTagCorrector;
 import org.openstreetmap.josm.corrector.ReverseWayTagCorrector;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.Notification;
 import org.openstreetmap.josm.spi.preferences.Config;
@@ -138,5 +138,5 @@
             c.addAll(revResult.getCommands());
         }
-        MainApplication.undoRedo.add(new SequenceCommand(tr("Reverse Ways"), c));
+        UndoRedoHandler.getInstance().add(new SequenceCommand(tr("Reverse Ways"), c));
     }
 
Index: /trunk/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/SimplifyWayAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/SimplifyWayAction.java	(revision 14134)
@@ -25,4 +25,5 @@
 import org.openstreetmap.josm.command.DeleteCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
@@ -32,5 +33,4 @@
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane.ButtonSpec;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.Notification;
 import org.openstreetmap.josm.spi.preferences.Config;
@@ -120,5 +120,5 @@
                     allCommands
                     );
-            MainApplication.undoRedo.add(rootCommand);
+            UndoRedoHandler.getInstance().add(rootCommand);
         } finally {
             ds.endUpdate();
Index: /trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 14134)
@@ -26,4 +26,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.SplitWayCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
 import org.openstreetmap.josm.data.osm.Node;
@@ -281,5 +282,5 @@
         final boolean isMapModeDraw = map != null && map.mapMode == map.mapModeDraw;
         final SplitWayCommand result = SplitWayCommand.doSplitWay(way, wayToKeep, newWays, !isMapModeDraw ? newSelection : null);
-        MainApplication.undoRedo.add(result);
+        UndoRedoHandler.getInstance().add(result);
         List<? extends PrimitiveId> newSel = result.getNewSelection();
         if (newSel != null && !newSel.isEmpty()) {
Index: /trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java	(revision 14134)
@@ -32,4 +32,5 @@
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
 import org.openstreetmap.josm.data.osm.Node;
@@ -314,5 +315,5 @@
         }
 
-        MainApplication.undoRedo.add(new SequenceCommand(tr("Unglued Node"), cmds));
+        UndoRedoHandler.getInstance().add(new SequenceCommand(tr("Unglued Node"), cmds));
         getLayerManager().getEditDataSet().setSelected(n);
         mv.repaint();
@@ -553,5 +554,5 @@
      */
     private void execCommands(List<Command> cmds, List<Node> newNodes) {
-        MainApplication.undoRedo.add(new SequenceCommand(/* for correct i18n of plural forms - see #9110 */
+        UndoRedoHandler.getInstance().add(new SequenceCommand(/* for correct i18n of plural forms - see #9110 */
                 trn("Dupe into {0} node", "Dupe into {0} nodes", newNodes.size() + 1L, newNodes.size() + 1L), cmds));
         // select one of the new nodes
@@ -641,5 +642,5 @@
         notifyWayPartOfRelation(Collections.singleton(selectedWay));
 
-        MainApplication.undoRedo.add(new SequenceCommand(
+        UndoRedoHandler.getInstance().add(new SequenceCommand(
                 trn("Dupe {0} node into {1} nodes", "Dupe {0} nodes into {1} nodes",
                         selectedNodes.size(), selectedNodes.size(), selectedNodes.size()+allNewNodes.size()), cmds));
Index: /trunk/src/org/openstreetmap/josm/actions/UnJoinNodeWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/UnJoinNodeWayAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/UnJoinNodeWayAction.java	(revision 14134)
@@ -16,8 +16,8 @@
 
 import org.openstreetmap.josm.command.RemoveNodesCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.Notification;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -89,5 +89,5 @@
 
         // I'm sure there's a better way to handle this
-        MainApplication.undoRedo.add(new RemoveNodesCommand(selectedWay, selectedNodes));
+        UndoRedoHandler.getInstance().add(new RemoveNodesCommand(selectedWay, selectedNodes));
     }
 
Index: /trunk/src/org/openstreetmap/josm/actions/UndoAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/UndoAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/UndoAction.java	(revision 14134)
@@ -9,4 +9,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.UndoRedoHandler.CommandQueueListener;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -37,15 +38,15 @@
             return;
         map.repaint();
-        MainApplication.undoRedo.undo();
+        UndoRedoHandler.getInstance().undo();
     }
 
     @Override
     protected void updateEnabledState() {
-        setEnabled(Main.main != null && !MainApplication.undoRedo.commands.isEmpty());
+        setEnabled(Main.main != null && !UndoRedoHandler.getInstance().commands.isEmpty());
     }
 
     @Override
     public void commandChanged(int queueSize, int redoSize) {
-        if (MainApplication.undoRedo.commands.isEmpty()) {
+        if (UndoRedoHandler.getInstance().commands.isEmpty()) {
             putValue(NAME, tr("Undo"));
             setTooltip(tr("Undo the last action."));
@@ -53,5 +54,5 @@
             putValue(NAME, tr("Undo ..."));
             setTooltip(tr("Undo {0}",
-                    MainApplication.undoRedo.commands.getLast().getDescriptionText()));
+                    UndoRedoHandler.getInstance().commands.getLast().getDescriptionText()));
         }
     }
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 14134)
@@ -15,4 +15,5 @@
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.DeleteCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
@@ -157,5 +158,5 @@
         // if c is null, an error occurred or the user aborted. Don't do anything in that case.
         if (c != null) {
-            MainApplication.undoRedo.add(c);
+            UndoRedoHandler.getInstance().add(c);
             //FIXME: This should not be required, DeleteCommand should update the selection, otherwise undo/redo won't work.
             lm.getEditDataSet().setSelected();
@@ -304,5 +305,5 @@
         Command c = buildDeleteCommands(e, e.getModifiersEx(), false);
         if (c != null) {
-            MainApplication.undoRedo.add(c);
+            UndoRedoHandler.getInstance().add(c);
         }
 
@@ -355,5 +356,5 @@
         if (cmd != null) {
             // cmd can be null if the user cancels dialogs DialogCommand displays
-            MainApplication.undoRedo.add(cmd);
+            UndoRedoHandler.getInstance().add(cmd);
             for (Relation relation : toDelete) {
                 if (layer.data.getSelectedRelations().contains(relation)) {
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 14134)
@@ -39,4 +39,5 @@
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.DataSelectionListener;
@@ -667,5 +668,5 @@
         Command c = new SequenceCommand(title, cmds);
 
-        MainApplication.undoRedo.add(c);
+        UndoRedoHandler.getInstance().add(c);
         if (!wayIsFinished) {
             lastUsedNode = n;
@@ -1382,6 +1383,6 @@
         @Override
         public void actionPerformed(ActionEvent e) {
-            MainApplication.undoRedo.undo();
-            Command lastCmd = MainApplication.undoRedo.getLastCommand();
+            UndoRedoHandler.getInstance().undo();
+            Command lastCmd = UndoRedoHandler.getInstance().getLastCommand();
             if (lastCmd == null) return;
             Node n = null;
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java	(revision 14134)
@@ -37,4 +37,5 @@
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.DataIntegrityProblemException;
@@ -497,5 +498,5 @@
                         moveCommand2 = new MoveCommand(movingNodeList.get(1), movement2.getX(), movement2.getY());
                         Command c = new SequenceCommand(tr("Extrude Way"), moveCommand, moveCommand2);
-                        MainApplication.undoRedo.add(c);
+                        UndoRedoHandler.getInstance().add(c);
                     } else {
                         // reuse existing move commands
@@ -512,5 +513,5 @@
                         //make a new move command
                         moveCommand = new MoveCommand(new ArrayList<OsmPrimitive>(movingNodeList), bestMovement);
-                        MainApplication.undoRedo.add(moveCommand);
+                        UndoRedoHandler.getInstance().add(moveCommand);
                     } else {
                         //reuse existing move command
@@ -594,5 +595,5 @@
             wnew.addNode(ws.lowerIndex+1, n);
             DataSet ds = ws.way.getDataSet();
-            MainApplication.undoRedo.add(new SequenceCommand(tr("Add a new node to an existing way"),
+            UndoRedoHandler.getInstance().add(new SequenceCommand(tr("Add a new node to an existing way"),
                     new AddCommand(ds, n), new ChangeCommand(ds, ws.way, wnew)));
         }
@@ -626,5 +627,5 @@
         cmds.add(new AddCommand(ds, wnew));
         Command c = new SequenceCommand(tr("Extrude Way"), cmds);
-        MainApplication.undoRedo.add(c);
+        UndoRedoHandler.getInstance().add(c);
         ds.setSelected(wnew);
     }
@@ -715,5 +716,5 @@
         }
         Command c = new SequenceCommand(tr("Extrude Way"), cmds);
-        MainApplication.undoRedo.add(c);
+        UndoRedoHandler.getInstance().add(c);
         joinNodesIfCollapsed(changedNodes);
     }
@@ -727,8 +728,8 @@
         Command mergeCmd = MergeNodesAction.mergeNodes(changedNodes, targetNode, locNode);
         if (mergeCmd != null) {
-            MainApplication.undoRedo.add(mergeCmd);
+            UndoRedoHandler.getInstance().add(mergeCmd);
         } else {
             // undo extruding command itself
-            MainApplication.undoRedo.undo();
+            UndoRedoHandler.getInstance().undo();
         }
     }
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyAction.java	(revision 14134)
@@ -29,4 +29,5 @@
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.DataSelectionListener;
@@ -478,5 +479,5 @@
                         virtualSegments.size(), virtualSegments.size());
 
-                MainApplication.undoRedo.add(new SequenceCommand(text, virtualCmds));
+                UndoRedoHandler.getInstance().add(new SequenceCommand(text, virtualCmds));
 
             } else if (alt && !ctrl && candidateNode != null) {
@@ -495,8 +496,8 @@
                         final Command deleteCmd = DeleteCommand.delete(Collections.singleton(targetWay), true);
                         if (deleteCmd != null) {
-                            MainApplication.undoRedo.add(deleteCmd);
+                            UndoRedoHandler.getInstance().add(deleteCmd);
                         }
                     } else {
-                        MainApplication.undoRedo.add(new ChangeCommand(targetWay, newWay));
+                        UndoRedoHandler.getInstance().add(new ChangeCommand(targetWay, newWay));
                     }
                 } else if (candidateNode.isTagged()) {
@@ -507,5 +508,5 @@
                     final Command deleteCmd = DeleteCommand.delete(Collections.singleton(candidateNode), true);
                     if (deleteCmd != null) {
-                        MainApplication.undoRedo.add(deleteCmd);
+                        UndoRedoHandler.getInstance().add(deleteCmd);
                     }
                 }
@@ -517,5 +518,5 @@
                 EastNorth cursorEN = mv.getEastNorth(mousePos.x, mousePos.y);
 
-                MainApplication.undoRedo.add(new MoveCommand(candidateNode, cursorEN.east() - nodeEN.east(), cursorEN.north() - nodeEN.north()));
+                UndoRedoHandler.getInstance().add(new MoveCommand(candidateNode, cursorEN.east() - nodeEN.east(), cursorEN.north() - nodeEN.north()));
             }
         }
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/ParallelWays.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/ParallelWays.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/ParallelWays.java	(revision 14134)
@@ -15,4 +15,5 @@
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -20,5 +21,4 @@
 import org.openstreetmap.josm.data.osm.NodeGraph;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.tools.Geometry;
 
@@ -186,5 +186,5 @@
      */
     public void commit() {
-        MainApplication.undoRedo.add(new SequenceCommand("Make parallel way(s)", makeAddWayAndNodesCommandList()));
+        UndoRedoHandler.getInstance().add(new SequenceCommand("Make parallel way(s)", makeAddWayAndNodesCommandList()));
     }
 
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 14134)
@@ -31,4 +31,5 @@
 import org.openstreetmap.josm.command.ScaleCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -718,5 +719,5 @@
                 } else if (!selection.isEmpty()) {
                     c = new MoveCommand(selection, startEN, currentEN);
-                    MainApplication.undoRedo.add(c);
+                    UndoRedoHandler.getInstance().add(c);
                 }
                 for (Node n : affectedNodes) {
@@ -753,5 +754,5 @@
                         ((RotateCommand) c).handleEvent(currentEN);
                     } else {
-                        MainApplication.undoRedo.add(new RotateCommand(selection, currentEN));
+                        UndoRedoHandler.getInstance().add(new RotateCommand(selection, currentEN));
                     }
                 } else if (mode == Mode.SCALE) {
@@ -759,5 +760,5 @@
                         ((ScaleCommand) c).handleEvent(currentEN);
                     } else {
-                        MainApplication.undoRedo.add(new ScaleCommand(selection, currentEN));
+                        UndoRedoHandler.getInstance().add(new ScaleCommand(selection, currentEN));
                     }
                 }
@@ -808,5 +809,5 @@
      */
     private static Command getLastCommandInDataset(DataSet ds) {
-        Command lastCommand = MainApplication.undoRedo.getLastCommand();
+        Command lastCommand = UndoRedoHandler.getInstance().getLastCommand();
         if (lastCommand instanceof SequenceCommand) {
             lastCommand = ((SequenceCommand) lastCommand).getLastCommand();
@@ -834,5 +835,5 @@
             ed.showDialog();
             if (ed.getValue() != 1) {
-                MainApplication.undoRedo.undo();
+                UndoRedoHandler.getInstance().undo();
             }
         }
@@ -860,5 +861,5 @@
 
             if (ed.getValue() != 1) {
-                MainApplication.undoRedo.undo();
+                UndoRedoHandler.getInstance().undo();
             }
         } else {
@@ -1260,5 +1261,5 @@
                     "Add and move a virtual new node to {0} ways", virtualWays.size(),
                     virtualWays.size());
-            MainApplication.undoRedo.add(new SequenceCommand(text, virtualCmds));
+            UndoRedoHandler.getInstance().add(new SequenceCommand(text, virtualCmds));
             ds.setSelected(Collections.singleton((OsmPrimitive) virtualNode));
             clear();
Index: /trunk/src/org/openstreetmap/josm/actions/relation/AddSelectionToRelations.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/relation/AddSelectionToRelations.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/relation/AddSelectionToRelations.java	(revision 14134)
@@ -13,4 +13,5 @@
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.DataSelectionListener;
 import org.openstreetmap.josm.data.osm.IPrimitive;
@@ -48,5 +49,5 @@
         }
         if (!cmds.isEmpty()) {
-            MainApplication.undoRedo.add(new SequenceCommand(tr("Add selection to relation"), cmds));
+            UndoRedoHandler.getInstance().add(new SequenceCommand(tr("Add selection to relation"), cmds));
             new Notification(
                     "<html>"+
Index: /trunk/src/org/openstreetmap/josm/actions/relation/RecentRelationsAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/relation/RecentRelationsAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/relation/RecentRelationsAction.java	(revision 14134)
@@ -19,4 +19,5 @@
 
 import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.UndoRedoHandler.CommandQueueListener;
 import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
@@ -49,5 +50,5 @@
         arrow = editButton.createArrow(this);
         arrow.setToolTipText(tr("List of recent relations"));
-        MainApplication.undoRedo.addCommandQueueListener(this);
+        UndoRedoHandler.getInstance().addCommandQueueListener(this);
         enableArrow();
         shortcut = Shortcut.registerShortcut("relationeditor:editrecentrelation",
Index: /trunk/src/org/openstreetmap/josm/actions/upload/DiscardTagsHook.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/upload/DiscardTagsHook.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/upload/DiscardTagsHook.java	(revision 14134)
@@ -13,7 +13,7 @@
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.APIDataSet;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.AbstractPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.gui.MainApplication;
 
 /**
@@ -45,5 +45,5 @@
             SequenceCommand removeKeys = new SequenceCommand(tr("Removed obsolete tags"),
                     new ChangePropertyCommand(objectsToUpload, map));
-            MainApplication.undoRedo.add(removeKeys);
+            UndoRedoHandler.getInstance().add(removeKeys);
         }
         return true;
Index: /trunk/src/org/openstreetmap/josm/actions/upload/FixDataHook.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/upload/FixDataHook.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/actions/upload/FixDataHook.java	(revision 14134)
@@ -16,7 +16,7 @@
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.APIDataSet;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Utils;
@@ -205,5 +205,5 @@
 
             if (!cmds.isEmpty()) {
-                MainApplication.undoRedo.add(new SequenceCommand(tr("Fix deprecated tags"), cmds));
+                UndoRedoHandler.getInstance().add(new SequenceCommand(tr("Fix deprecated tags"), cmds));
             }
         }
Index: /trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 14134)
@@ -18,5 +18,5 @@
  * If you want to change a data set, you can use {@link #add(Command)} to execute a command on it and make that command undoable.
  */
-public class UndoRedoHandler {
+public final class UndoRedoHandler {
 
     /**
@@ -34,9 +34,22 @@
     private final LinkedList<CommandQueuePreciseListener> preciseListenerCommands = new LinkedList<>();
 
+    private static class InstanceHolder {
+        static final UndoRedoHandler INSTANCE = new UndoRedoHandler();
+    }
+
+    /**
+     * Returns the unique instance.
+     * @return the unique instance
+     * @since 14134
+     */
+    public static UndoRedoHandler getInstance() {
+        return InstanceHolder.INSTANCE;
+    }
+
     /**
      * Constructs a new {@code UndoRedoHandler}.
      */
-    public UndoRedoHandler() {
-        // Do nothing
+    private UndoRedoHandler() {
+        // Hide constructor
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 14134)
@@ -241,6 +241,8 @@
      * The commands undo/redo handler.
      * @since 12641
-     */
-    public static volatile UndoRedoHandler undoRedo;
+     * @deprecated Use {@link UndoRedoHandler#getInstance}
+     */
+    @Deprecated
+    public static final UndoRedoHandler undoRedo = UndoRedoHandler.getInstance();
 
     private static final LayerChangeListener undoRedoCleaner = new LayerChangeListener() {
@@ -360,5 +362,4 @@
     public MainApplication(MainFrame mainFrame) {
         this.mainFrame = mainFrame;
-        undoRedo = super.undoRedo;
         getLayerManager().addLayerChangeListener(undoRedoCleaner);
         ProjectionRegistry.setboundsProvider(mainBoundsProvider);
Index: /trunk/src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 14134)
@@ -115,4 +115,5 @@
 import org.openstreetmap.josm.actions.audio.AudioSlowerAction;
 import org.openstreetmap.josm.actions.search.SearchAction;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.gui.dialogs.MenuItemSearchDialog;
 import org.openstreetmap.josm.gui.io.RecentlyOpenedFilesMenu;
@@ -687,7 +688,7 @@
 
         add(editMenu, undo);
-        MainApplication.undoRedo.addCommandQueueListener(undo);
+        UndoRedoHandler.getInstance().addCommandQueueListener(undo);
         add(editMenu, redo);
-        MainApplication.undoRedo.addCommandQueueListener(redo);
+        UndoRedoHandler.getInstance().addCommandQueueListener(redo);
         editMenu.addSeparator();
         add(editMenu, copy);
Index: /trunk/src/org/openstreetmap/josm/gui/datatransfer/importers/AbstractTagPaster.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/datatransfer/importers/AbstractTagPaster.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/gui/datatransfer/importers/AbstractTagPaster.java	(revision 14134)
@@ -18,7 +18,7 @@
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.tools.I18n;
@@ -66,5 +66,5 @@
             @I18n.QuirkyPluralString
             final String title = title1 + ' ' + title2;
-            MainApplication.undoRedo.add(new SequenceCommand(title, commands));
+            UndoRedoHandler.getInstance().add(new SequenceCommand(title, commands));
         }
     }
Index: /trunk/src/org/openstreetmap/josm/gui/datatransfer/importers/PrimitiveDataPaster.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/datatransfer/importers/PrimitiveDataPaster.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/gui/datatransfer/importers/PrimitiveDataPaster.java	(revision 14134)
@@ -16,4 +16,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.AddPrimitivesCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.NodeData;
@@ -25,5 +26,4 @@
 import org.openstreetmap.josm.data.projection.ProjectionRegistry;
 import org.openstreetmap.josm.gui.ExtendedDialog;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.datatransfer.data.PrimitiveTransferData;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
@@ -59,5 +59,5 @@
 
         /* Now execute the commands to add the duplicated contents of the paste buffer to the map */
-        MainApplication.undoRedo.add(command);
+        UndoRedoHandler.getInstance().add(command);
         return true;
     }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java	(revision 14134)
@@ -40,4 +40,5 @@
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.PseudoCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.UndoRedoHandler.CommandAddedEvent;
 import org.openstreetmap.josm.data.UndoRedoHandler.CommandQueueCleanedEvent;
@@ -237,5 +238,5 @@
             listener.updateEnabledState();
         }
-        MainApplication.undoRedo.addCommandQueuePreciseListener(this);
+        UndoRedoHandler.getInstance().addCommandQueuePreciseListener(this);
     }
 
@@ -255,5 +256,5 @@
         undoTreeModel.setRoot(undoRoot);
         redoTreeModel.setRoot(redoRoot);
-        MainApplication.undoRedo.removeCommandQueuePreciseListener(this);
+        UndoRedoHandler.getInstance().removeCommandQueuePreciseListener(this);
     }
 
@@ -270,5 +271,5 @@
 
     private void buildUndoTree() {
-        List<Command> undoCommands = MainApplication.undoRedo.commands;
+        List<Command> undoCommands = UndoRedoHandler.getInstance().commands;
         undoRoot = new DefaultMutableTreeNode();
         for (int i = 0; i < undoCommands.size(); ++i) {
@@ -279,5 +280,5 @@
 
     private void buildRedoTree() {
-        List<Command> redoCommands = MainApplication.undoRedo.redoCommands;
+        List<Command> redoCommands = UndoRedoHandler.getInstance().redoCommands;
         redoRoot = new DefaultMutableTreeNode();
         for (int i = 0; i < redoCommands.size(); ++i) {
@@ -288,6 +289,6 @@
 
     private void ensureTreesConsistency() {
-        List<Command> undoCommands = MainApplication.undoRedo.commands;
-        List<Command> redoCommands = MainApplication.undoRedo.redoCommands;
+        List<Command> undoCommands = UndoRedoHandler.getInstance().commands;
+        List<Command> redoCommands = UndoRedoHandler.getInstance().redoCommands;
         if (redoTreeModel.getChildCount(redoRoot) > 0) {
             redoTree.scrollRowToVisible(0);
@@ -505,9 +506,9 @@
             case UNDO:
                 int numUndo = ((DefaultMutableTreeNode) undoTreeModel.getRoot()).getChildCount() - idx;
-                MainApplication.undoRedo.undo(numUndo);
+                UndoRedoHandler.getInstance().undo(numUndo);
                 break;
             case REDO:
                 int numRedo = idx+1;
-                MainApplication.undoRedo.redo(numRedo);
+                UndoRedoHandler.getInstance().redo(numRedo);
                 break;
             }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 14134)
@@ -41,4 +41,5 @@
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.conflict.Conflict;
 import org.openstreetmap.josm.data.conflict.ConflictCollection;
@@ -523,5 +524,5 @@
                 }
             }
-            MainApplication.undoRedo.add(new SequenceCommand(name, commands));
+            UndoRedoHandler.getInstance().add(new SequenceCommand(name, commands));
             refreshView();
         }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialog.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialog.java	(revision 14134)
@@ -18,8 +18,8 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.ExtendedDialog;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.conflict.pair.ConflictResolver;
 import org.openstreetmap.josm.gui.help.HelpBrowser;
@@ -204,5 +204,5 @@
                 }
             }
-            MainApplication.undoRedo.add(resolver.buildResolveCommand());
+            UndoRedoHandler.getInstance().add(resolver.buildResolveCommand());
             buttonAction(1, evt);
         }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 14134)
@@ -35,4 +35,5 @@
 import org.openstreetmap.josm.actions.relation.EditRelationAction;
 import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.DataSelectionListener;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -560,5 +561,5 @@
                 final Command fixCommand = error.getFix();
                 if (fixCommand != null) {
-                    SwingUtilities.invokeAndWait(() -> MainApplication.undoRedo.addNoRedraw(fixCommand));
+                    SwingUtilities.invokeAndWait(() -> UndoRedoHandler.getInstance().addNoRedraw(fixCommand));
                 }
                 // It is wanted to ignore an error if it said fixable, even if fixCommand was null
@@ -591,5 +592,5 @@
                 monitor.subTask(tr("Updating map ..."));
                 SwingUtilities.invokeAndWait(() -> {
-                    MainApplication.undoRedo.afterAdd(null);
+                    UndoRedoHandler.getInstance().afterAdd(null);
                     invalidateValidatorLayers();
                     tree.resetErrors();
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 14134)
@@ -59,4 +59,5 @@
 import org.openstreetmap.josm.command.ChangePropertyCommand;
 import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.AbstractPrimitive;
 import org.openstreetmap.josm.data.osm.DataSelectionListener;
@@ -844,5 +845,5 @@
             Command command = TaggingPreset.createCommand(getSelection(), tags);
             if (command != null) {
-                MainApplication.undoRedo.add(command);
+                UndoRedoHandler.getInstance().add(command);
             }
         }
@@ -1011,5 +1012,5 @@
 
             Collection<OsmPrimitive> sel = Main.main.getInProgressSelection();
-            MainApplication.undoRedo.add(new ChangePropertyCommand(sel, tags));
+            UndoRedoHandler.getInstance().add(new ChangePropertyCommand(sel, tags));
 
             membershipTable.clearSelection();
@@ -1042,5 +1043,5 @@
                 rel.removeMembersFor(primitive);
             }
-            MainApplication.undoRedo.add(new ChangeCommand(cur, rel));
+            UndoRedoHandler.getInstance().add(new ChangeCommand(cur, rel));
 
             tagTable.clearSelection();
@@ -1164,5 +1165,5 @@
             if (sel.isEmpty() || clipboard == null || sel.iterator().next().getDataSet().isLocked())
                 return;
-            MainApplication.undoRedo.add(new ChangePropertyCommand(sel, key, Utils.strip(clipboard)));
+            UndoRedoHandler.getInstance().add(new ChangePropertyCommand(sel, key, Utils.strip(clipboard)));
         }
     }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java	(revision 14134)
@@ -68,4 +68,5 @@
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Tag;
@@ -81,5 +82,4 @@
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.IExtendedDialog;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.datatransfer.ClipboardUtils;
 import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
@@ -508,5 +508,5 @@
                 return;
             if (key.equals(newkey) || value == null) {
-                MainApplication.undoRedo.add(new ChangePropertyCommand(sel, newkey, value));
+                UndoRedoHandler.getInstance().add(new ChangePropertyCommand(sel, newkey, value));
                 AutoCompletionManager.rememberUserInput(newkey, value, true);
             } else {
@@ -542,5 +542,5 @@
                     AutoCompletionManager.rememberUserInput(newkey, value, false);
                 }
-                MainApplication.undoRedo.add(new SequenceCommand(
+                UndoRedoHandler.getInstance().add(new SequenceCommand(
                         trn("Change properties of up to {0} object",
                                 "Change properties of up to {0} objects", sel.size(), sel.size()),
@@ -1077,5 +1077,5 @@
             AutoCompletionManager.rememberUserInput(key, value, false);
             commandCount++;
-            MainApplication.undoRedo.add(new ChangePropertyCommand(sel, key, value));
+            UndoRedoHandler.getInstance().add(new ChangePropertyCommand(sel, key, value));
             changedKey = key;
             clearEntries();
@@ -1088,5 +1088,5 @@
 
         public void undoAllTagsAdding() {
-            MainApplication.undoRedo.undo(commandCount);
+            UndoRedoHandler.getInstance().undo(commandCount);
         }
 
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/RefreshAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/RefreshAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/RefreshAction.java	(revision 14134)
@@ -12,9 +12,9 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.UndoRedoHandler.CommandQueueListener;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane.ButtonSpec;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -46,5 +46,5 @@
             rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(sc.getKeyStroke(), "refresh");
         }
-        MainApplication.undoRedo.addCommandQueueListener(this);
+        UndoRedoHandler.getInstance().addCommandQueueListener(this);
         updateEnabledState();
     }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/SavingAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/SavingAction.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/SavingAction.java	(revision 14134)
@@ -15,4 +15,5 @@
 import org.openstreetmap.josm.command.ChangeCommand;
 import org.openstreetmap.josm.command.conflict.ConflictAddCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.conflict.Conflict;
 import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
@@ -67,5 +68,5 @@
         if (newRelation.getMembersCount() == 0 && !newRelation.hasKeys())
             return;
-        MainApplication.undoRedo.add(new AddCommand(getLayer().getDataSet(), newRelation));
+        UndoRedoHandler.getInstance().add(new AddCommand(getLayer().getDataSet(), newRelation));
 
         // make sure everybody is notified about the changes
@@ -89,5 +90,5 @@
         editorAccess.getMemberTableModel().applyToRelation(editedRelation);
         Conflict<Relation> conflict = new Conflict<>(editorAccess.getEditor().getRelation(), editedRelation);
-        MainApplication.undoRedo.add(new ConflictAddCommand(getLayer().getDataSet(), conflict));
+        UndoRedoHandler.getInstance().add(new ConflictAddCommand(getLayer().getDataSet(), conflict));
     }
 
@@ -102,5 +103,5 @@
         getMemberTableModel().applyToRelation(editedRelation);
         if (!editedRelation.hasEqualSemanticAttributes(originRelation, false)) {
-            MainApplication.undoRedo.add(new ChangeCommand(originRelation, editedRelation));
+            UndoRedoHandler.getInstance().add(new ChangeCommand(originRelation, editedRelation));
         }
     }
Index: /trunk/src/org/openstreetmap/josm/gui/io/AsynchronousUploadPrimitivesTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/io/AsynchronousUploadPrimitivesTask.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/gui/io/AsynchronousUploadPrimitivesTask.java	(revision 14134)
@@ -9,4 +9,5 @@
 
 import org.openstreetmap.josm.data.APIDataSet;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -120,5 +121,5 @@
         GuiHelper.runInEDTAndWait(() -> {
             // Remove the commands from the undo stack
-            MainApplication.undoRedo.clean(uploadDataLayer.getDataSet());
+            UndoRedoHandler.getInstance().clean(uploadDataLayer.getDataSet());
             MainApplication.getLayerManager().prepareLayerForUpload(uploadDataLayer);
 
Index: /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 14134)
@@ -39,8 +39,8 @@
 import org.openstreetmap.josm.gui.io.importexport.GpxImporter;
 import org.openstreetmap.josm.gui.layer.gpx.ChooseTrackVisibilityAction;
+import org.openstreetmap.josm.gui.layer.gpx.ConvertFromGpxLayerAction;
 import org.openstreetmap.josm.gui.layer.gpx.CustomizeDrawingAction;
 import org.openstreetmap.josm.gui.layer.gpx.DownloadAlongTrackAction;
 import org.openstreetmap.josm.gui.layer.gpx.DownloadWmsAlongTrackAction;
-import org.openstreetmap.josm.gui.layer.gpx.ConvertFromGpxLayerAction;
 import org.openstreetmap.josm.gui.layer.gpx.GpxDrawHelper;
 import org.openstreetmap.josm.gui.layer.gpx.ImportAudioAction;
Index: /trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 14134)
@@ -52,4 +52,5 @@
 import org.openstreetmap.josm.data.DataSource;
 import org.openstreetmap.josm.data.ProjectionBounds;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.conflict.Conflict;
 import org.openstreetmap.josm.data.conflict.ConflictCollection;
@@ -618,5 +619,5 @@
             return;
 
-        MainApplication.undoRedo.clean(data);
+        UndoRedoHandler.getInstance().clean(data);
 
         // if uploaded, clean the modified flags as well
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 14134)
@@ -37,4 +37,5 @@
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.IPrimitive;
@@ -402,5 +403,5 @@
             Command cmd = createCommand(sel, getChangedTags());
             if (cmd != null) {
-                MainApplication.undoRedo.add(cmd);
+                UndoRedoHandler.getInstance().add(cmd);
             }
         } else if (answer == DIALOG_ANSWER_NEW_RELATION) {
Index: /trunk/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java	(revision 14134)
@@ -31,4 +31,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.ChangePropertyCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.ExtendedDialog;
@@ -259,5 +260,5 @@
                     String key = (String) tm.getValueAt(i, 1);
                     Object value = tm.getValueAt(i, 2);
-                    MainApplication.undoRedo.add(new ChangePropertyCommand(sel,
+                    UndoRedoHandler.getInstance().add(new ChangePropertyCommand(sel,
                             key, value instanceof String ? (String) value : ""));
                 }
@@ -313,5 +314,5 @@
             if (MainApplication.getLayerManager().getEditDataSet() != null) {
                 for (String[] row : keyValue) {
-                    MainApplication.undoRedo.add(new ChangePropertyCommand(primitives, row[0], row[1]));
+                    UndoRedoHandler.getInstance().add(new ChangePropertyCommand(primitives, row[0], row[1]));
                 }
             }
Index: /trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java	(revision 14134)
@@ -10,4 +10,5 @@
 import org.openstreetmap.josm.actions.AutoScaleAction;
 import org.openstreetmap.josm.command.AddCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -101,5 +102,5 @@
             node = new Node(ll);
             // Now execute the commands to add this node.
-            MainApplication.undoRedo.add(new AddCommand(ds, node));
+            UndoRedoHandler.getInstance().add(new AddCommand(ds, node));
         }
 
Index: /trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java	(revision 14133)
+++ /trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java	(revision 14134)
@@ -18,4 +18,5 @@
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -170,5 +171,5 @@
         DataSet ds = MainApplication.getLayerManager().getEditDataSet();
         commands.add(new AddCommand(ds, way));
-        MainApplication.undoRedo.add(new SequenceCommand(tr("Add way"), commands));
+        UndoRedoHandler.getInstance().add(new SequenceCommand(tr("Add way"), commands));
         ds.setSelected(way);
         if (PermissionPrefWithDefault.CHANGE_VIEWPORT.isAllowed()) {
Index: /trunk/test/unit/org/openstreetmap/josm/actions/mapmode/DrawActionTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/actions/mapmode/DrawActionTest.java	(revision 14133)
+++ /trunk/test/unit/org/openstreetmap/josm/actions/mapmode/DrawActionTest.java	(revision 14134)
@@ -16,4 +16,5 @@
 import org.junit.Rule;
 import org.junit.Test;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -91,5 +92,5 @@
             assertNotNull(renderer.getListCellRendererComponent(lstPrimitives, n3, 0, false, false));
 
-            MainApplication.undoRedo.undo();
+            UndoRedoHandler.getInstance().undo();
 
             assertEquals(2, w.getNodesCount());
Index: /trunk/test/unit/org/openstreetmap/josm/actions/upload/FixDataHookTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/actions/upload/FixDataHookTest.java	(revision 14133)
+++ /trunk/test/unit/org/openstreetmap/josm/actions/upload/FixDataHookTest.java	(revision 14134)
@@ -15,9 +15,9 @@
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.APIDataSet;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.testutils.JOSMTestRules;
 
@@ -42,7 +42,7 @@
     public void testCheckUpload() {
         // Empty data set
-        MainApplication.undoRedo.commands.clear();
+        UndoRedoHandler.getInstance().commands.clear();
         new FixDataHook().checkUpload(new APIDataSet());
-        assertTrue(MainApplication.undoRedo.commands.isEmpty());
+        assertTrue(UndoRedoHandler.getInstance().commands.isEmpty());
 
         // Complete data set (except empty node which cannot be tested anymore)
@@ -76,9 +76,9 @@
         ads.init(new DataSet(emptyWay, emptyRelation, w1, w2, w3, w4, w5, w6, w7, r1, r2));
 
-        MainApplication.undoRedo.commands.clear();
+        UndoRedoHandler.getInstance().commands.clear();
         new FixDataHook().checkUpload(ads);
-        assertEquals(1, MainApplication.undoRedo.commands.size());
+        assertEquals(1, UndoRedoHandler.getInstance().commands.size());
 
-        SequenceCommand seq = (SequenceCommand) MainApplication.undoRedo.commands.iterator().next();
+        SequenceCommand seq = (SequenceCommand) UndoRedoHandler.getInstance().commands.iterator().next();
         Collection<? extends OsmPrimitive> prims = seq.getParticipatingPrimitives();
         assertNotNull(prims);
Index: /trunk/test/unit/org/openstreetmap/josm/command/SplitWayCommandTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/command/SplitWayCommandTest.java	(revision 14133)
+++ /trunk/test/unit/org/openstreetmap/josm/command/SplitWayCommandTest.java	(revision 14134)
@@ -13,4 +13,5 @@
 import org.junit.Test;
 import org.openstreetmap.josm.command.SplitWayCommand.Strategy;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -20,5 +21,4 @@
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.testutils.JOSMTestRules;
 
@@ -121,5 +121,5 @@
         final SplitWayCommand result = SplitWayCommand.splitWay(
                 w2, SplitWayCommand.buildSplitChunks(w2, Arrays.asList(n3, n4, n5)), new ArrayList<OsmPrimitive>(), strategy);
-        MainApplication.undoRedo.add(result);
+        UndoRedoHandler.getInstance().add(result);
 
         assertEquals(6, route.getMembersCount());
Index: /trunk/test/unit/org/openstreetmap/josm/gui/dialogs/CommandStackDialogTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/dialogs/CommandStackDialogTest.java	(revision 14133)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/dialogs/CommandStackDialogTest.java	(revision 14134)
@@ -9,4 +9,5 @@
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -52,10 +53,10 @@
             Command cmd1 = TestUtils.newCommand(ds);
             Command cmd2 = TestUtils.newCommand(ds);
-            MainApplication.undoRedo.add(cmd1);
-            MainApplication.undoRedo.add(cmd2);
-            MainApplication.undoRedo.undo(1);
+            UndoRedoHandler.getInstance().add(cmd1);
+            UndoRedoHandler.getInstance().add(cmd2);
+            UndoRedoHandler.getInstance().undo(1);
 
-            assertFalse(MainApplication.undoRedo.commands.isEmpty());
-            assertFalse(MainApplication.undoRedo.redoCommands.isEmpty());
+            assertFalse(UndoRedoHandler.getInstance().commands.isEmpty());
+            assertFalse(UndoRedoHandler.getInstance().redoCommands.isEmpty());
 
             MapFrame map = MainApplication.getMap();
@@ -68,5 +69,5 @@
             assertFalse(dlg.isVisible());
         } finally {
-            MainApplication.undoRedo.clean();
+            UndoRedoHandler.getInstance().clean();
             MainApplication.getLayerManager().removeLayer(layer);
         }
