Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java	(revision 6243)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java	(revision 6244)
@@ -27,4 +27,5 @@
 import org.openstreetmap.josm.io.OsmServerReader;
 import org.openstreetmap.josm.io.OsmTransferException;
+import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.xml.sax.SAXException;
 
@@ -36,5 +37,5 @@
     private DownloadTask downloadTask;
 
-    private static final String PATTERN_TRACE_ID = "http://.*openstreetmap.org/trace/\\p{Digit}+/data";
+    private static final String PATTERN_TRACE_ID = "http://.*(osm|openstreetmap).org/trace/\\p{Digit}+/data";
 
     private static final String PATTERN_TRACKPOINTS_BBOX = "http://.*/api/0.6/trackpoints\\?bbox=.*,.*,.*,.*";
@@ -58,5 +59,5 @@
     public Future<?> download(boolean newLayer, Bounds downloadArea, ProgressMonitor progressMonitor) {
         downloadTask = new DownloadTask(newLayer,
-                new BoundingBoxDownloader(downloadArea), progressMonitor);
+                new BoundingBoxDownloader(downloadArea), progressMonitor, false);
         // 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.
@@ -66,7 +67,8 @@
     @Override
     public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
-        if (url != null && (url.matches(PATTERN_TRACE_ID) || url.matches(PATTERN_EXTERNAL_GPX_SCRIPT) || url.matches(PATTERN_EXTERNAL_GPX_FILE))) {
+        CheckParameterUtil.ensureParameterNotNull(url, "url");
+        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);
+                    new OsmServerLocationReader(url), progressMonitor, url.matches(PATTERN_TRACE_ID));
             // Extract .gpx filename from URL to set the new layer name
             Matcher matcher = Pattern.compile(PATTERN_EXTERNAL_GPX_FILE).matcher(url);
@@ -76,5 +78,5 @@
             return Main.worker.submit(downloadTask);
 
