Index: trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 16849)
+++ trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 16850)
@@ -270,5 +270,5 @@
                 jumpToPrevious,
                 new ConvertFromGpxLayerAction(this),
-                new DownloadAlongTrackAction(data),
+                new DownloadAlongTrackAction(Collections.singleton(data)),
                 new DownloadWmsAlongTrackAction(data),
                 SeparatorLayerAction.INSTANCE,
Index: trunk/src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackAction.java	(revision 16849)
+++ trunk/src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackAction.java	(revision 16850)
@@ -4,13 +4,21 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.Component;
 import java.awt.geom.Path2D;
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.swing.Action;
+import javax.swing.JMenuItem;
 
 import org.openstreetmap.josm.actions.DownloadAlongAction;
 import org.openstreetmap.josm.data.gpx.GpxData;
-import org.openstreetmap.josm.data.gpx.IGpxTrack;
-import org.openstreetmap.josm.data.gpx.IGpxTrackSegment;
 import org.openstreetmap.josm.data.gpx.WayPoint;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.help.HelpUtil;
+import org.openstreetmap.josm.gui.layer.GpxLayer;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -20,5 +28,5 @@
  * @since 5715
  */
-public class DownloadAlongTrackAction extends DownloadAlongAction {
+public class DownloadAlongTrackAction extends DownloadAlongAction implements Layer.LayerAction, Layer.MultiLayerAction {
 
     private static final int NEAR_TRACK = 0;
@@ -33,5 +41,5 @@
     private static final String PREF_DOWNLOAD_ALONG_TRACK_NEAR = "downloadAlongTrack.near";
 
-    private final transient GpxData data;
+    private final transient Collection<GpxData> data;
 
     /**
@@ -39,5 +47,5 @@
      * @param data The GPX data used to download along
      */
-    public DownloadAlongTrackAction(GpxData data) {
+    public DownloadAlongTrackAction(Collection<GpxData> data) {
         super(tr("Download from OSM along this track"), "downloadalongtrack", null, null, false);
         this.data = data;
@@ -60,25 +68,41 @@
         Path2D gpxPath = new Path2D.Double();
         if (near == NEAR_TRACK || near == NEAR_BOTH) {
-            for (IGpxTrack trk : data.tracks) {
-                for (IGpxTrackSegment segment : trk.getSegments()) {
-                    boolean first = true;
-                    for (WayPoint p : segment.getWayPoints()) {
-                        if (first) {
-                            gpxPath.moveTo(p.lon(), p.lat());
-                            first = false;
-                        } else {
-                            gpxPath.lineTo(p.lon(), p.lat());
-                        }
+            data.stream().flatMap(GpxData::getTrackSegmentsStream).forEach(segment -> {
+                boolean first = true;
+                for (WayPoint p : segment.getWayPoints()) {
+                    if (first) {
+                        gpxPath.moveTo(p.lon(), p.lat());
+                        first = false;
+                    } else {
+                        gpxPath.lineTo(p.lon(), p.lat());
                     }
                 }
-            }
+            });
         }
         if (near == NEAR_WAYPOINTS || near == NEAR_BOTH) {
-            for (WayPoint p : data.waypoints) {
+            data.stream().flatMap(d -> d.getWaypoints().stream()).forEach(p -> {
                 gpxPath.moveTo(p.lon(), p.lat());
                 gpxPath.closePath();
-            }
+            });
         }
         return createCalcTask(gpxPath, panel, tr("Download from OSM along this track"), 1 == ret);
     }
+
+    @Override
+    public Component createMenuComponent() {
+        return new JMenuItem(this);
+    }
+
+    @Override
+    public boolean supportLayers(List<Layer> layers) {
+        return !Utils.filteredCollection(layers, GpxLayer.class).isEmpty();
+    }
+
+    @Override
+    public Action getMultiLayerAction(List<Layer> layers) {
+        final List<GpxData> gpxData = Utils.filteredCollection(layers, GpxLayer.class)
+                .stream().map(layer -> layer.data)
+                .collect(Collectors.toList());
+        return new DownloadAlongTrackAction(gpxData);
+    }
 }
Index: trunk/test/unit/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackActionTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackActionTest.java	(revision 16849)
+++ trunk/test/unit/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackActionTest.java	(revision 16850)
@@ -52,5 +52,5 @@
             // Perform action
             final GpxData gpx = GpxReaderTest.parseGpxData(TestUtils.getTestDataRoot() + file);
-            final PleaseWaitRunnable retval = new DownloadAlongTrackAction(gpx).createTask();
+            final PleaseWaitRunnable retval = new DownloadAlongTrackAction(Collections.singleton(gpx)).createTask();
 
             // assert that we were indeed presented with the expected HelpAwareOptionPane
