Index: trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(revision 13348)
+++ trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(revision 13350)
@@ -410,5 +410,5 @@
             String extensions, String defaultExtension, String description, boolean addArchiveExtensionsToDescription) {
 
-        List<String> archiveExtensions = Arrays.asList("gz", "bz2");
+        List<String> archiveExtensions = Arrays.asList("gz", "bz", "bz2", "xz", "zip");
         return newFilterWithArchiveExtensions(
             extensions,
Index: trunk/src/org/openstreetmap/josm/io/Compression.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/Compression.java	(revision 13348)
+++ trunk/src/org/openstreetmap/josm/io/Compression.java	(revision 13350)
@@ -16,4 +16,6 @@
 import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
 import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream;
+import org.apache.commons.compress.compressors.xz.XZCompressorInputStream;
+import org.apache.commons.compress.compressors.xz.XZCompressorOutputStream;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Utils;
@@ -38,5 +40,9 @@
      * zip compression
      */
-    ZIP;
+    ZIP,
+    /**
+     * xz compression
+     */
+    XZ;
 
     /**
@@ -52,4 +58,6 @@
                 : name != null && name.endsWith(".zip")
                 ? ZIP
+                : name != null && name.endsWith(".xz")
+                ? XZ
                 : NONE;
     }
@@ -68,4 +76,6 @@
         case "application/x-bzip2":
             return BZIP2;
+        case "application/x-xz":
+            return XZ;
         default:
             return NONE;
@@ -88,8 +98,24 @@
             case ZIP:
                 return getZipInputStream(in);
+            case XZ:
+                return getXZInputStream(in);
             case NONE:
             default:
                 return in;
         }
+    }
+
+    /**
+     * Returns a XZ input stream wrapping given input stream.
+     * @param in The raw input stream
+     * @return a XZ input stream wrapping given input stream, or {@code null} if {@code in} is {@code null}
+     * @throws IOException if the given input stream does not contain valid BZ2 header
+     * @since 13350
+     */
+    public static XZCompressorInputStream getXZInputStream(InputStream in) throws IOException {
+        if (in == null) {
+            return null;
+        }
+        return new XZCompressorInputStream(in, true);
     }
 
@@ -173,4 +199,6 @@
             case ZIP:
                 return new ZipOutputStream(out, StandardCharsets.UTF_8);
+            case XZ:
+                return new XZCompressorOutputStream(out);
             case NONE:
             default:
