Index: src/org/openstreetmap/josm/gui/history/HistoryViewerPanel.java
===================================================================
--- src/org/openstreetmap/josm/gui/history/HistoryViewerPanel.java	(revision 16472)
+++ src/org/openstreetmap/josm/gui/history/HistoryViewerPanel.java	(working copy)
@@ -3,11 +3,21 @@
 
 import java.awt.GridBagConstraints;
 import java.awt.Insets;
+import java.awt.event.ActionEvent;
 
+import javax.swing.AbstractAction;
+import javax.swing.JPopupMenu;
 import javax.swing.JScrollPane;
 import javax.swing.JTable;
 
+import org.openstreetmap.josm.actions.AutoScaleAction;
+import org.openstreetmap.josm.actions.AutoScaleAction.AutoScaleMode;
+import org.openstreetmap.josm.data.osm.IPrimitive;
+import org.openstreetmap.josm.data.osm.OsmData;
+import org.openstreetmap.josm.data.osm.PrimitiveId;
+import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.util.AdjustmentSynchronizer;
+import org.openstreetmap.josm.tools.ImageProvider;
 
 /**
  * Base class of {@link TagInfoViewer} and {@link RelationMemberListViewer}.
@@ -82,4 +92,68 @@
         gc.anchor = GridBagConstraints.NORTHWEST;
         add(embedInScrollPane(buildTable(PointInTimeType.CURRENT_POINT_IN_TIME)), gc);
     }
+
+    static class ListPopupMenu extends JPopupMenu {
+        private final ZoomToObjectAction zoomToObjectAction;
+        private final ShowHistoryAction showHistoryAction;
+
+        ListPopupMenu(String name, String shortDescription) {
+            zoomToObjectAction = new ZoomToObjectAction(name, shortDescription);
+            add(zoomToObjectAction);
+            showHistoryAction = new ShowHistoryAction();
+            add(showHistoryAction);
+        }
+
+        void prepare(PrimitiveId pid) {
+            zoomToObjectAction.setPrimitiveId(pid);
+            zoomToObjectAction.updateEnabledState();
+
+            showHistoryAction.setPrimitiveId(pid);
+            showHistoryAction.updateEnabledState();
+        }
+    }
+
+    static class ZoomToObjectAction extends AbstractAction {
+        private transient PrimitiveId primitiveId;
+
+        /**
+         * Constructs a new {@code ZoomToObjectAction}.
+         * @param name  name for the action
+         * @param shortDescription The key used for storing a short <code>String</code> description for the action, used for tooltip text.
+         */
+        ZoomToObjectAction(String name, String shortDescription) {
+            putValue(NAME, name);
+            putValue(SHORT_DESCRIPTION, shortDescription);
+            new ImageProvider("dialogs", "zoomin").getResource().attachImageIcon(this, true);
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            if (!isEnabled())
+                return;
+            IPrimitive p = getPrimitiveToZoom();
+            if (p != null && p.isSelectable()) {
+                p.getDataSet().setSelected(p);
+                AutoScaleAction.autoScale(AutoScaleMode.SELECTION);
+            }
+        }
+
+        public void setPrimitiveId(PrimitiveId pid) {
+            this.primitiveId = pid;
+            updateEnabledState();
+        }
+
+        protected IPrimitive getPrimitiveToZoom() {
+            if (primitiveId == null)
+                return null;
+            OsmData<?, ?, ?, ?> ds = MainApplication.getLayerManager().getActiveData();
+            if (ds == null)
+                return null;
+            return ds.getPrimitiveById(primitiveId);
+        }
+
+        public void updateEnabledState() {
+            setEnabled(MainApplication.getLayerManager().getActiveData() != null && getPrimitiveToZoom() != null);
+        }
+    }
 }
