Index: src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java
===================================================================
--- src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java	(revision 1458)
+++ src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java	(working copy)
@@ -4,33 +4,39 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.io.IOException;
+import java.util.concurrent.Future;
 
 import javax.swing.JCheckBox;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.DownloadAction;
+import org.openstreetmap.josm.data.gpx.GpxData;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.download.DownloadDialog.DownloadTask;
+import org.openstreetmap.josm.gui.layer.GpxLayer;
 import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.GpxLayer;
-import org.openstreetmap.josm.data.gpx.GpxData;
 import org.openstreetmap.josm.io.BoundingBoxDownloader;
 import org.xml.sax.SAXException;
 
 public class DownloadGpsTask implements DownloadTask {
+    private Future<Task> task = null;
 
     private static class Task extends PleaseWaitRunnable {
         private BoundingBoxDownloader reader;
         private GpxData rawData;
         private final boolean newLayer;
+        private String msg = "";
 
-        public Task(boolean newLayer, BoundingBoxDownloader reader) {
+        public Task(boolean newLayer, BoundingBoxDownloader reader, boolean silent, String msg) {
             super(tr("Downloading GPS data"));
+            this.msg = msg;
             this.reader = reader;
             this.newLayer = newLayer;
+            this.silent = silent;
         }
 
         @Override public void realRun() throws IOException, SAXException {
+            Main.pleaseWaitDlg.setCustomText(msg);
             rawData = reader.parseRawGps();
         }
 
@@ -45,6 +51,8 @@
                 Main.main.addLayer(layer);
             else
                 x.mergeFrom(layer);
+
+            Main.pleaseWaitDlg.setCustomText("");
         }
 
         private Layer findMergeLayer() {
@@ -63,16 +71,28 @@
         @Override protected void cancel() {
             if (reader != null)
                 reader.cancel();
+            Main.pleaseWaitDlg.cancel.setEnabled(false);
         }
     }
 
     private JCheckBox checkBox = new JCheckBox(tr("Raw GPS data"));
 
-    public void download(DownloadAction action, double minlat, double minlon, double maxlat, double maxlon) {
-        Task task = new Task(action.dialog.newLayer.isSelected(), new BoundingBoxDownloader(minlat, minlon, maxlat, maxlon));
-        Main.worker.execute(task);
+    public void download(DownloadAction action, double minlat, double minlon,
+            double maxlat, double maxlon) {
+        download(action, minlat, minlon, maxlat, maxlon, false, "");
     }
 
+    public void download(DownloadAction action, double minlat, double minlon,
+            double maxlat, double maxlon, boolean silent, String message) {
+        Task t = new Task(action.dialog.newLayer.isSelected(),
+                new BoundingBoxDownloader(minlat, minlon, maxlat, maxlon),
+                silent,
+                message);
+        // We need submit instead of execute so we can wait for it to finish and get the error
+        // message if necessary. If no one calls getErrorMessage() it just behaves like execute.
+        task = Main.worker.submit(t, t);
+    }
+
     public JCheckBox getCheckBox() {
         return checkBox;
     }
@@ -84,4 +104,22 @@
     public void loadUrl(boolean a,java.lang.String b) {
         // FIXME this is not currently used
     }
+
+    /*
+     * (non-Javadoc)
+     * @see org.openstreetmap.josm.gui.download.DownloadDialog.DownloadTask#getErrorMessage()
+     */
+    public String getErrorMessage() {
+        if(task == null)
+            return "";
+
+        try {
+            Task t = task.get();
+            return t.errorMessage == null
+                ? ""
+                : t.errorMessage;
+        } catch (Exception e) {
+            return "";
+        }
+    }
 }
Index: src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java
===================================================================
--- src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java	(revision 1458)
+++ src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java	(working copy)
@@ -4,21 +4,23 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.io.IOException;
+import java.util.concurrent.Future;
 
 import javax.swing.JCheckBox;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.DownloadAction;
+import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.DataSource;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.download.DownloadDialog.DownloadTask;
+import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.io.BoundingBoxDownloader;
 import org.openstreetmap.josm.io.OsmServerLocationReader;
 import org.openstreetmap.josm.io.OsmServerReader;
-import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.data.coor.LatLon;
 import org.xml.sax.SAXException;
 
 
@@ -27,49 +29,61 @@
  * Run in the worker thread.
  */
 public class DownloadOsmTask implements DownloadTask {
-
     private static Bounds currentBounds;
+    private Future<Task> task = null;
 
     private static class Task extends PleaseWaitRunnable {
         private OsmServerReader reader;
         private DataSet dataSet;
         private boolean newLayer;
-
-        public Task(boolean newLayer, OsmServerReader reader) {
+        private int num = 1;
+        private String msg = "";
+        
+        public Task(boolean newLayer, OsmServerReader reader, boolean silent,
+                int numLayers, String msg) {
             super(tr("Downloading data"));
+            this.msg = msg;
             this.reader = reader;
             this.newLayer = newLayer;
+            this.silent = silent;
         }
 
         @Override public void realRun() throws IOException, SAXException {
+            Main.pleaseWaitDlg.setCustomText(msg);
             dataSet = reader.parseOsm();
         }
 
         @Override protected void finish() {
             if (dataSet == null)
-                return; // user cancelled download or error occoured
+                return; // user canceled download or error occurred
             if (dataSet.allPrimitives().isEmpty()) {
-                errorMessage = tr("No data imported.");
+                // If silent is set to true, we don't want to see information messages
+                if(!silent)
+                    errorMessage = tr("No data imported.");
                 // need to synthesize a download bounds lest the visual indication of downloaded
                 // area doesn't work
                 dataSet.dataSources.add(new DataSource(currentBounds, "OpenStreetMap server"));
             }
-
-            OsmDataLayer layer = new OsmDataLayer(dataSet, tr("Data Layer"), null);
+            
+            OsmDataLayer layer = new OsmDataLayer(dataSet, tr("Data Layer {0}", num), null);
             if (newLayer)
                 Main.main.addLayer(layer);
             else
                 Main.main.editLayer().mergeFrom(layer);
+            
+            Main.pleaseWaitDlg.setCustomText("");
         }
 
         @Override protected void cancel() {
             if (reader != null)
                 reader.cancel();
+            Main.pleaseWaitDlg.cancel.setEnabled(false);
         }
     }
     private JCheckBox checkBox = new JCheckBox(tr("OpenStreetMap data"), true);
 
-    public void download(DownloadAction action, double minlat, double minlon, double maxlat, double maxlon) {
+    public void download(DownloadAction action, double minlat, double minlon,
+            double maxlat, double maxlon, boolean silent, String message) {
         // Swap min and max if user has specified them the wrong way round
         // (easy to do if you are crossing 0, for example)
         // FIXME should perhaps be done in download dialog?
@@ -79,20 +93,40 @@
         if (minlon > maxlon) {
             double t = minlon; minlon = maxlon; maxlon = t;
         }
+        
+        boolean newLayer = action != null
+                                && (action.dialog == null || action.dialog.newLayer.isSelected());
 
-        Task task = new Task(action != null && (action.dialog == null || action.dialog.newLayer.isSelected()), new BoundingBoxDownloader(minlat, minlon, maxlat, maxlon));
+        Task t = new Task(newLayer,
+                new BoundingBoxDownloader(minlat, minlon, maxlat, maxlon),
+                silent,
+                getDataLayersCount(),
+                message);
         currentBounds = new Bounds(new LatLon(minlat, minlon), new LatLon(maxlat, maxlon));
-        Main.worker.execute(task);
+        // We need submit instead of execute so we can wait for it to finish and get the error 
+        // message if necessary. If no one calls getErrorMessage() it just behaves like execute.
+        task = Main.worker.submit(t, t);       
     }
+    
+    public void download(DownloadAction action, double minlat, double minlon,
+            double maxlat, double maxlon) {
+        download(action, minlat, minlon, maxlat, maxlon, false, "");
+    }
 
+    /**
+     * Loads a given URL from the OSM Server
+     * @param True if the data should be saved to a new layer
+     * @param The URL as String
+     */
     public void loadUrl(boolean new_layer, String url) {
-        Task task = new Task(new_layer, new OsmServerLocationReader(url));
-        Main.worker.execute(task);
+        Task t = new Task(new_layer,
+                new OsmServerLocationReader(url),
+                false,
+                getDataLayersCount(),
+                "");
+        task = Main.worker.submit(t, t);
     }
 
-
-
-
     public JCheckBox getCheckBox() {
         return checkBox;
     }
@@ -100,4 +134,36 @@
     public String getPreferencesSuffix() {
         return "osm";
     }
+    
+    /**
+     * Finds the number of data layers currently opened
+     * @return Number of data layers
+     */
+    private int getDataLayersCount() {
+        if(Main.map == null || Main.map.mapView == null)
+            return 0;
+        int num = 0;
+        for(Layer l : Main.map.mapView.getAllLayers())
+            if(l instanceof OsmDataLayer)
+                num++;
+        return num;
+    }
+    
+   /*
+    * (non-Javadoc)
+    * @see org.openstreetmap.josm.gui.download.DownloadDialog.DownloadTask#getErrorMessage()
+    */
+    public String getErrorMessage() {
+        if(task == null)
+            return "";        
+
+        try {
+            Task t = task.get();
+            return t.errorMessage == null
+                ? ""
+                : t.errorMessage;
+        } catch (Exception e) {
+            return "";
+        }
+    }
 }
Index: src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTaskList.java
===================================================================
--- src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTaskList.java	(revision 0)
+++ src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTaskList.java	(revision 0)
@@ -0,0 +1,92 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions.downloadtasks;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.geom.Area;
+import java.awt.geom.Rectangle2D;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.swing.JOptionPane;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.gui.download.DownloadDialog.DownloadTask;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+
+/**
+ * This class encapsulates the downloading of several bounding boxes that would otherwise be too
+ * large to download in one go. Error messages will be collected for all downloads and displayed
+ * as a list in the end.
+ * @author xeen
+ *
+ */
+public class DownloadOsmTaskList implements Runnable {
+    private List<DownloadTask> osmTasks = new LinkedList<DownloadTask>();
+
+    /**
+     * Downloads a list of areas from the OSM Server
+     * @param newLayer Set to true if all areas should be put into a single new layer
+     * @param The List of Rectangle2D to download
+     */
+    public void download(boolean newLayer, List<Rectangle2D> rects) {
+        if(newLayer) {
+            Layer l = new OsmDataLayer(new DataSet(), tr("Data Layer"), null);
+            Main.main.addLayer(l);
+            Main.map.mapView.setActiveLayer(l);
+        }
+
+        int i = 0;
+        for(Rectangle2D td : rects) {
+            i++;
+            DownloadTask dt = new DownloadOsmTask();
+            dt.download(null, td.getMinY(), td.getMinX(), td.getMaxY(), td.getMaxX(), true,
+                    tr("Download {0} of {1} ({2} left)", i, rects.size(), rects.size()-i));
+            osmTasks.add(dt);
+        }
+
+        // If we try to get the error message now the download task will never have been started
+        // and we'd be stuck in a classical dead lock. Instead attach this to the worker and once
+        // run() gets called all downloadTasks have finished and we can grab the error messages.
+        Main.worker.execute(this);
+    }
+
+    /**
+     * Downloads a list of areas from the OSM Server
+     * @param newLayer Set to true if all areas should be put into a single new layer
+     * @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);
+    }
+
+    /**
+     * Grabs and displays the error messages after all download threads have finished.
+     */
+    public void run() {
+        String errors = "";
+
+        for(DownloadTask dt : osmTasks) {
+            String err = dt.getErrorMessage();
+            if(err.equals(""))
+                continue;
+            errors += "* " + err + "\r\n";
+        }
+
+        osmTasks.clear();
+        if(errors.equals(""))
+            return;
+
+        JOptionPane.showMessageDialog(Main.parent,
+                tr("The following errors occured during mass download:") + "\r\n" + errors,
+                tr("Errors during Download"),
+                JOptionPane.ERROR_MESSAGE);
+    }
+}
Index: src/org/openstreetmap/josm/actions/UpdateDataAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/UpdateDataAction.java	(revision 1458)
+++ src/org/openstreetmap/josm/actions/UpdateDataAction.java	(working copy)
@@ -6,15 +6,13 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
 import java.awt.geom.Area;
-import java.awt.geom.Rectangle2D;
 import java.util.ArrayList;
 import java.util.List;
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
+import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTaskList;
 import org.openstreetmap.josm.data.osm.DataSource;
 import org.openstreetmap.josm.gui.ExtendedDialog;
-import org.openstreetmap.josm.gui.download.DownloadDialog.DownloadTask;
 import org.openstreetmap.josm.tools.Shortcut;
 
 public class UpdateDataAction extends JosmAction {
@@ -76,11 +74,7 @@
         if(result != 1)
             return;
 
-        DownloadTask osmTask = new DownloadOsmTask();
-        for(Area a : areas) {
-            Rectangle2D td = a.getBounds2D();
-            osmTask.download(null, td.getMinY(), td.getMinX(), td.getMaxY(), td.getMaxX());
-        }
+        new DownloadOsmTaskList().download(false, areas);
     }
 
 }
Index: src/org/openstreetmap/josm/gui/download/DownloadDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 1458)
+++ src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(working copy)
@@ -50,19 +50,47 @@
 
     public interface DownloadTask {
         /**
-         * Execute the download.
+         * Execute the download using the given bounding box
          */
-        void download(DownloadAction action, double minlat, double minlon, double maxlat, double maxlon);
+        void download(DownloadAction action, double minlat, double minlon,
+                double maxlat, double maxlon);
+
+        /**
+         * Execute the download using the given bounding box. Set silent to true if no error
+         * messages should be popped up. Message can be used to display an additional text below
+         * the default description.
+         */
+        void download(DownloadAction action, double minlat, double minlon,
+                double maxlat, double maxlon, boolean silent, String message);
+
+        /**
+         * Execute the download using the given URL
+         * @param newLayer
+         * @param url
+         */
         void loadUrl(boolean newLayer, String url);
+
         /**
          * @return The checkbox presented to the user
          */
         JCheckBox getCheckBox();
+
         /**
          * @return The name of the preferences suffix to use for storing the
          * selection state.
          */
         String getPreferencesSuffix();
+
+        /**
+         * Gets the error message of the task once it executed. If there is no error message, an empty
+         * string is returned.
+         *
+         * WARNING: Never call this in the same thread you requested the download() or it will cause a
+         * dead lock. See actions/downloadTasks/DownloadOsmTaskList.java for a proper implementation.
+         *
+         * @return Error message or empty String
+         */
+        String getErrorMessage();
     }
 
     /**
Index: src/org/openstreetmap/josm/gui/layer/GpxLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 1458)
+++ src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(working copy)
@@ -15,29 +15,21 @@
 import java.awt.event.ActionListener;
 import java.awt.geom.Area;
 import java.awt.geom.Rectangle2D;
-import java.io.BufferedReader;
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.net.URLConnection;
-import java.net.UnknownHostException;
+import java.text.DateFormat;
+import java.text.DecimalFormat;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.LinkedList;
 import java.util.Date;
+import java.util.LinkedList;
 import java.util.List;
-import java.text.DateFormat;
-import java.text.DecimalFormat;
 
 import javax.swing.AbstractAction;
 import javax.swing.Box;
 import javax.swing.ButtonGroup;
 import javax.swing.Icon;
-import javax.swing.JCheckBox;
 import javax.swing.JColorChooser;
 import javax.swing.JFileChooser;
 import javax.swing.JLabel;
@@ -47,14 +39,13 @@
 import javax.swing.JPanel;
 import javax.swing.JRadioButton;
 import javax.swing.JSeparator;
-import javax.swing.JTextField;
 import javax.swing.filechooser.FileFilter;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.RenameLayerAction;
 import org.openstreetmap.josm.actions.SaveAction;
 import org.openstreetmap.josm.actions.SaveAsAction;
-import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
+import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTaskList;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.gpx.GpxData;
@@ -68,11 +59,8 @@
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.dialogs.LayerListPopup;
-import org.openstreetmap.josm.gui.download.DownloadDialog.DownloadTask;
 import org.openstreetmap.josm.gui.layer.markerlayer.AudioMarker;
 import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
-import org.openstreetmap.josm.io.GpxWriter;
-import org.openstreetmap.josm.io.MultiPartFormOutputStream;
 import org.openstreetmap.josm.tools.DontShowAgainInfo;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -367,10 +355,10 @@
         {-ll0,+sl4,-sl4,+ll0},
         {-ll0,-sl9,-ll0,+sl9}
     };
-    
+
     // the different color modes
     enum colorModes { none, velocity, dilution }
-    
+
     @Override public void paint(Graphics g, MapView mv) {
 
         /****************************************************************
@@ -379,30 +367,30 @@
         // Long startTime = System.currentTimeMillis();
         Color neutralColor = getColor(name);
         // also draw lines between points belonging to different segments
-        boolean forceLines = Main.pref.getBoolean("draw.rawgps.lines.force");   
+        boolean forceLines = Main.pref.getBoolean("draw.rawgps.lines.force");
         // draw direction arrows on the lines
-        boolean direction = Main.pref.getBoolean("draw.rawgps.direction");   
+        boolean direction = Main.pref.getBoolean("draw.rawgps.direction");
         // don't draw lines if longer than x meters
-        int maxLineLength = Main.pref.getInteger("draw.rawgps.max-line-length", -1);        
+        int maxLineLength = Main.pref.getInteger("draw.rawgps.max-line-length", -1);
         // draw line between points, global setting
-        boolean lines = Main.pref.getBoolean("draw.rawgps.lines");                                
+        boolean lines = Main.pref.getBoolean("draw.rawgps.lines");
         String linesKey = "draw.rawgps.lines.layer "+name;
         // draw lines, per-layer setting
         if (Main.pref.hasKey(linesKey))
-            lines = Main.pref.getBoolean(linesKey);    
+            lines = Main.pref.getBoolean(linesKey);
         // paint large dots for points
         boolean large = Main.pref.getBoolean("draw.rawgps.large");
         // color the lines
         colorModes colored = colorModes.none;
         try {
-            colored = colorModes.values()[Main.pref.getInteger("draw.rawgps.colors", 0)]; 
+            colored = colorModes.values()[Main.pref.getInteger("draw.rawgps.colors", 0)];
         } catch(Exception e) { }
         // paint direction arrow with alternate math. may be faster
-        boolean alternatedirection = Main.pref.getBoolean("draw.rawgps.alternatedirection");    
+        boolean alternatedirection = Main.pref.getBoolean("draw.rawgps.alternatedirection");
         // don't draw arrows nearer to each other than this
-        int delta = Main.pref.getInteger("draw.rawgps.min-arrow-distance", 0);        
+        int delta = Main.pref.getInteger("draw.rawgps.min-arrow-distance", 0);
         // allows to tweak line coloring for different speed levels.
-        int colorTracksTune = Main.pref.getInteger("draw.rawgps.colorTracksTune", 45); 
+        int colorTracksTune = Main.pref.getInteger("draw.rawgps.colorTracksTune", 45);
         /****************************************************************
          ********** STEP 2a - CHECK CACHE VALIDITY **********************
          ****************************************************************/
@@ -447,7 +435,7 @@
                                     else
                                         trkPnt.customColoring = colors[(int) (velColor)];
                                     break;
-                                
+
                                 case dilution:
                                     if(trkPnt.attr.get("hdop") != null) {
                                         float hdop = ((Float)trkPnt.attr.get("hdop")).floatValue();
@@ -457,7 +445,7 @@
                                         int hdopcolor = 255 - (hdoplvl > 255 ? 255 : hdoplvl);
                                         trkPnt.customColoring = colors[hdopcolor];
                                     }
-                                    break;                                
+                                    break;
                             }
 
                             if (maxLineLength == -1 || dist <= maxLineLength) {
@@ -793,13 +781,7 @@
                 return;
             }
 
-            // FIXME: DownloadTask's "please wait" dialog should display the number of
-            // downloads left, and "cancel" needs to be honoured. An error along the way
-            // should abort the whole process.
-            DownloadTask osmTask = new DownloadOsmTask();
-            for (Rectangle2D td : toDownload) {
-               osmTask.download(null, td.getMinY(), td.getMinX(), td.getMaxY(), td.getMaxX());
-            }
+            new DownloadOsmTaskList().download(false, toDownload);
         }
     }
 
