Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java	(revision 4333)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java	(revision 4334)
@@ -81,4 +81,5 @@
             } else {
                 x.mergeFrom(layer);
+                Main.map.repaint();
             }
         }
Index: trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 4333)
+++ trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 4334)
@@ -112,5 +112,5 @@
     private boolean isLocalFile;
     // used by ChooseTrackVisibilityAction to determine which tracks to show/hide
-    private boolean[] trackVisibility;
+    private boolean[] trackVisibility = new boolean[0];
 
     private final List<GpxTrack> lastTracks = new ArrayList<GpxTrack>(); // List of tracks at last paint
@@ -126,8 +126,5 @@
         data = d;
         computeCacheInSync = false;
-        trackVisibility = new boolean[d.tracks.size()];
-        for(int i=0; i < d.tracks.size(); i++) {
-            trackVisibility[i] = true;
-        }
+        ensureTrackVisibilityLength();
     }
 
@@ -579,5 +576,5 @@
                                     int velColor =(int) Math.round(colorModeDynamic ? ((vel-minval)*255/(maxval-minval))
                                             : (vel <= 0 ? 0 : vel / colorTracksTune * 255));
-                                    trkPnt.customColoring = colors[velColor > 255 ? 255 : velColor];
+                                    trkPnt.customColoring = colors[Math.max(0, Math.min(velColor, 255))];
                                 } else {
                                     trkPnt.customColoring = colors[255];
@@ -622,4 +619,5 @@
         WayPoint last = null;
         int i = 0;
+        ensureTrackVisibilityLength();
         for (GpxTrack trk: data.tracks) {
             // hide tracks that were de-selected in ChooseTrackVisibilityAction
@@ -857,4 +855,22 @@
     public void setAssociatedFile(File file) {
         data.storageFile = file;
+    }
+
+    /** ensures the trackVisibility array has the correct length without losing data.
+     * additional entries are initialized to true;
+     */
+    final private void ensureTrackVisibilityLength() {
+        final int l = data.tracks.size();
+        if(l == trackVisibility.length)
+            return;
+        final boolean[] back = trackVisibility.clone();
+        final int m = Math.min(l, back.length);
+        trackVisibility = new boolean[l];
+        for(int i=0; i < m; i++) {
+            trackVisibility[i] = back[i];
+        }
+        for(int i=m; i < l; i++) {
+            trackVisibility[i] = true;
+        }
     }
 
