Index: src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java	(Revision 19056)
+++ src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java	(Arbeitskopie)
@@ -3,6 +3,10 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 import java.text.MessageFormat;
 import java.time.Instant;
 import java.util.ArrayList;
@@ -132,9 +136,8 @@
 
     /**
      * Put several boolean flags to one short int field to save memory.
-     * Other bits of this field are used in subclasses.
      */
-    protected volatile short flags = FLAG_VISIBLE;   // visible per default
+    private volatile short flags = FLAG_VISIBLE;   // visible per default
 
     /**
      * The mappaint cache index for this primitive.
@@ -365,6 +368,14 @@
         return oldFlags != flags;
     }
 
+    protected void storeFlags(ObjectOutputStream oos) throws IOException {
+        oos.writeShort(flags);
+    }
+
+    protected void restoreFlags(ObjectInputStream ios) throws IOException {
+        flags = ios.readShort();
+    }
+
     @Override
     public void setModified(boolean modified) {
         updateFlags(FLAG_MODIFIED, modified);
@@ -418,6 +429,46 @@
     }
 
     @Override
+    public boolean hasDirectionKeys() {
+        return (flags & FLAG_HAS_DIRECTIONS) != 0;
+    }
+
+    @Override
+    public boolean reversedDirection() {
+        return (flags & FLAG_DIRECTION_REVERSED) != 0;
+    }
+
+    @Override
+    public boolean isTagged() {
+        return (flags & FLAG_TAGGED) != 0;
+    }
+
+    @Override
+    public boolean isAnnotated() {
+        return (flags & FLAG_ANNOTATED) != 0;
+    }
+
+    @Override
+    public boolean isHighlighted() {
+        return (flags & FLAG_HIGHLIGHTED) != 0;
+    }
+
+    @Override
+    public boolean isDisabled() {
+        return (flags & FLAG_DISABLED) != 0;
+    }
+
+    @Override
+    public boolean isDisabledAndHidden() {
+        return ((flags & FLAG_DISABLED) != 0) && ((flags & FLAG_HIDE_IF_DISABLED) != 0);
+    }
+
+    @Override
+    public boolean isPreserved() {
+        return (flags & FLAG_PRESERVED) != 0;
+    }
+
+    @Override
     public boolean isIncomplete() {
         return (flags & FLAG_INCOMPLETE) != 0;
     }
@@ -458,6 +509,10 @@
         updateFlags(FLAG_HIDDEN_TYPE, isExplicit);
     }
 
+    public void copyFlagsFrom(AbstractPrimitive old) {
+        flags = old.flags;
+    }
+
     @Override
     public boolean isDrawable() {
         return (flags & (FLAG_DELETED + FLAG_INCOMPLETE + FLAG_HIDE_IF_DISABLED)) == 0;
Index: src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(Revision 19056)
+++ src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(Arbeitskopie)
@@ -364,21 +364,6 @@
     }
 
     @Override
-    public boolean isDisabled() {
-        return (flags & FLAG_DISABLED) != 0;
-    }
-
-    @Override
-    public boolean isDisabledAndHidden() {
-        return ((flags & FLAG_DISABLED) != 0) && ((flags & FLAG_HIDE_IF_DISABLED) != 0);
-    }
-
-    @Override
-    public boolean isPreserved() {
-        return (flags & FLAG_PRESERVED) != 0;
-    }
-
-    @Override
     public boolean isSelectable() {
         // not synchronized -> check disabled twice just to be sure we did not have a race condition.
         return !isDisabled() && isDrawable() && !isDisabled();
@@ -492,11 +477,6 @@
         }
     }
 
-    @Override
-    public boolean isHighlighted() {
-        return (flags & FLAG_HIGHLIGHTED) != 0;
-    }
-
     /*---------------
      * DIRECTION KEYS
      *---------------*/
@@ -526,16 +506,6 @@
         updateFlagsNoLock(FLAG_ANNOTATED, hasKeys() && getWorkInProgressKeys().stream().anyMatch(this::hasKey));
     }
 
-    @Override
-    public boolean isTagged() {
-        return (flags & FLAG_TAGGED) != 0;
-    }
-
-    @Override
-    public boolean isAnnotated() {
-        return (flags & FLAG_ANNOTATED) != 0;
-    }
-
     protected void updateDirectionFlags() {
         boolean hasDirections = false;
         boolean directionReversed = false;
@@ -551,16 +521,6 @@
         updateFlagsNoLock(FLAG_HAS_DIRECTIONS, hasDirections);
     }
 
-    @Override
-    public boolean hasDirectionKeys() {
-        return (flags & FLAG_HAS_DIRECTIONS) != 0;
-    }
-
-    @Override
-    public boolean reversedDirection() {
-        return (flags & FLAG_DIRECTION_REVERSED) != 0;
-    }
-
     /*------------
      * Keys handling
      ------------*/
@@ -854,8 +814,8 @@
             setKeys(other.hasKeys() ? other.getKeys() : null);
             timestamp = other.timestamp;
             version = other.version;
-            setIncomplete(other.isIncomplete());
-            flags = other.flags;
+            setIncomplete(other.isIncomplete()); /* hmm, why, it's done by copyFlagsFrom() */
+            copyFlagsFrom(other);
             user = other.user;
             changesetId = other.changesetId;
         } finally {
Index: src/org/openstreetmap/josm/data/osm/PrimitiveData.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/PrimitiveData.java	(Revision 19056)
+++ src/org/openstreetmap/josm/data/osm/PrimitiveData.java	(Arbeitskopie)
@@ -90,7 +90,7 @@
         oos.writeInt(changesetId);
         oos.writeInt(timestamp);
         oos.writeObject(keys);
-        oos.writeShort(flags);
+        storeFlags(oos);
         oos.defaultWriteObject();
     }
 
@@ -103,7 +103,7 @@
         changesetId = ois.readInt();
         timestamp = ois.readInt();
         keys = (String[]) ois.readObject();
-        flags = ois.readShort();
+        restoreFlags(ois);
         ois.defaultReadObject();
     }
 
Index: src/org/openstreetmap/josm/data/vector/VectorPrimitive.java
===================================================================
--- src/org/openstreetmap/josm/data/vector/VectorPrimitive.java	(Revision 19056)
+++ src/org/openstreetmap/josm/data/vector/VectorPrimitive.java	(Arbeitskopie)
@@ -59,11 +59,6 @@
     }
 
     @Override
-    public boolean isTagged() {
-        return (flags & FLAG_TAGGED) != 0;
-    }
-
-    @Override
     public boolean isAnnotated() {
         return this.getInterestingTags().size() - this.getKeys().size() > 0;
     }
