Index: trunk/src/org/openstreetmap/josm/io/OsmWriter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmWriter.java	(revision 3011)
+++ trunk/src/org/openstreetmap/josm/io/OsmWriter.java	(revision 3012)
@@ -5,4 +5,9 @@
 
 import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
 import java.util.Map.Entry;
 
@@ -61,18 +66,31 @@
     }
 
+    private static final Comparator<OsmPrimitive> byIdComparator = new Comparator<OsmPrimitive>() {
+        public int compare(OsmPrimitive o1, OsmPrimitive o2) {
+            return (o1.getUniqueId()<o2.getUniqueId() ? -1 : (o1.getUniqueId()==o2.getUniqueId() ? 0 : 1));
+        }
+    };
+
+    private Collection<OsmPrimitive> sortById(Collection<? extends OsmPrimitive> primitives) {
+        List<OsmPrimitive> result = new ArrayList<OsmPrimitive>(primitives.size());
+        result.addAll(primitives);
+        Collections.sort(result, byIdComparator);
+        return result;
+    }
+
     public void writeContent(DataSet ds) {
-        for (Node n : ds.getNodes()) {
+        for (OsmPrimitive n : sortById(ds.getNodes())) {
             if (shouldWrite(n)) {
-                visit(n);
-            }
-        }
-        for (Way w : ds.getWays()) {
+                visit((Node)n);
+            }
+        }
+        for (OsmPrimitive w : sortById(ds.getWays())) {
             if (shouldWrite(w)) {
-                visit(w);
-            }
-        }
-        for (Relation e : ds.getRelations()) {
+                visit((Way)w);
+            }
+        }
+        for (OsmPrimitive e: sortById(ds.getRelations())) {
             if (shouldWrite(e)) {
-                visit(e);
+                visit((Relation)e);
             }
         }
@@ -162,4 +180,10 @@
     }
 
+    private static final Comparator<Entry<String, String>> byKeyComparator = new Comparator<Entry<String,String>>() {
+        public int compare(Entry<String, String> o1, Entry<String, String> o2) {
+            return o1.getKey().compareTo(o2.getKey());
+        }
+    };
+
     private void addTags(Tagged osm, String tagname, boolean tagOpen) {
         if (osm.hasKeys()) {
@@ -167,5 +191,7 @@
                 out.println(">");
             }
-            for (Entry<String, String> e : osm.getKeys().entrySet()) {
+            List<Entry<String, String>> entries = new ArrayList<Entry<String,String>>(osm.getKeys().entrySet());
+            Collections.sort(entries, byKeyComparator);
+            for (Entry<String, String> e : entries) {
                 if ((osm instanceof Changeset) || !("created_by".equals(e.getKey()))) {
                     out.println("    <tag k='"+ XmlWriter.encode(e.getKey()) +
