Index: /trunk/src/org/openstreetmap/josm/data/gpx/GpxData.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/gpx/GpxData.java	(revision 3118)
+++ /trunk/src/org/openstreetmap/josm/data/gpx/GpxData.java	(revision 3119)
@@ -35,7 +35,7 @@
     public boolean fromServer;
 
-    public Collection<GpxTrack> tracks = new LinkedList<GpxTrack>();
-    public Collection<GpxRoute> routes = new LinkedList<GpxRoute>();
-    public Collection<WayPoint> waypoints = new LinkedList<WayPoint>();
+    public final Collection<GpxTrack> tracks = new LinkedList<GpxTrack>();
+    public final Collection<GpxRoute> routes = new LinkedList<GpxRoute>();
+    public final Collection<WayPoint> waypoints = new LinkedList<WayPoint>();
 
     @SuppressWarnings("unchecked")
Index: /trunk/src/org/openstreetmap/josm/data/gpx/GpxTrack.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/gpx/GpxTrack.java	(revision 3118)
+++ /trunk/src/org/openstreetmap/josm/data/gpx/GpxTrack.java	(revision 3119)
@@ -21,4 +21,9 @@
     Bounds getBounds();
     double length();
+    /**
+     *
+     * @return Number of times this track has been changed. Always 0 for read-only tracks
+     */
+    int getUpdateCount();
 
 }
Index: /trunk/src/org/openstreetmap/josm/data/gpx/GpxTrackSegment.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/gpx/GpxTrackSegment.java	(revision 3118)
+++ /trunk/src/org/openstreetmap/josm/data/gpx/GpxTrackSegment.java	(revision 3119)
@@ -15,4 +15,8 @@
     Collection<WayPoint> getWayPoints();
     double length();
-
+    /**
+     *
+     * @return Number of times this track has been changed. Always 0 for read-only segments
+     */
+    int getUpdateCount();
 }
Index: /trunk/src/org/openstreetmap/josm/data/gpx/ImmutableGpxTrack.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/gpx/ImmutableGpxTrack.java	(revision 3118)
+++ /trunk/src/org/openstreetmap/josm/data/gpx/ImmutableGpxTrack.java	(revision 3119)
@@ -73,3 +73,7 @@
         return segments;
     }
+
+    public int getUpdateCount() {
+        return 0;
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/data/gpx/ImmutableGpxTrackSegment.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/gpx/ImmutableGpxTrackSegment.java	(revision 3118)
+++ /trunk/src/org/openstreetmap/josm/data/gpx/ImmutableGpxTrackSegment.java	(revision 3119)
@@ -62,3 +62,7 @@
     }
 
+    public int getUpdateCount() {
+        return 0;
+    }
+
 }
Index: /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 3118)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 3119)
@@ -77,5 +77,4 @@
 public class GpxLayer extends Layer {
     public GpxData data;
-    private final GpxLayer me;
     protected static final double PHI = Math.toRadians(15);
     private boolean computeCacheInSync;
@@ -86,4 +85,7 @@
     private boolean isLocalFile;
 
+    private final List<GpxTrack> lastTracks = new ArrayList<GpxTrack>(); // List of tracks at last paint
+    private int lastUpdateCount;
+
     private static class Markers {
         public boolean timedMarkersOmitted = false;
@@ -94,5 +96,4 @@
         super((String) d.attr.get("name"));
         data = d;
-        me = this;
         computeCacheInSync = false;
     }
@@ -207,5 +208,5 @@
 
                 MarkerLayer ml = new MarkerLayer(namedTrackPoints, tr("Named Trackpoints from {0}", getName()),
-                        getAssociatedFile(), me);
+                        getAssociatedFile(), GpxLayer.this);
                 if (ml.data.size() > 0) {
                     Main.main.addLayer(ml);
@@ -282,5 +283,5 @@
                     }
                     MarkerLayer ml = new MarkerLayer(new GpxData(), tr("Audio markers from {0}", getName()) + names,
-                            getAssociatedFile(), me);
+                            getAssociatedFile(), GpxLayer.this);
                     double firstStartTime = sel[0].lastModified() / 1000.0 /* ms -> seconds */
                     - AudioUtil.getCalibratedDuration(sel[0]);
@@ -452,4 +453,20 @@
     }
 
+    private int sumUpdateCount() {
+        int updateCount = 0;
+        for (GpxTrack track: data.tracks) {
+            updateCount += track.getUpdateCount();
+        }
+        return updateCount;
+    }
+
+    @Override
+    public boolean isChanged() {
+        if (data.tracks.equals(lastTracks))
+            return sumUpdateCount() != lastUpdateCount;
+        else
+            return true;
+    }
+
     @Override
     public void mergeFrom(Layer from) {
@@ -481,4 +498,7 @@
     @Override
     public void paint(Graphics2D g, MapView mv, Bounds box) {
+        lastUpdateCount = sumUpdateCount();
+        lastTracks.clear();
+        lastTracks.addAll(data.tracks);
 
         /****************************************************************
