Index: /trunk/src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 2020)
+++ /trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 2021)
@@ -164,10 +164,13 @@
      */
     public void setVisibleDialogs() {
-        for (Component c : toggleDialogs.getComponents()) {
-            if (c instanceof ToggleDialog) {
-                ToggleDialog td = (ToggleDialog)c;
-                if (Main.pref.getBoolean(td.getPreferencePrefix()+".visible")) {
-                    td.showDialog();
-                }
+        toggleDialogs.removeAll();
+        for (ToggleDialog dialog: allDialogs) {
+            dialog.setVisible(false);
+            toggleDialogs.add(dialog);
+            dialog.setParent(toggleDialogs);
+            if (Main.pref.getBoolean(dialog.getPreferencePrefix()+".visible")) {
+                dialog.showDialog();
+            } else {
+                dialog.hideDialog();
             }
         }
@@ -180,7 +183,5 @@
     public IconToggleButton addToggleDialog(ToggleDialog dlg) {
         IconToggleButton button = new IconToggleButton(dlg.getToggleAction());
-        dlg.setParent(toggleDialogs);
         toolBarToggle.add(button);
-        toggleDialogs.add(dlg);
         allDialogs.add(dlg);
         return button;
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 2020)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 2021)
@@ -6,5 +6,4 @@
 import java.awt.Component;
 import java.awt.Dimension;
-import java.awt.EventQueue;
 import java.awt.GridBagLayout;
 import java.awt.Image;
@@ -152,19 +151,5 @@
 
         docked = Main.pref.getBoolean(preferencePrefix+".docked", true);
-        if (!docked) {
-            EventQueue.invokeLater(new Runnable(){
-                public void run() {
-                    detach();
-                }
-            });
-        }
         collapsed = Main.pref.getBoolean(preferencePrefix+".minimized", false);
-        if (collapsed) {
-            EventQueue.invokeLater(new Runnable(){
-                public void run() {
-                    collapse();
-                }
-            });
-        }
     }
 
@@ -203,4 +188,5 @@
      */
     protected int getDialogPosition() {
+        if (parent == null) return -1;
         for (int i=0; i< parent.getComponentCount(); i++) {
             String name = parent.getComponent(i).getName();
@@ -218,4 +204,5 @@
     protected void dock() {
         detachedDialog = null;
+        if (parent == null) return;
 
         // check whether the toggle dialog view contains a placeholder
@@ -225,8 +212,13 @@
         if (idx > -1) {
             parent.remove(idx);
-            parent.add(ToggleDialog.this,idx);
+            if (idx >= parent.getComponentCount()) {
+                parent.add(ToggleDialog.this);
+            } else {
+                parent.add(ToggleDialog.this,idx);
+            }
         } else {
             parent.add(ToggleDialog.this);
         }
+        parent.validate();
 
         if(Main.pref.getBoolean(preferencePrefix+".visible")) {
@@ -281,5 +273,4 @@
      */
     public void hideDialog() {
-        if (!isShowing) return;
         if (detachedDialog != null) {
             detachedDialog.setVisible(false);
@@ -289,4 +280,5 @@
         setVisible(false);
         isShowing = false;
+        Main.pref.put(preferencePrefix+".visible", false);
         refreshToggleDialogsView();
         toggleAction.putValue("selected", false);
@@ -304,17 +296,23 @@
      */
     public void showDialog() {
-        if (isShowing) return;
         if (!docked) {
             detach();
-        } else if (!collapsed) {
-            expand();
-            setVisible(true);
-            refreshToggleDialogsView();
         } else {
-            setVisible(true);
-            refreshToggleDialogsView();
+            dock();
+            if (!collapsed) {
+                expand();
+                setVisible(true);
+                refreshToggleDialogsView();
+            } else {
+                setVisible(true);
+                refreshToggleDialogsView();
+            }
         }
         isShowing = true;
+        // toggling the selected value in order to enforce PropertyChangeEvents
+        //
+        toggleAction.putValue("selected", false);
         toggleAction.putValue("selected", true);
+        Main.pref.put(preferencePrefix+".visible", true);
     }
 
@@ -349,4 +347,6 @@
         if (detachedDialog != null) {
             detachedDialog.setVisible(false);
+            detachedDialog.removeAll();
+            detachedDialog.dispose();
         }
     }
@@ -494,4 +494,5 @@
             } else {
                 pack();
+
             }
             setTitle(titleBar.getTitle());
