Index: trunk/src/org/openstreetmap/josm/actions/DiskAccessAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/DiskAccessAction.java	(revision 2028)
+++ trunk/src/org/openstreetmap/josm/actions/DiskAccessAction.java	(revision 2029)
@@ -7,9 +7,7 @@
 
 import javax.swing.JFileChooser;
-import javax.swing.filechooser.FileFilter;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.ExtendedDialog;
-import org.openstreetmap.josm.io.FileImporter;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -39,16 +37,6 @@
         fc.setMultiSelectionEnabled(multiple);
         fc.setAcceptAllFileFilterUsed(false);
-        FileFilter defaultFilter = null;
-        for (FileImporter imExporter: ExtensionFileFilter.importers) {
-            fc.addChoosableFileFilter(imExporter.filter);
-            if (extension != null && extension.endsWith(imExporter.filter.defaultExtension)) {
-                defaultFilter = imExporter.filter;
-            }
-        }
-
-        if (defaultFilter == null) {
-            defaultFilter = new ExtensionFileFilter.AllFormatsImporter().filter;
-        }
-        fc.setFileFilter(defaultFilter);
+        System.out.println("opening fc for extension " + extension);
+        ExtensionFileFilter.applyChoosableImportFileFilters(fc, extension);
 
         int answer = open ? fc.showOpenDialog(Main.parent) : fc.showSaveDialog(Main.parent);
Index: trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(revision 2028)
+++ trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(revision 2029)
@@ -7,5 +7,10 @@
 import java.util.ArrayList;
 import java.util.Arrays;
-
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.swing.JFileChooser;
 import javax.swing.filechooser.FileFilter;
 
@@ -26,10 +31,6 @@
  * filters used in JOSM.
  *
