Index: /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 17821)
+++ /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 17822)
@@ -570,5 +570,5 @@
         // 'area' is not really uninteresting (putting it in that list may have unpredictable side effects)
         // but it's clearly not enough to consider an object as tagged (see #9261)
-        updateFlagsNoLock(FLAG_TAGGED, keys()
+        updateFlagsNoLock(FLAG_TAGGED, hasKeys() && keys()
                 .anyMatch(key -> !isUninterestingKey(key) && !"area".equals(key)));
     }
Index: /trunk/src/org/openstreetmap/josm/io/AbstractReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/AbstractReader.java	(revision 17821)
+++ /trunk/src/org/openstreetmap/josm/io/AbstractReader.java	(revision 17822)
@@ -595,5 +595,5 @@
          * @throws IllegalDataException in case of invalid data
          */
-        void accept(Node n) throws IllegalDataException;
+        void accept(NodeData n) throws IllegalDataException;
     }
 
@@ -606,5 +606,5 @@
          * @throws IllegalDataException in case of invalid data
          */
-        void accept(Way w, Collection<Long> nodeIds) throws IllegalDataException;
+        void accept(WayData w, Collection<Long> nodeIds) throws IllegalDataException;
     }
 
@@ -617,5 +617,5 @@
          * @throws IllegalDataException in case of invalid data
          */
-        void accept(Relation r, Collection<RelationMemberData> members) throws IllegalDataException;
+        void accept(RelationData r, Collection<RelationMemberData> members) throws IllegalDataException;
     }
 
@@ -643,7 +643,6 @@
 
     private Node addNode(NodeData nd, NodeReader nodeReader) throws IllegalDataException {
-        Node n = (Node) buildPrimitive(nd);
-        nodeReader.accept(n);
-        return n;
+        nodeReader.accept(nd);
+        return (Node) buildPrimitive(nd);
     }
 
@@ -691,14 +690,13 @@
         WayData wd = new WayData(0);
         commonReader.accept(wd);
-        Way w = (Way) buildPrimitive(wd);
 
         Collection<Long> nodeIds = new ArrayList<>();
-        wayReader.accept(w, nodeIds);
-        if (w.isDeleted() && !nodeIds.isEmpty()) {
-            Logging.info(tr("Deleted way {0} contains nodes", Long.toString(w.getUniqueId())));
+        wayReader.accept(wd, nodeIds);
+        if (wd.isDeleted() && !nodeIds.isEmpty()) {
+            Logging.info(tr("Deleted way {0} contains nodes", Long.toString(wd.getUniqueId())));
             nodeIds = new ArrayList<>();
         }
         ways.put(wd.getUniqueId(), nodeIds);
-        return w;
+        return (Way) buildPrimitive(wd);
     }
 
@@ -706,17 +704,16 @@
         RelationData rd = new RelationData(0);
         commonReader.accept(rd);
-        Relation r = (Relation) buildPrimitive(rd);
 
         Collection<RelationMemberData> members = new ArrayList<>();
-        relationReader.accept(r, members);
-        if (r.isDeleted() && !members.isEmpty()) {
-            Logging.info(tr("Deleted relation {0} contains members", Long.toString(r.getUniqueId())));
+        relationReader.accept(rd, members);
+        if (rd.isDeleted() && !members.isEmpty()) {
+            Logging.info(tr("Deleted relation {0} contains members", Long.toString(rd.getUniqueId())));
             members = new ArrayList<>();
         }
         relations.put(rd.getUniqueId(), members);
-        return r;
-    }
-
-    protected final RelationMemberData parseRelationMember(Relation r, String ref, String type, String role) throws IllegalDataException {
+        return (Relation) buildPrimitive(rd);
+    }
+
+    protected final RelationMemberData parseRelationMember(RelationData r, String ref, String type, String role) throws IllegalDataException {
         if (ref == null) {
             throw new IllegalDataException(tr("Missing attribute ''ref'' on member in relation {0}.",
@@ -731,5 +728,5 @@
     }
 
-    protected final RelationMemberData parseRelationMember(Relation r, long id, String type, String role) throws IllegalDataException {
+    protected final RelationMemberData parseRelationMember(RelationData r, long id, String type, String role) throws IllegalDataException {
         if (id == 0) {
             throw new IllegalDataException(tr("Incomplete <member> specification with ref=0"));
Index: /trunk/src/org/openstreetmap/josm/io/OsmJsonReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmJsonReader.java	(revision 17821)
+++ /trunk/src/org/openstreetmap/josm/io/OsmJsonReader.java	(revision 17822)
@@ -19,8 +19,8 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.PrimitiveData;
-import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationData;
 import org.openstreetmap.josm.data.osm.RelationMemberData;
 import org.openstreetmap.josm.data.osm.Tagged;
-import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.WayData;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
@@ -144,5 +144,5 @@
     }
 
-    private static void readWayNodesAndTags(JsonObject item, Way w, Collection<Long> nodeIds) {
+    private static void readWayNodesAndTags(JsonObject item, WayData w, Collection<Long> nodeIds) {
         for (JsonValue v : item.getJsonArray("nodes")) {
             nodeIds.add(((JsonNumber) v).longValue());
@@ -155,5 +155,5 @@
     }
 
-    private void readRelationMembersAndTags(JsonObject item, Relation r, Collection<RelationMemberData> members)
+    private void readRelationMembersAndTags(JsonObject item, RelationData r, Collection<RelationMemberData> members)
             throws IllegalDataException {
         JsonArray jsonArray = item.getJsonArray("members");
Index: /trunk/src/org/openstreetmap/josm/io/OsmReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmReader.java	(revision 17821)
+++ /trunk/src/org/openstreetmap/josm/io/OsmReader.java	(revision 17822)
@@ -22,9 +22,12 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.NodeData;
 import org.openstreetmap.josm.data.osm.PrimitiveData;
 import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationData;
 import org.openstreetmap.josm.data.osm.RelationMemberData;
 import org.openstreetmap.josm.data.osm.Tagged;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.WayData;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
@@ -235,5 +238,5 @@
     }
 
-    private void parseNodeTags(Node n) throws IllegalDataException {
+    private void parseNodeTags(NodeData n) throws IllegalDataException {
         try {
             while (parser.hasNext()) {
@@ -263,5 +266,5 @@
     }
 
-    private void parseWayNodesAndTags(Way w, Collection<Long> nodeIds) throws IllegalDataException {
+    private void parseWayNodesAndTags(WayData w, Collection<Long> nodeIds) throws IllegalDataException {
         try {
             while (parser.hasNext()) {
@@ -287,5 +290,5 @@
     }
 
-    private long parseWayNode(Way w) throws XMLStreamException {
+    private long parseWayNode(WayData w) throws XMLStreamException {
         if (parser.getAttributeValue(null, "ref") == null) {
             throwException(
@@ -312,5 +315,5 @@
     }
 
-    private void parseRelationMembersAndTags(Relation r, Collection<RelationMemberData> members) throws IllegalDataException {
+    private void parseRelationMembersAndTags(RelationData r, Collection<RelationMemberData> members) throws IllegalDataException {
         try {
             while (parser.hasNext()) {
@@ -336,5 +339,5 @@
     }
 
-    private RelationMemberData parseRelationMember(Relation r) throws XMLStreamException {
+    private RelationMemberData parseRelationMember(RelationData r) throws XMLStreamException {
         RelationMemberData result = null;
         try {
