Index: src/org/openstreetmap/josm/Main.java
===================================================================
--- src/org/openstreetmap/josm/Main.java	(revision 207)
+++ src/org/openstreetmap/josm/Main.java	(revision 208)
@@ -136,5 +136,6 @@
 			if (map.mapView.editLayer != null)
 				map.mapView.editLayer.listenerCommands.add(redoUndoListener);
-		}
+		} else
+			old.destroy();
 		redoUndoListener.commandChanged(0,0);
 
Index: src/org/openstreetmap/josm/actions/JosmAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/JosmAction.java	(revision 207)
+++ src/org/openstreetmap/josm/actions/JosmAction.java	(revision 208)
@@ -7,4 +7,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.tools.Destroyable;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.ShortCutLabel;
@@ -12,7 +13,14 @@
 /**
  * Base class helper for all Actions in JOSM. Just to make the life easier.
+ * 
+ * destroy() from interface Destroyable is called e.g. for MapModes, when the last layer has
+ * been removed and so the mapframe will be destroyed. For other JosmActions, destroy() may never
+ * be called (currently).
+ * 
  * @author imi
  */
-abstract public class JosmAction extends AbstractAction {
+abstract public class JosmAction extends AbstractAction implements Destroyable {
+
+	private KeyStroke shortCut;
 
 	public JosmAction(String name, String iconName, String tooltip, int shortCut, int modifier, boolean register) {
@@ -20,5 +28,6 @@
 		setHelpId();
 		putValue(SHORT_DESCRIPTION, "<html>"+tooltip+" <font size='-2'>"+ShortCutLabel.name(shortCut, modifier)+"</font>&nbsp;</html>");
-        Main.contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(shortCut, modifier), name);
+		this.shortCut = KeyStroke.getKeyStroke(shortCut, modifier);
+        Main.contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(this.shortCut, name);
         Main.contentPane.getActionMap().put(name, this);
         putValue("toolbar", iconName);
@@ -27,4 +36,9 @@
 	}
 
+	public void destroy() {
+		Main.contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).remove(shortCut);
+		Main.contentPane.getActionMap().remove(shortCut);
+	}
+	
 	public JosmAction() {
 		setHelpId();
Index: src/org/openstreetmap/josm/actions/mapmode/MapMode.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/MapMode.java	(revision 207)
+++ src/org/openstreetmap/josm/actions/mapmode/MapMode.java	(revision 208)
@@ -58,5 +58,6 @@
 	 */
 	public void actionPerformed(ActionEvent e) {
-		Main.map.selectMapMode(this);
+		if (Main.map != null)
+			Main.map.selectMapMode(this);
 	}
 
Index: src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapFrame.java	(revision 207)
+++ src/org/openstreetmap/josm/gui/MapFrame.java	(revision 208)
@@ -33,4 +33,5 @@
 import org.openstreetmap.josm.gui.dialogs.SelectionListDialog;
 import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
+import org.openstreetmap.josm.tools.Destroyable;
 
 /**
@@ -40,5 +41,5 @@
  * @author imi
  */
-public class MapFrame extends JPanel {
+public class MapFrame extends JPanel implements Destroyable {
 
 	/**
@@ -135,4 +136,14 @@
 	}
 
+	/**
+	 * Called as some kind of destructor when the last layer has been removed.
+	 * Delegates the call to all Destroyables within this component (e.g. MapModes)
+	 */
+	public void destroy() {
+		for (int i = 0; i < toolBarActions.getComponentCount(); ++i)
+			if (toolBarActions.getComponent(i) instanceof Destroyable)
+				((Destroyable)toolBarActions).destroy();
+    }
+
 	public Action getDefaultButtonAction() {
 		return ((AbstractButton)toolBarActions.getComponent(0)).getAction();
Index: src/org/openstreetmap/josm/gui/layer/Layer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/Layer.java	(revision 207)
+++ src/org/openstreetmap/josm/gui/layer/Layer.java	(revision 208)
@@ -9,4 +9,5 @@
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.tools.Destroyable;
 
 /**
@@ -25,5 +26,5 @@
  * @author imi
  */
-abstract public class Layer {
+abstract public class Layer implements Destroyable {
 
 	/**
Index: src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java	(revision 207)
+++ src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java	(revision 208)
@@ -252,4 +252,10 @@
 	}
 
+	/**
+	 * Parse the toolbar preference setting and construct the toolbar GUI control.
+	 * 
+	 * Call this, if anything has changed in the toolbar settings and you want to refresh 
+	 * the toolbar content (e.g. after registering actions in a plugin)
+	 */
 	public void refreshToolbarControl() {
 		control.removeAll();
Index: src/org/openstreetmap/josm/tools/Destroyable.java
===================================================================
--- src/org/openstreetmap/josm/tools/Destroyable.java	(revision 208)
+++ src/org/openstreetmap/josm/tools/Destroyable.java	(revision 208)
@@ -0,0 +1,16 @@
+package org.openstreetmap.josm.tools;
+
+/**
+ * Some objects like layers (when they are removed) or the whole map frame (when the last layer has
+ * been removed) have an definite set of actions to execute. This is the "destructor" interface called
+ * on those objects.
+ * 
+ * @author immanuel.scholz
+ */
+public interface Destroyable {
+
+	/**
+	 * Called when the object has been destroyed.
+	 */
+	public void destroy();
+}
