Index: /trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(revision 17112)
+++ /trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(revision 17113)
@@ -39,5 +39,5 @@
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.osm.AbstractPrimitive;
-import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmUtils;
@@ -46,5 +46,5 @@
 import org.openstreetmap.josm.data.osm.TagMap;
 import org.openstreetmap.josm.data.osm.Tagged;
-import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.visitor.MergeSourceBuildingVisitor;
 import org.openstreetmap.josm.data.preferences.sources.ValidatorPrefHelper;
 import org.openstreetmap.josm.data.validation.OsmValidator;
@@ -972,15 +972,12 @@
 
         int unchangedDeprecated = countDeprecated(p);
+
+        // see #19895: create deep clone. This complex method works even with locked files
+        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(p.getDataSet());
+        p.accept(builder);
+        DataSet clonedDs = builder.build();
+        OsmPrimitive clone = clonedDs.getPrimitiveById(p.getPrimitiveId());
+
         Iterator<String> iter = fixVals.iterator();
-        OsmPrimitive clone;
-        if (p instanceof Node) {
-            clone = new Node((Node) p);
-        } else if (p instanceof Way) {
-            clone = new Way((Way) p);
-        } else if (p instanceof Relation) {
-            clone = new Relation((Relation) p);
-        } else {
-            return; // should not happen
-        }
         while (iter.hasNext()) {
             clone.put(key, iter.next());
@@ -989,4 +986,5 @@
         }
     }
+
 
     private int countDeprecated(OsmPrimitive p) {
