Index: trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(revision 13350)
+++ trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(revision 13352)
@@ -103,4 +103,5 @@
                 org.openstreetmap.josm.gui.io.importexport.OsmGzipExporter.class,
                 org.openstreetmap.josm.gui.io.importexport.OsmBzip2Exporter.class,
+                org.openstreetmap.josm.gui.io.importexport.OsmXzExporter.class,
                 org.openstreetmap.josm.gui.io.importexport.GeoJSONExporter.class,
                 org.openstreetmap.josm.gui.io.importexport.WMSLayerExporter.class,
Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesTask.java	(revision 13350)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesTask.java	(revision 13352)
@@ -27,4 +27,5 @@
 import org.openstreetmap.josm.io.BoundingBoxDownloader;
 import org.openstreetmap.josm.io.BoundingBoxDownloader.MoreNotesException;
+import org.openstreetmap.josm.io.Compression;
 import org.openstreetmap.josm.io.OsmApi;
 import org.openstreetmap.josm.io.OsmServerLocationReader;
@@ -47,4 +48,6 @@
     /** Property defining number of days a bug needs to be closed to no longer be downloaded */
     public static final IntegerProperty DAYS_CLOSED = new IntegerProperty("osm.notes.daysClosed", 7);
+
+    private static final String PATTERN_COMPRESS = "https?://.*/(.*\\.osn.(gz|xz|bz2?|zip))";
 
     private DownloadTask downloadTask;
@@ -71,6 +74,6 @@
     @Override
     public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
