Index: trunk/src/org/openstreetmap/josm/io/session/ImagerySessionExporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/session/ImagerySessionExporter.java	(revision 12603)
+++ trunk/src/org/openstreetmap/josm/io/session/ImagerySessionExporter.java	(revision 12604)
@@ -85,10 +85,13 @@
         ImageryPreferenceEntry e = new ImageryPreferenceEntry(layer.getInfo());
         Map<String, String> data = new LinkedHashMap<>(Preferences.serializeStruct(e, ImageryPreferenceEntry.class));
-        if (layer instanceof AbstractTileSourceLayer) {
-            data.putAll(((AbstractTileSourceLayer<?>) layer).getDisplaySettings().toPropertiesMap());
-        }
+        Utils.instanceOfThen(layer, AbstractTileSourceLayer.class, tsLayer -> {
+            data.putAll(tsLayer.getDisplaySettings().toPropertiesMap());
+            if (!tsLayer.getDisplaySettings().isAutoZoom()) {
+                data.put("zoom-level", Integer.toString(tsLayer.getZoomLevel()));
+            }
+        });
         addAttributes(layerElem, data, support);
-        if (layer instanceof AbstractTileSourceLayer) {
-            OffsetBookmark offset = ((AbstractTileSourceLayer<?>) layer).getDisplaySettings().getOffsetBookmark();
+        Utils.instanceOfThen(layer, AbstractTileSourceLayer.class, tsLayer -> {
+            OffsetBookmark offset = tsLayer.getDisplaySettings().getOffsetBookmark();
             if (offset != null) {
                 Map<String, String> offsetProps = offset.toPropertiesMap();
@@ -97,5 +100,5 @@
                 addAttributes(offsetEl, offsetProps, support);
             }
-        }
+        });
         ImageryFilterSettings filters = layer.getFilterSettings();
         if (filters != null) {
Index: trunk/src/org/openstreetmap/josm/io/session/ImagerySessionImporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/session/ImagerySessionImporter.java	(revision 12603)
+++ trunk/src/org/openstreetmap/josm/io/session/ImagerySessionImporter.java	(revision 12604)
@@ -8,4 +8,5 @@
 import java.util.Map;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Preferences;
 import org.openstreetmap.josm.data.imagery.ImageryInfo;
@@ -44,7 +45,18 @@
         ImageryInfo info = new ImageryInfo(prefEntry);
         ImageryLayer layer = ImageryLayer.create(info);
-        if (layer instanceof AbstractTileSourceLayer) {
-            AbstractTileSourceLayer<?> tsLayer = (AbstractTileSourceLayer<?>) layer;
+        Utils.instanceOfThen(layer, AbstractTileSourceLayer.class, tsLayer -> {
             tsLayer.getDisplaySettings().applyFromPropertiesMap(attributes);
+            if (!tsLayer.getDisplaySettings().isAutoZoom()) {
+                String zoomStr = attributes.get("zoom-level");
+                if (zoomStr != null) {
+                        support.addPostLayersTask(() -> {
+                            try {
+                                tsLayer.setZoomLevel(Integer.parseInt(zoomStr));
+                            } catch (NumberFormatException e) {
+                                Main.warn(e);
+                            }
+                        });
+                }
+            }
             Element offsetEl = getFirstElementByTagName(elem, "offset");
             if (offsetEl != null) {
@@ -53,5 +65,5 @@
                 tsLayer.getDisplaySettings().setOffsetBookmark(offset);
             }
-        }
+        });
         Element filtersEl = getFirstElementByTagName(elem, "filters");
         if (filtersEl != null) {
Index: trunk/src/org/openstreetmap/josm/tools/Utils.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 12603)
+++ trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 12604)
@@ -51,4 +51,5 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Predicate;
@@ -675,5 +676,5 @@
                 return new Iterator<B>() {
 
-                    private Iterator<? extends A> it = c.iterator();
+                    private final Iterator<? extends A> it = c.iterator();
 
                     @Override
@@ -1702,7 +1703,26 @@
      * @param klass the class U
      * @return function converting an object to a singleton stream or null
+     * @since 12594
      */
     public static <T, U> Function<T, Stream<U>> castToStream(Class<U> klass) {
         return x -> klass.isInstance(x) ? Stream.of(klass.cast(x)) : null;
     }
+
+    /**
+     * Helper method to replace the "<code>instanceof</code>-check and cast" pattern.
+     * Checks if an object is instance of class T and performs an action if that
+     * is the case.
+     * Syntactic sugar to avoid typing the class name two times, when one time
+     * would suffice.
+     * @param <T> the type for the instanceof check and cast
+     * @param o the object to check and cast
+     * @param klass the class T
+     * @param consumer action to take when o is and instance of T
+     * @since 12604
+     */
+    public static <T> void instanceOfThen(Object o, Class<T> klass, Consumer<? super T> consumer) {
+        if (klass.isInstance(o)) {
+            consumer.accept((T) o);
+        }
+    }
 }
