Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 4750)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 4751)
@@ -59,4 +59,5 @@
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.io.SaveLayersDialog;
+import org.openstreetmap.josm.gui.layer.JumpToMarkerActions;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.Layer.LayerAction;
@@ -92,4 +93,5 @@
         MultikeyActionsHandler.getInstance().addAction(instance.new ShowHideLayerAction(false));
         MultikeyActionsHandler.getInstance().addAction(instance.new ActivateLayerAction());
+        JumpToMarkerActions.initialize();
     }
 
@@ -1555,5 +1557,6 @@
     }
 
-    public static List<MultikeyInfo> getLayerInfoByClass(Class<? extends Layer> layerClass) {
+    // This is not Class<? extends Layer> on purpose, to allow asking for layers implementing some interface
+    public static List<MultikeyInfo> getLayerInfoByClass(Class<?> layerClass) {
 
         List<MultikeyInfo> result = new ArrayList<MultikeyShortcutAction.MultikeyInfo>();
Index: /trunk/src/org/openstreetmap/josm/gui/layer/JumpToMarkerActions.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/JumpToMarkerActions.java	(revision 4751)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/JumpToMarkerActions.java	(revision 4751)
@@ -0,0 +1,138 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+import java.lang.ref.WeakReference;
+import java.util.List;
+
+import javax.swing.AbstractAction;
+
+import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
+import org.openstreetmap.josm.tools.MultikeyActionsHandler;
+import org.openstreetmap.josm.tools.MultikeyShortcutAction;
+import org.openstreetmap.josm.tools.Shortcut;
+
+public class JumpToMarkerActions {
+
+    public interface JumpToMarkerLayer {
+        void jumpToNextMarker();
+        void jumpToPreviousMarker();
+    }
+
+    public static void initialize() {
+        MultikeyActionsHandler.getInstance().addAction(new JumpToNextMarker(null));
+        MultikeyActionsHandler.getInstance().addAction(new JumpToPreviousMarker(null));
+    }
+
+    public static final class JumpToNextMarker extends AbstractAction implements MultikeyShortcutAction {
+
+        private final Layer layer;
+        private WeakReference<Layer> lastLayer;
+
+        public JumpToNextMarker(JumpToMarkerLayer layer) {
+            putValue(ACCELERATOR_KEY, Shortcut.registerShortcut("core_multikey:nextMarker", "", 'J', Shortcut.GROUP_DIRECT, KeyEvent.ALT_DOWN_MASK + KeyEvent.CTRL_DOWN_MASK).getKeyStroke());
+            putValue(SHORT_DESCRIPTION, tr("Jump to next marker"));
+            putValue(NAME, tr("Jump to next marker"));
+
+            this.layer = (Layer)layer;
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            execute(layer);
+        }
+
+        @Override
+        public void executeMultikeyAction(int index, boolean repeat) {
+            Layer l = LayerListDialog.getLayerForIndex(index);
+            if (l != null) {
+                if (l instanceof JumpToMarkerLayer) {
+                    execute(l);
+                }
+            } else if (repeat && lastLayer != null) {
+                l = lastLayer.get();
+                if (LayerListDialog.isLayerValid(l)) {
+                    execute(l);
+                }
+            }
+        }
+
+
+        private void execute(Layer l) {
+            ((JumpToMarkerLayer)l).jumpToNextMarker();
+            lastLayer = new WeakReference<Layer>(l);
+        }
+
+        @Override
+        public List<MultikeyInfo> getMultikeyCombinations() {
+            return LayerListDialog.getLayerInfoByClass(JumpToMarkerLayer.class);
+        }
+
+        @Override
+        public MultikeyInfo getLastMultikeyAction() {
+            if (lastLayer != null)
+                return LayerListDialog.getLayerInfo(lastLayer.get());
+            else
+                return null;
+        }
+
+    }
+
+    public static final class JumpToPreviousMarker extends AbstractAction implements MultikeyShortcutAction {
+
+        private WeakReference<Layer> lastLayer;
+        private final Layer layer;
+
+        public JumpToPreviousMarker(JumpToMarkerLayer layer) {
+            this.layer = (Layer)layer;
+
+            putValue(ACCELERATOR_KEY, Shortcut.registerShortcut("core_multikey:previousMarker", "", 'P', Shortcut.GROUP_DIRECT, KeyEvent.ALT_DOWN_MASK + KeyEvent.CTRL_DOWN_MASK).getKeyStroke());
+            putValue(SHORT_DESCRIPTION, tr("Jump to previous marker"));
+            putValue(NAME, tr("Jump to previous marker"));
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            execute(layer);
+        }
+
+        @Override
+        public void executeMultikeyAction(int index, boolean repeat) {
+            Layer l = LayerListDialog.getLayerForIndex(index);
+            if (l != null) {
+                if (l instanceof JumpToMarkerLayer) {
+                    execute(l);
+                }
+            } else if (repeat && lastLayer != null) {
+                l = lastLayer.get();
+                if (LayerListDialog.isLayerValid(l)) {
+                    execute(l);
+                }
+            }
+        }
+
+        private void execute(Layer l) {
+            ((JumpToMarkerLayer) l).jumpToPreviousMarker();
+            lastLayer = new WeakReference<Layer>(l);
+        }
+
+        @Override
+        public List<MultikeyInfo> getMultikeyCombinations() {
+            return LayerListDialog.getLayerInfoByClass(JumpToMarkerLayer.class);
+        }
+
+        @Override
+        public MultikeyInfo getLastMultikeyAction() {
+            if (lastLayer != null)
+                return LayerListDialog.getLayerInfo(lastLayer.get());
+            else
+                return null;
+        }
+
+    }
+
+
+}
Index: /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 4750)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 4751)
@@ -55,4 +55,7 @@
 import org.openstreetmap.josm.gui.dialogs.LayerListPopup;
 import org.openstreetmap.josm.gui.layer.GpxLayer;
