Index: /trunk/src/org/openstreetmap/josm/data/imagery/OffsetBookmark.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/imagery/OffsetBookmark.java	(revision 12133)
+++ /trunk/src/org/openstreetmap/josm/data/imagery/OffsetBookmark.java	(revision 12134)
@@ -9,6 +9,8 @@
 import java.util.List;
 import java.util.ListIterator;
+import java.util.Map;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.Preferences;
 import org.openstreetmap.josm.data.Preferences.pref;
 import org.openstreetmap.josm.data.Preferences.writeExplicitly;
@@ -262,3 +264,26 @@
         saveBookmarks();
     }
+
+    /**
+     * Converts the offset bookmark to a properties map.
+     *
+     * The map contains all the information to restore the offset bookmark.
+     * @return properties map of all data
+     * @since 12134
+     * @see #fromPropertiesMap(java.util.Map)
+     */
+    public Map<String, String> toPropertiesMap() {
+        return Preferences.serializeStruct(this, OffsetBookmark.class);
+    }
+
+    /**
+     * Creates an offset bookmark from a properties map.
+     * @param properties the properties map
+     * @return corresponding offset bookmark
+     * @since 12134
+     * @see #toPropertiesMap()
+     */
+    public static OffsetBookmark fromPropertiesMap(Map<String, String> properties) {
+        return Preferences.deserializeStruct(properties, OffsetBookmark.class);
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/layer/imagery/TileSourceDisplaySettings.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/imagery/TileSourceDisplaySettings.java	(revision 12133)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/imagery/TileSourceDisplaySettings.java	(revision 12134)
@@ -248,6 +248,8 @@
     /**
      * Stores the current settings object to the given hashmap.
+     * The offset data is not stored and needs to be handled separately.
      * @param data The map to store the settings to.
      * @see #loadFrom(Map)
+     * @see OffsetBookmark#toPropertiesMap()
      */
     public void storeTo(Map<String, String> data) {
@@ -255,12 +257,12 @@
         data.put(AUTO_ZOOM, Boolean.toString(autoZoom));
         data.put(SHOW_ERRORS, Boolean.toString(showErrors));
-        data.put("dx", String.valueOf(getDx()));
-        data.put("dy", String.valueOf(getDy()));
     }
 
     /**
      * Load the settings from the given data instance.
+     * The offset data is not loaded and needs to be handled separately.
      * @param data The data
      * @see #storeTo(Map)
+     * @see OffsetBookmark#fromPropertiesMap(java.util.Map)
      */
     public void loadFrom(Map<String, String> data) {
@@ -279,10 +281,4 @@
             if (doShowErrors != null) {
                 setShowErrors(Boolean.parseBoolean(doShowErrors));
-            }
-
-            String dx = data.get("dx");
-            String dy = data.get("dy");
-            if (dx != null && dy != null) {
-                setDisplacement(new EastNorth(Double.parseDouble(dx), Double.parseDouble(dy)));
             }
         } catch (JosmRuntimeException | IllegalArgumentException | IllegalStateException e) {
Index: /trunk/src/org/openstreetmap/josm/io/session/ImagerySessionExporter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/session/ImagerySessionExporter.java	(revision 12133)
+++ /trunk/src/org/openstreetmap/josm/io/session/ImagerySessionExporter.java	(revision 12134)
@@ -14,4 +14,5 @@
 import org.openstreetmap.josm.data.Preferences;
 import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryPreferenceEntry;
+import org.openstreetmap.josm.data.imagery.OffsetBookmark;
 import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
 import org.openstreetmap.josm.gui.layer.ImageryLayer;
@@ -82,13 +83,25 @@
         Map<String, String> data = new LinkedHashMap<>(Preferences.serializeStruct(e, ImageryPreferenceEntry.class));
         if (layer instanceof AbstractTileSourceLayer) {
-            AbstractTileSourceLayer<?> tsLayer = (AbstractTileSourceLayer<?>) layer;
-            tsLayer.getDisplaySettings().storeTo(data);
+            ((AbstractTileSourceLayer<?>) layer).getDisplaySettings().storeTo(data);
         }
-        for (Map.Entry<String, String> entry : data.entrySet()) {
-            Element attrElem = support.createElement(entry.getKey());
-            layerElem.appendChild(attrElem);
-            attrElem.appendChild(support.createTextNode(entry.getValue()));
+        addAttributes(layerElem, data, support);
+        if (layer instanceof AbstractTileSourceLayer) {
+            OffsetBookmark offset = ((AbstractTileSourceLayer<?>) layer).getDisplaySettings().getOffsetBookmark();
+            if (offset != null) {
+                Map<String, String> offsetProps = offset.toPropertiesMap();
+                Element offsetEl = support.createElement("offset");
+                layerElem.appendChild(offsetEl);
+                addAttributes(offsetEl, offsetProps, support);
+            }
         }
         return layerElem;
     }
+
+    private void addAttributes(Element element, Map<String, String> props, ExportSupport support) {
+        for (Map.Entry<String, String> entry : props.entrySet()) {
+            Element attrElem = support.createElement(entry.getKey());
+            element.appendChild(attrElem);
+            attrElem.appendChild(support.createTextNode(entry.getValue()));
+        }
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/io/session/ImagerySessionImporter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/session/ImagerySessionImporter.java	(revision 12133)
+++ /trunk/src/org/openstreetmap/josm/io/session/ImagerySessionImporter.java	(revision 12134)
@@ -11,4 +11,5 @@
 import org.openstreetmap.josm.data.imagery.ImageryInfo;
 import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryPreferenceEntry;
+import org.openstreetmap.josm.data.imagery.OffsetBookmark;
 import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
 import org.openstreetmap.josm.gui.layer.ImageryLayer;
@@ -36,23 +37,37 @@
             throw new IllegalDataException(tr("Version ''{0}'' of meta data for imagery layer is not supported. Expected: 0.1", version));
         }
+        Map<String, String> attributes = readProperties(elem);
+
+        ImageryPreferenceEntry prefEntry = Preferences.deserializeStruct(attributes, ImageryPreferenceEntry.class);
+        ImageryInfo info = new ImageryInfo(prefEntry);
+        ImageryLayer layer = ImageryLayer.create(info);
+        if (layer instanceof AbstractTileSourceLayer) {
+            AbstractTileSourceLayer<?> tsLayer = (AbstractTileSourceLayer<?>) layer;
+            tsLayer.getDisplaySettings().loadFrom(attributes);
+            NodeList nodes = elem.getChildNodes();
+            for (int i = 0; i < nodes.getLength(); ++i) {
+                Node node = nodes.item(i);
+                if (node.getNodeType() == Node.ELEMENT_NODE && "offset".equals(node.getLocalName())) {
+                    Map<String, String> offsetAttributes = readProperties((Element) node);
+                    OffsetBookmark offset = OffsetBookmark.fromPropertiesMap(offsetAttributes);
+                    tsLayer.getDisplaySettings().setOffsetBookmark(offset);
+                    break;
+                }
+            }
+        }
+        return layer;
+    }
+
+    private Map<String, String> readProperties(Element elem) {
         Map<String, String> attributes = new HashMap<>();
-
         NodeList nodes = elem.getChildNodes();
-
         for (int i = 0; i < nodes.getLength(); ++i) {
             Node node = nodes.item(i);
-            if (node.getNodeType() == Node.ELEMENT_NODE) {
+            if (node.getNodeType() == Node.ELEMENT_NODE && node.getChildNodes().getLength() <= 1) {
                 Element e = (Element) node;
                 attributes.put(e.getTagName(), e.getTextContent());
             }
         }
-        ImageryPreferenceEntry prefEntry = Preferences.deserializeStruct(attributes, ImageryPreferenceEntry.class);
-        ImageryInfo i = new ImageryInfo(prefEntry);
-        ImageryLayer layer = ImageryLayer.create(i);
-        if (layer instanceof AbstractTileSourceLayer) {
-            AbstractTileSourceLayer<?> tsLayer = (AbstractTileSourceLayer<?>) layer;
-            tsLayer.getDisplaySettings().loadFrom(attributes);
-        }
-        return layer;
+        return attributes;
     }
 }
