diff --git a/src/org/openstreetmap/josm/actions/AddNodeAction.java b/src/org/openstreetmap/josm/actions/AddNodeAction.java
index 29373b9..5cc050f 100644
--- a/src/org/openstreetmap/josm/actions/AddNodeAction.java
+++ b/src/org/openstreetmap/josm/actions/AddNodeAction.java
@@ -65,10 +65,12 @@ public final class AddNodeAction extends JosmAction {
         // add the node
         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));
+            }
         }
     }
 
diff --git a/src/org/openstreetmap/josm/actions/AlignInCircleAction.java b/src/org/openstreetmap/josm/actions/AlignInCircleAction.java
index 192dd8e..a0a1302 100644
--- a/src/org/openstreetmap/josm/actions/AlignInCircleAction.java
+++ b/src/org/openstreetmap/josm/actions/AlignInCircleAction.java
@@ -283,7 +283,6 @@ public final class AlignInCircleAction extends JosmAction {
         }
 
         Main.main.undoRedo.add(new SequenceCommand(tr("Align Nodes in Circle"), cmds));
-        Main.map.repaint();
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/actions/AlignInLineAction.java b/src/org/openstreetmap/josm/actions/AlignInLineAction.java
index 4c30ea4..daa848d 100644
--- a/src/org/openstreetmap/josm/actions/AlignInLineAction.java
+++ b/src/org/openstreetmap/josm/actions/AlignInLineAction.java
@@ -204,7 +204,6 @@ public final class AlignInLineAction extends JosmAction {
 
             // Do it!
             Main.main.undoRedo.add(cmd);
-            Main.map.repaint();
 
         } catch (InvalidSelection except) {
             Main.debug(except);
diff --git a/src/org/openstreetmap/josm/actions/CreateCircleAction.java b/src/org/openstreetmap/josm/actions/CreateCircleAction.java
index 91d5bfc..2978476 100644
--- a/src/org/openstreetmap/josm/actions/CreateCircleAction.java
+++ b/src/org/openstreetmap/josm/actions/CreateCircleAction.java
@@ -240,7 +240,6 @@ public final class CreateCircleAction extends JosmAction {
         }
 
         Main.main.undoRedo.add(new SequenceCommand(tr("Create Circle"), cmds));
-        Main.map.repaint();
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/actions/DistributeAction.java b/src/org/openstreetmap/josm/actions/DistributeAction.java
index aca100d..10945d7 100644
--- a/src/org/openstreetmap/josm/actions/DistributeAction.java
+++ b/src/org/openstreetmap/josm/actions/DistributeAction.java
@@ -97,7 +97,6 @@ public final class DistributeAction extends JosmAction {
 
         // Do it!
         Main.main.undoRedo.add(new SequenceCommand(tr("Distribute Nodes"), cmds));
-        Main.map.repaint();
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java b/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java
index d444d45..a35cac3 100644
--- a/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java
+++ b/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java
@@ -136,7 +136,6 @@ public class ImageryAdjustAction extends MapMode implements AWTEventListener {
                 Main.debug(getClass().getName()+" consuming event "+kev);
             }
             kev.consume();
-            Main.map.repaint();
         }
     }
 
@@ -163,7 +162,6 @@ public class ImageryAdjustAction extends MapMode implements AWTEventListener {
         if (offsetDialog != null) {
             offsetDialog.updateOffset();
         }
-        Main.map.repaint();
         prevEastNorth = eastNorth;
     }
 
