Index: src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java	(revision 14600)
+++ src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java	(working copy)
@@ -42,6 +42,7 @@
 
     private final PreferenceTabbedPane tpPreferences = new PreferenceTabbedPane();
     private final ContextSensitiveHelpAction helpAction = new ContextSensitiveHelpAction();
+    private final WindowEventHandler windowEventHandler = new WindowEventHandler();
     private boolean canceled;
 
     /**
@@ -83,9 +84,8 @@
         tpPreferences.buildGui();
         tpPreferences.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
         c.add(buildActionPanel(), BorderLayout.SOUTH);
+        addWindowListener(windowEventHandler);
 
-        addWindowListener(new WindowEventHandler());
-
         InputMapUtils.addEscapeAction(getRootPane(), new CancelAction());
         setHelpContext(HelpUtil.ht("/Action/Preferences"));
     }
@@ -176,8 +176,7 @@
 
         public void cancel() {
             setCanceled(true);
-            setVisible(false);
-            tpPreferences.validationListeners.clear();
+            dispose();
         }
 
         @Override
@@ -201,9 +200,8 @@
             }
 
             tpPreferences.savePreferences();
-            tpPreferences.validationListeners.clear();
             setCanceled(false);
-            setVisible(false);
+            dispose();
         }
     }
 
@@ -213,4 +211,10 @@
             new CancelAction().cancel();
         }
     }
+
+    @Override
+    public void dispose() {
+        removeWindowListener(windowEventHandler);
+        super.dispose();
+    }
 }
