diff --git a/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java b/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
index 2807ac4..c507839 100644
--- a/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
@@ -72,7 +72,6 @@ import org.openstreetmap.josm.data.imagery.ImageryInfo;
 import org.openstreetmap.josm.data.imagery.TMSCachedTileLoader;
 import org.openstreetmap.josm.data.imagery.TileLoaderFactory;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
-import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.data.preferences.IntegerProperty;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.MapFrame;
@@ -82,6 +81,9 @@ 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.ImageryFilterSettings.FilterChangeListener;
+import org.openstreetmap.josm.gui.layer.imagery.TileSourceDisplaySettings;
+import org.openstreetmap.josm.gui.layer.imagery.TileSourceDisplaySettings.DisplaySettingsChangeEvent;
+import org.openstreetmap.josm.gui.layer.imagery.TileSourceDisplaySettings.DisplaySettingsChangeListener;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.io.WMSLayerImporter;
@@ -99,8 +101,14 @@ import org.openstreetmap.josm.tools.GBC;
  * @since 8526 (copied from TMSLayer)
  */
 public abstract class AbstractTileSourceLayer<T extends AbstractTMSTileSource> extends ImageryLayer
-implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeListener {
+implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeListener, DisplaySettingsChangeListener {
     private static final String PREFERENCE_PREFIX = "imagery.generic";
+    /**
+     * Registers all setting properties
+     */
+    static {
+        new TileSourceDisplaySettings();
+    }
 
     /** maximum zoom level supported */
     public static final int MAX_ZOOM = 30;
@@ -108,12 +116,6 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi
     public static final int MIN_ZOOM = 2;
     private static final Font InfoFont = new Font("sansserif", Font.BOLD, 13);
 
-    /** do set autozoom when creating a new layer */
-    public static final BooleanProperty PROP_DEFAULT_AUTOZOOM = new BooleanProperty(PREFERENCE_PREFIX + ".default_autozoom", true);
-    /** do set autoload when creating a new layer */
-    public static final BooleanProperty PROP_DEFAULT_AUTOLOAD = new BooleanProperty(PREFERENCE_PREFIX + ".default_autoload", true);
-    /** do show errors per default */
-    public static final BooleanProperty PROP_DEFAULT_SHOWERRORS = new BooleanProperty(PREFERENCE_PREFIX + ".default_showerrors", true);
     /** minimum zoom level to show to user */
     public static final IntegerProperty PROP_MIN_ZOOM_LVL = new IntegerProperty(PREFERENCE_PREFIX + ".min_zoom_lvl", 2);
     /** maximum zoom level to show to user */
@@ -130,14 +132,6 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi
     private final AttributionSupport attribution = new AttributionSupport();
     private final TileHolder clickedTileHolder = new TileHolder();
 
-    // needed public access for session exporter
-    /** if layers changes automatically, when user zooms in */
-    public boolean autoZoom = PROP_DEFAULT_AUTOZOOM.get();
-    /** if layer automatically loads new tiles */
-    public boolean autoLoad = PROP_DEFAULT_AUTOLOAD.get();
-    /** if layer should show errors on tiles */
-    public boolean showErrors = PROP_DEFAULT_SHOWERRORS.get();
-
     /**
      * Offset between calculated zoom level and zoom level used to download and show tiles. Negative values will result in
      * lower resolution of imagery useful in "retina" displays, positive values will result in higher resolution
@@ -167,6 +161,9 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi
             }
         }
     };
+
+    private final TileSourceDisplaySettings displaySettings = createDisplaySettings();
+
     /**
      * Creates Tile Source based Imagery Layer based on Imagery Info
      * @param info imagery info
@@ -176,6 +173,25 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi
         setBackgroundLayer(true);
         this.setVisible(true);
         getFilterSettings().addFilterChangeListener(this);
+        getDisplaySettings().addSettingsChangeListener(this);
+    }
+
+    /**
+     * This method creates the {@link TileSourceDisplaySettings} object. Subclasses may implement it to e.g. change the prefix.
+     * @return The object.
+     * @since xxx
+     */
+    protected TileSourceDisplaySettings createDisplaySettings() {
+        return new TileSourceDisplaySettings();
+    }
+
+    /**
+     * Gets the {@link TileSourceDisplaySettings} instance associated with this tile source.
+     * @return The tile source display settings
+     * @since xxx
+     */
+    public TileSourceDisplaySettings getDisplaySettings() {
+        return displaySettings;
     }
 
     @Override
@@ -410,17 +426,13 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi
 
         @Override
         public void actionPerformed(ActionEvent ae) {
-            autoZoom = !autoZoom;
-            if (autoZoom && getBestZoom() != currentZoomLevel) {
-                setZoomLevel(getBestZoom());
-                redraw();
-            }
+            getDisplaySettings().setAutoZoom(!getDisplaySettings().isAutoZoom());
         }
 
         @Override
         public Component createMenuComponent() {
             JCheckBoxMenuItem item = new JCheckBoxMenuItem(this);
-            item.setSelected(autoZoom);
+            item.setSelected(getDisplaySettings().isAutoZoom());
             return item;
         }
 
@@ -437,14 +449,13 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi
 
         @Override
         public void actionPerformed(ActionEvent ae) {
-            autoLoad = !autoLoad;
-            if (autoLoad) redraw();
+            getDisplaySettings().setAutoLoad(!getDisplaySettings().isAutoLoad());
         }
 
         @Override
         public Component createMenuComponent() {
             JCheckBoxMenuItem item = new JCheckBoxMenuItem(this);
-            item.setSelected(autoLoad);
+            item.setSelected(getDisplaySettings().isAutoLoad());
             return item;
         }
 
@@ -461,14 +472,13 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi
 
         @Override
         public void actionPerformed(ActionEvent ae) {
-            showErrors = !showErrors;
-            redraw();
+            getDisplaySettings().setShowErrors(!getDisplaySettings().isShowErrors());
         }
 
         @Override
         public Component createMenuComponent() {
             JCheckBoxMenuItem item = new JCheckBoxMenuItem(this);
-            item.setSelected(showErrors);
+            item.setSelected(getDisplaySettings().isShowErrors());
             return item;
         }
 
@@ -518,7 +528,7 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi
     private class ZoomToBestAction extends AbstractAction {
         ZoomToBestAction() {
             super(tr("Change resolution"));
-            setEnabled(!autoZoom && getBestZoom() != currentZoomLevel);
+            setEnabled(!getDisplaySettings().isAutoZoom() && getBestZoom() != currentZoomLevel);
         }
 
         @Override
@@ -531,7 +541,7 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi
     private class IncreaseZoomAction extends AbstractAction {
         IncreaseZoomAction() {
             super(tr("Increase zoom"));
-            setEnabled(!autoZoom && zoomIncreaseAllowed());
+            setEnabled(!getDisplaySettings().isAutoZoom() && zoomIncreaseAllowed());
         }
 
         @Override
@@ -544,7 +554,7 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi
     private class DecreaseZoomAction extends AbstractAction {
         DecreaseZoomAction() {
             super(tr("Decrease zoom"));
-            setEnabled(!autoZoom && zoomDecreaseAllowed());
+            setEnabled(!getDisplaySettings().isAutoZoom() && zoomDecreaseAllowed());
         }
 
         @Override
@@ -696,6 +706,29 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi
         return ret;
     }
 
+    @Override
+    public void displaySettingsChanged(DisplaySettingsChangeEvent e) {
+        if (tileSource == null) {
+            return;
+        }
+        switch (e.getChangedSetting()) {
+        case TileSourceDisplaySettings.AUTO_ZOOM:
+            if (getDisplaySettings().isAutoZoom() && getBestZoom() != currentZoomLevel) {
+                setZoomLevel(getBestZoom());
+                redraw();
+            }
+            break;
+        case TileSourceDisplaySettings.AUTO_LOAD:
+            if (getDisplaySettings().isAutoLoad()) {
+                redraw();
+            }
+            break;
+        default:
+            // trigger a redraw just to be sure.
+            redraw();
+        }
+    }
+
     /**
      * Checks zoom level against settings
      * @param maxZoomLvl zoom level to check
@@ -1142,7 +1175,7 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi
             texty += 1 + fontHeight;
         }*/
 
-        if (tile.hasError() && showErrors) {
+        if (tile.hasError() && getDisplaySettings().isShowErrors()) {
             myDrawString(g, tr("Error") + ": " + tr(tile.getErrorMessage()), p.x + 2, texty);
             //texty += 1 + fontHeight;
         }
@@ -1368,7 +1401,7 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi
         }
 
         private void loadAllTiles(boolean force) {
-            if (!autoLoad && !force)
+            if (!getDisplaySettings().isAutoLoad() && !force)
                 return;
             List<Tile> allTiles = allTilesCreate();
             Collections.sort(allTiles, getTileDistanceComparator());
@@ -1378,7 +1411,7 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi
         }
 
         private void loadAllErrorTiles(boolean force) {
-            if (!autoLoad && !force)
+            if (!getDisplaySettings().isAutoLoad() && !force)
                 return;
             for (Tile t : this.allTilesCreate()) {
                 if (t.hasError()) {
@@ -1476,7 +1509,7 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi
         needRedraw = false;
 
         int zoom = currentZoomLevel;
-        if (autoZoom) {
+        if (getDisplaySettings().isAutoZoom()) {
             zoom = getBestZoom();
         }
 
@@ -1486,7 +1519,7 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi
         int displayZoomLevel = zoom;
 
         boolean noTilesAtZoom = false;
-        if (autoZoom && autoLoad) {
+        if (getDisplaySettings().isAutoZoom() && getDisplaySettings().isAutoLoad()) {
             // Auto-detection of tilesource maxzoom (currently fully works only for Bing)
             TileSetInfo tsi = dts.getTileSetInfo(zoom);
             if (!tsi.hasVisibleTiles && (!tsi.hasLoadingTiles || tsi.hasOverzoomedTiles)) {
@@ -1522,7 +1555,7 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi
                 tsi = dts.getTileSetInfo(zoom);
             }
             ts = dts.getTileSet(zoom);
-        } else if (autoZoom) {
+        } else if (getDisplaySettings().isAutoZoom()) {
             setZoomLevel(zoom);
         }
 
@@ -1541,7 +1574,7 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi
         List<Tile> missedTiles = this.paintTileImages(g, ts, displayZoomLevel, null);
         int[] otherZooms = {-1, 1, -2, 2, -3, -4, -5};
         for (int zoomOffset : otherZooms) {
-            if (!autoZoom) {
+            if (!getDisplaySettings().isAutoZoom()) {
                 break;
             }
             int newzoom = displayZoomLevel + zoomOffset;
@@ -1597,7 +1630,7 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi
             myDrawString(g, tr("zoom in to load any tiles"), 120, 120);
         } else if (ts.tooLarge()) {
             myDrawString(g, tr("zoom in to load more tiles"), 120, 120);
-        } else if (!autoZoom && ts.tooSmall()) {
+        } else if (!getDisplaySettings().isAutoZoom() && ts.tooSmall()) {
             myDrawString(g, tr("increase tiles zoom level (change resolution) to see more detail"), 120, 120);
         }
 
@@ -1709,7 +1742,7 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi
 
     @Override
     public String getToolTipText() {
-        if (autoLoad) {
+        if (getDisplaySettings().isAutoLoad()) {
             return tr("{0} ({1}), automatically downloading in zoom {2}", this.getClass().getSimpleName(), getName(), currentZoomLevel);
         } else {
             return tr("{0} ({1}), downloading in zoom {2}", this.getClass().getSimpleName(), getName(), currentZoomLevel);
diff --git a/src/org/openstreetmap/josm/gui/layer/WMSLayer.java b/src/org/openstreetmap/josm/gui/layer/WMSLayer.java
index 152e658..acf27c6 100644
--- a/src/org/openstreetmap/josm/gui/layer/WMSLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/WMSLayer.java
@@ -28,6 +28,7 @@ import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.data.preferences.IntegerProperty;
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.gui.layer.imagery.TileSourceDisplaySettings;
 
 /**
  * This is a layer that grabs the current screen from an WMS server. The data
@@ -35,13 +36,19 @@ import org.openstreetmap.josm.gui.ExtendedDialog;
  *
  */
 public class WMSLayer extends AbstractCachedTileSourceLayer<TemplatedWMSTileSource> {
-    private static final String PREFERENCE_PREFIX = "imagery.wms.";
+    private static final String PREFERENCE_PREFIX = "imagery.wms";
+    /**
+     * Registers all setting properties
+     */
+    static {
+        new TileSourceDisplaySettings(PREFERENCE_PREFIX);
+    }
 
     /** default tile size for WMS Layer */
-    public static final IntegerProperty PROP_IMAGE_SIZE = new IntegerProperty(PREFERENCE_PREFIX + "imageSize", 512);
+    public static final IntegerProperty PROP_IMAGE_SIZE = new IntegerProperty(PREFERENCE_PREFIX + ".imageSize", 512);
 
     /** should WMS layer autozoom in default mode */
-    public static final BooleanProperty PROP_DEFAULT_AUTOZOOM = new BooleanProperty(PREFERENCE_PREFIX + "default_autozoom", true);
+    public static final BooleanProperty PROP_DEFAULT_AUTOZOOM = new BooleanProperty(PREFERENCE_PREFIX + ".default_autozoom", true);
 
     private static final String CACHE_REGION_NAME = "WMS";
 
@@ -54,7 +61,11 @@ public class WMSLayer extends AbstractCachedTileSourceLayer<TemplatedWMSTileSour
     public WMSLayer(ImageryInfo info) {
         super(info);
         this.supportedProjections = new TreeSet<>(info.getServerProjections());
-        this.autoZoom = PROP_DEFAULT_AUTOZOOM.get();
+    }
+
+    @Override
+    protected TileSourceDisplaySettings createDisplaySettings() {
+        return new TileSourceDisplaySettings(PREFERENCE_PREFIX);
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/layer/WMTSLayer.java b/src/org/openstreetmap/josm/gui/layer/WMTSLayer.java
index c61ee95..f4cb70c 100644
--- a/src/org/openstreetmap/josm/gui/layer/WMTSLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/WMTSLayer.java
@@ -12,8 +12,8 @@ import org.openstreetmap.josm.data.imagery.ImageryInfo;
 import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType;
 import org.openstreetmap.josm.data.imagery.WMSCachedTileLoader;
 import org.openstreetmap.josm.data.imagery.WMTSTileSource;
-import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.data.projection.Projection;
+import org.openstreetmap.josm.gui.layer.imagery.TileSourceDisplaySettings;
 
 /**
  * WMTS layer based on AbstractTileSourceLayer. Overrides few methods to align WMTS to Tile based computations
@@ -26,10 +26,15 @@ import org.openstreetmap.josm.data.projection.Projection;
  *
  */
 public class WMTSLayer extends AbstractCachedTileSourceLayer<WMTSTileSource> implements NativeScaleLayer {
+    private static final String PREFERENCE_PREFIX = "imagery.wmts";
+
     /**
-     * default setting of autozoom per layer
+     * Registers all setting properties
      */
-    public static final BooleanProperty PROP_DEFAULT_AUTOZOOM_WMTS = new BooleanProperty("imagery.wmts.default_autozoom", true);
+    static {
+        new TileSourceDisplaySettings(PREFERENCE_PREFIX);
+    }
+
     private static final String CACHE_REGION_NAME = "WMTS";
 
     /**
@@ -38,7 +43,11 @@ public class WMTSLayer extends AbstractCachedTileSourceLayer<WMTSTileSource> imp
      */
     public WMTSLayer(ImageryInfo info) {
         super(info);
-        autoZoom = PROP_DEFAULT_AUTOZOOM_WMTS.get();
+    }
+
+    @Override
+    protected TileSourceDisplaySettings createDisplaySettings() {
+        return new TileSourceDisplaySettings(PREFERENCE_PREFIX);
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/layer/imagery/TileSourceDisplaySettings.java b/src/org/openstreetmap/josm/gui/layer/imagery/TileSourceDisplaySettings.java
new file mode 100644
index 0000000..04ad579
--- /dev/null
+++ b/src/org/openstreetmap/josm/gui/layer/imagery/TileSourceDisplaySettings.java
@@ -0,0 +1,284 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer.imagery;
+
+import java.util.Map;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.openstreetmap.gui.jmapviewer.interfaces.TileSource;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.preferences.BooleanProperty;
+import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
+
+/**
+ * This are the preferences of how to display a {@link TileSource}.
+ * <p>
+ * They have been extracted from the {@link AbstractTileSourceLayer}. Each layer has one set of such settings.
+ * @author michael
+ *
+ */
+public class TileSourceDisplaySettings {
+    /**
+     * A string returned by {@link DisplaySettingsChangeEvent#getChangedSetting()} if auto load was changed.
+     * @see TileSourceDisplaySettings#isAutoLoad()
+     */
+    public static final String AUTO_LOAD = "automatic-downloading";
+
+    /**
+     * A string returned by {@link DisplaySettingsChangeEvent#getChangedSetting()} if auto zoom was changed.
+     * @see TileSourceDisplaySettings#isAutoZoom()
+     */
+    public static final String AUTO_ZOOM = "automatically-change-resolution";
+
+    /**
+     * A string returned by {@link DisplaySettingsChangeEvent#getChangedSetting()} if the sow errors property was changed.
+     * @see TileSourceDisplaySettings#isShowErrors()
+     */
+    private static final String SHOW_ERRORS = "show-errors";
+
+    private static final String PREFERENCE_PREFIX = "imagery.generic";
+
+    /**
+     * The default auto load property
+     */
+    public static final BooleanProperty PROP_AUTO_LOAD = new BooleanProperty(PREFERENCE_PREFIX + ".default_autoload", true);
+
+    /**
+     * The default auto zoom property
+     */
+    public static final BooleanProperty PROP_AUTO_ZOOM = new BooleanProperty(PREFERENCE_PREFIX + ".default_autozoom", true);
+
+    /** if layers changes automatically, when user zooms in */
+    private boolean autoZoom;
+    /** if layer automatically loads new tiles */
+    private boolean autoLoad;
+    /** if layer should show errors on tiles */
+    private boolean showErrors;
+
+    private final CopyOnWriteArrayList<DisplaySettingsChangeListener> listeners = new CopyOnWriteArrayList<>();
+
+    /**
+     * Create a new {@link TileSourceDisplaySettings}
+     */
+    public TileSourceDisplaySettings() {
+        this(new String[] { PREFERENCE_PREFIX });
+    }
+
+    /**
+     * Create a new {@link TileSourceDisplaySettings}
+     * @param preferencePrefix The additional prefix to scan for preferences.
+     */
+    public TileSourceDisplaySettings(String preferencePrefix) {
+        this(PREFERENCE_PREFIX, preferencePrefix);
+    }
+
+    private TileSourceDisplaySettings(String... prefixes) {
+        autoZoom = getProperty(prefixes, "default_autozoom");
+        autoLoad = getProperty(prefixes, "default_autoload");
+        showErrors = getProperty(prefixes, "default_showerrors");
+    }
+
+    private static boolean getProperty(String[] prefixes, String name) {
+        // iterate through all values to force the preferences to receive the default value.
+        // we only support a default value of true.
+        boolean value = true;
+        for (String p : prefixes) {
+            String key = p + "." + name;
+            boolean currentValue = Main.pref.getBoolean(key, true);
+            if (!Main.pref.get(key).isEmpty()) {
+                value = currentValue;
+            }
+        }
+        return value;
+    }
+
+    /**
+     * Let the layer zoom automatically if the user zooms in
+     * @return auto zoom
+     */
+    public boolean isAutoZoom() {
+        return autoZoom;
+    }
+
+    /**
+     * Sets the auto zoom property
+     * @param autoZoom
+     * @see #isAutoZoom()
+     * @see #AUTO_ZOOM
+     */
+    public void setAutoZoom(boolean autoZoom) {
+        this.autoZoom = autoZoom;
+        fireSettingsChange(AUTO_ZOOM);
+    }
+
+    /**
+     * Gets if the layer should automatically load new tiles.
+     * @return <code>true</code> if it should
+     */
+    public boolean isAutoLoad() {
+        return autoLoad;
+    }
+
+    /**
+     * Sets the auto load property
+     * @param autoLoad
+     * @see #isAutoLoad()
+     * @see #AUTO_LOAD
+     */
+    public void setAutoLoad(boolean autoLoad) {
+        this.autoLoad = autoLoad;
+        fireSettingsChange(AUTO_LOAD);
+    }
+
+    /**
+     * If the layer should display the errors it encountered while loading the tiles.
+     * @return <code>true</code> to show errors.
+     */
+    public boolean isShowErrors() {
+        return showErrors;
+    }
+
+    /**
+     * Sets the show errors proeprty. Fires a change event.
+     * @param showErrors
+     * @see #isShowErrors()
+     * @see #SHOW_ERRORS
+     */
+    public void setShowErrors(boolean showErrors) {
+        this.showErrors = showErrors;
+        fireSettingsChange(SHOW_ERRORS);
+    }
+
+    /**
+     * Notifies all listeners that the paint settings have changed
+     * @param changedSetting The setting name
+     */
+    private void fireSettingsChange(String changedSetting) {
+        DisplaySettingsChangeEvent e = new DisplaySettingsChangeEvent(changedSetting);
+        for (DisplaySettingsChangeListener l : listeners) {
+            l.displaySettingsChanged(e );
+        }
+    }
+
+    /**
+     * Add a listener that listens to display settings changes.
+     * @param l The listener
+     */
+    public void addSettingsChangeListener(DisplaySettingsChangeListener l) {
+        listeners.add(l);
+    }
+
+    /**
+     * Remove a listener that listens to display settings changes.
+     * @param l The listener
+     */
+    public void removeSettingsChangeListener(DisplaySettingsChangeListener l) {
+        listeners.remove(l);
+    }
+
+    /**
+     * Stores the current settings object to the given hashmap.
+     * @param data The map to store the settings to.
+     * @see #loadFrom(Map)
+     */
+    public void storeTo(Map<String, String> data) {
+        data.put(AUTO_LOAD, Boolean.toString(autoLoad));
+        data.put(AUTO_ZOOM, Boolean.toString(autoZoom));
+        data.put(SHOW_ERRORS, Boolean.toString(showErrors));
+    }
+
+    /**
+     * Load the settings from the given data instance.
+     * @param data The data
+     * @see #storeTo(Map)
+     */
+    public void loadFrom(Map<String, String> data) {
+        String doAutoLoad = data.get(AUTO_LOAD);
+        if (doAutoLoad != null) {
+            setAutoLoad(Boolean.parseBoolean(doAutoLoad));
+        }
+
+        String doAutoZoom = data.get(AUTO_ZOOM);
+        if (doAutoZoom != null) {
+            setAutoZoom(Boolean.parseBoolean(doAutoZoom));
+        }
+
+        String doShowErrors = data.get(SHOW_ERRORS);
+        if (doShowErrors != null) {
+            setShowErrors(Boolean.parseBoolean(doShowErrors));
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + (autoLoad ? 1231 : 1237);
+        result = prime * result + (autoZoom ? 1231 : 1237);
+        result = prime * result + (showErrors ? 1231 : 1237);
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        TileSourceDisplaySettings other = (TileSourceDisplaySettings) obj;
+        if (autoLoad != other.autoLoad)
+            return false;
+        if (autoZoom != other.autoZoom)
+            return false;
+        if (showErrors != other.showErrors)
+            return false;
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "TileSourceDisplaySettings [autoZoom=" + autoZoom + ", autoLoad=" + autoLoad + ", showErrors="
+                + showErrors + "]";
+    }
+
+    /**
+     * A listener that listens to changes to the {@link TileSourceDisplaySettings} object.
+     * @author Michael Zangl
+     * @since xxx
+     */
+    public static interface DisplaySettingsChangeListener {
+        /**
+         * Called whenever the display settings have changed.
+         * @param e The change event.
+         */
+        public void displaySettingsChanged(DisplaySettingsChangeEvent e);
+    }
+
+    /**
+     * An event that is created whenever the display settings change.
+     * @author Michael Zangl
+     * @since xxx
+     */
+    public static final class DisplaySettingsChangeEvent {
+        private final String changedSetting;
+
+        DisplaySettingsChangeEvent(String changedSetting) {
+            super();
+            this.changedSetting = changedSetting;
+        }
+
+        /**
+         * Gets the setting that was changed
+         * @return The name of the changed setting.
+         */
+        public String getChangedSetting() {
+            return changedSetting;
+        }
+
+        @Override
+        public String toString() {
+            return "DispalySettingsChangeEvent [changedSetting=" + changedSetting + "]";
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/imagery/TMSSettingsPanel.java b/src/org/openstreetmap/josm/gui/preferences/imagery/TMSSettingsPanel.java
index 0e5eceb..3c61b69 100644
--- a/src/org/openstreetmap/josm/gui/preferences/imagery/TMSSettingsPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/imagery/TMSSettingsPanel.java
@@ -13,6 +13,7 @@ import javax.swing.SpinnerNumberModel;
 
 import org.openstreetmap.josm.data.imagery.TMSCachedTileLoader;
 import org.openstreetmap.josm.gui.layer.TMSLayer;
+import org.openstreetmap.josm.gui.layer.imagery.TileSourceDisplaySettings;
 import org.openstreetmap.josm.tools.GBC;
 
 /**
@@ -81,8 +82,8 @@ public class TMSSettingsPanel extends JPanel {
      * Loads the TMS settings.
      */
     public void loadSettings() {
-        this.autozoomActive.setSelected(TMSLayer.PROP_DEFAULT_AUTOZOOM.get());
-        this.autoloadTiles.setSelected(TMSLayer.PROP_DEFAULT_AUTOLOAD.get());
+        this.autozoomActive.setSelected(TileSourceDisplaySettings.PROP_AUTO_ZOOM.get());
+        this.autoloadTiles.setSelected(TileSourceDisplaySettings.PROP_AUTO_LOAD.get());
         this.addToSlippyMapChosser.setSelected(TMSLayer.PROP_ADD_TO_SLIPPYMAP_CHOOSER.get());
         this.maxZoomLvl.setValue(TMSLayer.getMaxZoomLvl(null));
         this.minZoomLvl.setValue(TMSLayer.getMinZoomLvl(null));
@@ -101,8 +102,8 @@ public class TMSSettingsPanel extends JPanel {
             restartRequired = true;
         }
         TMSLayer.PROP_ADD_TO_SLIPPYMAP_CHOOSER.put(this.addToSlippyMapChosser.isSelected());
-        TMSLayer.PROP_DEFAULT_AUTOZOOM.put(this.autozoomActive.isSelected());
-        TMSLayer.PROP_DEFAULT_AUTOLOAD.put(this.autoloadTiles.isSelected());
+        TileSourceDisplaySettings.PROP_AUTO_ZOOM.put(this.autozoomActive.isSelected());
+        TileSourceDisplaySettings.PROP_AUTO_LOAD.put(this.autoloadTiles.isSelected());
         TMSLayer.setMaxZoomLvl((Integer) this.maxZoomLvl.getValue());
         TMSLayer.setMinZoomLvl((Integer) this.minZoomLvl.getValue());
 
diff --git a/src/org/openstreetmap/josm/io/session/ImagerySessionExporter.java b/src/org/openstreetmap/josm/io/session/ImagerySessionExporter.java
index 47b323c..239b837 100644
--- a/src/org/openstreetmap/josm/io/session/ImagerySessionExporter.java
+++ b/src/org/openstreetmap/josm/io/session/ImagerySessionExporter.java
@@ -81,10 +81,8 @@ public class ImagerySessionExporter extends AbstractSessionExporter<ImageryLayer
         ImageryPreferenceEntry e = new ImageryPreferenceEntry(layer.getInfo());
         Map<String, String> data = new LinkedHashMap<>(Preferences.serializeStruct(e, ImageryPreferenceEntry.class));
         if (layer instanceof AbstractTileSourceLayer) {
-            AbstractTileSourceLayer tsLayer = (AbstractTileSourceLayer) layer;
-            data.put("automatic-downloading", Boolean.toString(tsLayer.autoLoad));
-            data.put("automatically-change-resolution", Boolean.toString(tsLayer.autoZoom));
-            data.put("show-errors", Boolean.toString(tsLayer.showErrors));
+            AbstractTileSourceLayer<?> tsLayer = (AbstractTileSourceLayer<?>) layer;
+            tsLayer.getDisplaySettings().storeTo(data);
         }
         data.put("dx", String.valueOf(layer.getDx()));
         data.put("dy", String.valueOf(layer.getDy()));
diff --git a/src/org/openstreetmap/josm/io/session/ImagerySessionImporter.java b/src/org/openstreetmap/josm/io/session/ImagerySessionImporter.java
index 262790d..2b68c71 100644
--- a/src/org/openstreetmap/josm/io/session/ImagerySessionImporter.java
+++ b/src/org/openstreetmap/josm/io/session/ImagerySessionImporter.java
@@ -50,18 +50,8 @@ public class ImagerySessionImporter implements SessionLayerImporter {
         ImageryInfo i = new ImageryInfo(prefEntry);
         ImageryLayer layer = ImageryLayer.create(i);
         if (layer instanceof AbstractTileSourceLayer) {
-            AbstractTileSourceLayer tsLayer = (AbstractTileSourceLayer) layer;
-            if (attributes.containsKey("automatic-downloading")) {
-                tsLayer.autoLoad = Boolean.parseBoolean(attributes.get("automatic-downloading"));
-            }
-
-            if (attributes.containsKey("automatically-change-resolution")) {
-                tsLayer.autoZoom = Boolean.parseBoolean(attributes.get("automatically-change-resolution"));
-            }
-
-            if (attributes.containsKey("show-errors")) {
-                tsLayer.showErrors = Boolean.parseBoolean(attributes.get("show-errors"));
-            }
+            AbstractTileSourceLayer<?> tsLayer = (AbstractTileSourceLayer<?>) layer;
+            tsLayer.getDisplaySettings().loadFrom(attributes);
         }
         if (attributes.containsKey("dx") && attributes.containsKey("dy")) {
             layer.setOffset(Double.parseDouble(attributes.get("dx")), Double.parseDouble(attributes.get("dy")));
