Index: trunk/.classpath
===================================================================
--- trunk/.classpath	(revision 13351)
+++ trunk/.classpath	(revision 13352)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry excluding="org/apache/commons/compress/compressors/CompressorException.java|org/apache/commons/compress/compressors/CompressorStreamFactory.java|org/apache/commons/compress/compressors/CompressorStreamProvider.java|org/apache/commons/compress/compressors/FileNameUtil.java|org/apache/commons/compress/compressors/brotli/|org/apache/commons/compress/compressors/bzip2/BZip2Utils.java|org/apache/commons/compress/compressors/deflate/|org/apache/commons/compress/compressors/gzip/|org/apache/commons/compress/compressors/lz4/|org/apache/commons/compress/compressors/lz77support/|org/apache/commons/compress/compressors/lzma/|org/apache/commons/compress/compressors/pack200/|org/apache/commons/compress/compressors/snappy/|org/apache/commons/compress/compressors/xz/|org/apache/commons/compress/compressors/z/|org/apache/commons/compress/utils/ArchiveUtils.java|org/apache/commons/jcs/JCS.java|org/apache/commons/jcs/access/GroupCacheAccess.java|org/apache/commons/jcs/access/PartitionedCacheAccess.java|org/apache/commons/jcs/access/behavior/IGroupCacheAccess.java|org/apache/commons/jcs/access/exception/InvalidGroupException.java|org/apache/commons/jcs/admin/servlet/|org/apache/commons/jcs/auxiliary/AbstractAuxiliaryCacheMonitor.java|org/apache/commons/jcs/auxiliary/disk/jdbc/|org/apache/commons/jcs/auxiliary/lateral/|org/apache/commons/jcs/auxiliary/remote/AbstractRemoteAuxiliaryCache.java|org/apache/commons/jcs/auxiliary/remote/AbstractRemoteCacheListener.java|org/apache/commons/jcs/auxiliary/remote/AbstractRemoteCacheNoWaitFacade.java|org/apache/commons/jcs/auxiliary/remote/RemoteCache.java|org/apache/commons/jcs/auxiliary/remote/RemoteCacheFactory.java|org/apache/commons/jcs/auxiliary/remote/RemoteCacheFailoverRunner.java|org/apache/commons/jcs/auxiliary/remote/RemoteCacheListener.java|org/apache/commons/jcs/auxiliary/remote/RemoteCacheManager.java|org/apache/commons/jcs/auxiliary/remote/RemoteCacheMonitor.java|org/apache/commons/jcs/auxiliary/remote/RemoteCacheNoWait.java|org/apache/commons/jcs/auxiliary/remote/RemoteCacheNoWaitFacade.java|org/apache/commons/jcs/auxiliary/remote/RemoteCacheRestore.java|org/apache/commons/jcs/auxiliary/remote/http/|org/apache/commons/jcs/auxiliary/remote/server/RemoteCacheStartupServlet.java|org/apache/commons/jcs/auxiliary/remote/server/TimeoutConfigurableRMISocketFactory.java|org/apache/commons/jcs/engine/CacheAdaptor.java|org/apache/commons/jcs/engine/CacheGroup.java|org/apache/commons/jcs/engine/CacheWatchRepairable.java|org/apache/commons/jcs/engine/ZombieCacheService.java|org/apache/commons/jcs/engine/ZombieCacheServiceNonLocal.java|org/apache/commons/jcs/engine/ZombieCacheWatch.java|org/apache/commons/jcs/engine/logging/CacheEventLoggerDebugLogger.java|org/apache/commons/jcs/utils/access/|org/apache/commons/jcs/utils/discovery/|org/apache/commons/jcs/utils/net/|org/apache/commons/jcs/utils/props/|org/apache/commons/jcs/utils/servlet/|org/apache/commons/logging/impl/AvalonLogger.java|org/apache/commons/logging/impl/Jdk13LumberjackLogger.java|org/apache/commons/logging/impl/Log4JLogger.java|org/apache/commons/logging/impl/LogKitLogger.java|org/apache/commons/logging/impl/ServletContextCleaner.java|org/openstreetmap/gui/jmapviewer/Demo.java|org/openstreetmap/gui/jmapviewer/JMapViewerTree.java|org/openstreetmap/gui/jmapviewer/checkBoxTree/|org/apache/commons/compress/archivers/|org/apache/commons/compress/changes/|org/apache/commons/compress/parallel/|org/apache/commons/compress/PasswordRequiredException.java|org/apache/commons/compress/compressors/zstandard/" kind="src" path="src"/>
+	<classpathentry excluding="org/apache/commons/compress/PasswordRequiredException.java|org/apache/commons/compress/archivers/|org/apache/commons/compress/changes/|org/apache/commons/compress/compressors/CompressorException.java|org/apache/commons/compress/compressors/CompressorStreamFactory.java|org/apache/commons/compress/compressors/CompressorStreamProvider.java|org/apache/commons/compress/compressors/FileNameUtil.java|org/apache/commons/compress/compressors/brotli/|org/apache/commons/compress/compressors/bzip2/BZip2Utils.java|org/apache/commons/compress/compressors/deflate/|org/apache/commons/compress/compressors/gzip/|org/apache/commons/compress/compressors/lz4/|org/apache/commons/compress/compressors/lz77support/|org/apache/commons/compress/compressors/lzma/|org/apache/commons/compress/compressors/pack200/|org/apache/commons/compress/compressors/snappy/|org/apache/commons/compress/compressors/xz/XZUtils.java|org/apache/commons/compress/compressors/z/|org/apache/commons/compress/compressors/zstandard/|org/apache/commons/compress/parallel/|org/apache/commons/compress/utils/ArchiveUtils.java|org/apache/commons/jcs/JCS.java|org/apache/commons/jcs/access/GroupCacheAccess.java|org/apache/commons/jcs/access/PartitionedCacheAccess.java|org/apache/commons/jcs/access/behavior/IGroupCacheAccess.java|org/apache/commons/jcs/access/exception/InvalidGroupException.java|org/apache/commons/jcs/admin/servlet/|org/apache/commons/jcs/auxiliary/AbstractAuxiliaryCacheMonitor.java|org/apache/commons/jcs/auxiliary/disk/jdbc/|org/apache/commons/jcs/auxiliary/lateral/|org/apache/commons/jcs/auxiliary/remote/AbstractRemoteAuxiliaryCache.java|org/apache/commons/jcs/auxiliary/remote/AbstractRemoteCacheListener.java|org/apache/commons/jcs/auxiliary/remote/AbstractRemoteCacheNoWaitFacade.java|org/apache/commons/jcs/auxiliary/remote/RemoteCache.java|org/apache/commons/jcs/auxiliary/remote/RemoteCacheFactory.java|org/apache/commons/jcs/auxiliary/remote/RemoteCacheFailoverRunner.java|org/apache/commons/jcs/auxiliary/remote/RemoteCacheListener.java|org/apache/commons/jcs/auxiliary/remote/RemoteCacheManager.java|org/apache/commons/jcs/auxiliary/remote/RemoteCacheMonitor.java|org/apache/commons/jcs/auxiliary/remote/RemoteCacheNoWait.java|org/apache/commons/jcs/auxiliary/remote/RemoteCacheNoWaitFacade.java|org/apache/commons/jcs/auxiliary/remote/RemoteCacheRestore.java|org/apache/commons/jcs/auxiliary/remote/http/|org/apache/commons/jcs/auxiliary/remote/server/RemoteCacheStartupServlet.java|org/apache/commons/jcs/auxiliary/remote/server/TimeoutConfigurableRMISocketFactory.java|org/apache/commons/jcs/engine/CacheAdaptor.java|org/apache/commons/jcs/engine/CacheGroup.java|org/apache/commons/jcs/engine/CacheWatchRepairable.java|org/apache/commons/jcs/engine/ZombieCacheService.java|org/apache/commons/jcs/engine/ZombieCacheServiceNonLocal.java|org/apache/commons/jcs/engine/ZombieCacheWatch.java|org/apache/commons/jcs/engine/logging/CacheEventLoggerDebugLogger.java|org/apache/commons/jcs/utils/access/|org/apache/commons/jcs/utils/discovery/|org/apache/commons/jcs/utils/net/|org/apache/commons/jcs/utils/props/|org/apache/commons/jcs/utils/servlet/|org/apache/commons/logging/impl/AvalonLogger.java|org/apache/commons/logging/impl/Jdk13LumberjackLogger.java|org/apache/commons/logging/impl/Log4JLogger.java|org/apache/commons/logging/impl/LogKitLogger.java|org/apache/commons/logging/impl/ServletContextCleaner.java|org/openstreetmap/gui/jmapviewer/Demo.java|org/openstreetmap/gui/jmapviewer/JMapViewerTree.java|org/openstreetmap/gui/jmapviewer/checkBoxTree/" kind="src" path="src"/>
 	<classpathentry including="data/|images/|resources/|styles/" kind="src" path=""/>
 	<classpathentry kind="src" path="test/unit"/>
