Index: trunk/src/org/openstreetmap/josm/gui/util/AdvancedKeyPressDetector.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/util/AdvancedKeyPressDetector.java	(revision 7468)
+++ trunk/src/org/openstreetmap/josm/gui/util/AdvancedKeyPressDetector.java	(revision 7469)
@@ -1,4 +1,6 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.util;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.awt.AWTEvent;
@@ -13,4 +15,5 @@
 import java.util.Set;
 import java.util.TreeSet;
+
 import javax.swing.JFrame;
 import javax.swing.SwingUtilities;
@@ -19,5 +22,4 @@
 import org.openstreetmap.josm.Main;
 
-import static org.openstreetmap.josm.tools.I18n.tr;
 /**
  * Helper object that allows cross-platform detection of key press and realease events
@@ -38,31 +40,34 @@
 
     /**
-     * Adds an object that wants to receive key press and release events
+     * Adds an object that wants to receive key press and release events.
+     * @param l listener to add
      */
-    public void addKeyListener(KeyPressReleaseListener l) {
+    public synchronized void addKeyListener(KeyPressReleaseListener l) {
         keyListeners.add(l);
     }
 
     /**
-     * Adds an object that wants to receive key modifier changed events
+     * Adds an object that wants to receive key modifier changed events.
+     * @param l listener to add
      */
-    public void addModifierListener(ModifierListener l) {
+    public synchronized void addModifierListener(ModifierListener l) {
         modifierListeners.add(l);
     }
 
     /**
-     * Removes the listener
+     * Removes the listener.
+     * @param l listener to remove
      */
-    public void removeKeyListener(KeyPressReleaseListener l) {
+    public synchronized void removeKeyListener(KeyPressReleaseListener l) {
         keyListeners.remove(l);
     }
 
     /**
-     * Removes the key modifier listener
+     * Removes the key modifier listener.
+     * @param l listener to remove
      */
-    public void removeModifierListener(ModifierListener l) {
+    public synchronized void removeModifierListener(ModifierListener l) {
         modifierListeners.remove(l);
     }
-
 
     /**
@@ -80,6 +85,8 @@
                 timer.stop();
                 if (set.remove(releaseEvent.getKeyCode())) {
-                    for (KeyPressReleaseListener q: keyListeners) {
-                        q.doKeyReleased(releaseEvent);
+                    synchronized (this) {
+                        for (KeyPressReleaseListener q: keyListeners) {
+                            q.doKeyReleased(releaseEvent);
+                        }
                     }
                 }
@@ -93,10 +100,13 @@
      */
     public void unregister() {
-        timer.stop(); set.clear();
-        if (!keyListeners.isEmpty()) {
-            Main.warn(tr("Some of the key listeners forgot to remove themselves: {0}"), keyListeners.toString());
-        }
-        if (!modifierListeners.isEmpty()) {
-            Main.warn(tr("Some of the key modifier listeners forgot to remove themselves: {0}"), modifierListeners.toString());
+        timer.stop();
+        set.clear();
+        synchronized (this) {
+            if (!keyListeners.isEmpty()) {
+                Main.warn(tr("Some of the key listeners forgot to remove themselves: {0}"), keyListeners.toString());
+            }
+            if (!modifierListeners.isEmpty()) {
+                Main.warn(tr("Some of the key modifier listeners forgot to remove themselves: {0}"), modifierListeners.toString());
+            }
         }
         try {
@@ -112,6 +122,8 @@
                 timer.stop();
             } else if (set.add((e.getKeyCode()))) {
-                for (KeyPressReleaseListener q: keyListeners) {
-                    q.doKeyPressed(e);
+                synchronized (this) {
+                    for (KeyPressReleaseListener q: keyListeners) {
+                        q.doKeyPressed(e);
+                    }
                 }
             }
@@ -120,6 +132,8 @@
                 timer.stop();
                 if (set.remove(e.getKeyCode())) {
-                    for (KeyPressReleaseListener q: keyListeners) {
-                        q.doKeyReleased(e);
+                    synchronized (this) {
+                        for (KeyPressReleaseListener q: keyListeners) {
+                            q.doKeyReleased(e);
+                        }
                     }
                 }
@@ -142,6 +156,8 @@
         if (previousModifiers != modif) {
             previousModifiers = modif;
-            for (ModifierListener m: modifierListeners) {
-                m.modifiersChanged(modif);
+            synchronized (this) {
+                for (ModifierListener m: modifierListeners) {
+                    m.modifiersChanged(modif);
+                }
             }
         }
