Index: src/org/openstreetmap/josm/gui/history/RelationMemberListViewer.java
===================================================================
--- src/org/openstreetmap/josm/gui/history/RelationMemberListViewer.java	(revision 16460)
+++ src/org/openstreetmap/josm/gui/history/RelationMemberListViewer.java	(working copy)
@@ -3,12 +3,25 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.Point;
 import java.awt.Rectangle;
+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.PrimitiveId;
 import org.openstreetmap.josm.data.osm.RelationMemberData;
+import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
+import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
+import org.openstreetmap.josm.tools.ImageProvider;
 
 /**
  * RelationMemberListViewer is a UI component which displays the  list of relation members of two
@@ -31,6 +44,7 @@
                 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 +51,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 +63,91 @@
     public RelationMemberListViewer(HistoryBrowserModel model) {
         super(model);
     }
+
+    static class MemberListPopupMenu extends JPopupMenu {
+        private final ZoomToMemberAction zoomToMemberAction;
+        private final ShowHistoryAction showHistoryAction;
+
+        MemberListPopupMenu() {
+            zoomToMemberAction = new ZoomToMemberAction();
+            add(zoomToMemberAction);
+            showHistoryAction = new ShowHistoryAction();
+            add(showHistoryAction);
+        }
+
+        void prepare(PrimitiveId pid) {
+            zoomToMemberAction.setPrimitiveId(pid);
+            zoomToMemberAction.updateEnabledState();
+
+            showHistoryAction.setPrimitiveId(pid);
+            showHistoryAction.updateEnabledState();
+        }
+    }
+
+    static class ZoomToMemberAction extends AbstractAction {
+        private transient PrimitiveId primitiveId;
+
+        /**
+         * Constructs a new {@code ZoomToMemberAction}.
+         */
+        ZoomToMemberAction() {
+            putValue(NAME, tr("Zoom to member"));
+            putValue(SHORT_DESCRIPTION, tr("Zoom to this member 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);
+        }
+
+        void updateEnabledState() {
+            IPrimitive p = getPrimitiveToZoom();
+            setEnabled(p != null && p.isSelectable());
+        }
+    }
+
+    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 MemberListPopupMenu());
+        }
+
+        @Override
+        protected int checkTableSelection(JTable table, Point p) {
+            int row = super.checkTableSelection(table, p);
+            ((MemberListPopupMenu) menu).prepare(primitiveIdAtRow((DiffTableModel) table.getModel(), row));
+            return row;
+        }
+    }
+
+
 }