-        } else if (url != null && url.matches(PATTERN_TRACKPOINTS_BBOX)) {
+        } else if (url.matches(PATTERN_TRACKPOINTS_BBOX)) {
             String[] table = url.split("\\?|=|&");
             for (int i = 0; i<table.length; i++) {
@@ -97,9 +99,11 @@
         private GpxData rawData;
         private final boolean newLayer;
-
-        public DownloadTask(boolean newLayer, OsmServerReader reader, ProgressMonitor progressMonitor) {
+        private final boolean compressed;
+
+        public DownloadTask(boolean newLayer, OsmServerReader reader, ProgressMonitor progressMonitor, boolean compressed) {
             super(tr("Downloading GPS data"));
             this.reader = reader;
             this.newLayer = newLayer;
+            this.compressed = compressed;
         }
 
@@ -108,5 +112,10 @@
                 if (isCanceled())
                     return;
-                rawData = reader.parseRawGps(progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
+                ProgressMonitor subMonitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
+                if (compressed) {
+                    rawData = reader.parseRawGpsBzip2(subMonitor);
+                } else {
+                    rawData = reader.parseRawGps(subMonitor);
+                }
             } catch(Exception e) {
                 if (isCanceled())
Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmUrlTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmUrlTask.java	(revision 6243)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmUrlTask.java	(revision 6244)
@@ -22,5 +22,7 @@
     @Override
     public String[] getPatterns() {
-        return new String[]{"http://www\\.openstreetmap\\.org/\\?lat=.*&lon=.*"};
+        return new String[]{
+                "http://www\\.(osm|openstreetmap)\\.org/\\?lat=.*&lon=.*",
+                "http://www\\.(osm|openstreetmap)\\.org/#map=\\p{Digit}+/.*/.*"};
     }
 
Index: trunk/src/org/openstreetmap/josm/io/BoundingBoxDownloader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/BoundingBoxDownloader.java	(revision 6243)
+++ trunk/src/org/openstreetmap/josm/io/BoundingBoxDownloader.java	(revision 6244)
@@ -14,4 +14,8 @@
 import org.xml.sax.SAXException;
 
+/**
+ * Read content from OSM server for a given bounding box
+ * @since 627
+ */
 public class BoundingBoxDownloader extends OsmServerReader {
 
@@ -25,4 +29,8 @@
     protected final boolean crosses180th;
 
+    /**
+     * Constructs a new {@code BoundingBoxDownloader}.
+     * @param downloadArea The area to download
+     */
     public BoundingBoxDownloader(Bounds downloadArea) {
         this.lat1 = downloadArea.getMinLat();
@@ -60,10 +68,4 @@
     }
 
-    /**
-     * Retrieve raw gps waypoints from the server API.
-     * @return A list of all primitives retrieved. Currently, the list of lists
-     *      contain only one list, since the server cannot distinguish between
-     *      ways.
-     */
     @Override
     public GpxData parseRawGps(ProgressMonitor progressMonitor) throws OsmTransferException {
@@ -106,8 +108,4 @@
     }
 
-    /**
-     * Read the data from the osm server address.
-     * @return A data set containing all data retrieved from that url
-     */
     @Override
     public DataSet parseOsm(ProgressMonitor progressMonitor) throws OsmTransferException {
Index: trunk/src/org/openstreetmap/josm/io/OsmServerLocationReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmServerLocationReader.java	(revision 6243)
+++ trunk/src/org/openstreetmap/josm/io/OsmServerLocationReader.java	(revision 6244)
@@ -6,7 +6,5 @@
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.zip.GZIPInputStream;
 
-import org.apache.tools.bzip2.CBZip2InputStream;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadGpsTask;
 import org.openstreetmap.josm.data.gpx.GpxData;
@@ -16,8 +14,16 @@
 import org.xml.sax.SAXException;
 
+/**
+ * Read content from OSM server for a given URL
+ * @since 1146
+ */
 public class OsmServerLocationReader extends OsmServerReader {
 
     protected final String url;
 
+    /**
+     * Constructs a new {@code OsmServerLocationReader}.
+     * @param url The URL to fetch
+     */
     public OsmServerLocationReader(String url) {
         this.url = url;
@@ -25,5 +31,22 @@
 
     protected abstract class Parser<T> {
-        public InputStream in = null;
+        protected final ProgressMonitor progressMonitor;
+        protected final Compression compression;
+        protected InputStream in = null;
+
+        public Parser(ProgressMonitor progressMonitor, Compression compression) {
+            this.progressMonitor = progressMonitor;
+            this.compression = compression;
+        }
+        
+        protected final InputStream getUncompressedInputStream() throws IOException {
+            switch (compression) {
+                case BZIP2: return FileImporter.getBZip2InputStream(in);
+                case GZIP: return FileImporter.getGZipInputStream(in);
+                case NONE: 
+                default: return in;
+            }
+        }
+        
         public abstract T parse() throws OsmTransferException, IllegalDataException, IOException, SAXException;
     }
@@ -47,127 +70,91 @@
     }
 
-    /**
-     * Method to download OSM files from somewhere
-     */
     @Override
     public DataSet parseOsm(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        return doParse(new Parser<DataSet>() {
-            @Override
-            public DataSet parse() throws OsmTransferException, IllegalDataException {
-                in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(9, false));
-                if (in == null)
-                    return null;
-                progressMonitor.subTask(tr("Downloading OSM data..."));
-                return OsmReader.parseDataSet(in, progressMonitor.createSubTaskMonitor(1, false));
-            }
-        }, progressMonitor);
+        return doParse(new OsmParser(progressMonitor, Compression.NONE), progressMonitor);
     }
 
-    /**
-     * Method to download BZip2-compressed OSM files from somewhere
-     */
     @Override
     public DataSet parseOsmBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        return doParse(new Parser<DataSet>() {
-            @Override
-            public DataSet parse() throws OsmTransferException, IllegalDataException, IOException {
-                in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(9, false));
-                if (in == null)
-                    return null;
-                CBZip2InputStream bzin = FileImporter.getBZip2InputStream(in);
-                progressMonitor.subTask(tr("Downloading OSM data..."));
-                return OsmReader.parseDataSet(bzin, progressMonitor.createSubTaskMonitor(1, false));
-            }
-        }, progressMonitor);
+        return doParse(new OsmParser(progressMonitor, Compression.BZIP2), progressMonitor);
     }
 
-    /**
-     * Method to download GZip-compressed OSM files from somewhere
-     */
     @Override
     public DataSet parseOsmGzip(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        return doParse(new Parser<DataSet>() {
-            @Override
-            public DataSet parse() throws OsmTransferException, IllegalDataException, IOException {
-                in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(9, false));
-                if (in == null)
-                    return null;
-                GZIPInputStream gzin = FileImporter.getGZipInputStream(in);
-                progressMonitor.subTask(tr("Downloading OSM data..."));
-                return OsmReader.parseDataSet(gzin, progressMonitor.createSubTaskMonitor(1, false));
-            }
-        }, progressMonitor);
+        return doParse(new OsmParser(progressMonitor, Compression.GZIP), progressMonitor);
     }
 
-    /* (non-Javadoc)
-     * @see org.openstreetmap.josm.io.OsmServerReader#parseOsmChange(org.openstreetmap.josm.gui.progress.ProgressMonitor)
-     */
     @Override
-    public DataSet parseOsmChange(final ProgressMonitor progressMonitor)
-            throws OsmTransferException {
-        return doParse(new Parser<DataSet>() {
-            @Override
-            public DataSet parse() throws OsmTransferException, IllegalDataException {
-                in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(9, false));
-                if (in == null)
-                    return null;
-                progressMonitor.subTask(tr("Downloading OSM data..."));
-                return OsmChangeReader.parseDataSet(in, progressMonitor.createSubTaskMonitor(1, false));
-            }
-        }, progressMonitor);
+    public DataSet parseOsmChange(final ProgressMonitor progressMonitor) throws OsmTransferException {
+        return doParse(new OsmChangeParser(progressMonitor, Compression.NONE), progressMonitor);
     }
 
-    /**
-     * Method to download BZip2-compressed OSM Change files from somewhere
-     */
     @Override
     public DataSet parseOsmChangeBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        return doParse(new Parser<DataSet>() {
-            @Override
-            public DataSet parse() throws OsmTransferException, IllegalDataException, IOException {
-                in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(9, false));
-                if (in == null)
-                    return null;
-                CBZip2InputStream bzin = FileImporter.getBZip2InputStream(in);
-                progressMonitor.subTask(tr("Downloading OSM data..."));
-                return OsmChangeReader.parseDataSet(bzin, progressMonitor.createSubTaskMonitor(1, false));
-            }
-        }, progressMonitor);
+        return doParse(new OsmChangeParser(progressMonitor, Compression.BZIP2), progressMonitor);
     }
 
-    /**
-     * Method to download GZip-compressed OSM Change files from somewhere
-     */
     @Override
     public DataSet parseOsmChangeGzip(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        return doParse(new Parser<DataSet>() {
-            @Override
-            public DataSet parse() throws OsmTransferException, IllegalDataException, IOException {
-                in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(9, false));
-                if (in == null)
-                    return null;
-                GZIPInputStream gzin = FileImporter.getGZipInputStream(in);
-                progressMonitor.subTask(tr("Downloading OSM data..."));
-                return OsmChangeReader.parseDataSet(gzin, progressMonitor.createSubTaskMonitor(1, false));
-            }
-        }, progressMonitor);
+        return doParse(new OsmChangeParser(progressMonitor, Compression.GZIP), progressMonitor);
     }
 
     @Override
     public GpxData parseRawGps(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        return doParse(new Parser<GpxData>() {
-            @Override
-            public GpxData parse() throws OsmTransferException, IllegalDataException, IOException, SAXException {
-                in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(1, true));
-                if (in == null)
-                    return null;
-                progressMonitor.subTask(tr("Downloading OSM data..."));
-                GpxReader reader = new GpxReader(in);
-                gpxParsedProperly = reader.parse(false);
-                GpxData result = reader.getGpxData();
-                result.fromServer = DownloadGpsTask.isFromServer(url);
-                return result;
-            }
-        }, progressMonitor);
+        return doParse(new GpxParser(progressMonitor, Compression.NONE), progressMonitor);
+    }
+
+    @Override
+    public GpxData parseRawGpsBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
+        return doParse(new GpxParser(progressMonitor, Compression.BZIP2), progressMonitor);
+    }
+
+    protected class OsmParser extends Parser<DataSet> {
+        protected OsmParser(ProgressMonitor progressMonitor, Compression compression) {
+            super(progressMonitor, compression);
+        }
+
+        @Override
+        public DataSet parse() throws OsmTransferException, IllegalDataException, IOException {
+            in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(9, false));
+            if (in == null)
+                return null;
+            progressMonitor.subTask(tr("Downloading OSM data..."));
+            return OsmReader.parseDataSet(getUncompressedInputStream(), progressMonitor.createSubTaskMonitor(1, false));
+        }
+    }
+    
+    protected class OsmChangeParser extends Parser<DataSet> {
+        protected OsmChangeParser(ProgressMonitor progressMonitor, Compression compression) {
+            super(progressMonitor, compression);
+        }
+
+        @Override
+        public DataSet parse() throws OsmTransferException, IllegalDataException, IOException {
+            in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(9, false));
+            if (in == null)
+                return null;
+            progressMonitor.subTask(tr("Downloading OSM data..."));
+            return OsmChangeReader.parseDataSet(getUncompressedInputStream(), progressMonitor.createSubTaskMonitor(1, false));
+        }
+    }
+
+    protected class GpxParser extends Parser<GpxData> {
+        protected GpxParser(ProgressMonitor progressMonitor, Compression compression) {
+            super(progressMonitor, compression);
+        }
+        
+        @Override
+        public GpxData parse() throws OsmTransferException, IllegalDataException, IOException, SAXException {
+            in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(1, true));
+            if (in == null)
+                return null;
+            progressMonitor.subTask(tr("Downloading OSM data..."));
+            GpxReader reader = new GpxReader(getUncompressedInputStream());
+            gpxParsedProperly = reader.parse(false);
+            GpxData result = reader.getGpxData();
+            result.fromServer = DownloadGpsTask.isFromServer(url);
+            return result;
+        }
     }
 }
