Index: src/org/openstreetmap/josm/command/AddCommand.java
===================================================================
--- src/org/openstreetmap/josm/command/AddCommand.java	(revision 303)
+++ src/org/openstreetmap/josm/command/AddCommand.java	(revision 304)
@@ -16,4 +16,6 @@
 import org.openstreetmap.josm.data.osm.visitor.DeleteVisitor;
 import org.openstreetmap.josm.data.osm.visitor.NameVisitor;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 
 /**
@@ -37,5 +39,5 @@
 	public AddCommand(OsmPrimitive osm) {
 		this.osm = osm;
-		this.ds = Main.ds;
+		this.ds = Main.main.editLayer().data;
 	}
 
@@ -52,4 +54,9 @@
 	}
 
+	// faster implementation
+	@Override public boolean invalidBecauselayerRemoved(Layer oldLayer) {
+	    return oldLayer instanceof OsmDataLayer && ((OsmDataLayer)oldLayer).data == ds;
+    }
+
 	@Override public MutableTreeNode description() {
 		NameVisitor v = new NameVisitor();
Index: src/org/openstreetmap/josm/command/Command.java
===================================================================
--- src/org/openstreetmap/josm/command/Command.java	(revision 303)
+++ src/org/openstreetmap/josm/command/Command.java	(revision 304)
@@ -1,3 +1,3 @@
-// License: GPL. Copyright 2007 by Immanuel Scholz and others
+//License: GPL. Copyright 2007 by Immanuel Scholz and others
 package org.openstreetmap.josm.command;
 
@@ -15,4 +15,6 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.visitor.Visitor;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 
 
@@ -31,18 +33,18 @@
 	private static final class CloneVisitor implements Visitor {
 		public Map<OsmPrimitive, OsmPrimitive> orig = new HashMap<OsmPrimitive, OsmPrimitive>();
-		
+
 		public void visit(Node n) {
 			orig.put(n, new Node(n));
-	    }
+		}
 		public void visit(Segment s) {
 			orig.put(s, new Segment(s));
-	    }
+		}
 		public void visit(Way w) {
 			orig.put(w, new Way(w));
-	    }
+		}
 	}
-	
+
 	private CloneVisitor orig; 
-	
+
 	/**
 	 * Executes the command on the dataset. This implementation will remember all
@@ -69,4 +71,26 @@
 	}
 
+
+	/**
+	 * Called, when a layer has been removed to have the command remove itself from
+	 * any buffer if it is not longer applicable to the dataset (e.g. it was part of
+	 * the removed layer)
+	 */
+	public boolean invalidBecauselayerRemoved(Layer oldLayer) {
+		if (!(oldLayer instanceof OsmDataLayer))
+			return false;
+		HashSet<OsmPrimitive> modified = new HashSet<OsmPrimitive>();
+		fillModifiedData(modified, modified, modified);
+		if (modified.isEmpty())
+			return false;
+
+		HashSet<OsmPrimitive> all = new HashSet<OsmPrimitive>(((OsmDataLayer)oldLayer).data.allPrimitives());
+		for (OsmPrimitive osm : all)
+			if (all.contains(osm))
+				return true;
+
+		return false;
+	}
+
 	/**
 	 * Fill in the changed data this command operates on.
Index: src/org/openstreetmap/josm/data/UndoRedoHandler.java
===================================================================
--- src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 303)
+++ src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 304)
@@ -1,5 +1,6 @@
-// License: GPL. Copyright 2007 by Immanuel Scholz and others
+//License: GPL. Copyright 2007 by Immanuel Scholz and others
 package org.openstreetmap.josm.data;
 
+import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.Stack;
@@ -7,8 +8,10 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer.CommandQueueListener;
 
-public class UndoRedoHandler {
+public class UndoRedoHandler implements LayerChangeListener {
 
 	/**
@@ -22,4 +25,9 @@
 
 	public final LinkedList<CommandQueueListener> listenerCommands = new LinkedList<CommandQueueListener>();
+
+
+	public UndoRedoHandler() {
+		Layer.listeners.add(this);
+	}
 
 
@@ -37,5 +45,5 @@
 		fireCommandsChanged();
 	}
-	
+
 	/**
 	 * Undoes the last added command.
@@ -81,4 +89,25 @@
 		commands.clear();
 		fireCommandsChanged();
-    }
+	}
+
+	public void layerRemoved(Layer oldLayer) {
+		boolean changed = false;
+		for (Iterator<Command> it = commands.iterator(); it.hasNext();) {
+			if (it.next().invalidBecauselayerRemoved(oldLayer)) {
+				it.remove();
+				changed = true;
+			}
+		}
+		for (Iterator<Command> it = redoCommands.iterator(); it.hasNext();) {
+			if (it.next().invalidBecauselayerRemoved(oldLayer)) {
+				it.remove();
+				changed = true;
+			}
+		}
+		if (changed)
+			fireCommandsChanged();
+	}
+
+	public void layerAdded(Layer newLayer) {}
+	public void activeLayerChange(Layer oldLayer, Layer newLayer) {}
 }
Index: src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapView.java	(revision 303)
+++ src/org/openstreetmap/josm/gui/MapView.java	(revision 304)
@@ -48,6 +48,7 @@
 	 * Interface to notify listeners of the change of the active layer.
 	 * @author imi
-	 */
-	public interface LayerChangeListener {
+	 * @deprecated Use Layer.LayerChangeListener instead
+	 */
+	@Deprecated public interface LayerChangeListener {
 		void activeLayerChange(Layer oldLayer, Layer newLayer);
 		void layerAdded(Layer newLayer);
@@ -69,6 +70,7 @@
 	/**
 	 * The listener of the active layer changes.
-	 */
-	private Collection<LayerChangeListener> listeners = new LinkedList<LayerChangeListener>();
+	 * @deprecated Use Layer.listener instead.
+	 */
+	@Deprecated private Collection<LayerChangeListener> listeners = new LinkedList<LayerChangeListener>();
 
 	public MapView() {
@@ -115,5 +117,8 @@
 		layers.add(layers.size(), layer);
 
+		// TODO: Deprecated
 		for (LayerChangeListener l : listeners)
+			l.layerAdded(layer);
+		for (Layer.LayerChangeListener l : Layer.listeners)
 			l.layerAdded(layer);
 
@@ -128,7 +133,11 @@
 	 */
 	public void removeLayer(Layer layer) {
-		if (layers.remove(layer))
+		if (layers.remove(layer)) {
+			// TODO: Deprecated
 			for (LayerChangeListener l : listeners)
 				l.layerRemoved(layer);
+			for (Layer.LayerChangeListener l : Layer.listeners)
+				l.layerRemoved(layer);
+		}
 		if (layer == editLayer) {
 			editLayer = null;
@@ -227,6 +236,7 @@
 	 * Add a listener for changes of active layer.
 	 * @param listener The listener that get added.
-	 */
-	public void addLayerChangeListener(LayerChangeListener listener) {
+	 * @deprecated Use Layer.listener.add instead.
+	 */
+	@Deprecated public void addLayerChangeListener(LayerChangeListener listener) {
 		if (listener != null)
 			listeners.add(listener);
@@ -236,6 +246,7 @@
 	 * Remove the listener.
 	 * @param listener The listener that get removed from the list.
-	 */
-	public void removeLayerChangeListener(LayerChangeListener listener) {
+	 * @deprecated Use Layer.listener.remove instead
+	 */
+	@Deprecated public void removeLayerChangeListener(LayerChangeListener listener) {
 		listeners.remove(listener);
 	}
@@ -261,7 +272,11 @@
 		Layer old = activeLayer;
 		activeLayer = layer;
-		if (old != layer)
+		if (old != layer) {
+			// TODO: Deprecated
 			for (LayerChangeListener l : listeners)
 				l.activeLayerChange(old, layer);
+			for (Layer.LayerChangeListener l : Layer.listeners)
+				l.activeLayerChange(old, layer);
+		}
 		repaint();
 	}
Index: src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 303)
+++ src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 304)
@@ -33,7 +33,7 @@
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.tools.DontShowAgainInfo;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -180,5 +180,5 @@
 			}
 		});
-		mapView.addLayerChangeListener(this);
+		Layer.listeners.add(this);
 
 		instance.addMouseListener(new MouseAdapter(){
@@ -283,4 +283,8 @@
 	public void layerRemoved(Layer oldLayer) {
 		model.removeElement(oldLayer);
+		if (model.isEmpty()) {
+			Layer.listeners.remove(this);
+			return;
+		}
 		if (instance.getSelectedIndex() == -1)
 			instance.setSelectedIndex(0);
@@ -296,5 +300,3 @@
 		updateButtonEnabled();
 	}
-
-	public void layerMoved(Layer layer, int newPosition) {}
 }
Index: src/org/openstreetmap/josm/gui/layer/GeoImageLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/GeoImageLayer.java	(revision 303)
+++ src/org/openstreetmap/josm/gui/layer/GeoImageLayer.java	(revision 304)
@@ -56,5 +56,4 @@
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.dialogs.LayerListPopup;
@@ -224,5 +223,5 @@
 		};
 		Main.map.mapView.addMouseListener(mouseAdapter);
-		Main.map.mapView.addLayerChangeListener(new LayerChangeListener(){
+		Layer.listeners.add(new LayerChangeListener(){
 			public void activeLayerChange(Layer oldLayer, Layer newLayer) {}
 			public void layerAdded(Layer newLayer) {}
Index: src/org/openstreetmap/josm/gui/layer/Layer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/Layer.java	(revision 303)
+++ src/org/openstreetmap/josm/gui/layer/Layer.java	(revision 304)
@@ -5,4 +5,6 @@
 import java.awt.Graphics;
 import java.io.File;
+import java.util.Collection;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 import javax.swing.Icon;
@@ -28,4 +30,20 @@
  */
 abstract public class Layer implements Destroyable {
+
+	/**
+	 * Interface to notify listeners of the change of the active layer.
+	 * @author imi
+	 */
+	public interface LayerChangeListener {
+		void activeLayerChange(Layer oldLayer, Layer newLayer);
+		void layerAdded(Layer newLayer);
+		void layerRemoved(Layer oldLayer);
+	}
+
+	/**
+	 * The listener of the active layer changes. You may register/deregister yourself
+	 * while an LayerChangeListener - action is executed.
+	 */
+	public static final Collection<LayerChangeListener> listeners = new CopyOnWriteArrayList<LayerChangeListener>();
 
 	/**
Index: src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java	(revision 303)
+++ src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java	(revision 304)
@@ -27,5 +27,4 @@
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.dialogs.LayerListPopup;
@@ -81,12 +80,4 @@
 						}
 						Main.map.mapView.repaint();
-					}
-				});
-
-				Main.map.mapView.addLayerChangeListener(new LayerChangeListener(){
-					public void activeLayerChange(Layer oldLayer, Layer newLayer) {}
-					public void layerAdded(Layer newLayer) {}
-					public void layerRemoved(Layer oldLayer) {
-						Main.pref.listener.remove(MarkerLayer.this);
 					}
 				});
Index: src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java
===================================================================
--- src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java	(revision 303)
+++ src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java	(revision 304)
@@ -270,5 +270,5 @@
 					for (Item i : data) {
 						if (i.focus) {
-							System.out.println(i.requestFocusInWindow());
+							i.requestFocusInWindow();
 							return;
 						}