diff --git a/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java b/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java
index 5a0bcfd..ab3d135 100644
--- a/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java
+++ b/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java
@@ -159,7 +159,6 @@ public class JoinNodeWayAction extends JosmAction {
 
         if (cmds.isEmpty()) return;
         Main.main.undoRedo.add(new SequenceCommand(getValue(NAME).toString(), cmds));
-        Main.map.repaint();
     }
 
     private static SortedSet<Integer> pruneSuccs(Collection<Integer> is) {
diff --git a/src/org/openstreetmap/josm/actions/MirrorAction.java b/src/org/openstreetmap/josm/actions/MirrorAction.java
index 36e4a8c..379afbd 100644
--- a/src/org/openstreetmap/josm/actions/MirrorAction.java
+++ b/src/org/openstreetmap/josm/actions/MirrorAction.java
@@ -80,7 +80,6 @@ public final class MirrorAction extends JosmAction {
         }
 
         Main.main.undoRedo.add(new SequenceCommand(tr("Mirror"), cmds));
-        Main.map.repaint();
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java b/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java
index 9afb758..973c492 100644
--- a/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java
+++ b/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java
@@ -112,7 +112,6 @@ public final class OrthogonalizeAction extends JosmAction {
                 }
                 if (!commands.isEmpty()) {
                     Main.main.undoRedo.add(new SequenceCommand(tr("Orthogonalize / Undo"), commands));
-                    Main.map.repaint();
                 } else {
                     throw new InvalidUserInputException("Commands are empty");
                 }
@@ -152,7 +151,6 @@ public final class OrthogonalizeAction extends JosmAction {
         try {
             final SequenceCommand command = orthogonalize(sel);
             Main.main.undoRedo.add(new SequenceCommand(tr("Orthogonalize"), command));
-            Main.map.repaint();
         } catch (InvalidUserInputException ex) {
             Main.debug(ex);
             String msg;
diff --git a/src/org/openstreetmap/josm/actions/ReverseWayAction.java b/src/org/openstreetmap/josm/actions/ReverseWayAction.java
index 531a58f..831bcc3 100644
--- a/src/org/openstreetmap/josm/actions/ReverseWayAction.java
+++ b/src/org/openstreetmap/josm/actions/ReverseWayAction.java
@@ -102,10 +102,10 @@ public final class ReverseWayAction extends JosmAction {
             propertiesUpdated |= !revResult.getTagCorrectionCommands().isEmpty();
         }
         Main.main.undoRedo.add(new SequenceCommand(tr("Reverse ways"), c));
+        // FIXME: This should be handled by undoRedo.
         if (propertiesUpdated) {
             ds.fireSelectionChanged();
         }
-        Main.map.repaint();
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/actions/SimplifyWayAction.java b/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
index 076967c..8a979c3 100644
--- a/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
+++ b/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
@@ -123,7 +123,6 @@ public class SimplifyWayAction extends JosmAction {
         } finally {
             ds.endUpdate();
         }
-        Main.map.repaint();
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/actions/UnJoinNodeWayAction.java b/src/org/openstreetmap/josm/actions/UnJoinNodeWayAction.java
index 494c3f5..0e52890 100644
--- a/src/org/openstreetmap/josm/actions/UnJoinNodeWayAction.java
+++ b/src/org/openstreetmap/josm/actions/UnJoinNodeWayAction.java
@@ -90,7 +90,6 @@ public class UnJoinNodeWayAction extends JosmAction {
 
         // I'm sure there's a better way to handle this
         Main.main.undoRedo.add(new RemoveNodesCommand(selectedWay, selectedNodes));
-        Main.map.repaint();
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java
index 3807238..41114c4 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java
@@ -121,8 +121,6 @@ public class DownloadReferrersTask extends PleaseWaitRunnable {
                     @Override
                     public void run() {
                         targetLayer.onPostDownloadFromServer();
-                        if (Main.map != null)
-                            Main.map.mapView.repaint();
                     }
                 }
         );
diff --git a/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java b/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java
index dedbb84..05d267e 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java
@@ -133,23 +133,26 @@ public class DeleteAction extends MapMode implements ModifierListener {
      * @param e Action event
      */
     public static void doActionPerformed(ActionEvent e) {
-        if (!Main.map.mapView.isActiveLayerDrawable())
+        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();
         }
     }
 
@@ -212,24 +215,24 @@ public class DeleteAction extends MapMode implements ModifierListener {
 
     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;
             }
             oldHighlightedWaySegment = newHighlightedWaySegment;
         }
         needsRepaint |= highlightHelper.highlightOnly(newHighlights);
-        if (needsRepaint) {
-            Main.map.mapView.repaint();
+        if (needsRepaint && editLayer != null) {
+            editLayer.invalidate();
         }
     }
 
diff --git a/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java b/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
index 3226fe9..fba4f5f 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
@@ -184,8 +184,9 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
             return false;
 
         // 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())) {
                 addRemoveSelection(currentDataSet, getCurrentBaseNode(), continueFrom);
@@ -196,8 +197,8 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
             }
         }
 
-        if (needsRepaint) {
-            Main.map.mapView.repaint();
+        if (needsRepaint && editLayer != null) {
+            editLayer.invalidate();
         }
         return needsRepaint;
     }
@@ -916,15 +917,17 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
      */
     @Override
     public void mouseExited(MouseEvent e) {
-        if (!Main.map.mapView.isActiveLayerDrawable())
+        OsmDataLayer editLayer = Main.getLayerManager().getEditLayer();
+        if (editLayer == null) {
             return;
+        }
         mousePos = e.getPoint();
         snapHelper.noSnapNow();
         boolean repaintIssued = removeHighlighting();
         // force repaint in case snapHelper needs one. If removeHighlighting
         // caused one already, don’t do it again.
         if (!repaintIssued) {
-            Main.map.mapView.repaint();
+            editLayer.invalidate();
         }
     }
 
