Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/GetImageryOffsetAction.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/GetImageryOffsetAction.java	(revision 33308)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/GetImageryOffsetAction.java	(revision 33309)
@@ -6,4 +6,5 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
+import java.io.IOException;
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
@@ -20,7 +21,8 @@
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.projection.Projection;
-import org.openstreetmap.josm.gui.layer.ImageryLayer;
+import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
+import org.xml.sax.SAXException;
 
 /**
@@ -56,5 +58,5 @@
         Projection proj = Main.map.mapView.getProjection();
         LatLon center = proj.eastNorth2latlon(Main.map.mapView.getCenter());
-        ImageryLayer layer = ImageryOffsetTools.getTopImageryLayer();
+        AbstractTileSourceLayer layer = ImageryOffsetTools.getTopImageryLayer();
         String imagery = ImageryOffsetTools.getImageryID(layer);
         if (imagery == null)
@@ -74,5 +76,5 @@
         if (Main.map == null || Main.map.mapView == null || !Main.map.isVisible())
             state = false;
-        ImageryLayer layer = ImageryOffsetTools.getTopImageryLayer();
+        AbstractTileSourceLayer layer = ImageryOffsetTools.getTopImageryLayer();
         if (ImageryOffsetTools.getImageryID(layer) == null)
             state = false;
@@ -128,5 +130,5 @@
          * @param imagery Imagery ID for the layer.
          */
