Index: pbf/src/org/openstreetmap/josm/plugins/pbf/io/PbfWriter.java
===================================================================
--- pbf/src/org/openstreetmap/josm/plugins/pbf/io/PbfWriter.java	(revision 32862)
+++ pbf/src/org/openstreetmap/josm/plugins/pbf/io/PbfWriter.java	(working copy)
@@ -97,8 +97,11 @@
                         stable.incr(tag.getKey());
                         stable.incr(tag.getValue());
                     }
-                    if (!omit_metadata && i.getUser() != null) {
-                        stable.incr(i.getUser().getName());
+                    if (!omit_metadata) {
+                    	String userId = i.getUser() != null ? i.getUser().getName() : null;
+                    	if (userId == null)
+                    		userId = "";
+                    	stable.incr(userId);
                     }
                 }
             }
@@ -116,7 +119,10 @@
                 for (OsmPrimitive e : entities) {
 
                     int uid = e.getUser() == null ? -1 : (int) e.getUser().getId();
-                    int userSid = stable.getIndex(e.getUser() == null ? "" : e.getUser().getName());
+                    String userId = e.getUser() != null ? e.getUser().getName() : null;
+                    if (userId == null)
+                    	userId = "";
+                    int userSid = stable.getIndex(userId);
                     int timestamp = (int) (e.getTimestamp().getTime() / date_granularity);
                     int version = e.getVersion();
                     long changeset = e.getChangesetId();
@@ -186,7 +192,7 @@
                 }
 
                 for (Node i : contents) {
-                    long id = i.getId();
+                    long id = i.getUniqueId();
                     bi.addId(id - lastid);
                     lastid = id;
                     LatLon coor = i.getCoor();
@@ -224,7 +230,7 @@
                 StringTable stable = getStringTable();
                 Osmformat.PrimitiveGroup.Builder builder = Osmformat.PrimitiveGroup.newBuilder();
                 for (Node i : contents) {
-                    long id = i.getId();
+                    long id = i.getUniqueId();
                     LatLon coor = i.getCoor();
                     int lat = mapDegrees(coor.lat());
                     int lon = mapDegrees(coor.lon());
@@ -257,10 +263,10 @@
                 Osmformat.PrimitiveGroup.Builder builder = Osmformat.PrimitiveGroup.newBuilder();
                 for (Way i : contents) {
                     Osmformat.Way.Builder bi = Osmformat.Way.newBuilder();
-                    bi.setId(i.getId());
+                    bi.setId(i.getUniqueId());
                     long lastid = 0;
                     for (Node j : i.getNodes()) {
-                        long id = j.getId();
+                        long id = j.getUniqueId();
                         bi.addRefs(id - lastid);
                         lastid = id;
                     }
@@ -299,12 +305,12 @@
                 Osmformat.PrimitiveGroup.Builder builder = Osmformat.PrimitiveGroup.newBuilder();
                 for (Relation i : contents) {
                     Osmformat.Relation.Builder bi = Osmformat.Relation.newBuilder();
-                    bi.setId(i.getId());
+                    bi.setId(i.getUniqueId());
                     RelationMember[] arr = new RelationMember[i.getMembers().size()];
                     i.getMembers().toArray(arr);
                     long lastid = 0;
                     for (RelationMember j : i.getMembers()) {
-                        long id = j.getMember().getId();
+                        long id = j.getMember().getUniqueId();
                         bi.addMemids(id - lastid);
                         lastid = id;
                         if (j.getType() == OsmPrimitiveType.NODE) {
@@ -476,15 +482,12 @@
 
         public void process(DataSet ds) {
             processor.processSources(ds.dataSources);
-            for (Node n : ds.getNodes()) {
-                processor.processNode(n);
-            }
-            for (Way w : ds.getWays()) {
-                processor.processWay(w);
-            }
-            for (Relation r : ds.getRelations()) {
-                processor.processRelation(r);
-            }
+			ds.getNodes().stream().sorted((n1, n2) -> Long.compare(n1.getUniqueId(), n2.getUniqueId()))
+					.filter(n -> n.getCoor() != null).forEach((n) -> processor.processNode(n));
+			ds.getWays().stream().sorted((w1, w2) -> Long.compare(w1.getUniqueId(), w2.getUniqueId()))
+					.filter(w -> w.getNodesCount() > 0).forEach((w) -> processor.processWay(w));
+			ds.getRelations().stream().sorted((r1, r2) -> Long.compare(r1.getUniqueId(), r2.getUniqueId()))
+					.filter(r -> r.getMembersCount() > 0).forEach((r) -> processor.processRelation(r));
         }
 
         public void complete() {
Index: pbf/test/unit/org/openstreetmap/josm/plugins/pbf/io/PbfExporterTest.java
===================================================================
--- pbf/test/unit/org/openstreetmap/josm/plugins/pbf/io/PbfExporterTest.java	(revision 32862)
+++ pbf/test/unit/org/openstreetmap/josm/plugins/pbf/io/PbfExporterTest.java	(working copy)
@@ -32,7 +32,6 @@
      * @throws Exception if an error occurs
      */
     @Test
-    @Ignore("TODO: to fix")
     public void testTicket11169() throws Exception {
         try (InputStream is = Compression.ZIP.getUncompressedInputStream(
                 new FileInputStream(TestUtils.getRegressionDataFile(11169, "Portsmouth_Area.osm.zip")))) {
