Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 10088)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 10089)
@@ -110,9 +110,9 @@
     private final ReferringRelationsBrowserModel referrerModel;
 
-    /** the member table */
+    /** the member table and its model */
     private MemberTable memberTable;
     private final MemberTableModel memberTableModel;
 
-    /** the model for the selection table */
+    /** the selection table and its model */
     private SelectionTable selectionTable;
     private final SelectionTableModel selectionTableModel;
@@ -120,6 +120,6 @@
     private AutoCompletingTextField tfRole;
 
-    /** the menu item in the windows menu. Required to properly
-     * hide on dialog close.
+    /**
+     * the menu item in the windows menu. Required to properly hide on dialog close.
      */
     private JMenuItem windowMenuItem;
@@ -503,6 +503,5 @@
         JPanel pnl = new JPanel(new BorderLayout());
         MemberRoleCellEditor ce = (MemberRoleCellEditor) memberTable.getColumnModel().getColumn(0).getCellEditor();
-        selectionTable = new SelectionTable(selectionTableModel, new SelectionTableColumnModel(memberTableModel));
-        selectionTable.setMemberTableModel(memberTableModel);
+        selectionTable = new SelectionTable(selectionTableModel, memberTableModel);
         selectionTable.setRowHeight(ce.getEditor().getPreferredSize().height);
         pnl.add(new JScrollPane(selectionTable), BorderLayout.CENTER);
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 10088)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 10089)
@@ -87,4 +87,7 @@
     }
 
+    /**
+     * Registers listeners (selection change and dataset change).
+     */
     public void register() {
         DataSet.addSelectionListener(this);
@@ -92,4 +95,7 @@
     }
 
+    /**
+     * Unregisters listeners (selection change and dataset change).
+     */
     public void unregister() {
         DataSet.removeSelectionListener(this);
@@ -190,4 +196,8 @@
     }
 
+    /**
+     * Populates this model from the given relation.
+     * @param relation relation
+     */
     public void populate(Relation relation) {
         members.clear();
@@ -348,4 +358,8 @@
     }
 
+    /**
+     * Applies this member model to the given relation.
+     * @param relation relation
+     */
     public void applyToRelation(Relation relation) {
         relation.setMembers(members);
@@ -678,5 +692,5 @@
 
     /**
-     * Selects all mebers which refer to {@link OsmPrimitive}s in the collections
+     * Selects all members which refer to {@link OsmPrimitive}s in the collections
      * <code>primitmives</code>. Does nothing is primitives is null.
      *
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTable.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTable.java	(revision 10088)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTable.java	(revision 10089)
@@ -10,24 +10,28 @@
 import javax.swing.SwingUtilities;
 
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-
+/**
+ * Selection table of relation editor.
+ * @since 2563
+ */
 public class SelectionTable extends JTable {
 
     private final SelectionTableModel model;
-    private MemberTableModel memberTableModel;
+    private final MemberTableModel memberTableModel;
+
+    /**
+     * Constructs a new {@code SelectionTable}.
+     * @param model table model
+     * @param memberTableModel member table model
+     */
+    public SelectionTable(SelectionTableModel model, MemberTableModel memberTableModel) {
+        super(model, new SelectionTableColumnModel(memberTableModel));
+        this.model = model;
+        this.memberTableModel = memberTableModel;
+        build();
+    }
 
     protected void build() {
         setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
         addMouseListener(new DoubleClickAdapter());
-    }
-
-    public SelectionTable(SelectionTableModel model, SelectionTableColumnModel columnModel) {
-        super(model, columnModel);
-        this.model = model;
-        build();
-    }
-
-    public void setMemberTableModel(MemberTableModel memberTableModel) {
-        this.memberTableModel = memberTableModel;
     }
 
@@ -38,6 +42,5 @@
                 return;
             int row = rowAtPoint(evt.getPoint());
-            OsmPrimitive primitive = model.getPrimitive(row);
-            memberTableModel.selectMembersReferringTo(Collections.singleton(primitive));
+            memberTableModel.selectMembersReferringTo(Collections.singleton(model.getPrimitive(row)));
         }
     }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableCellRenderer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableCellRenderer.java	(revision 10088)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableCellRenderer.java	(revision 10089)
