Index: trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java	(revision 11948)
+++ trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java	(revision 11950)
@@ -5,5 +5,4 @@
 
 import java.awt.Color;
-import java.awt.Component;
 import java.awt.Dimension;
 import java.awt.Font;
@@ -50,5 +49,4 @@
 import javax.swing.AbstractAction;
 import javax.swing.Action;
-import javax.swing.JCheckBoxMenuItem;
 import javax.swing.JLabel;
 import javax.swing.JMenuItem;
@@ -93,9 +91,16 @@
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.NavigatableComponent.ZoomChangeListener;
-import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.dialogs.LayerListPopup;
+import org.openstreetmap.josm.gui.layer.imagery.AutoLoadTilesAction;
+import org.openstreetmap.josm.gui.layer.imagery.AutoZoomAction;
+import org.openstreetmap.josm.gui.layer.imagery.DecreaseZoomAction;
+import org.openstreetmap.josm.gui.layer.imagery.FlushTileCacheAction;
 import org.openstreetmap.josm.gui.layer.imagery.ImageryFilterSettings.FilterChangeListener;
+import org.openstreetmap.josm.gui.layer.imagery.IncreaseZoomAction;
+import org.openstreetmap.josm.gui.layer.imagery.LoadAllTilesAction;
+import org.openstreetmap.josm.gui.layer.imagery.LoadErroneousTilesAction;
 import org.openstreetmap.josm.gui.layer.imagery.ReprojectionTile;
+import org.openstreetmap.josm.gui.layer.imagery.ShowErrorsAction;
 import org.openstreetmap.josm.gui.layer.imagery.TileAnchor;
 import org.openstreetmap.josm.gui.layer.imagery.TileCoordinateConverter;
@@ -104,4 +109,6 @@
 import org.openstreetmap.josm.gui.layer.imagery.TileSourceDisplaySettings.DisplaySettingsChangeEvent;
 import org.openstreetmap.josm.gui.layer.imagery.TileSourceDisplaySettings.DisplaySettingsChangeListener;
+import org.openstreetmap.josm.gui.layer.imagery.ZoomToBestAction;
+import org.openstreetmap.josm.gui.layer.imagery.ZoomToNativeLevelAction;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.gui.util.GuiHelper;
@@ -312,5 +319,5 @@
      * @see #invalidate() To trigger a repaint of all places where the layer is displayed.
      */
