Index: /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryAdjustAction.java
===================================================================
--- /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryAdjustAction.java	(revision 24671)
+++ /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryAdjustAction.java	(revision 24672)
@@ -38,5 +38,5 @@
     public ImageryAdjustAction(ImageryLayer layer) {
         super(tr("New offset"), "adjustimg",
-                tr("Adjust the position of the selected imagery layer"), Main.map,
+                tr("Adjust the position of this imagery layer"), Main.map,
                 cursor);
         this.layer = layer;
@@ -86,8 +86,9 @@
         double dx = layer.getDx()+eastNorth.east()-prevEastNorth.east();
         double dy = layer.getDy()+eastNorth.north()-prevEastNorth.north();
+        layer.setOffset(dx, dy);
         if (offsetDialog != null) {
-            offsetDialog.easting.setValue(dx);
-            offsetDialog.northing.setValue(dy);
+            offsetDialog.updateOffset();
         }
+        Main.map.repaint();
         prevEastNorth = eastNorth;
     }
@@ -108,7 +109,8 @@
 
     class ImageryOffsetDialog extends ExtendedDialog implements PropertyChangeListener {
-        public final JFormattedTextField easting = new JFormattedTextField(new DecimalFormat("0.0000E0"));
-        public final JFormattedTextField northing = new JFormattedTextField(new DecimalFormat("0.0000E0"));
+        public final JFormattedTextField easting = new JFormattedTextField(new DecimalFormat("0.00000E0"));
+        public final JFormattedTextField northing = new JFormattedTextField(new DecimalFormat("0.00000E0"));
         JTextField tBookmarkName = new JTextField();
+        private boolean ignoreListener;
         public ImageryOffsetDialog() {
             super(Main.parent,
@@ -116,5 +118,5 @@
                     new String[] { tr("OK"),tr("Cancel") },
                     false);
-            setButtonIcons(new String[] { "mapmode/adjustimg", "cancel" });
+            setButtonIcons(new String[] { "ok", "cancel" });
             contentInsets = new Insets(15, 15, 5, 15);
             JPanel pnl = new JPanel();
@@ -138,6 +140,14 @@
         @Override
         public void propertyChange(PropertyChangeEvent evt) {
+            if (ignoreListener) return;
             layer.setOffset(((Number)easting.getValue()).doubleValue(), ((Number)northing.getValue()).doubleValue());
             Main.map.repaint();
+        }
+
+        public void updateOffset() {
+            ignoreListener = true;
+            easting.setValue(layer.getDx());
+            northing.setValue(layer.getDy());
+            ignoreListener = false;
         }
 
@@ -156,4 +166,5 @@
                 OffsetBookmark.saveBookmarks();
             }
+            ImageryPlugin.instance.refreshOffsetMenu();
             Main.map.selectSelectTool(false);
         }
Index: /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryLayer.java
===================================================================
--- /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryLayer.java	(revision 24671)
+++ /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryLayer.java	(revision 24672)
@@ -4,4 +4,5 @@
 
 import java.awt.Component;
+import java.awt.Container;
 import java.awt.Toolkit;
 import java.awt.event.ActionEvent;
@@ -110,7 +111,16 @@
 
         @Override
-        public void actionPerformed(ActionEvent arg0) {
+        public void actionPerformed(ActionEvent ev) {
             setOffset(b.dx, b.dy);
             Main.map.repaint();
+            if (!(ev.getSource() instanceof Component)) return;
+            Component source = (Component)ev.getSource();
+            if (!(source.getParent() instanceof Container)) return;
+            Container m = source.getParent();
+            for (Component c : m.getComponents()) {
+                if (c instanceof JCheckBoxMenuItem && c != source) {
+                    ((JCheckBoxMenuItem)c).setSelected(false);
+                }
+            }
         }
     }
Index: /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryPlugin.java
===================================================================
--- /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryPlugin.java	(revision 24671)
+++ /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryPlugin.java	(revision 24672)
@@ -4,5 +4,7 @@
 import static org.openstreetmap.josm.tools.I18n.marktr;
 import static org.openstreetmap.josm.tools.I18n.tr;
-
+import static org.openstreetmap.josm.tools.I18n.trc;
+
+import java.awt.Component;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
@@ -10,4 +12,5 @@
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.util.List;
 
 import javax.swing.JMenu;
