Index: trunk/src/org/openstreetmap/josm/gui/history/NodeListViewer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/NodeListViewer.java	(revision 16458)
+++ trunk/src/org/openstreetmap/josm/gui/history/NodeListViewer.java	(revision 16459)
@@ -6,6 +6,4 @@
 import java.awt.Point;
 import java.awt.event.ActionEvent;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
 
 import javax.swing.AbstractAction;
@@ -23,7 +21,5 @@
 import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
 import org.openstreetmap.josm.data.osm.history.History;
-import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
 import org.openstreetmap.josm.gui.MainApplication;
-import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -58,5 +54,8 @@
         selectionSynchronizer.participateInSynchronizedSelection(table.getSelectionModel());
         table.addMouseListener(new InternalPopupMenuLauncher());
-        table.addMouseListener(new DoubleClickAdapter(table));
+        table.addMouseListener(new ShowHistoryAction.DoubleClickAdapter(e -> {
+            int row = table.rowAtPoint(e.getPoint());
+            return row <= 0 ? null : primitiveIdAtRow(tableModel, row);
+        }));
         return table;
     }
@@ -127,45 +126,4 @@
     }
 
-    static class ShowHistoryAction extends AbstractAction {
-        private transient PrimitiveId primitiveId;
-
-        /**
-         * Constructs a new {@code ShowHistoryAction}.
-         */
-        ShowHistoryAction() {
-            putValue(NAME, tr("Show history"));
-            putValue(SHORT_DESCRIPTION, tr("Open a history browser with the history of this node"));
-            new ImageProvider("dialogs", "history").getResource().attachImageIcon(this, true);
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent e) {
-            if (isEnabled()) {
-                run();
-            }
-        }
-
-        public void setPrimitiveId(PrimitiveId pid) {
-            this.primitiveId = pid;
-            updateEnabledState();
-        }
-
-        public void run() {
-            if (HistoryDataSet.getInstance().getHistory(primitiveId) == null) {
-                MainApplication.worker.submit(new HistoryLoadTask().add(primitiveId));
-            }
-            MainApplication.worker.submit(() -> {
-                final History h = HistoryDataSet.getInstance().getHistory(primitiveId);
-                if (h == null)
-                    return;
-                GuiHelper.runInEDT(() -> HistoryBrowserDialogManager.getInstance().show(h));
-            });
-        }
-
-        public void updateEnabledState() {
-            setEnabled(primitiveId != null && !primitiveId.isNew());
-        }
-    }
-
     private static PrimitiveId primitiveIdAtRow(DiffTableModel model, int row) {
         Long id = (Long) model.getValueAt(row, 0).value;
@@ -186,26 +144,3 @@
     }
 
-    static class DoubleClickAdapter extends MouseAdapter {
-        private final JTable table;
-        private final ShowHistoryAction showHistoryAction;
-
-        DoubleClickAdapter(JTable table) {
-            this.table = table;
-            showHistoryAction = new ShowHistoryAction();
-        }
-
-        @Override
-        public void mouseClicked(MouseEvent e) {
-            if (e.getClickCount() < 2)
-                return;
-            int row = table.rowAtPoint(e.getPoint());
-            if (row <= 0)
-                return;
-            PrimitiveId pid = primitiveIdAtRow((DiffTableModel) table.getModel(), row);
-            if (pid == null || pid.isNew())
-                return;
-            showHistoryAction.setPrimitiveId(pid);
-            showHistoryAction.run();
-        }
-    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/history/RelationMemberListViewer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/RelationMemberListViewer.java	(revision 16458)
+++ trunk/src/org/openstreetmap/josm/gui/history/RelationMemberListViewer.java	(revision 16459)
@@ -8,4 +8,6 @@
 import javax.swing.JTable;
 import javax.swing.ListSelectionModel;
+
+import org.openstreetmap.josm.data.osm.RelationMemberData;
 
 /**
@@ -34,4 +36,8 @@
             table.scrollRectToVisible(rect);
         });
+        table.addMouseListener(new ShowHistoryAction.DoubleClickAdapter(e -> {
+            int row = table.rowAtPoint(e.getPoint());
+            return row <= 0 ? null : (RelationMemberData) tableModel.getValueAt(row, 0).value;
+        }));
         return table;
     }
Index: trunk/src/org/openstreetmap/josm/gui/history/ShowHistoryAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/ShowHistoryAction.java	(revision 16459)
+++ trunk/src/org/openstreetmap/josm/gui/history/ShowHistoryAction.java	(revision 16459)
@@ -0,0 +1,82 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.history;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.function.Function;
+
+import javax.swing.AbstractAction;
+
+import org.openstreetmap.josm.data.osm.PrimitiveId;
+import org.openstreetmap.josm.data.osm.history.History;
+import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
+import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+/**
+ * Open a history browser with the history of this node
+ */
+class ShowHistoryAction extends AbstractAction {
+    private transient PrimitiveId primitiveId;
+
+    /**
+     * Constructs a new {@code ShowHistoryAction}.
+     */
+    ShowHistoryAction() {
+        putValue(NAME, tr("Show history"));
+        putValue(SHORT_DESCRIPTION, tr("Open a history browser with the history of this node"));
+        new ImageProvider("dialogs", "history").getResource().attachImageIcon(this, true);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        if (isEnabled()) {
+            run();
+        }
+    }
+
+    public void setPrimitiveId(PrimitiveId pid) {
+        this.primitiveId = pid;
+        updateEnabledState();
+    }
+
+    public void run() {
+        if (HistoryDataSet.getInstance().getHistory(primitiveId) == null) {
+            MainApplication.worker.submit(new HistoryLoadTask().add(primitiveId));
+        }
+        MainApplication.worker.submit(() -> {
+            final History h = HistoryDataSet.getInstance().getHistory(primitiveId);
+            if (h == null)
+                return;
+            GuiHelper.runInEDT(() -> HistoryBrowserDialogManager.getInstance().show(h));
+        });
+    }
+
+    public void updateEnabledState() {
+        setEnabled(primitiveId != null && !primitiveId.isNew());
+    }
+
+    static class DoubleClickAdapter extends MouseAdapter {
+        private final Function<MouseEvent, PrimitiveId> primitiveIdFunction;
+        private final ShowHistoryAction showHistoryAction = new ShowHistoryAction();
+
+        DoubleClickAdapter(Function<MouseEvent, PrimitiveId> primitiveIdFunction) {
+            this.primitiveIdFunction = primitiveIdFunction;
+        }
+
+        @Override
+        public void mouseClicked(MouseEvent e) {
+            if (e.getClickCount() < 2)
+                return;
+            PrimitiveId pid = primitiveIdFunction.apply(e);
+            if (pid == null || pid.isNew())
+                return;
+            showHistoryAction.setPrimitiveId(pid);
+            showHistoryAction.run();
+        }
+    }
+}
