Index: trunk/src/org/openstreetmap/josm/actions/GpxExportAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/GpxExportAction.java	(revision 18067)
+++ trunk/src/org/openstreetmap/josm/actions/GpxExportAction.java	(revision 18068)
@@ -17,8 +17,7 @@
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.io.importexport.FileExporter;
+import org.openstreetmap.josm.gui.io.importexport.GpxExporter;
 import org.openstreetmap.josm.gui.io.importexport.GpxImporter;
-import org.openstreetmap.josm.gui.layer.GpxLayer;
 import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -59,9 +58,9 @@
     /**
      * Get the layer to export.
-     * @return The layer to export, either a {@link GpxLayer} or {@link OsmDataLayer}.
+     * @return The layer to export, if supported, otherwise {@code null}.
      */
     protected Layer getLayer() {
         Layer layer = getLayerManager().getActiveLayer();
-        return (layer instanceof GpxLayer || layer instanceof OsmDataLayer) ? layer : null;
+        return GpxExporter.isSupportedLayer(layer) ? layer : null;
     }
 
@@ -86,17 +85,16 @@
      * Exports a layer to a file. Launches a file chooser to request the user to enter a file name.
      *
-     * <code>layer</code> must not be null. <code>layer</code> must be an instance of
-     * {@link OsmDataLayer} or {@link GpxLayer}.
+     * <code>layer</code> must not be null. <code>layer</code> must be of a supported type.
      *
      * @param layer the layer
      * @throws IllegalArgumentException if layer is null
-     * @throws IllegalArgumentException if layer is neither an instance of {@link OsmDataLayer}
-     *  nor of {@link GpxLayer}
+     * @throws IllegalArgumentException if layer is not of a supported type.
+     * @see GpxExporter#isSupportedLayer
      */
     public void export(Layer layer) {
         CheckParameterUtil.ensureParameterNotNull(layer, "layer");
-        if (!(layer instanceof OsmDataLayer) && !(layer instanceof GpxLayer))
-            throw new IllegalArgumentException(MessageFormat.format("Expected instance of OsmDataLayer or GpxLayer. Got ''{0}''.",
-                    layer.getClass().getName()));
+        if (!GpxExporter.isSupportedLayer(layer))
+            throw new IllegalArgumentException(MessageFormat.format("Expected instance of {0}. Got ''{1}''.",
+                    GpxExporter.getSupportedLayers(), layer.getClass().getName()));
 
         File file = createAndOpenSaveFileChooser(tr("Export GPX file"), GpxImporter.getFileFilter());
Index: trunk/src/org/openstreetmap/josm/gui/io/importexport/GpxExporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/importexport/GpxExporter.java	(revision 18067)
+++ trunk/src/org/openstreetmap/josm/gui/io/importexport/GpxExporter.java	(revision 18068)
@@ -14,4 +14,6 @@
 import java.time.Year;
 import java.time.ZoneId;
+import java.util.Arrays;
+import java.util.List;
 import java.util.Optional;
 
@@ -33,4 +35,5 @@
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer;
 import org.openstreetmap.josm.gui.widgets.JosmTextArea;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
@@ -47,4 +50,7 @@
 public class GpxExporter extends FileExporter implements GpxConstants {
 
+    private static final List<Class<? extends Layer>> SUPPORTED_LAYERS = Arrays.asList(
+            GpxLayer.class, OsmDataLayer.class, GeoImageLayer.class);
+
     private static final String GPL_WARNING = "<html><font color='red' size='-2'>"
         + tr("Note: GPL is not compatible with the OSM license. Do not upload GPL licensed tracks.") + "</html>";
@@ -73,7 +79,5 @@
     @Override
     public boolean acceptFile(File pathname, Layer layer) {
-        if (!(layer instanceof OsmDataLayer) && !(layer instanceof GpxLayer))
-            return false;
-        return super.acceptFile(pathname, layer);
+        return isSupportedLayer(layer) ? super.acceptFile(pathname, layer) : false;
     }
 
@@ -90,5 +94,5 @@
     private void exportData(File file, Layer layer, boolean quiet) throws IOException {
         CheckParameterUtil.ensureParameterNotNull(layer, "layer");
-        if (!(layer instanceof OsmDataLayer) && !(layer instanceof GpxLayer))
+        if (!isSupportedLayer(layer))
             throw new IllegalArgumentException(MessageFormat.format("Expected instance of OsmDataLayer or GpxLayer. Got ''{0}''.", layer
                     .getClass().getName()));
@@ -120,4 +124,6 @@
         if (layer instanceof GpxLayer) {
             gpxData = ((GpxLayer) layer).data;
+        } else if (layer instanceof GeoImageLayer) {
+            gpxData = ((GeoImageLayer) layer).getFauxGpxData();
         } else {
             gpxData = new GpxData();
@@ -270,4 +276,23 @@
     }
 
+    /**
+     * Returns the list of supported layers.
+     * @return the list of supported layers
+     * @since 18068
+     */
+    public static List<Class<? extends Layer>> getSupportedLayers() {
+        return SUPPORTED_LAYERS;
+    }
+
+    /**
+     * Determines if the given layer is supported by this action.
+     * @param layer layer to test
+     * @return {@code true} if the given layer is supported by this action
+     * @since 18068
+     */
+    public static boolean isSupportedLayer(Layer layer) {
+        return SUPPORTED_LAYERS.stream().anyMatch(c -> c.isInstance(layer));
+    }
+
     private static GpxData getGpxData(Layer layer, File file) {
         if (layer instanceof OsmDataLayer) {
@@ -275,4 +300,6 @@
         } else if (layer instanceof GpxLayer) {
             return ((GpxLayer) layer).data;
+        } else if (layer instanceof GeoImageLayer) {
+            return ((GeoImageLayer) layer).getFauxGpxData();
         }
         return OsmDataLayer.toGpxData(MainApplication.getLayerManager().getEditDataSet(), file);
Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 18067)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 18068)
@@ -257,4 +257,5 @@
         if (ExpertToggleAction.isExpert()) {
             entries.add(new EditImagesSequenceAction(this));
+            entries.add(new LayerGpxExportAction(this));
         }
         entries.add(new ShowThumbnailAction(this));
