Index: /trunk/src/org/openstreetmap/josm/data/conflict/Conflict.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/conflict/Conflict.java	(revision 2880)
+++ /trunk/src/org/openstreetmap/josm/data/conflict/Conflict.java	(revision 2881)
@@ -18,6 +18,6 @@
  */
 public class  Conflict<T extends OsmPrimitive> {
-    private T my;
-    private T their;
+    private final T my;
+    private final T their;
 
     public Conflict(T my, T their) {
Index: /trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java	(revision 2880)
+++ /trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java	(revision 2881)
@@ -12,7 +12,7 @@
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
-import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Observable;
 
@@ -229,11 +229,5 @@
 
     protected void copyToTop(ListRole role, int []rows) {
-        if (rows == null || rows.length == 0)
-            return;
-        for (int i = rows.length - 1; i >= 0; i--) {
-            int row = rows[i];
-            T n = entries.get(role).get(row);
-            entries.get(MERGED_ENTRIES).add(0, cloneEntryForMergedList(n));
-        }
+        copy(role, rows, 0);
         fireModelDataChanged();
         mergedEntriesSelectionModel.setSelectionInterval(0, rows.length -1);
@@ -272,13 +266,7 @@
 
     public void copyToEnd(ListRole source, int [] rows) {
-        if (rows == null || rows.length == 0)
-            return;
-        ArrayList<T> mergedEntries = getMergedEntries();
-        for (int row : rows) {
-            T n = entries.get(source).get(row);
-            mergedEntries.add(cloneEntryForMergedList(n));
-        }
+        copy(source, rows, getMergedEntriesSize());
         fireModelDataChanged();
-        mergedEntriesSelectionModel.setSelectionInterval(mergedEntries.size()-rows.length, mergedEntries.size() -1);
+        mergedEntriesSelectionModel.setSelectionInterval(getMergedEntriesSize()-rows.length, getMergedEntriesSize() -1);
 
     }
@@ -306,4 +294,16 @@
     }
 
+    private void copy(ListRole sourceRole, int[] rows, int position) {
+        List<T> newItems = new ArrayList<T>(rows.length);
+        List<T> source = entries.get(sourceRole);
+        for (int row: rows) {
+            T clone = cloneEntryForMergedList(source.get(row));
+            if (clone != null) {
+                newItems.add(clone);
+            }
+        }
+        getMergedEntries().addAll(position, newItems);
+    }
+
     /**
      * Copies the nodes given by indices in rows from the list of  nodes <code>source</code> to the
@@ -317,14 +317,5 @@
      */
     protected void copyBeforeCurrent(ListRole source, int [] rows, int current) {
-        if (rows == null || rows.length == 0)
-            return;
-        ArrayList<T> mergedEntries = getMergedEntries();
-        if (current < 0 || current >= mergedEntries.size())
-            throw new IllegalArgumentException(MessageFormat.format("Parameter current out of range. Got {0}.", current));
-        for (int i=rows.length -1; i>=0; i--) {
-            int row = rows[i];
-            T n = entries.get(source).get(row);
-            mergedEntries.add(current, cloneEntryForMergedList(n));
-        }
+        copy(source, rows, current);
         fireModelDataChanged();
         mergedEntriesSelectionModel.setSelectionInterval(current, current + rows.length-1);
@@ -368,19 +359,5 @@
      */
     protected void copyAfterCurrent(ListRole source, int [] rows, int current) {
-        if (rows == null || rows.length == 0)
-            return;
-        ArrayList<T> mergedEntries = getMergedEntries();
-
-        if (current < 0 || current >= mergedEntries.size())
-            throw new IllegalArgumentException(MessageFormat.format("Parameter current out of range. Got {0}.", current));
-        if (current == mergedEntries.size() -1) {
-            copyToEnd(source, rows);
-        } else {
-            for (int i=rows.length -1; i>=0; i--) {
-                int row = rows[i];
-                T n = entries.get(source).get(row);
-                mergedEntries.add(current+1, cloneEntryForMergedList(n));
-            }
-        }
+        copy(source, rows, current + 1);
         fireModelDataChanged();
         mergedEntriesSelectionModel.setSelectionInterval(current+1, current + rows.length-1);
@@ -551,5 +528,5 @@
         }
 
-        public ListMergeModel getListMergeModel() {
+        public ListMergeModel<T> getListMergeModel() {
             return ListMergeModel.this;
         }
Index: /trunk/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberListMergeModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberListMergeModel.java	(revision 2880)
+++ /trunk/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberListMergeModel.java	(revision 2881)
@@ -4,12 +4,15 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.util.ArrayList;
-import java.util.logging.Logger;
+import java.util.List;
 
+import javax.swing.JOptionPane;
 import javax.swing.table.DefaultTableModel;
 
 import org.openstreetmap.josm.command.RelationMemberConflictResolverCommand;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.gui.DefaultNameFormatter;
 import org.openstreetmap.josm.gui.conflict.pair.ListMergeModel;
 import org.openstreetmap.josm.gui.conflict.pair.ListRole;
@@ -20,6 +23,7 @@
  */
 public class RelationMemberListMergeModel extends ListMergeModel<RelationMember>{
+    //private static final Logger logger = Logger.getLogger(RelationMemberListMergeModel.class.getName());
 
-    private static final Logger logger = Logger.getLogger(RelationMemberListMergeModel.class.getName());
+    private DataSet myDataset;
 
     @Override
@@ -65,4 +69,6 @@
      */
     public void populate(Relation my, Relation their) {
+        this.myDataset = my.getDataSet();
+
         CheckParameterUtil.ensureParameterNotNull(my, "my");
         CheckParameterUtil.ensureParameterNotNull(their, "their");
@@ -92,5 +98,12 @@
     @Override
     protected RelationMember cloneEntryForMergedList(RelationMember entry) {
-        return new RelationMember(entry);
+        OsmPrimitive primitive = myDataset.getPrimitiveById(entry.getMember());
+        if (primitive.isDeleted()) {
+            JOptionPane.showMessageDialog(null,
+                    tr("Primitive {0} cannot be added to the relation because it was removed.",
+                            primitive.getDisplayName(DefaultNameFormatter.getInstance())));
+            return null;
+        } else
+            return new RelationMember(entry.getRole(), primitive);
     }
 
@@ -110,5 +123,5 @@
         if (! isFrozen())
             throw new IllegalArgumentException(tr("Merged nodes not frozen yet. Cannot build resolution command"));
-        ArrayList<RelationMember> entries = getMergedEntries();
+        List<RelationMember> entries = getMergedEntries();
         return new RelationMemberConflictResolverCommand(my, their, entries);
     }