Index: src/org/openstreetmap/josm/gui/PleaseWaitDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/PleaseWaitDialog.java	(revision 1458)
+++ src/org/openstreetmap/josm/gui/PleaseWaitDialog.java	(working copy)
@@ -25,6 +25,7 @@
     private final JProgressBar progressBar = new JProgressBar();
 
     public final JLabel currentAction = new JLabel(I18n.tr("Contacting the OSM server..."));
+    private final JLabel customText = new JLabel("");
     public final BoundedRangeModel progress = progressBar.getModel();
     public final JButton cancel = new JButton(I18n.tr("Cancel"));
 
@@ -34,10 +35,12 @@
         JPanel pane = new JPanel(new GridBagLayout());
         pane.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
         pane.add(currentAction, GBC.eol().fill(GBC.HORIZONTAL));
+        pane.add(customText, GBC.eol().fill(GBC.HORIZONTAL));
         pane.add(progressBar, GBC.eop().fill(GBC.HORIZONTAL));
         pane.add(cancel, GBC.eol().anchor(GBC.CENTER));
         setContentPane(pane);
-        setSize(Main.pref.getInteger("progressdialog.size",600),100);
+        //setSize(Main.pref.getInteger("progressdialog.size",600),100);
+        setCustomText("");
         setLocationRelativeTo(Main.parent);
         addComponentListener(new ComponentListener() {
             public void componentHidden(ComponentEvent e) {}
@@ -55,4 +58,20 @@
         UIManager.put("ProgressBar.cycleTime", UIManager.getInt("ProgressBar.repaintInterval") * 100);
         progressBar.setIndeterminate(newValue);
     }
+    
+    /**
+     * Sets a custom text line below currentAction. Can be used to display additional information
+     * @param text
+     */
+    public void setCustomText(String text) {
+        if(text.length() == 0) {
+            customText.setVisible(false);
+            setSize(Main.pref.getInteger("progressdialog.size", 600), 100);
+            return;
+        }
+        
+        customText.setVisible(true);
+        customText.setText(text);
+        setSize(Main.pref.getInteger("progressdialog.size", 600), 120);
+    }
 }
