Index: trunk/src/org/openstreetmap/josm/actions/AddNodeAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/AddNodeAction.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/actions/AddNodeAction.java	(revision 10467)
@@ -66,8 +66,10 @@
         Main.main.undoRedo.add(new AddCommand(nnew));
         getLayerManager().getEditDataSet().setSelected(nnew);
-        if (Main.map.mapView.getRealBounds().contains(nnew.getCoor())) {
-            Main.map.mapView.repaint();
-        } else {
-            AutoScaleAction.zoomTo(Collections.<OsmPrimitive>singleton(nnew));
+        if (Main.map.mapView != null) {
+            if (Main.map.mapView.getRealBounds().contains(nnew.getCoor())) {
+                Main.map.mapView.repaint();
+            } else {
+                AutoScaleAction.zoomTo(Collections.<OsmPrimitive>singleton(nnew));
+            }
         }
     }
Index: trunk/src/org/openstreetmap/josm/actions/AlignInCircleAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/AlignInCircleAction.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/actions/AlignInCircleAction.java	(revision 10467)
@@ -284,5 +284,4 @@
 
         Main.main.undoRedo.add(new SequenceCommand(tr("Align Nodes in Circle"), cmds));
-        Main.map.repaint();
     }
 
Index: trunk/src/org/openstreetmap/josm/actions/AlignInLineAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/AlignInLineAction.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/actions/AlignInLineAction.java	(revision 10467)
@@ -205,5 +205,4 @@
             // Do it!
             Main.main.undoRedo.add(cmd);
-            Main.map.repaint();
 
         } catch (InvalidSelection except) {
Index: trunk/src/org/openstreetmap/josm/actions/CreateCircleAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/CreateCircleAction.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/actions/CreateCircleAction.java	(revision 10467)
@@ -241,5 +241,4 @@
 
         Main.main.undoRedo.add(new SequenceCommand(tr("Create Circle"), cmds));
-        Main.map.repaint();
     }
 
Index: trunk/src/org/openstreetmap/josm/actions/DistributeAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/DistributeAction.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/actions/DistributeAction.java	(revision 10467)
@@ -98,5 +98,4 @@
         // Do it!
         Main.main.undoRedo.add(new SequenceCommand(tr("Distribute Nodes"), cmds));
-        Main.map.repaint();
     }
 
Index: trunk/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java	(revision 10467)
@@ -137,5 +137,4 @@
             }
             kev.consume();
-            Main.map.repaint();
         }
     }
@@ -164,5 +163,4 @@
             offsetDialog.updateOffset();
         }
-        Main.map.repaint();
         prevEastNorth = eastNorth;
     }
Index: trunk/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java	(revision 10467)
@@ -160,5 +160,4 @@
         if (cmds.isEmpty()) return;
         Main.main.undoRedo.add(new SequenceCommand(getValue(NAME).toString(), cmds));
-        Main.map.repaint();
     }
 
Index: trunk/src/org/openstreetmap/josm/actions/MirrorAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/MirrorAction.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/actions/MirrorAction.java	(revision 10467)
@@ -81,5 +81,4 @@
 
         Main.main.undoRedo.add(new SequenceCommand(tr("Mirror"), cmds));
-        Main.map.repaint();
     }
 
Index: trunk/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java	(revision 10467)
@@ -113,5 +113,4 @@
                 if (!commands.isEmpty()) {
                     Main.main.undoRedo.add(new SequenceCommand(tr("Orthogonalize / Undo"), commands));
-                    Main.map.repaint();
                 } else {
                     throw new InvalidUserInputException("Commands are empty");
@@ -153,5 +152,4 @@
             final SequenceCommand command = orthogonalize(sel);
             Main.main.undoRedo.add(new SequenceCommand(tr("Orthogonalize"), command));
-            Main.map.repaint();
         } catch (InvalidUserInputException ex) {
             Main.debug(ex);
Index: trunk/src/org/openstreetmap/josm/actions/ReverseWayAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ReverseWayAction.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/actions/ReverseWayAction.java	(revision 10467)
@@ -103,8 +103,8 @@
         }
         Main.main.undoRedo.add(new SequenceCommand(tr("Reverse ways"), c));
+        // FIXME: This should be handled by undoRedo.
         if (propertiesUpdated) {
             ds.fireSelectionChanged();
         }
-        Main.map.repaint();
     }
 
Index: trunk/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/SimplifyWayAction.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/actions/SimplifyWayAction.java	(revision 10467)
@@ -124,5 +124,4 @@
             ds.endUpdate();
         }
-        Main.map.repaint();
     }
 
Index: trunk/src/org/openstreetmap/josm/actions/UnJoinNodeWayAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/UnJoinNodeWayAction.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/actions/UnJoinNodeWayAction.java	(revision 10467)
@@ -91,5 +91,4 @@
         // I'm sure there's a better way to handle this
         Main.main.undoRedo.add(new RemoveNodesCommand(selectedWay, selectedNodes));
-        Main.map.repaint();
     }
 
Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java	(revision 10467)
@@ -122,6 +122,4 @@
                     public void run() {
                         targetLayer.onPostDownloadFromServer();
-                        if (Main.map != null)
-                            Main.map.mapView.repaint();
                     }
                 }
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 10467)
@@ -134,21 +134,24 @@
      */
     public static void doActionPerformed(ActionEvent e) {
-        if (!Main.map.mapView.isActiveLayerDrawable())
-            return;
+        MainLayerManager lm = Main.getLayerManager();
+        OsmDataLayer editLayer = lm.getEditLayer();
+        if (editLayer == null) {
+            return;
+        }
+
         boolean ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0;
         boolean alt = (e.getModifiers() & (ActionEvent.ALT_MASK | InputEvent.ALT_GRAPH_MASK)) != 0;
 
-        MainLayerManager lm = Main.getLayerManager();
         Command c;
         if (ctrl) {
-            c = DeleteCommand.deleteWithReferences(lm.getEditLayer(), lm.getEditDataSet().getSelected());
+            c = DeleteCommand.deleteWithReferences(editLayer, lm.getEditDataSet().getSelected());
         } else {
-            c = DeleteCommand.delete(lm.getEditLayer(), lm.getEditDataSet().getSelected(), !alt /* also delete nodes in way */);
+            c = DeleteCommand.delete(editLayer, lm.getEditDataSet().getSelected(), !alt /* also delete nodes in way */);
         }
         // if c is null, an error occurred or the user aborted. Don't do anything in that case.
         if (c != null) {
             Main.main.undoRedo.add(c);
+            //FIXME: This should not be required, DeleteCommand should update the selection, otherwise undo/redo won't work.
             lm.getEditDataSet().setSelected();
-            Main.map.repaint();
         }
     }
