Index: trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java	(revision 2932)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java	(revision 2933)
@@ -218,5 +218,5 @@
             Node targetNode = (Node)getMergeTarget(sourceNode);
             if (targetNode != null) {
-                if (!targetNode.isDeleted() && targetNode.isVisible()) {
+                if (targetNode.isVisible()) {
                     newNodes.add(targetNode);
                 } else {
@@ -245,5 +245,5 @@
             if (targetMember == null)
                 throw new IllegalStateException(tr("Missing merge target of type {0} with id {1}", sourceMember.getType(), sourceMember.getUniqueId()));
-            if (! targetMember.isDeleted() && targetMember.isVisible()) {
+            if (targetMember.isVisible()) {
                 RelationMember newMember = new RelationMember(sourceMember.getRole(), targetMember);
                 newMembers.add(newMember);
@@ -275,5 +275,6 @@
         if (! target.isVisible() && source.isVisible()) {
             // should not happen
-            //
+            // FIXME: this message does not make sense, source version can not be lower than
+            //        target version at this point
             logger.warning(tr("Target object with id {0} and version {1} is visible although "
                     + "source object with lower version {2} is not visible. "
@@ -305,4 +306,8 @@
             // same version, but target is deleted. Assume target takes precedence
             // otherwise too many conflicts when refreshing from the server
+            // but, if source has referrers there is a conflict
+            if (!source.getReferrers().isEmpty()) {
+                conflicts.add(target, source);
+            }
         } else if (target.isDeleted() != source.isDeleted()) {
             // differences in deleted state have to be resolved manually. This can
@@ -313,11 +318,14 @@
             // target not modified. We can assume that source is the most recent version.
             // clone it into target. But check first, whether source is deleted. if so,
-            // make sure that target is not referenced any more in myDataSet.
-            //
+            // make sure that target is not referenced any more in myDataSet. If it is there
+            // is a conflict
             if (source.isDeleted()) {
-                deletedObjectsToUnlink.add(source);
-            }
-            target.mergeFrom(source);
-            objectsWithChildrenToMerge.add(source.getPrimitiveId());
+                if (!target.getReferrers().isEmpty()) {
+                    conflicts.add(target, source);
+                }
+            } else {
+                target.mergeFrom(source);
+                objectsWithChildrenToMerge.add(source.getPrimitiveId());
+            }
         } else if (! target.isModified() && !source.isModified() && target.getVersion() == source.getVersion()) {
             // both not modified. Merge nevertheless.
