Index: src/org/openstreetmap/josm/data/osm/UniqueIdGenerator.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/UniqueIdGenerator.java	(revision 17080)
+++ src/org/openstreetmap/josm/data/osm/UniqueIdGenerator.java	(working copy)
@@ -39,4 +39,15 @@
         }
         idCounter.set(newId);
     }
+
+
+    /**
+     * Generates a new primitive unique id. Uses the given value if that is smaller than the current id.
+     * @param wanted the wanted id
+     * @return long that is either equal
+     * @since xxx
+     */
+    public long advanceOrGenerate(long wanted) {
+        return idCounter.updateAndGet(x -> wanted < x ? wanted : x - 1);
+    }
 }
Index: src/org/openstreetmap/josm/io/AbstractReader.java
===================================================================
--- src/org/openstreetmap/josm/io/AbstractReader.java	(revision 17080)
+++ src/org/openstreetmap/josm/io/AbstractReader.java	(working copy)
@@ -622,11 +622,12 @@
 
     protected OsmPrimitive buildPrimitive(PrimitiveData pd) {
         OsmPrimitive p;
-        if (pd.getUniqueId() < pd.getIdGenerator().currentUniqueId()) {
-            p = pd.getType().newInstance(pd.getUniqueId(), true);
-            pd.getIdGenerator().advanceUniqueId(pd.getUniqueId());
+        final long id = pd.getUniqueId() > 0 ? pd.getId() : pd.getIdGenerator().advanceOrGenerate(pd.getUniqueId());
+
+        if (id < 0) {
+            p = pd.getType().newInstance(id, true);
         } else {
-            p = pd.getType().newVersionedInstance(pd.getId(), pd.getVersion());
+            p = pd.getType().newVersionedInstance(id, pd.getVersion());
         }
         p.setVisible(pd.isVisible());
         p.load(pd);
