Index: src/org/openstreetmap/josm/actions/ValidateAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/ValidateAction.java	(revision 14469)
+++ src/org/openstreetmap/josm/actions/ValidateAction.java	(working copy)
@@ -165,6 +165,7 @@
                 test.visit(validatedPrimitives);
                 test.endTest();
                 errors.addAll(test.getErrors());
+                test.clear();
             }
             tests = null;
             if (ValidatorPrefHelper.PREF_USE_IGNORE.get()) {
Index: src/org/openstreetmap/josm/actions/upload/ValidateUploadHook.java
===================================================================
--- src/org/openstreetmap/josm/actions/upload/ValidateUploadHook.java	(revision 14469)
+++ src/org/openstreetmap/josm/actions/upload/ValidateUploadHook.java	(working copy)
@@ -64,6 +64,7 @@
             test.endTest();
             if (ValidatorPrefHelper.PREF_OTHER.get() && ValidatorPrefHelper.PREF_OTHER_UPLOAD.get()) {
                 errors.addAll(test.getErrors());
+                test.clear();
             } else {
                 for (TestError e : test.getErrors()) {
                     if (e.getSeverity() != Severity.OTHER) {
Index: src/org/openstreetmap/josm/data/validation/Test.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/Test.java	(revision 14469)
+++ src/org/openstreetmap/josm/data/validation/Test.java	(working copy)
@@ -373,4 +373,11 @@
     public int compareTo(Test t) {
         return name.compareTo(t.name);
     }
+
+    /**
+     * Free resources.
+     */
+    public void clear() {
+        errors.clear();
+    }
 }
Index: src/org/openstreetmap/josm/gui/MainPanel.java
===================================================================
--- src/org/openstreetmap/josm/gui/MainPanel.java	(revision 14469)
+++ src/org/openstreetmap/josm/gui/MainPanel.java	(working copy)
@@ -8,6 +8,7 @@
 import javax.swing.JPanel;
 
 import org.openstreetmap.josm.actions.mapmode.MapMode;
+import org.openstreetmap.josm.data.UndoRedoHandler; 
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.MainLayerManager;
 import org.openstreetmap.josm.gui.layer.MainLayerManager.LayerAvailabilityEvent;
@@ -65,6 +66,7 @@
             map = null;
             MainApplication.map = map;
             add(getGettingStarted(), BorderLayout.CENTER);
+            UndoRedoHandler.getInstance().clean();
         }
         setVisible(true);
 
Index: src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapView.java	(revision 14469)
+++ src/org/openstreetmap/josm/gui/MapView.java	(working copy)
@@ -807,6 +807,7 @@
         }
         nonChangedLayersBuffer = null;
         offscreenBuffer = null;
+        removeAllZoomChangeListeners();
     }
 
     /**
Index: src/org/openstreetmap/josm/gui/NavigatableComponent.java
===================================================================
--- src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 14469)
+++ src/org/openstreetmap/josm/gui/NavigatableComponent.java	(working copy)
@@ -128,6 +128,16 @@
     }
 
     /**
+     * Removes a zoom change listener
+     *
+     * @param listener the listener. Ignored if null or already absent
+     */
+    protected static void removeAllZoomChangeListeners() {
+        zoomChangeListeners.clear();
+    }
+
+
+    /**
      * Adds a zoom change listener
      *
      * @param listener the listener. Ignored if null or already registered.
Index: src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java	(revision 14469)
+++ src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java	(working copy)
@@ -222,6 +222,12 @@
         return noteData != null ? noteData.getSelectedNote() : null;
     }
 
+    @Override
+    public void destroy() {
+        MainApplication.getLayerManager().removeLayerChangeListener(this);
+        super.destroy();
+    }
+
     private static class NoteRenderer implements ListCellRenderer<Note> {
 
         private final DefaultListCellRenderer defaultListCellRenderer = new DefaultListCellRenderer();
@@ -436,4 +442,5 @@
             }
         }
     }
+
 }
Index: src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 14469)
+++ src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(working copy)
@@ -45,6 +45,7 @@
 import org.openstreetmap.josm.actions.relation.RecentRelationsAction;
 import org.openstreetmap.josm.actions.relation.SelectMembersAction;
 import org.openstreetmap.josm.actions.relation.SelectRelationAction;
+import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
 import org.openstreetmap.josm.data.osm.IPrimitive;
@@ -208,6 +209,7 @@
 
     @Override
     public void destroy() {
+        UndoRedoHandler.getInstance().removeCommandQueueListener(recentRelationsAction);
         recentRelationsAction.destroy();
         model.clear();
         super.destroy();
Index: src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 14469)
+++ src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(working copy)
@@ -455,6 +455,7 @@
 
     @Override
     public void destroy() {
+        dialogsPanel = null;
         rememberHeight();
         closeDetachedDialog();
         if (isShowing) {
Index: src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 14469)
+++ src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(working copy)
@@ -551,6 +551,7 @@
 
     @Override
     public void destroy() {
+        taginfoAction.destroy();
         super.destroy();
         Config.getPref().removeKeyPreferenceChangeListener("display.discardable-keys", preferenceListener);
         Container parent = pluginHook.getParent();
Index: src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java	(revision 14469)
+++ src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java	(working copy)
@@ -134,6 +134,7 @@
                     default: return false;
                 }
             }
+            dialog.closeDialog();
         }
 
         return true;
@@ -347,6 +348,8 @@
      */
     public void closeDialog() {
         setVisible(false);
+        MainApplication.removeMapFrameListener(saveSessionAction);
+        saveSessionAction.destroy();
         dispose();
     }
 
Index: src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 14469)
+++ src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(working copy)
@@ -1053,6 +1053,7 @@
         super.destroy();
         data.removeSelectionListener(this);
         data.removeHighlightUpdateListener(this);
+        validationErrors.clear();
     }
 
     @Override
