Index: trunk/src/org/openstreetmap/josm/actions/OpenLocationAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/OpenLocationAction.java	(revision 6802)
+++ trunk/src/org/openstreetmap/josm/actions/OpenLocationAction.java	(revision 6803)
@@ -184,5 +184,6 @@
             // TODO: handle multiple suitable tasks ?
             try {
-                future = tasks.iterator().next().loadUrl(new_layer, url, monitor);
+                task = tasks.iterator().next();
+                future = task.loadUrl(new_layer, url, monitor);
             } catch (IllegalArgumentException e) {
                 Main.error(e);
Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java	(revision 6802)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java	(revision 6803)
@@ -59,5 +59,5 @@
     public Future<?> download(boolean newLayer, Bounds downloadArea, ProgressMonitor progressMonitor) {
         downloadTask = new DownloadTask(newLayer,
-                new BoundingBoxDownloader(downloadArea), progressMonitor, false);
+                new BoundingBoxDownloader(downloadArea), progressMonitor);
         // 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.
@@ -70,5 +70,5 @@
         if (url.matches(PATTERN_TRACE_ID) || url.matches(PATTERN_EXTERNAL_GPX_SCRIPT) || url.matches(PATTERN_EXTERNAL_GPX_FILE)) {
             downloadTask = new DownloadTask(newLayer,
-                    new OsmServerLocationReader(url), progressMonitor, url.matches(PATTERN_TRACE_ID));
+                    new OsmServerLocationReader(url), progressMonitor);
             // Extract .gpx filename from URL to set the new layer name
             Matcher matcher = Pattern.compile(PATTERN_EXTERNAL_GPX_FILE).matcher(url);
@@ -99,11 +99,9 @@
         private GpxData rawData;
         private final boolean newLayer;
-        private final boolean compressed;
-
-        public DownloadTask(boolean newLayer, OsmServerReader reader, ProgressMonitor progressMonitor, boolean compressed) {
+
+        public DownloadTask(boolean newLayer, OsmServerReader reader, ProgressMonitor progressMonitor) {
             super(tr("Downloading GPS data"));
             this.reader = reader;
             this.newLayer = newLayer;
-            this.compressed = compressed;
         }
 
@@ -113,9 +111,5 @@
                     return;
                 ProgressMonitor subMonitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
-                if (compressed) {
-                    rawData = reader.parseRawGpsBzip2(subMonitor);
-                } else {
-                    rawData = reader.parseRawGps(subMonitor);
-                }
+                rawData = reader.parseRawGps(subMonitor);
             } catch(Exception e) {
                 if (isCanceled())
Index: trunk/src/org/openstreetmap/josm/io/OsmServerLocationReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmServerLocationReader.java	(revision 6802)
+++ trunk/src/org/openstreetmap/josm/io/OsmServerLocationReader.java	(revision 6803)
@@ -138,5 +138,5 @@
         @Override
         public GpxData parse() throws OsmTransferException, IllegalDataException, IOException, SAXException {
-            in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(1, true));
+            in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(1, true), null, true);
             if (in == null)
                 return null;
Index: trunk/src/org/openstreetmap/josm/io/OsmServerReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmServerReader.java	(revision 6802)
+++ trunk/src/org/openstreetmap/josm/io/OsmServerReader.java	(revision 6803)
@@ -11,4 +11,6 @@
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.List;
+import java.util.Map;
 import java.util.zip.GZIPInputStream;
 import java.util.zip.Inflater;
@@ -98,4 +100,19 @@
      */
     protected InputStream getInputStreamRaw(String urlStr, ProgressMonitor progressMonitor, String reason) throws OsmTransferException {
+        return getInputStreamRaw(urlStr, progressMonitor, reason, false);
+    }
+
+    /**
+     * Open a connection to the given url and return a reader on the input stream
+     * from that connection. In case of user cancel, return <code>null</code>.
+     * @param urlStr The exact url to connect to.
+     * @param progressMonitor progress monitoring and abort handler
+     * @param reason The reason to show on console. Can be {@code null} if no reason is given
+     * @param uncompressAccordingToContentDisposition Whether to inspect the HTTP header {@code Content-Disposition}
+     *                                                for {@code filename} and uncompress a gzip/bzip2 stream.
+     * @return An reader reading the input stream (servers answer) or <code>null</code>.
+     * @throws OsmTransferException thrown if data transfer errors occur
+     */
+    protected InputStream getInputStreamRaw(String urlStr, ProgressMonitor progressMonitor, String reason, boolean uncompressAccordingToContentDisposition) throws OsmTransferException {
         try {
             URL url = null;
@@ -141,4 +158,5 @@
             }
             try {
+                Main.debug(activeConnection.getHeaderFields().toString());
                 if (activeConnection.getResponseCode() == HttpURLConnection.HTTP_UNAUTHORIZED)
                     throw new OsmApiException(HttpURLConnection.HTTP_UNAUTHORIZED,null,null);
@@ -169,5 +187,9 @@
                 }
 
-                return fixEncoding(new ProgressInputStream(activeConnection, progressMonitor), encoding);
+                InputStream in = new ProgressInputStream(activeConnection, progressMonitor);
+                if (uncompressAccordingToContentDisposition) {
+                    in = uncompressAccordingToContentDisposition(in, activeConnection.getHeaderFields());
+                }
+                return fixEncoding(in, encoding);
             } catch (OsmTransferException e) {
                 throw e;
@@ -189,4 +211,14 @@
     }
 
+    private InputStream uncompressAccordingToContentDisposition(InputStream stream, Map<String, List<String>> headerFields) throws IOException {
+        if (headerFields.get("Content-Disposition").toString().contains(".gz\"")) {
+            return Compression.GZIP.getUncompressedInputStream(stream);
+        } else if (headerFields.get("Content-Disposition").toString().contains(".bz2\"")) {
+            return Compression.BZIP2.getUncompressedInputStream(stream);
+        } else {
+            return stream;
+        }
+    }
+
     /**
      * Download OSM files from somewhere