@@ -20,5 +23,8 @@
 import org.openstreetmap.josm.gui.MainMenu;
 import org.openstreetmap.josm.gui.MapFrame;
+import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.bbox.SlippyMapBBoxChooser;
+import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
 import org.openstreetmap.josm.plugins.Plugin;
@@ -32,8 +38,10 @@
 import org.openstreetmap.josm.plugins.imagery.wms.io.WMSLayerExporter;
 import org.openstreetmap.josm.plugins.imagery.wms.io.WMSLayerImporter;
-
-public class ImageryPlugin extends Plugin {
+import org.openstreetmap.josm.tools.ImageProvider;
+
+public class ImageryPlugin extends Plugin implements LayerChangeListener {
 
     JMenu imageryJMenu;
+    JMenu offsetJMenu = new JMenu(trc("layer","Offset"));
 
     public static ImageryPlugin instance;
@@ -209,4 +217,8 @@
         initRemoteControl();
         SlippyMapBBoxChooser.addTileSourceProvider(new TMSTileSourceProvider());
+
+        offsetJMenu.setIcon(ImageProvider.get("imagery_menu"));
+        refreshOffsetMenu();
+        MapView.addLayerChangeListener(this);
     }
 
@@ -232,4 +244,6 @@
         imageryJMenu.add(new JMenuItem(new Map_Rectifier_WMSmenuAction()));
 
+        imageryJMenu.addSeparator();
+        imageryJMenu.add(offsetJMenu);
         imageryJMenu.addSeparator();
         imageryJMenu.add(new JMenuItem(new
@@ -243,4 +257,32 @@
     }
 
+    public void refreshOffsetMenu() {
+        offsetJMenu.removeAll();
+        if (Main.map == null || Main.map.mapView == null) {
+            offsetJMenu.setEnabled(false);
+            return;
+        }
+        List<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class);
+        if (layers.isEmpty()) {
+            offsetJMenu.setEnabled(false);
+            return;
+        }
+        offsetJMenu.setEnabled(true);
+        if (layers.size() == 1) {
+            for (Component c : layers.get(0).getOffsetMenu()) {
+                offsetJMenu.add(c);
+            }
+            return;
+        }
+        for (ImageryLayer layer : layers) {
+            JMenu subMenu = new JMenu(layer.getName());
+            subMenu.setIcon(layer.getIcon());
+            for (Component c : layer.getOffsetMenu()) {
+                subMenu.add(c);
+            }
+            offsetJMenu.add(subMenu);
+        }
+    }
+
     private void setEnabledAll(boolean isEnabled) {
         for(int i=0; i < imageryJMenu.getItemCount(); i++) {
@@ -259,4 +301,5 @@
             setEnabledAll(false);
         }
+        refreshOffsetMenu();
     }
 
@@ -271,3 +314,21 @@
         return new File(Main.pref.getPluginsDirectory(), "imagery").getPath();
     }
+
+    @Override
+    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+    }
+
+    @Override
+    public void layerAdded(Layer newLayer) {
+        if (newLayer instanceof ImageryLayer) {
+            refreshOffsetMenu();
+        }
+    }
+
+    @Override
+    public void layerRemoved(Layer oldLayer) {
+        if (oldLayer instanceof ImageryLayer) {
+            refreshOffsetMenu();
+        }
+    }
 }
Index: /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryPreferenceEditor.java
===================================================================
--- /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryPreferenceEditor.java	(revision 24671)
+++ /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryPreferenceEditor.java	(revision 24672)
@@ -228,4 +228,5 @@
         plugin.info.save();
         plugin.refreshMenu();
+        plugin.refreshOffsetMenu();
         OffsetBookmark.saveBookmarks();
 
Index: /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/tms/TMSTileSourceProvider.java
===================================================================
--- /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/tms/TMSTileSourceProvider.java	(revision 24671)
+++ /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/tms/TMSTileSourceProvider.java	(revision 24672)
@@ -20,5 +20,5 @@
         // Urls that already exist in the slippymap chooser
         existingSlippyMapUrls.add("http://tile.openstreetmap.org/");
-        existingSlippyMapUrls.add("http://tah.openstreetmap.org/Tiles/");
+        existingSlippyMapUrls.add("http://tah.openstreetmap.org/Tiles/tile/");
         existingSlippyMapUrls.add("http://tile.opencyclemap.org/cycle/");
     }