+import org.openstreetmap.josm.gui.layer.JumpToMarkerActions.JumpToMarkerLayer;
+import org.openstreetmap.josm.gui.layer.JumpToMarkerActions.JumpToNextMarker;
+import org.openstreetmap.josm.gui.layer.JumpToMarkerActions.JumpToPreviousMarker;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.tools.ExifReader;
@@ -68,5 +71,5 @@
 import com.drew.metadata.exif.GpsDirectory;
 
-public class GeoImageLayer extends Layer implements PropertyChangeListener {
+public class GeoImageLayer extends Layer implements PropertyChangeListener, JumpToMarkerLayer {
 
     List<ImageEntry> data;
@@ -230,5 +233,5 @@
                         tr("Error"),
                         JOptionPane.ERROR_MESSAGE
-                );
+                        );
             }
             if (layer != null) {
@@ -299,4 +302,7 @@
         }
         entries.add(SeparatorLayerAction.INSTANCE);
+        entries.add(new JumpToNextMarker(this));
+        entries.add(new JumpToPreviousMarker(this));
+        entries.add(SeparatorLayerAction.INSTANCE);
         entries.add(new LayerListPopup.InfoAction(this));
 
@@ -312,5 +318,5 @@
             }
         return trn("{0} image loaded.", "{0} images loaded.", data.size(), data.size())
-        + " " + trn("{0} was found to be GPS tagged.", "{0} were found to be GPS tagged.", i, i);
+                + " " + trn("{0} was found to be GPS tagged.", "{0} were found to be GPS tagged.", i, i);
     }
 
@@ -529,5 +535,5 @@
         } catch (MetadataException ex) {
         }
-        
+
         try {
             // longitude
@@ -694,5 +700,5 @@
                             tr("Error"),
                             JOptionPane.ERROR_MESSAGE
-                    );
+                            );
                 }
 
@@ -818,3 +824,11 @@
         return copy;
     }