-    protected void redraw() {
+    public void redraw() {
         invalidate();
     }
@@ -391,5 +398,5 @@
      * @return average number of screen pixels per tile pixel
      */
-    protected double getScaleFactor(int zoom) {
+    public double getScaleFactor(int zoom) {
         if (coordinateConverter != null) {
             return coordinateConverter.getScaleFactor(zoom);
@@ -399,5 +406,5 @@
     }
 
-    protected int getBestZoom() {
+    public int getBestZoom() {
         double factor = getScaleFactor(1); // check the ratio between area of tilesize at zoom 1 to current view
         double result = Math.log(factor)/Math.log(2)/2;
@@ -422,5 +429,10 @@
     }
 
-    private static boolean actionSupportLayers(List<Layer> layers) {
+    /**
+     * Default implementation of {@link org.openstreetmap.josm.gui.layer.Layer.LayerAction#supportLayers(List)}.
+     * @param layers layers
+     * @return {@code true} is layers contains only a {@code TMSLayer}
+     */
+    public static boolean actionSupportLayers(List<Layer> layers) {
         return layers.size() == 1 && layers.get(0) instanceof TMSLayer;
     }
@@ -512,170 +524,4 @@
     }
 
-    private class AutoZoomAction extends AbstractAction implements LayerAction {
-        AutoZoomAction() {
-            super(tr("Auto zoom"));
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent ae) {
-            getDisplaySettings().setAutoZoom(!getDisplaySettings().isAutoZoom());
-        }
-
-        @Override
-        public Component createMenuComponent() {
-            JCheckBoxMenuItem item = new JCheckBoxMenuItem(this);
-            item.setSelected(getDisplaySettings().isAutoZoom());
-            return item;
-        }
-
-        @Override
-        public boolean supportLayers(List<Layer> layers) {
-            return actionSupportLayers(layers);
-        }
-    }
-
-    private class AutoLoadTilesAction extends AbstractAction implements LayerAction {
-        AutoLoadTilesAction() {
-            super(tr("Auto load tiles"));
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent ae) {
-            getDisplaySettings().setAutoLoad(!getDisplaySettings().isAutoLoad());
-        }
-
-        @Override
-        public Component createMenuComponent() {
-            JCheckBoxMenuItem item = new JCheckBoxMenuItem(this);
-            item.setSelected(getDisplaySettings().isAutoLoad());
-            return item;
-        }
-
-        @Override
-        public boolean supportLayers(List<Layer> layers) {
-            return actionSupportLayers(layers);
-        }
-    }
-
-    private class ShowErrorsAction extends AbstractAction implements LayerAction {
-        ShowErrorsAction() {
-            super(tr("Show errors"));
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent ae) {
-            getDisplaySettings().setShowErrors(!getDisplaySettings().isShowErrors());
-        }
-
-        @Override
-        public Component createMenuComponent() {
-            JCheckBoxMenuItem item = new JCheckBoxMenuItem(this);
-            item.setSelected(getDisplaySettings().isShowErrors());
-            return item;
-        }
-
-        @Override
-        public boolean supportLayers(List<Layer> layers) {
-            return actionSupportLayers(layers);
-        }
-    }
-
-    private class LoadAllTilesAction extends AbstractAction {
-        LoadAllTilesAction() {
-            super(tr("Load all tiles"));
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent ae) {
-            loadAllTiles(true);
-        }
-    }
-
-    private class LoadErroneusTilesAction extends AbstractAction {
-        LoadErroneusTilesAction() {
-            super(tr("Load all error tiles"));
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent ae) {
-            loadAllErrorTiles(true);
-        }
-    }
-
-    private class ZoomToNativeLevelAction extends AbstractAction {
-        ZoomToNativeLevelAction() {
-            super(tr("Zoom to native resolution"));
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent ae) {
-            double newFactor = Math.sqrt(getScaleFactor(currentZoomLevel));
-            Main.map.mapView.zoomToFactor(newFactor);
-            redraw();
-        }
-    }
-
-    private class ZoomToBestAction extends AbstractAction {
-        ZoomToBestAction() {
-            super(tr("Change resolution"));
-            setEnabled(!getDisplaySettings().isAutoZoom() && getBestZoom() != currentZoomLevel);
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent ae) {
-            setZoomLevel(getBestZoom());
-        }
-    }
-
-    private class IncreaseZoomAction extends AbstractAction {
-        IncreaseZoomAction() {
-            super(tr("Increase zoom"));
-            setEnabled(!getDisplaySettings().isAutoZoom() && zoomIncreaseAllowed());
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent ae) {
-            increaseZoomLevel();
-        }
-    }
-
-    private class DecreaseZoomAction extends AbstractAction {
-        DecreaseZoomAction() {
-            super(tr("Decrease zoom"));
-            setEnabled(!getDisplaySettings().isAutoZoom() && zoomDecreaseAllowed());
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent ae) {
-            decreaseZoomLevel();
-        }
-    }
-
-    private class FlushTileCacheAction extends AbstractAction {
-        FlushTileCacheAction() {
-            super(tr("Flush tile cache"));
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent ae) {
-            new PleaseWaitRunnable(tr("Flush tile cache")) {
-                @Override
-                protected void realRun() {
-                    clearTileCache();
-                }
-
-                @Override
-                protected void finish() {
-                    // empty - flush is instaneus
-                }
-
-                @Override
-                protected void cancel() {
-                    // empty - flush is instaneus
-                }
-            }.run();
-        }
-    }
-
     /**
      * Simple class to keep clickedTile within hookUpMapView
@@ -1028,5 +874,10 @@
     }
 
-    protected void loadAllTiles(boolean force) {
+    /**
+     * Load all visible tiles.
+     * @param force {@code true} to force loading if auto-load is disabled
+     * @since 11950
+     */
+    public void loadAllTiles(boolean force) {
         TileSet ts = getVisibleTileSet();
 
@@ -1040,5 +891,10 @@
     }
 
-    protected void loadAllErrorTiles(boolean force) {
+    /**
+     * Load all visible tiles in error.
+     * @param force {@code true} to force loading if auto-load is disabled
+     * @since 11950
+     */
+    public void loadAllErrorTiles(boolean force) {
         TileSet ts = getVisibleTileSet();
         ts.loadAllErrorTiles(force);
@@ -1801,14 +1657,14 @@
     public Action[] getCommonEntries() {
         return new Action[] {
-            new AutoLoadTilesAction(),
-            new AutoZoomAction(),
-            new ShowErrorsAction(),
-            new IncreaseZoomAction(),
-            new DecreaseZoomAction(),
-            new ZoomToBestAction(),
-            new ZoomToNativeLevelAction(),
-            new FlushTileCacheAction(),
-            new LoadErroneusTilesAction(),
-            new LoadAllTilesAction()
+            new AutoLoadTilesAction(this),
+            new AutoZoomAction(this),
+            new ShowErrorsAction(this),
+            new IncreaseZoomAction(this),
+            new DecreaseZoomAction(this),
+            new ZoomToBestAction(this),
+            new ZoomToNativeLevelAction(this),
+            new FlushTileCacheAction(this),
+            new LoadErroneousTilesAction(this),
+            new LoadAllTilesAction(this)
         };
     }
Index: trunk/src/org/openstreetmap/josm/gui/layer/WMTSLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/WMTSLayer.java	(revision 11948)
+++ trunk/src/org/openstreetmap/josm/gui/layer/WMTSLayer.java	(revision 11950)
@@ -69,5 +69,5 @@
 
     @Override
-    protected int getBestZoom() {
+    public int getBestZoom() {
         if (!Main.isDisplayingMapView())
             return 0;
Index: trunk/src/org/openstreetmap/josm/gui/layer/imagery/AutoLoadTilesAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/imagery/AutoLoadTilesAction.java	(revision 11950)
+++ trunk/src/org/openstreetmap/josm/gui/layer/imagery/AutoLoadTilesAction.java	(revision 11950)
@@ -0,0 +1,51 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer.imagery;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.util.List;
+
+import javax.swing.AbstractAction;
+import javax.swing.JCheckBoxMenuItem;
+
+import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.Layer.LayerAction;
+
+/**
+ * Auto load tiles.
+ * @since 11950 (extracted from {@link AbstractTileSourceLayer})
+ */
+public class AutoLoadTilesAction extends AbstractAction implements LayerAction {
+
+    private final AbstractTileSourceLayer<?> layer;
+
+    /**
+     * Constructs a new {@code AutoLoadTilesAction}.
+     * @param layer imagery layer
+     */
+    public AutoLoadTilesAction(AbstractTileSourceLayer<?> layer) {
+        super(tr("Auto load tiles"));
+        this.layer = layer;
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent ae) {
+        TileSourceDisplaySettings settings = layer.getDisplaySettings();
+        settings.setAutoLoad(!settings.isAutoLoad());
+    }
+
+    @Override
+    public Component createMenuComponent() {
+        JCheckBoxMenuItem item = new JCheckBoxMenuItem(this);
+        item.setSelected(layer.getDisplaySettings().isAutoLoad());
+        return item;
+    }
+
+    @Override
+    public boolean supportLayers(List<Layer> layers) {
+        return AbstractTileSourceLayer.actionSupportLayers(layers);
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/layer/imagery/AutoZoomAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/imagery/AutoZoomAction.java	(revision 11950)
+++ trunk/src/org/openstreetmap/josm/gui/layer/imagery/AutoZoomAction.java	(revision 11950)
@@ -0,0 +1,51 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer.imagery;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.util.List;
+
+import javax.swing.AbstractAction;
+import javax.swing.JCheckBoxMenuItem;
+
+import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.Layer.LayerAction;
+
+/**
+ * Auto zoom.
+ * @since 11950 (extracted from {@link AbstractTileSourceLayer})
+ */
+public class AutoZoomAction extends AbstractAction implements LayerAction {
+
+    private final AbstractTileSourceLayer<?> layer;
+
+    /**
+     * Constructs a new {@code AutoZoomAction}.
+     * @param layer imagery layer
+     */
+    public AutoZoomAction(AbstractTileSourceLayer<?> layer) {
+        super(tr("Auto zoom"));
+        this.layer = layer;
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent ae) {
+        TileSourceDisplaySettings settings = layer.getDisplaySettings();
+        settings.setAutoZoom(!settings.isAutoZoom());
+    }
+
+    @Override
+    public Component createMenuComponent() {
+        JCheckBoxMenuItem item = new JCheckBoxMenuItem(this);
+        item.setSelected(layer.getDisplaySettings().isAutoZoom());
+        return item;
+    }
+
+    @Override
+    public boolean supportLayers(List<Layer> layers) {
+        return AbstractTileSourceLayer.actionSupportLayers(layers);
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/layer/imagery/DecreaseZoomAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/imagery/DecreaseZoomAction.java	(revision 11950)
+++ trunk/src/org/openstreetmap/josm/gui/layer/imagery/DecreaseZoomAction.java	(revision 11950)
@@ -0,0 +1,34 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer.imagery;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+
+import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
+
+/**
+ * Decrease zoom.
+ * @since 11950 (extracted from {@link AbstractTileSourceLayer})
+ */
+public class DecreaseZoomAction extends AbstractAction {
+
+    private final AbstractTileSourceLayer<?> layer;
+
+    /**
+     * Constructs a new {@code DecreaseZoomAction}.
+     * @param layer imagery layer
+     */
+    public DecreaseZoomAction(AbstractTileSourceLayer<?> layer) {
+        super(tr("Decrease zoom"));
+        this.layer = layer;
+        setEnabled(!layer.getDisplaySettings().isAutoZoom() && layer.zoomDecreaseAllowed());
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent ae) {
+        layer.decreaseZoomLevel();
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/layer/imagery/FlushTileCacheAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/imagery/FlushTileCacheAction.java	(revision 11950)
+++ trunk/src/org/openstreetmap/josm/gui/layer/imagery/FlushTileCacheAction.java	(revision 11950)
@@ -0,0 +1,49 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer.imagery;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+
+import org.openstreetmap.josm.gui.PleaseWaitRunnable;
+import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
+
+/**
+ * Flush tile cache.
+ * @since 11950 (extracted from {@link AbstractTileSourceLayer})
+ */
+public class FlushTileCacheAction extends AbstractAction {
+
+    private final AbstractTileSourceLayer<?> layer;
+
+    /**
+     * Constructs a new {@code FlushTileCacheAction}.
+     * @param layer imagery layer
+     */
+    public FlushTileCacheAction(AbstractTileSourceLayer<?> layer) {
+        super(tr("Flush tile cache"));
+        this.layer = layer;
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent ae) {
+        new PleaseWaitRunnable(tr("Flush tile cache")) {
+            @Override
+            protected void realRun() {
+                layer.clearTileCache();
+            }
+
+            @Override
+            protected void finish() {
+                // empty - flush is instaneus
+            }
+
+            @Override
+            protected void cancel() {
+                // empty - flush is instaneus
+            }
+        }.run();
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/layer/imagery/IncreaseZoomAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/imagery/IncreaseZoomAction.java	(revision 11950)
+++ trunk/src/org/openstreetmap/josm/gui/layer/imagery/IncreaseZoomAction.java	(revision 11950)
@@ -0,0 +1,34 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer.imagery;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+
+import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
+
+/**
+ * Increase zoom.
+ * @since 11950 (extracted from {@link AbstractTileSourceLayer})
+ */
+public class IncreaseZoomAction extends AbstractAction {
+
+    private final AbstractTileSourceLayer<?> layer;
+
+    /**
+     * Constructs a new {@code IncreaseZoomAction}.
+     * @param layer imagery layer
+     */
+    public IncreaseZoomAction(AbstractTileSourceLayer<?> layer) {
+        super(tr("Increase zoom"));
+        this.layer = layer;
+        setEnabled(!layer.getDisplaySettings().isAutoZoom() && layer.zoomIncreaseAllowed());
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent ae) {
+        layer.increaseZoomLevel();
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/layer/imagery/LoadAllTilesAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/imagery/LoadAllTilesAction.java	(revision 11950)
+++ trunk/src/org/openstreetmap/josm/gui/layer/imagery/LoadAllTilesAction.java	(revision 11950)
@@ -0,0 +1,37 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer.imagery;
+
+/**
+ * Load all tiles.
+ * @since 11950 (extracted from {@link AbstractTileSourceLayer})
+ */
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+
+import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
+
+/**
+ * Load all tiles.
+ * @since 11950 (extracted from {@link AbstractTileSourceLayer})
+ */
+public class LoadAllTilesAction extends AbstractAction {
+
+    private final AbstractTileSourceLayer<?> layer;
+
+    /**
+     * Constructs a new {@code LoadAllTilesAction}.
+     * @param layer imagery layer
+     */
+    public LoadAllTilesAction(AbstractTileSourceLayer<?> layer) {
+        super(tr("Load all tiles"));
+        this.layer = layer;
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent ae) {
+        layer.loadAllTiles(true);
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/layer/imagery/LoadErroneousTilesAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/imagery/LoadErroneousTilesAction.java	(revision 11950)
+++ trunk/src/org/openstreetmap/josm/gui/layer/imagery/LoadErroneousTilesAction.java	(revision 11950)
@@ -0,0 +1,33 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer.imagery;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+
+import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
+
+/**
+ * Load all error tiles.
+ * @since 11950 (extracted from {@link AbstractTileSourceLayer})
+ */
+public class LoadErroneousTilesAction extends AbstractAction {
+
+    private final AbstractTileSourceLayer<?> layer;
+
+    /**
+     * Constructs a new {@code LoadErroneousTilesAction}.
+     * @param layer imagery layer
+     */
+    public LoadErroneousTilesAction(AbstractTileSourceLayer<?> layer) {
+        super(tr("Load all error tiles"));
+        this.layer = layer;
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent ae) {
+        layer.loadAllErrorTiles(true);
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/layer/imagery/ShowErrorsAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/imagery/ShowErrorsAction.java	(revision 11950)
+++ trunk/src/org/openstreetmap/josm/gui/layer/imagery/ShowErrorsAction.java	(revision 11950)
@@ -0,0 +1,51 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer.imagery;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.util.List;
+
+import javax.swing.AbstractAction;
+import javax.swing.JCheckBoxMenuItem;
+
+import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.Layer.LayerAction;
+
+/**
+ * Show tile errors.
+ * @since 11950 (extracted from {@link AbstractTileSourceLayer})
+ */
+public class ShowErrorsAction extends AbstractAction implements LayerAction {
+
+    private final AbstractTileSourceLayer<?> layer;
+
+    /**
+     * Constructs a new {@code ShowErrorsAction}.
+     * @param layer imagery layer
+     */
+    public ShowErrorsAction(AbstractTileSourceLayer<?> layer) {
+        super(tr("Show errors"));
+        this.layer = layer;
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent ae) {
+        TileSourceDisplaySettings settings = layer.getDisplaySettings();
+        settings.setShowErrors(!settings.isShowErrors());
+    }
+
+    @Override
+    public Component createMenuComponent() {
+        JCheckBoxMenuItem item = new JCheckBoxMenuItem(this);
+        item.setSelected(layer.getDisplaySettings().isShowErrors());
+        return item;
+    }
+
+    @Override
+    public boolean supportLayers(List<Layer> layers) {
+        return AbstractTileSourceLayer.actionSupportLayers(layers);
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/layer/imagery/ZoomToBestAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/imagery/ZoomToBestAction.java	(revision 11950)
+++ trunk/src/org/openstreetmap/josm/gui/layer/imagery/ZoomToBestAction.java	(revision 11950)
@@ -0,0 +1,34 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer.imagery;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+
+import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
+
+/**
+ * Change resolution to best zoom level.
+ * @since 11950 (extracted from {@link AbstractTileSourceLayer})
+ */
+public class ZoomToBestAction extends AbstractAction {
+
+    private final AbstractTileSourceLayer<?> layer;
+
+    /**
+     * Constructs a new {@code ZoomToBestAction}.
+     * @param layer imagery layer
+     */
+    public ZoomToBestAction(AbstractTileSourceLayer<?> layer) {
+        super(tr("Change resolution"));
+        this.layer = layer;
+        setEnabled(!layer.getDisplaySettings().isAutoZoom() && layer.getBestZoom() != layer.currentZoomLevel);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent ae) {
+        layer.setZoomLevel(layer.getBestZoom());
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/layer/imagery/ZoomToNativeLevelAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/imagery/ZoomToNativeLevelAction.java	(revision 11950)
+++ trunk/src/org/openstreetmap/josm/gui/layer/imagery/ZoomToNativeLevelAction.java	(revision 11950)
@@ -0,0 +1,36 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer.imagery;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
+
+/**
+ * Change resolution to native zoom level.
+ * @since 11950 (extracted from {@link AbstractTileSourceLayer})
+ */
+public class ZoomToNativeLevelAction extends AbstractAction {
+
+    private final AbstractTileSourceLayer<?> layer;
+
+    /**
+     * Constructs a new {@code ZoomToNativeLevelAction}.
+     * @param layer imagery layer
+     */
+    public ZoomToNativeLevelAction(AbstractTileSourceLayer<?> layer) {
+        super(tr("Zoom to native resolution"));
+        this.layer = layer;
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent ae) {
+        double newFactor = Math.sqrt(layer.getScaleFactor(layer.currentZoomLevel));
+        Main.map.mapView.zoomToFactor(newFactor);
+        layer.redraw();
+    }
+}
