Index: trunk/src/org/openstreetmap/josm/gui/util/AdvancedKeyPressDetector.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/util/AdvancedKeyPressDetector.java	(revision 8488)
+++ trunk/src/org/openstreetmap/josm/gui/util/AdvancedKeyPressDetector.java	(revision 8489)
@@ -12,8 +12,8 @@
 import java.awt.event.ActionListener;
 import java.awt.event.KeyEvent;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 import javax.swing.JFrame;
@@ -36,6 +36,6 @@
     private Timer timer;
 
-    private final List<KeyPressReleaseListener> keyListeners = new ArrayList<>();
-    private final List<ModifierListener> modifierListeners = new ArrayList<>();
+    private final List<KeyPressReleaseListener> keyListeners = new CopyOnWriteArrayList<>();
+    private final List<ModifierListener> modifierListeners = new CopyOnWriteArrayList<>();
     private int previousModifiers;
 
@@ -46,5 +46,5 @@
      * @param l listener to add
      */
-    public synchronized void addKeyListener(KeyPressReleaseListener l) {
+    public void addKeyListener(KeyPressReleaseListener l) {
         keyListeners.add(l);
     }
@@ -54,5 +54,5 @@
      * @param l listener to add
      */
-    public synchronized void addModifierListener(ModifierListener l) {
+    public void addModifierListener(ModifierListener l) {
         modifierListeners.add(l);
     }
@@ -62,5 +62,5 @@
      * @param l listener to remove
      */
-    public synchronized void removeKeyListener(KeyPressReleaseListener l) {
+    public void removeKeyListener(KeyPressReleaseListener l) {
         keyListeners.remove(l);
     }
@@ -70,5 +70,5 @@
      * @param l listener to remove
      */
-    public synchronized void removeModifierListener(ModifierListener l) {
+    public void removeModifierListener(ModifierListener l) {
         modifierListeners.remove(l);
     }
@@ -88,9 +88,7 @@
                 timer.stop();
                 if (set.remove(releaseEvent.getKeyCode()) && enabled) {
-                    synchronized (AdvancedKeyPressDetector.this) {
-                        if (isFocusInMainWindow()) {
-                            for (KeyPressReleaseListener q: keyListeners) {
-                                q.doKeyReleased(releaseEvent);
-                            }
+                    if (isFocusInMainWindow()) {
+                        for (KeyPressReleaseListener q: keyListeners) {
+                            q.doKeyReleased(releaseEvent);
                         }
                     }
@@ -107,11 +105,9 @@
         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());
-            }
+        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 {
@@ -130,12 +126,10 @@
                 timer.stop();
             } else if (set.add(e.getKeyCode()) && enabled) {
-                synchronized (this) {
-                    if (isFocusInMainWindow()) {
-                        for (KeyPressReleaseListener q: keyListeners) {
-                            if (Main.isDebugEnabled()) {
-                                Main.debug(q+" => doKeyPressed("+e+")");
-                            }
-                            q.doKeyPressed(e);
+                if (isFocusInMainWindow()) {
+                    for (KeyPressReleaseListener q: keyListeners) {
+                        if (Main.isDebugEnabled()) {
+                            Main.debug(q+" => doKeyPressed("+e+")");
                         }
+                        q.doKeyPressed(e);
                     }
                 }
@@ -145,12 +139,10 @@
                 timer.stop();
                 if (set.remove(e.getKeyCode()) && enabled) {
-                    synchronized (this) {
-                        if (isFocusInMainWindow()) {
-                            for (KeyPressReleaseListener q: keyListeners) {
-                                if (Main.isDebugEnabled()) {
-                                    Main.debug(q+" => doKeyReleased("+e+")");
-                                }
-                                q.doKeyReleased(e);
+                    if (isFocusInMainWindow()) {
+                        for (KeyPressReleaseListener q: keyListeners) {
+                            if (Main.isDebugEnabled()) {
+                                Main.debug(q+" => doKeyReleased("+e+")");
                             }
+                            q.doKeyReleased(e);
                         }
                     }
@@ -174,8 +166,6 @@
         if (previousModifiers != modif) {
             previousModifiers = modif;
-            synchronized (this) {
-                for (ModifierListener m: modifierListeners) {
-                    m.modifiersChanged(modif);
-                }
+            for (ModifierListener m: modifierListeners) {
+                m.modifiersChanged(modif);
             }
         }
