Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 1803)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 1804)
@@ -80,4 +80,5 @@
 
     static private final Logger logger = Logger.getLogger(GenericRelationEditor.class.getName());
+    static private final Dimension DEFAULT_EDITOR_DIMENSION = new Dimension(700,500);
 
     /** the tag table and its model */
@@ -130,5 +131,5 @@
             this.memberTableModel.populate(null);
         }
-        memberTableModel.selectMembers(selectedMembers);
+        memberTableModel.setSelectedMembers(selectedMembers);
         tagEditorModel.ensureOneTag();
 
@@ -529,4 +530,7 @@
         buttonPanel.add(new SideButton(setRoleAction));
         tfRole.getDocument().addDocumentListener(setRoleAction);
+
+        //--- copy relation action
+        buttonPanel.add(new SideButton(new DuplicateRelationAction()));
         return buttonPanel;
     }
@@ -577,5 +581,5 @@
     protected Dimension findMaxDialogSize() {
         // FIXME: Make it remember dialog size
-        return new Dimension(600, 500);
+        return new Dimension(700, 500);
     }
 
@@ -938,4 +942,25 @@
         public void removeUpdate(DocumentEvent e) {
             refreshEnabled();
+        }
+    }
+
+    /**
+     * Creates a new relation with a copy of the current editor state
+     *
+     */
+    class DuplicateRelationAction extends AbstractAction {
+        public DuplicateRelationAction() {
+            putValue(SHORT_DESCRIPTION,   tr("Create a copy of this relation and open it in another editor window"));
+            // FIXME provide an icon
+            putValue(SMALL_ICON, ImageProvider.get("duplicate"));
+            putValue(NAME, tr("Duplicate"));
+            setEnabled(true);
+        }
+        public void actionPerformed(ActionEvent e) {
+            Relation copy = new Relation();
+            tagEditorModel.applyToPrimitive(copy);
+            memberTableModel.applyToRelation(copy);
+            RelationEditor editor = RelationEditor.getEditor(getLayer(), copy, memberTableModel.getSelectedMembers());
+            editor.setVisible(true);
         }
     }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java	(revision 1803)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java	(revision 1804)
@@ -2,4 +2,5 @@
 package org.openstreetmap.josm.gui.dialogs.relation;
 
+import java.awt.Dimension;
 import java.awt.Rectangle;
 import java.awt.event.ActionEvent;
@@ -134,5 +135,3 @@
         }
     }
-
-
 }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 1803)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 1804)
@@ -5,4 +5,5 @@
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
@@ -205,20 +206,4 @@
     }
 
-    public void selectMembers(Collection<RelationMember> selectedMembers) {
-        if (selectedMembers == null) return;
-        int min = Integer.MAX_VALUE;
-        for (RelationMember member: selectedMembers) {
-            int row = members.indexOf(member);
-            if (row >= 0) {
-                getSelectionModel();
-                listSelectionModel.addSelectionInterval(row,row);
-                min = Math.min(row, min);
-            }
-        }
-        if (min < Integer.MAX_VALUE) {
-            fireMakeMemberVisible(min);
-        }
-    }
-
     public void applyToRelation(Relation relation) {
         relation.members.clear();
@@ -346,3 +331,51 @@
         }
     }
