Index: /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java	(revision 5096)
+++ /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java	(revision 5097)
@@ -48,9 +48,16 @@
     }
 
+    @Override
     public Future<?> download(boolean newLayer, Bounds downloadArea, ProgressMonitor progressMonitor) {
-
-        downloadTask = new DownloadTask(newLayer,
-                new BoundingBoxDownloader(downloadArea), progressMonitor);
-        currentBounds = new Bounds(downloadArea);
+        return download(new BoundingBoxDownloader(downloadArea), newLayer, downloadArea, progressMonitor);
+    }
+
+    public Future<?> download(OsmServerReader reader, boolean newLayer, Bounds downloadArea, ProgressMonitor progressMonitor) {
+        return download(new DownloadTask(newLayer, reader, progressMonitor), downloadArea);
+    }
+
+    protected Future<?> download(DownloadTask downloadTask, Bounds downloadArea) {
+        this.downloadTask = downloadTask;
+        this.currentBounds = new Bounds(downloadArea);
         // 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.
Index: /trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 5096)
+++ /trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 5097)
@@ -66,17 +66,17 @@
     }
 
-    private final List<DownloadSelection> downloadSelections = new ArrayList<DownloadSelection>();
-    private final JTabbedPane tpDownloadAreaSelectors = new JTabbedPane();
-    private JCheckBox cbNewLayer;
-    private JCheckBox cbStartup;
-    private final JLabel sizeCheck = new JLabel();
-    private Bounds currentBounds = null;
-    private boolean canceled;
-
-    private JCheckBox cbDownloadOsmData;
-    private JCheckBox cbDownloadGpxData;
+    protected final List<DownloadSelection> downloadSelections = new ArrayList<DownloadSelection>();
+    protected final JTabbedPane tpDownloadAreaSelectors = new JTabbedPane();
+    protected JCheckBox cbNewLayer;
+    protected JCheckBox cbStartup;
+    protected final JLabel sizeCheck = new JLabel();
+    protected Bounds currentBounds = null;
+    protected boolean canceled;
+
+    protected JCheckBox cbDownloadOsmData;
+    protected JCheckBox cbDownloadGpxData;
     /** the download action and button */
     private DownloadAction actDownload;
-    private SideButton btnDownload;
+    protected SideButton btnDownload;
 
     private void makeCheckBoxRespondToEnter(JCheckBox cb) {
@@ -85,8 +85,5 @@
     }
 
-    public JPanel buildMainPanel() {
-        // generic constraints used by different components
-        GridBagConstraints gridBagConstraints;
-
+    protected JPanel buildMainPanel() {
         JPanel pnl = new JPanel();
         pnl.setLayout(new GridBagLayout());
@@ -100,4 +97,6 @@
         cbDownloadGpxData.setToolTipText(tr("Select to download GPS traces in the selected download area."));
         pnl.add(cbDownloadGpxData,  GBC.eol().insets(5,5,1,5));
+
+        buildMainPanelAboveDownloadSelections(pnl);
 
         // predefined download selections
@@ -390,4 +389,7 @@
     }
 
+    protected void buildMainPanelAboveDownloadSelections(JPanel pnl) {
+    }
+
     class CancelAction extends AbstractAction {
         public CancelAction() {
Index: /trunk/src/org/openstreetmap/josm/io/BoundingBoxDownloader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/BoundingBoxDownloader.java	(revision 5096)
+++ /trunk/src/org/openstreetmap/josm/io/BoundingBoxDownloader.java	(revision 5097)
@@ -18,9 +18,9 @@
      * The boundings of the desired map data.
      */
-    private final double lat1;
-    private final double lon1;
-    private final double lat2;
-    private final double lon2;
-    private final boolean crosses180th;
+    protected final double lat1;
+    protected final double lon1;
+    protected final double lat2;
+    protected final double lon2;
+    protected final boolean crosses180th;
 
     public BoundingBoxDownloader(Bounds downloadArea) {
@@ -101,4 +101,8 @@
     }
 
+    protected String getRequestForBbox(double lon1, double lat1, double lon2, double lat2) {
+        return "map?bbox=" + lon1 + "," + lat1 + "," + lon2 + "," + lat2;
+    }
+
     /**
      * Read the data from the osm server address.
@@ -114,10 +118,10 @@
             if (crosses180th) {
                 // API 0.6 does not support requests crossing the 180th meridian, so make two requests
-                in = getInputStream("map?bbox="+lon1+","+lat1+",180.0,"+lat2, progressMonitor.createSubTaskMonitor(9, false));
+                in = getInputStream(getRequestForBbox(lon1, lat1, 180.0, lat2), progressMonitor.createSubTaskMonitor(9, false));
                 if (in == null)
                     return null;
                 ds = OsmReader.parseDataSet(in, progressMonitor.createSubTaskMonitor(1, false));
 
-                in = getInputStream("map?bbox=-180.0,"+lat1+","+lon2+","+lat2, progressMonitor.createSubTaskMonitor(9, false));
+                in = getInputStream(getRequestForBbox(-180.0, lat1, lon2, lat2), progressMonitor.createSubTaskMonitor(9, false));
                 if (in == null)
                     return null;
@@ -129,5 +133,5 @@
             } else {
                 // Simple request
-                in = getInputStream("map?bbox="+lon1+","+lat1+","+lon2+","+lat2, progressMonitor.createSubTaskMonitor(9, false));
+                in = getInputStream(getRequestForBbox(lon1, lat1, lon2, lat2), progressMonitor.createSubTaskMonitor(9, false));
                 if (in == null)
                     return null;
Index: /trunk/src/org/openstreetmap/josm/io/OsmServerReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmServerReader.java	(revision 5096)
+++ /trunk/src/org/openstreetmap/josm/io/OsmServerReader.java	(revision 5097)
@@ -43,9 +43,13 @@
         try {
             api.initialize(progressMonitor);
-            urlStr = api.getBaseUrl() + urlStr;
+            urlStr = urlStr.startsWith("http") ? urlStr : (getBaseUrl() + urlStr);
             return getInputStreamRaw(urlStr, progressMonitor);
         } finally {
             progressMonitor.invalidate();
         }
+    }
+
+    protected String getBaseUrl() {
+        return api.getBaseUrl();
     }
 
