Index: trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(revision 6881)
+++ trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(revision 6882)
@@ -48,4 +48,5 @@
                 "org.openstreetmap.josm.io.OsmImporter",
                 "org.openstreetmap.josm.io.OsmGzipImporter",
+                "org.openstreetmap.josm.io.OsmZipImporter",
                 "org.openstreetmap.josm.io.OsmChangeImporter",
                 "org.openstreetmap.josm.io.GpxImporter",
Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmCompressedTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmCompressedTask.java	(revision 6881)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmCompressedTask.java	(revision 6882)
@@ -19,9 +19,9 @@
 public class DownloadOsmCompressedTask extends DownloadOsmTask {
 
-    static final String PATTERN_GZ =  "https?://.*/.*\\.osm.(gz|bz2?)";
+    static final String PATTERN_COMPRESS =  "https?://.*/.*\\.osm.(gz|bz2?|zip)";
 
     @Override
     public String[] getPatterns() {
-        return new String[]{PATTERN_GZ};
+        return new String[]{PATTERN_COMPRESS};
     }
 
@@ -31,7 +31,4 @@
     }
     
-    /* (non-Javadoc)
-     * @see org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask#download(boolean, org.openstreetmap.josm.data.Bounds, org.openstreetmap.josm.gui.progress.ProgressMonitor)
-     */
     @Override
     public Future<?> download(boolean newLayer, Bounds downloadArea,
@@ -54,12 +51,14 @@
                 if (url.matches("https?://.*/.*\\.osm.bz2?")) {
                     return reader.parseOsmBzip2(subTaskMonitor);
+                } else if (url.matches("https?://.*/.*\\.osm.gz")) {
+                    return reader.parseOsmGzip(subTaskMonitor);
                 } else {
-                    return reader.parseOsmGzip(subTaskMonitor);
+                    return reader.parseOsmZip(subTaskMonitor);
                 }
             }
         };
         currentBounds = null;
-        // Extract .osm.gz/bz/bz2 filename from URL to set the new layer name
-        extractOsmFilename("https?://.*/(.*\\.osm.(gz|bz2?))", url);
+        // Extract .osm.gz/bz/bz2/zip filename from URL to set the new layer name
+        extractOsmFilename("https?://.*/(.*\\.osm.(gz|bz2?|zip))", url);
         return Main.worker.submit(downloadTask);
     }
Index: trunk/src/org/openstreetmap/josm/io/Compression.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/Compression.java	(revision 6881)
+++ trunk/src/org/openstreetmap/josm/io/Compression.java	(revision 6882)
@@ -13,4 +13,5 @@
 import java.net.URL;
 import java.util.zip.GZIPOutputStream;
+import java.util.zip.ZipOutputStream;
 
 /**
@@ -29,8 +30,14 @@
      * gzip compression
      */
-    GZIP;
+    GZIP,
+    /**
+     * zip compression
+     */
+    ZIP;
 
     /**
      * Determines the compression type depending on the suffix of {@code name}.
+     * @param name File name including extension
+     * @return the compression type
      */
     public static Compression byExtension(String name) {
@@ -39,4 +46,6 @@
                 : name != null && (name.endsWith(".bz2") || name.endsWith(".bz"))
                 ? BZIP2
+                : name != null && name.endsWith(".zip")
+                ? ZIP
                 : NONE;
     }
@@ -53,4 +62,6 @@
             case GZIP:
                 return FileImporter.getGZipInputStream(in);
+            case ZIP:
+                return FileImporter.getZipInputStream(in);
             case NONE:
             default:
@@ -90,4 +101,6 @@
             case GZIP:
                 return new GZIPOutputStream(out);
+            case ZIP:
+                return new ZipOutputStream(out);
             case NONE:
             default:
Index: trunk/src/org/openstreetmap/josm/io/FileImporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/FileImporter.java	(revision 6881)
+++ trunk/src/org/openstreetmap/josm/io/FileImporter.java	(revision 6882)
@@ -10,4 +10,6 @@
 import java.util.List;
 import java.util.zip.GZIPInputStream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
 
 import javax.swing.JOptionPane;
@@ -156,4 +158,17 @@
     }
 
+    public static ZipInputStream getZipInputStream(InputStream in) throws IOException {
+        if (in == null) {
+            return null;
+        }
+        ZipInputStream zis = new ZipInputStream(in);
+        // Positions the stream at the beginning of first entry
+        ZipEntry ze = zis.getNextEntry();
+        if (ze != null && Main.isDebugEnabled()) {
+            Main.debug("Zip entry: "+ze.getName());
+        }
+        return zis;
+    }
+
     /**
      * Returns the enabled state of this {@code FileImporter}. When enabled, it is listed and usable in "File-&gt;Open" dialog.
Index: trunk/src/org/openstreetmap/josm/io/OsmServerLocationReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmServerLocationReader.java	(revision 6881)
+++ trunk/src/org/openstreetmap/josm/io/OsmServerLocationReader.java	(revision 6882)
@@ -77,4 +77,9 @@
 
     @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);
Index: trunk/src/org/openstreetmap/josm/io/OsmServerReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmServerReader.java	(revision 6881)
+++ trunk/src/org/openstreetmap/josm/io/OsmServerReader.java	(revision 6882)
@@ -303,4 +303,15 @@
 
     /**
+     * Download Zip-compressed OSM files from somewhere
+     * @param progressMonitor The progress monitor
+     * @return The corresponding dataset
+     * @throws OsmTransferException if any error occurs
+     * @since 6882
+     */
+    public DataSet parseOsmZip(final ProgressMonitor progressMonitor) throws OsmTransferException {
+        return null;
+    }
+
+    /**
      * Returns true if this reader is adding authentication credentials to the read
      * request sent to the server.
Index: trunk/src/org/openstreetmap/josm/io/OsmZipImporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmZipImporter.java	(revision 6882)
+++ trunk/src/org/openstreetmap/josm/io/OsmZipImporter.java	(revision 6882)
@@ -0,0 +1,28 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import org.openstreetmap.josm.actions.ExtensionFileFilter;
+
+/**
+ * OSM data importer that uncompresses it from Zip format.
+ * @since 6882
+ */
+public class OsmZipImporter extends OsmImporter {
+
+    /**
+     * File filter used to load/save Zip compressed OSM files.
+     */
+    public static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter(
+            "osm.zip", "osm.zip", tr("OSM Server Files zip compressed") + " (*.osm.zip)");
+
+    /**
+     * Constructs a new {@code OsmZipImporter}.
+     */
+    public OsmZipImporter() {
+        super(FILE_FILTER);
+    }
+
+    // compression handling is performed in super-class
+}
