Index: /trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(revision 1652)
+++ /trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(revision 1653)
@@ -11,4 +11,6 @@
 import org.openstreetmap.josm.io.GpxImporter;
 import org.openstreetmap.josm.io.NMEAImporter;
+import org.openstreetmap.josm.io.OsmBzip2Importer;
+import org.openstreetmap.josm.io.OsmGzipImporter;
 import org.openstreetmap.josm.io.OsmImporter;
 
@@ -25,5 +27,5 @@
 
     public static ArrayList<FileImporter> importers = new ArrayList<FileImporter>(Arrays.asList(new OsmImporter(),
-            new GpxImporter(), new NMEAImporter()));
+            new OsmGzipImporter(), new OsmBzip2Importer(), new GpxImporter(), new NMEAImporter()));
 
     /**
Index: /trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java	(revision 1652)
+++ /trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java	(revision 1653)
@@ -10,9 +10,13 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
-
-import javax.swing.JFileChooser;
+import java.io.Writer;
+import java.util.zip.GZIPOutputStream;
+
 import javax.swing.JOptionPane;
 
+import org.apache.tools.bzip2.CBZip2OutputStream;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -23,4 +27,6 @@
 import org.openstreetmap.josm.io.GpxImporter;
 import org.openstreetmap.josm.io.GpxWriter;
+import org.openstreetmap.josm.io.OsmBzip2Importer;
+import org.openstreetmap.josm.io.OsmGzipImporter;
 import org.openstreetmap.josm.io.OsmImporter;
 import org.openstreetmap.josm.io.OsmWriter;
@@ -140,7 +146,12 @@
             GpxImporter gpxImExporter = new GpxImporter();
             OsmImporter osmImExporter = new OsmImporter();
+            OsmGzipImporter osmGzipImporter = new OsmGzipImporter();
+            OsmBzip2Importer osmBzip2Importer = new OsmBzip2Importer();
             if (gpxImExporter.acceptFile(file))
                 GpxExportAction.exportGpx(file, layer);
-            else if (osmImExporter.acceptFile(file)) {
+            else if (osmImExporter.acceptFile(file) 
+                    || osmGzipImporter.acceptFile(file)
+                    || osmBzip2Importer.acceptFile(file)) 
+            {
                 // use a tmp file because if something errors out in the
                 // process of writing the file, we might just end up with
@@ -150,5 +161,17 @@
                     copy(file, tmpFile);
                 }
-                OsmWriter w = new OsmWriter(new PrintWriter(file, "UTF-8"), false, layer.data.version);
+
+                // create outputstream and wrap it with gzip or bzip, if necessary
+                OutputStream out = new FileOutputStream(file);
+                if(osmGzipImporter.acceptFile(file)) {
+                    out = new GZIPOutputStream(out);
+                } else if(osmBzip2Importer.acceptFile(file)) {
+                    out.write('B');
+                    out.write('Z');
+                    out = new CBZip2OutputStream(out);
+                }
+                Writer writer = new OutputStreamWriter(out, "UTF-8"); 
+
+                OsmWriter w = new OsmWriter(new PrintWriter(writer), false, layer.data.version);
                 w.header();
                 w.writeDataSources(layer.data);
Index: /trunk/src/org/openstreetmap/josm/gui/conflict/ListMerger.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/conflict/ListMerger.java	(revision 1652)
+++ /trunk/src/org/openstreetmap/josm/gui/conflict/ListMerger.java	(revision 1653)
@@ -40,5 +40,5 @@
 /**
  * A UI component for resolving conflicts in two lists of entries of type T.
- * 
+ *
  * @param T  the type of the entries
  * @see ListMergeModel
@@ -687,5 +687,5 @@
      * Action for removing the selected entries in the list of merged entries
      * from the list of merged entries.
-     * 
+     *
      */
     class RemoveMergedAction extends AbstractAction implements ListSelectionListener {
@@ -740,5 +740,5 @@
          * such that the action gets notified about item state changes and the button gets
          * notified about selection state changes of the action.
-         * 
+         *
          * @param btn a toggle button
          */
@@ -811,18 +811,13 @@
     public void update(Observable o, Object arg) {
         lblMyVersion.setText(
-                tr("My version ")
-                + trn("({0} entry)", "({0} entries)", model.getMyEntriesSize(), model.getMyEntriesSize())
+                trn("My version ({0} entry)", "My version ({0} entries)", model.getMyEntriesSize(), model.getMyEntriesSize())
         );
         lblMergedVersion.setText(
-                tr("Merged version ")
-                + trn("({0} entry)", "({0} entries)", model.getMergedEntriesSize(), model.getMergedEntriesSize())
+                trn("Merged version ({0} entry)", "Merged version ({0} entries)", model.getMergedEntriesSize(), model.getMergedEntriesSize())
         );
         lblTheirVersion.setText(
-                tr("Their version ")
-                + trn("({0} entry)", "({0} entries)", model.getTheirEntriesSize(), model.getTheirEntriesSize())
+                trn("Their version ({0} entry)", "Their version ({0} entries)", model.getTheirEntriesSize(), model.getTheirEntriesSize())
         );
     }
-
-
 
     /**
@@ -831,5 +826,5 @@
      * the registerd Adjustables is updated the adjustment of
      * the other registered Adjustables is adjusted too.
-     * 
+     *
      */
     class AdjustmentSynchronizer implements AdjustmentListener {
@@ -850,5 +845,5 @@
          * registers an {@see Adjustable} for participation in synchronized
          * scrolling.
-         * 
+         *
          * @param adjustable the adjustable
          */
@@ -865,5 +860,5 @@
         /**
          * event handler for {@see AdjustmentEvent}s
-         * 
+         *
          */
         public void adjustmentValueChanged(AdjustmentEvent e) {
@@ -880,5 +875,5 @@
          * sets whether adjustable participates in adjustment synchronization
          * or not
-         * 
+         *
          * @param adjustable the adjustable
          */
@@ -896,5 +891,5 @@
         /**
          * returns true if an adjustable is participating in synchronized scrolling
-         * 
+         *
          * @param adjustable the adjustable
          * @return true, if the adjustable is participating in synchronized scrolling, false otherwise
@@ -916,6 +911,6 @@
          *      {@see JCheckBox}</ol>
          * </li>
-         * 
-         * 
+         *
+         *
          * @param view  the checkbox to control whether an adjustable participates in synchronized
          *      adjustment
Index: /trunk/src/org/openstreetmap/josm/io/OsmBzip2Importer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmBzip2Importer.java	(revision 1653)
+++ /trunk/src/org/openstreetmap/josm/io/OsmBzip2Importer.java	(revision 1653)
@@ -0,0 +1,42 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+import org.apache.tools.bzip2.CBZip2InputStream;
+import org.openstreetmap.josm.actions.ExtensionFileFilter;
+import org.xml.sax.SAXException;
+
+public class OsmBzip2Importer extends OsmImporter {
+
+    public OsmBzip2Importer() {
+        super(new ExtensionFileFilter("osm.bz2, osm.bz", "osm.bz2", tr("OSM Server Files bzip2 compressed")
+                + " (*.osm.bz2 *.osm.bz)"));
+    }
+
+    @Override
+    public void importData(File file) throws IOException {
+        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
+        int b = bis.read();
+        if (b != 'B') {
+            throw new IOException(tr("Invalid bz2 file."));
+        }
+        b = bis.read();
+        if (b != 'Z') {
+            throw new IOException(tr("Invalid bz2 file."));
+        }
+        CBZip2InputStream in = new CBZip2InputStream(bis);
+
+        try {
+            importData(in, file);
+        } catch (SAXException e) {
+            e.printStackTrace();
+            throw new IOException(tr("Could not read \"{0}\"", file.getName()));
+        }
+    }
+}
Index: /trunk/src/org/openstreetmap/josm/io/OsmGzipImporter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmGzipImporter.java	(revision 1653)
+++ /trunk/src/org/openstreetmap/josm/io/OsmGzipImporter.java	(revision 1653)
@@ -0,0 +1,30 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.zip.GZIPInputStream;
+
+import org.openstreetmap.josm.actions.ExtensionFileFilter;
+import org.xml.sax.SAXException;
+
+public class OsmGzipImporter extends OsmImporter {
+
+    public OsmGzipImporter() {
+        super(new ExtensionFileFilter("osm.gz", "osm.gz", tr("OSM Server Files gzip compressed") + " (*.osm.gz)"));
+    }
+
+    @Override
+    public void importData(File file) throws IOException {
+        GZIPInputStream in = new GZIPInputStream(new FileInputStream(file));
+        try {
+            importData(in, file);
+        } catch (SAXException e) {
+            e.printStackTrace();
+            throw new IOException(tr("Could not read \"{0}\"", file.getName()));
+        }
+    }
+}
Index: /trunk/src/org/openstreetmap/josm/io/OsmImporter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmImporter.java	(revision 1652)
+++ /trunk/src/org/openstreetmap/josm/io/OsmImporter.java	(revision 1653)
@@ -9,4 +9,5 @@
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.io.InputStream;
 
 import javax.swing.JOptionPane;
@@ -24,20 +25,12 @@
     }
 
+    public OsmImporter(ExtensionFileFilter filter) {
+        super(filter);
+    }
+
     @Override public void importData(File file) throws IOException {
         try {
-            OsmReader osm = OsmReader.parseDataSetOsm(new FileInputStream(file), null, Main.pleaseWaitDlg);
-            DataSet dataSet = osm.getDs();
-            OsmDataLayer layer = new OsmDataLayer(dataSet, file.getName(), file);
-            Main.main.addLayer(layer);
-            layer.fireDataChange();
-            if (osm.getParseNotes().length() != 0) {
-                /* display at most five lines */
-                String notes = osm.getParseNotes();
-                int j = 0;
-                for (int i = 0; i < 5; i++)
-                    j = notes.indexOf('\n', j + 1);
-                j = j >= 0 ? j : notes.length();
-                JOptionPane.showMessageDialog(Main.parent, notes.substring(0, j));
-            }
+            FileInputStream in = new FileInputStream(file);
+            importData(in, file);
         } catch (HeadlessException e) {
             e.printStackTrace();
@@ -51,3 +44,20 @@
         }
     }
+
+    protected void importData(InputStream in, File associatedFile) throws SAXException, IOException {
+        OsmReader osm = OsmReader.parseDataSetOsm(in, null, Main.pleaseWaitDlg);
+        DataSet dataSet = osm.getDs();
+        OsmDataLayer layer = new OsmDataLayer(dataSet, associatedFile.getName(), associatedFile);
+        Main.main.addLayer(layer);
+        layer.fireDataChange();
+        if (osm.getParseNotes().length() != 0) {
+            /* display at most five lines */
+            String notes = osm.getParseNotes();
+            int j = 0;
+            for (int i = 0; i < 5; i++)
+                j = notes.indexOf('\n', j + 1);
+            j = j >= 0 ? j : notes.length();
+            JOptionPane.showMessageDialog(Main.parent, notes.substring(0, j));
+        }
+    }
 }
