Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 1838)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 1839)
@@ -20,7 +20,13 @@
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
 import java.util.logging.Logger;
 
@@ -40,4 +46,6 @@
 import javax.swing.KeyStroke;
 import javax.swing.SwingUtilities;
+import javax.swing.event.AncestorEvent;
+import javax.swing.event.AncestorListener;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
@@ -60,5 +68,7 @@
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.visitor.MergeVisitor;
+import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
+import org.openstreetmap.josm.gui.PrimitiveNameFormatter;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.dialogs.relation.ac.AutoCompletionCache;
@@ -310,5 +320,5 @@
      */
     protected JPanel buildMemberEditorPanel() {
-        JPanel pnl = new JPanel();
+        final JPanel pnl = new JPanel();
         pnl.setLayout(new GridBagLayout());
         // setting up the member table
@@ -403,4 +413,5 @@
             }
         });
+
 
         JPanel pnl3 = new JPanel();
@@ -617,5 +628,58 @@
     }
 
-    class AddSelectedAtStartAction extends AbstractAction implements TableModelListener {
+    class AddAbortException extends Exception  {
+    }
+
+    abstract class  AddFromSelectionAction extends AbstractAction {
+        private PrimitiveNameFormatter nameFormatter = new PrimitiveNameFormatter();
+
+        protected boolean isPotentialDuplicate(OsmPrimitive primitive) {
+            return memberTableModel.hasMembersReferringTo(Collections.singleton(primitive));
+        }
+
+        protected boolean confirmAddingPrimtive(OsmPrimitive primitive)  throws AddAbortException {
+            String msg = tr("<html>This relation already has one or more members referring to<br>"
+                    + "the primitive ''{0}''<br>"
+                    + "<br>"
+                    + "Do you really want to add another relation member?</html>",
+                    nameFormatter.getName(primitive)
+            );
+            int ret = ConditionalOptionPaneUtil.showOptionDialog(
+                    "add_primitive_to_relation",
+                    Main.parent,
+                    msg,
+                    tr("Multiple members referring to same primitive"),
+                    JOptionPane.YES_NO_CANCEL_OPTION,
+                    JOptionPane.WARNING_MESSAGE,
+                    null,
+                    null
+            );
+            switch(ret) {
+            case ConditionalOptionPaneUtil.DIALOG_DISABLED_OPTION : return true;
+            case JOptionPane.YES_OPTION: return true;
+            case JOptionPane.NO_OPTION: return false;
+            case JOptionPane.CLOSED_OPTION: return false;
+            case JOptionPane.CANCEL_OPTION: throw new AddAbortException();
+            }
+            // should not happen
+            return false;
+        }
+
+        protected List<OsmPrimitive> filterConfirmedPrimitives(List<OsmPrimitive> primitives) throws AddAbortException {
+            if (primitives == null || primitives.isEmpty())
+                return primitives;
+            ArrayList<OsmPrimitive> ret = new ArrayList<OsmPrimitive>();
+            Iterator<OsmPrimitive> it = primitives.iterator();
+            while(it.hasNext()) {
+                OsmPrimitive primitive = it.next();
+                if (isPotentialDuplicate(primitive) && confirmAddingPrimtive(primitive)) {
+                    ret.add(primitive);
+                }
+            }
+            return ret;
+        }
+    }
+
+    class AddSelectedAtStartAction extends AddFromSelectionAction implements TableModelListener {
         public AddSelectedAtStartAction() {
             putValue(SHORT_DESCRIPTION,
@@ -631,5 +695,10 @@
 
         public void actionPerformed(ActionEvent e) {
-            memberTableModel.addMembersAtBeginning(selectionTableModel.getSelection());
+            try {
+                List<OsmPrimitive> toAdd = filterConfirmedPrimitives(selectionTableModel.getSelection());
+                memberTableModel.addMembersAtBeginning(toAdd);
+            } catch(AddAbortException ex) {
+                // do nothing
+            }
         }
 
@@ -639,5 +708,5 @@
     }
 
-    class AddSelectedAtEndAction extends AbstractAction implements TableModelListener {
+    class AddSelectedAtEndAction extends AddFromSelectionAction implements TableModelListener {
         public AddSelectedAtEndAction() {
             putValue(SHORT_DESCRIPTION, tr("Add all primitives selected in the current dataset after the last member"));
@@ -652,5 +721,10 @@
 
         public void actionPerformed(ActionEvent e) {
-            memberTableModel.addMembersAtEnd(selectionTableModel.getSelection());
+            try {
+                List<OsmPrimitive> toAdd = filterConfirmedPrimitives(selectionTableModel.getSelection());
+                memberTableModel.addMembersAtEnd(toAdd);
+            } catch(AddAbortException ex) {
+                // do nothing
+            }
         }
 
@@ -660,5 +734,5 @@
     }
 
-    class AddSelectedBeforeSelection extends AbstractAction implements TableModelListener, ListSelectionListener {
+    class AddSelectedBeforeSelection extends AddFromSelectionAction implements TableModelListener, ListSelectionListener {
         public AddSelectedBeforeSelection() {
             putValue(SHORT_DESCRIPTION,
@@ -675,6 +749,13 @@
 
         public void actionPerformed(ActionEvent e) {
-            memberTableModel.addMembersBeforeIdx(selectionTableModel.getSelection(), memberTableModel
-                    .getSelectionModel().getMinSelectionIndex());
+            try {
+                List<OsmPrimitive> toAdd = filterConfirmedPrimitives(selectionTableModel.getSelection());
+                memberTableModel.addMembersBeforeIdx(toAdd, memberTableModel
+                        .getSelectionModel().getMinSelectionIndex());
+            } catch(AddAbortException ex) {
+                // do nothing
+            }
+
+
         }
 
@@ -688,5 +769,5 @@
     }
 
-    class AddSelectedAfterSelection extends AbstractAction implements TableModelListener, ListSelectionListener {
+    class AddSelectedAfterSelection extends AddFromSelectionAction implements TableModelListener, ListSelectionListener {
         public AddSelectedAfterSelection() {
             putValue(SHORT_DESCRIPTION,
@@ -703,6 +784,11 @@
 
         public void actionPerformed(ActionEvent e) {
-            memberTableModel.addMembersAfterIdx(selectionTableModel.getSelection(), memberTableModel
-                    .getSelectionModel().getMaxSelectionIndex());
+            try {
+                List<OsmPrimitive> toAdd = filterConfirmedPrimitives(selectionTableModel.getSelection());
+                memberTableModel.addMembersAfterIdx(toAdd, memberTableModel
+                        .getSelectionModel().getMaxSelectionIndex());
+            } catch(AddAbortException ex) {
+                // do nothing
+            }
         }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 1838)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 1839)
@@ -250,5 +250,5 @@
     }
 
-    public void addMembersAtBeginning(List<? extends OsmPrimitive> primitives) {
+    public void addMembersAtBeginning(List<OsmPrimitive> primitives) {
         if (primitives == null)
             return;
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableModel.java	(revision 1838)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableModel.java	(revision 1839)
@@ -90,5 +90,5 @@
     }
 
-    public List<? extends OsmPrimitive> getSelection() {
+    public List<OsmPrimitive> getSelection() {
         return cache;
     }