-        DownloadOffsetsTask(LatLon center, ImageryLayer layer, String imagery) {
+        DownloadOffsetsTask(LatLon center, AbstractTileSourceLayer layer, String imagery) {
             super(null, tr("Loading imagery offsets..."));
             try {
@@ -162,5 +164,5 @@
             try {
                 offsets = new IODBReader(inp).parse();
-            } catch (Exception e) {
+            } catch (IOException | SAXException e) {
                 throw new UploadException(tr("Error processing XML response: {0}", e.getMessage()));
             }
Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffset.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffset.java	(revision 33308)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffset.java	(revision 33309)
@@ -3,7 +3,11 @@
 
 import java.util.Map;
+import org.openstreetmap.josm.Main;
 
 import org.openstreetmap.josm.data.coor.CoordinateFormat;
+import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.imagery.OffsetBookmark;
+import org.openstreetmap.josm.data.projection.Projection;
 
 /**
Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetTools.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetTools.java	(revision 33308)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetTools.java	(revision 33309)
@@ -10,7 +10,8 @@
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.imagery.OffsetBookmark;
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.layer.ImageryLayer;
+import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
 
 /**
@@ -34,9 +35,9 @@
      * @return the layer, or null if it hasn't been found.
      */
-    public static ImageryLayer getTopImageryLayer() {
+    public static AbstractTileSourceLayer getTopImageryLayer() {
         if (Main.map == null || Main.map.mapView == null)
             return null;
-        List<ImageryLayer> layers = Main.getLayerManager().getLayersOfType(ImageryLayer.class);
-        for (ImageryLayer layer : layers) {
+        List<AbstractTileSourceLayer> layers = Main.getLayerManager().getLayersOfType(AbstractTileSourceLayer.class);
+        for (AbstractTileSourceLayer layer : layers) {
             String url = layer.getInfo().getUrl();
             if (layer.isVisible() && url != null && !url.contains("gps-")) {
@@ -64,8 +65,9 @@
      * @see #applyLayerOffset
      */
-    public static LatLon getLayerOffset(ImageryLayer layer, LatLon center) {
+    public static LatLon getLayerOffset(AbstractTileSourceLayer layer, LatLon center) {
         Projection proj = Main.getProjection();
         EastNorth offsetCenter = Main.map.mapView.getCenter();
-        EastNorth centerOffset = offsetCenter.add(-layer.getDx(), -layer.getDy());
+        EastNorth centerOffset = offsetCenter.add(-layer.getDisplaySettings().getDx(),
+                -layer.getDisplaySettings().getDy());
         LatLon offsetLL = proj.eastNorth2latlon(centerOffset);
         return offsetLL;
@@ -77,7 +79,7 @@
      * @see #getLayerOffset
      */
-    public static void applyLayerOffset(ImageryLayer layer, ImageryOffset offset) {
-        double[] dxy = calculateOffset(offset);
-        layer.setOffset(dxy[0], dxy[1]);
+    public static void applyLayerOffset(AbstractTileSourceLayer layer, ImageryOffset offset) {
+        OffsetBookmark bookmark = calculateOffset(offset);
+        layer.getDisplaySettings().setOffsetBookmark(bookmark);
     }
 
@@ -87,9 +89,12 @@
      * @see #applyLayerOffset
      */
-    public static double[] calculateOffset(ImageryOffset offset) {
+    public static OffsetBookmark calculateOffset(ImageryOffset offset) {
         Projection proj = Main.getProjection();
         EastNorth center = proj.latlon2eastNorth(offset.getPosition());
         EastNorth offsetPos = proj.latlon2eastNorth(offset.getImageryPos());
-        return new double[] {center.getX() - offsetPos.getX(), center.getY() - offsetPos.getY()};
+        EastNorth offsetXY = new EastNorth(center.getX() - offsetPos.getX(), center.getY() - offsetPos.getY());
+        OffsetBookmark b = new OffsetBookmark(proj.toCode(), offset.getImagery(), "Autogenerated",
+                offsetXY.getX(), offsetXY.getY(), offset.getPosition().lon(), offset.getPosition().lat());
+        return b;
     }
 
@@ -99,5 +104,5 @@
      * @return imagery id.
      */
-    public static String getImageryID(ImageryLayer layer) {
+    public static String getImageryID(AbstractTileSourceLayer layer) {
         return layer == null ? null :
             ImageryIdGenerator.getImageryID(layer.getInfo().getUrl(), layer.getInfo().getImageryType());
Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetWatcher.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetWatcher.java	(revision 33308)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetWatcher.java	(revision 33309)
@@ -14,7 +14,8 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.imagery.OffsetBookmark;
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.NavigatableComponent.ZoomChangeListener;
-import org.openstreetmap.josm.gui.layer.ImageryLayer;
+import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
@@ -24,4 +25,5 @@
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
+import org.openstreetmap.josm.gui.layer.imagery.TileSourceDisplaySettings;
 import org.openstreetmap.josm.tools.Destroyable;
 
@@ -113,9 +115,10 @@
             return;
         }
-        ImageryLayer layer = ImageryOffsetTools.getTopImageryLayer();
+        AbstractTileSourceLayer layer = ImageryOffsetTools.getTopImageryLayer();
         if (layer == null) {
             setOffsetGood(true);
             return;
         }
+        TileSourceDisplaySettings displaySettings = layer.getDisplaySettings();
         LatLon center = ImageryOffsetTools.getMapCenter();
         Integer hash = layer.hashCode();
@@ -124,6 +127,6 @@
             // create entry for this layer and mark as needing alignment
             data = new ImageryLayerData();
-            data.lastDx = layer.getDx();
-            data.lastDy = layer.getDy();
+            data.lastDx = displaySettings.getDx();
+            data.lastDy = displaySettings.getDy();
             boolean r = false;
             if (Math.abs(data.lastDx) + Math.abs(data.lastDy) > THRESHOLD) {
@@ -135,8 +138,8 @@
         } else {
             // now, we have a returning layer.
-            if (Math.abs(data.lastDx - layer.getDx()) + Math.abs(data.lastDy - layer.getDy()) > THRESHOLD) {
+            if (Math.abs(data.lastDx - displaySettings.getDx()) + Math.abs(data.lastDy - displaySettings.getDy()) > THRESHOLD) {
                 // offset has changed, record the current position
-                data.lastDx = layer.getDx();
-                data.lastDy = layer.getDy();
+                data.lastDx = displaySettings.getDx();
+                data.lastDy = displaySettings.getDy();
                 data.lastChecked = center;
                 storeLayerOffset(layer);
@@ -154,6 +157,7 @@
      */
     public void markGood() {
-        ImageryLayer layer = ImageryOffsetTools.getTopImageryLayer();
+        AbstractTileSourceLayer layer = ImageryOffsetTools.getTopImageryLayer();
         if (layer != null) {
+            TileSourceDisplaySettings displaySettings = layer.getDisplaySettings();
             LatLon center = ImageryOffsetTools.getMapCenter();
             Integer hash = layer.hashCode();
@@ -162,11 +166,11 @@
                 // create entry for this layer and mark as good
                 data = new ImageryLayerData();
-                data.lastDx = layer.getDx();
-                data.lastDy = layer.getDy();
+                data.lastDx = displaySettings.getDx();
+                data.lastDy = displaySettings.getDy();
                 data.lastChecked = center;
                 layers.put(hash, data);
             } else {
-                data.lastDx = layer.getDx();
-                data.lastDy = layer.getDy();
+                data.lastDx = displaySettings.getDx();
+                data.lastDy = displaySettings.getDy();
                 data.lastChecked = center;
             }
@@ -199,6 +203,6 @@
     public void layerAdded(LayerAddEvent e) {
         Layer newLayer = e.getAddedLayer();
-        if (newLayer instanceof ImageryLayer)
-            loadLayerOffset((ImageryLayer) newLayer);
+        if (newLayer instanceof AbstractTileSourceLayer)
+            loadLayerOffset((AbstractTileSourceLayer) newLayer);
         checkOffset();
     }
@@ -218,5 +222,5 @@
      * projections: nobody uses them anyway.
      */
-    private void storeLayerOffset(ImageryLayer layer) {
+    private void storeLayerOffset(AbstractTileSourceLayer layer) {
         String id = ImageryOffsetTools.getImageryID(layer);
         if (!Main.pref.getBoolean("iodb.remember.offsets", true) || id == null)
@@ -229,5 +233,6 @@
         }
         LatLon center = ImageryOffsetTools.getMapCenter();
-        offsets.add(id + ":" + center.lat() + ":" + center.lon() + ":" + layer.getDx() + ":" + layer.getDy());
+        offsets.add(id + ":" + center.lat() + ":" + center.lon() + ":" +
+                layer.getDisplaySettings().getDx() + ":" + layer.getDisplaySettings().getDy());
         Main.pref.putCollection("iodb.stored.offsets", offsets);
     }
@@ -236,5 +241,5 @@
      * Loads the current imagery layer offset from preferences.
      */
-    private void loadLayerOffset(ImageryLayer layer) {
+    private void loadLayerOffset(AbstractTileSourceLayer layer) {
         String id = ImageryOffsetTools.getImageryID(layer);
         if (!Main.pref.getBoolean("iodb.remember.offsets", true) || id == null)
@@ -249,5 +254,5 @@
                         dparts[i] = Double.parseDouble(parts[i+1]);
                     }
-                } catch (Exception e) {
+                } catch (NumberFormatException e) {
                     continue;
                 }
@@ -255,5 +260,7 @@
                 if (lastPos.greatCircleDistance(ImageryOffsetTools.getMapCenter()) < Math.max(maxDistance, 3.0) * 1000) {
                     // apply offset
-                    layer.setOffset(dparts[2], dparts[3]);
+                    OffsetBookmark bookmark = new OffsetBookmark(Main.getProjection().toCode(),
+                            layer.getName(), "Restored", dparts[2], dparts[3]);
+                    layer.getDisplaySettings().setOffsetBookmark(bookmark);
                     return;
                 }
Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialog.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialog.java	(revision 33308)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialog.java	(revision 33309)
@@ -40,5 +40,5 @@
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.NavigatableComponent.ZoomChangeListener;
-import org.openstreetmap.josm.gui.layer.ImageryLayer;
+import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
 import org.openstreetmap.josm.gui.layer.MapViewPaintable;
 import org.openstreetmap.josm.tools.HttpClient;
@@ -270,5 +270,5 @@
     public void applyOffset() {
         if (selectedOffset instanceof ImageryOffset) {
-            ImageryLayer layer = ImageryOffsetTools.getTopImageryLayer();
+            AbstractTileSourceLayer layer = ImageryOffsetTools.getTopImageryLayer();
             ImageryOffsetTools.applyLayerOffset(layer, (ImageryOffset) selectedOffset);
             ImageryOffsetWatcher.getInstance().markGood();
Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialogButton.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialogButton.java	(revision 33308)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialogButton.java	(revision 33309)
@@ -28,5 +28,5 @@
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.projection.Projection;
-import org.openstreetmap.josm.gui.layer.ImageryLayer;
+import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -127,6 +127,7 @@
      */
     private double[] getLengthAndDirection(ImageryOffset offset) {
-        ImageryLayer layer = ImageryOffsetTools.getTopImageryLayer();
-        double[] dxy = layer == null ? new double[] {0.0, 0.0} : new double[] {layer.getDx(), layer.getDy()};
+        AbstractTileSourceLayer layer = ImageryOffsetTools.getTopImageryLayer();
+        double[] dxy = layer == null ? new double[] {0.0, 0.0} :
+                new double[] {layer.getDisplaySettings().getDx(), layer.getDisplaySettings().getDy()};
         return getLengthAndDirection(offset, dxy[0], dxy[1]);
     }
Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/StoreImageryOffsetAction.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/StoreImageryOffsetAction.java	(revision 33308)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/StoreImageryOffsetAction.java	(revision 33309)
@@ -20,5 +20,5 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.JosmUserIdentityManager;
-import org.openstreetmap.josm.gui.layer.ImageryLayer;
+import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
 
 /**
@@ -52,5 +52,5 @@
             return;
 
-        ImageryLayer layer = ImageryOffsetTools.getTopImageryLayer();
+        AbstractTileSourceLayer layer = ImageryOffsetTools.getTopImageryLayer();
         if (layer == null)
             return;
@@ -91,5 +91,5 @@
         if (calibration == null) {
             // register imagery offset
-            if (Math.abs(layer.getDx()) < 1e-8 && Math.abs(layer.getDy()) < 1e-8) {
+            if (Math.abs(layer.getDisplaySettings().getDx()) < 1e-8 && Math.abs(layer.getDisplaySettings().getDy()) < 1e-8) {
                 if (JOptionPane.showConfirmDialog(Main.parent,
                         tr("The topmost imagery layer has no offset. Are you sure you want to upload this?"),