Index: trunk/src/org/openstreetmap/josm/io/OsmServerReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmServerReader.java	(revision 6243)
+++ trunk/src/org/openstreetmap/josm/io/OsmServerReader.java	(revision 6244)
@@ -34,4 +34,10 @@
     private boolean doAuthenticate = false;
     protected boolean gpxParsedProperly;
+    
+    protected enum Compression {
+        NONE,
+        BZIP2,
+        GZIP
+    }
 
     /**
@@ -162,26 +168,79 @@
     }
 
+    /**
+     * Download OSM files from somewhere
+     * @param progressMonitor The progress monitor
+     * @return The corresponding dataset
+     * @throws OsmTransferException if any error occurs 
+     */
     public abstract DataSet parseOsm(final ProgressMonitor progressMonitor) throws OsmTransferException;
 
+    /**
+     * Download OSM Change files from somewhere
+     * @param progressMonitor The progress monitor
+     * @return The corresponding dataset
+     * @throws OsmTransferException if any error occurs 
+     */
     public DataSet parseOsmChange(final ProgressMonitor progressMonitor) throws OsmTransferException {
         return null;
     }
 
+    /**
+     * Download BZip2-compressed OSM Change files from somewhere
+     * @param progressMonitor The progress monitor
+     * @return The corresponding dataset
+     * @throws OsmTransferException if any error occurs 
+     */
     public DataSet parseOsmChangeBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
         return null;
     }
 