+
+    public void jumpToNextMarker() {
+        showNextPhoto();
+    }
+
+    public void jumpToPreviousMarker() {
+        showPreviousPhoto();
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java	(revision 4750)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java	(revision 4751)
@@ -12,9 +12,7 @@
 import java.awt.Point;
 import java.awt.event.ActionEvent;
-import java.awt.event.KeyEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.io.File;
-import java.lang.ref.WeakReference;
 import java.net.URL;
 import java.util.ArrayList;
@@ -41,10 +39,10 @@
 import org.openstreetmap.josm.gui.layer.CustomizeColor;
 import org.openstreetmap.josm.gui.layer.GpxLayer;
+import org.openstreetmap.josm.gui.layer.JumpToMarkerActions.JumpToMarkerLayer;
+import org.openstreetmap.josm.gui.layer.JumpToMarkerActions.JumpToNextMarker;
+import org.openstreetmap.josm.gui.layer.JumpToMarkerActions.JumpToPreviousMarker;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.tools.AudioPlayer;
 import org.openstreetmap.josm.tools.ImageProvider;
-import org.openstreetmap.josm.tools.MultikeyActionsHandler;
-import org.openstreetmap.josm.tools.MultikeyShortcutAction;
-import org.openstreetmap.josm.tools.Shortcut;
 
 /**
@@ -59,5 +57,5 @@
  * The data is read only.
  */
-public class MarkerLayer extends Layer {
+public class MarkerLayer extends Layer implements JumpToMarkerLayer {
 
     /**
@@ -138,10 +136,4 @@
         });
     }
-
-    static {
-        MultikeyActionsHandler.getInstance().addAction(new JumpToNextMarker(null));
-        MultikeyActionsHandler.getInstance().addAction(new JumpToPreviousMarker(null));
-    }
-
 
     /**
@@ -450,110 +442,4 @@
     }
 
-    public static final class JumpToNextMarker extends AbstractAction implements MultikeyShortcutAction {
-
-        private final MarkerLayer layer;
-        private WeakReference<MarkerLayer> lastLayer;
-
-        public JumpToNextMarker(MarkerLayer layer) {
-            putValue(ACCELERATOR_KEY, Shortcut.registerShortcut("core_multikey:nextMarker", "", 'J', Shortcut.GROUP_DIRECT, KeyEvent.ALT_DOWN_MASK + KeyEvent.CTRL_DOWN_MASK).getKeyStroke());
-            putValue(SHORT_DESCRIPTION, tr("Jump to next marker"));
-            putValue(NAME, tr("Jump to next marker"));
-
-            this.layer = layer;
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent e) {
-            execute(layer);
-        }
-
-        @Override
-        public void executeMultikeyAction(int index, boolean repeat) {
-            Layer l = LayerListDialog.getLayerForIndex(index);
-            if (l != null) {
-                if (l instanceof MarkerLayer) {
-                    execute((MarkerLayer) l);
-                }
-            } else if (repeat && lastLayer != null) {
-                l = lastLayer.get();
-                if (LayerListDialog.isLayerValid(l)) {
-                    execute((MarkerLayer) l);
-                }
-            }
-        }
-
-
-        private void execute(MarkerLayer l) {
-            l.jumpToNextMarker();
-            lastLayer = new WeakReference<MarkerLayer>(l);
-        }
-
-        @Override
-        public List<MultikeyInfo> getMultikeyCombinations() {
-            return LayerListDialog.getLayerInfoByClass(MarkerLayer.class);
-        }
-
-        @Override
-        public MultikeyInfo getLastMultikeyAction() {
-            if (lastLayer != null)
-                return LayerListDialog.getLayerInfo(lastLayer.get());
-            else
-                return null;
-        }
-
-    }
-
-    public static final class JumpToPreviousMarker extends AbstractAction implements MultikeyShortcutAction {
-
-        private WeakReference<MarkerLayer> lastLayer;
-        private final MarkerLayer layer;
-
-        public JumpToPreviousMarker(MarkerLayer layer) {
-            this.layer = layer;
-
-            putValue(ACCELERATOR_KEY, Shortcut.registerShortcut("core_multikey:previousMarker", "", 'P', Shortcut.GROUP_DIRECT, KeyEvent.ALT_DOWN_MASK + KeyEvent.CTRL_DOWN_MASK).getKeyStroke());
-            putValue(SHORT_DESCRIPTION, tr("Jump to previous marker"));
-            putValue(NAME, tr("Jump to previous marker"));
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent e) {
-            execute(layer);
-        }
-
-        @Override
-        public void executeMultikeyAction(int index, boolean repeat) {
-            Layer l = LayerListDialog.getLayerForIndex(index);
-            if (l != null) {
-                if (l instanceof MarkerLayer) {
-                    execute((MarkerLayer) l);
-                }
-            } else if (repeat && lastLayer != null) {
-                l = lastLayer.get();
-                if (LayerListDialog.isLayerValid(l)) {
-                    execute((MarkerLayer) l);
-                }
-            }
-        }
-
-        private void execute(MarkerLayer l) {
-            l.jumpToPreviousMarker();
-            lastLayer = new WeakReference<MarkerLayer>(l);
-        }
-
-        @Override
-        public List<MultikeyInfo> getMultikeyCombinations() {
-            return LayerListDialog.getLayerInfoByClass(MarkerLayer.class);
-        }
-
-        @Override
-        public MultikeyInfo getLastMultikeyAction() {
-            if (lastLayer != null)
-                return LayerListDialog.getLayerInfo(lastLayer.get());
-            else
-                return null;
-        }
-
-    }
 
     private class SynchronizeAudio extends AbstractAction {
