Index: /trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 14203)
+++ /trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 14204)
@@ -10,4 +10,5 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmDataManager;
+import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
@@ -291,24 +292,30 @@
         if (commands.isEmpty())
             return;
-        DataSet ds = OsmDataManager.getInstance().getEditDataSet();
-        if (ds != null) {
-            ds.beginUpdate();
-        }
-        try {
-            for (int i = 1; i <= num; ++i) {
-                final Command c = commands.removeLast();
-                c.undoCommand();
-                redoCommands.addFirst(c);
-                fireEvent(new CommandUndoneEvent(this, c));
-                if (commands.isEmpty()) {
-                    break;
+        GuiHelper.runInEDTAndWait(new Runnable() {
+            @Override
+            public void run() {
+                DataSet ds = OsmDataManager.getInstance().getEditDataSet();
+                if (ds != null) {
+                    ds.beginUpdate();
                 }
+                try {
+                    for (int i = 1; i <= num; ++i) {
+                        final Command c = commands.removeLast();
+                        c.undoCommand();
+                        redoCommands.addFirst(c);
+                        fireEvent(new CommandUndoneEvent(UndoRedoHandler.this, c));
+                        if (commands.isEmpty()) {
+                            break;
+                        }
+                    }
+                } finally {
+                    if (ds != null) {
+                        ds.endUpdate();
+                    }
+                }
+                fireCommandsChanged();
             }
-        } finally {
-            if (ds != null) {
-                ds.endUpdate();
-            }
-        }
-        fireCommandsChanged();
+
+        });
     }
 
@@ -324,5 +331,5 @@
      * @param num The number of commands to redo
      */
-    public void redo(int num) {
+    public synchronized void redo(int num) {
         if (redoCommands.isEmpty())
             return;
@@ -367,5 +374,5 @@
      * @since 12718
      */
-    public void clean(DataSet dataSet) {
+    public synchronized void clean(DataSet dataSet) {
         if (dataSet == null)
             return;