+
+    /**
+     * Replies a collection with the currently selected relation members
+     * 
+     * @return a collection with the currently selected relation members
+     */
+    public Collection<RelationMember> getSelectedMembers() {
+        ArrayList<RelationMember> selectedMembers = new ArrayList<RelationMember>();
+        for (int i: getSelectedIndices()) {
+            selectedMembers.add(members.get(i));
+        }
+        return selectedMembers;
+    }
+
+
+    /**
+     * Selectes the members in the collection selectedMembers
+     * 
+     * @param selectedMembers the collection of selected members
+     */
+    public void setSelectedMembers(Collection<RelationMember> selectedMembers) {
+        if (selectedMembers == null || selectedMembers.isEmpty())
+            return;
+
+        // lookup the indices for the respective members
+        //
+        ArrayList<Integer> selectedIndices = new ArrayList<Integer>();
+        for (RelationMember member: selectedMembers) {
+            int idx = members.indexOf(member);
+            if (idx >= 0 && !selectedIndices.contains(idx)) {
+                selectedIndices.add(idx);
+            }
+        }
+
+        // select the members
+        //
+        Collections.sort(selectedIndices);
+        getSelectionModel().clearSelection();
+        for (int row : selectedIndices) {
+            getSelectionModel().addSelectionInterval(row, row);
+        }
+
+        // make the first selected member visible
+        //
+        if (selectedIndices.size() > 0) {
+            fireMakeMemberVisible(selectedIndices.get(0));
+        }
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationDialogManager.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationDialogManager.java	(revision 1803)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationDialogManager.java	(revision 1804)
@@ -2,4 +2,7 @@
 package org.openstreetmap.josm.gui.dialogs.relation;
 
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Toolkit;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
@@ -12,4 +15,5 @@
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
+
 
 /**
@@ -93,4 +97,7 @@
      */
     public void register(OsmDataLayer layer, Relation relation, RelationEditor editor) {
+        if (relation == null) {
+            relation = new Relation();
+        }
         DialogContext context = new DialogContext(layer, relation);
         openDialogs.put(context, editor);
@@ -100,12 +107,13 @@
     /**
      * Replies true if there is an open relation editor for the relation managed
-     * by the given layer
+     * by the given layer. Replies false if relation is null.
      * 
      * @param layer  the layer
-     * @param relation  the relation
+     * @param relation  the relation. May be null.
      * @return true if there is an open relation editor for the relation managed
      * by the given layer; false otherwise
      */
     public boolean isOpenInEditor(OsmDataLayer layer, Relation relation) {
+        if (relation == null) return false;
         DialogContext context = new DialogContext(layer, relation);
         return openDialogs.keySet().contains(context);
@@ -115,5 +123,5 @@
     /**
      * Replies the editor for the relation managed by layer. Null, if no such editor
-     * is currently open.
+     * is currently open. Returns null, if relation is null.
      * 
      * @param layer the layer
@@ -125,4 +133,5 @@
      */
     public RelationEditor getEditorForRelation(OsmDataLayer layer, Relation relation) {
+        if (relation == null) return null;
         DialogContext context = new DialogContext(layer, relation);
         return openDialogs.get(context);
@@ -172,3 +181,73 @@
         }
     }
+
+    /**
+     * Positions an {@see RelationEditor} centered on the screen
+     * 
+     * @param editor the editor
+     */
+    protected void centerOnScreen(RelationEditor editor) {
+        Point p = new Point(0,0);
+        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
+        p.x = (d.width - editor.getSize().width)/2;
+        p.y = (d.height - editor.getSize().height)/2;
+        p.x = Math.max(p.x,0);
+        p.y = Math.max(p.y,0);
+        editor.setLocation(p);
+    }
+
+    /**
+     * Replies true, if there is another open {@see RelationEditor} whose
+     * upper left corner is close to <code>p</code>.
+     * 
+     * @param p  the reference point to check
+     * @return true, if there is another open {@see RelationEditor} whose
+     * upper left corner is close to <code>p</code>.
+     */
+    protected boolean hasEditorWithCloseUpperLeftCorner(Point p) {
+        for (RelationEditor editor: openDialogs.values()) {
+            Point corner = editor.getLocation();
+            if (p.x >= corner.x -5 && corner.x + 5 >= p.x
+                    && p.y >= corner.y -5 && corner.y + 5 >= p.y)
+                return true;
+        }
+        return false;
+    }
+
+    /**
+     * Positions a {@see RelationEditor} close to the center of the screen, in such
+     * a way, that it doesn't entirely cover another {@see RelationEditor}
+     * 
+     * @param editor
+     */
+    protected void positionCloseToScreenCenter(RelationEditor editor) {
+        Point p = new Point(0,0);
+        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
+        p.x = (d.width - editor.getSize().width)/2;
+        p.y = (d.height - editor.getSize().height)/2;
+        p.x = Math.max(p.x,0);
+        p.y = Math.max(p.y,0);
+        while(hasEditorWithCloseUpperLeftCorner(p)) {
+            p.x += 20;
+            p.y += 20;
+        }
+        editor.setLocation(p);
+    }
+
+    /**
+     * Positions a {@see RelationEditor} on the screen. Tries to center it on the
+     * screen. If it hide another instance of an editor at the same position this
+     * method tries to reposition <code>editor</code> by moving it slightly down and
+     * slightly to the right.
+     * 
+     * @param editor the editor
+     */
+    public void positionOnScreen(RelationEditor editor) {
+        if (editor == null) return;
+        if (openDialogs.isEmpty()) {
+            centerOnScreen(editor);
+        } else {
+            positionCloseToScreenCenter(editor);
+        }
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java	(revision 1803)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java	(revision 1804)
@@ -85,4 +85,5 @@
         else {
             RelationEditor editor = new GenericRelationEditor(layer, r, selectedMembers);
+            getRelationDialogManager().positionOnScreen(editor);
             getRelationDialogManager().register(layer, r, editor);
             return editor;
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableColumnModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableColumnModel.java	(revision 1803)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableColumnModel.java	(revision 1804)
@@ -17,5 +17,5 @@
         col = new TableColumn(0);
         col.setHeaderValue(tr("Selection"));
-        col.setResizable(true);
+        col.setMinWidth(200);
         col.setCellRenderer(renderer);
         addColumn(col);
