Index: /trunk/src/org/openstreetmap/josm/io/OsmPbfReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmPbfReader.java	(revision 19032)
+++ /trunk/src/org/openstreetmap/josm/io/OsmPbfReader.java	(revision 19033)
@@ -16,7 +16,4 @@
 import java.util.Set;
 
-import jakarta.annotation.Nonnull;
-import jakarta.annotation.Nullable;
-
 import org.apache.commons.compress.utils.CountingInputStream;
 import org.openstreetmap.josm.data.Bounds;
@@ -31,4 +28,5 @@
 import org.openstreetmap.josm.data.osm.RelationMemberData;
 import org.openstreetmap.josm.data.osm.Tagged;
+import org.openstreetmap.josm.data.osm.UploadPolicy;
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.data.osm.WayData;
@@ -44,4 +42,7 @@
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.tools.Utils;
+
+import jakarta.annotation.Nonnull;
+import jakarta.annotation.Nullable;
 
 /**
@@ -523,4 +524,6 @@
             if (info != null) {
                 setOsmPrimitiveData(primitiveBlockRecord, node, info);
+            } else {
+                ds.setUploadPolicy(UploadPolicy.DISCOURAGED);
             }
             buildPrimitive(node);
@@ -572,4 +575,5 @@
             }
         }
+
         int keyValIndex = 0; // This index must not reset between nodes, and must always increment
         if (ids.length == lats.length && lats.length == lons.length && (denseInfo == null || denseInfo.length == lons.length)) {
@@ -579,11 +583,11 @@
             for (int i = 0; i < ids.length; i++) {
                 final NodeData node;
+                id += ids[i];
+                node = new NodeData(id);
                 if (denseInfo != null) {
                     Info info = denseInfo[i];
-                    id += ids[i];
-                    node = new NodeData(id);
                     setOsmPrimitiveData(primitiveBlockRecord, node, info);
                 } else {
-                    node = new NodeData(ids[i]);
+                    ds.setUploadPolicy(UploadPolicy.DISCOURAGED);
                 }
                 lat += lats[i];
@@ -679,4 +683,6 @@
         if (info != null) {
             setOsmPrimitiveData(primitiveBlockRecord, wayData, info);
+        } else {
+            ds.setUploadPolicy(UploadPolicy.DISCOURAGED);
         }
         buildPrimitive(wayData);
@@ -744,4 +750,6 @@
         if (info != null) {
             setOsmPrimitiveData(primitiveBlockRecord, data, info);
+        } else {
+            ds.setUploadPolicy(UploadPolicy.DISCOURAGED);
         }
         addTags(data, keys, values);
@@ -796,5 +804,5 @@
                         break;
                     case 6:
-                        visible = protobufRecord.asUnsignedVarInt().byteValue() == 0;
+                        visible = protobufRecord.asUnsignedVarInt().byteValue() == 1;
                         break;
                     default: // Fall through, since the PBF format could be extended
@@ -947,6 +955,5 @@
             }
         }
-        if (version.length == timestamp.length && timestamp.length == changeset.length && changeset.length == uid.length &&
-                uid.length == userSid.length && (visible == EMPTY_LONG || visible.length == userSid.length)) {
+        if (version.length > 0) {
             Info[] infos = new Info[version.length];
             long lastTimestamp = 0; // delta encoded
@@ -955,8 +962,12 @@
             long lastUserSid = 0; // delta encoded, string id for username
             for (int i = 0; i < version.length; i++) {
-                lastTimestamp += timestamp[i];
-                lastChangeset += changeset[i];
-                lastUid += uid[i];
-                lastUserSid += userSid[i];
+                if (timestamp.length > i)
+                    lastTimestamp += timestamp[i];
+                if (changeset.length > i)
+                    lastChangeset += changeset[i];
+                if (uid.length > i && userSid.length > i) {
+                    lastUid += uid[i];
+                    lastUserSid += userSid[i];
+                }
                 infos[i] = new Info((int) version[i], lastTimestamp, lastChangeset, (int) lastUid, (int) lastUserSid,
                         visible == EMPTY_LONG || visible[i] == 1);
Index: /trunk/test/data/regress/23599/w1194668585.orig.osm
===================================================================
--- /trunk/test/data/regress/23599/w1194668585.orig.osm	(revision 19033)
+++ /trunk/test/data/regress/23599/w1194668585.orig.osm	(revision 19033)
@@ -0,0 +1,17 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<osm version='0.6' generator='JOSM'>
+  <node id='11088568973' timestamp='2023-08-04T06:42:51Z' uid='533465' user='GerdP' visible='true' version='1' changeset='139425106' lat='52.7901028' lon='8.4290125' />
+  <node id='11088568974' timestamp='2023-08-04T06:42:51Z' uid='533465' user='GerdP' visible='true' version='1' changeset='139425106' lat='52.7898498' lon='8.4292298' />
+  <node id='11088568975' timestamp='2023-08-04T06:42:51Z' uid='533465' user='GerdP' visible='true' version='1' changeset='139425106' lat='52.7897903' lon='8.4290403' />
+  <node id='11088568976' timestamp='2023-08-04T06:42:51Z' uid='533465' user='GerdP' visible='true' version='1' changeset='139425106' lat='52.7900433' lon='8.4288231' />
+  <way id='1194668585' timestamp='2024-01-07T11:40:04Z' uid='12616326' user='os-emmer' visible='true' version='4' changeset='145987123'>
+    <nd ref='11088568976' />
+    <nd ref='11088568973' />
+    <nd ref='11088568974' />
+    <nd ref='11088568975' />
+    <nd ref='11088568976' />
+    <tag k='addr:housenumber' v='62' />
+    <tag k='addr:street' v='Hauptstraße' />
+    <tag k='building' v='apartments' />
+  </way>
+</osm>
Index: /trunk/test/unit/org/openstreetmap/josm/gui/io/importexport/OsmPbfImporterTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/io/importexport/OsmPbfImporterTest.java	(revision 19032)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/io/importexport/OsmPbfImporterTest.java	(revision 19033)
@@ -24,6 +24,8 @@
 import org.openstreetmap.josm.data.osm.AbstractPrimitive;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.UploadPolicy;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.protobuf.ProtobufTest;
@@ -159,3 +161,55 @@
         assertDoesNotThrow(() -> importer.parseDataSet(new ByteArrayInputStream(badData), NullProgressMonitor.INSTANCE));
     }
+
+    @Test
+    void testNonRegression23599a() throws IOException, IllegalDataException {
+        final DataSet dataSet;
+        try (InputStream inputStream = TestUtils.getRegressionDataStream(23599, "visible.osm.pbf")) {
+            dataSet = importer.parseDataSet(inputStream, NullProgressMonitor.INSTANCE);
+        }
+        assertTrue(dataSet.getNodes().stream().allMatch(OsmPrimitive::isVisible));
+        assertTrue(dataSet.getWays().stream().allMatch(OsmPrimitive::isVisible));
+        assertTrue(dataSet.getRelations().stream().allMatch(OsmPrimitive::isVisible));
+
+    }
+
+    @Test
+    void testNonRegression23599b() throws IOException, IllegalDataException {
+        final DataSet dataSet;
+        // osmconvert w1194668585.orig.osm -o=w1194668585.full.osm.pbf
+        try (InputStream inputStream = TestUtils.getRegressionDataStream(23599, "w1194668585.full.osm.pbf")) {
+            dataSet = importer.parseDataSet(inputStream, NullProgressMonitor.INSTANCE);
+        }
+        assertNotNull(dataSet.getPrimitiveById(1194668585L, OsmPrimitiveType.WAY));
+        assertEquals(145987123, dataSet.getPrimitiveById(1194668585L, OsmPrimitiveType.WAY).getChangesetId());
+        assertEquals(4, dataSet.getPrimitiveById(1194668585L, OsmPrimitiveType.WAY).getVersion());
+        assertEquals(UploadPolicy.NORMAL, dataSet.getUploadPolicy());
+    }
+
+    @Test
+    void testNonRegression23599c() throws IOException, IllegalDataException {
+        final DataSet dataSet;
+        // osmconvert --drop-author w1194668585.orig.osm -o=w1194668585.full.osm.pbf
+        try (InputStream inputStream = TestUtils.getRegressionDataStream(23599, "w1194668585.drop-author.osm.pbf")) {
+            dataSet = importer.parseDataSet(inputStream, NullProgressMonitor.INSTANCE);
+        }
+        assertNotNull(dataSet.getPrimitiveById(1194668585L, OsmPrimitiveType.WAY));
+        assertEquals(0, dataSet.getPrimitiveById(1194668585L, OsmPrimitiveType.WAY).getChangesetId());
+        assertEquals(4, dataSet.getPrimitiveById(1194668585L, OsmPrimitiveType.WAY).getVersion());
+        assertEquals(UploadPolicy.NORMAL, dataSet.getUploadPolicy());
+    }
+
+    @Test
+    void testNonRegression23599d() throws IOException, IllegalDataException {
+        final DataSet dataSet;
+        // osmconvert --drop-version w1194668585.orig.osm -o=w1194668585.full.osm.pbf
+        try (InputStream inputStream = TestUtils.getRegressionDataStream(23599, "w1194668585.drop-version.osm.pbf")) {
+            dataSet = importer.parseDataSet(inputStream, NullProgressMonitor.INSTANCE);
+        }
+        assertNotNull(dataSet.getPrimitiveById(1194668585L, OsmPrimitiveType.WAY));
+        assertEquals(0, dataSet.getPrimitiveById(1194668585L, OsmPrimitiveType.WAY).getChangesetId());
+        assertEquals(0, dataSet.getPrimitiveById(1194668585L, OsmPrimitiveType.WAY).getVersion());
+        assertEquals(UploadPolicy.DISCOURAGED, dataSet.getUploadPolicy());
+    }
+
 }
