Index: /trunk/src/org/openstreetmap/josm/gui/history/HistoryViewerPanel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/history/HistoryViewerPanel.java	(revision 16472)
+++ /trunk/src/org/openstreetmap/josm/gui/history/HistoryViewerPanel.java	(revision 16473)
@@ -4,9 +4,19 @@
 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;
 
 /**
@@ -83,3 +93,67 @@
         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: /trunk/src/org/openstreetmap/josm/gui/history/NodeListViewer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/history/NodeListViewer.java	(revision 16472)
+++ /trunk/src/org/openstreetmap/josm/gui/history/NodeListViewer.java	(revision 16473)
@@ -5,15 +5,8 @@
 
 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;
@@ -21,7 +14,5 @@
 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;
 
 /**
@@ -56,72 +47,12 @@
         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);
@@ -130,5 +61,5 @@
     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")));
         }
 
@@ -136,5 +67,5 @@
         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: /trunk/src/org/openstreetmap/josm/gui/history/RelationMemberListViewer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/history/RelationMemberListViewer.java	(revision 16472)
+++ /trunk/src/org/openstreetmap/josm/gui/history/RelationMemberListViewer.java	(revision 16473)
@@ -4,4 +4,5 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.Point;
 import java.awt.Rectangle;
 
@@ -9,5 +10,8 @@
 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;
 
 /**
@@ -25,11 +29,12 @@
     @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);
@@ -38,5 +43,5 @@
         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;
@@ -50,3 +55,27 @@
         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;
+        }
+    }
+
 }
