Index: trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- trunk/src/org/openstreetmap/josm/Main.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/Main.java	(revision 14143)
@@ -4,6 +4,4 @@
 import java.awt.Component;
 import java.net.URL;
-import java.util.Collection;
-import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
@@ -11,8 +9,5 @@
 import org.openstreetmap.josm.data.Preferences;
 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.OsmData;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.IOsmDataManager;
 import org.openstreetmap.josm.data.preferences.JosmBaseDirectories;
 import org.openstreetmap.josm.data.projection.Projection;
@@ -32,5 +27,5 @@
  * @since 98
  */
-public abstract class Main {
+public abstract class Main implements IOsmDataManager {
 
     /**
@@ -41,5 +36,7 @@
     /**
      * Global application.
-     */
+     * @deprecated Not needed anymore
+     */
+    @Deprecated
     public static volatile Main main;
 
@@ -83,55 +80,4 @@
         main = instance;
     }
-
-    /**
-     * Replies the current selected OSM primitives, from a end-user point of view.
-     * It is not always technically the same collection of primitives than {@link DataSet#getSelected()}.
-     * @return The current selected OSM primitives, from a end-user point of view. Can be {@code null}.
-     * @since 6546
-     */
-    public Collection<OsmPrimitive> getInProgressSelection() {
-        return Collections.emptyList();
-    }
-
-    /**
-     * Replies the current selected primitives, from a end-user point of view.
-     * It is not always technically the same collection of primitives than {@link OsmData#getSelected()}.
-     * @return The current selected primitives, from a end-user point of view. Can be {@code null}.
-     * @since 13926
-     */
-    public Collection<? extends IPrimitive> getInProgressISelection() {
-        return Collections.emptyList();
-    }
-
-    /**
-     * Gets the active edit data set (not read-only).
-     * @return That data set, <code>null</code>.
-     * @see #getActiveDataSet
-     * @since 12691
-     */
-    public abstract DataSet getEditDataSet();
-
-    /**
-     * Gets the active data set (can be read-only).
-     * @return That data set, <code>null</code>.
-     * @see #getEditDataSet
-     * @since 13434
-     */
-    public abstract DataSet getActiveDataSet();
-
-    /**
-     * Sets the active data set (and also edit data set if not read-only).
-     * @param ds New data set, or <code>null</code>
-     * @since 13434
-     */
-    public abstract void setActiveDataSet(DataSet ds);
-
-    /**
-     * Determines if the list of data sets managed by JOSM contains {@code ds}.
-     * @param ds the data set to look for
-     * @return {@code true} if the list of data sets managed by JOSM contains {@code ds}
-     * @since 12718
-     */
-    public abstract boolean containsDataSet(DataSet ds);
 
     ///////////////////////////////////////////////////////////////////////////
Index: trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java	(revision 14143)
@@ -23,5 +23,4 @@
 import javax.swing.JOptionPane;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.ReverseWayAction.ReverseWayResult;
 import org.openstreetmap.josm.command.AddCommand;
@@ -833,5 +832,5 @@
 
     private void commitCommand(Command c) {
-        if (Main.main != null && addUndoRedo) {
+        if (addUndoRedo) {
             UndoRedoHandler.getInstance().add(c);
         } else {
@@ -1600,5 +1599,5 @@
     private void makeCommitsOneAction(String message) {
         cmds.clear();
-        if (Main.main != null && addUndoRedo) {
+        if (addUndoRedo) {
             UndoRedoHandler ur = UndoRedoHandler.getInstance();
             int i = Math.max(ur.commands.size() - cmdsCount, 0);
Index: trunk/src/org/openstreetmap/josm/actions/RedoAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/RedoAction.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/actions/RedoAction.java	(revision 14143)
@@ -8,5 +8,4 @@
 import java.awt.event.KeyEvent;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.UndoRedoHandler.CommandQueueListener;
@@ -43,5 +42,5 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(Main.main != null && !UndoRedoHandler.getInstance().redoCommands.isEmpty());
+        setEnabled(!UndoRedoHandler.getInstance().redoCommands.isEmpty());
     }
 
Index: trunk/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java	(revision 14143)
@@ -181,13 +181,11 @@
             text.append("Program arguments: ").append(Arrays.toString(paramCleanup(commandLineArgs).toArray())).append('\n');
         }
-        if (Main.main != null) {
-            DataSet dataset = MainApplication.getLayerManager().getActiveDataSet();
-            if (dataset != null) {
-                String result = DatasetConsistencyTest.runTests(dataset);
-                if (result.isEmpty()) {
-                    text.append("Dataset consistency test: No problems found\n");
-                } else {
-                    text.append("\nDataset consistency test:\n").append(result).append('\n');
-                }
+        DataSet dataset = MainApplication.getLayerManager().getActiveDataSet();
+        if (dataset != null) {
+            String result = DatasetConsistencyTest.runTests(dataset);
+            if (result.isEmpty()) {
+                text.append("Dataset consistency test: No problems found\n");
+            } else {
+                text.append("\nDataset consistency test:\n").append(result).append('\n');
             }
         }
Index: trunk/src/org/openstreetmap/josm/actions/UndoAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/UndoAction.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/actions/UndoAction.java	(revision 14143)
@@ -8,5 +8,4 @@
 import java.awt.event.KeyEvent;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.UndoRedoHandler.CommandQueueListener;
@@ -43,5 +42,5 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(Main.main != null && !UndoRedoHandler.getInstance().commands.isEmpty());
+        setEnabled(!UndoRedoHandler.getInstance().commands.isEmpty());
     }
 
Index: trunk/src/org/openstreetmap/josm/actions/ZoomToAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ZoomToAction.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/actions/ZoomToAction.java	(revision 14143)
@@ -10,5 +10,4 @@
 import javax.swing.event.ListSelectionListener;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -105,5 +104,5 @@
 
     protected final void updateEnabledState() {
-        if (Main.main == null || MainApplication.getLayerManager().getActiveDataLayer() != this.table.getLayer()) {
+        if (MainApplication.getLayerManager().getActiveDataLayer() != this.table.getLayer()) {
             setEnabled(false);
             putValue(SHORT_DESCRIPTION, descriptionInactiveLayer);
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/ParallelWays.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/ParallelWays.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/ParallelWays.java	(revision 14143)
@@ -11,5 +11,4 @@
 import java.util.Set;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.AddCommand;
 import org.openstreetmap.josm.command.Command;
@@ -20,4 +19,5 @@
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.NodeGraph;
+import org.openstreetmap.josm.data.osm.OsmDataManager;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.tools.Geometry;
@@ -190,5 +190,5 @@
 
     private List<Command> makeAddWayAndNodesCommandList() {
-        DataSet ds = Main.main.getEditDataSet();
+        DataSet ds = OsmDataManager.getInstance().getEditDataSet();
         List<Command> commands = new ArrayList<>(sortedNodes.size() + ways.size());
         for (int i = 0; i < sortedNodes.size() - (isClosedPath() ? 1 : 0); i++) {
Index: trunk/src/org/openstreetmap/josm/command/SplitWayCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/SplitWayCommand.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/command/SplitWayCommand.java	(revision 14143)
@@ -219,5 +219,5 @@
      *
      * Note that changes are not applied to the data yet. You have to
-     * submit the command first, i.e. {@code Main.main.undoredo.add(result)}.
+     * submit the command first, i.e. {@code UndoRedoHandler.getInstance().add(result)}.
      *
      * @param way the way to split. Must not be null.
@@ -237,5 +237,5 @@
      *
      * Note that changes are not applied to the data yet. You have to
-     * submit the command first, i.e. {@code Main.main.undoredo.add(result)}.
+     * submit the command first, i.e. {@code UndoRedoHandler.getInstance().add(result)}.
      *
      * @param way the way to split. Must not be null.
@@ -464,5 +464,5 @@
      *
      * Note that changes are not applied to the data yet. You have to
-     * submit the command first, i.e. {@code Main.main.undoredo.add(result)}.
+     * submit the command first, i.e. {@code UndoRedoHandler.getInstance().add(result)}.
      *
      * Replies null if the way couldn't be split at the given nodes.
Index: trunk/src/org/openstreetmap/josm/command/conflict/ConflictAddCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/conflict/ConflictAddCommand.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/command/conflict/ConflictAddCommand.java	(revision 14143)
@@ -15,4 +15,5 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
+import org.openstreetmap.josm.data.osm.OsmDataManager;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -66,5 +67,5 @@
     public void undoCommand() {
         DataSet ds = getAffectedDataSet();
-        if (Main.main != null && !Main.main.containsDataSet(ds)) {
+        if (!OsmDataManager.getInstance().containsDataSet(ds)) {
             Logging.warn(tr("Layer ''{0}'' does not exist any more. Cannot remove conflict for object ''{1}''.",
                     ds.getName(),
Index: trunk/src/org/openstreetmap/josm/command/conflict/ConflictResolveCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/conflict/ConflictResolveCommand.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/command/conflict/ConflictResolveCommand.java	(revision 14143)
@@ -6,9 +6,9 @@
 import java.util.Objects;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.data.conflict.Conflict;
 import org.openstreetmap.josm.data.conflict.ConflictCollection;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmDataManager;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -63,15 +63,13 @@
 
         DataSet ds = getAffectedDataSet();
-        if (Main.main != null) {
-            if (!Main.main.containsDataSet(ds)) {
-                Logging.warn(tr("Cannot undo command ''{0}'' because layer ''{1}'' is not present any more",
-                        this.toString(),
-                        ds.getName()
-                ));
-                return;
-            }
+        if (!OsmDataManager.getInstance().containsDataSet(ds)) {
+            Logging.warn(tr("Cannot undo command ''{0}'' because layer ''{1}'' is not present any more",
+                    this.toString(),
+                    ds.getName()
+            ));
+            return;
+        }
 
-            Main.main.setActiveDataSet(ds);
-        }
+        OsmDataManager.getInstance().setActiveDataSet(ds);
         reconstituteConflicts();
     }
Index: trunk/src/org/openstreetmap/josm/command/conflict/RelationMemberConflictResolverCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/conflict/RelationMemberConflictResolverCommand.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/command/conflict/RelationMemberConflictResolverCommand.java	(revision 14143)
@@ -10,7 +10,7 @@
 import javax.swing.Icon;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.conflict.Conflict;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmDataManager;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -73,5 +73,5 @@
     public void undoCommand() {
         DataSet ds = getAffectedDataSet();
-        if (!Main.main.containsDataSet(ds)) {
+        if (!OsmDataManager.getInstance().containsDataSet(ds)) {
             Logging.warn(tr("Cannot undo command ''{0}'' because layer ''{1}'' is not present any more",
                     this.toString(),
@@ -81,5 +81,5 @@
         }
 
-        Main.main.setActiveDataSet(ds);
+        OsmDataManager.getInstance().setActiveDataSet(ds);
 
         // restore the former state
Index: trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 14143)
@@ -7,7 +7,7 @@
 import java.util.Objects;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmDataManager;
 import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
@@ -291,5 +291,5 @@
         if (commands.isEmpty())
             return;
-        DataSet ds = Main.main.getEditDataSet();
+        DataSet ds = OsmDataManager.getInstance().getEditDataSet();
         if (ds != null) {
             ds.beginUpdate();
Index: trunk/src/org/openstreetmap/josm/data/osm/FilterModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/FilterModel.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/data/osm/FilterModel.java	(revision 14143)
@@ -98,5 +98,5 @@
      */
     public void executeFilters() {
-        DataSet ds = Main.main.getActiveDataSet();
+        DataSet ds = OsmDataManager.getInstance().getActiveDataSet();
         changed = false;
         if (ds == null) {
@@ -150,5 +150,5 @@
      */
     public void executeFilters(Collection<? extends OsmPrimitive> primitives) {
-        DataSet ds = Main.main.getEditDataSet();
+        DataSet ds = OsmDataManager.getInstance().getEditDataSet();
         if (ds == null)
             return;
@@ -209,5 +209,5 @@
      */
     public void clearFilterFlags() {
-        DataSet ds = Main.main.getEditDataSet();
+        DataSet ds = OsmDataManager.getInstance().getEditDataSet();
         if (ds != null) {
             FilterWorker.clearFilterFlags(ds.allPrimitives());
Index: trunk/src/org/openstreetmap/josm/data/osm/IOsmDataManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/IOsmDataManager.java	(revision 14143)
+++ trunk/src/org/openstreetmap/josm/data/osm/IOsmDataManager.java	(revision 14143)
@@ -0,0 +1,52 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm;
+
+import java.util.Collection;
+
+/**
+ * Global OSM dataset registry.
+ * @since 14143
+ */
+public interface IOsmDataManager {
+
+    /**
+     * Replies the current selected OSM primitives, from a end-user point of view.
+     * It is not always technically the same collection of primitives than {@link DataSet#getSelected()}.
+     * @return The current selected OSM primitives, from a end-user point of view. Can be {@code null}.
+     */
+    Collection<OsmPrimitive> getInProgressSelection();
+
+    /**
+     * Replies the current selected primitives, from a end-user point of view.
+     * It is not always technically the same collection of primitives than {@link OsmData#getSelected()}.
+     * @return The current selected primitives, from a end-user point of view. Can be {@code null}.
+     */
+    Collection<? extends IPrimitive> getInProgressISelection();
+
+    /**
+     * Gets the active edit data set (not read-only).
+     * @return That data set, <code>null</code>.
+     * @see #getActiveDataSet
+     */
+    DataSet getEditDataSet();
+
+    /**
+     * Gets the active data set (can be read-only).
+     * @return That data set, <code>null</code>.
+     * @see #getEditDataSet
+     */
+    DataSet getActiveDataSet();
+
+    /**
+     * Sets the active data set (and also edit data set if not read-only).
+     * @param ds New data set, or <code>null</code>
+     */
+    void setActiveDataSet(DataSet ds);
+
+    /**
+     * Determines if the list of data sets managed by JOSM contains {@code ds}.
+     * @param ds the data set to look for
+     * @return {@code true} if the list of data sets managed by JOSM contains {@code ds}
+     */
+    boolean containsDataSet(DataSet ds);
+}
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmDataManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmDataManager.java	(revision 14143)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmDataManager.java	(revision 14143)
@@ -0,0 +1,82 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Optional;
+
+import org.openstreetmap.josm.actions.mapmode.DrawAction;
+import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.gui.MapFrame;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+
+/**
+ * Global OSM dataset registry.
+ * @since 14143
+ */
+public final class OsmDataManager implements IOsmDataManager {
+
+    private OsmDataManager() {
+        // hide constructor
+    }
+
+    private static class InstanceHolder {
+        static final OsmDataManager INSTANCE = new OsmDataManager();
+    }
+
+    /**
+     * Returns the unique instance.
+     * @return the unique instance
+     */
+    public static OsmDataManager getInstance() {
+        return InstanceHolder.INSTANCE;
+    }
+
+    @Override
+    public Collection<OsmPrimitive> getInProgressSelection() {
+        MapFrame map = MainApplication.getMap();
+        if (map != null && map.mapMode instanceof DrawAction) {
+            return ((DrawAction) map.mapMode).getInProgressSelection();
+        } else {
+            DataSet ds = MainApplication.getLayerManager().getActiveDataSet();
+            if (ds == null) return Collections.emptyList();
+            return ds.getSelected();
+        }
+    }
+
+    @Override
+    public Collection<? extends IPrimitive> getInProgressISelection() {
+        MapFrame map = MainApplication.getMap();
+        if (map != null && map.mapMode instanceof DrawAction) {
+            return ((DrawAction) map.mapMode).getInProgressSelection();
+        } else {
+            OsmData<?, ?, ?, ?> ds = MainApplication.getLayerManager().getActiveData();
+            if (ds == null) return Collections.emptyList();
+            return ds.getSelected();
+        }
+    }
+
+    @Override
+    public DataSet getEditDataSet() {
+        return MainApplication.getLayerManager().getEditDataSet();
+    }
+
+    @Override
+    public DataSet getActiveDataSet() {
+        return MainApplication.getLayerManager().getActiveDataSet();
+    }
+
+    @Override
+    public void setActiveDataSet(DataSet ds) {
+        Optional<OsmDataLayer> layer = MainApplication.getLayerManager().getLayersOfType(OsmDataLayer.class).stream()
+                .filter(l -> l.data.equals(ds)).findFirst();
+        if (layer.isPresent()) {
+            MainApplication.getLayerManager().setActiveLayer(layer.get());
+        }
+    }
+
+    @Override
+    public boolean containsDataSet(DataSet ds) {
+        return MainApplication.getLayerManager().getLayersOfType(OsmDataLayer.class).stream().anyMatch(l -> l.data.equals(ds));
+    }
+}
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java	(revision 14143)
@@ -18,5 +18,4 @@
 import java.util.Set;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -24,4 +23,5 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmDataManager;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.QuadBuckets;
@@ -169,5 +169,5 @@
         mindist = Config.getPref().getDouble(PREFIX + ".node_way_distance", 10.0);
         minmiddledist = Config.getPref().getDouble(PREFIX + ".way_way_distance", 0.0);
-        DataSet dataSet = Main.main != null ? Main.main.getEditDataSet() : null;
+        DataSet dataSet = OsmDataManager.getInstance().getEditDataSet();
         dsArea = dataSet == null ? null : dataSet.getDataSourceArea();
     }
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/UntaggedWay.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/UntaggedWay.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/UntaggedWay.java	(revision 14143)
@@ -9,7 +9,7 @@
 import java.util.Set;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmDataManager;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -142,5 +142,5 @@
     public void startTest(ProgressMonitor monitor) {
         super.startTest(monitor);
-        DataSet ds = Main.main.getEditDataSet();
+        DataSet ds = OsmDataManager.getInstance().getEditDataSet();
         if (ds == null)
             return;
Index: trunk/src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 14143)
@@ -78,5 +78,4 @@
 import org.openstreetmap.josm.actions.downloadtasks.DownloadTask;
 import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
-import org.openstreetmap.josm.actions.mapmode.DrawAction;
 import org.openstreetmap.josm.actions.search.SearchAction;
 import org.openstreetmap.josm.cli.CLIModule;
@@ -90,5 +89,5 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.IPrimitive;
-import org.openstreetmap.josm.data.osm.OsmData;
+import org.openstreetmap.josm.data.osm.OsmDataManager;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.UserInfo;
@@ -418,45 +417,53 @@
     }
 
+    /**
+     * @deprecated Use {@code OsmDataManager.getInstance().getInProgressSelection()}
+     */
+    @Deprecated
     @Override
     public Collection<OsmPrimitive> getInProgressSelection() {
-        if (map != null && map.mapMode instanceof DrawAction) {
-            return ((DrawAction) map.mapMode).getInProgressSelection();
-        } else {
-            DataSet ds = layerManager.getActiveDataSet();
-            if (ds == null) return Collections.emptyList();
-            return ds.getSelected();
-        }
-    }
-
+        return OsmDataManager.getInstance().getInProgressSelection();
+    }
+
+    /**
+     * @deprecated Use {@code OsmDataManager.getInstance().getInProgressSelection()}
+     */
+    @Deprecated
     @Override
     public Collection<? extends IPrimitive> getInProgressISelection() {
-        if (map != null && map.mapMode instanceof DrawAction) {
-            return ((DrawAction) map.mapMode).getInProgressSelection();
-        } else {
-            OsmData<?, ?, ?, ?> ds = layerManager.getActiveData();
-            if (ds == null) return Collections.emptyList();
-            return ds.getSelected();
-        }
-    }
-
+        return OsmDataManager.getInstance().getInProgressSelection();
+    }
+
+    /**
+     * @deprecated Use {@code OsmDataManager.getInstance().getEditDataSet()}
+     */
+    @Deprecated
     @Override
     public DataSet getEditDataSet() {
-        return getLayerManager().getEditDataSet();
-    }
-
+        return OsmDataManager.getInstance().getEditDataSet();
+    }
+
+    /**
+     * @deprecated Use {@code OsmDataManager.getInstance().getActiveDataSet()}
+     */
+    @Deprecated
     @Override
     public DataSet getActiveDataSet() {
-        return getLayerManager().getActiveDataSet();
-    }
-
+        return OsmDataManager.getInstance().getActiveDataSet();
+    }
+
+    /**
+     * @deprecated Use {@code OsmDataManager.getInstance().setActiveDataSet}
+     */
+    @Deprecated
     @Override
     public void setActiveDataSet(DataSet ds) {
-        Optional<OsmDataLayer> layer = getLayerManager().getLayersOfType(OsmDataLayer.class).stream()
-                .filter(l -> l.data.equals(ds)).findFirst();
-        if (layer.isPresent()) {
-            getLayerManager().setActiveLayer(layer.get());
-        }
-    }
-
+        OsmDataManager.getInstance().setActiveDataSet(ds);
+    }
+
+    /**
+     * @deprecated Use {@code OsmDataManager.getInstance().containsDataSet}
+     */
+    @Deprecated
     @Override
     public boolean containsDataSet(DataSet ds) {
@@ -488,5 +495,5 @@
      * @return the MapFrame
      * @see MainPanel
-     * @since 12630 (as a replacement to {@code Main.map})
+     * @since 12630
      */
     public static MapFrame getMap() {
@@ -497,5 +504,5 @@
      * Returns the main panel.
      * @return the main panel
-     * @since 12642 (as a replacement to {@code Main.main.panel})
+     * @since 12642
      */
     public static MainPanel getMainPanel() {
@@ -515,5 +522,5 @@
      * Returns the toolbar preference control to register new actions.
      * @return the toolbar preference control
-     * @since 12637 (as a replacement to {@code Main.toolbar})
+     * @since 12637
      */
     public static ToolbarPreferences getToolbar() {
Index: trunk/src/org/openstreetmap/josm/gui/datatransfer/importers/AbstractTagPaster.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/datatransfer/importers/AbstractTagPaster.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/gui/datatransfer/importers/AbstractTagPaster.java	(revision 14143)
@@ -14,5 +14,4 @@
 import javax.swing.TransferHandler.TransferSupport;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.ChangePropertyCommand;
 import org.openstreetmap.josm.command.Command;
@@ -20,4 +19,5 @@
 import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.osm.OsmDataManager;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
@@ -49,5 +49,5 @@
     public boolean importTagsOn(TransferSupport support, Collection<? extends OsmPrimitive> selection)
             throws UnsupportedFlavorException, IOException {
-        ChangePropertyCommand command = new ChangePropertyCommand(Main.main.getEditDataSet(), selection, getTags(support));
+        ChangePropertyCommand command = new ChangePropertyCommand(OsmDataManager.getInstance().getEditDataSet(), selection, getTags(support));
         commitCommands(selection, Collections.singletonList(command));
         return true;
Index: trunk/src/org/openstreetmap/josm/gui/datatransfer/importers/PrimitiveTagTransferPaster.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/datatransfer/importers/PrimitiveTagTransferPaster.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/gui/datatransfer/importers/PrimitiveTagTransferPaster.java	(revision 14143)
@@ -19,4 +19,5 @@
 import org.openstreetmap.josm.data.osm.IPrimitive;
 import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmDataManager;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
@@ -53,5 +54,5 @@
             Map<String, String> tags = new HashMap<>(1);
             tags.put(tag.getKey(), "".equals(tag.getValue()) ? null : tag.getValue());
-            ChangePropertyCommand cmd = new ChangePropertyCommand(Main.main.getEditDataSet(), selection, tags);
+            ChangePropertyCommand cmd = new ChangePropertyCommand(OsmDataManager.getInstance().getEditDataSet(), selection, tags);
             if (cmd.getObjectsNumber() > 0) {
                 commands.add(cmd);
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 14143)
@@ -268,9 +268,7 @@
      */
     protected void registerInWindowMenu() {
-        if (Main.main != null) {
-            windowMenuItem = MainMenu.addWithCheckbox(MainApplication.getMenu().windowMenu,
-                    (JosmAction) getToggleAction(),
-                    MainMenu.WINDOW_MENU_GROUP.TOGGLE_DIALOG);
-        }
+        windowMenuItem = MainMenu.addWithCheckbox(MainApplication.getMenu().windowMenu,
+                (JosmAction) getToggleAction(),
+                MainMenu.WINDOW_MENU_GROUP.TOGGLE_DIALOG);
     }
 
@@ -465,7 +463,5 @@
             hideNotify();
         }
-        if (Main.main != null) {
-            MainApplication.getMenu().windowMenu.remove(windowMenuItem);
-        }
+        MainApplication.getMenu().windowMenu.remove(windowMenuItem);
         try {
             Toolkit.getDefaultToolkit().removeAWTEventListener(this);
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 14143)
@@ -17,5 +17,4 @@
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashMap;
@@ -69,4 +68,5 @@
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmData;
+import org.openstreetmap.josm.data.osm.OsmDataManager;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -184,9 +184,9 @@
     private final PasteValueAction pasteValueAction = new PasteValueAction();
     private final CopyValueAction copyValueAction = new CopyValueAction(
-            tagTable, editHelper::getDataKey, Main.main::getInProgressISelection);
+            tagTable, editHelper::getDataKey, OsmDataManager.getInstance()::getInProgressISelection);
     private final CopyKeyValueAction copyKeyValueAction = new CopyKeyValueAction(
-            tagTable, editHelper::getDataKey, Main.main::getInProgressISelection);
+            tagTable, editHelper::getDataKey, OsmDataManager.getInstance()::getInProgressISelection);
     private final CopyAllKeyValueAction copyAllKeyValueAction = new CopyAllKeyValueAction(
-            tagTable, editHelper::getDataKey, Main.main::getInProgressISelection);
+            tagTable, editHelper::getDataKey, OsmDataManager.getInstance()::getInProgressISelection);
     private final SearchAction searchActionSame = new SearchAction(true);
     private final SearchAction searchActionAny = new SearchAction(false);
@@ -568,5 +568,5 @@
 
         // Ignore parameter as we do not want to operate always on real selection here, especially in draw mode
-        Collection<? extends IPrimitive> newSel = Main.main.getInProgressISelection();
+        Collection<? extends IPrimitive> newSel = OsmDataManager.getInstance().getInProgressISelection();
         String selectedTag;
         IRelation<?> selectedRelation = null;
@@ -851,5 +851,5 @@
         @Override
         public Collection<OsmPrimitive> getSelection() {
-            return Main.main == null ? Collections.<OsmPrimitive>emptyList() : Main.main.getInProgressSelection();
+            return OsmDataManager.getInstance().getInProgressSelection();
         }
     }
@@ -1011,5 +1011,5 @@
             }
 
-            Collection<OsmPrimitive> sel = Main.main.getInProgressSelection();
+            Collection<OsmPrimitive> sel = OsmDataManager.getInstance().getInProgressSelection();
             UndoRedoHandler.getInstance().add(new ChangePropertyCommand(sel, tags));
 
@@ -1040,5 +1040,5 @@
 
             Relation rel = new Relation(cur);
-            for (OsmPrimitive primitive: Main.main.getInProgressSelection()) {
+            for (OsmPrimitive primitive: OsmDataManager.getInstance().getInProgressSelection()) {
                 rel.removeMembersFor(primitive);
             }
@@ -1069,5 +1069,5 @@
         @Override
         protected final void updateEnabledState() {
-            DataSet ds = Main.main.getActiveDataSet();
+            DataSet ds = OsmDataManager.getInstance().getActiveDataSet();
             setEnabled(ds != null && !ds.isLocked() &&
                     ((tagTable != null && tagTable.getSelectedRowCount() >= 1)
@@ -1137,5 +1137,5 @@
         @Override
         protected void updateEnabledState() {
-            DataSet ds = Main.main.getActiveDataSet();
+            DataSet ds = OsmDataManager.getInstance().getActiveDataSet();
             setEnabled(ds != null && !ds.isLocked() &&
                     ((tagTable != null && tagTable.getSelectedRowCount() == 1)
@@ -1161,5 +1161,5 @@
                 return;
             String key = editHelper.getDataKey(tagTable.getSelectedRow());
-            Collection<OsmPrimitive> sel = Main.main.getInProgressSelection();
+            Collection<OsmPrimitive> sel = OsmDataManager.getInstance().getInProgressSelection();
             String clipboard = ClipboardUtils.getClipboardStringContent();
             if (sel.isEmpty() || clipboard == null || sel.iterator().next().getDataSet().isLocked())
@@ -1188,5 +1188,5 @@
                 return;
             String key = editHelper.getDataKey(tagTable.getSelectedRow());
-            Collection<? extends IPrimitive> sel = Main.main.getInProgressISelection();
+            Collection<? extends IPrimitive> sel = OsmDataManager.getInstance().getInProgressISelection();
             if (sel.isEmpty())
                 return;
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java	(revision 14143)
@@ -69,4 +69,5 @@
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.UndoRedoHandler;
+import org.openstreetmap.josm.data.osm.OsmDataManager;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Tag;
@@ -232,5 +233,5 @@
     public void addTag() {
         changedKey = null;
-        sel = Main.main.getInProgressSelection();
+        sel = OsmDataManager.getInstance().getInProgressSelection();
         if (sel == null || sel.isEmpty())
             return;
@@ -263,5 +264,5 @@
     public void editTag(final int row, boolean focusOnKey) {
         changedKey = null;
-        sel = Main.main.getInProgressSelection();
+        sel = OsmDataManager.getInstance().getInProgressSelection();
         if (sel == null || sel.isEmpty())
             return;
@@ -448,5 +449,5 @@
             mainPanel.add(p, BorderLayout.CENTER);
 
-            AutoCompletionManager autocomplete = AutoCompletionManager.of(Main.main.getActiveDataSet());
+            AutoCompletionManager autocomplete = AutoCompletionManager.of(OsmDataManager.getInstance().getActiveDataSet());
             List<AutoCompletionItem> keyList = autocomplete.getTagKeys(DEFAULT_AC_ITEM_COMPARATOR);
 
@@ -565,5 +566,5 @@
         public void setupDialog() {
             super.setupDialog();
-            buttons.get(0).setEnabled(!Main.main.getActiveDataSet().isLocked());
+            buttons.get(0).setEnabled(!OsmDataManager.getInstance().getActiveDataSet().isLocked());
             final Dimension size = getSize();
             // Set resizable only in width
@@ -701,5 +702,5 @@
 
             cacheRecentTags();
-            AutoCompletionManager autocomplete = AutoCompletionManager.of(Main.main.getActiveDataSet());
+            AutoCompletionManager autocomplete = AutoCompletionManager.of(OsmDataManager.getInstance().getActiveDataSet());
             List<AutoCompletionItem> keyList = autocomplete.getTagKeys(DEFAULT_AC_ITEM_COMPARATOR);
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java	(revision 14143)
@@ -21,5 +21,4 @@
 import javax.swing.event.ListSelectionListener;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.AutoScaleAction;
 import org.openstreetmap.josm.actions.ZoomToAction;
@@ -249,6 +248,5 @@
 
         private void updateEnabledState() {
-            setEnabled(Main.main != null
-                    && MainApplication.getLayerManager().getEditLayer() == getLayer()
+            setEnabled(MainApplication.getLayerManager().getEditLayer() == getLayer()
                     && getSelectedRowCount() == 1
                     && hasGap());
Index: trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java	(revision 14143)
@@ -10,5 +10,4 @@
 import javax.swing.table.TableModel;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.UserIdentityManager;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -102,9 +101,7 @@
         referenceRelationMemberTableModel = new DiffTableModel();
 
-        if (Main.main != null) {
-            DataSet ds = MainApplication.getLayerManager().getActiveDataSet();
-            if (ds != null) {
-                ds.addDataSetListener(this);
-            }
+        DataSet ds = MainApplication.getLayerManager().getActiveDataSet();
+        if (ds != null) {
+            ds.addDataSetListener(this);
         }
         MainApplication.getLayerManager().addActiveLayerChangeListener(this);
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 14143)
@@ -41,4 +41,5 @@
 import org.openstreetmap.josm.data.osm.IPrimitive;
 import org.openstreetmap.josm.data.osm.OsmData;
+import org.openstreetmap.josm.data.osm.OsmDataManager;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -383,8 +384,5 @@
     @Override
     public void actionPerformed(ActionEvent e) {
-        if (Main.main == null) {
-            return;
-        }
-        DataSet ds = Main.main.getEditDataSet();
+        DataSet ds = OsmDataManager.getInstance().getEditDataSet();
         Collection<OsmPrimitive> participants = Collections.emptyList();
         if (ds != null) {
@@ -565,5 +563,5 @@
 
     protected final void updateEnabledState() {
-        setEnabled(Main.main != null && Main.main.getEditDataSet() != null);
+        setEnabled(OsmDataManager.getInstance().getEditDataSet() != null);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java	(revision 14143)
@@ -17,6 +17,6 @@
 import javax.swing.JPanel;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmDataManager;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Tag;
@@ -43,6 +43,5 @@
 
     protected void initAutoCompletionField(AutoCompletingTextField field, List<String> keys) {
-        if (Main.main == null) return;
-        DataSet data = Main.main.getEditDataSet();
+        DataSet data = OsmDataManager.getInstance().getEditDataSet();
         if (data == null) {
             return;
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSelector.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSelector.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSelector.java	(revision 14143)
@@ -34,7 +34,7 @@
 import javax.swing.event.ListSelectionListener;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.DataSelectionListener;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmDataManager;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
@@ -240,5 +240,5 @@
         boolean inTags = ckSearchInTags != null && ckSearchInTags.isSelected();
 
-        DataSet ds = Main.main.getEditDataSet();
+        DataSet ds = OsmDataManager.getInstance().getEditDataSet();
         Collection<OsmPrimitive> selected = (ds == null) ? Collections.<OsmPrimitive>emptyList() : ds.getSelected();
         final List<PresetClassification> result = classifications.getMatchingPresets(
@@ -360,6 +360,6 @@
                 typesInSelectionDirty = false;
                 typesInSelection.clear();
-                if (Main.main == null || Main.main.getEditDataSet() == null) return typesInSelection;
-                for (OsmPrimitive primitive : Main.main.getEditDataSet().getSelected()) {
+                if (OsmDataManager.getInstance().getEditDataSet() == null) return typesInSelection;
+                for (OsmPrimitive primitive : OsmDataManager.getInstance().getEditDataSet().getSelected()) {
                     typesInSelection.add(TaggingPresetType.forPrimitive(primitive));
                 }
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java	(revision 14140)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java	(revision 14143)
@@ -13,5 +13,4 @@
 import java.util.Map.Entry;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.AutoScaleAction;
 import org.openstreetmap.josm.command.AddCommand;
@@ -22,4 +21,5 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmDataManager;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
@@ -151,5 +151,5 @@
             nd = new Node(ll);
             // Now execute the commands to add this node.
-            commands.add(new AddCommand(Main.main.getEditDataSet(), nd));
+            commands.add(new AddCommand(OsmDataManager.getInstance().getEditDataSet(), nd));
             addedNodes.put(ll, nd);
         }
