Index: /trunk/src/org/openstreetmap/josm/actions/DiskAccessAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/DiskAccessAction.java	(revision 5437)
+++ /trunk/src/org/openstreetmap/josm/actions/DiskAccessAction.java	(revision 5438)
@@ -2,67 +2,129 @@
 package org.openstreetmap.josm.actions;
 
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.io.File;
+import java.util.Collection;
 
 import javax.swing.JFileChooser;
+import javax.swing.filechooser.FileFilter;
 
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.gui.widgets.JFileChooserManager;
 import org.openstreetmap.josm.tools.Shortcut;
 
 /**
- * Helper class for all actions that access the disk
+ * Helper class for all actions that access the disk.
+ * @since 78
  */
 abstract public class DiskAccessAction extends JosmAction {
 
+    /**
+     * Constructs a new {@code DiskAccessAction}.
+     * 
+     * @param name The action's text as displayed on the menu (if it is added to a menu)
+     * @param iconName The filename of the icon to use
+     * @param tooltip A longer description of the action that will be displayed in the tooltip
+     * @param shortcut A ready-created shortcut object or {@code null} if you don't want a shortcut
+     * @since 1084
+     */
     public DiskAccessAction(String name, String iconName, String tooltip, Shortcut shortcut) {
         super(name, iconName, tooltip, shortcut, true);
     }
 
+    /**
+     * Constructs a new {@code DiskAccessAction}.
+     *
+     * @param name The action's text as displayed on the menu (if it is added to a menu)
+     * @param iconName The filename of the icon to use
+     * @param tooltip  A longer description of the action that will be displayed in the tooltip
+     * @param shortcut A ready-created shortcut object or null if you don't want a shortcut
+     * @param register Register this action for the toolbar preferences?
+     * @param toolbarId Identifier for the toolbar preferences. The iconName is used, if this parameter is null
+     * @param installAdapters False, if you don't want to install layer changed and selection changed adapters
+     * @since 5438
+     */
+    public DiskAccessAction(String name, String iconName, String tooltip, Shortcut shortcut, boolean register, String toolbarId, boolean installAdapters) {
+        super(name, iconName, tooltip, shortcut, register, toolbarId, installAdapters);
+    }
+
+    /**
+     * Creates a new {@link JFileChooser} and makes it visible.
+     * @param open If true, pops up an "Open File" dialog. If false, pops up a "Save File" dialog 
+     * @param multiple If true, makes the dialog allow multiple file selections
+     * @param title The string that goes in the dialog window's title bar
+     * @return The {@code JFileChooser}.
+     * @since 1646
+     */
     public static JFileChooser createAndOpenFileChooser(boolean open, boolean multiple, String title) {
         return createAndOpenFileChooser(open, multiple, title, null);
     }
 
+    /**
+     * Creates a new {@link JFileChooser} and makes it visible.
+     * @param open If true, pops up an "Open File" dialog. If false, pops up a "Save File" dialog 
+     * @param multiple If true, makes the dialog allow multiple file selections
+     * @param title The string that goes in the dialog window's title bar
+     * @param extension The file extension that will be selected as the default file filter
+     * @return The {@code JFileChooser}.
+     * @since 2020
+     */
     public static JFileChooser createAndOpenFileChooser(boolean open, boolean multiple, String title, String extension) {
-        String curDir = Main.pref.get("lastDirectory");
-        if (curDir.equals("")) {
-            curDir = ".";
-        }
-        JFileChooser fc = new JFileChooser(new File(curDir));
-        if (title != null) {
-            fc.setDialogTitle(title);
-        }
+        return createAndOpenFileChooser(open, multiple, title, extension, JFileChooser.FILES_ONLY, true, null);
+    }
 
-        fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
-        fc.setMultiSelectionEnabled(multiple);
-        fc.setAcceptAllFileFilterUsed(false);
-        ExtensionFileFilter.applyChoosableImportFileFilters(fc, extension);
+    /**
+     * Creates a new {@link JFileChooser} and makes it visible.
+     * @param open If true, pops up an "Open File" dialog. If false, pops up a "Save File" dialog 
+     * @param multiple If true, makes the dialog allow multiple file selections
+     * @param title The string that goes in the dialog window's title bar
+     * @param extension The file extension that will be selected as the default file filter
+     * @param selectionMode The selection mode that allows the user to:<br/>
+     *                      <li>just select files ({@code JFileChooser.FILES_ONLY})</li> 
+     *                      <li>just select directories ({@code JFileChooser.DIRECTORIES_ONLY})</li> 
+     *                      <li>select both files and directories ({@code JFileChooser.FILES_AND_DIRECTORIES})</li>
+     * @param allTypes If true, all the files types known by JOSM will be proposed in the "file type" combobox. 
+     *                 If false, only the file filters that include {@code extension} will be proposed
+     * @param lastDirProperty The name of the property used to setup the JFileChooser initial directory. 
+     *        This property will then be updated to the new "last directory" chosen by the user. If null, the default property "lastDirectory" will be used.
+     * @return The {@code JFileChooser}.
+     * @since 5438
+     */
+    public static JFileChooser createAndOpenFileChooser(boolean open, boolean multiple, String title, String extension, int selectionMode, boolean allTypes, String lastDirProperty) {
+        return new JFileChooserManager(open, lastDirProperty).createFileChooser(multiple, title, extension, allTypes, selectionMode).openFileChooser();
+    }
 
-        int answer = open ? fc.showOpenDialog(Main.parent) : fc.showSaveDialog(Main.parent);
-        if (answer != JFileChooser.APPROVE_OPTION)
-            return null;
+    /**
+     * Creates a new {@link JFileChooser} for a single {@link FileFilter} and makes it visible.
+     * @param open If true, pops up an "Open File" dialog. If false, pops up a "Save File" dialog 
+     * @param multiple If true, makes the dialog allow multiple file selections
+     * @param title The string that goes in the dialog window's title bar
+     * @param filter The only file filter that will be proposed by the dialog
+     * @param selectionMode The selection mode that allows the user to:<br/>
+     *                      <li>just select files ({@code JFileChooser.FILES_ONLY})</li> 
+     *                      <li>just select directories ({@code JFileChooser.DIRECTORIES_ONLY})</li> 
+     *                      <li>select both files and directories ({@code JFileChooser.FILES_AND_DIRECTORIES})</li>
+     * @param lastDirProperty The name of the property used to setup the JFileChooser initial directory. This property will then be updated to the new "last directory" chosen by the user
+     * @return The {@code JFileChooser}.
+     * @since 5438
+     */
+    public static JFileChooser createAndOpenFileChooser(boolean open, boolean multiple, String title, FileFilter filter, int selectionMode, String lastDirProperty) {
+        return new JFileChooserManager(open, lastDirProperty).createFileChooser(multiple, title, filter, selectionMode).openFileChooser();
+    }
 
-        if (!fc.getCurrentDirectory().getAbsolutePath().equals(curDir)) {
-            Main.pref.put("lastDirectory", fc.getCurrentDirectory().getAbsolutePath());
-        }
-
-        if (!open) {
-            File file = fc.getSelectedFile();
-            if (file != null && file.exists()) {
-                ExtendedDialog dialog = new ExtendedDialog(
-                        Main.parent,
-                        tr("Overwrite"),
-                        new String[] {tr("Overwrite"), tr("Cancel")}
-                );
-                dialog.setContent(tr("File exists. Overwrite?"));
-                dialog.setButtonIcons(new String[] {"save_as.png", "cancel.png"});
-                dialog.showDialog();
-                if (dialog.getValue() != 1)
-                    return null;
-            }
-        }
-
-        return fc;
+    /**
+     * Creates a new {@link JFileChooser} for several {@link FileFilter}s and makes it visible.
+     * @param open If true, pops up an "Open File" dialog. If false, pops up a "Save File" dialog 
+     * @param multiple If true, makes the dialog allow multiple file selections
+     * @param title The string that goes in the dialog window's title bar
+     * @param filters The file filters that will be proposed by the dialog
+     * @param defaultFilter The file filter that will be selected by default
+     * @param selectionMode The selection mode that allows the user to:<br/>
+     *                      <li>just select files ({@code JFileChooser.FILES_ONLY})</li> 
+     *                      <li>just select directories ({@code JFileChooser.DIRECTORIES_ONLY})</li> 
+     *                      <li>select both files and directories ({@code JFileChooser.FILES_AND_DIRECTORIES})</li>
+     * @param lastDirProperty The name of the property used to setup the JFileChooser initial directory. This property will then be updated to the new "last directory" chosen by the user
+     * @return The {@code JFileChooser}.
+     * @since 5438
+     */
+    public static JFileChooser createAndOpenFileChooser(boolean open, boolean multiple, String title, 
+            Collection<? extends FileFilter> filters, FileFilter defaultFilter, int selectionMode, String lastDirProperty) {
+        return new JFileChooserManager(open, lastDirProperty).createFileChooser(multiple, title, filters, defaultFilter, selectionMode).openFileChooser();
     }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(revision 5437)
+++ /trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(revision 5438)
@@ -19,13 +19,18 @@
  * A file filter that filters after the extension. Also includes a list of file
  * filters used in JOSM.
- *
+ * @since 32
  */
 public class ExtensionFileFilter extends FileFilter {
 
     /**
-     * list of supported formats
+     * List of supported formats for import.
+     * @since 4869
      */
     public static final ArrayList<FileImporter> importers;
 
+    /**
+     * List of supported formats for export.
+     * @since 4869
+     */
     public static final ArrayList<FileExporter> exporters;
 
@@ -95,8 +100,10 @@
      * Updates the {@link AllFormatsImporter} that is contained in the importers list. If
      * you do not use the importers variable directly, you don’t need to call this.
+     * <p>
+     * Updating the AllFormatsImporter is required when plugins add new importers that
+     * support new file extensions. The old AllFormatsImporter doesn’t include the new
+     * extensions and thus will not display these files.
      * 
-     *  Updating the AllFormatsImporter is required when plugins add new importers that
-     *  support new file extensions. The old AllFormatsImporter doesn’t include the new
-     *  extensions and thus will not display these files.
+     * @since 5131
      */
     public static void updateAllFormatsImporter() {
@@ -114,4 +121,5 @@
      *
      * @return an ordered list of {@link ExtensionFileFilter}s for importing.
+     * @since 2029
      */
     public static List<ExtensionFileFilter> getImportExtensionFileFilters() {
@@ -131,4 +139,5 @@
      *
      * @return an ordered list of {@link ExtensionFileFilter}s for exporting.
+     * @since 2029
      */
     public static List<ExtensionFileFilter> getExportExtensionFileFilters() {
@@ -149,4 +158,5 @@
      * @param extension the extension
      * @return the default {@link ExtensionFileFilter} for a given extension
+     * @since 2029
      */
     public static ExtensionFileFilter getDefaultImportExtensionFileFilter(String extension) {
@@ -164,4 +174,5 @@
      * @param extension the extension
      * @return the default {@link ExtensionFileFilter} for a given extension
+     * @since 2029
      */
     public static ExtensionFileFilter getDefaultExportExtensionFileFilter(String extension) {
@@ -180,8 +191,13 @@
      * @param fileChooser the file chooser
      * @param extension the default extension
-     */
-    public static void applyChoosableImportFileFilters(JFileChooser fileChooser, String extension) {
+     * @param allTypes If true, all the files types known by JOSM will be proposed in the "file type" combobox. 
+     *                 If false, only the file filters that include {@code extension} will be proposed
+     * @since 5438
+     */
+    public static void applyChoosableImportFileFilters(JFileChooser fileChooser, String extension, boolean allTypes) {
         for (ExtensionFileFilter filter: getImportExtensionFileFilters()) {
-            fileChooser.addChoosableFileFilter(filter);
+            if (allTypes || filter.acceptName("file."+extension)) {
+                fileChooser.addChoosableFileFilter(filter);
+            }
         }
         fileChooser.setFileFilter(getDefaultImportExtensionFileFilter(extension));
@@ -194,8 +210,13 @@
      * @param fileChooser the file chooser
      * @param extension the default extension
-     */
-    public static void applyChoosableExportFileFilters(JFileChooser fileChooser, String extension) {
+     * @param allTypes If true, all the files types known by JOSM will be proposed in the "file type" combobox. 
+     *                 If false, only the file filters that include {@code extension} will be proposed
+     * @since 5438
+     */
+    public static void applyChoosableExportFileFilters(JFileChooser fileChooser, String extension, boolean allTypes) {
         for (ExtensionFileFilter filter: getExportExtensionFileFilters()) {
-            fileChooser.addChoosableFileFilter(filter);
+            if (allTypes || filter.acceptName("file."+extension)) {
+                fileChooser.addChoosableFileFilter(filter);
+            }
         }
         fileChooser.setFileFilter(getDefaultExportExtensionFileFilter(extension));
@@ -204,4 +225,8 @@
     /**
      * Construct an extension file filter by giving the extension to check after.
+     * @param extension The comma-separated list of file extensions
+     * @param defaultExtension The default extension
+     * @param description A short textual description of the file type
+     * @since 1169
      */
     public ExtensionFileFilter(String extension, String defaultExtension, String description) {
@@ -211,4 +236,10 @@
     }
 
+    /**
+     * Returns true if this file filter accepts the given filename.
+     * @param filename The filename to check after
+     * @return true if this file filter accepts the given filename (i.e if this filename ends with one of the extensions)
+     * @since 1169
+     */
     public boolean acceptName(String filename) {
         String name = filename.toLowerCase();
@@ -219,5 +250,6 @@
     }
 
-    @Override public boolean accept(File pathname) {
+    @Override
+    public boolean accept(File pathname) {
         if (pathname.isDirectory())
             return true;
@@ -225,12 +257,23 @@
     }
 
-    @Override public String getDescription() {
+    @Override
+    public String getDescription() {
         return description;
     }
 
+    /**
+     * Replies the comma-separated list of file extensions of this file filter. 
+     * @return the comma-separated list of file extensions of this file filter, as a String
+     * @since 5131
+     */
     public String getExtensions() {
         return extensions;
     }
 
+    /**
+     * Replies the default file extension of this file filter.
+     * @return the default file extension of this file filter
+     * @since 2029
+     */
     public String getDefaultExtension() {
         return defaultExtension;
Index: /trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java	(revision 5437)
+++ /trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java	(revision 5438)
@@ -182,28 +182,11 @@
 
     public static File createAndOpenSaveFileChooser(String title, String extension) {
-        String curDir = Main.pref.get("lastDirectory");
-        if (curDir.equals("")) {
-            curDir = ".";
-        }
-        JFileChooser fc = new JFileChooser(new File(curDir));
-        if (title != null) {
-            fc.setDialogTitle(title);
-        }
-
-        fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
-        fc.setMultiSelectionEnabled(false);
-        fc.setAcceptAllFileFilterUsed(false);
-        ExtensionFileFilter.applyChoosableExportFileFilters(fc, extension);
-        int answer = fc.showSaveDialog(Main.parent);
-        if (answer != JFileChooser.APPROVE_OPTION)
-            return null;
-
-        if (!fc.getCurrentDirectory().getAbsolutePath().equals(curDir)) {
-            Main.pref.put("lastDirectory", fc.getCurrentDirectory().getAbsolutePath());
-        }
+
+        JFileChooser fc = createAndOpenFileChooser(false, false, title, extension);
+        if (fc == null) return null; 
 
         File file = fc.getSelectedFile();
         String fn = file.getPath();
-        if(fn.indexOf('.') == -1)
+        if (fn.indexOf('.') == -1)
         {
             FileFilter ff = fc.getFileFilter();
Index: /trunk/src/org/openstreetmap/josm/actions/SessionLoadAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/SessionLoadAction.java	(revision 5437)
+++ /trunk/src/org/openstreetmap/josm/actions/SessionLoadAction.java	(revision 5438)
@@ -13,5 +13,4 @@
 import javax.swing.JOptionPane;
 import javax.swing.SwingUtilities;
-import javax.swing.filechooser.FileFilter;
 
 import org.openstreetmap.josm.Main;
@@ -23,5 +22,6 @@
 import org.openstreetmap.josm.io.session.SessionReader;
 
-public class SessionLoadAction extends JosmAction {
+public class SessionLoadAction extends DiskAccessAction {
+    
     public SessionLoadAction() {
         super(tr("Load Session"), "open", tr("Load a session from file."), null, true, "load-session", true);
@@ -30,27 +30,9 @@
 
     public void actionPerformed(ActionEvent e) {
-        String curDir = Main.pref.get("lastDirectory");
-        if (curDir.equals("")) {
-            curDir = ".";
-        }
-        JFileChooser fc = new JFileChooser(new File(curDir));
-        fc.setDialogTitle(tr("Open session"));
-        fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
-        fc.setMultiSelectionEnabled(false);
-        fc.setAcceptAllFileFilterUsed(true);
-        FileFilter ff = new ExtensionFileFilter("jos,joz", "jos", tr("Session file (*.jos, *.joz)"));
-        fc.addChoosableFileFilter(ff);
-        int answer = fc.showOpenDialog(Main.parent);
-        if (answer != JFileChooser.APPROVE_OPTION)
-            return;
-
-        if (!fc.getCurrentDirectory().getAbsolutePath().equals(curDir)) {
-            Main.pref.put("lastDirectory", fc.getCurrentDirectory().getAbsolutePath());
-        }
+        ExtensionFileFilter ff = new ExtensionFileFilter("jos,joz", "jos", tr("Session file (*.jos, *.joz)"));
+        JFileChooser fc = createAndOpenFileChooser(true, false, tr("Open session"), ff, JFileChooser.FILES_ONLY, "lastDirectory");
+        if (fc == null) return;
         File file = fc.getSelectedFile();
-        boolean zip = true;
-        if (file.getName().toLowerCase().endsWith(".jos")) {
-            zip = false;
-        }
+        boolean zip = file.getName().toLowerCase().endsWith(".joz");
         Main.worker.submit(new Loader(file, zip));
     }
@@ -72,5 +54,5 @@
         @Override
         protected void cancel() {
-            Thread.currentThread().dumpStack();
+            Thread.dumpStack();
             canceled = true;
         }
Index: /trunk/src/org/openstreetmap/josm/actions/SessionSaveAsAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/SessionSaveAsAction.java	(revision 5437)
+++ /trunk/src/org/openstreetmap/josm/actions/SessionSaveAsAction.java	(revision 5438)
@@ -2,6 +2,6 @@
 package org.openstreetmap.josm.actions;
 
+import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
 import static org.openstreetmap.josm.tools.I18n.tr;
-import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
 
 import java.awt.Component;
@@ -12,5 +12,7 @@
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -32,5 +34,4 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.ExtensionFileFilter;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
@@ -42,5 +43,5 @@
 import org.openstreetmap.josm.tools.WindowGeometry;
 
-public class SessionSaveAsAction extends JosmAction {
+public class SessionSaveAsAction extends DiskAccessAction {
 
     private List<Layer> layers;
@@ -52,5 +53,4 @@
     /**
      * Construct the action with "Save" as label.
-     * @param layer Save this layer.
      */
     public SessionSaveAsAction() {
@@ -77,28 +77,18 @@
             }
         }
-
-        String curDir = Main.pref.get("lastDirectory");
-        if (curDir.equals("")) {
-            curDir = ".";
-        }
-        JFileChooser fc = new JFileChooser(new File(curDir));
-        fc.setDialogTitle(tr("Save session"));
-        fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
+        
         FileFilter joz = new ExtensionFileFilter("joz", "joz", tr("Session file (archive) (*.joz)"));
         FileFilter jos = new ExtensionFileFilter("jos", "jos", tr("Session file (*.jos)"));
+
+        JFileChooser fc;
+        
         if (zipRequired) {
-            fc.addChoosableFileFilter(joz);
+            fc = createAndOpenFileChooser(false, false, tr("Save session"), joz, JFileChooser.FILES_ONLY, "lastDirectory");
         } else {
-            fc.addChoosableFileFilter(jos);
-            fc.addChoosableFileFilter(joz);
-            fc.setFileFilter(jos);
-        }
-        int answer = fc.showSaveDialog(Main.parent);
-        if (answer != JFileChooser.APPROVE_OPTION)
+            fc = createAndOpenFileChooser(false, false, tr("Save session"), Arrays.asList(new FileFilter[]{jos, joz}), jos, JFileChooser.FILES_ONLY, "lastDirectory");
+        }
+
+        if (fc == null)
             return;
-
-        if (!fc.getCurrentDirectory().getAbsolutePath().equals(curDir)) {
-            Main.pref.put("lastDirectory", fc.getCurrentDirectory().getAbsolutePath());
-        }
 
         File file = fc.getSelectedFile();
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java	(revision 5437)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java	(revision 5438)
@@ -71,4 +71,5 @@
 import org.openstreetmap.josm.gui.preferences.SourceEntry;
 import org.openstreetmap.josm.gui.widgets.HtmlPanel;
+import org.openstreetmap.josm.gui.widgets.JFileChooserManager;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
 import org.openstreetmap.josm.tools.GBC;
@@ -522,17 +523,11 @@
             final StyleSource s = model.getRow(sel);
 
-            String curDir = Main.pref.get("mappaint.clone-style.lastDirectory", System.getProperty("user.home"));
-
-            String suggestion = curDir + File.separator + s.getFileNamePart();
-            JFileChooser fc = new JFileChooser();
-            fc.setSelectedFile(new File(suggestion));
-
-            int answer = fc.showSaveDialog(Main.parent);
-            if (answer != JFileChooser.APPROVE_OPTION)
+            JFileChooserManager fcm = new JFileChooserManager(false, "mappaint.clone-style.lastDirectory", System.getProperty("user.home"));
+            String suggestion = fcm.getInitialDirectory() + File.separator + s.getFileNamePart();
+            fcm.createFileChooser().getFileChooser().setSelectedFile(new File(suggestion));
+            JFileChooser fc = fcm.openFileChooser();
+            if (fc == null)
                 return;
 
-            if (!fc.getCurrentDirectory().getAbsolutePath().equals(curDir)) {
-                Main.pref.put("mappaint.clone-style.lastDirectory", fc.getCurrentDirectory().getAbsolutePath());
-            }
             File file = fc.getSelectedFile();
 
Index: /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 5437)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 5438)
@@ -62,4 +62,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.AbstractMergeAction.LayerListCellRenderer;
+import org.openstreetmap.josm.actions.DiskAccessAction;
 import org.openstreetmap.josm.actions.RenameLayerAction;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTaskList;
@@ -95,4 +96,5 @@
 import org.openstreetmap.josm.gui.progress.ProgressTaskIds;
 import org.openstreetmap.josm.gui.widgets.HtmlPanel;
+import org.openstreetmap.josm.gui.widgets.JFileChooserManager;
 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
 import org.openstreetmap.josm.io.JpgImporter;
@@ -1909,9 +1911,5 @@
                 return;
             }
-            String dir = Main.pref.get("markers.lastaudiodirectory");
-            JFileChooser fc = new JFileChooser(dir);
-            fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
-            fc.setAcceptAllFileFilterUsed(false);
-            fc.setFileFilter(new FileFilter() {
+            FileFilter filter = new FileFilter() {
                 @Override
                 public boolean accept(File f) {
@@ -1923,11 +1921,7 @@
                     return tr("Wave Audio files (*.wav)");
                 }
-            });
-            fc.setMultiSelectionEnabled(true);
-            if (fc.showOpenDialog(Main.parent) == JFileChooser.APPROVE_OPTION) {
-                if (!fc.getCurrentDirectory().getAbsolutePath().equals(dir)) {
-                    Main.pref.put("markers.lastaudiodirectory", fc.getCurrentDirectory().getAbsolutePath());
-                }
-
+            };
+            JFileChooser fc = DiskAccessAction.createAndOpenFileChooser(true, true, null, filter, JFileChooser.FILES_ONLY, "markers.lastaudiodirectory");
+            if (fc != null) {
                 File sel[] = fc.getSelectedFiles();
                 // sort files in increasing order of timestamp (this is the end time, but so
@@ -1968,5 +1962,4 @@
                 Main.map.repaint();
             }
-
         }
     }
@@ -2010,25 +2003,16 @@
                 return;
             }
-            String curDir = Main.pref.get("geoimage.lastdirectory", Main.pref.get("lastDirectory"));
-            if (curDir.equals("")) {
-                curDir = ".";
-            }
-            JFileChooser fc = new JFileChooser(new File(curDir));
-
-            fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
-            fc.setMultiSelectionEnabled(true);
-            fc.setAcceptAllFileFilterUsed(false);
+            
             JpgImporter importer = new JpgImporter(GpxLayer.this);
-            fc.setFileFilter(importer.filter);
-            fc.showOpenDialog(Main.parent);
-            LinkedList<File> files = new LinkedList<File>();
-            File[] sel = fc.getSelectedFiles();
-            if (sel == null || sel.length == 0)
-                return;
-            if (!fc.getCurrentDirectory().getAbsolutePath().equals(curDir)) {
-                Main.pref.put("geoimage.lastdirectory", fc.getCurrentDirectory().getAbsolutePath());
-            }
-            addRecursiveFiles(files, sel);
-            importer.importDataHandleExceptions(files, NullProgressMonitor.INSTANCE);
+            JFileChooser fc = new JFileChooserManager(true, "geoimage.lastdirectory", Main.pref.get("lastDirectory")).
+                    createFileChooser(true, null, importer.filter, JFileChooser.FILES_AND_DIRECTORIES).openFileChooser();
+            if (fc != null) {
+                File[] sel = fc.getSelectedFiles();
+                if (sel != null && sel.length > 0) {
+                    LinkedList<File> files = new LinkedList<File>();
+                    addRecursiveFiles(files, sel);
+                    importer.importDataHandleExceptions(files, NullProgressMonitor.INSTANCE);
+                }
+            }
         }
     }
Index: /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java	(revision 5437)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java	(revision 5438)
@@ -65,4 +65,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.DiskAccessAction;
 import org.openstreetmap.josm.data.gpx.GpxData;
 import org.openstreetmap.josm.data.gpx.GpxTrack;
@@ -134,10 +135,5 @@
 
         public void actionPerformed(ActionEvent arg0) {
-            JFileChooser fc = new JFileChooser(Main.pref.get("lastDirectory"));
-            fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
-            fc.setAcceptAllFileFilterUsed(false);
-            fc.setMultiSelectionEnabled(false);
-            fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
-            fc.setFileFilter(new FileFilter(){
+            FileFilter filter = new FileFilter(){
                 @Override public boolean accept(File f) {
                     return (f.isDirectory()
@@ -148,14 +144,12 @@
                     return tr("GPX Files (*.gpx *.gpx.gz)");
                 }
-            });
-            fc.showOpenDialog(Main.parent);
+            };
+            JFileChooser fc = DiskAccessAction.createAndOpenFileChooser(true, false, null, filter, JFileChooser.FILES_ONLY, null);
+            if (fc == null)
+                return;
             File sel = fc.getSelectedFile();
-            if (sel == null)
-                return;
 
             try {
                 outerPanel.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
-
-                Main.pref.put("lastDirectory", sel.getPath());
 
                 for (int i = gpxLst.size() - 1 ; i >= 0 ; i--) {
@@ -375,13 +369,8 @@
 
                 public void actionPerformed(ActionEvent arg0) {
-                    JFileChooser fc = new JFileChooser(Main.pref.get("geoimage.lastdirectory"));
-                    fc.setAcceptAllFileFilterUsed(false);
-                    fc.setMultiSelectionEnabled(false);
-                    fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
-                    fc.setFileFilter(JpegFileFilter.getInstance());
-                    fc.showOpenDialog(Main.parent);
+                    JFileChooser fc = DiskAccessAction.createAndOpenFileChooser(true, false, null, JpegFileFilter.getInstance(), JFileChooser.FILES_ONLY, "geoimage.lastdirectory");
+                    if (fc == null)
+                        return;
                     File sel = fc.getSelectedFile();
-                    if (sel == null)
-                        return;
 
                     Integer orientation = null;
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java	(revision 5437)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java	(revision 5438)
@@ -75,4 +75,5 @@
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
+import org.openstreetmap.josm.gui.widgets.JFileChooserManager;
 import org.openstreetmap.josm.io.MirroredInputStream;
 import org.openstreetmap.josm.io.OsmTransferException;
@@ -751,10 +752,10 @@
 
             public void actionPerformed(ActionEvent e) {
-                JFileChooser fc= new JFileChooser();
-                prepareFileChooser(tfURL.getText(), fc);
-                int ret = fc.showOpenDialog(JOptionPane.getFrameForComponent(SourceEditor.this));
-                if (ret != JFileChooser.APPROVE_OPTION)
-                    return;
-                tfURL.setText(fc.getSelectedFile().toString());
+                JFileChooserManager fcm = new JFileChooserManager(true);
+                prepareFileChooser(tfURL.getText(), fcm.getFileChooser());
+                JFileChooser fc = fcm.openFileChooser(JOptionPane.getFrameForComponent(SourceEditor.this));
+                if (fc != null) {
+                    tfURL.setText(fc.getSelectedFile().toString());
+                }
             }
         }
@@ -1285,16 +1286,5 @@
         private CopyOnWriteArrayList<CellEditorListener> listeners;
         private String value;
-        private JFileChooser fileChooser;
         private boolean isFile;
-
-        protected JFileChooser getFileChooser() {
-            if (fileChooser == null) {
-                this.fileChooser = new JFileChooser();
-                if(!isFile) {
-                    fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
-                }
-            }
-            return fileChooser;
-        }
 
         /**
@@ -1428,10 +1418,13 @@
 
             public void actionPerformed(ActionEvent e) {
-                JFileChooser fc = getFileChooser();
-                prepareFileChooser(tfFileName.getText(), fc);
-                int ret = fc.showOpenDialog(JOptionPane.getFrameForComponent(SourceEditor.this));
-                if (ret != JFileChooser.APPROVE_OPTION)
-                    return;
-                tfFileName.setText(fc.getSelectedFile().toString());
+                JFileChooserManager fcm = new JFileChooserManager(true).createFileChooser();
+                if (!isFile) {
+                    fcm.getFileChooser().setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+                }
+                prepareFileChooser(tfFileName.getText(), fcm.getFileChooser());
+                JFileChooser fc = fcm.openFileChooser(JOptionPane.getFrameForComponent(SourceEditor.this));
+                if (fc != null) {
+                    tfFileName.setText(fc.getSelectedFile().toString());
+                }
             }
         }
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/advanced/AdvancedPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/advanced/AdvancedPreference.java	(revision 5437)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/advanced/AdvancedPreference.java	(revision 5438)
@@ -2,6 +2,6 @@
 package org.openstreetmap.josm.gui.preferences.advanced;
 
+import static org.openstreetmap.josm.tools.I18n.marktr;
 import static org.openstreetmap.josm.tools.I18n.tr;
-import static org.openstreetmap.josm.tools.I18n.marktr;
 
 import java.awt.Color;
@@ -14,5 +14,4 @@
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
-
 import java.io.File;
 import java.util.ArrayList;
@@ -43,4 +42,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.DiskAccessAction;
 import org.openstreetmap.josm.data.CustomConfigurator;
 import org.openstreetmap.josm.data.Preferences;
@@ -316,12 +316,5 @@
     
     private File[] askUserForCustomSettingsFiles(boolean saveFileFlag, String title) {
-        String dir = Main.pref.get("customsettings.lastDirectory");
-        if (dir.length()==0) dir =".";
-        
-        JFileChooser fc = new JFileChooser(dir);
-        fc.setDialogTitle(title);
-        fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
-        fc.setAcceptAllFileFilterUsed(false);
-        fc.setFileFilter(new FileFilter() {
+        FileFilter filter = new FileFilter() {
             @Override
             public boolean accept(File f) {
@@ -332,17 +325,12 @@
                 return tr("JOSM custom settings files (*.xml)");
             }
-            });
-        
-            fc.setMultiSelectionEnabled(!saveFileFlag);
-            int result = saveFileFlag? fc.showSaveDialog(Main.parent) : fc.showOpenDialog(Main.parent);
-            if (result == JFileChooser.APPROVE_OPTION) {
-                if (!fc.getCurrentDirectory().getAbsolutePath().equals(dir)) {
-                    Main.pref.put("customsettings.lastDirectory", fc.getCurrentDirectory().getAbsolutePath());
-                }
-                File sel[] = fc.isMultiSelectionEnabled() ? fc.getSelectedFiles() : (new File[]{fc.getSelectedFile()});
-                if (sel.length==1 && !sel[0].getName().contains(".")) sel[0]=new File(sel[0].getAbsolutePath()+".xml");
-                return sel;
-            } 
-            return new File[0];
+        };
+        JFileChooser fc = DiskAccessAction.createAndOpenFileChooser(!saveFileFlag, !saveFileFlag, title, filter, JFileChooser.FILES_ONLY, "customsettings.lastDirectory");
+        if (fc != null) {
+            File sel[] = fc.isMultiSelectionEnabled() ? fc.getSelectedFiles() : (new File[]{fc.getSelectedFile()});
+            if (sel.length==1 && !sel[0].getName().contains(".")) sel[0]=new File(sel[0].getAbsolutePath()+".xml");
+            return sel;
+        } 
+        return new File[0];
     }
             
Index: /trunk/src/org/openstreetmap/josm/gui/widgets/JFileChooserManager.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/widgets/JFileChooserManager.java	(revision 5438)
+++ /trunk/src/org/openstreetmap/josm/gui/widgets/JFileChooserManager.java	(revision 5438)
@@ -0,0 +1,225 @@
+package org.openstreetmap.josm.gui.widgets;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Component;
+import java.io.File;
+import java.util.Collection;
+import java.util.Collections;
+
+import javax.swing.JFileChooser;
+import javax.swing.filechooser.FileFilter;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.DiskAccessAction;
+import org.openstreetmap.josm.actions.ExtensionFileFilter;
+import org.openstreetmap.josm.gui.ExtendedDialog;
+
+/**
+ * A chained utility class used to create and open {@link JFileChooser} dialogs.<br/>
+ * Use only this class if you need to control specifically your JFileChooser dialog.<br/>
+ * <p>
+ * A simpler usage is to call the {@link DiskAccessAction#createAndOpenFileChooser} methods.
+ * 
+ * @since 5438
+ */
+public class JFileChooserManager {
+    private final boolean open;
+    private final String lastDirProperty;
+    private final String curDir;
+    
+    private JFileChooser fc;
+
+    /**
+     * Creates a new {@code JFileChooserManager}.
+     * @param open If true, "Open File" dialogs will be created. If false, "Save File" dialogs will be created.
+     * @see #createFileChooser
+     */
+    public JFileChooserManager(boolean open) {
+        this(open, null);
+    }
+    
+    /**
+     * Creates a new {@code JFileChooserManager}.
+     * @param open If true, "Open File" dialogs will be created. If false, "Save File" dialogs will be created.
+     * @param lastDirProperty The name of the property used to get the last directory. This directory is used to initialize the JFileChooser. 
+     *                        Then, if the user effetively choses a file or a directory, this property will be updated to the directory path.
+     * @see #createFileChooser
+     */
+    public JFileChooserManager(boolean open, String lastDirProperty) {
+        this(open, lastDirProperty, null);
+    }
+
+    /**
+     * Creates a new {@code JFileChooserManager}.
+     * @param open If true, "Open File" dialogs will be created. If false, "Save File" dialogs will be created.
+     * @param lastDirProperty The name of the property used to get the last directory. This directory is used to initialize the JFileChooser. 
+     *                        Then, if the user effetively choses a file or a directory, this property will be updated to the directory path.
+     * @param defaultDir The default directory used to initialize the JFileChooser if the {@code lastDirProperty} property value is missing. 
+     * @see #createFileChooser
+     */
+    public JFileChooserManager(boolean open, String lastDirProperty, String defaultDir) {
+        this.open = open;
+        this.lastDirProperty = lastDirProperty == null || lastDirProperty.isEmpty() ? "lastDirectory" : lastDirProperty;
+        this.curDir = Main.pref.get(this.lastDirProperty).isEmpty() ? 
+                (defaultDir == null || defaultDir.isEmpty() ? "." : defaultDir) 
+                : Main.pref.get(this.lastDirProperty);
+    }
+
+    /**
+     * Replies the {@code JFileChooser} that has been previously created.
+     * @return The {@code JFileChooser} that has been previously created, or {@code null} if it has not been created yet. 
+     * @see #createFileChooser
+     */
+    public final JFileChooser getFileChooser() {
+        return fc;
+    }
+
+    /**
+     * Replies the initial directory used to construct the {@code JFileChooser}.
+     * @return The initial directory used to construct the {@code JFileChooser}.
+     */
+    public final String getInitialDirectory() {
+        return curDir;
+    }
+
+    /**
+     * Creates a new {@link JFileChooser} with default settings. All files will be accepted.
+     * @return this
+     */
+    public final JFileChooserManager createFileChooser() {
+        return doCreateFileChooser(false, null, null, null, null, JFileChooser.FILES_ONLY, false);
+    }
+    
+    /**
+     * Creates a new {@link JFileChooser} with given settings for a single {@code FileFilter}.
+     * 
+     * @param multiple If true, makes the dialog allow multiple file selections
+     * @param title The string that goes in the dialog window's title bar
+     * @param filter The only file filter that will be proposed by the dialog
+     * @param selectionMode The selection mode that allows the user to:<br/>
+     *                      <li>just select files ({@code JFileChooser.FILES_ONLY})</li> 
+     *                      <li>just select directories ({@code JFileChooser.DIRECTORIES_ONLY})</li> 
+     *                      <li>select both files and directories ({@code JFileChooser.FILES_AND_DIRECTORIES})</li>
+     * @return this
+     * @see DiskAccessAction#createAndOpenFileChooser(boolean, boolean, String, FileFilter, int, String)
+     */
+    public final JFileChooserManager createFileChooser(boolean multiple, String title, FileFilter filter, int selectionMode) {
+        doCreateFileChooser(multiple, title, Collections.singleton(filter), filter, null, selectionMode, false);
+        getFileChooser().setAcceptAllFileFilterUsed(false);
+        return this;
+    }
+    
+    /**
+     * Creates a new {@link JFileChooser} with given settings for a collection of {@code FileFilter}s.
+     * 
+     * @param multiple If true, makes the dialog allow multiple file selections
+     * @param title The string that goes in the dialog window's title bar
+     * @param filters The file filters that will be proposed by the dialog
+     * @param defaultFilter The file filter that will be selected by default
+     * @param selectionMode The selection mode that allows the user to:<br/>
+     *                      <li>just select files ({@code JFileChooser.FILES_ONLY})</li> 
+     *                      <li>just select directories ({@code JFileChooser.DIRECTORIES_ONLY})</li> 
+     *                      <li>select both files and directories ({@code JFileChooser.FILES_AND_DIRECTORIES})</li>
+     * @return this
+     * @see DiskAccessAction#createAndOpenFileChooser(boolean, boolean, String, Collection, FileFilter, int, String)
+     */
+    public final JFileChooserManager createFileChooser(boolean multiple, String title, Collection<? extends FileFilter> filters, FileFilter defaultFilter, int selectionMode) {
+        return doCreateFileChooser(multiple, title, filters, defaultFilter, null, selectionMode, false);
+    }
+
+    /**
+     * Creates a new {@link JFileChooser} with given settings for a file extension.
+     * 
+     * @param multiple If true, makes the dialog allow multiple file selections
+     * @param title The string that goes in the dialog window's title bar
+     * @param extension The file extension that will be selected as the default file filter
+     * @param allTypes If true, all the files types known by JOSM will be proposed in the "file type" combobox. 
+     *                 If false, only the file filters that include {@code extension} will be proposed
+     * @param selectionMode The selection mode that allows the user to:<br/>
+     *                      <li>just select files ({@code JFileChooser.FILES_ONLY})</li> 
+     *                      <li>just select directories ({@code JFileChooser.DIRECTORIES_ONLY})</li> 
+     *                      <li>select both files and directories ({@code JFileChooser.FILES_AND_DIRECTORIES})</li>
+     * @return this
+     * @see DiskAccessAction#createAndOpenFileChooser(boolean, boolean, String, FileFilter, int, String)
+     */
+    public final JFileChooserManager createFileChooser(boolean multiple, String title, String extension, boolean allTypes, int selectionMode) {
+        return doCreateFileChooser(multiple, title, null, null, extension, selectionMode, allTypes);
+    }
+
+    private final JFileChooserManager doCreateFileChooser(boolean multiple, String title, Collection<? extends FileFilter> filters, FileFilter defaultFilter, String extension, int selectionMode, boolean allTypes) {
+        fc = new JFileChooser(new File(curDir));
+        if (title != null) {
+            fc.setDialogTitle(title);
+        }
+
+        fc.setFileSelectionMode(selectionMode);
+        fc.setMultiSelectionEnabled(multiple);
+        fc.setAcceptAllFileFilterUsed(false);
+        
+        if (filters != null) {
+            for (FileFilter filter : filters) {
+                fc.addChoosableFileFilter(filter);
+            }
+            if (defaultFilter != null) {
+                fc.setFileFilter(defaultFilter);
+            }
+        } else if (open) {
+            ExtensionFileFilter.applyChoosableImportFileFilters(fc, extension, allTypes);
+        } else {
+            ExtensionFileFilter.applyChoosableExportFileFilters(fc, extension, allTypes);
+        }
+        return this;
+    }
+
+    /**
+     * Opens the {@code JFileChooser} that has been created. Nothing happens if it has not been created yet.
+     * @return the {@code JFileChooser} if the user effectively choses a file or directory. {@code null} if the user cancelled the dialog. 
+     */
+    public final JFileChooser openFileChooser() {
+        return openFileChooser(null);
+    }
+
+    /**
+     * Opens the {@code JFileChooser} that has been created and waits for the user to choose a file/directory, or cancel the dialog.<br/> 
+     * Nothing happens if the dialog has not been created yet.<br/>
+     * When the user choses a file or directory, the {@code lastDirProperty} is updated to the chosen directory path.
+     * 
+     * @param parent The Component used as the parent of the JFileChooser. If null, uses {@code Main.parent}.
+     * @return the {@code JFileChooser} if the user effectively choses a file or directory. {@code null} if the user cancelled the dialog. 
+     */
+    public JFileChooser openFileChooser(Component parent) {
+        if (fc != null) {
+            if (parent == null) {
+                parent = Main.parent;
+            }
+            
+            int answer = open ? fc.showOpenDialog(parent) : fc.showSaveDialog(parent);
+            if (answer != JFileChooser.APPROVE_OPTION) {
+                return null;
+            }
+
+            if (!fc.getCurrentDirectory().getAbsolutePath().equals(curDir)) {
+                Main.pref.put(lastDirProperty, fc.getCurrentDirectory().getAbsolutePath());
+            }
+
+            if (!open) {
+                File file = fc.getSelectedFile();
+                if (file != null && file.exists()) {
+                    ExtendedDialog dialog = new ExtendedDialog(
+                            Main.parent,
+                            tr("Overwrite"),
+                            new String[] {tr("Overwrite"), tr("Cancel")}
+                    );
+                    dialog.setContent(tr("File exists. Overwrite?"));
+                    dialog.setButtonIcons(new String[] {"save_as.png", "cancel.png"});
+                    dialog.showDialog();
+                    if (dialog.getValue() != 1) {
+                        return null;
+                    }
+                }
+            }
+        }
+        return fc;
+    }
+}
Index: /trunk/src/org/openstreetmap/josm/io/JpgImporter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/JpgImporter.java	(revision 5437)
+++ /trunk/src/org/openstreetmap/josm/io/JpgImporter.java	(revision 5438)
@@ -17,16 +17,46 @@
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 
+/**
+ * File importer allowing to import geottaged images (*.jpg files).
+ *
+ */
 public class JpgImporter extends FileImporter {
     private GpxLayer gpx;
     
+    /**
+     * The default file filter (only *.jpg files).
+     */
     public static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter(
+            "jpg", "jpg", tr("Image Files") + " (*.jpg)");
+    
+    /**
+     * An alternate file filter that also includes folders.
+     * @since 5438
+     */
+    public static final ExtensionFileFilter FILE_FILTER_WITH_FOLDERS = new ExtensionFileFilter(
             "jpg", "jpg", tr("Image Files") + " (*.jpg, "+ tr("folder")+")");
 
+    /**
+     * Constructs a new {@code JpgImporter}.
+     */
     public JpgImporter() {
-        super(FILE_FILTER);
+        this(false);
     }
 
+    /**
+     * Constructs a new {@code JpgImporter} with folders selection, if wanted.
+     * @param includeFolders If true, includes folders in the file filter
+     * @since 5438
+     */
+    public JpgImporter(boolean includeFolders) {
+        super(includeFolders ? FILE_FILTER_WITH_FOLDERS : FILE_FILTER);
+    }
+
+    /**
+     * Constructs a new {@code JpgImporter} for the given GPX layer. Folders selection is allowed.
+     * @param gpx The GPX layer
+     */
     public JpgImporter(GpxLayer gpx) {
-        this();
+        this(true);
         this.gpx = gpx;
     }
