Index: src/org/openstreetmap/josm/data/gpx/GpxData.java
===================================================================
--- src/org/openstreetmap/josm/data/gpx/GpxData.java	(revision 15500)
+++ src/org/openstreetmap/josm/data/gpx/GpxData.java	(working copy)
@@ -72,7 +72,7 @@
     /**
      * A list of tracks this file consists of
      */
-    private final ArrayList<GpxTrack> privateTracks = new ArrayList<>();
+    private final ArrayList<IGpxTrack> privateTracks = new ArrayList<>();
     /**
      * GPX routes in this file
      */
@@ -99,16 +99,16 @@
      * Tracks. Access is discouraged, use {@link #getTracks()} to read.
      * @see #getTracks()
      */
-    public final Collection<GpxTrack> tracks = new ListeningCollection<GpxTrack>(privateTracks, this::invalidate) {
+    public final Collection<IGpxTrack> tracks = new ListeningCollection<IGpxTrack>(privateTracks, this::invalidate) {
 
         @Override
-        protected void removed(GpxTrack cursor) {
+        protected void removed(IGpxTrack cursor) {
             cursor.removeListener(proxy);
             super.removed(cursor);
         }
 
         @Override
-        protected void added(GpxTrack cursor) {
+        protected void added(IGpxTrack cursor) {
             super.added(cursor);
             cursor.addListener(proxy);
         }
@@ -173,7 +173,7 @@
         }
 
         if (cutOverlapping) {
-            for (GpxTrack trk : other.privateTracks) {
+            for (IGpxTrack trk : other.privateTracks) {
                 cutOverlapping(trk, connect);
             }
         } else {
@@ -185,7 +185,7 @@
         invalidate();
     }
 
-    private void cutOverlapping(GpxTrack trk, boolean connect) {
+    private void cutOverlapping(IGpxTrack trk, boolean connect) {
         List<IGpxTrackSegment> segsOld = new ArrayList<>(trk.getSegments());
         List<IGpxTrackSegment> segsNew = new ArrayList<>();
         for (IGpxTrackSegment seg : segsOld) {
@@ -365,7 +365,7 @@
     public synchronized List<GpxTrackSegmentSpan> getSegmentSpans() {
         if (segSpans == null) {
             segSpans = new ArrayList<>();
-            for (GpxTrack trk : privateTracks) {
+            for (IGpxTrack trk : privateTracks) {
                 for (IGpxTrackSegment seg : trk.getSegments()) {
                     GpxTrackSegmentSpan s = GpxTrackSegmentSpan.tryGetFromSegment(seg);
                     if (s != null) {
@@ -391,7 +391,7 @@
      * Get all tracks contained in this data set.
      * @return The tracks.
      */
-    public synchronized Collection<GpxTrack> getTracks() {
+    public synchronized Collection<IGpxTrack> getTracks() {
         return Collections.unmodifiableCollection(privateTracks);
     }
 
@@ -417,7 +417,7 @@
      * @param track The new track
      * @since 12156
      */
-    public synchronized void addTrack(GpxTrack track) {
+    public synchronized void addTrack(IGpxTrack track) {
         if (privateTracks.stream().anyMatch(t -> t == track)) {
             throw new IllegalArgumentException(MessageFormat.format("The track was already added to this data: {0}", track));
         }
@@ -431,7 +431,7 @@
      * @param track The old track
      * @since 12156
      */
-    public synchronized void removeTrack(GpxTrack track) {
+    public synchronized void removeTrack(IGpxTrack track) {
         if (!privateTracks.removeIf(t -> t == track)) {
             throw new IllegalArgumentException(MessageFormat.format("The track was not in this data: {0}", track));
         }
@@ -625,7 +625,7 @@
      * Gets a stream of all track points in the segments of the tracks of this data.
      * @return The stream
      * @see #getTracks()
-     * @see GpxTrack#getSegments()
+     * @see IGpxTrack#getSegments()
      * @see IGpxTrackSegment#getWayPoints()
      * @since 12156
      */
@@ -697,7 +697,7 @@
                 }
             }
         }
-        for (GpxTrack trk : privateTracks) {
+        for (IGpxTrack trk : privateTracks) {
             Bounds trkBounds = trk.getBounds();
             if (trkBounds != null) {
                 if (bounds == null) {
@@ -715,7 +715,7 @@
      * @return the length in meters
      */
     public synchronized double length() {
-        return privateTracks.stream().mapToDouble(GpxTrack::length).sum();
+        return privateTracks.stream().mapToDouble(IGpxTrack::length).sum();
     }
 
     /**
@@ -723,7 +723,7 @@
      * @param trk track to analyze
      * @return  minimum and maximum dates in array of 2 elements
      */
-    public static Date[] getMinMaxTimeForTrack(GpxTrack trk) {
+    public static Date[] getMinMaxTimeForTrack(IGpxTrack trk) {
         final LongSummaryStatistics statistics = trk.getSegments().stream()
                 .flatMap(seg -> seg.getWayPoints().stream())
                 .mapToLong(WayPoint::getTimeInMillis)
@@ -792,7 +792,7 @@
         double px = p.east();
         double py = p.north();
         double rx = 0.0, ry = 0.0, sx, sy, x, y;
-        for (GpxTrack track : privateTracks) {
+        for (IGpxTrack track : privateTracks) {
             for (IGpxTrackSegment seg : track.getSegments()) {
                 WayPoint r = null;
                 for (WayPoint wpSeg : seg.getWayPoints()) {
@@ -906,7 +906,7 @@
      */
     public static class LinesIterator implements Iterator<Line> {
 
-        private Iterator<GpxTrack> itTracks;
+        private Iterator<IGpxTrack> itTracks;
         private int idxTracks;
         private Iterator<IGpxTrackSegment> itTrackSegments;
         private final Iterator<GpxRoute> itRoutes;
@@ -914,7 +914,7 @@
         private Line next;
         private final boolean[] trackVisibility;
         private Map<String, Object> trackAttributes;
-        private GpxTrack curTrack;
+        private IGpxTrack curTrack;
 
         /**
          * Constructs a new {@code LinesIterator}.
Index: src/org/openstreetmap/josm/data/gpx/GpxImageCorrelation.java
===================================================================
--- src/org/openstreetmap/josm/data/gpx/GpxImageCorrelation.java	(revision 15500)
+++ src/org/openstreetmap/josm/data/gpx/GpxImageCorrelation.java	(working copy)
@@ -37,7 +37,7 @@
 
         List<List<List<WayPoint>>> trks = new ArrayList<>();
 
-        for (GpxTrack trk : selectedGpx.tracks) {
+        for (IGpxTrack trk : selectedGpx.tracks) {
             List<List<WayPoint>> segs = new ArrayList<>();
             for (IGpxTrackSegment seg : trk.getSegments()) {
                 List<WayPoint> wps = new ArrayList<>(seg.getWayPoints());
Index: src/org/openstreetmap/josm/gui/layer/GpxLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 15500)
+++ src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(working copy)
@@ -31,7 +31,7 @@
 import org.openstreetmap.josm.data.gpx.GpxConstants;
 import org.openstreetmap.josm.data.gpx.GpxData;
 import org.openstreetmap.josm.data.gpx.GpxData.GpxDataChangeListener;
-import org.openstreetmap.josm.data.gpx.GpxTrack;
+import org.openstreetmap.josm.data.gpx.IGpxTrack;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.gui.MapView;
@@ -125,7 +125,7 @@
     @Override
     public void setColor(Color color) {
         data.beginUpdate();
-        for (GpxTrack trk : data.getTracks()) {
+        for (IGpxTrack trk : data.getTracks()) {
             trk.setColor(color);
         }
         GPXSettingsPanel.putLayerPrefLocal(this, "colormode", "0");
@@ -142,7 +142,7 @@
      * @param trk The GPX track for which timespan is displayed
      * @return The timespan as a string
      */
-    public static String getTimespanForTrack(GpxTrack trk) {
+    public static String getTimespanForTrack(IGpxTrack trk) {
         Date[] bounds = GpxData.getMinMaxTimeForTrack(trk);
         String ts = "";
         if (bounds != null) {
@@ -200,7 +200,7 @@
                 .append("</td><td>").append(tr("URL"))
                 .append("</td></tr></thead>");
 
-            for (GpxTrack trk : data.getTracks()) {
+            for (IGpxTrack trk : data.getTracks()) {
                 info.append("<tr><td>");
                 if (trk.getAttributes().containsKey(GpxConstants.GPX_NAME)) {
                     info.append(trk.get(GpxConstants.GPX_NAME));
@@ -329,7 +329,7 @@
         int i = 0;
         long from = fromDate.getTime();
         long to = toDate.getTime();
-        for (GpxTrack trk : data.getTracks()) {
+        for (IGpxTrack trk : data.getTracks()) {
             Date[] t = GpxData.getMinMaxTimeForTrack(trk);
 
             if (t == null) continue;
Index: src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java	(revision 15500)
+++ src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java	(working copy)
@@ -71,7 +71,7 @@
 import org.openstreetmap.josm.data.gpx.GpxImageCorrelation;
 import org.openstreetmap.josm.data.gpx.GpxTimeOffset;
 import org.openstreetmap.josm.data.gpx.GpxTimezone;
-import org.openstreetmap.josm.data.gpx.GpxTrack;
+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.data.osm.visitor.BoundingXYVisitor;
@@ -1262,7 +1262,7 @@
 
         long firstGPXDate = -1;
         // Finds first GPX point
-        outer: for (GpxTrack trk : gpx.tracks) {
+        outer: for (IGpxTrack trk : gpx.tracks) {
             for (IGpxTrackSegment segment : trk.getSegments()) {
                 for (WayPoint curWp : segment.getWayPoints()) {
                     if (curWp.hasDate()) {
Index: src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java	(revision 15500)
+++ src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java	(working copy)
@@ -34,12 +34,13 @@
 import javax.swing.event.TableModelEvent;
 import javax.swing.table.DefaultTableModel;
 import javax.swing.table.TableCellRenderer;
+import javax.swing.table.TableModel;
 import javax.swing.table.TableRowSorter;
 
 import org.apache.commons.jcs.access.exception.InvalidArgumentException;
 import org.openstreetmap.josm.data.SystemOfMeasurement;
 import org.openstreetmap.josm.data.gpx.GpxConstants;
-import org.openstreetmap.josm.data.gpx.GpxTrack;
+import org.openstreetmap.josm.data.gpx.IGpxTrack;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.layer.GpxLayer;
@@ -118,7 +119,7 @@
     private Object[][] buildTableContents() {
         Object[][] tracks = new Object[layer.data.tracks.size()][5];
         int i = 0;
-        for (GpxTrack trk : layer.data.tracks) {
+        for (IGpxTrack trk : layer.data.tracks) {
             Map<String, Object> attr = trk.getAttributes();
             String name = (String) Optional.ofNullable(attr.get(GpxConstants.GPX_NAME)).orElse("");
             String desc = (String) Optional.ofNullable(attr.get(GpxConstants.GPX_DESC)).orElse("");
@@ -131,9 +132,9 @@
         return tracks;
     }
 
-    private void showColorDialog(List<GpxTrack> tracks) {
+    private void showColorDialog(List<IGpxTrack> tracks) {
         Color cl = tracks.stream().filter(Objects::nonNull)
-                .map(GpxTrack::getColor).filter(Objects::nonNull)
+                .map(IGpxTrack::getColor).filter(Objects::nonNull)
                 .findAny().orElse(GpxDrawHelper.DEFAULT_COLOR_PROPERTY.get());
         JColorChooser c = new JColorChooser(cl);
         Object[] options = new Object[]{tr("OK"), tr("Cancel"), tr("Default")};
@@ -170,77 +171,7 @@
     private static JTable buildTable(Object[]... content) {
         final String[] headers = {tr("Name"), tr("Description"), tr("Timespan"), tr("Length"), tr("URL")};
         DefaultTableModel model = new DefaultTableModel(content, headers);
-        final JTable t = new JTable(model) {
-            @Override
-            public Component prepareRenderer(TableCellRenderer renderer, int row, int col) {
-                Component c = super.prepareRenderer(renderer, row, col);
-                if (c instanceof JComponent) {
-                    JComponent jc = (JComponent) c;
-                    jc.setToolTipText(getValueAt(row, col).toString());
-                    if (content.length > row
-                            && content[row].length > 5
-                            && content[row][5] instanceof GpxTrack) {
-                        Color color = ((GpxTrack) content[row][5]).getColor();
-                        if (color != null) {
-                            double brightness = Math.sqrt(Math.pow(color.getRed(), 2) * .241
-                                    + Math.pow(color.getGreen(), 2) * .691
-                                    + Math.pow(color.getBlue(), 2) * .068);
-                            if (brightness > 250) {
-                                color = color.darker();
-                            }
-                            if (isRowSelected(row)) {
-                                jc.setBackground(color);
-                                if (brightness <= 130) {
-                                    jc.setForeground(Color.WHITE);
-                                } else {
-                                    jc.setForeground(Color.BLACK);
-                                }
-                            } else {
-                                if (brightness > 200) {
-                                    color = color.darker(); //brightness >250 is darkened twice on purpose
-                                }
-                                jc.setForeground(color);
-                                jc.setBackground(Color.WHITE);
-                            }
-                        } else {
-                            jc.setForeground(Color.BLACK);
-                            if (isRowSelected(row)) {
-                                jc.setBackground(new Color(175, 210, 210));
-                            } else {
-                                jc.setBackground(Color.WHITE);
-                            }
-                        }
-                    }
-                }
-                return c;
-            }
-
-            @Override
-            public boolean isCellEditable(int rowIndex, int colIndex) {
-                return colIndex <= 1;
-            }
-
-            @Override
-            public void tableChanged(TableModelEvent e) {
-                super.tableChanged(e);
-                int col = e.getColumn();
-                int row = e.getFirstRow();
-                if (row >= 0 && row < content.length && col >= 0 && col <= 1) {
-                    Object t = content[row][5];
-                    String val = (String) getValueAt(row, col);
-                    if (t != null && t instanceof GpxTrack) {
-                        GpxTrack trk = (GpxTrack) t;
-                        if (col == 0) {
-                            trk.put("name", val);
-                        } else {
-                            trk.put("desc", val);
-                        }
-                    } else {
-                        throw new InvalidArgumentException("Invalid object in table, must be GpxTrack.");
-                    }
-                }
-            }
-        };
+        final GpxTrackTable t = new GpxTrackTable(content, model);
         // define how to sort row
         TableRowSorter<DefaultTableModel> rowSorter = new TableRowSorter<>();
         t.setRowSorter(rowSorter);
@@ -365,11 +296,11 @@
             @Override
             protected void buttonAction(int buttonIndex, ActionEvent evt) {
                 if (buttonIndex == 0) {
-                    List<GpxTrack> trks = new ArrayList<>();
+                    List<IGpxTrack> trks = new ArrayList<>();
                     for (int i : table.getSelectedRows()) {
                         Object trk = content[i][5];
-                        if (trk != null && trk instanceof GpxTrack) {
-                            trks.add((GpxTrack) trk);
+                        if (trk != null && trk instanceof IGpxTrack) {
+                            trks.add((IGpxTrack) trk);
                         }
                     }
                     showColorDialog(trks);
@@ -406,4 +337,83 @@
         // ...sync with layer visibility instead to avoid having two ways to hide everything
         layer.setVisible(v == 2 || !s.isSelectionEmpty());
     }
+
+    private static class GpxTrackTable extends JTable {
+        final Object[][] content;
+
+        public GpxTrackTable(Object[][] content, TableModel model) {
+            super(model);
+            this.content = content;
+        }
+
+        @Override
+        public Component prepareRenderer(TableCellRenderer renderer, int row, int col) {
+            Component c = super.prepareRenderer(renderer, row, col);
+            if (c instanceof JComponent) {
+                JComponent jc = (JComponent) c;
+                jc.setToolTipText(getValueAt(row, col).toString());
+                if (content.length > row
+                        && content[row].length > 5
+                        && content[row][5] instanceof IGpxTrack) {
+                    Color color = ((IGpxTrack) content[row][5]).getColor();
+                    if (color != null) {
+                        double brightness = Math.sqrt(Math.pow(color.getRed(), 2) * .241
+                                + Math.pow(color.getGreen(), 2) * .691
+                                + Math.pow(color.getBlue(), 2) * .068);
+                        if (brightness > 250) {
+                            color = color.darker();
+                        }
+                        if (isRowSelected(row)) {
+                            jc.setBackground(color);
+                            if (brightness <= 130) {
+                                jc.setForeground(Color.WHITE);
+                            } else {
+                                jc.setForeground(Color.BLACK);
+                            }
+                        } else {
+                            if (brightness > 200) {
+                                color = color.darker(); //brightness >250 is darkened twice on purpose
+                            }
+                            jc.setForeground(color);
+                            jc.setBackground(Color.WHITE);
+                        }
+                    } else {
+                        jc.setForeground(Color.BLACK);
+                        if (isRowSelected(row)) {
+                            jc.setBackground(new Color(175, 210, 210));
+                        } else {
+                            jc.setBackground(Color.WHITE);
+                        }
+                    }
+                }
+            }
+            return c;
+        }
+
+        @Override
+        public boolean isCellEditable(int rowIndex, int colIndex) {
+            return colIndex <= 1;
+        }
+
+        @Override
+        public void tableChanged(TableModelEvent e) {
+            super.tableChanged(e);
+            int col = e.getColumn();
+            int row = e.getFirstRow();
+            if (row >= 0 && row < content.length && col >= 0 && col <= 1) {
+                Object t = content[row][5];
+                String val = (String) getValueAt(row, col);
+                if (t != null && t instanceof IGpxTrack) {
+                    IGpxTrack trk = (IGpxTrack) t;
+                    if (col == 0) {
+                        trk.put("name", val);
+                    } else {
+                        trk.put("desc", val);
+                    }
+                } else {
+                    throw new InvalidArgumentException("Invalid object in table, must be IGpxTrack.");
+                }
+            }
+        }
+    }
 }
Index: src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackAction.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackAction.java	(revision 15500)
+++ src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackAction.java	(working copy)
@@ -7,7 +7,7 @@
 
 import org.openstreetmap.josm.actions.DownloadAlongAction;
 import org.openstreetmap.josm.data.gpx.GpxData;
-import org.openstreetmap.josm.data.gpx.GpxTrack;
+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;
@@ -59,7 +59,7 @@
         // Convert the GPX data into a Path2D.
         Path2D gpxPath = new Path2D.Double();
         if (near == NEAR_TRACK || near == NEAR_BOTH) {
-            for (GpxTrack trk : data.tracks) {
+            for (IGpxTrack trk : data.tracks) {
                 for (IGpxTrackSegment segment : trk.getSegments()) {
                     boolean first = true;
                     for (WayPoint p : segment.getWayPoints()) {
Index: src/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackAction.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackAction.java	(revision 15500)
+++ src/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackAction.java	(working copy)
@@ -15,7 +15,7 @@
 import org.openstreetmap.josm.actions.AbstractMergeAction;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.gpx.GpxData;
-import org.openstreetmap.josm.data.gpx.GpxTrack;
+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.MainApplication;
@@ -91,7 +91,7 @@
 
     PrecacheWmsTask createTask() {
         List<LatLon> points = new ArrayList<>();
-        for (GpxTrack trk : data.tracks) {
+        for (IGpxTrack trk : data.tracks) {
             for (IGpxTrackSegment segment : trk.getSegments()) {
                 for (WayPoint p : segment.getWayPoints()) {
                     points.add(p.getCoor());
Index: src/org/openstreetmap/josm/gui/layer/gpx/ImportAudioAction.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/gpx/ImportAudioAction.java	(revision 15500)
+++ src/org/openstreetmap/josm/gui/layer/gpx/ImportAudioAction.java	(working copy)
@@ -20,7 +20,7 @@
 import org.openstreetmap.josm.actions.DiskAccessAction;
 import org.openstreetmap.josm.data.gpx.GpxConstants;
 import org.openstreetmap.josm.data.gpx.GpxData;
-import org.openstreetmap.josm.data.gpx.GpxTrack;
+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.data.projection.ProjectionRegistry;
@@ -146,7 +146,7 @@
         // determine time of first point in track
         double firstTime = -1.0;
         if (hasTracks) {
-            for (GpxTrack track : layer.data.tracks) {
+            for (IGpxTrack track : layer.data.tracks) {
                 for (IGpxTrackSegment seg : track.getSegments()) {
                     for (WayPoint w : seg.getWayPoints()) {
                         firstTime = w.getTime();
@@ -205,7 +205,7 @@
         // (c) use explicitly named track points, again unless suppressed
         if (layer.data.tracks != null && Config.getPref().getBoolean("marker.audiofromnamedtrackpoints", false)
                 && !layer.data.tracks.isEmpty()) {
-            for (GpxTrack track : layer.data.tracks) {
+            for (IGpxTrack track : layer.data.tracks) {
                 for (IGpxTrackSegment seg : track.getSegments()) {
                     for (WayPoint w : seg.getWayPoints()) {
                         if (w.attr.containsKey(GpxConstants.GPX_NAME) || w.attr.containsKey(GpxConstants.GPX_DESC)) {
@@ -226,7 +226,7 @@
             WayPoint w1 = null;
             WayPoint w2 = null;
 
-            for (GpxTrack track : layer.data.tracks) {
+            for (IGpxTrack track : layer.data.tracks) {
                 for (IGpxTrackSegment seg : track.getSegments()) {
                     for (WayPoint w : seg.getWayPoints()) {
                         if (startTime < w.getTime()) {
@@ -262,7 +262,7 @@
         // (f) simply add a single marker at the start of the track
         if ((Config.getPref().getBoolean("marker.audiofromstart") || waypoints.isEmpty()) && hasTracks) {
             boolean gotOne = false;
-            for (GpxTrack track : layer.data.tracks) {
+            for (IGpxTrack track : layer.data.tracks) {
                 for (IGpxTrackSegment seg : track.getSegments()) {
                     for (WayPoint w : seg.getWayPoints()) {
                         WayPoint wStart = new WayPoint(w.getCoor());
Index: src/org/openstreetmap/josm/gui/layer/markerlayer/PlayHeadMarker.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/markerlayer/PlayHeadMarker.java	(revision 15500)
+++ src/org/openstreetmap/josm/gui/layer/markerlayer/PlayHeadMarker.java	(working copy)
@@ -17,7 +17,7 @@
 import org.openstreetmap.josm.actions.mapmode.PlayHeadDragMode;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.data.gpx.GpxTrack;
+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.data.projection.ProjectionRegistry;
@@ -326,7 +326,7 @@
         WayPoint w1 = null;
         WayPoint w2 = null;
 
-        for (GpxTrack track : trackLayer.data.getTracks()) {
+        for (IGpxTrack track : trackLayer.data.getTracks()) {
             for (IGpxTrackSegment trackseg : track.getSegments()) {
                 for (WayPoint w: trackseg.getWayPoints()) {
                     if (audioTime < w.getTime()) {
Index: src/org/openstreetmap/josm/io/GpxWriter.java
===================================================================
--- src/org/openstreetmap/josm/io/GpxWriter.java	(revision 15500)
+++ src/org/openstreetmap/josm/io/GpxWriter.java	(working copy)
@@ -28,6 +28,7 @@
 import org.openstreetmap.josm.data.gpx.GpxLink;
 import org.openstreetmap.josm.data.gpx.GpxRoute;
 import org.openstreetmap.josm.data.gpx.GpxTrack;
+import org.openstreetmap.josm.data.gpx.IGpxTrack;
 import org.openstreetmap.josm.data.gpx.IGpxTrackSegment;
 import org.openstreetmap.josm.data.gpx.IWithAttributes;
 import org.openstreetmap.josm.data.gpx.WayPoint;
@@ -84,7 +85,9 @@
 
         //Prepare extensions for writing
         data.beginUpdate();
-        data.getTracks().forEach(trk -> trk.convertColor(colorFormat));
+        data.getTracks().stream()
+        .filter(GpxTrack.class::isInstance).map(GpxTrack.class::cast)
+        .forEach(trk -> trk.convertColor(colorFormat));
         data.getExtensions().removeAllWithPrefix("josm");
         if (data.fromServer) {
             data.getExtensions().add("josm", "from-server", "true");
@@ -258,7 +261,7 @@
     }
 
     private void writeTracks() {
-        for (GpxTrack trk : data.getTracks()) {
+        for (IGpxTrack trk : data.getTracks()) {
             openln("trk");
             writeAttr(trk, RTE_TRK_KEYS);
             gpxExtensions(trk.getExtensions());
Index: test/unit/org/openstreetmap/josm/data/gpx/GpxDataTest.java
===================================================================
--- test/unit/org/openstreetmap/josm/data/gpx/GpxDataTest.java	(revision 15500)
+++ test/unit/org/openstreetmap/josm/data/gpx/GpxDataTest.java	(working copy)
@@ -113,7 +113,7 @@
     }
 
     /**
-     * Test method for {@link GpxData#getTracks()},  {@link GpxData#addTrack(GpxTrack)},  {@link GpxData#removeTrack(GpxTrack)}.
+     * Test method for {@link GpxData#getTracks()},  {@link GpxData#addTrack(IGpxTrack)},  {@link GpxData#removeTrack(IGpxTrack)}.
      */
     @Test
     public void testTracks() {
@@ -135,7 +135,7 @@
     }
 
     /**
-     * Test method for {@link GpxData#addTrack(GpxTrack)}.
+     * Test method for {@link GpxData#addTrack(IGpxTrack)}.
      */
     @Test(expected = IllegalArgumentException.class)
     public void testAddTrackFails() {
@@ -145,7 +145,7 @@
     }
 
     /**
-     * Test method for {@link GpxData#removeTrack(GpxTrack)}.
+     * Test method for {@link GpxData#removeTrack(IGpxTrack)}.
      */
     @Test(expected = IllegalArgumentException.class)
     public void testRemoveTrackFails() {
Index: test/unit/org/openstreetmap/josm/gui/layer/OsmDataLayerTest.java
===================================================================
--- test/unit/org/openstreetmap/josm/gui/layer/OsmDataLayerTest.java	(revision 15500)
+++ test/unit/org/openstreetmap/josm/gui/layer/OsmDataLayerTest.java	(working copy)
@@ -22,7 +22,7 @@
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.gpx.GpxConstants;
 import org.openstreetmap.josm.data.gpx.GpxData;
-import org.openstreetmap.josm.data.gpx.GpxTrack;
+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.data.osm.DataSet;
@@ -239,7 +239,7 @@
         assertTrue(gpx.getWaypoints().isEmpty());
         // Check that track is correct
         assertEquals(1, gpx.getTrackCount());
-        GpxTrack track = gpx.getTracks().iterator().next();
+        IGpxTrack track = gpx.getTracks().iterator().next();
         Collection<IGpxTrackSegment> segments = track.getSegments();
         assertEquals(1, segments.size());
         Collection<WayPoint> trackpoints = segments.iterator().next().getWayPoints();
Index: test/unit/org/openstreetmap/josm/io/nmea/NmeaReaderTest.java
===================================================================
--- test/unit/org/openstreetmap/josm/io/nmea/NmeaReaderTest.java	(revision 15500)
+++ test/unit/org/openstreetmap/josm/io/nmea/NmeaReaderTest.java	(working copy)
@@ -23,7 +23,7 @@
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.gpx.GpxConstants;
 import org.openstreetmap.josm.data.gpx.GpxData;
-import org.openstreetmap.josm.data.gpx.GpxTrack;
+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.io.GpxReaderTest;
@@ -94,8 +94,8 @@
         assertEquals(gpx.dataSources, in.data.dataSources);
         assertEquals(1, gpx.tracks.size());
         assertEquals(1, in.data.tracks.size());
-        GpxTrack gpxTrack = gpx.tracks.iterator().next();
-        GpxTrack nmeaTrack = in.data.tracks.iterator().next();
+        IGpxTrack gpxTrack = gpx.tracks.iterator().next();
+        IGpxTrack nmeaTrack = in.data.tracks.iterator().next();
         assertEquals(gpxTrack.getBounds(), nmeaTrack.getBounds());
         int nTracks = gpxTrack.getSegments().size();
         assertEquals(nTracks, nmeaTrack.getSegments().size());
