Index: /trunk/src/org/openstreetmap/josm/io/OsmWriter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmWriter.java	(revision 9309)
+++ /trunk/src/org/openstreetmap/josm/io/OsmWriter.java	(revision 9310)
@@ -15,4 +15,5 @@
 import org.openstreetmap.josm.data.coor.CoordinateFormat;
 import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.AbstractPrimitive;
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -93,7 +94,16 @@
     }
 
-    protected static final Comparator<OsmPrimitive> byIdComparator = new Comparator<OsmPrimitive>() {
-        @Override public int compare(OsmPrimitive o1, OsmPrimitive o2) {
-            return o1.getUniqueId() < o2.getUniqueId() ? -1 : (o1.getUniqueId() == o2.getUniqueId() ? 0 : 1);
+    /**
+     * Sorts {@code -1} &rarr; {@code -infinity}, then {@code +1} &rarr; {@code +infinity}
+     */
+    protected static final Comparator<AbstractPrimitive> byIdComparator = new Comparator<AbstractPrimitive>() {
+        @Override public int compare(AbstractPrimitive o1, AbstractPrimitive o2) {
+            final long i1 = o1.getUniqueId();
+            final long i2 = o2.getUniqueId();
+            if (i1 < 0 && i2 < 0) {
+                return Long.compare(i2, i1);
+            } else {
+                return Long.compare(i1, i2);
+            }
         }
     };
Index: /trunk/test/unit/org/openstreetmap/josm/io/OsmWriterTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/io/OsmWriterTest.java	(revision 9310)
+++ /trunk/test/unit/org/openstreetmap/josm/io/OsmWriterTest.java	(revision 9310)
@@ -0,0 +1,38 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.junit.Test;
+import org.openstreetmap.josm.data.osm.NodeData;
+import org.openstreetmap.josm.tools.Utils;
+
+public class OsmWriterTest {
+
+    @Test
+    public void testByIdComparator() throws Exception {
+
+        final List<NodeData> ids = new ArrayList<>();
+        for (Long id : Arrays.asList(12L, Long.MIN_VALUE, 65L, -12L, 2L, 0L, -3L, -20L, Long.MAX_VALUE)) {
+            final NodeData n = new NodeData();
+            n.setId(id);
+            ids.add(n);
+        }
+
+        Collections.sort(ids, OsmWriter.byIdComparator);
+
+        final String idsAsString = Utils.transform(ids, new Utils.Function<NodeData, Object>() {
+            @Override
+            public Object apply(NodeData x) {
+                return x.getUniqueId();
+            }
+        }).toString();
+
+        assertEquals("[-3, -12, -20, -9223372036854775808, 0, 2, 12, 65, 9223372036854775807]", idsAsString);
+    }
+}
