Index: /trunk/src/org/openstreetmap/josm/data/osm/Node.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/Node.java	(revision 9978)
+++ /trunk/src/org/openstreetmap/josm/data/osm/Node.java	(revision 9979)
@@ -281,8 +281,8 @@
 
     @Override
-    public boolean hasEqualSemanticAttributes(OsmPrimitive other) {
+    public boolean hasEqualSemanticAttributes(OsmPrimitive other, boolean testInterestingTagsOnly) {
         if (!(other instanceof Node))
             return false;
-        if (!super.hasEqualSemanticAttributes(other))
+        if (!super.hasEqualSemanticAttributes(other, testInterestingTagsOnly))
             return false;
         Node n = (Node) other;
Index: /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 9978)
+++ /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 9979)
@@ -1237,5 +1237,5 @@
      * @return true if this primitive and other are equal with respect to their semantic attributes.
      */
-    public boolean hasEqualSemanticAttributes(OsmPrimitive other) {
+    public final boolean hasEqualSemanticAttributes(OsmPrimitive other) {
         return hasEqualSemanticAttributes(other, true);
     }
Index: /trunk/src/org/openstreetmap/josm/data/osm/Relation.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 9978)
+++ /trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 9979)
@@ -287,8 +287,8 @@
 
     @Override
-    public boolean hasEqualSemanticAttributes(OsmPrimitive other) {
+    public boolean hasEqualSemanticAttributes(OsmPrimitive other, boolean testInterestingTagsOnly) {
         if (!(other instanceof Relation))
             return false;
-        if (!super.hasEqualSemanticAttributes(other))
+        if (!super.hasEqualSemanticAttributes(other, testInterestingTagsOnly))
             return false;
         Relation r = (Relation) other;
Index: /trunk/src/org/openstreetmap/josm/data/osm/Way.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 9978)
+++ /trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 9979)
@@ -331,8 +331,8 @@
 
     @Override
-    public boolean hasEqualSemanticAttributes(OsmPrimitive other) {
+    public boolean hasEqualSemanticAttributes(OsmPrimitive other, boolean testInterestingTagsOnly) {
         if (!(other instanceof Way))
             return false;
-        if (!super.hasEqualSemanticAttributes(other))
+        if (!super.hasEqualSemanticAttributes(other, testInterestingTagsOnly))
             return false;
         Way w = (Way) other;
Index: /trunk/test/unit/org/openstreetmap/josm/data/osm/DataSetMergerTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/osm/DataSetMergerTest.java	(revision 9978)
+++ /trunk/test/unit/org/openstreetmap/josm/data/osm/DataSetMergerTest.java	(revision 9979)
@@ -1034,3 +1034,43 @@
     }
 
+
+    /**
+     * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/12616">Bug #12616</a>.
+     */
+    @Test
+    public void testTicket12616() {
+        // Server node: no modifications
+        Node n1 = new Node(1, 1);
+        n1.setCoor(LatLon.ZERO);
+        assertFalse(n1.isModified());
+        their.addPrimitive(n1);
+
+        // Local node: one modification: move
+        Node n1b = new Node(n1);
+        n1b.setCoor(new LatLon(1, 1));
+        n1b.setModified(true);
+        assertTrue(n1b.isModified());
+        assertEquals(new LatLon(1, 1), n1b.getCoor());
+        my.addPrimitive(n1b);
+
+        // Merge
+        DataSetMerger visitor = new DataSetMerger(my, their);
+        visitor.merge();
+
+        // Check that modification is still here
+        Node n = (Node) my.getPrimitiveById(1, OsmPrimitiveType.NODE);
+        assertNotNull(n);
+        assertEquals(new LatLon(1, 1), n.getCoor());
+        assertTrue(n.isModified());
+
+        // Merge again
+        visitor = new DataSetMerger(my, their);
+        visitor.merge();
+
+        // Check that modification is still here
+        n = (Node) my.getPrimitiveById(1, OsmPrimitiveType.NODE);
+        assertNotNull(n);
+        assertEquals(new LatLon(1, 1), n.getCoor());
+        assertTrue(n.isModified());
+    }
 }
