Index: /trunk/src/org/openstreetmap/josm/io/OsmReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmReader.java	(revision 14037)
+++ /trunk/src/org/openstreetmap/josm/io/OsmReader.java	(revision 14038)
@@ -571,6 +571,6 @@
                             v, current.getUniqueId()));
                     current.setChangesetId(0);
-                } else {
-                    // for an existing primitive this is a problem
+                } else if (current.getChangesetId() < 0) {
+                    // for an existing primitive this is a problem only for negative ids (GPDR extracts are set to 0)
                     throwException(tr("Illegal value for attribute ''changeset''. Got {0}.", v));
                 }
Index: /trunk/test/unit/org/openstreetmap/josm/io/OsmReaderTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/io/OsmReaderTest.java	(revision 14037)
+++ /trunk/test/unit/org/openstreetmap/josm/io/OsmReaderTest.java	(revision 14038)
@@ -13,4 +13,5 @@
 import java.nio.charset.StandardCharsets;
 
+import org.junit.Rule;
 import org.junit.Test;
 import org.openstreetmap.josm.TestUtils;
@@ -19,4 +20,7 @@
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
@@ -25,4 +29,11 @@
 public class OsmReaderTest {
 
+    /**
+     * Setup rule
+     */
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules();
+
     private static final class PostProcessorStub implements OsmServerReadPostprocessor {
         boolean called;
@@ -99,4 +110,16 @@
         testUnknown("<osm version='0.6'><foo>bar</foo></osm>");
         testUnknown("<osm version='0.6'><foo><bar/></foo></osm>");
+    }
+
+    /**
+     * Test valid data.
+     * @param osm OSM data without XML prefix
+     * @throws Exception if any error occurs
+     */
+    private static void testValidData(String osm) throws Exception {
+        try (InputStream in = new ByteArrayInputStream(
+                ("<?xml version='1.0' encoding='UTF-8'?>" + osm).getBytes(StandardCharsets.UTF_8))) {
+            OsmReader.parseDataSet(in, NullProgressMonitor.INSTANCE);
+        }
     }
 
@@ -240,6 +263,15 @@
         testInvalidData("<osm version='0.6'><node id='1' version='1' changeset='nan'/></osm>",
                 "Illegal value for attribute 'changeset'. Got nan. (at line 1, column 100). 100 bytes have been read");
-        testInvalidData("<osm version='0.6'><node id='1' version='1' changeset='0'/></osm>",
-                "Illegal value for attribute 'changeset'. Got 0. (at line 1, column 98). 98 bytes have been read");
+        testInvalidData("<osm version='0.6'><node id='1' version='1' changeset='-1'/></osm>",
+                "Illegal value for attribute 'changeset'. Got -1. (at line 1, column 99). 99 bytes have been read");
+    }
+
+    /**
+     * Test GPDR-compliant changeset.
+     * @throws Exception if any error occurs
+     */
+    @Test
+    public void testGdprChangeset() throws Exception {
+        testValidData("<osm version='0.6'><node id='1' version='1' changeset='0'/></osm>");
     }
 