Index: trunk/build.xml
===================================================================
--- trunk/build.xml	(revision 13351)
+++ trunk/build.xml	(revision 13352)
@@ -242,5 +242,5 @@
     <target name="compile-cots" depends="init">
         <!-- COTS -->
-        <javac srcdir="${src.dir}" includes="com/**,javax/**,oauth/**,org/apache/commons/**,org/glassfish/**,gnu/**" nowarn="on" encoding="iso-8859-1"
+        <javac srcdir="${src.dir}" includes="com/**,javax/**,oauth/**,org/apache/commons/**,org/glassfish/**,org/tukaani/**,gnu/**" nowarn="on" encoding="iso-8859-1"
             destdir="${build.dir}" target="${java.lang.version}" source="${java.lang.version}" debug="on" includeAntRuntime="false" createMissingPackageInfoClass="false">
             <!-- get rid of "internal proprietary API" warning -->
@@ -262,4 +262,5 @@
             <exclude name="org/apache/commons/compress/compressors/pack200/**"/>
             <exclude name="org/apache/commons/compress/compressors/snappy/**"/>
+            <exclude name="org/apache/commons/compress/compressors/xz/XZUtils.java"/>
             <exclude name="org/apache/commons/compress/compressors/z/**"/>
             <exclude name="org/apache/commons/compress/compressors/zstandard/**"/>