- * @author imi
  */
 public class ExtensionFileFilter extends FileFilter {
-    private final String extension;
-    private final String description;
-    public final String defaultExtension;
 
     /**
@@ -41,11 +42,131 @@
     public static ArrayList<FileExporter> exporters = new ArrayList<FileExporter>(Arrays.asList(new GpxExporter(),
             new OsmExporter(), new OsmGzipExporter(), new OsmBzip2Exporter()));
-    
+
+
+    private final String extensions;
+    private final String description;
+    /**
+     * @deprecated use {@see #getDefaultExtension()
+     */
+    @Deprecated
+    public final String defaultExtension;
+
+
+    static protected void sort(List<ExtensionFileFilter> filters) {
+        Collections.sort(
+                filters,
+                new Comparator<ExtensionFileFilter>() {
+                    private AllFormatsImporter all = new AllFormatsImporter();
+                    public int compare(ExtensionFileFilter o1, ExtensionFileFilter o2) {
+                        if (o1.getDescription().equals(all.filter.getDescription())) return 1;
+                        if (o2.getDescription().equals(all.filter.getDescription())) return -1;
+                        return o1.getDescription().compareTo(o2.getDescription());
+                    }
+                }
+        );
+    }
+
+    /**
+     * Replies an ordered list of {@see ExtensionFileFilter}s for importing.
+     * The list is ordered according to their description, an {@see AllFormatsImporter}
+     * is append at the end.
+     * 
+     * @return an ordered list of {@see ExtensionFileFilter}s for importing.
+     */
+    public static List<ExtensionFileFilter> getImportExtensionFileFilters() {
+        LinkedList<ExtensionFileFilter> filters = new LinkedList<ExtensionFileFilter>();
+        for (FileImporter importer : importers) {
+            if (filters.contains(importer.filter)) {
+                continue;
+            }
+            filters.add(importer.filter);
+        }
+        sort(filters);
+        return filters;
+    }
+
+    /**
+     * Replies an ordered list of {@see ExtensionFileFilter}s for exporting.
+     * The list is ordered according to their description, an {@see AllFormatsImporter}
+     * is append at the end.
+     * 
+     * @return an ordered list of {@see ExtensionFileFilter}s for exporting.
+     */
+    public static List<ExtensionFileFilter> getExportExtensionFileFilters() {
+        LinkedList<ExtensionFileFilter> filters = new LinkedList<ExtensionFileFilter>();
+        for (FileExporter exporter : exporters) {
+            if (filters.contains(exporter.filter)) {
+                continue;
+            }
+            filters.add(exporter.filter);
+        }
+        sort(filters);
+        return filters;
+    }
+
+    /**
+     * Replies the default {@see ExtensionFileFilter} for a given extension
+     * 
+     * @param extension the extension
+     * @return the default {@see ExtensionFileFilter} for a given extension
+     */
+    public static ExtensionFileFilter getDefaultImportExtensionFileFilter(String extension) {
+        if (extension == null) return new AllFormatsImporter().filter;
+        for (FileImporter importer : importers) {
+            if (extension.equals(importer.filter.getDefaultExtension()))
+                return importer.filter;
+        }
+        return new AllFormatsImporter().filter;
+    }
+
+    /**
+     * Replies the default {@see ExtensionFileFilter} for a given extension
+     * 
+     * @param extension the extension
+     * @return the default {@see ExtensionFileFilter} for a given extension
+     */
+    public static ExtensionFileFilter getDefaultExportExtensionFileFilter(String extension) {
+        if (extension == null) return new AllFormatsImporter().filter;
+        for (FileExporter exporter : exporters) {
+            if (extension.equals(exporter.filter.getDefaultExtension()))
+                return exporter.filter;
+        }
+        return new AllFormatsImporter().filter;
+    }
+
+    /**
+     * Applies the choosable {@see FileFilter} to a {@see JFileChooser} before using the
+     * file chooser for selecting a file for reading.
+     * 
+     * @param fileChooser the file chooser
+     * @param extension the default extension
+     */
+    public static void applyChoosableImportFileFilters(JFileChooser fileChooser, String extension) {
+        for (ExtensionFileFilter filter: getImportExtensionFileFilters()) {
+            fileChooser.addChoosableFileFilter(filter);
+        }
+        fileChooser.setFileFilter(getDefaultImportExtensionFileFilter(extension));
+    }
+
+    /**
+     * Applies the choosable {@see FileFilter} to a {@see JFileChooser} before using the
+     * file chooser for selecting a file for writing.
+     * 
+     * @param fileChooser the file chooser
+     * @param extension the default extension
+     */
+    public static void applyChoosableExportFileFilters(JFileChooser fileChooser, String extension) {
+        for (ExtensionFileFilter filter: getExportExtensionFileFilters()) {
+            fileChooser.addChoosableFileFilter(filter);
+        }
+        fileChooser.setFileFilter(getDefaultExportExtensionFileFilter(extension));
+    }
+
     /**
      * Construct an extension file filter by giving the extension to check after.
      */
-    public ExtensionFileFilter(String extension, String defExt, String description) {
-        this.extension = extension;
-        defaultExtension = defExt;
+    public ExtensionFileFilter(String extension, String defaultExtension, String description) {
+        this.extensions = extension;
+        this.defaultExtension = defaultExtension;
         this.description = description;
     }
@@ -53,5 +174,5 @@
     public boolean acceptName(String filename) {
         String name = filename.toLowerCase();
-        for (String ext : extension.split(","))
+        for (String ext : extensions.split(","))
             if (name.endsWith("."+ext))
                 return true;
@@ -68,5 +189,9 @@
         return description;
     }
-    
+
+    public String getDefaultExtension() {
+        return defaultExtension;
+    }
+
     /**
      * Dummy importer that adds the "All Formats"-Filter when opening files
@@ -75,6 +200,6 @@
         public AllFormatsImporter() {
             super(
-                new ExtensionFileFilter("osm,xml,osm.gz,osm.bz2,osm.bz,gpx,gpx.gz,nmea,nme,nma,txt", "", tr("All Formats")
-                        + " (*.gpx *.osm *.nmea ...)"));
+                    new ExtensionFileFilter("osm,xml,osm.gz,osm.bz2,osm.bz,gpx,gpx.gz,nmea,nme,nma,txt,wms", "", tr("All Formats")
+                            + " (*.gpx *.osm *.nmea ...)"));
         }
         @Override public boolean acceptFile(File pathname) {
@@ -82,3 +207,40 @@
         }
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((defaultExtension == null) ? 0 : defaultExtension.hashCode());
+        result = prime * result + ((description == null) ? 0 : description.hashCode());
+        result = prime * result + ((extensions == null) ? 0 : extensions.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        ExtensionFileFilter other = (ExtensionFileFilter) obj;
+        if (defaultExtension == null) {
+            if (other.defaultExtension != null)
+                return false;
+        } else if (!defaultExtension.equals(other.defaultExtension))
+            return false;
+        if (description == null) {
+            if (other.description != null)
+                return false;
+        } else if (!description.equals(other.description))
+            return false;
+        if (extensions == null) {
+            if (other.extensions != null)
+                return false;
+        } else if (!extensions.equals(other.extensions))
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java	(revision 2028)
+++ trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java	(revision 2029)
@@ -112,8 +112,8 @@
     public static File openFileDialog(Layer layer) {
         if (layer instanceof OsmDataLayer)
-            return createAndOpenSaveFileChooser(tr("Save OSM file"), ".osm");
+            return createAndOpenSaveFileChooser(tr("Save OSM file"), "osm");
         else if (layer instanceof GpxLayer)
-            return createAndOpenSaveFileChooser(tr("Save GPX file"), ".gpx");
-        return createAndOpenSaveFileChooser(tr("Save Layer"), ".lay");
+            return createAndOpenSaveFileChooser(tr("Save GPX file"), "gpx");
+        return createAndOpenSaveFileChooser(tr("Save Layer"), "lay");
     }
 
@@ -167,16 +167,5 @@
         fc.setMultiSelectionEnabled(false);
         fc.setAcceptAllFileFilterUsed(false);
-
-        FileFilter defaultFilter = null;
-        for (FileExporter exporter : ExtensionFileFilter.exporters) {
-            fc.addChoosableFileFilter(exporter.filter);
-            if (extension.endsWith(exporter.filter.defaultExtension)) {
-                defaultFilter = exporter.filter;
-            }
-        }
-        if (defaultFilter != null) {
-            fc.setFileFilter(defaultFilter);
-        }
-
+        ExtensionFileFilter.applyChoosableExportFileFilters(fc, extension);
         int answer = fc.showSaveDialog(Main.parent);
         if (answer != JFileChooser.APPROVE_OPTION)
@@ -194,5 +183,5 @@
                 FileFilter ff = fc.getFileFilter();
                 if (ff instanceof ExtensionFileFilter) {
-                    fn += "." + ((ExtensionFileFilter)ff).defaultExtension;
+                    fn += "." + ((ExtensionFileFilter)ff).getDefaultExtension();
                 } else {
                     fn += extension;
