Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java	(revision 4791)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java	(revision 4792)
@@ -10,4 +10,6 @@
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
+import java.util.Arrays;
+import java.util.Collection;
 
 import javax.swing.AbstractAction;
@@ -25,6 +27,8 @@
 import org.openstreetmap.josm.actions.AutoScaleAction;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
+import org.openstreetmap.josm.gui.dialogs.relation.WayConnectionType.Direction;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
@@ -40,4 +44,5 @@
     protected JPopupMenu popupMenu;
     private ZoomToAction zoomToAction;
+    private ZoomToGapAction zoomToGap;
 
     /**
@@ -132,5 +137,5 @@
      *
      */
-    class SelectPreviousColumnCellAction extends AbstractAction {
+    private class SelectPreviousColumnCellAction extends AbstractAction {
 
         public void actionPerformed(ActionEvent e) {
@@ -163,4 +168,8 @@
             getSelectionModel().addListSelectionListener(zoomToAction);
             popupMenu.add(zoomToAction);
+            zoomToGap = new ZoomToGapAction();
+            MapView.addLayerChangeListener(zoomToGap);
+            getSelectionModel().addListSelectionListener(zoomToGap);
+            popupMenu.add(zoomToGap);
         }
         return popupMenu;
@@ -169,4 +178,5 @@
     public void unlinkAsListener() {
         MapView.removeLayerChangeListener(zoomToAction);
+        MapView.removeLayerChangeListener(zoomToGap);
     }
 
@@ -189,5 +199,5 @@
     }
 
-    class ZoomToAction extends AbstractAction implements LayerChangeListener, ListSelectionListener {
+    private class ZoomToAction extends AbstractAction implements LayerChangeListener, ListSelectionListener {
         public ZoomToAction() {
             putValue(NAME, tr("Zoom to"));
@@ -240,9 +250,73 @@
     }
 
+    private class ZoomToGapAction extends AbstractAction implements LayerChangeListener, ListSelectionListener {
+
+        public ZoomToGapAction() {
+            putValue(NAME, tr("Zoom to Gap"));
+            putValue(SHORT_DESCRIPTION, tr("Zoom to the gap in the way sequence"));
+            updateEnabledState();
+        }
+
+        private WayConnectionType getConnectionType() {
+            return getMemberTableModel().getWayConnection(getSelectedRows()[0]);
+        }
+
+        private final Collection<Direction> connectionTypesOfInterest = Arrays.asList(WayConnectionType.Direction.FORWARD, WayConnectionType.Direction.BACKWARD);
+
+        private boolean hasGap() {
+            WayConnectionType connectionType = getConnectionType();
+            return connectionTypesOfInterest.contains(connectionType.direction)
+                    && !(connectionType.linkNext && connectionType.linkPrev);
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            WayConnectionType connectionType = getConnectionType();
+            Way way = (Way) getMemberTableModel().getReferredPrimitive(getSelectedRows()[0]);
+            if (!connectionType.linkPrev) {
+                layer.data.setSelected(WayConnectionType.Direction.FORWARD.equals(connectionType.direction)
+                        ? way.firstNode() : way.lastNode());
+                AutoScaleAction.autoScale("selection");
+            } else if (!connectionType.linkNext) {
+                layer.data.setSelected(WayConnectionType.Direction.FORWARD.equals(connectionType.direction)
+                        ? way.lastNode() : way.firstNode());
+                AutoScaleAction.autoScale("selection");
+            }
+        }
+
+        private void updateEnabledState() {
+            setEnabled(Main.main != null
+                    && Main.main.getEditLayer() == layer
+                    && getSelectedRowCount() == 1
+                    && hasGap());
+        }
+
+        @Override
+        public void valueChanged(ListSelectionEvent e) {
+            updateEnabledState();
+        }
+
+        @Override
+        public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+            updateEnabledState();
+        }
+
+        @Override
+        public void layerAdded(Layer newLayer) {
+            updateEnabledState();
+        }
+
+        @Override
+        public void layerRemoved(Layer oldLayer) {
+            updateEnabledState();
+        }
+    }
+
     protected MemberTableModel getMemberTableModel() {
         return (MemberTableModel) getModel();
     }
 
-    class DblClickHandler extends MouseAdapter {
+    private class DblClickHandler extends MouseAdapter {
+
         protected void setSelection(MouseEvent e) {
             int row = rowAtPoint(e.getPoint());
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 4791)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 4792)
@@ -179,5 +179,5 @@
             return members.get(rowIndex).getMember();
         case 2:
-            return wayConnection(rowIndex);
+            return getWayConnection(rowIndex);
         }
         // should not happen
@@ -868,5 +868,5 @@
     }
 
-    private WayConnectionType wayConnection(int i) {
+    WayConnectionType getWayConnection(int i) {
         if (connectionType == null) {
             updateLinks();
