Index: /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java	(revision 18041)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java	(revision 18042)
@@ -25,6 +25,4 @@
 import java.beans.PropertyChangeListener;
 import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
 import java.text.DateFormat;
 import java.text.ParseException;
@@ -32,5 +30,4 @@
 import java.time.Instant;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
@@ -72,5 +69,4 @@
 
 import org.openstreetmap.josm.actions.DiskAccessAction;
-import org.openstreetmap.josm.actions.ExtensionFileFilter;
 import org.openstreetmap.josm.data.gpx.GpxData;
 import org.openstreetmap.josm.data.gpx.GpxImageCorrelation;
@@ -82,8 +78,5 @@
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.MainApplication;
-import org.openstreetmap.josm.gui.io.importexport.GpxImporter;
 import org.openstreetmap.josm.gui.io.importexport.ImageImporter;
-import org.openstreetmap.josm.gui.io.importexport.NMEAImporter;
-import org.openstreetmap.josm.gui.io.importexport.RtkLibImporter;
 import org.openstreetmap.josm.gui.layer.GpxLayer;
 import org.openstreetmap.josm.gui.layer.Layer;
@@ -92,12 +85,8 @@
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
+import org.openstreetmap.josm.gui.layer.gpx.GpxDataHelper;
 import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
-import org.openstreetmap.josm.gui.widgets.FileChooserManager;
 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
-import org.openstreetmap.josm.io.Compression;
-import org.openstreetmap.josm.io.GpxReader;
-import org.openstreetmap.josm.io.IGpxReader;
-import org.openstreetmap.josm.io.nmea.NmeaReader;
 import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.spi.preferences.IPreferences;
@@ -109,5 +98,4 @@
 import org.openstreetmap.josm.tools.Pair;
 import org.openstreetmap.josm.tools.date.DateUtils;
-import org.xml.sax.SAXException;
 
 /**
@@ -280,5 +268,6 @@
     private int lastNumMatched;
 
-    /** This class is called when the user doesn't find the GPX file he needs in the files that have
+    /**
+     * This class is called when the user doesn't find the GPX file he needs in the files that have
      * been loaded yet. It displays a FileChooser dialog to select the GPX file to be loaded.
      */
@@ -287,48 +276,19 @@
         @Override
         public void actionPerformed(ActionEvent e) {
-            ExtensionFileFilter gpxFilter = GpxImporter.getFileFilter();
-            AbstractFileChooser fc = new FileChooserManager(true, null).createFileChooser(false, null,
-                    Arrays.asList(gpxFilter, NMEAImporter.FILE_FILTER, RtkLibImporter.FILE_FILTER), gpxFilter, JFileChooser.FILES_ONLY)
-                    .openFileChooser();
-            if (fc == null)
-                return;
-            File sel = fc.getSelectedFile();
-
-            try {
-                outerPanel.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
-                removeDuplicates(sel);
-                GpxData data = null;
-                try (InputStream iStream = Compression.getUncompressedFileInputStream(sel)) {
-                    IGpxReader reader = gpxFilter.accept(sel) ? new GpxReader(iStream) : new NmeaReader(iStream);
-                    reader.parse(false);
-                    data = reader.getGpxData();
-                    data.storageFile = sel;
-
-                } catch (SAXException ex) {
-                    Logging.error(ex);
-                    JOptionPane.showMessageDialog(
-                            MainApplication.getMainFrame(),
-                            tr("Error while parsing {0}", sel.getName())+": "+ex.getMessage(),
-                            tr("Error"),
-                            JOptionPane.ERROR_MESSAGE
-                    );
-                    return;
-                } catch (IOException ex) {
-                    Logging.error(ex);
-                    JOptionPane.showMessageDialog(
-                            MainApplication.getMainFrame(),
-                            tr("Could not read \"{0}\"", sel.getName())+'\n'+ex.getMessage(),
-                            tr("Error"),
-                            JOptionPane.ERROR_MESSAGE
-                    );
-                    return;
-                }
-
-                GpxDataWrapper elem = new GpxDataWrapper(sel.getName(), data, sel);
-                gpxModel.addElement(elem);
-                gpxModel.setSelectedItem(elem);
-                statusBarUpdater.matchAndUpdateStatusBar();
-            } finally {
-                outerPanel.setCursor(Cursor.getDefaultCursor());
+            File sel = GpxDataHelper.chooseGpxDataFile();
+            if (sel != null) {
+                try {
+                    outerPanel.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+                    removeDuplicates(sel);
+                    GpxData data = GpxDataHelper.loadGpxData(sel);
+                    if (data != null) {
+                        GpxDataWrapper elem = new GpxDataWrapper(sel.getName(), data, sel);
+                        gpxModel.addElement(elem);
+                        gpxModel.setSelectedItem(elem);
+                        statusBarUpdater.matchAndUpdateStatusBar();
+                    }
+                } finally {
+                    outerPanel.setCursor(Cursor.getDefaultCursor());
+                }
             }
         }
@@ -1407,4 +1367,3 @@
         closeDialog();
     }