Index: src/org/openstreetmap/josm/gui/history/NodeListViewer.java
===================================================================
--- src/org/openstreetmap/josm/gui/history/NodeListViewer.java	(revision 16472)
+++ src/org/openstreetmap/josm/gui/history/NodeListViewer.java	(working copy)
@@ -4,25 +4,16 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.awt.Point;
-import java.awt.event.ActionEvent;
 
-import javax.swing.AbstractAction;
-import javax.swing.JPopupMenu;
 import javax.swing.JTable;
 import javax.swing.ListSelectionModel;
 
-import org.openstreetmap.josm.actions.AutoScaleAction;
-import org.openstreetmap.josm.actions.AutoScaleAction.AutoScaleMode;
-import org.openstreetmap.josm.data.osm.IPrimitive;
-import org.openstreetmap.josm.data.osm.OsmData;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.PrimitiveId;
 import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
 import org.openstreetmap.josm.data.osm.history.History;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
-import org.openstreetmap.josm.tools.ImageProvider;
 
 /**
  * NodeListViewer is a UI component which displays the node list of two
@@ -55,74 +46,14 @@
         table.addMouseListener(new InternalPopupMenuLauncher());
         table.addMouseListener(new ShowHistoryAction.DoubleClickAdapter(e -> {
             int row = table.rowAtPoint(e.getPoint());
-            return row < 0 ? null : primitiveIdAtRow(tableModel, row);
+            return primitiveIdAtRow(tableModel, row);
         }));
         return table;
     }
 
-    static class NodeListPopupMenu extends JPopupMenu {
-        private final ZoomToNodeAction zoomToNodeAction;
-        private final ShowHistoryAction showHistoryAction;
-
-        NodeListPopupMenu() {
-            zoomToNodeAction = new ZoomToNodeAction();
-            add(zoomToNodeAction);
-            showHistoryAction = new ShowHistoryAction();
-            add(showHistoryAction);
-        }
-
-        void prepare(PrimitiveId pid) {
-            zoomToNodeAction.setPrimitiveId(pid);
-            zoomToNodeAction.updateEnabledState();
-
-            showHistoryAction.setPrimitiveId(pid);
-            showHistoryAction.updateEnabledState();
-        }
-    }
-
-    static class ZoomToNodeAction extends AbstractAction {
-        private transient PrimitiveId primitiveId;
-
-        /**
-         * Constructs a new {@code ZoomToNodeAction}.
-         */
-        ZoomToNodeAction() {
-            putValue(NAME, tr("Zoom to node"));
-            putValue(SHORT_DESCRIPTION, tr("Zoom to this node in the current data layer"));
-            new ImageProvider("dialogs", "zoomin").getResource().attachImageIcon(this, true);
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent e) {
-            if (!isEnabled())
-                return;
-            IPrimitive p = getPrimitiveToZoom();
-            if (p != null && p.isSelectable()) {
-                p.getDataSet().setSelected(p);
-                AutoScaleAction.autoScale(AutoScaleMode.SELECTION);
-            }
-        }
-
-        public void setPrimitiveId(PrimitiveId pid) {
-            this.primitiveId = pid;
-            updateEnabledState();
-        }
-
-        protected IPrimitive getPrimitiveToZoom() {
-            if (primitiveId == null)
-                return null;
-            OsmData<?, ?, ?, ?> ds = MainApplication.getLayerManager().getActiveData();
-            if (ds == null)
-                return null;
-            return ds.getPrimitiveById(primitiveId);
-        }
-
-        public void updateEnabledState() {
-            setEnabled(MainApplication.getLayerManager().getActiveData() != null && getPrimitiveToZoom() != null);
-        }
-    }
-
     private static PrimitiveId primitiveIdAtRow(DiffTableModel model, int row) {
+        if (row < 0)
+            return null;
         Long id = (Long) model.getValueAt(row, 0).value;
         return id == null ? null : new SimplePrimitiveId(id, OsmPrimitiveType.NODE);
     }