+    /**
+     * Download GZip-compressed OSM Change files from somewhere
+     * @param progressMonitor The progress monitor
+     * @return The corresponding dataset
+     * @throws OsmTransferException if any error occurs 
+     */
     public DataSet parseOsmChangeGzip(final ProgressMonitor progressMonitor) throws OsmTransferException {
         return null;
     }
 
+    /**
+     * Retrieve raw gps waypoints from the server API.
+     * @param progressMonitor The progress monitor
+     * @return The corresponding GPX tracks
+     * @throws OsmTransferException if any error occurs
+     */
     public GpxData parseRawGps(final ProgressMonitor progressMonitor) throws OsmTransferException {
         return null;
     }
 
+    /**
+     * Retrieve BZip2-compressed GPX files from somewhere.
+     * @param progressMonitor The progress monitor
+     * @return The corresponding GPX tracks
+     * @throws OsmTransferException if any error occurs
+     * @since 6244
+     */
+    public GpxData parseRawGpsBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
+        return null;
+    }
+
+    /**
+     * Download BZip2-compressed OSM files from somewhere
+     * @param progressMonitor The progress monitor
+     * @return The corresponding dataset
+     * @throws OsmTransferException if any error occurs 
+     */
     public DataSet parseOsmBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
         return null;
     }
 
+    /**
+     * Download GZip-compressed OSM files from somewhere
+     * @param progressMonitor The progress monitor
+     * @return The corresponding dataset
+     * @throws OsmTransferException if any error occurs 
+     */
     public DataSet parseOsmGzip(final ProgressMonitor progressMonitor) throws OsmTransferException {
         return null;