-
 }
Index: /trunk/src/org/openstreetmap/josm/gui/layer/gpx/GpxDataHelper.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/gpx/GpxDataHelper.java	(revision 18042)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/gpx/GpxDataHelper.java	(revision 18042)
@@ -0,0 +1,81 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer.gpx;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+
+import org.openstreetmap.josm.actions.ExtensionFileFilter;
+import org.openstreetmap.josm.data.gpx.GpxData;
+import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.gui.io.importexport.GpxImporter;
+import org.openstreetmap.josm.gui.io.importexport.NMEAImporter;
+import org.openstreetmap.josm.gui.io.importexport.RtkLibImporter;
+import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
+import org.openstreetmap.josm.gui.widgets.FileChooserManager;
+import org.openstreetmap.josm.io.Compression;
+import org.openstreetmap.josm.io.GpxReader;
+import org.openstreetmap.josm.io.IGpxReader;
+import org.openstreetmap.josm.io.nmea.NmeaReader;
+import org.openstreetmap.josm.io.rtklib.RtkLibPosReader;
+import org.openstreetmap.josm.tools.Logging;
+import org.xml.sax.SAXException;
+
+/**
+ * Helper class to select and load "GPX data" (GPX, NMEA, pos) files.
+ * @since 18042
+ */
+public final class GpxDataHelper {
+
+    /**
+     * Opens a file chooser to let the user select a "GPX data" file and returns it.
+     * @return the file chosen by the user, or {@code null}
+     */
+    public static File chooseGpxDataFile() {
+        ExtensionFileFilter gpxFilter = GpxImporter.getFileFilter();
+        AbstractFileChooser fc = new FileChooserManager(true, null).createFileChooser(false, null,
+                Arrays.asList(gpxFilter, NMEAImporter.FILE_FILTER, RtkLibImporter.FILE_FILTER), gpxFilter, JFileChooser.FILES_ONLY)
+                .openFileChooser();
+        return fc != null ? fc.getSelectedFile() : null;
+    }
+
+    /**
+     * Loads {@link GpxData} from the given file and returns it. Shows message dialog in case of error.
+     * @param file gpx data file, must not be null
+     * @return {@code GpxData} file, or null in case of error
+     */
+    public static GpxData loadGpxData(File file) {
+        GpxData data = null;
+        try (InputStream iStream = Compression.getUncompressedFileInputStream(file)) {
+            IGpxReader reader = GpxImporter.getFileFilter().accept(file) ? new GpxReader(iStream)
+                    : NMEAImporter.FILE_FILTER.accept(file) ? new NmeaReader(iStream)
+                            : new RtkLibPosReader(iStream);
+            reader.parse(false);
+            data = reader.getGpxData();
+            data.storageFile = file;
+        } catch (SAXException ex) {
+            Logging.error(ex);
+            JOptionPane.showMessageDialog(
+                    MainApplication.getMainFrame(),
+                    tr("Error while parsing {0}", file.getName()) + ": " + ex.getMessage(),
+                    tr("Error"),
+                    JOptionPane.ERROR_MESSAGE
+            );
+        } catch (IOException ex) {
+            Logging.error(ex);
+            JOptionPane.showMessageDialog(
+                    MainApplication.getMainFrame(),
+                    tr("Could not read \"{0}\"", file.getName()) + '\n' + ex.getMessage(),
+                    tr("Error"),
+                    JOptionPane.ERROR_MESSAGE
+            );
+        }
+        return data;
+    }
+}