@@ -129,13 +60,13 @@
 
     static class InternalPopupMenuLauncher extends PopupMenuLauncher {
         InternalPopupMenuLauncher() {
-            super(new NodeListPopupMenu());
+            super(new ListPopupMenu(tr("Zoom to node"), tr("Zoom to this node in the current data layer")));
         }
 
         @Override
         protected int checkTableSelection(JTable table, Point p) {
             int row = super.checkTableSelection(table, p);
-            ((NodeListPopupMenu) menu).prepare(primitiveIdAtRow((DiffTableModel) table.getModel(), row));
+            ((ListPopupMenu) menu).prepare(primitiveIdAtRow((DiffTableModel) table.getModel(), row));
             return row;
         }
     }
Index: src/org/openstreetmap/josm/gui/history/RelationMemberListViewer.java
===================================================================
--- src/org/openstreetmap/josm/gui/history/RelationMemberListViewer.java	(revision 16472)
+++ src/org/openstreetmap/josm/gui/history/RelationMemberListViewer.java	(working copy)
@@ -3,12 +3,16 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.Point;
 import java.awt.Rectangle;
 
 import javax.swing.JTable;
 import javax.swing.ListSelectionModel;
 
+import org.openstreetmap.josm.data.osm.PrimitiveId;
 import org.openstreetmap.josm.data.osm.RelationMemberData;
+import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
+import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
 
 /**
  * RelationMemberListViewer is a UI component which displays the  list of relation members of two
@@ -24,13 +28,14 @@
 
     @Override
     protected JTable buildTable(PointInTimeType pointInTimeType) {
-        DiffTableModel tableModel = model.getRelationMemberTableModel(pointInTimeType);
-        RelationMemberTableColumnModel columnModel = new RelationMemberTableColumnModel();
-        JTable table = new JTable(tableModel, columnModel);
+        final DiffTableModel tableModel = model.getRelationMemberTableModel(pointInTimeType);
+        final RelationMemberTableColumnModel columnModel = new RelationMemberTableColumnModel();
+        final JTable table = new JTable(tableModel, columnModel);
         tableModel.addTableModelListener(new ReversedChangeListener(
                 table, columnModel, tr("The members of this relation are in reverse order")));
         table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
         selectionSynchronizer.participateInSynchronizedSelection(table.getSelectionModel());
+        table.addMouseListener(new InternalPopupMenuLauncher());
         table.getModel().addTableModelListener(e -> {
             Rectangle rect = table.getCellRect(((DiffTableModel) e.getSource()).getFirstChange(), 0, true);
             table.scrollRectToVisible(rect);
@@ -37,7 +42,7 @@
         });
         table.addMouseListener(new ShowHistoryAction.DoubleClickAdapter(e -> {
             int row = table.rowAtPoint(e.getPoint());
-            return row < 0 ? null : (RelationMemberData) tableModel.getValueAt(row, 0).value;
+            return primitiveIdAtRow(tableModel, row);
         }));
         return table;
     }
@@ -49,4 +54,28 @@
     public RelationMemberListViewer(HistoryBrowserModel model) {
         super(model);
     }
+
+    private static PrimitiveId primitiveIdAtRow(DiffTableModel model, int row) {
+        if (row < 0)
+            return null;
+        RelationMemberData rm = (RelationMemberData) model.getValueAt(row, 0).value;
+        if (rm == null)
+            return null;
+        return new SimplePrimitiveId(rm.getUniqueId(), rm.getType());
+    }
+
+    static class InternalPopupMenuLauncher extends PopupMenuLauncher {
+        InternalPopupMenuLauncher() {
+            super(new ListPopupMenu(tr("Zoom to member"), tr("Zoom to this member in the current data layer")));
+
+        }
+
+        @Override
+        protected int checkTableSelection(JTable table, Point p) {
+            int row = super.checkTableSelection(table, p);
+            ((ListPopupMenu) menu).prepare(primitiveIdAtRow((DiffTableModel) table.getModel(), row));
+            return row;
+        }
+    }
+
 }
