Index: trunk/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java	(revision 3721)
+++ trunk/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java	(revision 3722)
@@ -4,8 +4,12 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.AWTEvent;
 import java.awt.Cursor;
 import java.awt.GridBagLayout;
 import java.awt.Insets;
+import java.awt.Toolkit;
+import java.awt.event.AWTEventListener;
 import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
@@ -25,4 +29,5 @@
 import org.openstreetmap.josm.data.imagery.OffsetBookmark;
 import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.gui.JMultilineLabel;
 import org.openstreetmap.josm.gui.layer.ImageryLayer;
 import org.openstreetmap.josm.tools.GBC;
@@ -30,5 +35,5 @@
 
 
-public class ImageryAdjustAction extends MapMode implements MouseListener, MouseMotionListener{
+public class ImageryAdjustAction extends MapMode implements MouseListener, MouseMotionListener, AWTEventListener{
     static ImageryOffsetDialog offsetDialog;
     static Cursor cursor = ImageProvider.getCursor("normal", "move");
@@ -58,4 +63,8 @@
         oldDx = layer.getDx();
         oldDy = layer.getDy();
+        try {
+            Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.KEY_EVENT_MASK);
+        } catch (SecurityException ex) {
+        }
         offsetDialog = new ImageryOffsetDialog();
         offsetDialog.setVisible(true);
@@ -69,6 +78,34 @@
             offsetDialog = null;
         }
+        try {
+            Toolkit.getDefaultToolkit().removeAWTEventListener(this);
+        } catch (SecurityException ex) {
+        }
         Main.map.mapView.removeMouseListener(this);
         Main.map.mapView.removeMouseMotionListener(this);
+    }
+
+    @Override
+    public void eventDispatched(AWTEvent event) {
+        if (!(event instanceof KeyEvent)) return;
+        if (event.getID() != KeyEvent.KEY_PRESSED) return;
+        if (layer == null) return;
+        KeyEvent kev = (KeyEvent)event;
+        double dx = 0, dy = 0;
+        switch (kev.getKeyCode()) {
+        case KeyEvent.VK_UP : dy = +1; break;
+        case KeyEvent.VK_DOWN : dy = -1; break;
+        case KeyEvent.VK_LEFT : dx = -1; break;
+        case KeyEvent.VK_RIGHT : dx = +1; break;
+        }
+        if (dx != 0 || dy != 0) {
+            double ppd = layer.getPPD();
+            layer.displace(dx / ppd, dy / ppd);
+            if (offsetDialog != null) {
+                offsetDialog.updateOffset();
+            }
+            kev.consume();
+            Main.map.repaint();
+        }
     }
 
@@ -111,5 +148,4 @@
         super.actionPerformed(e);
     }
-
 
     class ImageryOffsetDialog extends ExtendedDialog implements PropertyChangeListener {
@@ -124,11 +160,13 @@
                     false);
             setButtonIcons(new String[] { "ok", "cancel" });
-            contentInsets = new Insets(15, 15, 5, 15);
-            JPanel pnl = new JPanel();
-            pnl.setLayout(new GridBagLayout());
+            contentInsets = new Insets(10, 15, 5, 15);
+            JPanel pnl = new JPanel(new GridBagLayout());
+            pnl.add(new JMultilineLabel(tr("Use arrow keys or drag the imagery layer with mouse to adjust the imagery offset.\n" +
+                    "You can also enter east and north offset in the {0} coordinates.\n" +
+                    "If you want to save the offset as bookmark, enter the bookmark name below",Main.proj.toString())), GBC.eop());
             pnl.add(new JLabel(tr("Easting") + ": "),GBC.std());
             pnl.add(easting,GBC.std().fill(GBC.HORIZONTAL).insets(0, 0, 5, 0));
             pnl.add(new JLabel(tr("Northing") + ": "),GBC.std());
-            pnl.add(northing,GBC.eol());
+            pnl.add(northing,GBC.eol().fill(GBC.HORIZONTAL));
             pnl.add(new JLabel(tr("Bookmark name: ")),GBC.eol().insets(0,5,0,0));
             pnl.add(tBookmarkName,GBC.eol().fill(GBC.HORIZONTAL));