diff --git a/src/org/openstreetmap/josm/command/AddCommand.java b/src/org/openstreetmap/josm/command/AddCommand.java
index f22603b..0ed62bb 100644
--- a/src/org/openstreetmap/josm/command/AddCommand.java
+++ b/src/org/openstreetmap/josm/command/AddCommand.java
@@ -58,7 +58,7 @@ public class AddCommand extends Command {
 
     @Override
     public boolean executeCommand() {
-        getLayer().data.addPrimitive(osm);
+        getAffectedDataSet().addPrimitive(osm);
         osm.setModified(true);
         checkNodeStyles(osm);
         return true;
@@ -66,7 +66,7 @@ public class AddCommand extends Command {
 
     @Override
     public void undoCommand() {
-        getLayer().data.removePrimitive(osm);
+        getAffectedDataSet().removePrimitive(osm);
         checkNodeStyles(osm);
     }
 
diff --git a/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java b/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java
index 1c43060..c3a9ab7 100644
--- a/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java
+++ b/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java
@@ -77,7 +77,7 @@ public class AddPrimitivesCommand extends Command {
             primitivesToSelect = new ArrayList<>(toSelect.size());
 
             for (PrimitiveData pd : data) {
-                OsmPrimitive primitive = getLayer().data.getPrimitiveById(pd);
+                OsmPrimitive primitive = getAffectedDataSet().getPrimitiveById(pd);
                 boolean created = primitive == null;
                 if (created) {
                     primitive = pd.getType().newInstance(pd.getUniqueId(), true);
@@ -86,7 +86,7 @@ public class AddPrimitivesCommand extends Command {
                     primitive.load(pd);
                 }
                 if (created) {
-                    getLayer().data.addPrimitive(primitive);
+                    getAffectedDataSet().addPrimitive(primitive);
                 }
                 newPrimitives.add(primitive);
                 if (toSelect.contains(pd)) {
@@ -114,7 +114,7 @@ public class AddPrimitivesCommand extends Command {
     }
 
     @Override public void undoCommand() {
-        DataSet ds = getLayer().data;
+        DataSet ds = getAffectedDataSet();
 
         if (createdPrimitives == null) {
             createdPrimitives = new ArrayList<>(data.size());
@@ -166,7 +166,7 @@ public class AddPrimitivesCommand extends Command {
 
         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();
             prims.add(osm);
diff --git a/src/org/openstreetmap/josm/command/Command.java b/src/org/openstreetmap/josm/command/Command.java
index e6e3bfc..fadce1a 100644
--- a/src/org/openstreetmap/josm/command/Command.java
+++ b/src/org/openstreetmap/josm/command/Command.java
@@ -16,6 +16,7 @@ import javax.swing.JPanel;
 import org.openstreetmap.josm.Main;
 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;
 import org.openstreetmap.josm.data.osm.PrimitiveData;
@@ -212,6 +213,15 @@ public abstract class Command extends PseudoCommand {
     }
 
     /**
+     * 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 xxx
+     */
+    public DataSet getAffectedDataSet() {
+        return layer == null ? null : layer.data;
+    }
+
+    /**
      * Fill in the changed data this command operates on.
      * Add to the lists, don't clear them.
      *
diff --git a/src/org/openstreetmap/josm/command/conflict/WayNodesConflictResolverCommand.java b/src/org/openstreetmap/josm/command/conflict/WayNodesConflictResolverCommand.java
index f94b18d..5d2e85b 100644
--- a/src/org/openstreetmap/josm/command/conflict/WayNodesConflictResolverCommand.java
+++ b/src/org/openstreetmap/josm/command/conflict/WayNodesConflictResolverCommand.java
@@ -58,7 +58,7 @@ public class WayNodesConflictResolverCommand extends ConflictResolveCommand {
         // replace the list of nodes of 'my' way by the list of merged nodes
         //
         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()));
             }
         }
diff --git a/src/org/openstreetmap/josm/data/UndoRedoHandler.java b/src/org/openstreetmap/josm/data/UndoRedoHandler.java
index bb39aae..6f77728 100644
--- a/src/org/openstreetmap/josm/data/UndoRedoHandler.java
+++ b/src/org/openstreetmap/josm/data/UndoRedoHandler.java
@@ -73,13 +73,22 @@ public class UndoRedoHandler implements LayerChangeListener {
      * @param c The command to execute. Must not be {@code null}.
      */
     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);
+        }
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/data/gpx/GpxData.java b/src/org/openstreetmap/josm/data/gpx/GpxData.java
index 2d01218..da6d631 100644
--- a/src/org/openstreetmap/josm/data/gpx/GpxData.java
+++ b/src/org/openstreetmap/josm/data/gpx/GpxData.java
@@ -202,7 +202,7 @@ public class GpxData extends WithAttributes implements Data {
                 } else {
                     if (pnt.compareTo(earliest) < 0) {
                         earliest = pnt;
-                    } else {
+                    } else if (pnt.compareTo(latest) > 0) {
                         latest = pnt;
                     }
                 }
diff --git a/src/org/openstreetmap/josm/data/gpx/WayPoint.java b/src/org/openstreetmap/josm/data/gpx/WayPoint.java
index 510f90f..7b85ee5 100644
--- a/src/org/openstreetmap/josm/data/gpx/WayPoint.java
+++ b/src/org/openstreetmap/josm/data/gpx/WayPoint.java
@@ -18,7 +18,7 @@ import org.openstreetmap.josm.tools.template_engine.TemplateEngineDataProvider;
 public class WayPoint extends WithAttributes implements Comparable<WayPoint>, TemplateEngineDataProvider {
 
     /**
-     * The seconds (not milliseconds!) since 1970-01-01.
+     * The seconds (not milliseconds!) since 1970-01-01 00:00 UTC
      */
     public double time;
     public Color customColoring;
diff --git a/src/org/openstreetmap/josm/gui/MainApplication.java b/src/org/openstreetmap/josm/gui/MainApplication.java
index 2d562c8..4abcbe5 100644
--- a/src/org/openstreetmap/josm/gui/MainApplication.java
+++ b/src/org/openstreetmap/josm/gui/MainApplication.java
@@ -100,6 +100,7 @@ public class MainApplication extends Main {
 
     @Override
     protected void initializeMainWindow() {
+        mainPanel.reAddListeners();
         if (mainFrame != null) {
             mainFrame.initialize();
 
@@ -409,7 +410,6 @@ public class MainApplication extends Main {
                 !args.containsKey(Option.NO_MAXIMIZE) && Main.pref.getBoolean("gui.maximized", false));
         final MainFrame mainFrame = new MainFrame(contentPanePrivate, mainPanel, geometry);
         Main.parent = mainFrame;
-        mainPanel.reAddListeners();
 
         if (args.containsKey(Option.LOAD_PREFERENCES)) {
             CustomConfigurator.XMLCommandProcessor config = new CustomConfigurator.XMLCommandProcessor(Main.pref);
diff --git a/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java b/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
index c7b9ade..22c2589 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
@@ -175,7 +175,7 @@ public class LayerListDialog extends ToggleDialog {
      * Creates a layer list and attach it to the given mapView.
      * @param layerManager The layer manager this list is for
      */
-    private LayerListDialog(MainLayerManager layerManager) {
+    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,
                         Shortcut.ALT_SHIFT), 100, true);
diff --git a/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java b/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
index 04eea4b..cc9997a 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
@@ -256,6 +256,13 @@ public class ToggleDialog extends JPanel implements ShowHideButtonListener, Help
         Main.redirectToMainContentPane(this);
         Main.pref.addPreferenceChangeListener(this);
 
+        registerInWindowMenu();
+    }
+
+    /**
+     * Registers this dialog in the window menu. Called in the constructor.
+     */
+    protected void registerInWindowMenu() {
         windowMenuItem = MainMenu.addWithCheckbox(Main.main.menu.windowMenu,
                 (JosmAction) getToggleAction(),
                 MainMenu.WINDOW_MENU_GROUP.TOGGLE_DIALOG);
diff --git a/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java b/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java
index be0bcd5..4a6d290 100644
--- a/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java
@@ -116,9 +116,15 @@ public abstract class ImageryLayer extends Layer {
         return dy;
     }
 
+    /**
+     * 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();
     }
 
     public void displace(double dx, double dy) {
diff --git a/src/org/openstreetmap/josm/gui/layer/LayerManager.java b/src/org/openstreetmap/josm/gui/layer/LayerManager.java
index 352df56..e7ee59e 100644
--- a/src/org/openstreetmap/josm/gui/layer/LayerManager.java
+++ b/src/org/openstreetmap/josm/gui/layer/LayerManager.java
@@ -6,6 +6,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.Utils;
 import org.openstreetmap.josm.tools.bugreport.BugReport;
@@ -174,7 +175,9 @@ public class LayerManager {
         checkPosition(position);
         insertLayerAt(layer, position);
         fireLayerAdded(layer);
-        layer.hookUpMapView(); // needs to be after fireLayerAdded
+        if (Main.map != null) {
+            layer.hookUpMapView(); // needs to be after fireLayerAdded
+        }
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java b/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
index 747df2b..6bcfb13 100644
--- a/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
@@ -877,6 +877,7 @@ public class OsmDataLayer extends AbstractModifiableLayer implements Listener, S
     public void onPostLoadFromFile() {
         setRequiresSaveToFile(false);
         setRequiresUploadToServer(isModified());
+        invalidate();
     }
 
     /**
@@ -885,6 +886,7 @@ public class OsmDataLayer extends AbstractModifiableLayer implements Listener, S
     public void onPostDownloadFromServer() {
         setRequiresSaveToFile(true);
         setRequiresUploadToServer(isModified());
+        invalidate();
     }
 
     @Override
diff --git a/test/unit/org/openstreetmap/josm/JOSMFixture.java b/test/unit/org/openstreetmap/josm/JOSMFixture.java
index 51fb2dc..b8f3d28 100644
--- a/test/unit/org/openstreetmap/josm/JOSMFixture.java
+++ b/test/unit/org/openstreetmap/josm/JOSMFixture.java
@@ -11,9 +11,11 @@ import java.nio.file.Paths;
 import java.security.GeneralSecurityException;
 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;
 import org.openstreetmap.josm.io.CertificateAmendment;
@@ -87,6 +89,7 @@ public class JOSMFixture {
             }
         }
         System.setProperty("josm.home", josmHome);
+        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
         Main.initApplicationPreferences();
         Main.pref.enableSaveOnPut(false);
         I18n.init();
@@ -95,6 +98,7 @@ public class JOSMFixture {
         // call the really early hook before we anything else
         Main.platform.preStartupHook();
 
+        Main.logLevel = 3;
         Main.pref.init(false);
         Main.pref.put("osm-server.url", "http://api06.dev.openstreetmap.org/api");
         I18n.set(Main.pref.get("language", "en"));
@@ -127,15 +131,18 @@ public class JOSMFixture {
     }
 
     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();
         }
         if (Main.main == null) {
             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());
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/data/AutosaveTaskTest.java b/test/unit/org/openstreetmap/josm/data/AutosaveTaskTest.java
index 28faf26..ce6b72c 100644
--- a/test/unit/org/openstreetmap/josm/data/AutosaveTaskTest.java
+++ b/test/unit/org/openstreetmap/josm/data/AutosaveTaskTest.java
@@ -91,7 +91,8 @@ public class AutosaveTaskTest {
         cal.set(Calendar.MILLISECOND, 456);
         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));
             if (i > AutosaveTask.PROP_INDEX_LIMIT.get()) {
diff --git a/test/unit/org/openstreetmap/josm/data/PreferencesTest.groovy b/test/unit/org/openstreetmap/josm/data/PreferencesTest.groovy
index 7046cec..dcccb2e 100644
--- a/test/unit/org/openstreetmap/josm/data/PreferencesTest.groovy
+++ b/test/unit/org/openstreetmap/josm/data/PreferencesTest.groovy
@@ -36,7 +36,7 @@ class PreferencesTest extends GroovyTestCase {
             "  <tag key='jdk.Arrays.useLegacyMergeSort' value='false'/>%n" +
             "  <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"))
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/data/validation/tests/OpeningHourTestTest.java b/test/unit/org/openstreetmap/josm/data/validation/tests/OpeningHourTestTest.java
index 0ccfab7..1b97917 100644
--- a/test/unit/org/openstreetmap/josm/data/validation/tests/OpeningHourTestTest.java
+++ b/test/unit/org/openstreetmap/josm/data/validation/tests/OpeningHourTestTest.java
@@ -16,21 +16,31 @@ import java.util.List;
 import java.util.Set;
 
 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;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItem;
 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 {
+    /**
+     * 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 static final OpeningHourTest OPENING_HOUR_TEST = new OpeningHourTest();
+    private OpeningHourTest openingHourTest;
 
     /**
      * Setup test.
@@ -38,8 +48,8 @@ public class OpeningHourTestTest {
      */
     @Before
     public void setUp() throws Exception {
-        JOSMFixture.createUnitTestFixture().init();
-        OPENING_HOUR_TEST.initialize();
+        openingHourTest = new OpeningHourTest();
+        openingHourTest.initialize();
     }
 
     /**
@@ -49,23 +59,23 @@ public class OpeningHourTestTest {
     public void testCheckOpeningHourSyntax1() {
         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());
     }
 
     @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"));
     }
 
@@ -75,7 +85,7 @@ public class OpeningHourTestTest {
     @Test
     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());
         assertEquals(Severity.WARNING, errors.get(0).getSeverity());
@@ -91,7 +101,7 @@ public class OpeningHourTestTest {
     @Test
     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());
         assertEquals(Severity.WARNING, errors.get(0).getSeverity());
@@ -105,9 +115,9 @@ public class OpeningHourTestTest {
      */
     @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());
     }
 
     /**
@@ -116,13 +126,13 @@ public class OpeningHourTestTest {
     @Test
     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());
     }
 
     /**
@@ -131,7 +141,7 @@ public class OpeningHourTestTest {
     @Test
     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());
     }
 
     /**
@@ -140,9 +150,9 @@ public class OpeningHourTestTest {
     @Test
     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());
     }
 
     /**
@@ -151,11 +161,11 @@ public class OpeningHourTestTest {
     @Test
     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());
     }
 
     /**
@@ -165,19 +175,19 @@ public class OpeningHourTestTest {
     public void testCheckServiceTimeSyntax1() {
         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());
     }
 
@@ -188,18 +198,18 @@ public class OpeningHourTestTest {
     public void testCheckCollectionTimeSyntax1() {
         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());
     }
 
@@ -221,7 +231,7 @@ public class OpeningHourTestTest {
             }
         }
         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());
         }
     }
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityActionTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityActionTest.java
index 8f94ad6..36ff653 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityActionTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityActionTest.java
@@ -5,27 +5,27 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 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;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog.LayerListModel;
 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;
 
 /**
  * Unit tests of {@link LayerVisibilityAction} class.
  */
 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();
 
     /**
      * Unit test of {@link LayerVisibilityAction} class.
@@ -33,60 +33,61 @@ public class LayerVisibilityActionTest {
     @Test
     public void testLayerVisibilityAction() {
         TMSLayer layer = TMSLayerTest.createTmsLayer();
-        try {
-            LayerListModel model = LayerListDialog.getInstance().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()));
+        LayerListModel model = new LayerListDialog(Main.getLayerManager()) {
+            @Override
+            protected void registerInWindowMenu() {
+                // ignore
+            }
+        }.getModel();
+        LayerVisibilityAction action = new LayerVisibilityAction(model);
+        action.updateEnabledState();
+        assertFalse(action.isEnabled());
 
-            // now check values
-            action.updateValues();
-            assertEquals(1.0, action.opacitySlider.getRealValue(), 1e-15);
-            assertEquals("OpacitySlider [getRealValue()=1.0]", action.opacitySlider.toString());
+        Main.getLayerManager().addLayer(layer);
+        model.setSelectedLayer(layer);
+        action.updateEnabledState();
+        assertTrue(action.isEnabled());
+        assertTrue(action.supportLayers(model.getSelectedLayers()));
 
-            action.opacitySlider.setRealValue(.5);
-            action.updateValues();
+        // now check values
+        action.updateValues();
+        assertEquals(1.0, action.opacitySlider.getRealValue(), 1e-15);
+        assertEquals("OpacitySlider [getRealValue()=1.0]", action.opacitySlider.toString());
 
-            assertEquals(0.5, action.opacitySlider.getRealValue(), 1e-15);
-            assertEquals("OpacitySlider [getRealValue()=0.5]", action.opacitySlider.toString());
+        action.opacitySlider.setRealValue(.5);
+        action.updateValues();
 
-            action.setVisibleFlag(false);
-            action.updateValues();
-            assertFalse(layer.isVisible());
+        assertEquals(0.5, action.opacitySlider.getRealValue(), 1e-15);
+        assertEquals("OpacitySlider [getRealValue()=0.5]", action.opacitySlider.toString());
 
-            action.setVisibleFlag(true);
-            action.updateValues();
-            assertTrue(layer.isVisible());
+        action.setVisibleFlag(false);
+        action.updateValues();
+        assertFalse(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);
+        action.setVisibleFlag(true);
+        action.updateValues();
+        assertTrue(layer.isVisible());
 
-            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();
+        // 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);
 
-            // 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);
+        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();
 
-        } 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);
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/GpxLayerTest.java b/test/unit/org/openstreetmap/josm/gui/layer/GpxLayerTest.java
index 4f7b522..1d8acb0 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/GpxLayerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/GpxLayerTest.java
@@ -10,6 +10,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.TimeZone;
 
 import javax.swing.JScrollPane;
 
@@ -170,6 +171,9 @@ public class GpxLayerTest {
         assertEquals("", GpxLayer.getTimespanForTrack(
                 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()));
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/LayerManagerTest.java b/test/unit/org/openstreetmap/josm/gui/layer/LayerManagerTest.java
index 96c8be9..505b48b 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/LayerManagerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/LayerManagerTest.java
@@ -10,6 +10,8 @@ import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import java.awt.Component;
+import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
@@ -40,8 +42,16 @@ import org.openstreetmap.josm.tools.bugreport.ReportedException;
  */
 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
+     * @since xxx
+     */
+    public static class TestLayer extends Layer {
+        /**
+         * Create a new test layer.
+         */
+        public TestLayer() {
             super("Test Layer");
         }
 
@@ -69,7 +79,7 @@ public class LayerManagerTest {
 
         @Override
         public Action[] getMenuEntries() {
-            return null;
+            return new Action[0];
         }
 
         @Override
@@ -79,7 +89,22 @@ public class LayerManagerTest {
 
         @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;
+                }
+            };
         }
 
         @Override
@@ -88,7 +113,7 @@ public class LayerManagerTest {
         }
     }
 
-    protected static class AbstractTestLayer2 extends AbstractTestLayer {}
+    protected static class TestLayer2 extends TestLayer {}
 
     /**
      * Intercepts the events for easier testing.
@@ -146,7 +171,7 @@ public class LayerManagerTest {
      */
     @Test
     public void testAddLayer() {
-        Layer layer1 = new AbstractTestLayer() {
+        Layer layer1 = new TestLayer() {
             @Override
             public LayerPositionStrategy getDefaultLayerPosition() {
                 return LayerPositionStrategy.IN_FRONT;
@@ -157,13 +182,13 @@ public class LayerManagerTest {
                 return true;
             }
         };
-        Layer layer2 = new AbstractTestLayer() {
+        Layer layer2 = new TestLayer() {
             @Override
             public LayerPositionStrategy getDefaultLayerPosition() {
                 return LayerPositionStrategy.IN_FRONT;
             }
         };
-        Layer layer3 = new AbstractTestLayer() {
+        Layer layer3 = new TestLayer() {
             @Override
             public LayerPositionStrategy getDefaultLayerPosition() {
                 return LayerPositionStrategy.BEFORE_FIRST_BACKGROUND_LAYER;
@@ -178,7 +203,7 @@ public class LayerManagerTest {
         assertEquals(layerManager.getLayers(), Arrays.asList(layer2, layer3, layer1));
 
         // event
-        AbstractTestLayer layer4 = new AbstractTestLayer();
+        TestLayer layer4 = new TestLayer();
         CapturingLayerChangeListener l = new CapturingLayerChangeListener();
         layerManager.addLayerChangeListener(l);
         layerManager.addLayer(layer4);
@@ -197,7 +222,7 @@ public class LayerManagerTest {
         thrown.expectCause(any(InvocationTargetException.class));
         thrown.expectRootCause(any(IllegalArgumentException.class));
 
-        AbstractTestLayer layer1 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
         layerManager.addLayer(layer1);
         layerManager.addLayer(layer1);
     }
@@ -211,7 +236,7 @@ public class LayerManagerTest {
         thrown.expectCause(any(InvocationTargetException.class));
         thrown.expectRootCause(any(IndexOutOfBoundsException.class));
 
-        AbstractTestLayer layer1 = new AbstractTestLayer() {
+        TestLayer layer1 = new TestLayer() {
             @Override
             public LayerPositionStrategy getDefaultLayerPosition() {
                 return new LayerPositionStrategy() {
@@ -230,8 +255,8 @@ public class LayerManagerTest {
      */
     @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);
         assertEquals(layerManager.getLayers(), Arrays.asList(layer1, layer2));
@@ -251,8 +276,8 @@ public class LayerManagerTest {
      */
     @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);
         assertEquals(layerManager.getLayers(), Arrays.asList(layer1, layer2));
@@ -283,8 +308,8 @@ public class LayerManagerTest {
         thrown.expectCause(any(InvocationTargetException.class));
         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);
         layerManager.moveLayer(layer2, 2);
@@ -299,8 +324,8 @@ public class LayerManagerTest {
         thrown.expectCause(any(InvocationTargetException.class));
         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);
     }
@@ -311,8 +336,8 @@ public class LayerManagerTest {
     @Test(expected = UnsupportedOperationException.class)
     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);
         layerManager.getLayers().remove(0);
@@ -323,13 +348,13 @@ public class LayerManagerTest {
      */
     @Test
     public void testGetLayersOfType() {
-        AbstractTestLayer2 layer1 = new AbstractTestLayer2();
-        AbstractTestLayer2 layer2 = new AbstractTestLayer2();
+        TestLayer2 layer1 = new TestLayer2();
+        TestLayer2 layer2 = new TestLayer2();
         layerManager.addLayer(layer1);
-        layerManager.addLayer(new AbstractTestLayer());
+        layerManager.addLayer(new TestLayer());
         layerManager.addLayer(layer2);
 
-        assertEquals(layerManager.getLayersOfType(AbstractTestLayer2.class), Arrays.asList(layer1, layer2));
+        assertEquals(layerManager.getLayersOfType(TestLayer2.class), Arrays.asList(layer1, layer2));
     }
 
     /**
@@ -337,12 +362,12 @@ public class LayerManagerTest {
      */
     @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()));
     }
 
     /**
@@ -373,8 +398,8 @@ public class LayerManagerTest {
     @Test
     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);
         layerManager.addLayerChangeListener(new LayerChangeListener() {
@@ -404,9 +429,9 @@ public class LayerManagerTest {
     public void testRemoveLayerChangeListener() {
         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);
         assertNull(l.layerRemoved);
@@ -428,8 +453,8 @@ public class LayerManagerTest {
     @Test
     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);
         LayerChangeListener listener = new LayerChangeListener() {
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/MainLayerManagerTest.java b/test/unit/org/openstreetmap/josm/gui/layer/MainLayerManagerTest.java
index afc1c2e..c1ee42f 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/MainLayerManagerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/MainLayerManagerTest.java
@@ -67,9 +67,9 @@ public class MainLayerManagerTest extends LayerManagerTest {
 
     @Test
     public void testAddLayerSetsActiveLayer() {
-        AbstractTestLayer layer1 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
         AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
-        AbstractTestLayer layer3 = new AbstractTestLayer();
+        TestLayer layer3 = new TestLayer();
         assertNull(layerManagerWithActive.getActiveLayer());
         assertNull(layerManagerWithActive.getEditLayer());
         layerManagerWithActive.addLayer(layer1);
@@ -85,9 +85,9 @@ public class MainLayerManagerTest extends LayerManagerTest {
 
     @Test
     public void testRemoveLayerUnsetsActiveLayer() {
-        AbstractTestLayer layer1 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
         AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
-        AbstractTestLayer layer3 = new AbstractTestLayer();
+        TestLayer layer3 = new TestLayer();
         AbstractTestOsmLayer layer4 = new AbstractTestOsmLayer();
         layerManagerWithActive.addLayer(layer1);
         layerManagerWithActive.addLayer(layer2);
@@ -115,7 +115,7 @@ public class MainLayerManagerTest extends LayerManagerTest {
      */
     @Test
     public void testAddActiveLayerChangeListener() {
-        AbstractTestLayer layer1 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
         AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
         layerManagerWithActive.addLayer(layer1);
         layerManagerWithActive.addLayer(layer2);
@@ -153,7 +153,7 @@ public class MainLayerManagerTest extends LayerManagerTest {
      */
     @Test
     public void testRemoveActiveLayerChangeListener() {
-        AbstractTestLayer layer1 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
         AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
         layerManagerWithActive.addLayer(layer1);
         layerManagerWithActive.addLayer(layer2);
@@ -181,8 +181,8 @@ public class MainLayerManagerTest extends LayerManagerTest {
      */
     @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);
 
@@ -199,7 +199,7 @@ public class MainLayerManagerTest extends LayerManagerTest {
     @Test
     public void testGetEditDataSet() {
         assertNull(layerManagerWithActive.getEditDataSet());
-        AbstractTestLayer layer0 = new AbstractTestLayer();
+        TestLayer layer0 = new TestLayer();
         layerManagerWithActive.addLayer(layer0);
         assertNull(layerManagerWithActive.getEditDataSet());
 
@@ -222,10 +222,10 @@ public class MainLayerManagerTest extends LayerManagerTest {
     public void testGetVisibleLayersInZOrder() {
         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();
         layerManagerWithActive.addLayer(layer1);
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayerTest.java b/test/unit/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayerTest.java
index a893981..eb90cac 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayerTest.java
@@ -9,27 +9,28 @@ import java.io.InputStream;
 import java.util.Collections;
 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;
 import org.openstreetmap.josm.gui.layer.GpxLayer;
 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;
 
 /**
  * Unit tests of {@link GeoImageLayer} class.
  */
 public class GeoImageLayerTest {
-
     /**
-     * Setup test.
+     * We need prefs for this.
      */
-    @BeforeClass
-    public static void setUpBeforeClass() {
-        JOSMFixture.createUnitTestFixture().init(true);
-    }
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules().preferences();
+
 
     /**
      * Unit test of {@link Loader} class.
@@ -41,28 +42,18 @@ public class GeoImageLayerTest {
             GpxReader reader = new GpxReader(in);
             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());
         }
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/io/NmeaReaderTest.java b/test/unit/org/openstreetmap/josm/io/NmeaReaderTest.java
index ed3f060..88f6ad7 100644
--- a/test/unit/org/openstreetmap/josm/io/NmeaReaderTest.java
+++ b/test/unit/org/openstreetmap/josm/io/NmeaReaderTest.java
@@ -7,6 +7,7 @@ import java.io.FileInputStream;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.TimeZone;
 
 import org.junit.Test;
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -39,6 +40,7 @@ public class NmeaReaderTest {
         assertEquals(30, in.getNumberOfCoordinates());
         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));
         assertEquals("2016-01-25T04:05:09.400Z", wayPoints.get(1).get(GpxConstants.PT_TIME));
diff --git a/test/unit/org/openstreetmap/josm/testutils/JOSMTestRules.java b/test/unit/org/openstreetmap/josm/testutils/JOSMTestRules.java
index 91b7082..a6033d0 100644
--- a/test/unit/org/openstreetmap/josm/testutils/JOSMTestRules.java
+++ b/test/unit/org/openstreetmap/josm/testutils/JOSMTestRules.java
@@ -3,6 +3,7 @@ package org.openstreetmap.josm.testutils;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.TimeZone;
 
 import org.junit.rules.DisableOnDebug;
 import org.junit.rules.TemporaryFolder;
@@ -162,6 +163,10 @@ public class JOSMTestRules implements TestRule {
 
         // 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
         if (i18n != null) {