@@ -13,5 +13,5 @@
 /**
  * This is the {@link TableCellRenderer} used in {@link SelectionTable}.
- *
+ * @since 1806
  */
 public class SelectionTableCellRenderer extends MemberTableMemberCellRenderer {
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableColumnModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableColumnModel.java	(revision 10088)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableColumnModel.java	(revision 10089)
@@ -6,15 +6,22 @@
 import javax.swing.table.DefaultTableColumnModel;
 import javax.swing.table.TableColumn;
+import javax.swing.table.TableColumnModel;
 
+/**
+ * This is the {@link TableColumnModel} used in {@link SelectionTable}.
+ * @since 1790
+ */
 public class SelectionTableColumnModel  extends DefaultTableColumnModel {
+
+    /**
+     * Constructs a new {@code SelectionTableColumnModel}.
+     * @param model member table model
+     */
     public SelectionTableColumnModel(MemberTableModel model) {
-        TableColumn col = null;
-        SelectionTableCellRenderer renderer = new SelectionTableCellRenderer(model);
-
         // column 0 - the member role
-        col = new TableColumn(0);
+        TableColumn col = new TableColumn(0);
         col.setHeaderValue(tr("Selection"));
         col.setMinWidth(200);
-        col.setCellRenderer(renderer);
+        col.setCellRenderer(new SelectionTableCellRenderer(model));
         addColumn(col);
     }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableModel.java	(revision 10088)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableModel.java	(revision 10089)
@@ -35,4 +35,7 @@
     }
 
+    /**
+     * Registers listeners (selection change and layer change).
+     */
     public void register() {
         DataSet.addSelectionListener(this);
@@ -40,4 +43,7 @@
     }
 
+    /**
+     * Unregisters listeners (selection change and layer change).
+     */
     public void unregister() {
         DataSet.removeSelectionListener(this);
@@ -116,5 +122,6 @@
      *
      * @param row the row
-     * @return  the primitive at row <code>row</code> in this model
+     * @return the primitive at row <code>row</code> in this model
+     * @throws ArrayIndexOutOfBoundsException if index is invalid
      */
     public OsmPrimitive getPrimitive(int row) {
Index: /trunk/test/unit/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableTest.java	(revision 10089)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableTest.java	(revision 10089)
@@ -0,0 +1,89 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.relation;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.gui.dialogs.relation.SelectionTable.DoubleClickAdapter;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+
+/**
+ * Unit tests of {@link SelectionTable} class.
+ */
+public class SelectionTableTest {
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        JOSMFixture.createUnitTestFixture().init(true);
+    }
+
+    /**
+     * Unit test of {@link SelectionTable#SelectionTable}.
+     */
+    @Test
+    public void testSelectionTable() {
+        // Constructs a relation with a member
+        DataSet ds = new DataSet();
+        Node n = new Node(LatLon.ZERO);
+        Relation r = new Relation();
+        r.addMember(new RelationMember(null, n));
+        // Add it to dataset
+        ds.addPrimitive(n);
+        ds.addPrimitive(r);
+        // Add a new layer as active one
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        try {
+            Main.main.addLayer(layer);
+            // Constructs models and table
+            MemberTableModel memberTableModel = new MemberTableModel(r, layer, null);
+            memberTableModel.populate(r);
+            memberTableModel.register();
+            SelectionTableModel selectionTableModel = new SelectionTableModel(layer);
+            selectionTableModel.register();
+            try {
+                SelectionTable t = new SelectionTable(selectionTableModel, memberTableModel);
+                DoubleClickAdapter adapter = null;
+                for (MouseListener listener : t.getMouseListeners()) {
+                    if (listener instanceof DoubleClickAdapter) {
+                        adapter = (DoubleClickAdapter) listener;
+                    }
+                }
+                assertNotNull(adapter);
+                // Select member, trigger selection change events
+                ds.setSelected(n);
+                // Simple left click, do nothing
+                adapter.mouseClicked(new MouseEvent(t, MouseEvent.MOUSE_CLICKED, System.currentTimeMillis(), 0, 0, 0,
+                        1, false, MouseEvent.BUTTON1));
+                assertEquals(-1, memberTableModel.getSelectionModel().getMinSelectionIndex());
+                // Double right click, do nothing
+                adapter.mouseClicked(new MouseEvent(t, MouseEvent.MOUSE_CLICKED, System.currentTimeMillis(), 0, 0, 0,
+                        2, false, MouseEvent.BUTTON2));
+                assertEquals(-1, memberTableModel.getSelectionModel().getMinSelectionIndex());
+                // Double left click, select member
+                adapter.mouseClicked(new MouseEvent(t, MouseEvent.MOUSE_CLICKED, System.currentTimeMillis(), 0, 0, 0,
+                        2, false, MouseEvent.BUTTON1));
+                assertEquals(0, memberTableModel.getSelectionModel().getMinSelectionIndex());
+            } finally {
+                selectionTableModel.unregister();
+                memberTableModel.unregister();
+            }
+        } finally {
+            Main.main.removeLayer(layer);
+        }
+    }
+}
