Index: /trunk/src/org/openstreetmap/josm/actions/UpdateDataAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/UpdateDataAction.java	(revision 1871)
+++ /trunk/src/org/openstreetmap/josm/actions/UpdateDataAction.java	(revision 1872)
@@ -16,4 +16,5 @@
 import org.openstreetmap.josm.data.osm.DataSource;
 import org.openstreetmap.josm.gui.OptionPaneUtil;
+import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -32,5 +33,5 @@
     /**
      * Refreshes the enabled state
-     * 
+     *
      */
     @Override
@@ -81,5 +82,5 @@
         }
 
-        new DownloadOsmTaskList().download(false, areas);
+        new DownloadOsmTaskList().download(false, areas, new PleaseWaitProgressMonitor());
     }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTaskList.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTaskList.java	(revision 1871)
+++ /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTaskList.java	(revision 1872)
@@ -24,5 +24,4 @@
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 
@@ -76,11 +75,16 @@
      * @param The Collection of Areas to download
      */
-    public void download(boolean newLayer, Collection<Area> areas) {
-        List<Rectangle2D> rects = new LinkedList<Rectangle2D>();
-        for(Area a : areas) {
-            rects.add(a.getBounds2D());
-        }
-
-        download(newLayer, rects, NullProgressMonitor.INSTANCE);
+    public void download(boolean newLayer, Collection<Area> areas, ProgressMonitor progressMonitor) {
+        progressMonitor.beginTask(tr("Updating data"));
+        try {
+            List<Rectangle2D> rects = new LinkedList<Rectangle2D>();
+            for(Area a : areas) {
+                rects.add(a.getBounds2D());
+            }
+
+            download(newLayer, rects, progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
+        } finally {
+            progressMonitor.finishTask();
+        }
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/progress/AbstractProgressMonitor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/progress/AbstractProgressMonitor.java	(revision 1871)
+++ /trunk/src/org/openstreetmap/josm/gui/progress/AbstractProgressMonitor.java	(revision 1872)
@@ -19,4 +19,6 @@
         String extraText;
         Boolean intermediate;
+
+        boolean finishRequested;
     }
 
@@ -86,19 +88,10 @@
 
             if (state == State.IN_SUBTASK) {
-                // Make sure the subtask didn't start yet (once task start it must be finished)
-                boolean broken = currentChild.state != State.INIT;
-                for (Request request:requests) {
-                    broken = broken | request.originator.state != State.INIT;
-                }
-                if (broken) {
-                    throw new ProgressException("Cannot call finishTask when there are unfinished tasks");
-                } else {
-                    state = State.IN_TASK;
-                }
-            }
-
-            checkState(State.IN_TASK);
-            state = State.FINISHED;
-            doFinishTask();
+                requestedState.finishRequested = true;
+            } else {
+                checkState(State.IN_TASK);
+                state = State.FINISHED;
+                doFinishTask();
+            }
         }
     }
@@ -282,21 +275,25 @@
 
     private void applyThisRequest(Request request) {
-        if (request.customText != null) {
-            this.customText = request.customText;
-        }
-
-        if (request.title != null) {
-            this.taskTitle = request.title;
-        }
-
-        if (request.intermediate != null) {
-            this.intermediateTask = request.intermediate;
-        }
-
-        if (request.extraText != null) {
-            this.extraText = request.extraText;
-        }
-
-        resetState();
+        if (request.finishRequested) {
+            finishTask();
+        } else {
+            if (request.customText != null) {
+                this.customText = request.customText;
+            }
+
+            if (request.title != null) {
+                this.taskTitle = request.title;
+            }
+
+            if (request.intermediate != null) {
+                this.intermediateTask = request.intermediate;
+            }
+
+            if (request.extraText != null) {
+                this.extraText = request.extraText;
+            }
+
+            resetState();
+        }
     }
 
