Index: /trunk/src/org/openstreetmap/josm/actions/DownloadNotesInViewAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/DownloadNotesInViewAction.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/actions/DownloadNotesInViewAction.java	(revision 13927)
@@ -9,4 +9,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadNotesTask;
+import org.openstreetmap.josm.actions.downloadtasks.DownloadParams;
 import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
 import org.openstreetmap.josm.data.Bounds;
@@ -47,5 +48,5 @@
         DownloadNotesTask task = new DownloadNotesTask();
         task.setZoomAfterDownload(false);
-        Future<?> future = task.download(false, bounds, null);
+        Future<?> future = task.download(new DownloadParams(), bounds, null);
         MainApplication.worker.submit(new PostDownloadHandler(task, future));
     }
Index: /trunk/src/org/openstreetmap/josm/actions/DownloadOsmInViewAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/DownloadOsmInViewAction.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/actions/DownloadOsmInViewAction.java	(revision 13927)
@@ -9,4 +9,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
+import org.openstreetmap.josm.actions.downloadtasks.DownloadParams;
 import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
 import org.openstreetmap.josm.data.Bounds;
@@ -47,5 +48,5 @@
     private static class DownloadOsmInViewTask extends DownloadOsmTask {
         Future<?> download(Bounds downloadArea) {
-            return download(new DownloadTask(false, new BoundingBoxDownloader(downloadArea), null, false), downloadArea);
+            return download(new DownloadTask(new DownloadParams(), new BoundingBoxDownloader(downloadArea), null, false), downloadArea);
         }
     }
Index: /trunk/src/org/openstreetmap/josm/actions/OpenLocationAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/OpenLocationAction.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/actions/OpenLocationAction.java	(revision 13927)
@@ -36,4 +36,5 @@
 import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmUrlTask;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadSessionTask;
+import org.openstreetmap.josm.actions.downloadtasks.DownloadParams;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadTask;
 import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
@@ -225,5 +226,16 @@
      */
     public List<Future<?>> openUrl(boolean newLayer, String url) {
-        return openUrl(newLayer, DOWNLOAD_ZOOMTODATA.get(), url);
+        return openUrl(new DownloadParams().withNewLayer(newLayer), url);
+    }
+
+    /**
+     * Open the given URL.
+     * @param settings download settings
+     * @param url The URL to open
+     * @return the list of tasks that have been started successfully (can be empty).
+     * @since 13927
+     */
+    public List<Future<?>> openUrl(DownloadParams settings, String url) {
+        return openUrl(settings, DOWNLOAD_ZOOMTODATA.get(), url);
     }
 