@@ -296,5 +297,5 @@
         <!-- JMapViewer -->
         <javac compiler="${javac.compiler}" sourcepath="" srcdir="${src.dir}" 
-            excludes="com/**,javax/**,oauth/**,org/apache/commons/**,org/glassfish/**,org/openstreetmap/gui/jmapviewer/Demo.java,org/openstreetmap/gui/jmapviewer/JMapViewerTree.java,org/openstreetmap/gui/jmapviewer/checkBoxTree/**,org/openstreetmap/josm/**,gnu/**"
+            excludes="com/**,javax/**,oauth/**,org/apache/commons/**,org/glassfish/**,org/openstreetmap/gui/jmapviewer/Demo.java,org/openstreetmap/gui/jmapviewer/JMapViewerTree.java,org/openstreetmap/gui/jmapviewer/checkBoxTree/**,org/openstreetmap/josm/**,org/tukaani/**,gnu/**"
             destdir="${build.dir}" target="${java.lang.version}" source="${java.lang.version}" debug="on" includeantruntime="false" createMissingPackageInfoClass="false" encoding="UTF-8">
             <compilerclasspath>
@@ -322,5 +323,5 @@
         <!-- JOSM -->
         <javac compiler="${javac.compiler}" sourcepath="" srcdir="${src.dir}"
