diff --git a/src/org/openstreetmap/josm/Main.java b/src/org/openstreetmap/josm/Main.java
index ed2f649..325aa72 100644
--- a/src/org/openstreetmap/josm/Main.java
+++ b/src/org/openstreetmap/josm/Main.java
@@ -101,6 +101,7 @@ import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
 import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
 import org.openstreetmap.josm.gui.progress.ProgressMonitorExecutor;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
+import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.util.RedirectInputMap;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
 import org.openstreetmap.josm.io.FileWatcher;
@@ -808,7 +809,7 @@ public abstract class Main {
      * @param bounds the bounds of the layer (target zoom area); can be null, then
      * the viewport isn't changed
      */
-    public final synchronized void addLayer(final Layer layer, ProjectionBounds bounds) {
+    public final void addLayer(final Layer layer, ProjectionBounds bounds) {
         addLayer(layer, bounds == null ? null : new ViewportData(bounds));
     }
 
@@ -820,14 +821,20 @@ public abstract class Main {
      * @param layer the layer
      * @param viewport the viewport to zoom to; can be null, then the viewport isn't changed
      */
-    public final synchronized void addLayer(final Layer layer, ViewportData viewport) {
+    public final void addLayer(Layer layer, final ViewportData viewport) {
         getLayerManager().addLayer(layer);
         if (viewport != null) {
             Main.map.mapView.scheduleZoomTo(viewport);
         }
     }
 
+    /**
+     * Creates the map frame. Call only in EDT Thread.
+     * @param firstLayer The first layer that was added.
+     * @param viewportData The initial viewport. Can be <code>null</code> to be automatically computed.
+     */
     public synchronized void createMapFrame(Layer firstLayer, ViewportData viewportData) {
+        GuiHelper.assertCallFromEdt();
         MapFrame mapFrame = new MapFrame(contentPanePrivate, viewportData);
         setMapFrame(mapFrame);
         if (firstLayer != null) {
diff --git a/test/unit/org/openstreetmap/josm/JOSMFixture.java b/test/unit/org/openstreetmap/josm/JOSMFixture.java
index e7bdfbf..f08ca13 100644
--- a/test/unit/org/openstreetmap/josm/JOSMFixture.java
+++ b/test/unit/org/openstreetmap/josm/JOSMFixture.java
@@ -14,6 +14,7 @@ import org.openstreetmap.josm.data.projection.Projections;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.preferences.ToolbarPreferences;
+import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.io.CertificateAmendment;
 import org.openstreetmap.josm.io.OsmApi;
 import org.openstreetmap.josm.tools.I18n;
@@ -115,18 +116,27 @@ public class JOSMFixture {
         }
 
         if (createGui) {
-            if (Main.toolbar == null) {
-                Main.toolbar = new ToolbarPreferences();
-            }
-            if (Main.main == null) {
-                new MainApplication().initialize();
-            }
-            if (Main.map == null) {
-                Main.main.createMapFrame(null, null);
-            } else {
-                for (Layer l: Main.getLayerManager().getLayers()) {
-                    Main.getLayerManager().removeLayer(l);
+            GuiHelper.runInEDTAndWaitWithException(new Runnable() {
+                @Override
+                public void run() {
+                    setupGUI();
                 }
+            });
+        }
+    }
+
+    private void setupGUI() {
+        if (Main.toolbar == null) {
+            Main.toolbar = new ToolbarPreferences();
+        }
+        if (Main.main == null) {
+            new MainApplication().initialize();
+        }
+        if (Main.map == null) {
+            Main.main.createMapFrame(null, null);
+        } else {
+            for (Layer l: Main.getLayerManager().getLayers()) {
+                Main.getLayerManager().removeLayer(l);
             }
         }
     }
