Index: trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- trunk/src/org/openstreetmap/josm/Main.java	(revision 13315)
+++ trunk/src/org/openstreetmap/josm/Main.java	(revision 13316)
@@ -9,5 +9,4 @@
 import java.lang.ref.WeakReference;
 import java.net.URL;
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -20,4 +19,5 @@
 import java.util.Set;
 import java.util.concurrent.Callable;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
@@ -410,20 +410,18 @@
      * created dataset as projection change listener.
      */
-    private static final List<WeakReference<ProjectionChangeListener>> listeners = new ArrayList<>();
+    private static final List<WeakReference<ProjectionChangeListener>> listeners = new CopyOnWriteArrayList<>();
 
     private static void fireProjectionChanged(Projection oldValue, Projection newValue, Bounds oldBounds) {
         if ((newValue == null ^ oldValue == null)
                 || (newValue != null && oldValue != null && !Objects.equals(newValue.toCode(), oldValue.toCode()))) {
-            synchronized (Main.class) {
-                Iterator<WeakReference<ProjectionChangeListener>> it = listeners.iterator();
-                while (it.hasNext()) {
-                    WeakReference<ProjectionChangeListener> wr = it.next();
-                    ProjectionChangeListener listener = wr.get();
-                    if (listener == null) {
-                        it.remove();
-                        continue;
-                    }
-                    listener.projectionChanged(oldValue, newValue);
+            Iterator<WeakReference<ProjectionChangeListener>> it = listeners.iterator();
+            while (it.hasNext()) {
+                WeakReference<ProjectionChangeListener> wr = it.next();
+                ProjectionChangeListener listener = wr.get();
+                if (listener == null) {
+                    it.remove();
+                    continue;
                 }
+                listener.projectionChanged(oldValue, newValue);
             }
             if (newValue != null && oldBounds != null && main != null) {