-        if (url.endsWith(".bz2")) {
-            downloadTask = new DownloadBzip2RawUrlTask(new OsmServerLocationReader(url), progressMonitor);
+        if (url.matches(PATTERN_COMPRESS)) {
+            downloadTask = new DownloadCompressedRawUrlTask(new OsmServerLocationReader(url), progressMonitor, Compression.byExtension(url));
         } else {
             downloadTask = new DownloadRawUrlTask(new OsmServerLocationReader(url), progressMonitor);
@@ -210,8 +213,11 @@
     }
 
-    class DownloadBzip2RawUrlTask extends DownloadTask {
-
-        DownloadBzip2RawUrlTask(OsmServerReader reader, ProgressMonitor progressMonitor) {
+    class DownloadCompressedRawUrlTask extends DownloadTask {
+
+        private final Compression compression;
+
+        DownloadCompressedRawUrlTask(OsmServerReader reader, ProgressMonitor progressMonitor, Compression compression) {
             super(reader, progressMonitor);
+            this.compression = compression;
         }
 
@@ -223,5 +229,5 @@
             ProgressMonitor subMonitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
             try {
-                notesData = reader.parseRawNotesBzip2(subMonitor);
+                notesData = reader.parseRawNotes(subMonitor, compression);
             } catch (OsmTransferException e) {
                 if (isCanceled())
Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeCompressedTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeCompressedTask.java	(revision 13350)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeCompressedTask.java	(revision 13352)
@@ -9,16 +9,19 @@
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.io.Compression;
 import org.openstreetmap.josm.io.OsmServerLocationReader;
 import org.openstreetmap.josm.io.OsmTransferException;
 
 /**
- * Task allowing to download compressed OSM-Change files (gzip and bzip2)
+ * Task allowing to download compressed OSM-Change files (gzip, xz and bzip2)
  * @since 5361
  */
 public class DownloadOsmChangeCompressedTask extends DownloadOsmChangeTask {
 
+    private static final String PATTERN_COMPRESS = "https?://.*/(.*\\.osc.(gz|xz|bz2?|zip))";
+
     @Override
     public String[] getPatterns() {
-        return new String[]{"https?://.*/.*\\.osc.(gz|bz2?)"};
+        return new String[]{PATTERN_COMPRESS};
     }
 
@@ -40,14 +43,10 @@
             protected DataSet parseDataSet() throws OsmTransferException {
                 ProgressMonitor subTaskMonitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
-                if (url.matches("https?://.*/.*\\.osc.bz2?")) {
-                    return reader.parseOsmChangeBzip2(subTaskMonitor);
-                } else {
-                    return reader.parseOsmChangeGzip(subTaskMonitor);
-                }
+                return reader.parseOsmChange(subTaskMonitor, Compression.byExtension(url));
             }
         };
         currentBounds = null;
-        // Extract .osc.gz/bz/bz2 filename from URL to set the new layer name
-        extractOsmFilename("https?://.*/(.*\\.osc.(gz|bz2?))", url);
+        // Extract .osc.gz/xz/bz/bz2/zip filename from URL to set the new layer name
+        extractOsmFilename(PATTERN_COMPRESS, url);
         return MainApplication.worker.submit(downloadTask);
     }
Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmCompressedTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmCompressedTask.java	(revision 13350)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmCompressedTask.java	(revision 13352)
@@ -10,14 +10,15 @@
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.io.Compression;
 import org.openstreetmap.josm.io.OsmServerLocationReader;
 import org.openstreetmap.josm.io.OsmTransferException;
 
 /**
- * Task allowing to download compressed OSM files (gzip and bzip2)
+ * Task allowing to download compressed OSM files (gzip, xz and bzip2)
  * @since 5317
  */
 public class DownloadOsmCompressedTask extends DownloadOsmTask {
 
-    private static final String PATTERN_COMPRESS = "https?://.*/.*\\.osm.(gz|bz2?|zip)";
+    private static final String PATTERN_COMPRESS = "https?://.*/(.*\\.osm\\.(gz|xz|bz2?|zip))";
 
     @Override
@@ -32,6 +33,5 @@
 
     @Override
-    public Future<?> download(boolean newLayer, Bounds downloadArea,
-            ProgressMonitor progressMonitor) {
+    public Future<?> download(boolean newLayer, Bounds downloadArea, ProgressMonitor progressMonitor) {
         return null;
     }
@@ -49,16 +49,10 @@
             protected DataSet parseDataSet() throws OsmTransferException {
                 ProgressMonitor subTaskMonitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
-                if (url.matches("https?://.*/.*\\.osm.bz2?")) {
-                    return reader.parseOsmBzip2(subTaskMonitor);
-                } else if (url.matches("https?://.*/.*\\.osm.gz")) {
-                    return reader.parseOsmGzip(subTaskMonitor);
-                } else {
-                    return reader.parseOsmZip(subTaskMonitor);
-                }
+                return reader.parseOsm(subTaskMonitor, Compression.byExtension(url));
             }
         };
         currentBounds = null;
         // Extract .osm.gz/bz/bz2/zip filename from URL to set the new layer name
-        extractOsmFilename("https?://.*/(.*\\.osm.(gz|bz2?|zip))", url);
+        extractOsmFilename(PATTERN_COMPRESS, url);
         return MainApplication.worker.submit(downloadTask);
     }
Index: trunk/src/org/openstreetmap/josm/gui/io/importexport/NoteImporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/importexport/NoteImporter.java	(revision 13350)
+++ trunk/src/org/openstreetmap/josm/gui/io/importexport/NoteImporter.java	(revision 13352)
@@ -20,5 +20,5 @@
 
 /**
- * File importer that reads note dump files (*.osn, .osn.gz and .osn.bz2)
+ * File importer that reads note dump files (*.osn, .osn.gz, .osn.xz and .osn.bz2)
  * @since 7538
  */
Index: trunk/src/org/openstreetmap/josm/gui/io/importexport/OsmExporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/importexport/OsmExporter.java	(revision 13350)
+++ trunk/src/org/openstreetmap/josm/gui/io/importexport/OsmExporter.java	(revision 13352)
@@ -124,5 +124,5 @@
 
     protected void doSave(File file, OsmDataLayer layer) throws IOException {
-        // create outputstream and wrap it with gzip or bzip, if necessary
+        // create outputstream and wrap it with gzip, xz or bzip, if necessary
         try (
             OutputStream out = getOutputStream(file);
Index: trunk/src/org/openstreetmap/josm/gui/io/importexport/OsmImporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/importexport/OsmImporter.java	(revision 13350)
+++ trunk/src/org/openstreetmap/josm/gui/io/importexport/OsmImporter.java	(revision 13352)
@@ -33,6 +33,6 @@
      */
     public static final ExtensionFileFilter FILE_FILTER = ExtensionFileFilter.newFilterWithArchiveExtensions(
-            "osm,xml", "osm", tr("OSM Server Files") + " (*.osm, *.osm.gz, *.osm.bz2, *.osm.zip, *.xml)",
-            ExtensionFileFilter.AddArchiveExtension.NONE, Arrays.asList("gz", "bz", "bz2", "zip"));
+            "osm,xml", "osm", tr("OSM Server Files") + " (*.osm, *.osm.gz, *.osm.bz2, *.osm.xz, *.osm.zip, *.xml)",
+            ExtensionFileFilter.AddArchiveExtension.NONE, Arrays.asList("gz", "bz", "bz2", "xz", "zip"));
 
     /**
Index: trunk/src/org/openstreetmap/josm/gui/io/importexport/OsmXzExporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/importexport/OsmXzExporter.java	(revision 13352)
+++ trunk/src/org/openstreetmap/josm/gui/io/importexport/OsmXzExporter.java	(revision 13352)
@@ -0,0 +1,24 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.io.importexport;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import org.openstreetmap.josm.actions.ExtensionFileFilter;
+
+/**
+ * OSM data exporter that compresses it in XZ format.
+ * @since 13352
+ */
+public class OsmXzExporter extends OsmExporter {
+
+    /**
+     * Constructs a new {@code OsmXzExporter}.
+     */
+    public OsmXzExporter() {
+        super(new ExtensionFileFilter(
+            "osm.xz", "osm.xz", tr("OSM Server Files XZ compressed") + " (*.osm.xz)"));
+    }
+
+    // compression handling is performed in super-class
+
+}
Index: trunk/src/org/openstreetmap/josm/io/OsmServerLocationReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmServerLocationReader.java	(revision 13350)
+++ trunk/src/org/openstreetmap/josm/io/OsmServerLocationReader.java	(revision 13352)
@@ -84,6 +84,8 @@
      */
     public enum NoteUrlPattern {
+        /** URL of OSM API Notes endpoint */
         API_URL  ("https?://.*/api/0.6/notes.*"),
-        DUMP_FILE("https?://.*/(.*\\.osn(.bz2)?)");
+        /** URL of OSM API Notes compressed dump file */
+        DUMP_FILE("https?://.*/(.*\\.osn(\\.(gz|xz|bz2?|zip))?)");
 
         private final String urlPattern;
@@ -147,56 +149,41 @@
 
     @Override
-    public DataSet parseOsm(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        return doParse(new OsmParser(progressMonitor, Compression.NONE), progressMonitor);
-    }
-
-    @Override
-    public DataSet parseOsmBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        return doParse(new OsmParser(progressMonitor, Compression.BZIP2), progressMonitor);
-    }
-
-    @Override
-    public DataSet parseOsmGzip(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        return doParse(new OsmParser(progressMonitor, Compression.GZIP), progressMonitor);
-    }
-
-    @Override
-    public DataSet parseOsmZip(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        return doParse(new OsmParser(progressMonitor, Compression.ZIP), progressMonitor);
-    }
-
-    @Override
-    public DataSet parseOsmChange(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        return doParse(new OsmChangeParser(progressMonitor, Compression.NONE), progressMonitor);
-    }
-
-    @Override
-    public DataSet parseOsmChangeBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        return doParse(new OsmChangeParser(progressMonitor, Compression.BZIP2), progressMonitor);
-    }
-
-    @Override
-    public DataSet parseOsmChangeGzip(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        return doParse(new OsmChangeParser(progressMonitor, Compression.GZIP), progressMonitor);
-    }
-
-    @Override
-    public GpxData parseRawGps(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        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);
-    }
-
-    @Override
-    public List<Note> parseRawNotes(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        return doParse(new NoteParser(progressMonitor, Compression.NONE), progressMonitor);
-    }
-
-    @Override
-    public List<Note> parseRawNotesBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        return doParse(new NoteParser(progressMonitor, Compression.BZIP2), progressMonitor);
+    public DataSet parseOsm(ProgressMonitor progressMonitor) throws OsmTransferException {
+        return parseOsm(progressMonitor, Compression.NONE);
+    }
+
+    @Override
+    public DataSet parseOsm(ProgressMonitor progressMonitor, Compression compression) throws OsmTransferException {
+        return doParse(new OsmParser(progressMonitor, compression), progressMonitor);
+    }
+
+    @Override
+    public DataSet parseOsmChange(ProgressMonitor progressMonitor) throws OsmTransferException {
+        return parseOsmChange(progressMonitor, Compression.NONE);
+    }
+
+    @Override
+    public DataSet parseOsmChange(ProgressMonitor progressMonitor, Compression compression) throws OsmTransferException {
+        return doParse(new OsmChangeParser(progressMonitor, compression), progressMonitor);
+    }
+
+    @Override
+    public GpxData parseRawGps(ProgressMonitor progressMonitor) throws OsmTransferException {
+        return parseRawGps(progressMonitor, Compression.NONE);
+    }
+
+    @Override
+    public GpxData parseRawGps(ProgressMonitor progressMonitor, Compression compression) throws OsmTransferException {
+        return doParse(new GpxParser(progressMonitor, compression), progressMonitor);
+    }
+
+    @Override
+    public List<Note> parseRawNotes(ProgressMonitor progressMonitor) throws OsmTransferException {
+        return parseRawNotes(progressMonitor, Compression.NONE);
+    }
+
+    @Override
+    public List<Note> parseRawNotes(ProgressMonitor progressMonitor, Compression compression) throws OsmTransferException {
+        return doParse(new NoteParser(progressMonitor, compression), progressMonitor);
     }
 
Index: trunk/src/org/openstreetmap/josm/io/OsmServerReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmServerReader.java	(revision 13350)
+++ trunk/src/org/openstreetmap/josm/io/OsmServerReader.java	(revision 13352)
@@ -127,5 +127,5 @@
      * @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.
+     *                                                for {@code filename} and uncompress a gzip/bzip2/xz/zip stream.
      * @return An reader reading the input stream (servers answer) or <code>null</code>.
      * @throws OsmTransferException if data transfer errors occur
@@ -143,5 +143,5 @@
      * @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.
+     *                                                for {@code filename} and uncompress a gzip/bzip2/xz/zip stream.
      * @param httpMethod HTTP method ("GET", "POST" or "PUT")
      * @param requestBody HTTP request body (for "POST" and "PUT" methods only). Must be null for "GET" method.
@@ -248,10 +248,34 @@
 
     /**
-     * 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 {
+     * Download compressed OSM files from somewhere
+     * @param progressMonitor The progress monitor
+     * @param compression compression to use
+     * @return The corresponding dataset
+     * @throws OsmTransferException if any error occurs
+     * @since 13352
+     */
+    public DataSet parseOsm(ProgressMonitor progressMonitor, Compression compression) throws OsmTransferException {
+        return null;
+    }
+
+    /**
+     * Download OSM Change uncompressed files from somewhere
+     * @param progressMonitor The progress monitor
+     * @return The corresponding dataset
+     * @throws OsmTransferException if any error occurs
+     */
+    public DataSet parseOsmChange(ProgressMonitor progressMonitor) throws OsmTransferException {
+        return null;
+    }
+
+    /**
+     * Download OSM Change compressed files from somewhere
+     * @param progressMonitor The progress monitor
+     * @param compression compression to use
+     * @return The corresponding dataset
+     * @throws OsmTransferException if any error occurs
+     * @since 13352
+     */
+    public DataSet parseOsmChange(ProgressMonitor progressMonitor, Compression compression) throws OsmTransferException {
         return null;
     }
@@ -262,7 +286,9 @@
      * @return The corresponding dataset
      * @throws OsmTransferException if any error occurs
-     */
-    public DataSet parseOsmChangeBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        return null;
+     * @deprecated use {@link #parseOsmChange(ProgressMonitor, Compression)} instead
+     */
+    @Deprecated
+    public DataSet parseOsmChangeBzip2(ProgressMonitor progressMonitor) throws OsmTransferException {
+        return parseOsmChange(progressMonitor, Compression.BZIP2);
     }
 
@@ -272,7 +298,9 @@
      * @return The corresponding dataset
      * @throws OsmTransferException if any error occurs
-     */
-    public DataSet parseOsmChangeGzip(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        return null;
+     * @deprecated use {@link #parseOsmChange(ProgressMonitor, Compression)} instead
+     */
+    @Deprecated
+    public DataSet parseOsmChangeGzip(ProgressMonitor progressMonitor) throws OsmTransferException {
+        return parseOsmChange(progressMonitor, Compression.GZIP);
     }
 
@@ -283,5 +311,17 @@
      * @throws OsmTransferException if any error occurs
      */
-    public GpxData parseRawGps(final ProgressMonitor progressMonitor) throws OsmTransferException {
+    public GpxData parseRawGps(ProgressMonitor progressMonitor) throws OsmTransferException {
+        return null;
+    }
+
+    /**
+     * Retrieve compressed GPX files from somewhere.
+     * @param progressMonitor The progress monitor
+     * @param compression compression to use
+     * @return The corresponding GPX tracks
+     * @throws OsmTransferException if any error occurs
+     * @since 13352
+     */
+    public GpxData parseRawGps(ProgressMonitor progressMonitor, Compression compression) throws OsmTransferException {
         return null;
     }
@@ -292,8 +332,10 @@
      * @return The corresponding GPX tracks
      * @throws OsmTransferException if any error occurs
+     * @deprecated use {@link #parseRawGps(ProgressMonitor, Compression)} instead
      * @since 6244
      */
-    public GpxData parseRawGpsBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        return null;
+    @Deprecated
+    public GpxData parseRawGpsBzip2(ProgressMonitor progressMonitor) throws OsmTransferException {
+        return parseRawGps(progressMonitor, Compression.BZIP2);
     }
 
@@ -303,7 +345,9 @@
      * @return The corresponding dataset
      * @throws OsmTransferException if any error occurs
-     */
-    public DataSet parseOsmBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        return null;
+     * @deprecated use {@link #parseOsm(ProgressMonitor, Compression)} instead
+     */
+    @Deprecated
+    public DataSet parseOsmBzip2(ProgressMonitor progressMonitor) throws OsmTransferException {
+        return parseOsm(progressMonitor, Compression.BZIP2);
     }
 
@@ -313,7 +357,9 @@
      * @return The corresponding dataset
      * @throws OsmTransferException if any error occurs
-     */
-    public DataSet parseOsmGzip(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        return null;
+     * @deprecated use {@link #parseOsm(ProgressMonitor, Compression)} instead
+     */
+    @Deprecated
+    public DataSet parseOsmGzip(ProgressMonitor progressMonitor) throws OsmTransferException {
+        return parseOsm(progressMonitor, Compression.GZIP);
     }
 
@@ -323,8 +369,10 @@
      * @return The corresponding dataset
      * @throws OsmTransferException if any error occurs
+     * @deprecated use {@link #parseOsm(ProgressMonitor, Compression)} instead
      * @since 6882
      */
+    @Deprecated
     public DataSet parseOsmZip(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        return null;
+        return parseOsm(progressMonitor, Compression.ZIP);
     }
 
@@ -385,11 +433,25 @@
 
     /**
+     * Download notes from a URL that contains a compressed notes dump file
+     * @param progressMonitor progress monitor
+     * @param compression compression to use
+     * @return A list of notes parsed from the URL
+     * @throws OsmTransferException if any error occurs during dialog with OSM API
+     * @since 13352
+     */
+    public List<Note> parseRawNotes(ProgressMonitor progressMonitor, Compression compression) throws OsmTransferException {
+        return null;
+    }
+
+    /**
      * Download notes from a URL that contains a bzip2 compressed notes dump file
      * @param progressMonitor progress monitor
      * @return A list of notes parsed from the URL
      * @throws OsmTransferException if any error occurs during dialog with OSM API
-     */
+     * @deprecated Use {@link #parseRawNotes(ProgressMonitor, Compression)} instead
+     */
+    @Deprecated
     public List<Note> parseRawNotesBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
-        return null;
+        return parseRawNotes(progressMonitor, Compression.BZIP2);
     }
 
