Index: trunk/src/org/openstreetmap/josm/gui/layer/GeoImageLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/GeoImageLayer.java	(revision 1862)
+++ trunk/src/org/openstreetmap/josm/gui/layer/GeoImageLayer.java	(revision 1863)
@@ -68,4 +68,5 @@
 import org.openstreetmap.josm.data.gpx.WayPoint;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
+import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
@@ -73,4 +74,5 @@
 import org.openstreetmap.josm.gui.dialogs.LayerListPopup;
 import org.openstreetmap.josm.gui.layer.GeoImageLayer.ImageLoader.ImageLoadedListener;
+import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.tools.DateParser;
 import org.openstreetmap.josm.tools.ExifReader;
@@ -265,5 +267,8 @@
 
         public void imageLoaded() {
-            Main.map.mapView.repaint();
+            MapFrame frame = Main.map;
+            if (frame != null) {
+              frame.mapView.repaint();
+            }
         }
     }
@@ -280,24 +285,40 @@
         @Override protected void realRun() throws IOException {
             progressMonitor.subTask(tr("Read GPX..."));
+            progressMonitor.setTicksCount(10 + files.size());
             LinkedList<TimedPoint> gps = new LinkedList<TimedPoint>();
 
             // Extract dates and locations from GPX input
 
-            for (GpxTrack trk : gpxLayer.data.tracks) {
+            ProgressMonitor gpxSubTask = progressMonitor.createSubTaskMonitor(10, true);
+            int size = 0;
+            for (GpxTrack trk:gpxLayer.data.tracks) {
                 for (Collection<WayPoint> segment : trk.trackSegs) {
-                    for (WayPoint p : segment) {
-                        LatLon c = p.getCoor();
-                        if (!p.attr.containsKey("time"))
-                            throw new IOException(tr("No time for point {0} x {1}",c.lat(),c.lon()));
-                        Date d = null;
-                        try {
-                            d = DateParser.parse((String) p.attr.get("time"));
-                        } catch (ParseException e) {
-                            throw new IOException(tr("Cannot read time \"{0}\" from point {1} x {2}",p.attr.get("time"),c.lat(),c.lon()));
+                    size += segment.size();
+                }
+            }
+            gpxSubTask.beginTask(null, size);
+
+            try {
+                for (GpxTrack trk : gpxLayer.data.tracks) {
+                    for (Collection<WayPoint> segment : trk.trackSegs) {
+                        for (WayPoint p : segment) {
+                            LatLon c = p.getCoor();
+                            if (!p.attr.containsKey("time"))
+                                throw new IOException(tr("No time for point {0} x {1}",c.lat(),c.lon()));
+                            Date d = null;
+                            try {
+                                d = DateParser.parse((String) p.attr.get("time"));
+                            } catch (ParseException e) {
+                                throw new IOException(tr("Cannot read time \"{0}\" from point {1} x {2}",p.attr.get("time"),c.lat(),c.lon()));
+                            }
+                            gps.add(new TimedPoint(d, c));
+                            gpxSubTask.worked(1);
                         }
-                        gps.add(new TimedPoint(d, c));
                     }
                 }
-            }
+            } finally {
+                gpxSubTask.finishTask();
+            }
+
 
             if (gps.isEmpty()) {
@@ -308,5 +329,4 @@
             // read the image files
             ArrayList<ImageEntry> data = new ArrayList<ImageEntry>(files.size());
-            progressMonitor.setTicksCount(files.size());
             for (File f : files) {
                 if (progressMonitor.isCancelled())
@@ -317,4 +337,5 @@
                 try {
                     e.time = ExifReader.readTime(f);
+                    progressMonitor.worked(1);
                 } catch (ParseException e1) {
                     continue;
@@ -324,5 +345,4 @@
 
                 data.add(e);
-                progressMonitor.worked(1);
             }
             layer = new GeoImageLayer(data, gps);
Index: trunk/src/org/openstreetmap/josm/gui/progress/PleaseWaitProgressMonitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/progress/PleaseWaitProgressMonitor.java	(revision 1862)
+++ trunk/src/org/openstreetmap/josm/gui/progress/PleaseWaitProgressMonitor.java	(revision 1863)
@@ -23,4 +23,5 @@
     private static final int PROGRESS_BAR_MAX = 100;
     private final Window dialogParent;
+    private int currentProgressValue = 0;
 
     private PleaseWaitDialog dialog;
@@ -110,15 +111,14 @@
     }
 
-    public void worked(int ticks) {
-        this.ticks += ticks;
-        updateProgress(0);
-    }
-
-    protected void updateProgress(final double progressValue) {
-        doInEDT(new Runnable() {
-            public void run() {
-                dialog.progress.setValue((int)(progressValue * PROGRESS_BAR_MAX));
-            }
-        });
+    protected void updateProgress(double progressValue) {
+        final int newValue = (int)(progressValue * PROGRESS_BAR_MAX);
+        if (newValue != currentProgressValue) {
+            currentProgressValue = newValue;
+            doInEDT(new Runnable() {
+                public void run() {
+                    dialog.progress.setValue(currentProgressValue);
+                }
+            });
+        }
     }
 
