Index: applications/editors/josm/plugins/imageryadjust/src/imageryadjust/ImageryAdjustMapMode.java
===================================================================
--- applications/editors/josm/plugins/imageryadjust/src/imageryadjust/ImageryAdjustMapMode.java	(revision 27852)
+++ applications/editors/josm/plugins/imageryadjust/src/imageryadjust/ImageryAdjustMapMode.java	(revision 29261)
@@ -21,7 +21,8 @@
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
-
-
-public class ImageryAdjustMapMode extends MapMode implements MouseListener, MouseMotionListener, AWTEventListener, MapFrame.MapModeChangeListener{
+import utils.TimedKeyReleaseListener;
+
+
+public class ImageryAdjustMapMode extends MapMode implements MouseListener, MouseMotionListener, MapFrame.MapModeChangeListener{
     boolean mouseDown;
     EastNorth prevEastNorth;
@@ -29,7 +30,4 @@
     private MapMode oldMapMode;
 
-    private final TreeSet<Integer> set = new TreeSet<Integer>();
-    private Timer timer;
-    private KeyEvent releaseEvent;
     
     public ImageryAdjustMapMode(MapFrame mapFrame) {
@@ -58,5 +56,6 @@
     
     
-    
+    TimedKeyReleaseListener listener;
+            
     @Override public void enterMode() {
         super.enterMode();
@@ -76,24 +75,15 @@
             adjustingLayer.setVisible(true);
         }
-       Main.map.mapView.addMouseListener(this);
+        Main.map.mapView.addMouseListener(this);
         Main.map.mapView.addMouseMotionListener(this);
-        timer = new Timer(0, new ActionListener() {
-            @Override
-            public void actionPerformed(ActionEvent ae) {
-                 timer.stop();
-                 if (set.remove(releaseEvent.getKeyCode())) {
-                  doKeyReleaseEvent(releaseEvent);
-                 }
+        listener = new TimedKeyReleaseListener() {
+                @Override
+                protected void doKeyReleaseEvent(KeyEvent evt) {
+                    if (releaseEvent.getKeyCode() == getShortcut().getKeyStroke().getKeyCode()) {
+                    if (oldMapMode!=null && !(oldMapMode instanceof ImageryAdjustMapMode))
+                    Main.map.selectMapMode(oldMapMode);
+                }
             }
-
-        });
-        
-        try {
-            Toolkit.getDefaultToolkit().addAWTEventListener(this,
-                    AWTEvent.KEY_EVENT_MASK);
-        } catch (SecurityException ex) {
-        }
-        
-        
+        };
     }
 
@@ -103,8 +93,5 @@
         Main.map.mapView.removeMouseMotionListener(this);
         adjustingLayer = null;
-        try {
-            Toolkit.getDefaultToolkit().removeAWTEventListener(this);
-        } catch (SecurityException ex) {
-        }
+        listener.stop();
     }
 
@@ -137,14 +124,4 @@
     }
     
-    private void doKeyEvent(KeyEvent keyEvent) {
-    }
-
-    private void doKeyReleaseEvent(KeyEvent releaseEvent) {
-        if (releaseEvent.getKeyCode() == getShortcut().getKeyStroke().getKeyCode()) {
-            if (oldMapMode!=null && !(oldMapMode instanceof ImageryAdjustMapMode))
-            Main.map.selectMapMode(oldMapMode);
-        }
-    }
-
     @Override public boolean layerIsSupported(Layer l) {
         //return hasImageryLayersToAdjust();
@@ -153,32 +130,7 @@
 
     @Override
-    public void eventDispatched(AWTEvent event) {
-        if (event instanceof KeyEvent) {
-        KeyEvent e=(KeyEvent) event;
-        
-        if (event.getID() == KeyEvent.KEY_PRESSED) {
-             if (timer.isRunning()) {
-                  timer.stop();
-                } else {
-                  if (set.add((e.getKeyCode()))) doKeyEvent((KeyEvent) event);
-                }
-        }
-        if (event.getID() == KeyEvent.KEY_RELEASED) {
-            if (timer.isRunning()) {
-              timer.stop();
-               if (set.remove(e.getKeyCode())) doKeyReleaseEvent(e);
-            } else {
-              releaseEvent = e;
-              timer.restart();
-            }
-        }
-        }
-    }
-
-    @Override
     public void mapModeChange(MapMode oldMapMode, MapMode newMapMode) {
         this.oldMapMode = oldMapMode;
     }
-
 
     /**
Index: applications/editors/josm/plugins/imageryadjust/src/utils/TimedKeyReleaseListener.java
===================================================================
--- applications/editors/josm/plugins/imageryadjust/src/utils/TimedKeyReleaseListener.java	(revision 29261)
+++ applications/editors/josm/plugins/imageryadjust/src/utils/TimedKeyReleaseListener.java	(revision 29261)
@@ -0,0 +1,72 @@
+// Thanks to http://www.arco.in-berlin.de/keyevent.html
+// (code simplified here)
+package utils;
+
+import java.awt.AWTEvent;
+import java.awt.Toolkit;
+import java.awt.event.AWTEventListener;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.util.TreeSet;
+import javax.swing.Timer;
+
+public class TimedKeyReleaseListener implements AWTEventListener {
+    private final TreeSet<Integer> set = new TreeSet<Integer>();
+    private Timer timer;
+    protected KeyEvent releaseEvent;
+    
+    public TimedKeyReleaseListener() {
+        timer = new Timer(0, new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent ae) {
+                 timer.stop();
+                 if (set.remove(releaseEvent.getKeyCode())) {
+                  doKeyReleaseEvent(releaseEvent);
+                 }
+            }
+        });
+        
+        try {
+            Toolkit.getDefaultToolkit().addAWTEventListener(this,
+                    AWTEvent.KEY_EVENT_MASK);
+        } catch (SecurityException ex) {
+        }
+    }
+    @Override
+    public void eventDispatched(AWTEvent event) {
+        if (!(event instanceof KeyEvent)) return;
+        KeyEvent e = (KeyEvent) event;
+        if (event.getID() == KeyEvent.KEY_PRESSED) {
+            if (timer.isRunning()) {
+                timer.stop();
+            } else {
+                if (set.add((e.getKeyCode()))) doKeyPressEvent((KeyEvent) event);
+            }
+        }
+        if (event.getID() == KeyEvent.KEY_RELEASED) {
+            if (timer.isRunning()) {
+                timer.stop();
+                if (set.remove(e.getKeyCode())) doKeyReleaseEvent(e);
+            } else {
+                releaseEvent = e;
+                timer.restart();
+            }
+        }
+    }
+    
+
+    public void stop() {
+        try {
+            Toolkit.getDefaultToolkit().removeAWTEventListener(this);
+        } catch (SecurityException ex) {
+        }
+    }
+
+    
+    protected void doKeyReleaseEvent(KeyEvent evt) {
+    }
+
+    protected void doKeyPressEvent(KeyEvent evt) {
+    }
+}
