Index: src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java
===================================================================
--- src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java	(revision 15644)
+++ src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java	(working copy)
@@ -15,6 +15,7 @@
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.Bounds.ParseMethod;
 import org.openstreetmap.josm.data.ProjectionBounds;
+import org.openstreetmap.josm.data.gpx.GpxConstants;
 import org.openstreetmap.josm.data.gpx.GpxData;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
@@ -43,7 +44,7 @@
     private DownloadTask downloadTask;
     private GpxLayer gpxLayer;
 
-    protected String newLayerName;
+    protected String url;
 
     @Override
     public String[] getPatterns() {
@@ -67,6 +68,7 @@
     @Override
     public Future<?> loadUrl(DownloadParams settings, String url, ProgressMonitor progressMonitor) {
         CheckParameterUtil.ensureParameterNotNull(url, "url");
+        this.url = url;
         final Optional<String> mappedUrl = Stream.of(GpxUrlPattern.USER_TRACE_ID, GpxUrlPattern.EDIT_TRACE_ID)
                 .map(p -> Pattern.compile(p.pattern()).matcher(url))
                 .filter(Matcher::matches)
@@ -80,9 +82,6 @@
                 .anyMatch(p -> url.matches(p.pattern()))) {
             downloadTask = new DownloadTask(settings,
                     new OsmServerLocationReader(url), progressMonitor);
-            // Extract .gpx filename from URL to set the new layer name
-            Matcher matcher = Pattern.compile(GpxUrlPattern.EXTERNAL_GPX_FILE.pattern()).matcher(url);
-            newLayerName = matcher.matches() ? matcher.group(1) : null;
             // 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.
             return MainApplication.worker.submit(downloadTask);
@@ -138,7 +137,7 @@
             rememberDownloadedData(rawData);
             if (rawData == null)
                 return;
-            String name = newLayerName != null ? newLayerName : tr("Downloaded GPX Data");
+            String name = getLayerName();
 
             GpxImporterData layers = GpxImporter.loadLayers(rawData, reader.isGpxParsedProperly(), name,
                     tr("Markers from {0}", name));
@@ -150,6 +149,34 @@
             layers.getPostLayerTask().run();
         }
 
+        private String getLayerName() {
+            final String name;
+            // Extract .gpx filename from URL to set the new layer name
+            Matcher matcher = Pattern.compile(GpxUrlPattern.EXTERNAL_GPX_FILE.pattern()).matcher(url);
+            final String newLayerName = matcher.matches() ? matcher.group(1) : null;
+
+            if (Config.getPref().getBoolean("gpx.prefermetadataname", false)) {
+                if (rawData != null && rawData.getString(GpxConstants.META_NAME) != null
+                        && !rawData.getString(GpxConstants.META_NAME).trim().isEmpty()) {
+                    name = rawData.getString(GpxConstants.META_NAME);
+                } else if (newLayerName != null) {
+                    name = newLayerName;
+                } else {
+                    name = tr("Downloaded GPX Data");
+                }
+            } else {
+                if (newLayerName != null) {
+                    name = newLayerName;
+                } else if (rawData != null && rawData.getString(GpxConstants.META_NAME) != null
+                        && !rawData.getString(GpxConstants.META_NAME).trim().isEmpty()) {
+                    name = rawData.getString(GpxConstants.META_NAME);
+                } else {
+                    name = tr("Downloaded GPX Data");
+                }
+            }
+            return name;
+        }
+
         private <L extends Layer> L addOrMergeLayer(L layer, L mergeLayer) {
             if (layer == null) return null;
             if (newLayer || mergeLayer == null) {
Index: src/org/openstreetmap/josm/gui/layer/GpxLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 15644)
+++ src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(working copy)
@@ -106,12 +106,11 @@
      * @param isLocal whether data is attached to a local file
      */
     public GpxLayer(GpxData d, String name, boolean isLocal) {
-        super(d.getString(GpxConstants.META_NAME));
+        super(name);
         data = d;
         data.addWeakChangeListener(dataChangeListener);
         trackVisibility = new boolean[data.getTracks().size()];
         Arrays.fill(trackVisibility, true);
-        setName(name);
         isLocalFile = isLocal;
         ExpertToggleAction.addExpertModeChangeListener(this, true);
     }