@@ -247,4 +259,16 @@
      */
     public List<Future<?>> openUrl(boolean newLayer, boolean zoomToData, String url) {
+        return openUrl(new DownloadParams().withNewLayer(newLayer), zoomToData, url);
+    }
+
+    /**
+     * Open the given URL.
+     * @param settings download settings
+     * @param zoomToData true to zoom to entire newly downloaded data, false otherwise
+     * @param url The URL to open
+     * @return the list of tasks that have been started successfully (can be empty).
+     * @since 13927
+     */
+    public List<Future<?>> openUrl(DownloadParams settings, boolean zoomToData, String url) {
         Collection<DownloadTask> tasks = findDownloadTasks(url, false);
 
@@ -262,5 +286,5 @@
             try {
                 task.setZoomAfterDownload(zoomToData);
-                result.add(MainApplication.worker.submit(new PostDownloadHandler(task, task.loadUrl(newLayer, url, monitor))));
+                result.add(MainApplication.worker.submit(new PostDownloadHandler(task, task.loadUrl(settings, url, monitor))));
             } catch (IllegalArgumentException e) {
                 Logging.error(e);
Index: /trunk/src/org/openstreetmap/josm/actions/SearchNotesDownloadAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/SearchNotesDownloadAction.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/actions/SearchNotesDownloadAction.java	(revision 13927)
@@ -18,4 +18,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadNotesTask;
+import org.openstreetmap.josm.actions.downloadtasks.DownloadParams;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.Notification;
@@ -104,5 +105,5 @@
             .append(Utils.encodeUrl(trimmedSearchTerm));
 
-        new DownloadNotesTask().loadUrl(false, sb.toString(), null);
+        new DownloadNotesTask().loadUrl(new DownloadParams(), sb.toString(), null);
     }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/downloadtasks/AbstractChangesetDownloadTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/downloadtasks/AbstractChangesetDownloadTask.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/actions/downloadtasks/AbstractChangesetDownloadTask.java	(revision 13927)
@@ -92,5 +92,5 @@
 
     @Override
-    public final Future<?> download(boolean newLayer, Bounds downloadArea, ProgressMonitor progressMonitor) {
+    public final Future<?> download(DownloadParams settings, Bounds downloadArea, ProgressMonitor progressMonitor) {
         return download();
     }
@@ -129,5 +129,5 @@
 
     @Override
-    public final Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
+    public final Future<?> loadUrl(DownloadParams settings, String url, ProgressMonitor progressMonitor) {
         return downloadTaskRunnable != null ? MainApplication.worker.submit(downloadTaskRunnable) : null;
     }
Index: /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java	(revision 13927)
@@ -59,6 +59,6 @@
 
     @Override
-    public Future<?> download(boolean newLayer, Bounds downloadArea, ProgressMonitor progressMonitor) {
-        downloadTask = new DownloadTask(newLayer,
+    public Future<?> download(DownloadParams settings, Bounds downloadArea, ProgressMonitor progressMonitor) {
+        downloadTask = new DownloadTask(settings,
                 new BoundingBoxDownloader(downloadArea), progressMonitor);
         // We need submit instead of execute so we can wait for it to finish and get the error
@@ -68,5 +68,5 @@
 
     @Override
-    public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
+    public Future<?> loadUrl(DownloadParams settings, String url, ProgressMonitor progressMonitor) {
         CheckParameterUtil.ensureParameterNotNull(url, "url");
         final Optional<String> mappedUrl = Stream.of(GpxUrlPattern.USER_TRACE_ID, GpxUrlPattern.EDIT_TRACE_ID)
@@ -76,10 +76,10 @@
                 .findFirst();
         if (mappedUrl.isPresent()) {
-            return loadUrl(newLayer, mappedUrl.get(), progressMonitor);
+            return loadUrl(settings, mappedUrl.get(), progressMonitor);
         }
         if (Stream.of(GpxUrlPattern.TRACE_ID, GpxUrlPattern.EXTERNAL_GPX_SCRIPT,
                       GpxUrlPattern.EXTERNAL_GPX_FILE, GpxUrlPattern.TASKING_MANAGER)
                 .anyMatch(p -> url.matches(p.pattern()))) {
-            downloadTask = new DownloadTask(newLayer,
+            downloadTask = new DownloadTask(settings,
                     new OsmServerLocationReader(url), progressMonitor);
             // Extract .gpx filename from URL to set the new layer name
@@ -94,5 +94,5 @@
             for (int i = 0; i < table.length; i++) {
                 if ("bbox".equals(table[i]) && i < table.length-1)
-                    return download(newLayer, new Bounds(table[i+1], ",", ParseMethod.LEFT_BOTTOM_RIGHT_TOP), progressMonitor);
+                    return download(settings, new Bounds(table[i+1], ",", ParseMethod.LEFT_BOTTOM_RIGHT_TOP), progressMonitor);
             }
         }
@@ -117,8 +117,8 @@
         private final boolean newLayer;
 
-        DownloadTask(boolean newLayer, OsmServerReader reader, ProgressMonitor progressMonitor) {
+        DownloadTask(DownloadParams settings, OsmServerReader reader, ProgressMonitor progressMonitor) {
             super(tr("Downloading GPS data"), progressMonitor, false);
             this.reader = reader;
-            this.newLayer = newLayer;
+            this.newLayer = settings.isNewLayer();
         }
 
Index: /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesTask.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesTask.java	(revision 13927)
@@ -67,5 +67,5 @@
 
     @Override
-    public Future<?> download(boolean newLayer, Bounds downloadArea, ProgressMonitor progressMonitor) {
+    public Future<?> download(DownloadParams settings, Bounds downloadArea, ProgressMonitor progressMonitor) {
         downloadTask = new DownloadBoundingBoxTask(new BoundingBoxDownloader(downloadArea), progressMonitor);
         return MainApplication.worker.submit(downloadTask);
@@ -73,5 +73,5 @@
 
     @Override
-    public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
+    public Future<?> loadUrl(DownloadParams settings, String url, ProgressMonitor progressMonitor) {
         if (url.matches(PATTERN_COMPRESS)) {
             downloadTask = new DownloadCompressedRawUrlTask(new OsmServerLocationReader(url), progressMonitor, Compression.byExtension(url));
Index: /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesUrlBoundsTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesUrlBoundsTask.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesUrlBoundsTask.java	(revision 13927)
@@ -18,6 +18,6 @@
 
     @Override
-    public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
-        return download(newLayer, OsmUrlToBounds.parse(url), null);
+    public Future<?> loadUrl(DownloadParams settings, String url, ProgressMonitor progressMonitor) {
+        return download(settings, OsmUrlToBounds.parse(url), null);
     }
 
Index: /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesUrlIdTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesUrlIdTask.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesUrlIdTask.java	(revision 13927)
@@ -21,5 +21,5 @@
 
     @Override
-    public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
+    public Future<?> loadUrl(DownloadParams settings, String url, ProgressMonitor progressMonitor) {
         final Matcher matcher = Pattern.compile(URL_ID_PATTERN).matcher(url);
         if (matcher.matches()) {
Index: /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeCompressedTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeCompressedTask.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeCompressedTask.java	(revision 13927)
@@ -33,11 +33,11 @@
     /**
      * Loads a given URL
-     * @param newLayer {@code true} if the data should be saved to a new layer
+     * @param settings download settings
      * @param url The URL as String
      * @param progressMonitor progress monitor for user interaction
      */
     @Override
-    public Future<?> loadUrl(boolean newLayer, final String url, ProgressMonitor progressMonitor) {
-        downloadTask = new DownloadTask(newLayer, new OsmServerLocationReader(url), progressMonitor) {
+    public Future<?> loadUrl(DownloadParams settings, final String url, ProgressMonitor progressMonitor) {
+        downloadTask = new DownloadTask(settings, new OsmServerLocationReader(url), progressMonitor) {
             @Override
             protected DataSet parseDataSet() throws OsmTransferException {
@@ -48,5 +48,5 @@
         currentBounds = null;
         // Extract .osc.gz/xz/bz/bz2/zip filename from URL to set the new layer name
-        extractOsmFilename(PATTERN_COMPRESS, url);
+        extractOsmFilename(settings, PATTERN_COMPRESS, url);
         return MainApplication.worker.submit(downloadTask);
     }
Index: /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java	(revision 13927)
@@ -62,18 +62,17 @@
 
     @Override
-    public Future<?> download(boolean newLayer, Bounds downloadArea,
-            ProgressMonitor progressMonitor) {
+    public Future<?> download(DownloadParams settings, Bounds downloadArea, ProgressMonitor progressMonitor) {
         return null;
     }
 
     @Override
-    public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
+    public Future<?> loadUrl(DownloadParams settings, String url, ProgressMonitor progressMonitor) {
         final Matcher matcher = Pattern.compile(OSM_WEBSITE_PATTERN).matcher(url);
         if (matcher.matches()) {
             url = OsmApi.getOsmApi().getBaseUrl() + "changeset/" + Long.parseLong(matcher.group(2)) + "/download";
         }
-        downloadTask = new DownloadTask(newLayer, new OsmServerLocationReader(url), progressMonitor);
+        downloadTask = new DownloadTask(settings, new OsmServerLocationReader(url), progressMonitor);
         // Extract .osc filename from URL to set the new layer name
-        extractOsmFilename("https?://.*/(.*\\.osc)", url);
+        extractOsmFilename(settings, "https?://.*/(.*\\.osc)", url);
         return MainApplication.worker.submit(downloadTask);
     }
@@ -86,10 +85,10 @@
         /**
          * Constructs a new {@code DownloadTask}.
-         * @param newLayer if {@code true}, force download to a new layer
+         * @param settings download settings
          * @param reader OSM data reader
          * @param progressMonitor progress monitor
          */
-        public DownloadTask(boolean newLayer, OsmServerReader reader, ProgressMonitor progressMonitor) {
-            super(newLayer, reader, progressMonitor);
+        public DownloadTask(DownloadParams settings, OsmServerReader reader, ProgressMonitor progressMonitor) {
+            super(settings, reader, progressMonitor);
         }
 
Index: /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmCompressedTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmCompressedTask.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmCompressedTask.java	(revision 13927)
@@ -33,5 +33,5 @@
 
     @Override
-    public Future<?> download(boolean newLayer, Bounds downloadArea, ProgressMonitor progressMonitor) {
+    public Future<?> download(DownloadParams settings, Bounds downloadArea, ProgressMonitor progressMonitor) {
         return null;
     }
@@ -39,11 +39,11 @@
     /**
      * Loads a given URL
-     * @param newLayer {@code true} if the data should be saved to a new layer
+     * @param settings download settings
      * @param url The URL as String
      * @param progressMonitor progress monitor for user interaction
      */
     @Override
-    public Future<?> loadUrl(boolean newLayer, final String url, ProgressMonitor progressMonitor) {
-        downloadTask = new DownloadTask(newLayer, new OsmServerLocationReader(url), progressMonitor) {
+    public Future<?> loadUrl(DownloadParams settings, final String url, ProgressMonitor progressMonitor) {
+        downloadTask = new DownloadTask(settings, new OsmServerLocationReader(url), progressMonitor) {
             @Override
             protected DataSet parseDataSet() throws OsmTransferException {
@@ -54,5 +54,5 @@
         currentBounds = null;
         // Extract .osm.gz/bz/bz2/zip filename from URL to set the new layer name
-        extractOsmFilename(PATTERN_COMPRESS, url);
+        extractOsmFilename(settings, PATTERN_COMPRESS, url);
         return MainApplication.worker.submit(downloadTask);
     }
Index: /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmIdTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmIdTask.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmIdTask.java	(revision 13927)
@@ -32,5 +32,5 @@
 
     @Override
-    public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
+    public Future<?> loadUrl(DownloadParams settings, String url, ProgressMonitor progressMonitor) {
         final Matcher matcher = Pattern.compile(URL_ID_PATTERN).matcher(url);
         if (matcher.matches()) {
@@ -39,5 +39,5 @@
             final PrimitiveId primitiveId = new SimplePrimitiveId(id, type);
             final DownloadPrimitivesWithReferrersTask downloadTask = new DownloadPrimitivesWithReferrersTask(
-                    newLayer, Collections.singletonList(primitiveId), true, true, null, null);
+                    settings.isNewLayer(), Collections.singletonList(primitiveId), true, true, null, null);
             return MainApplication.worker.submit(downloadTask);
         } else {
Index: /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java	(revision 13927)
@@ -77,6 +77,6 @@
 
     @Override
-    public Future<?> download(boolean newLayer, Bounds downloadArea, ProgressMonitor progressMonitor) {
-        return download(new BoundingBoxDownloader(downloadArea), newLayer, downloadArea, progressMonitor);
+    public Future<?> download(DownloadParams settings, Bounds downloadArea, ProgressMonitor progressMonitor) {
+        return download(new BoundingBoxDownloader(downloadArea), settings, downloadArea, progressMonitor);
     }
 
@@ -112,12 +112,11 @@
      * </pre>
      * @param reader the reader used to parse OSM data (see {@link OsmServerReader#parseOsm})
-     * @param newLayer true, if the data is to be downloaded into a new layer. If false, the task
-     *                 selects one of the existing layers as download layer, preferably the active layer.
+     * @param settings download settings
      * @param downloadArea the area to download
      * @param progressMonitor the progressMonitor
      * @return the future representing the asynchronous task
      */
-    public Future<?> download(OsmServerReader reader, boolean newLayer, Bounds downloadArea, ProgressMonitor progressMonitor) {
-        return download(new DownloadTask(newLayer, reader, progressMonitor, zoomAfterDownload), downloadArea);
+    public Future<?> download(OsmServerReader reader, DownloadParams settings, Bounds downloadArea, ProgressMonitor progressMonitor) {
+        return download(new DownloadTask(settings, reader, progressMonitor, zoomAfterDownload), downloadArea);
     }
 
@@ -141,22 +140,25 @@
     /**
      * Loads a given URL from the OSM Server
-     * @param newLayer True if the data should be saved to a new layer
+     * @param settings download settings
      * @param url The URL as String
      */
     @Override
-    public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
+    public Future<?> loadUrl(DownloadParams settings, String url, ProgressMonitor progressMonitor) {
         String newUrl = modifyUrlBeforeLoad(url);
-        downloadTask = new DownloadTask(newLayer,
+        downloadTask = new DownloadTask(settings,
                 new OsmServerLocationReader(newUrl),
                 progressMonitor);
         currentBounds = null;
         // Extract .osm filename from URL to set the new layer name
-        extractOsmFilename("https?://.*/(.*\\.osm)", newUrl);
+        extractOsmFilename(settings, "https?://.*/(.*\\.osm)", newUrl);
         return MainApplication.worker.submit(downloadTask);
     }
 
-    protected final void extractOsmFilename(String pattern, String url) {
-        Matcher matcher = Pattern.compile(pattern).matcher(url);
-        newLayerName = matcher.matches() ? matcher.group(1) : null;
+    protected final void extractOsmFilename(DownloadParams settings, String pattern, String url) {
+        newLayerName = settings.getLayerName();
+        if (newLayerName == null || newLayerName.isEmpty()) {
+            Matcher matcher = Pattern.compile(pattern).matcher(url);
+            newLayerName = matcher.matches() ? matcher.group(1) : null;
+        }
     }
 
@@ -190,5 +192,5 @@
         /**
          * Constructs a new {@code AbstractInternalTask}.
-         * @param newLayer if {@code true}, force download to a new layer
+         * @param settings download settings
          * @param title message for the user
          * @param ignoreException If true, exception will be propagated to calling code. If false then
@@ -197,7 +199,7 @@
          * @param zoomAfterDownload If true, the map view will zoom to download area after download
          */
-        public AbstractInternalTask(boolean newLayer, String title, boolean ignoreException, boolean zoomAfterDownload) {
+        public AbstractInternalTask(DownloadParams settings, String title, boolean ignoreException, boolean zoomAfterDownload) {
             super(title, ignoreException);
-            this.newLayer = newLayer;
+            this.newLayer = settings.isNewLayer();
             this.zoomAfterDownload = zoomAfterDownload;
         }
@@ -205,5 +207,5 @@
         /**
          * Constructs a new {@code AbstractInternalTask}.
-         * @param newLayer if {@code true}, force download to a new layer
+         * @param settings download settings
          * @param title message for the user
          * @param progressMonitor progress monitor
@@ -213,8 +215,8 @@
          * @param zoomAfterDownload If true, the map view will zoom to download area after download
          */
-        public AbstractInternalTask(boolean newLayer, String title, ProgressMonitor progressMonitor, boolean ignoreException,
+        public AbstractInternalTask(DownloadParams settings, String title, ProgressMonitor progressMonitor, boolean ignoreException,
                 boolean zoomAfterDownload) {
             super(title, progressMonitor, ignoreException);
-            this.newLayer = newLayer;
+            this.newLayer = settings.isNewLayer();
             this.zoomAfterDownload = zoomAfterDownload;
         }
@@ -348,22 +350,23 @@
         /**
          * Constructs a new {@code DownloadTask}.
-         * @param newLayer if {@code true}, force download to a new layer
+         * @param settings download settings
          * @param reader OSM data reader
          * @param progressMonitor progress monitor
-         */
-        public DownloadTask(boolean newLayer, OsmServerReader reader, ProgressMonitor progressMonitor) {
-            this(newLayer, reader, progressMonitor, true);
+         * @since 13927
+         */
+        public DownloadTask(DownloadParams settings, OsmServerReader reader, ProgressMonitor progressMonitor) {
+            this(settings, reader, progressMonitor, true);
         }
 
         /**
          * Constructs a new {@code DownloadTask}.
-         * @param newLayer if {@code true}, force download to a new layer
+         * @param settings download settings
          * @param reader OSM data reader
          * @param progressMonitor progress monitor
          * @param zoomAfterDownload If true, the map view will zoom to download area after download
-         * @since 8942
-         */
-        public DownloadTask(boolean newLayer, OsmServerReader reader, ProgressMonitor progressMonitor, boolean zoomAfterDownload) {
-            super(newLayer, tr("Downloading data"), progressMonitor, false, zoomAfterDownload);
+         * @since 13927
+         */
+        public DownloadTask(DownloadParams settings, OsmServerReader reader, ProgressMonitor progressMonitor, boolean zoomAfterDownload) {
+            super(settings, tr("Downloading data"), progressMonitor, false, zoomAfterDownload);
             this.reader = reader;
         }
Index: /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmUrlTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmUrlTask.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmUrlTask.java	(revision 13927)
@@ -17,6 +17,6 @@
 
     @Override
-    public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
-        return download(newLayer, OsmUrlToBounds.parse(url), null);
+    public Future<?> loadUrl(DownloadParams settings, String url, ProgressMonitor progressMonitor) {
+        return download(settings, OsmUrlToBounds.parse(url), null);
     }
 
Index: /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadParams.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadParams.java	(revision 13927)
+++ /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadParams.java	(revision 13927)
@@ -0,0 +1,114 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions.downloadtasks;
+
+import org.openstreetmap.josm.data.osm.DownloadPolicy;
+import org.openstreetmap.josm.data.osm.UploadPolicy;
+
+/**
+ * Download parameters affecting the behaviour of {@link DownloadTask}s.
+ * @since 13927
+ */
+public class DownloadParams {
+
+    private boolean newLayer;
+    private String layerName;
+    private boolean locked;
+    private DownloadPolicy downloadPolicy;
+    private UploadPolicy uploadPolicy;
+
+    /**
+     * Determines if the data is to be downloaded into a new layer.
+     * @return true, if the data is to be downloaded into a new layer. If false, the task
+     * selects one of the existing layers as download layer, preferably the active layer.
+     * @see #getLayerName
+     */
+    public final boolean isNewLayer() {
+        return newLayer;
+    }
+
+    /**
+     * Sets whether the data is to be downloaded into a new layer.
+     * @param newLayer true, if the data is to be downloaded into a new layer. If false, the task
+     * selects one of the existing layers as download layer, preferably the active layer.
+     * @return this
+     * @see #withLayerName
+     */
+    public final DownloadParams withNewLayer(boolean newLayer) {
+        this.newLayer = newLayer;
+        return this;
+    }
+
+    /**
+     * Returns the new layer name (if a new layer is to be created).
+     * @return the new layer name, or null
+     * @see #isNewLayer
+     */
+    public final String getLayerName() {
+        return layerName;
+    }
+
+    /**
+     * Sets the new layer name (if a new layer is to be created).
+     * @param layerName the new layer name, or null
+     * @return this
+     * @see #withNewLayer
+     */
+    public final DownloadParams withLayerName(String layerName) {
+        this.layerName = layerName;
+        return this;
+    }
+
+    /**
+     * Determines if the new layer must be locked.
+     * @return {@code true} if the new layer must be locked
+     */
+    public final boolean isLocked() {
+        return locked;
+    }
+
+    /**
+     * Sets whether the new layer must be locked.
+     * @param locked {@code true} if the new layer must be locked
+     * @return this
+     */
+    public final DownloadParams withLocked(boolean locked) {
+        this.locked = locked;
+        return this;
+    }
+
+    /**
+     * Returns the download policy of new layer.
+     * @return the download policy of new layer
+     */
+    public final DownloadPolicy getDownloadPolicy() {
+        return downloadPolicy;
+    }
+
+    /**
+     * Sets the download policy of new layer.
+     * @param downloadPolicy the download policy of new layer
+     * @return this
+     */
+    public final DownloadParams withDownloadPolicy(DownloadPolicy downloadPolicy) {
+        this.downloadPolicy = downloadPolicy;
+        return this;
+    }
+
+    /**
+     * Returns the upload policy of new layer.
+     * @return the upload policy of new layer
+     */
+    public final UploadPolicy getUploadPolicy() {
+        return uploadPolicy;
+    }
+
+    /**
+     * Sets the upload policy of new layer.
+     * @param uploadPolicy the upload policy of new layer
+     * @return this
+     */
+    public final DownloadParams withUploadPolicy(UploadPolicy uploadPolicy) {
+        this.uploadPolicy = uploadPolicy;
+        return this;
+    }
+}
Index: /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadSessionTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadSessionTask.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadSessionTask.java	(revision 13927)
@@ -38,10 +38,10 @@
 
     @Override
-    public Future<?> download(boolean newLayer, Bounds downloadArea, ProgressMonitor progressMonitor) {
+    public Future<?> download(DownloadParams settings, Bounds downloadArea, ProgressMonitor progressMonitor) {
         return null;
     }
 
     @Override
-    public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
+    public Future<?> loadUrl(DownloadParams settings, String url, ProgressMonitor progressMonitor) {
         if (url != null && (url.matches(PATTERN_SESSION))) {
             try {
Index: /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadTask.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadTask.java	(revision 13927)
@@ -46,12 +46,12 @@
      * </pre>
      *
-     * @param newLayer true, if the data is to be downloaded into a new layer. If false, the task
-     * selects one of the existing layers as download layer, preferably the active layer.
+     * @param settings download settings
      *
      * @param downloadArea the area to download
      * @param progressMonitor the progressMonitor
      * @return the future representing the asynchronous task
+     * @since 13927
      */
-    Future<?> download(boolean newLayer, Bounds downloadArea, ProgressMonitor progressMonitor);
+    Future<?> download(DownloadParams settings, Bounds downloadArea, ProgressMonitor progressMonitor);
 
     /**
@@ -62,13 +62,13 @@
      * be discarded.
 
-     * @param newLayer newLayer true, if the data is to be downloaded into a new layer. If false, the task
-     * selects one of the existing layers as download layer, preferably the active layer.
+     * @param settings download settings
      * @param url the url to download from
      * @param progressMonitor the progressMonitor
      * @return the future representing the asynchronous task
      *
-     * @see #download(boolean, Bounds, ProgressMonitor)
+     * @see #download(DownloadParams, Bounds, ProgressMonitor)
+     * @since 13927
      */
-    Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor);
+    Future<?> loadUrl(DownloadParams settings, String url, ProgressMonitor progressMonitor);
 
     /**
Index: /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadTaskList.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadTaskList.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadTaskList.java	(revision 13927)
@@ -55,5 +55,5 @@
         ProgressMonitor childProgress = progressMonitor.createSubTaskMonitor(1, false);
         childProgress.setCustomText(tr("Download {0} of {1} ({2} left)", i, n, n - i));
-        Future<?> future = dt.download(false, new Bounds(td), childProgress);
+        Future<?> future = dt.download(new DownloadParams(), new Bounds(td), childProgress);
         taskFutures.add(future);
         tasks.add(dt);
Index: /trunk/src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 13927)
@@ -80,4 +80,5 @@
 import org.openstreetmap.josm.actions.downloadtasks.DownloadGpsTask;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
+import org.openstreetmap.josm.actions.downloadtasks.DownloadParams;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadTask;
 import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
@@ -1370,5 +1371,5 @@
         DownloadTask task = rawGps ? new DownloadGpsTask() : new DownloadOsmTask();
         // asynchronously launch the download task ...
-        Future<?> future = task.download(true, b, null);
+        Future<?> future = task.download(new DownloadParams().withNewLayer(true), b, null);
         // ... and the continuation when the download is finished (this will wait for the download to finish)
         return Collections.singletonList(MainApplication.worker.submit(new PostDownloadHandler(task, future)));
Index: /trunk/src/org/openstreetmap/josm/gui/download/OSMDownloadSource.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/download/OSMDownloadSource.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/gui/download/OSMDownloadSource.java	(revision 13927)
@@ -23,4 +23,5 @@
 import org.openstreetmap.josm.actions.downloadtasks.DownloadNotesTask;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
+import org.openstreetmap.josm.actions.downloadtasks.DownloadParams;
 import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
 import org.openstreetmap.josm.data.Bounds;
@@ -64,5 +65,5 @@
             DownloadOsmTask task = new DownloadOsmTask();
             task.setZoomAfterDownload(zoom && !data.isDownloadGPX() && !data.isDownloadNotes());
-            Future<?> future = task.download(newLayer, bbox, null);
+            Future<?> future = task.download(new DownloadParams().withNewLayer(newLayer), bbox, null);
             MainApplication.worker.submit(new PostDownloadHandler(task, future));
             if (zoom) {
@@ -74,5 +75,5 @@
             DownloadGpsTask task = new DownloadGpsTask();
             task.setZoomAfterDownload(zoom && !data.isDownloadOSMData() && !data.isDownloadNotes());
-            Future<?> future = task.download(newLayer, bbox, null);
+            Future<?> future = task.download(new DownloadParams().withNewLayer(newLayer), bbox, null);
             MainApplication.worker.submit(new PostDownloadHandler(task, future));
             if (zoom) {
@@ -84,5 +85,5 @@
             DownloadNotesTask task = new DownloadNotesTask();
             task.setZoomAfterDownload(zoom && !data.isDownloadOSMData() && !data.isDownloadGPX());
-            Future<?> future = task.download(false, bbox, null);
+            Future<?> future = task.download(new DownloadParams(), bbox, null);
             MainApplication.worker.submit(new PostDownloadHandler(task, future));
             if (zoom) {
Index: /trunk/src/org/openstreetmap/josm/gui/download/OverpassDownloadSource.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/download/OverpassDownloadSource.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/gui/download/OverpassDownloadSource.java	(revision 13927)
@@ -26,4 +26,5 @@
 
 import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
+import org.openstreetmap.josm.actions.downloadtasks.DownloadParams;
 import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
 import org.openstreetmap.josm.data.Bounds;
@@ -63,5 +64,5 @@
         Future<?> future = task.download(
                 new OverpassDownloadReader(area, OverpassDownloadReader.OVERPASS_SERVER.get(), data.getQuery()),
-                settings.asNewLayer(), area, null);
+                new DownloadParams().withNewLayer(settings.asNewLayer()), area, null);
         MainApplication.worker.submit(new PostDownloadHandler(task, future, data.getErrorReporter()));
     }
Index: /trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java	(revision 13927)
@@ -40,12 +40,12 @@
                 // As of 2015-04, Overpass Turbo requires this branch of code ...
                 Logging.debug("Remote control, /import: defaulting to DownloadOsmTask");
-                new DownloadOsmTask().loadUrl(isLoadInNewLayer(), url.toExternalForm(), null);
+                new DownloadOsmTask().loadUrl(getDownloadParams(), url.toExternalForm(), null);
             } else if (Config.getPref().getBoolean("remotecontrol.import.interactive", true)) {
                 // OpenLocationAction queries the user if more than one task is suitable
-                MainApplication.getMenu().openLocation.openUrl(isLoadInNewLayer(), url.toExternalForm());
+                MainApplication.getMenu().openLocation.openUrl(getDownloadParams(), url.toExternalForm());
             } else {
                 // Otherwise perform all tasks
                 for (DownloadTask task : suitableDownloadTasks) {
-                    task.loadUrl(isLoadInNewLayer(), url.toExternalForm(), null);
+                    task.loadUrl(getDownloadParams(), url.toExternalForm(), null);
                 }
             }
@@ -64,5 +64,5 @@
     @Override
     public String[] getOptionalParams() {
-        return new String[] {"new_layer"};
+        return new String[] {"new_layer", "layer_name"};
     }
 
@@ -74,5 +74,6 @@
     @Override
     public String[] getUsageExamples() {
-        return new String[] {"/import?url="+Main.getJOSMWebsite()+"/browser/josm/trunk/data_nodist/direction-arrows.osm"};
+        return new String[] {"/import?url=" + Utils.encodeUrl(
+                Main.getJOSMWebsite()+"/browser/josm/trunk/data_nodist/direction-arrows.osm?format=txt")};
     }
 
Index: /trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java	(revision 13927)
@@ -16,4 +16,5 @@
 import org.openstreetmap.josm.actions.AutoScaleAction;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
+import org.openstreetmap.josm.actions.downloadtasks.DownloadParams;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadTask;
 import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
@@ -112,11 +113,7 @@
     @Override
     protected void handleRequest() throws RequestHandlerErrorException {
-        DownloadTask osmTask = new DownloadOsmTask() {
-            {
-                newLayerName = args.get("layer_name");
-            }
-        };
+        DownloadTask osmTask = new DownloadOsmTask();
         try {
-            boolean newLayer = isLoadInNewLayer();
+            DownloadParams settings = getDownloadParams();
 
             if (command.equals(myCommand)) {
@@ -125,5 +122,5 @@
                 } else {
                     Area toDownload = null;
-                    if (!newLayer) {
+                    if (!settings.isNewLayer()) {
                         // find out whether some data has already been downloaded
                         Area present = null;
@@ -148,5 +145,5 @@
                         Logging.info("RemoteControl: no download necessary");
                     } else {
-                        Future<?> future = osmTask.download(newLayer, new Bounds(minlat, minlon, maxlat, maxlon),
+                        Future<?> future = osmTask.download(settings, new Bounds(minlat, minlon, maxlat, maxlon),
                                 null /* let the task manage the progress monitor */);
                         MainApplication.worker.submit(new PostDownloadHandler(osmTask, future));
Index: /trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadDataHandler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadDataHandler.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadDataHandler.java	(revision 13927)
@@ -8,4 +8,5 @@
 
 import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
+import org.openstreetmap.josm.actions.downloadtasks.DownloadParams;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -40,5 +41,5 @@
     @Override
     protected void handleRequest() throws RequestHandlerErrorException {
-        MainApplication.worker.submit(new LoadDataTask(isLoadInNewLayer(), dataSet, args.get("layer_name")));
+        MainApplication.worker.submit(new LoadDataTask(getDownloadParams(), dataSet, args.get("layer_name")));
     }
 
@@ -103,10 +104,11 @@
         /**
          * Constructs a new {@code LoadDataTask}.
-         * @param newLayer if {@code true}, force download to a new layer
+         * @param settings download settings
          * @param dataSet data set
          * @param layerName layer name
+         * @since 13927
          */
-        public LoadDataTask(boolean newLayer, DataSet dataSet, String layerName) {
-            super(newLayer, tr("Loading data"), false, true);
+        public LoadDataTask(DownloadParams settings, DataSet dataSet, String layerName) {
+            super(settings, tr("Loading data"), false, true);
             this.dataSet = dataSet;
             this.layerName = layerName;
Index: /trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java	(revision 13927)
@@ -63,5 +63,5 @@
         }
         if (!ps.isEmpty()) {
-            final boolean newLayer = isLoadInNewLayer();
+            final boolean newLayer = getDownloadParams().isNewLayer();
             final boolean relationMembers = Boolean.parseBoolean(args.get("relation_members"));
             final boolean referrers = Boolean.parseBoolean(args.get("referrers"));
Index: /trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java	(revision 13926)
+++ /trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java	(revision 13927)
@@ -20,4 +20,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.downloadtasks.DownloadParams;
 import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
 import org.openstreetmap.josm.spi.preferences.Config;
@@ -298,8 +299,14 @@
     }
 
-    protected boolean isLoadInNewLayer() {
+    private boolean isLoadInNewLayer() {
         return args.get("new_layer") != null && !args.get("new_layer").isEmpty()
                 ? Boolean.parseBoolean(args.get("new_layer"))
                 : Config.getPref().getBoolean(loadInNewLayerKey, loadInNewLayerDefault);
+    }
+
+    protected DownloadParams getDownloadParams() {
+        return new DownloadParams()
+                .withNewLayer(isLoadInNewLayer())
+                .withLayerName(args.get("layer_name"));
     }
 
Index: /trunk/test/unit/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTaskTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTaskTest.java	(revision 13926)
+++ /trunk/test/unit/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTaskTest.java	(revision 13927)
@@ -45,5 +45,5 @@
         mockHttp();
         DownloadGpsTask task = new DownloadGpsTask();
-        task.loadUrl(false, getRemoteFileUrl(), null).get();
+        task.loadUrl(new DownloadParams(), getRemoteFileUrl(), null).get();
         GpxData data = task.getDownloadedData();
         assertNotNull(data);
Index: /trunk/test/unit/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesTaskTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesTaskTest.java	(revision 13926)
+++ /trunk/test/unit/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesTaskTest.java	(revision 13927)
@@ -40,5 +40,5 @@
         mockHttp();
         DownloadNotesTask task = new DownloadNotesTask();
-        task.loadUrl(false, getRemoteFileUrl(), null).get();
+        task.loadUrl(new DownloadParams(), getRemoteFileUrl(), null).get();
         NoteData data = task.getDownloadedData();
         assertNotNull(data);
Index: /trunk/test/unit/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTaskTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTaskTest.java	(revision 13926)
+++ /trunk/test/unit/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTaskTest.java	(revision 13927)
@@ -42,5 +42,5 @@
         mockHttp();
         DownloadOsmTask task = new DownloadOsmTask();
-        task.loadUrl(false, getRemoteFileUrl(), null).get();
+        task.loadUrl(new DownloadParams(), getRemoteFileUrl(), null).get();
         DataSet ds = task.getDownloadedData();
         assertNotNull(ds);
Index: /trunk/test/unit/org/openstreetmap/josm/actions/downloadtasks/PostDownloadHandlerTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/actions/downloadtasks/PostDownloadHandlerTest.java	(revision 13926)
+++ /trunk/test/unit/org/openstreetmap/josm/actions/downloadtasks/PostDownloadHandlerTest.java	(revision 13927)
@@ -37,5 +37,5 @@
         return new DownloadTask() {
             @Override
-            public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
+            public Future<?> loadUrl(DownloadParams settings, String url, ProgressMonitor progressMonitor) {
                 return null;
             }
@@ -62,5 +62,5 @@
 
             @Override
-            public Future<?> download(boolean newLayer, Bounds downloadArea, ProgressMonitor progressMonitor) {
+            public Future<?> download(DownloadParams settings, Bounds downloadArea, ProgressMonitor progressMonitor) {
                 return null;
             }