@@ -213,15 +216,15 @@
     private void repaintIfRequired(Set<OsmPrimitive> newHighlights, WaySegment newHighlightedWaySegment) {
         boolean needsRepaint = false;
-        DataSet ds = getLayerManager().getEditDataSet();
+        OsmDataLayer editLayer = getLayerManager().getEditLayer();
 
         if (newHighlightedWaySegment == null && oldHighlightedWaySegment != null) {
-            if (ds != null) {
-                ds.clearHighlightedWaySegments();
+            if (editLayer != null) {
+                editLayer.data.clearHighlightedWaySegments();
                 needsRepaint = true;
             }
             oldHighlightedWaySegment = null;
         } else if (newHighlightedWaySegment != null && !newHighlightedWaySegment.equals(oldHighlightedWaySegment)) {
-            if (ds != null) {
-                ds.setHighlightedWaySegments(Collections.singleton(newHighlightedWaySegment));
+            if (editLayer != null) {
+                editLayer.data.setHighlightedWaySegments(Collections.singleton(newHighlightedWaySegment));
                 needsRepaint = true;
             }
@@ -229,6 +232,6 @@
         }
         needsRepaint |= highlightHelper.highlightOnly(newHighlights);
-        if (needsRepaint) {
-            Main.map.mapView.repaint();
+        if (needsRepaint && editLayer != null) {
+            editLayer.invalidate();
         }
     }
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 10467)
@@ -185,6 +185,7 @@
 
         // update selection to reflect which way being modified
-        DataSet currentDataSet = getLayerManager().getEditDataSet();
-        if (getCurrentBaseNode() != null && currentDataSet != null && !currentDataSet.selectionEmpty()) {
+        OsmDataLayer editLayer = getLayerManager().getEditLayer();
+        if (getCurrentBaseNode() != null && editLayer != null && !editLayer.data.selectionEmpty()) {
+            DataSet currentDataSet = editLayer.data;
             Way continueFrom = getWayForNode(getCurrentBaseNode());
             if (alt && continueFrom != null && (!getCurrentBaseNode().isSelected() || continueFrom.isSelected())) {
@@ -197,6 +198,6 @@
         }
 
-        if (needsRepaint) {
-            Main.map.mapView.repaint();
+        if (needsRepaint && editLayer != null) {
+            editLayer.invalidate();
         }
         return needsRepaint;
@@ -917,5 +918,6 @@
     @Override
     public void mouseExited(MouseEvent e) {
-        if (!Main.map.mapView.isActiveLayerDrawable())
+        OsmDataLayer editLayer = Main.getLayerManager().getEditLayer();
+        if (editLayer == null)
             return;
         mousePos = e.getPoint();
@@ -925,5 +927,5 @@
         // caused one already, don’t do it again.
         if (!repaintIssued) {
-            Main.map.mapView.repaint();
+            editLayer.invalidate();
         }
     }
Index: trunk/src/org/openstreetmap/josm/command/AddCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/AddCommand.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/command/AddCommand.java	(revision 10467)
@@ -59,5 +59,5 @@
     @Override
     public boolean executeCommand() {
-        getLayer().data.addPrimitive(osm);
+        getAffectedDataSet().addPrimitive(osm);
         osm.setModified(true);
         checkNodeStyles(osm);
@@ -67,5 +67,5 @@
     @Override
     public void undoCommand() {
-        getLayer().data.removePrimitive(osm);
+        getAffectedDataSet().removePrimitive(osm);
         checkNodeStyles(osm);
     }
Index: trunk/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java	(revision 10467)
@@ -78,5 +78,5 @@
 
             for (PrimitiveData pd : data) {
-                OsmPrimitive primitive = getLayer().data.getPrimitiveById(pd);
+                OsmPrimitive primitive = getAffectedDataSet().getPrimitiveById(pd);
                 boolean created = primitive == null;
                 if (created) {
@@ -87,5 +87,5 @@
                 }
                 if (created) {
-                    getLayer().data.addPrimitive(primitive);
+                    getAffectedDataSet().addPrimitive(primitive);
                 }
                 newPrimitives.add(primitive);
@@ -115,5 +115,5 @@
 
     @Override public void undoCommand() {
-        DataSet ds = getLayer().data;
+        DataSet ds = getAffectedDataSet();
 
         if (createdPrimitives == null) {
@@ -167,5 +167,5 @@
         Collection<OsmPrimitive> prims = new HashSet<>();
         for (PrimitiveData d : data) {
-            OsmPrimitive osm = getLayer().data.getPrimitiveById(d);
+            OsmPrimitive osm = getAffectedDataSet().getPrimitiveById(d);
             if (osm == null)
                 throw new RuntimeException();
Index: trunk/src/org/openstreetmap/josm/command/Command.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/Command.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/command/Command.java	(revision 10467)
@@ -17,4 +17,5 @@
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -210,4 +211,13 @@
     protected OsmDataLayer getLayer() {
         return layer;
+    }
+
+    /**
+     * Gets the data set this command affects.
+     * @return The data set. May be <code>null</code> if no layer was set and no edit layer was found.
+     * @since 10467
+     */
+    public DataSet getAffectedDataSet() {
+        return layer == null ? null : layer.data;
     }
 
Index: trunk/src/org/openstreetmap/josm/command/conflict/WayNodesConflictResolverCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/conflict/WayNodesConflictResolverCommand.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/command/conflict/WayNodesConflictResolverCommand.java	(revision 10467)
@@ -59,5 +59,5 @@
         //
         for (Node n:mergedNodeList) {
-            if (!getLayer().data.getNodes().contains(n)) {
+            if (!getAffectedDataSet().getNodes().contains(n)) {
                 Main.warn(tr("Main dataset does not include node {0}", n.toString()));
             }
Index: trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 10467)
@@ -74,11 +74,20 @@
      */
     public synchronized void add(final Command c) {
-        DataSet ds = Main.getLayerManager().getEditDataSet();
-        Collection<? extends OsmPrimitive> oldSelection = ds.getSelected();
+        DataSet ds = c.getAffectedDataSet();
+        if (ds == null) {
+            // old, legacy behaviour
+            ds = Main.getLayerManager().getEditDataSet();
+        }
+        Collection<? extends OsmPrimitive> oldSelection = null;
+        if (ds != null) {
+            oldSelection = ds.getSelected();
+        }
         addNoRedraw(c);
         afterAdd();
 
         // the command may have changed the selection so tell the listeners about the current situation
-        fireIfSelectionChanged(ds, oldSelection);
+        if (ds != null) {
+            fireIfSelectionChanged(ds, oldSelection);
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/data/gpx/GpxData.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/gpx/GpxData.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/data/gpx/GpxData.java	(revision 10467)
@@ -203,5 +203,5 @@
                     if (pnt.compareTo(earliest) < 0) {
                         earliest = pnt;
-                    } else {
+                    } else if (pnt.compareTo(latest) > 0) {
                         latest = pnt;
                     }
Index: trunk/src/org/openstreetmap/josm/data/gpx/WayPoint.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/gpx/WayPoint.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/data/gpx/WayPoint.java	(revision 10467)
@@ -19,5 +19,5 @@
 
     /**
-     * The seconds (not milliseconds!) since 1970-01-01.
+     * The seconds (not milliseconds!) since 1970-01-01 00:00 UTC
      */
     public double time;
Index: trunk/src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 10467)
@@ -101,4 +101,5 @@
     @Override
     protected void initializeMainWindow() {
+        mainPanel.reAddListeners();
         if (mainFrame != null) {
             mainFrame.initialize();
@@ -410,5 +411,4 @@
         final MainFrame mainFrame = new MainFrame(contentPanePrivate, mainPanel, geometry);
         Main.parent = mainFrame;
-        mainPanel.reAddListeners();
 
         if (args.containsKey(Option.LOAD_PREFERENCES)) {
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 10467)
@@ -175,6 +175,7 @@
      * Creates a layer list and attach it to the given mapView.
      * @param layerManager The layer manager this list is for
-     */
-    private LayerListDialog(MainLayerManager layerManager) {
+     * @since 10467
+     */
+    public LayerListDialog(MainLayerManager layerManager) {
         super(tr("Layers"), "layerlist", tr("Open a list of all loaded layers."),
                 Shortcut.registerShortcut("subwindow:layers", tr("Toggle: {0}", tr("Layers")), KeyEvent.VK_L,
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 10467)
@@ -257,4 +257,12 @@
         Main.pref.addPreferenceChangeListener(this);
 
+        registerInWindowMenu();
+    }
+
+    /**
+     * Registers this dialog in the window menu. Called in the constructor.
+     * @since 10467
+     */
+    protected void registerInWindowMenu() {
         windowMenuItem = MainMenu.addWithCheckbox(Main.main.menu.windowMenu,
                 (JosmAction) getToggleAction(),
Index: trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java	(revision 10467)
@@ -117,7 +117,13 @@
     }
 
+    /**
+     * Sets the displacement offset of this layer. The layer is automatically invalidated.
+     * @param dx The x offset
+     * @param dy The y offset
+     */
     public void setOffset(double dx, double dy) {
         this.dx = dx;
         this.dy = dy;
+        invalidate();
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/layer/LayerManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/LayerManager.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/gui/layer/LayerManager.java	(revision 10467)
@@ -7,4 +7,5 @@
 import java.util.concurrent.CopyOnWriteArrayList;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.Utils;
@@ -175,5 +176,7 @@
         insertLayerAt(layer, position);
         fireLayerAdded(layer);
-        layer.hookUpMapView(); // needs to be after fireLayerAdded
+        if (Main.map != null) {
+            layer.hookUpMapView(); // needs to be after fireLayerAdded
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 10466)
+++ trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 10467)
@@ -878,4 +878,5 @@
         setRequiresSaveToFile(false);
         setRequiresUploadToServer(isModified());
+        invalidate();
     }
 
@@ -886,4 +887,5 @@
         setRequiresSaveToFile(true);
         setRequiresUploadToServer(isModified());
+        invalidate();
     }
 
Index: trunk/test/unit/org/openstreetmap/josm/JOSMFixture.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/JOSMFixture.java	(revision 10466)
+++ trunk/test/unit/org/openstreetmap/josm/JOSMFixture.java	(revision 10467)
@@ -12,7 +12,9 @@
 import java.text.MessageFormat;
 import java.util.Locale;
+import java.util.TimeZone;
 
 import org.openstreetmap.josm.data.projection.Projections;
 import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.gui.layer.LayerManagerTest.TestLayer;
 import org.openstreetmap.josm.gui.preferences.ToolbarPreferences;
 import org.openstreetmap.josm.gui.util.GuiHelper;
@@ -88,4 +90,5 @@
         }
         System.setProperty("josm.home", josmHome);
+        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
         Main.initApplicationPreferences();
         Main.pref.enableSaveOnPut(false);
@@ -96,4 +99,5 @@
         Main.platform.preStartupHook();
 
+        Main.logLevel = 3;
         Main.pref.init(false);
         I18n.set(Main.pref.get("language", "en"));
@@ -127,4 +131,9 @@
 
     private void setupGUI() {
+        Main.getLayerManager().resetState();
+        assertTrue(Main.getLayerManager().getLayers().isEmpty());
+        assertNull(Main.getLayerManager().getEditLayer());
+        assertNull(Main.getLayerManager().getActiveLayer());
+
         if (Main.toolbar == null) {
             Main.toolbar = new ToolbarPreferences();
@@ -133,8 +142,6 @@
             new MainApplication().initialize();
         }
-        Main.getLayerManager().resetState();
-        assertTrue(Main.getLayerManager().getLayers().isEmpty());
-        assertNull(Main.getLayerManager().getEditLayer());
-        assertNull(Main.getLayerManager().getActiveLayer());
+        // Add a test layer to the layer manager to get the MapFrame
+        Main.getLayerManager().addLayer(new TestLayer());
     }
 }
Index: trunk/test/unit/org/openstreetmap/josm/data/AutosaveTaskTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/AutosaveTaskTest.java	(revision 10466)
+++ trunk/test/unit/org/openstreetmap/josm/data/AutosaveTaskTest.java	(revision 10467)
@@ -92,5 +92,6 @@
         Date fixed = cal.getTime();
 
-        for (int i = 0; i <= AutosaveTask.PROP_INDEX_LIMIT.get() + 1; i++) {
+        AutosaveTask.PROP_INDEX_LIMIT.put(5);
+        for (int i = 0; i <= AutosaveTask.PROP_INDEX_LIMIT.get() + 2; i++) {
             // Only retry 2 indexes to avoid 1000*1000 disk operations
             File f = task.getNewLayerFile(info, fixed, Math.max(0, i - 2));
Index: trunk/test/unit/org/openstreetmap/josm/data/PreferencesTest.groovy
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/PreferencesTest.groovy	(revision 10466)
+++ trunk/test/unit/org/openstreetmap/josm/data/PreferencesTest.groovy	(revision 10467)
@@ -37,6 +37,6 @@
             "  <tag key='language' value='en'/>%n" +
             "  <tag key='osm-server.url' value='http://api06.dev.openstreetmap.org/api'/>%n" +
-            "  <tag key='osm-server.username' value='josm_test'/>%n" +
-            "</preferences>%n", Version.getInstance().getVersion())
+            "  <tag key='osm-server.username' value='%s'/>%n" +
+            "</preferences>%n", Version.getInstance().getVersion(), Main.pref.get("osm-server.username"))
     }
 }
Index: trunk/test/unit/org/openstreetmap/josm/data/validation/tests/OpeningHourTestTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/validation/tests/OpeningHourTestTest.java	(revision 10466)
+++ trunk/test/unit/org/openstreetmap/josm/data/validation/tests/OpeningHourTestTest.java	(revision 10467)
@@ -17,6 +17,6 @@
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
 import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.data.validation.Severity;
@@ -25,11 +25,21 @@
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetReader;
 import org.openstreetmap.josm.gui.tagging.presets.items.KeyedItem;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
  * JUnit Test of "Opening hours" validation test.
+ * @see OpeningHourTest
  */
 public class OpeningHourTestTest {
-
-    private static final OpeningHourTest OPENING_HOUR_TEST = new OpeningHourTest();
+    /**
+     * We need prefs for this. We check strings so we need i18n.
+     */
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules().preferences().i18n();
+
+    private OpeningHourTest openingHourTest;
 
     /**
@@ -39,6 +49,6 @@
     @Before
     public void setUp() throws Exception {
-        JOSMFixture.createUnitTestFixture().init();
-        OPENING_HOUR_TEST.initialize();
+        openingHourTest = new OpeningHourTest();
+        openingHourTest.initialize();
     }
 
@@ -50,13 +60,13 @@
         final String key = "opening_hours";
         // frequently used tags according to https://taginfo.openstreetmap.org/keys/opening_hours#values
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "24/7"), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Fr 08:30-20:00"), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Fr sunrise-sunset"), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "09:00-21:00"), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Su-Th sunset-24:00,04:00-sunrise; Fr-Sa sunset-sunrise"), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Su-Th sunset-24:00, 04:00-sunrise; Fr-Sa sunset-sunrise"), hasSize(1));
-        assertEquals(Severity.OTHER, OPENING_HOUR_TEST.checkOpeningHourSyntax(
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "24/7"), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Mo-Fr 08:30-20:00"), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Mo-Fr sunrise-sunset"), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "09:00-21:00"), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Su-Th sunset-24:00,04:00-sunrise; Fr-Sa sunset-sunrise"), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Su-Th sunset-24:00, 04:00-sunrise; Fr-Sa sunset-sunrise"), hasSize(1));
+        assertEquals(Severity.OTHER, openingHourTest.checkOpeningHourSyntax(
                 key, "Su-Th sunset-24:00, 04:00-sunrise; Fr-Sa sunset-sunrise").get(0).getSeverity());
-        assertEquals("Su-Th sunset-24:00,04:00-sunrise; Fr-Sa sunset-sunrise", OPENING_HOUR_TEST.checkOpeningHourSyntax(
+        assertEquals("Su-Th sunset-24:00,04:00-sunrise; Fr-Sa sunset-sunrise", openingHourTest.checkOpeningHourSyntax(
                 key, "Su-Th sunset-24:00, 04:00-sunrise; Fr-Sa sunset-sunrise").get(0).getPrettifiedValue());
     }
@@ -64,7 +74,7 @@
     @Test
     public void testI18n() {
-        assertTrue(OPENING_HOUR_TEST.checkOpeningHourSyntax("opening_hours", ".", OpeningHourTest.CheckMode.POINTS_IN_TIME, false, "de")
+        assertTrue(openingHourTest.checkOpeningHourSyntax("opening_hours", ".", OpeningHourTest.CheckMode.POINTS_IN_TIME, false, "de")
                 .get(0).toString().contains("Unerwartetes Zeichen"));
-        assertFalse(OPENING_HOUR_TEST.checkOpeningHourSyntax("opening_hours", ".", OpeningHourTest.CheckMode.POINTS_IN_TIME, false, "en")
+        assertFalse(openingHourTest.checkOpeningHourSyntax("opening_hours", ".", OpeningHourTest.CheckMode.POINTS_IN_TIME, false, "en")
                 .get(0).toString().contains("Unerwartetes Zeichen"));
     }
@@ -76,5 +86,5 @@
     public void testCheckOpeningHourSyntax2() {
         final String key = "opening_hours";
-        final List<OpeningHourTest.OpeningHoursTestError> errors = OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Tue");
+        final List<OpeningHourTest.OpeningHoursTestError> errors = openingHourTest.checkOpeningHourSyntax(key, "Mo-Tue");
         assertThat(errors, hasSize(2));
         assertEquals(key + " - Mo-Tue <--- (Please use the abbreviation \"Tu\" for \"tue\".)", errors.get(0).getMessage());
@@ -92,5 +102,5 @@
     public void testCheckOpeningHourSyntax3() {
         final String key = "opening_hours";
-        final List<OpeningHourTest.OpeningHoursTestError> errors = OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Sa-Su 10.00-20.00");
+        final List<OpeningHourTest.OpeningHoursTestError> errors = openingHourTest.checkOpeningHourSyntax(key, "Sa-Su 10.00-20.00");
         assertThat(errors, hasSize(2));
         assertEquals(key + " - Sa-Su 10. <--- (Please use \":\" as hour/minute-separator)", errors.get(0).getMessage());
@@ -106,7 +116,7 @@
     @Test
     public void testCheckOpeningHourSyntax4() {
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(null, null), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(null, ""), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(null, " "), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(null, null), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(null, ""), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(null, " "), isEmpty());
     }
 
@@ -117,11 +127,11 @@
     public void testCheckOpeningHourSyntax5() {
         final String key = "opening_hours";
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "badtext"), hasSize(1));
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "badtext"), hasSize(1));
         assertEquals(key + " - ba <--- (Unexpected token: \"b\" Invalid/unsupported syntax.)",
-                OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "badtext").get(0).getMessage());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "5.00 p.m-11.00 p.m"), hasSize(1));
+                openingHourTest.checkOpeningHourSyntax(key, "badtext").get(0).getMessage());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "5.00 p.m-11.00 p.m"), hasSize(1));
         assertEquals(key + " - 5.00 p <--- (hyphen (-) or open end (+) in time range expected. "
                 + "For working with points in time, the mode for opening_hours.js has to be altered. Maybe wrong tag?)",
-                OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "5.00 p.m-11.00 p.m").get(0).getMessage());
+                openingHourTest.checkOpeningHourSyntax(key, "5.00 p.m-11.00 p.m").get(0).getMessage());
     }
 
@@ -132,5 +142,5 @@
     public void testCheckOpeningHourSyntax6() {
         final String key = "opening_hours";
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "PH open \"always open on public holidays\""), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "PH open \"always open on public holidays\""), isEmpty());
     }
 
@@ -141,7 +151,7 @@
     public void testCheckOpeningHourSyntax7() {
         final String key = "opening_hours";
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "9:00-18:00"), hasSize(1));
-        assertEquals(Severity.OTHER, OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "9:00-18:00").get(0).getSeverity());
-        assertEquals("09:00-18:00", OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "9:00-18:00").get(0).getPrettifiedValue());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "9:00-18:00"), hasSize(1));
+        assertEquals(Severity.OTHER, openingHourTest.checkOpeningHourSyntax(key, "9:00-18:00").get(0).getSeverity());
+        assertEquals("09:00-18:00", openingHourTest.checkOpeningHourSyntax(key, "9:00-18:00").get(0).getPrettifiedValue());
     }
 
@@ -152,9 +162,9 @@
     public void testCheckOpeningHourSyntaxTicket9367() {
         final String key = "opening_hours";
-        assertEquals(Severity.WARNING, OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo,Tu 04-17").get(0).getSeverity());
+        assertEquals(Severity.WARNING, openingHourTest.checkOpeningHourSyntax(key, "Mo,Tu 04-17").get(0).getSeverity());
         assertEquals(key + " - Mo,Tu 04-17 <--- (Time range without minutes specified. "
                 + "Not very explicit! Please use this syntax instead \"04:00-17:00\".)",
-                OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo,Tu 04-17").get(0).getMessage());
-        assertEquals("Mo,Tu 04:00-17:00", OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo,Tu 04-17").get(0).getPrettifiedValue());
+                openingHourTest.checkOpeningHourSyntax(key, "Mo,Tu 04-17").get(0).getMessage());
+        assertEquals("Mo,Tu 04:00-17:00", openingHourTest.checkOpeningHourSyntax(key, "Mo,Tu 04-17").get(0).getPrettifiedValue());
     }
 
@@ -166,17 +176,17 @@
         final String key = "service_times";
         // frequently used tags according to https://taginfo.openstreetmap.org/keys/service_times#values
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Su 10:00", OpeningHourTest.CheckMode.BOTH), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "automatic", OpeningHourTest.CheckMode.BOTH), not(isEmpty()));
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Sa 09:00-18:00", OpeningHourTest.CheckMode.BOTH), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Su 09:30; We 19:30", OpeningHourTest.CheckMode.BOTH), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Fr 00:00-00:30,04:00-00:30; Sa,Su,PH 00:00-24:00",
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Su 10:00", OpeningHourTest.CheckMode.BOTH), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "automatic", OpeningHourTest.CheckMode.BOTH), not(isEmpty()));
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Mo-Sa 09:00-18:00", OpeningHourTest.CheckMode.BOTH), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Su 09:30; We 19:30", OpeningHourTest.CheckMode.BOTH), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Mo-Fr 00:00-00:30,04:00-00:30; Sa,Su,PH 00:00-24:00",
                 OpeningHourTest.CheckMode.BOTH), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Fr 0:00-0:30,4:00-00:30; Sa,Su,PH 0:00-24:00",
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Mo-Fr 0:00-0:30,4:00-00:30; Sa,Su,PH 0:00-24:00",
                 OpeningHourTest.CheckMode.BOTH), hasSize(1));
         assertEquals("Mo-Fr 00:00-00:30,04:00-00:30; Sa,Su,PH 00:00-24:00",
-                OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Fr 0:00-0:30,4:00-00:30; Sa,Su,PH 0:00-24:00",
+                openingHourTest.checkOpeningHourSyntax(key, "Mo-Fr 0:00-0:30,4:00-00:30; Sa,Su,PH 0:00-24:00",
                 OpeningHourTest.CheckMode.BOTH).get(0).getPrettifiedValue());
         assertEquals("Mo-Fr 00:00-00:30,04:00-00:30; Sa,Su,PH 00:00-24:00",
-                OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Fr 0:00-0:30,4:00-00:30; Sa,Su,PH 0:00-24:00",
+                openingHourTest.checkOpeningHourSyntax(key, "Mo-Fr 0:00-0:30,4:00-00:30; Sa,Su,PH 0:00-24:00",
                 OpeningHourTest.CheckMode.BOTH).get(0).getPrettifiedValue());
     }
@@ -189,16 +199,16 @@
         final String key = "collection_times";
         // frequently used tags according to https://taginfo.openstreetmap.org/keys/collection_times#values
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Sa 09:00", OpeningHourTest.CheckMode.BOTH), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "fixme", OpeningHourTest.CheckMode.BOTH), not(isEmpty()));
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "daily", OpeningHourTest.CheckMode.BOTH), not(isEmpty()));
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Fr 13:30,17:45,19:00; Sa 15:00; Su 11:00",
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Mo-Sa 09:00", OpeningHourTest.CheckMode.BOTH), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "fixme", OpeningHourTest.CheckMode.BOTH), not(isEmpty()));
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "daily", OpeningHourTest.CheckMode.BOTH), not(isEmpty()));
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Mo-Fr 13:30,17:45,19:00; Sa 15:00; Su 11:00",
                 OpeningHourTest.CheckMode.BOTH), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Fr 13:30, 17:45, 19:00; Sa 15:00; Su 11:00",
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Mo-Fr 13:30, 17:45, 19:00; Sa 15:00; Su 11:00",
                 OpeningHourTest.CheckMode.BOTH), hasSize(1));
         assertEquals(Severity.OTHER,
-                OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Fr 13:30, 17:45, 19:00; Sa 15:00; Su 11:00",
+                openingHourTest.checkOpeningHourSyntax(key, "Mo-Fr 13:30, 17:45, 19:00; Sa 15:00; Su 11:00",
                 OpeningHourTest.CheckMode.BOTH).get(0).getSeverity());
         assertEquals("Mo-Fr 13:30,17:45,19:00; Sa 15:00; Su 11:00",
-                OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Fr 13:30, 17:45, 19:00; Sa 15:00; Su 11:00",
+                openingHourTest.checkOpeningHourSyntax(key, "Mo-Fr 13:30, 17:45, 19:00; Sa 15:00; Su 11:00",
                 OpeningHourTest.CheckMode.BOTH).get(0).getPrettifiedValue());
     }
@@ -222,5 +232,5 @@
         }
         for (final Tag t : values) {
-            final List<OpeningHourTest.OpeningHoursTestError> errors = OPENING_HOUR_TEST.checkOpeningHourSyntax(t.getKey(), t.getValue());
+            final List<OpeningHourTest.OpeningHoursTestError> errors = openingHourTest.checkOpeningHourSyntax(t.getKey(), t.getValue());
             assertThat(t + " is valid", errors, isEmpty());
         }
Index: trunk/test/unit/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityActionTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityActionTest.java	(revision 10466)
+++ trunk/test/unit/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityActionTest.java	(revision 10467)
@@ -6,7 +6,6 @@
 import static org.junit.Assert.assertTrue;
 
-import org.junit.BeforeClass;
+import org.junit.Rule;
 import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
@@ -14,4 +13,7 @@
 import org.openstreetmap.josm.gui.layer.TMSLayer;
 import org.openstreetmap.josm.gui.layer.TMSLayerTest;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
@@ -19,12 +21,10 @@
  */
 public class LayerVisibilityActionTest {
-
     /**
-     * Setup tests
+     * TMS layer needs prefs. Platform for LayerListDialog shortcuts.
      */
-    @BeforeClass
-    public static void setUpBeforeClass() {
-        JOSMFixture.createUnitTestFixture().init(true);
-    }
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules().preferences().projection().platform();
 
     /**
@@ -34,59 +34,60 @@
     public void testLayerVisibilityAction() {
         TMSLayer layer = TMSLayerTest.createTmsLayer();
-        try {
-            LayerListModel model = LayerListDialog.getInstance().getModel();
-            LayerVisibilityAction action = new LayerVisibilityAction(model);
-            action.updateEnabledState();
-            assertFalse(action.isEnabled());
+        LayerListModel model = new LayerListDialog(Main.getLayerManager()) {
+            @Override
+            protected void registerInWindowMenu() {
+                // ignore
+            }
+        }.getModel();
+        LayerVisibilityAction action = new LayerVisibilityAction(model);
+        action.updateEnabledState();
+        assertFalse(action.isEnabled());
 
-            Main.getLayerManager().addLayer(layer);
-            action.updateEnabledState();
-            assertTrue(action.isEnabled());
-            assertTrue(action.supportLayers(model.getSelectedLayers()));
+        Main.getLayerManager().addLayer(layer);
+        model.setSelectedLayer(layer);
+        action.updateEnabledState();
+        assertTrue(action.isEnabled());
+        assertTrue(action.supportLayers(model.getSelectedLayers()));
 
-            // now check values
-            action.updateValues();
-            assertEquals(1.0, action.opacitySlider.getRealValue(), 1e-15);
-            assertEquals("OpacitySlider [getRealValue()=1.0]", action.opacitySlider.toString());
+        // now check values
+        action.updateValues();
+        assertEquals(1.0, action.opacitySlider.getRealValue(), 1e-15);
+        assertEquals("OpacitySlider [getRealValue()=1.0]", action.opacitySlider.toString());
 
-            action.opacitySlider.setRealValue(.5);
-            action.updateValues();
+        action.opacitySlider.setRealValue(.5);
+        action.updateValues();
 
-            assertEquals(0.5, action.opacitySlider.getRealValue(), 1e-15);
-            assertEquals("OpacitySlider [getRealValue()=0.5]", action.opacitySlider.toString());
+        assertEquals(0.5, action.opacitySlider.getRealValue(), 1e-15);
+        assertEquals("OpacitySlider [getRealValue()=0.5]", action.opacitySlider.toString());
 
-            action.setVisibleFlag(false);
-            action.updateValues();
-            assertFalse(layer.isVisible());
+        action.setVisibleFlag(false);
+        action.updateValues();
+        assertFalse(layer.isVisible());
 
-            action.setVisibleFlag(true);
-            action.updateValues();
-            assertTrue(layer.isVisible());
+        action.setVisibleFlag(true);
+        action.updateValues();
+        assertTrue(layer.isVisible());
 
-            // layer stays visible during adjust
-            action.opacitySlider.setValueIsAdjusting(true);
-            action.opacitySlider.setRealValue(0);
-            assertEquals(0, layer.getOpacity(), 1e-15);
-            layer.setOpacity(.1); // to make layer.isVisible work
-            assertTrue(layer.isVisible());
-            layer.setOpacity(0);
+        // layer stays visible during adjust
+        action.opacitySlider.setValueIsAdjusting(true);
+        action.opacitySlider.setRealValue(0);
+        assertEquals(0, layer.getOpacity(), 1e-15);
+        layer.setOpacity(.1); // to make layer.isVisible work
+        assertTrue(layer.isVisible());
+        layer.setOpacity(0);
 
-            action.opacitySlider.setValueIsAdjusting(false);
-            action.opacitySlider.setRealValue(0);
-            assertEquals(0, layer.getOpacity(), 1e-15);
-            layer.setOpacity(.1); // to make layer.isVisible work
-            assertFalse(layer.isVisible());
-            layer.setOpacity(0);
-            action.updateValues();
+        action.opacitySlider.setValueIsAdjusting(false);
+        action.opacitySlider.setRealValue(0);
+        assertEquals(0, layer.getOpacity(), 1e-15);
+        layer.setOpacity(.1); // to make layer.isVisible work
+        assertFalse(layer.isVisible());
+        layer.setOpacity(0);
+        action.updateValues();
 
-            // Opacity reset when it was 0 and user set layer to visible.
-            action.setVisibleFlag(true);
-            action.updateValues();
-            assertEquals(1.0, action.opacitySlider.getRealValue(), 1e-15);
-            assertEquals(1.0, layer.getOpacity(), 1e-15);
-
-        } finally {
-            Main.getLayerManager().removeLayer(layer);
-        }
+        // Opacity reset when it was 0 and user set layer to visible.
+        action.setVisibleFlag(true);
+        action.updateValues();
+        assertEquals(1.0, action.opacitySlider.getRealValue(), 1e-15);
+        assertEquals(1.0, layer.getOpacity(), 1e-15);
     }
 }
Index: trunk/test/unit/org/openstreetmap/josm/gui/layer/GpxLayerTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/layer/GpxLayerTest.java	(revision 10466)
+++ trunk/test/unit/org/openstreetmap/josm/gui/layer/GpxLayerTest.java	(revision 10467)
@@ -11,4 +11,5 @@
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.TimeZone;
 
 import javax.swing.JScrollPane;
@@ -171,4 +172,7 @@
                 new ImmutableGpxTrack(new ArrayList<Collection<WayPoint>>(), new HashMap<String, Object>())));
 
+        assertEquals("1/3/16 11:59 AM - 12:00 PM (0:00)", GpxLayer.getTimespanForTrack(getMinimalGpxData().tracks.iterator().next()));
+
+        TimeZone.setDefault(TimeZone.getTimeZone("Europe/Berlin"));
         assertEquals("1/3/16 12:59 PM - 1:00 PM (0:00)", GpxLayer.getTimespanForTrack(getMinimalGpxData().tracks.iterator().next()));
     }
Index: trunk/test/unit/org/openstreetmap/josm/gui/layer/LayerManagerTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/layer/LayerManagerTest.java	(revision 10466)
+++ trunk/test/unit/org/openstreetmap/josm/gui/layer/LayerManagerTest.java	(revision 10467)
@@ -11,4 +11,6 @@
 import static org.junit.Assert.fail;
 
+import java.awt.Component;
+import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.lang.reflect.InvocationTargetException;
@@ -41,6 +43,13 @@
 public class LayerManagerTest {
 
-    protected static class AbstractTestLayer extends Layer {
-        protected AbstractTestLayer() {
+    /**
+     * This is a layer that can be used in tests. It does not do anything and provides a simple, fake implementation.
+     * @author Michael Zangl
+     */
+    public static class TestLayer extends Layer {
+        /**
+         * Create a new test layer.
+         */
+        public TestLayer() {
             super("Test Layer");
         }
@@ -70,5 +79,5 @@
         @Override
         public Action[] getMenuEntries() {
-            return null;
+            return new Action[0];
         }
 
@@ -80,5 +89,20 @@
         @Override
         public Icon getIcon() {
-            return null;
+            return new Icon() {
+                @Override
+                public void paintIcon(Component c, Graphics g, int x, int y) {
+                    // nop
+                }
+
+                @Override
+                public int getIconWidth() {
+                    return 10;
+                }
+
+                @Override
+                public int getIconHeight() {
+                    return 10;
+                }
+            };
         }
 
@@ -89,5 +113,5 @@
     }
 
-    protected static class AbstractTestLayer2 extends AbstractTestLayer {}
+    protected static class TestLayer2 extends TestLayer {}
 
     /**
@@ -147,5 +171,5 @@
     @Test
     public void testAddLayer() {
-        Layer layer1 = new AbstractTestLayer() {
+        Layer layer1 = new TestLayer() {
             @Override
             public LayerPositionStrategy getDefaultLayerPosition() {
@@ -158,5 +182,5 @@
             }
         };
-        Layer layer2 = new AbstractTestLayer() {
+        Layer layer2 = new TestLayer() {
             @Override
             public LayerPositionStrategy getDefaultLayerPosition() {
@@ -164,5 +188,5 @@
             }
         };
-        Layer layer3 = new AbstractTestLayer() {
+        Layer layer3 = new TestLayer() {
             @Override
             public LayerPositionStrategy getDefaultLayerPosition() {
@@ -179,5 +203,5 @@
 
         // event
-        AbstractTestLayer layer4 = new AbstractTestLayer();
+        TestLayer layer4 = new TestLayer();
         CapturingLayerChangeListener l = new CapturingLayerChangeListener();
         layerManager.addLayerChangeListener(l);
@@ -198,5 +222,5 @@
         thrown.expectRootCause(any(IllegalArgumentException.class));
 
-        AbstractTestLayer layer1 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
         layerManager.addLayer(layer1);
         layerManager.addLayer(layer1);
@@ -212,5 +236,5 @@
         thrown.expectRootCause(any(IndexOutOfBoundsException.class));
 
-        AbstractTestLayer layer1 = new AbstractTestLayer() {
+        TestLayer layer1 = new TestLayer() {
             @Override
             public LayerPositionStrategy getDefaultLayerPosition() {
@@ -231,6 +255,6 @@
     @Test
     public void testRemoveLayer() {
-        AbstractTestLayer layer1 = new AbstractTestLayer();
-        AbstractTestLayer layer2 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
+        TestLayer layer2 = new TestLayer();
         layerManager.addLayer(layer1);
         layerManager.addLayer(layer2);
@@ -252,6 +276,6 @@
     @Test
     public void testMoveLayer() {
-        AbstractTestLayer layer1 = new AbstractTestLayer();
-        AbstractTestLayer layer2 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
+        TestLayer layer2 = new TestLayer();
         layerManager.addLayer(layer1);
         layerManager.addLayer(layer2);
@@ -284,6 +308,6 @@
         thrown.expectRootCause(any(IndexOutOfBoundsException.class));
 
-        AbstractTestLayer layer1 = new AbstractTestLayer();
-        AbstractTestLayer layer2 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
+        TestLayer layer2 = new TestLayer();
         layerManager.addLayer(layer1);
         layerManager.addLayer(layer2);
@@ -300,6 +324,6 @@
         thrown.expectRootCause(any(IllegalArgumentException.class));
 
-        AbstractTestLayer layer1 = new AbstractTestLayer();
-        AbstractTestLayer layer2 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
+        TestLayer layer2 = new TestLayer();
         layerManager.addLayer(layer1);
         layerManager.moveLayer(layer2, 0);
@@ -312,6 +336,6 @@
     public void testGetLayers() {
         // list should be immutable
-        AbstractTestLayer layer1 = new AbstractTestLayer();
-        AbstractTestLayer layer2 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
+        TestLayer layer2 = new TestLayer();
         layerManager.addLayer(layer1);
         layerManager.addLayer(layer2);
@@ -324,11 +348,11 @@
     @Test
     public void testGetLayersOfType() {
-        AbstractTestLayer2 layer1 = new AbstractTestLayer2();
-        AbstractTestLayer2 layer2 = new AbstractTestLayer2();
-        layerManager.addLayer(layer1);
-        layerManager.addLayer(new AbstractTestLayer());
-        layerManager.addLayer(layer2);
-
-        assertEquals(layerManager.getLayersOfType(AbstractTestLayer2.class), Arrays.asList(layer1, layer2));
+        TestLayer2 layer1 = new TestLayer2();
+        TestLayer2 layer2 = new TestLayer2();
+        layerManager.addLayer(layer1);
+        layerManager.addLayer(new TestLayer());
+        layerManager.addLayer(layer2);
+
+        assertEquals(layerManager.getLayersOfType(TestLayer2.class), Arrays.asList(layer1, layer2));
     }
 
@@ -338,10 +362,10 @@
     @Test
     public void testContainsLayer() {
-        AbstractTestLayer layer = new AbstractTestLayer();
+        TestLayer layer = new TestLayer();
         layerManager.addLayer(layer);
-        layerManager.addLayer(new AbstractTestLayer());
+        layerManager.addLayer(new TestLayer());
 
         assertTrue(layerManager.containsLayer(layer));
-        assertFalse(layerManager.containsLayer(new AbstractTestLayer()));
+        assertFalse(layerManager.containsLayer(new TestLayer()));
     }
 
@@ -374,6 +398,6 @@
     public void testAddLayerChangeListenerFire() {
         final ArrayList<Layer> fired = new ArrayList<>();
-        AbstractTestLayer layer1 = new AbstractTestLayer();
-        AbstractTestLayer layer2 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
+        TestLayer layer2 = new TestLayer();
         layerManager.addLayer(layer1);
         layerManager.addLayer(layer2);
@@ -405,7 +429,7 @@
         CapturingLayerChangeListener l = new CapturingLayerChangeListener();
         layerManager.addLayerChangeListener(l);
-        layerManager.addLayer(new AbstractTestLayer());
+        layerManager.addLayer(new TestLayer());
         layerManager.removeLayerChangeListener(l);
-        layerManager.addLayer(new AbstractTestLayer());
+        layerManager.addLayer(new TestLayer());
         // threw exception when fired twice.
         assertNotNull(l.layerAdded);
@@ -429,6 +453,6 @@
     public void testRemoveLayerChangeListenerFire() {
         final ArrayList<Layer> fired = new ArrayList<>();
-        AbstractTestLayer layer1 = new AbstractTestLayer();
-        AbstractTestLayer layer2 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
+        TestLayer layer2 = new TestLayer();
         layerManager.addLayer(layer1);
         layerManager.addLayer(layer2);
Index: trunk/test/unit/org/openstreetmap/josm/gui/layer/MainLayerManagerTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/layer/MainLayerManagerTest.java	(revision 10466)
+++ trunk/test/unit/org/openstreetmap/josm/gui/layer/MainLayerManagerTest.java	(revision 10467)
@@ -68,7 +68,7 @@
     @Test
     public void testAddLayerSetsActiveLayer() {
-        AbstractTestLayer layer1 = new AbstractTestLayer();
-        AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
-        AbstractTestLayer layer3 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
+        AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
+        TestLayer layer3 = new TestLayer();
         assertNull(layerManagerWithActive.getActiveLayer());
         assertNull(layerManagerWithActive.getEditLayer());
@@ -86,7 +86,7 @@
     @Test
     public void testRemoveLayerUnsetsActiveLayer() {
-        AbstractTestLayer layer1 = new AbstractTestLayer();
-        AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
-        AbstractTestLayer layer3 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
+        AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
+        TestLayer layer3 = new TestLayer();
         AbstractTestOsmLayer layer4 = new AbstractTestOsmLayer();
         layerManagerWithActive.addLayer(layer1);
@@ -116,5 +116,5 @@
     @Test
     public void testAddActiveLayerChangeListener() {
-        AbstractTestLayer layer1 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
         AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
         layerManagerWithActive.addLayer(layer1);
@@ -154,5 +154,5 @@
     @Test
     public void testRemoveActiveLayerChangeListener() {
-        AbstractTestLayer layer1 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
         AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
         layerManagerWithActive.addLayer(layer1);
@@ -182,6 +182,6 @@
     @Test
     public void testSetGetActiveLayer() {
-        AbstractTestLayer layer1 = new AbstractTestLayer();
-        AbstractTestLayer layer2 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
+        TestLayer layer2 = new TestLayer();
         layerManagerWithActive.addLayer(layer1);
         layerManagerWithActive.addLayer(layer2);
@@ -200,5 +200,5 @@
     public void testGetEditDataSet() {
         assertNull(layerManagerWithActive.getEditDataSet());
-        AbstractTestLayer layer0 = new AbstractTestLayer();
+        TestLayer layer0 = new TestLayer();
         layerManagerWithActive.addLayer(layer0);
         assertNull(layerManagerWithActive.getEditDataSet());
@@ -223,8 +223,8 @@
         AbstractTestOsmLayer layer1 = new AbstractTestOsmLayer();
         AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
-        AbstractTestLayer layer3 = new AbstractTestLayer();
+        TestLayer layer3 = new TestLayer();
         layer3.setVisible(false);
         AbstractTestOsmLayer layer4 = new AbstractTestOsmLayer();
-        AbstractTestLayer layer5 = new AbstractTestLayer();
+        TestLayer layer5 = new TestLayer();
         AbstractTestOsmLayer layer6 = new AbstractTestOsmLayer();
         AbstractTestOsmLayer layer7 = new AbstractTestOsmLayer();
Index: trunk/test/unit/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayerTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayerTest.java	(revision 10466)
+++ trunk/test/unit/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayerTest.java	(revision 10467)
@@ -10,7 +10,6 @@
 import java.util.List;
 
-import org.junit.BeforeClass;
+import org.junit.Rule;
 import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.TestUtils;
@@ -18,4 +17,7 @@
 import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer.Loader;
 import org.openstreetmap.josm.io.GpxReader;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
@@ -23,12 +25,11 @@
  */
 public class GeoImageLayerTest {
+    /**
+     * We need prefs for this.
+     */
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules().preferences();
 
-    /**
-     * Setup test.
-     */
-    @BeforeClass
-    public static void setUpBeforeClass() {
-        JOSMFixture.createUnitTestFixture().init(true);
-    }
 
     /**
@@ -42,26 +43,16 @@
             assertTrue(reader.parse(true));
             GpxLayer gpxLayer = new GpxLayer(reader.getGpxData());
-            try {
-                Main.getLayerManager().addLayer(gpxLayer);
-                assertEquals(1, Main.getLayerManager().getLayers().size());
-                new Loader(
-                        Collections.singleton(new File(TestUtils.getRegressionDataFile(12255, "G0016941.JPG"))),
-                        gpxLayer).run();
-                assertEquals(2, Main.getLayerManager().getLayers().size());
-                GeoImageLayer layer = Main.getLayerManager().getLayersOfType(GeoImageLayer.class).iterator().next();
-                try {
-                    assertEquals(gpxLayer, layer.getGpxLayer());
-                    List<ImageEntry> images = layer.getImages();
-                    assertEquals(1, images.size());
-                    assertEquals("<html>1 image loaded. 0 were found to be GPS tagged.</html>", layer.getInfoComponent());
-                    assertEquals("<html>1 image loaded. 0 were found to be GPS tagged.</html>", layer.getToolTipText());
-                } finally {
-                    // Ensure we clean the place before leaving, even if test fails.
-                    Main.getLayerManager().removeLayer(layer);
-                }
-            } finally {
-                // Ensure we clean the place before leaving, even if test fails.
-                Main.getLayerManager().removeLayer(gpxLayer);
-            }
+            Main.getLayerManager().addLayer(gpxLayer);
+            assertEquals(1, Main.getLayerManager().getLayers().size());
+            new Loader(
+                    Collections.singleton(new File(TestUtils.getRegressionDataFile(12255, "G0016941.JPG"))),
+                    gpxLayer).run();
+            assertEquals(2, Main.getLayerManager().getLayers().size());
+            GeoImageLayer layer = Main.getLayerManager().getLayersOfType(GeoImageLayer.class).iterator().next();
+            assertEquals(gpxLayer, layer.getGpxLayer());
+            List<ImageEntry> images = layer.getImages();
+            assertEquals(1, images.size());
+            assertEquals("<html>1 image loaded. 0 were found to be GPS tagged.</html>", layer.getInfoComponent());
+            assertEquals("<html>1 image loaded. 0 were found to be GPS tagged.</html>", layer.getToolTipText());
         }
     }
Index: trunk/test/unit/org/openstreetmap/josm/io/NmeaReaderTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/io/NmeaReaderTest.java	(revision 10466)
+++ trunk/test/unit/org/openstreetmap/josm/io/NmeaReaderTest.java	(revision 10467)
@@ -8,4 +8,5 @@
 import java.util.ArrayList;
 import java.util.List;
+import java.util.TimeZone;
 
 import org.junit.Test;
@@ -40,4 +41,5 @@
         assertEquals(0, in.getParserMalformed());
 
+        TimeZone.setDefault(TimeZone.getTimeZone("Europe/Berlin"));
         final List<WayPoint> wayPoints = new ArrayList<>(in.data.tracks.iterator().next().getSegments().iterator().next().getWayPoints());
         assertEquals("2016-01-25T04:05:09.200Z", wayPoints.get(0).get(GpxConstants.PT_TIME));
Index: trunk/test/unit/org/openstreetmap/josm/testutils/JOSMTestRules.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/testutils/JOSMTestRules.java	(revision 10466)
+++ trunk/test/unit/org/openstreetmap/josm/testutils/JOSMTestRules.java	(revision 10467)
@@ -4,4 +4,5 @@
 import java.io.File;
 import java.io.IOException;
+import java.util.TimeZone;
 
 import org.junit.rules.DisableOnDebug;
@@ -163,4 +164,8 @@
         // Tests are running headless by default.
         System.setProperty("java.awt.headless", "true");
+        // All tests use the same timezone.
+        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+        // Set log level to info
+        Main.logLevel = 3;
 
         // Set up i18n