Index: src/org/openstreetmap/josm/gui/PleaseWaitRunnable.java
===================================================================
--- src/org/openstreetmap/josm/gui/PleaseWaitRunnable.java	(revision 1458)
+++ src/org/openstreetmap/josm/gui/PleaseWaitRunnable.java	(working copy)
@@ -24,7 +24,7 @@
  * @author Imi
  */
 public abstract class PleaseWaitRunnable implements Runnable {
-
+    public boolean silent = false;
     public String errorMessage;
 
     private boolean closeDialogCalled = false;
@@ -65,6 +65,8 @@
 
             // reset dialog state
             Main.pleaseWaitDlg.setTitle(title);
+            Main.pleaseWaitDlg.cancel.setEnabled(true);
+            Main.pleaseWaitDlg.setCustomText("");
             errorMessage = null;
             closeDialogCalled = false;
 
@@ -130,7 +132,7 @@
                         Main.pleaseWaitDlg.setVisible(false);
                         Main.pleaseWaitDlg.dispose();
                     }
-                    if (errorMessage != null)
+                    if (errorMessage != null && !silent)
                         JOptionPane.showMessageDialog(Main.parent, errorMessage);
                 }
             };
Index: src/org/openstreetmap/josm/io/BoundingBoxDownloader.java
===================================================================
--- src/org/openstreetmap/josm/io/BoundingBoxDownloader.java	(revision 1458)
+++ src/org/openstreetmap/josm/io/BoundingBoxDownloader.java	(working copy)
@@ -92,9 +92,9 @@
         try {
             Main.pleaseWaitDlg.progress.setValue(0);
             Main.pleaseWaitDlg.currentAction.setText(tr("Contacting OSM Server..."));
-            Main.pleaseWaitDlg.setIndeterminate(true); 
+            Main.pleaseWaitDlg.setIndeterminate(true);
             final InputStream in = getInputStream("map?bbox="+lon1+","+lat1+","+lon2+","+lat2, Main.pleaseWaitDlg);
-            Main.pleaseWaitDlg.setIndeterminate(false); 
+            Main.pleaseWaitDlg.setIndeterminate(false);
             if (in == null)
                 return null;
             Main.pleaseWaitDlg.currentAction.setText(tr("Downloading OSM data..."));
Index: src/org/openstreetmap/josm/Main.java
===================================================================
--- src/org/openstreetmap/josm/Main.java	(revision 1458)
+++ src/org/openstreetmap/josm/Main.java	(working copy)
@@ -15,7 +15,7 @@
 import java.util.Locale;
 import java.util.Map;
 import java.util.StringTokenizer;
-import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -26,10 +26,10 @@
 import javax.swing.JPanel;
 import javax.swing.UIManager;
 
+import org.openstreetmap.josm.actions.SaveAction;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadGpsTask;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
 import org.openstreetmap.josm.actions.mapmode.MapMode;
-import org.openstreetmap.josm.actions.SaveAction;
 import org.openstreetmap.josm.actions.search.SearchAction;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.Preferences;
@@ -54,9 +54,9 @@
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.OsmUrlToBounds;
 import org.openstreetmap.josm.tools.PlatformHook;
+import org.openstreetmap.josm.tools.PlatformHookOsx;
 import org.openstreetmap.josm.tools.PlatformHookUnixoid;
 import org.openstreetmap.josm.tools.PlatformHookWindows;
-import org.openstreetmap.josm.tools.PlatformHookOsx;
 import org.openstreetmap.josm.tools.Shortcut;
 
 abstract public class Main {
@@ -73,7 +73,7 @@
      * calculations. The executed runnables are guaranteed to be executed separately
      * and sequential.
      */
-    public final static Executor worker = Executors.newSingleThreadExecutor();
+    public final static ExecutorService worker = Executors.newSingleThreadExecutor();
     /**
      * Global application preferences
      */
