Index: src/org/openstreetmap/josm/actions/PreferencesAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/PreferencesAction.java	(revision 17084)
+++ src/org/openstreetmap/josm/actions/PreferencesAction.java	(working copy)
@@ -7,6 +7,8 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
 
+import javax.swing.SwingUtilities;
+
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.preferences.PreferenceDialog;
 import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
@@ -104,13 +106,15 @@
     @Override
     public void run() {
         final PreferenceDialog p = new PreferenceDialog(MainApplication.getMainFrame());
-        if (tab != null) {
-            p.selectPreferencesTabByClass(tab);
-        } else if (subTab != null) {
-            p.selectSubPreferencesTabByClass(subTab);
-        } else {
-            p.selectPreviouslySelectedPreferences();
-        }
+        SwingUtilities.invokeLater(() -> {
+            if (tab != null) {
+                p.selectPreferencesTabByClass(tab);
+            } else if (subTab != null) {
+                p.selectSubPreferencesTabByClass(subTab);
+            } else {
+                p.selectPreviouslySelectedPreferences();
+            }
+        });
         p.setVisible(true);
     }
 }
Index: src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java	(revision 17084)
+++ src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java	(working copy)
@@ -229,6 +229,7 @@
     public void dispose() {
         previouslySelected = tpPreferences.getSelectedTab();
         removeWindowListener(windowEventHandler);
+        setVisible(false); // save current geometry
         super.dispose();
     }
 }