-            excludes="com/**,javax/**,gnu/**,oauth/**,org/apache/commons/**,org/glassfish/**,org/openstreetmap/gui/jmapviewer/**"
+            excludes="com/**,javax/**,gnu/**,oauth/**,org/apache/commons/**,org/glassfish/**,org/openstreetmap/gui/jmapviewer/**,org/tukaani/**"
             destdir="${build.dir}" target="${java.lang.version}" source="${java.lang.version}" debug="on" includeantruntime="false" createMissingPackageInfoClass="false" encoding="UTF-8">
             <compilerclasspath>
Index: trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(revision 13351)
+++ 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 13351)
+++ 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 13351)
+++ 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 13351)
+++ 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 13351)
+++ 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 13351)
+++ 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 13351)
+++ 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 13351)
+++ 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 13351)
+++ 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);
     }
 
Index: trunk/test/unit/org/openstreetmap/josm/actions/ExtensionFileFilterTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/actions/ExtensionFileFilterTest.java	(revision 13351)
+++ trunk/test/unit/org/openstreetmap/josm/actions/ExtensionFileFilterTest.java	(revision 13352)
@@ -9,5 +9,4 @@
 
 import nl.jqno.equalsverifier.EqualsVerifier;
-import nl.jqno.equalsverifier.Warning;
 
 /**
@@ -31,11 +30,15 @@
     public void testNewFilterWithArchiveExtensions() {
         test("ext1", "ext1", "description", true,
-                "ext1,ext1.gz,ext1.bz2", "description (*.ext1, *.ext1.gz, *.ext1.bz2)");
+                "ext1,ext1.gz,ext1.bz,ext1.bz2,ext1.xz,ext1.zip",
+                "description (*.ext1, *.ext1.gz, *.ext1.bz, *.ext1.bz2, *.ext1.xz, *.ext1.zip)");
         test("ext1", "ext1", "description", false,
-                "ext1,ext1.gz,ext1.bz2", "description (*.ext1)");
+                "ext1,ext1.gz,ext1.bz,ext1.bz2,ext1.xz,ext1.zip", "description (*.ext1)");
         test("ext1,ext2", "ext1", "description", true,
-                "ext1,ext1.gz,ext1.bz2,ext2,ext2.gz,ext2.bz2", "description (*.ext1, *.ext1.gz, *.ext1.bz2, *.ext2, *.ext2.gz, *.ext2.bz2)");
+                "ext1,ext1.gz,ext1.bz,ext1.bz2,ext1.xz,ext1.zip,ext2,ext2.gz,ext2.bz,ext2.bz2,ext2.xz,ext2.zip",
+                "description (*.ext1, *.ext1.gz, *.ext1.bz, *.ext1.bz2, *.ext1.xz, *.ext1.zip, " +
+                             "*.ext2, *.ext2.gz, *.ext2.bz, *.ext2.bz2, *.ext2.xz, *.ext2.zip)");
         test("ext1,ext2", "ext1", "description", false,
-                "ext1,ext1.gz,ext1.bz2,ext2,ext2.gz,ext2.bz2", "description (*.ext1, *.ext2)");
+                "ext1,ext1.gz,ext1.bz,ext1.bz2,ext1.xz,ext1.zip,ext2,ext2.gz,ext2.bz,ext2.bz2,ext2.xz,ext2.zip",
+                "description (*.ext1, *.ext2)");
     }
 
@@ -47,5 +50,4 @@
         TestUtils.assumeWorkingEqualsVerifier();
         EqualsVerifier.forClass(ExtensionFileFilter.class).usingGetClass()
-            .suppress(Warning.ANNOTATION) // FIXME: remove it after https://github.com/jqno/equalsverifier/issues/152 is fixed
             .verify();
     }
