Index: src/org/openstreetmap/josm/Main.java
===================================================================
--- src/org/openstreetmap/josm/Main.java	(revision 93)
+++ src/org/openstreetmap/josm/Main.java	(revision 94)
@@ -110,5 +110,4 @@
 		getContentPane().add(panel, BorderLayout.CENTER);
 		setSize(1000,740); // some strange default size
-		setVisible(true);
 
 		downloadAction = new DownloadAction();
Index: src/org/openstreetmap/josm/actions/AutoScaleAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/AutoScaleAction.java	(revision 93)
+++ src/org/openstreetmap/josm/actions/AutoScaleAction.java	(revision 94)
@@ -51,5 +51,5 @@
 		this.mapFrame = mapFrame;
 		Main.ds.addSelectionChangedListener(new SelectionChangedListener(){
-			public void selectionChanged(Collection<OsmPrimitive> newSelection) {
+			public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
 				if (mode == AutoScaleMode.selection)
 					mapFrame.mapView.recalculateCenterScale();
Index: src/org/openstreetmap/josm/actions/DownloadAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/DownloadAction.java	(revision 93)
+++ src/org/openstreetmap/josm/actions/DownloadAction.java	(revision 94)
@@ -101,4 +101,5 @@
 			super("Downloading GPS data");
 			this.reader = reader;
+			reader.setProgressInformation(currentAction, progress);
 		}
 
Index: src/org/openstreetmap/josm/actions/GroupAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/GroupAction.java	(revision 93)
+++ src/org/openstreetmap/josm/actions/GroupAction.java	(revision 94)
@@ -3,5 +3,4 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
-import java.awt.event.KeyEvent;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
@@ -17,4 +16,5 @@
 import org.openstreetmap.josm.gui.IconToggleButton;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.ShortCutLabel;
 import org.openstreetmap.josm.tools.ImageProvider.OverlayPosition;
 
@@ -50,13 +50,5 @@
 	public GroupAction(int shortCut, int modifiers) {
 		registerShortCut(getClass().getName(), KeyStroke.getKeyStroke(shortCut, modifiers));
-		if ((modifiers & KeyEvent.CTRL_DOWN_MASK) != 0)
-			shortCutName += "Ctrl-";
-		if ((modifiers & KeyEvent.ALT_DOWN_MASK) != 0)
-			shortCutName += "Alt-";
-		if ((modifiers & KeyEvent.ALT_GRAPH_DOWN_MASK) != 0)
-			shortCutName += "AltGr-";
-		if ((modifiers & KeyEvent.SHIFT_DOWN_MASK) != 0)
-			shortCutName += "Shift-";
-		shortCutName += Character.toUpperCase((char)shortCut);
+		shortCutName = ShortCutLabel.name(shortCut, modifiers);
 		addPropertyChangeListener(new PropertyChangeListener(){
 			public void propertyChange(PropertyChangeEvent evt) {
Index: src/org/openstreetmap/josm/actions/mapmode/AddNodeAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/AddNodeAction.java	(revision 93)
+++ src/org/openstreetmap/josm/actions/mapmode/AddNodeAction.java	(revision 94)
@@ -49,11 +49,11 @@
 	}
 
-	@Override public void registerListener() {
-		super.registerListener();
+	@Override public void enterMode() {
+		super.enterMode();
 		mv.addMouseListener(this);
 	}
 
-	@Override public void unregisterListener() {
-		super.unregisterListener();
+	@Override public void exitMode() {
+		super.exitMode();
 		mv.removeMouseListener(this);
 	}
Index: src/org/openstreetmap/josm/actions/mapmode/AddSegmentAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/AddSegmentAction.java	(revision 93)
+++ src/org/openstreetmap/josm/actions/mapmode/AddSegmentAction.java	(revision 94)
@@ -49,12 +49,12 @@
 	}
 
-	@Override public void registerListener() {
-		super.registerListener();
+	@Override public void enterMode() {
+		super.enterMode();
 		mv.addMouseListener(this);
 		mv.addMouseMotionListener(this);
 	}
 
-	@Override public void unregisterListener() {
-		super.unregisterListener();
+	@Override public void exitMode() {
+		super.exitMode();
 		mv.removeMouseListener(this);
 		mv.removeMouseMotionListener(this);
Index: src/org/openstreetmap/josm/actions/mapmode/AddWayAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/AddWayAction.java	(revision 93)
+++ src/org/openstreetmap/josm/actions/mapmode/AddWayAction.java	(revision 94)
@@ -1,7 +1,9 @@
 package org.openstreetmap.josm.actions.mapmode;
 
-import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
+import java.awt.event.MouseEvent;
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -11,30 +13,42 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.AddCommand;
+import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.command.DeleteCommand;
+import org.openstreetmap.josm.data.SelectionChangedListener;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Segment;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.MapFrame;
 
 /**
- * Add a new way from all selected segments.
+ * Add a new way. The action is split into the first phase, where a new way get
+ * created or selected and the second, where this way is modified.
  *
+ * Way creation mode:
  * If there is a selection when the mode is entered, all segments in this
- * selection form a new way, except the user holds down Shift.
+ * selection form a new way. All non-segment objects are deselected. If there
+ * were ways selected, the user is asked whether to select all segments of these
+ * ways or not, except there is exactly one way selected, which enter the
+ * edit ways mode for this way immediatly.
+ * 
+ * If there is no selection on entering, and the user clicks on an segment, 
+ * the way editing starts the with a new way and this segment. If the user click
+ * on a way (not holding Alt down), then this way is edited in the way edit mode.
  *
- * The user can click on a segment. If he holds down Shift, no way is 
- * created yet. If he holds down Alt, the whole way is considered instead of 
- * the clicked segment. If the user holds down Ctrl, no way is created 
- * and the clicked segment get removed from the list.
- *
- * Also, the user may select a rectangle as in selection mode. No node, area or
- * way can be selected this way.
+ * Way editing mode:
+ * The user can click on subsequent segments. If the segment belonged to the way
+ * it get removed from the way. Elsewhere it get added to the way. JOSM try to add
+ * the segment in the correct position. This is done by searching for connections
+ * to the segment at its 'to' node which are also in the way. The segemnt is 
+ * inserted in the way as predecessor of the found segment (or at last segment, if
+ * nothing found). 
  *
  * @author imi
- *
  */
-public class AddWayAction extends MapMode {
-
-	private MapMode followMode;
-	
+public class AddWayAction extends MapMode implements SelectionChangedListener {
+
+	private Way way;
+
 	/**
 	 * Create a new AddWayAction.
@@ -42,25 +56,87 @@
 	 * @param followMode The mode to go into when finished creating a way.
 	 */
-	public AddWayAction(MapFrame mapFrame, MapMode followMode) {
-		super("Add Way", "addway", "Combine selected segments to a new way.", "W", KeyEvent.VK_W, mapFrame);
-		this.followMode = followMode;
-	}
-
-	@Override public void actionPerformed(ActionEvent e) {
-		makeWay();
-		super.actionPerformed(e);
-		mapFrame.selectMapMode(followMode);
+	public AddWayAction(MapFrame mapFrame) {
+		super("Add Way", "addway", "Add a new way to the data.", "W", KeyEvent.VK_W, mapFrame);
+		
+		Main.ds.addSelectionChangedListener(this);
+	}
+
+	@Override public void enterMode() {
+		super.enterMode();
+		Command c = null;
+		way = makeWay();
+		if (way != null) {
+			c = new AddCommand(way);
+			Main.ds.setSelected(way);
+			mv.editLayer().add(c);
+		} else
+			Main.ds.clearSelection();
+		mv.addMouseListener(this);
+	}
+
+	@Override public void exitMode() {
+		super.exitMode();
+		way = null;
+		mv.removeMouseListener(this);
+	}
+
+	@Override public void mouseClicked(MouseEvent e) {
+		if (e.getButton() != MouseEvent.BUTTON1)
+			return;
+
+		Segment s = mv.getNearestSegment(e.getPoint());
+		if (s == null)
+			return;
+
+		// special case for initial selecting one way
+		if (way == null && (e.getModifiers() & MouseEvent.ALT_DOWN_MASK) == 0) {
+			Way w = mv.getNearestWay(e.getPoint());
+			if (w != null) {
+				way = w;
+				Main.ds.setSelected(way);
+				return;
+			}
+		}
+
+		if (way != null && way.segments.contains(s)) {
+			Way copy = new Way(way);
+
+			copy.segments.remove(s);
+			if (copy.segments.isEmpty()) {
+				mv.editLayer().add(new DeleteCommand(Arrays.asList(new OsmPrimitive[]{way})));
+				way = null;
+			} else
+				mv.editLayer().add(new ChangeCommand(way, copy));
+		} else {
+			if (way == null) {
+				way = new Way();
+				way.segments.add(s);
+				mv.editLayer().add(new AddCommand(way));
+			} else {
+				Way copy = new Way(way);
+				int i;
+				for (i = 0; i < way.segments.size(); ++i)
+					if (way.segments.get(i).from == s.to)
+						break;
+				copy.segments.add(i, s);
+				mv.editLayer().add(new ChangeCommand(way, copy));
+			}
+		}
+		Main.ds.setSelected(way);
 	}
 
 	/**
-	 * Just make a way of all selected items.
+	 * Form a way, either out of the (one) selected way or by creating a way over the selected
+	 * line segments.
 	 */
-	private void makeWay() {
+	private Way makeWay() {
 		Collection<OsmPrimitive> selection = Main.ds.getSelected();
 		if (selection.isEmpty())
-			return;
-
-		// form a new way
-		LinkedList<Segment> segments = new LinkedList<Segment>();
+			return null;
+
+		if (selection.size() == 1 && selection.iterator().next() instanceof Way)
+			return (Way)selection.iterator().next();
+
+		HashSet<Segment> segmentSet = new HashSet<Segment>();
 		int numberOfSelectedWays = 0;
 		for (OsmPrimitive osm : selection) {
@@ -68,23 +144,21 @@
 				numberOfSelectedWays++;
 			else if (osm instanceof Segment)
-				segments.add((Segment)osm);
-		}
-		
+				segmentSet.add((Segment)osm);
+		}
+
 		if (numberOfSelectedWays > 0) {
 			String ways = "way" + (numberOfSelectedWays==1?" has":"s have");
 			int answer = JOptionPane.showConfirmDialog(Main.main, numberOfSelectedWays+" "+ways+" been selected.\n" +
-					"Do you wish to select all segments belonging to the "+ways+" instead?");
-			if (answer == JOptionPane.CANCEL_OPTION)
-				return;
+					"Do you wish to select all segments belonging to the "+ways+" instead?", "Add segments from ways", JOptionPane.YES_NO_OPTION);
 			if (answer == JOptionPane.YES_OPTION) {
 				for (OsmPrimitive osm : selection)
 					if (osm instanceof Way)
-						segments.addAll(((Way)osm).segments);
-			}
-		}
-		
-		if (segments.isEmpty())
-			return;
-		
+						segmentSet.addAll(((Way)osm).segments);
+			}
+		}
+
+		if (segmentSet.isEmpty())
+			return null;
+
 		// sort the segments in best possible order. This is done by:
 		// 0  if no elements in list, quit
@@ -94,4 +168,5 @@
 		// 4  if not found, save the pivot-string and goto 0
 		LinkedList<Segment> sortedSegments = new LinkedList<Segment>();
+		LinkedList<Segment> segments = new LinkedList<Segment>(segmentSet);
 		while (!segments.isEmpty()) {
 			LinkedList<Segment> pivotList = new LinkedList<Segment>();
@@ -117,10 +192,19 @@
 			sortedSegments.addAll(pivotList);
 		}
-		
+
+		if (JOptionPane.YES_OPTION != JOptionPane.showConfirmDialog(Main.main, "Create a new way out of "+sortedSegments.size()+" segments?", "Create new way", JOptionPane.YES_NO_OPTION))
+			return null;
+
 		Way w = new Way();
 		w.segments.addAll(sortedSegments);
-		mv.editLayer().add(new AddCommand(w));
-		Main.ds.clearSelection();
-		mv.repaint();
-	}
+		return w;
+	}
+
+	public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
+		if (newSelection.size() == 1) {
+			OsmPrimitive osm = newSelection.iterator().next();
+			way = osm instanceof Way ? (Way)osm : null;
+		} else
+			way = null;
+    }
 }
Index: src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 93)
+++ src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 94)
@@ -6,12 +6,10 @@
 import java.util.Collection;
 import java.util.Collections;
-import java.util.LinkedList;
+import java.util.HashSet;
 
 import javax.swing.JOptionPane;
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.DeleteCommand;
-import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.visitor.CollectBackReferencesVisitor;
@@ -46,11 +44,11 @@
 	}
 
-	@Override public void registerListener() {
-		super.registerListener();
+	@Override public void enterMode() {
+		super.enterMode();
 		mv.addMouseListener(this);
 	}
 
-	@Override public void unregisterListener() {
-		super.unregisterListener();
+	@Override public void exitMode() {
+		super.exitMode();
 		mv.removeMouseListener(this);
 	}
@@ -104,9 +102,10 @@
 	 */
 	private void deleteWithReferences(Collection<OsmPrimitive> selection) {
-		Collection<Command> deleteCommands = new LinkedList<Command>();
+		CollectBackReferencesVisitor v = new CollectBackReferencesVisitor(Main.ds);
 		for (OsmPrimitive osm : selection)
-			deleteCommands.add(new DeleteCommand(osm));
-		if (!deleteCommands.isEmpty())
-			mv.editLayer().add(new SequenceCommand(deleteCommands));
+			osm.visit(v);
+		v.data.addAll(selection);
+		if (!v.data.isEmpty())
+			mv.editLayer().add(new DeleteCommand(v.data));
 	}
 
@@ -120,16 +119,20 @@
 	 */
 	private void delete(Collection<OsmPrimitive> selection, boolean msgBox) {
-		Collection<Command> deleteCommands = new LinkedList<Command>();
+		Collection<OsmPrimitive> del = new HashSet<OsmPrimitive>();
 		for (OsmPrimitive osm : selection) {
 			CollectBackReferencesVisitor v = new CollectBackReferencesVisitor(Main.ds);
 			osm.visit(v);
 			if (!selection.containsAll(v.data)) {
-				if (msgBox)
+				if (msgBox) {
 					JOptionPane.showMessageDialog(Main.main, "This object is in use.");
-			} else
-				deleteCommands.add(new DeleteCommand(osm));
+					return;
+				}
+			} else {
+				del.addAll(v.data);
+				del.add(osm);
+			}
 		}
-		if (!deleteCommands.isEmpty())
-			mv.editLayer().add(new SequenceCommand(deleteCommands));
+		if (!del.isEmpty())
+			mv.editLayer().add(new DeleteCommand(del));
 	}
 }
Index: src/org/openstreetmap/josm/actions/mapmode/MapMode.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/MapMode.java	(revision 93)
+++ src/org/openstreetmap/josm/actions/mapmode/MapMode.java	(revision 94)
@@ -39,4 +39,5 @@
 		this.mapFrame = mapFrame;
 		mv = mapFrame.mapView;
+		putValue("active", false);
 	}
 
@@ -52,17 +53,8 @@
 	}
 
-	/**
-	 * Register all listener to the mapView
-	 * @param mapView	The view, where the listener should be registered.
-	 */
-	public void registerListener() {
+	public void enterMode() {
 		putValue("active", true);
 	}
-
-	/**
-	 * Unregister all listener previously registered. 
-	 * @param mapView	The view from which the listener should be deregistered.
-	 */
-	public void unregisterListener() {
+	public void exitMode() {
 		putValue("active", false);
 	}
Index: src/org/openstreetmap/josm/actions/mapmode/MoveAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/MoveAction.java	(revision 93)
+++ src/org/openstreetmap/josm/actions/mapmode/MoveAction.java	(revision 94)
@@ -5,5 +5,4 @@
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseEvent;
-import java.util.Arrays;
 import java.util.Collection;
 
@@ -52,12 +51,12 @@
 	}
 
-	@Override public void registerListener() {
-		super.registerListener();
+	@Override public void enterMode() {
+		super.enterMode();
 		mv.addMouseListener(this);
 		mv.addMouseMotionListener(this);
 	}
 
-	@Override public void unregisterListener() {
-		super.unregisterListener();
+	@Override public void exitMode() {
+		super.exitMode();
 		mv.removeMouseListener(this);
 		mv.removeMouseMotionListener(this);
@@ -96,5 +95,5 @@
 		}
 		
-		Command c = mv.editLayer().lastCommand();
+		Command c = mv.editLayer().commands.getLast();
 		if (c instanceof MoveCommand && affectedNodes.equals(((MoveCommand)c).objects))
 			((MoveCommand)c).moveAgain(dx,dy);
@@ -122,5 +121,5 @@
 			OsmPrimitive osm = mv.getNearest(e.getPoint(), (e.getModifiersEx() & MouseEvent.ALT_DOWN_MASK) != 0);
 			if (osm != null)
-				Main.ds.setSelected(Arrays.asList(new OsmPrimitive[]{osm}));
+				Main.ds.setSelected(osm);
 			singleOsmPrimitive = osm;
 			mv.repaint();
Index: src/org/openstreetmap/josm/actions/mapmode/SelectionAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/SelectionAction.java	(revision 93)
+++ src/org/openstreetmap/josm/actions/mapmode/SelectionAction.java	(revision 94)
@@ -68,11 +68,11 @@
 	}
 
-	@Override public void registerListener() {
-		super.registerListener();
+	@Override public void enterMode() {
+		super.enterMode();
 		selectionManager.register(mv);
 	}
 
-	@Override public void unregisterListener() {
-		super.unregisterListener();
+	@Override public void exitMode() {
+		super.exitMode();
 		selectionManager.unregister(mv);
 	}
Index: src/org/openstreetmap/josm/actions/mapmode/ZoomAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/ZoomAction.java	(revision 93)
+++ src/org/openstreetmap/josm/actions/mapmode/ZoomAction.java	(revision 94)
@@ -57,11 +57,11 @@
 	}
 
-	@Override public void registerListener() {
-		super.registerListener();
+	@Override public void enterMode() {
+		super.enterMode();
 		selectionManager.register(mv);
 	}
 
-	@Override public void unregisterListener() {
-		super.unregisterListener();
+	@Override public void exitMode() {
+		super.exitMode();
 		selectionManager.unregister(mv);
 	}
Index: src/org/openstreetmap/josm/command/AddCommand.java
===================================================================
--- src/org/openstreetmap/josm/command/AddCommand.java	(revision 93)
+++ src/org/openstreetmap/josm/command/AddCommand.java	(revision 94)
@@ -2,4 +2,8 @@
 
 import java.util.Collection;
+
+import javax.swing.JLabel;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.MutableTreeNode;
 
 import org.openstreetmap.josm.Main;
@@ -7,4 +11,5 @@
 import org.openstreetmap.josm.data.osm.visitor.AddVisitor;
 import org.openstreetmap.josm.data.osm.visitor.DeleteVisitor;
+import org.openstreetmap.josm.data.osm.visitor.NameVisitor;
 
 /**
@@ -39,3 +44,9 @@
 		added.add(osm);
 	}
+
+	@Override public MutableTreeNode description() {
+		NameVisitor v = new NameVisitor();
+		osm.visit(v);
+		return new DefaultMutableTreeNode(new JLabel("Add "+v.className+" "+v.name, v.icon, JLabel.HORIZONTAL));
+    }
 }
Index: src/org/openstreetmap/josm/command/ChangeCommand.java
===================================================================
--- src/org/openstreetmap/josm/command/ChangeCommand.java	(revision 93)
+++ src/org/openstreetmap/josm/command/ChangeCommand.java	(revision 94)
@@ -3,5 +3,10 @@
 import java.util.Collection;
 
+import javax.swing.JLabel;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.MutableTreeNode;
+
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.visitor.NameVisitor;
 
 public class ChangeCommand extends Command {
@@ -18,4 +23,5 @@
 	    super.executeCommand();
 	    osm.cloneFrom(newOsm);
+	    osm.modified = true;
     }
 
@@ -23,3 +29,9 @@
 		modified.add(osm);
     }
+
+	@Override public MutableTreeNode description() {
+		NameVisitor v = new NameVisitor();
+		osm.visit(v);
+		return new DefaultMutableTreeNode(new JLabel("Change "+v.className+" "+v.name, v.icon, JLabel.HORIZONTAL));
+    }
 }
Index: src/org/openstreetmap/josm/command/ChangePropertyCommand.java
===================================================================
--- src/org/openstreetmap/josm/command/ChangePropertyCommand.java	(revision 93)
+++ src/org/openstreetmap/josm/command/ChangePropertyCommand.java	(revision 94)
@@ -5,5 +5,11 @@
 import java.util.List;
 
+import javax.swing.JLabel;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.MutableTreeNode;
+
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.visitor.NameVisitor;
+import org.openstreetmap.josm.tools.ImageProvider;
 
 /**
@@ -55,3 +61,22 @@
 	}
 
+	@Override public MutableTreeNode description() {
+		String text = value == null ? "Remove '"+key+"'" : "Set '"+key+"="+value+"'";
+		text += " for ";
+		if (objects.size() == 1) {
+			NameVisitor v = new NameVisitor();
+			objects.iterator().next().visit(v);
+			text += v.className+" "+v.name;
+		} else
+			text += objects.size()+" objects";
+		DefaultMutableTreeNode root = new DefaultMutableTreeNode(new JLabel(text, ImageProvider.get("data", "key"), JLabel.HORIZONTAL));
+		if (objects.size() == 1)
+			return root;
+		NameVisitor v = new NameVisitor();
+		for (OsmPrimitive osm : objects) {
+			osm.visit(v);
+			root.add(new DefaultMutableTreeNode(v.toLabel()));
+		}
+		return root;
+    }
 }
Index: src/org/openstreetmap/josm/command/Command.java
===================================================================
--- src/org/openstreetmap/josm/command/Command.java	(revision 93)
+++ src/org/openstreetmap/josm/command/Command.java	(revision 94)
@@ -4,4 +4,6 @@
 import java.util.HashSet;
 import java.util.Map.Entry;
+
+import javax.swing.tree.MutableTreeNode;
 
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -58,3 +60,5 @@
 			Collection<OsmPrimitive> deleted,
 			Collection<OsmPrimitive> added);
+
+	abstract public MutableTreeNode description();
 }
Index: src/org/openstreetmap/josm/command/ConflictResolveCommand.java
===================================================================
--- src/org/openstreetmap/josm/command/ConflictResolveCommand.java	(revision 93)
+++ src/org/openstreetmap/josm/command/ConflictResolveCommand.java	(revision 94)
@@ -9,4 +9,8 @@
 import java.util.Map.Entry;
 
+import javax.swing.JLabel;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.MutableTreeNode;
+
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.conflict.ConflictItem;
@@ -14,4 +18,5 @@
 import org.openstreetmap.josm.gui.ConflictResolver;
 import org.openstreetmap.josm.gui.dialogs.ConflictDialog;
+import org.openstreetmap.josm.tools.ImageProvider;
 
 public class ConflictResolveCommand extends Command {
@@ -62,3 +67,11 @@
 		modified.addAll(resolved.keySet());
 	}
+
+	@Override public MutableTreeNode description() {
+		int i = 0;
+		for (ConflictItem c : conflicts)
+			if (c.resolution != null)
+				i++;
+		return new DefaultMutableTreeNode(new JLabel("Resolve "+i+" conflicts in "+resolved.size()+" objects", ImageProvider.get("data", "primitive"), JLabel.HORIZONTAL));
+    }
 }
Index: src/org/openstreetmap/josm/command/DeleteCommand.java
===================================================================
--- src/org/openstreetmap/josm/command/DeleteCommand.java	(revision 93)
+++ src/org/openstreetmap/josm/command/DeleteCommand.java	(revision 94)
@@ -2,9 +2,12 @@
 
 import java.util.Collection;
-import java.util.HashSet;
 
-import org.openstreetmap.josm.Main;
+import javax.swing.JLabel;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.MutableTreeNode;
+
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.visitor.CollectBackReferencesVisitor;
+import org.openstreetmap.josm.data.osm.visitor.NameVisitor;
+import org.openstreetmap.josm.tools.ImageProvider;
 
 /**
@@ -17,13 +20,10 @@
 	 * The primitive that get deleted.
 	 */
-	final Collection<OsmPrimitive> data = new HashSet<OsmPrimitive>();
+	private final Collection<OsmPrimitive> data;
 
-	public DeleteCommand(OsmPrimitive osm) {
-		CollectBackReferencesVisitor v = new CollectBackReferencesVisitor(Main.ds);
-		osm.visit(v);
-		data.addAll(v.data);
-		data.add(osm);
+	public DeleteCommand(Collection<OsmPrimitive> data) {
+		this.data = data;
 	}
-	
+
 	@Override public void executeCommand() {
 		super.executeCommand();
@@ -35,3 +35,27 @@
 		deleted.addAll(data);
 	}
+
+	@Override public MutableTreeNode description() {
+		NameVisitor v = new NameVisitor();
+
+		if (data.size() == 1) {
+			data.iterator().next().visit(v);
+			return new DefaultMutableTreeNode(new JLabel("Delete "+v.className+" "+v.name, v.icon, JLabel.HORIZONTAL));
+		}
+
+		String cname = null;
+		for (OsmPrimitive osm : data) {
+			osm.visit(v);
+			if (cname == null)
+				cname = v.className;
+			else if (!cname.equals(v.className))
+				cname = "primitive";
+		}
+		DefaultMutableTreeNode root = new DefaultMutableTreeNode(new JLabel("Delete "+data.size()+" "+cname+(data.size()==1?"":"s"), ImageProvider.get("data", cname), JLabel.HORIZONTAL));
+		for (OsmPrimitive osm : data) {
+			osm.visit(v);
+			root.add(new DefaultMutableTreeNode(v.toLabel()));
+		}
+		return root;
+	}
 }
Index: src/org/openstreetmap/josm/command/MoveCommand.java
===================================================================
--- src/org/openstreetmap/josm/command/MoveCommand.java	(revision 93)
+++ src/org/openstreetmap/josm/command/MoveCommand.java	(revision 94)
@@ -6,10 +6,15 @@
 import java.util.List;
 
+import javax.swing.JLabel;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.MutableTreeNode;
+
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.visitor.AllNodesVisitor;
+import org.openstreetmap.josm.tools.ImageProvider;
 
 /**
@@ -106,3 +111,7 @@
 			modified.add(osm);
 	}
+
+	@Override public MutableTreeNode description() {
+		return new DefaultMutableTreeNode(new JLabel("Move "+objects.size()+" Node"+(objects.size()==1?"":"s"), ImageProvider.get("data", "node"), JLabel.HORIZONTAL));
+    }
 }
Index: src/org/openstreetmap/josm/command/SequenceCommand.java
===================================================================
--- src/org/openstreetmap/josm/command/SequenceCommand.java	(revision 93)
+++ src/org/openstreetmap/josm/command/SequenceCommand.java	(revision 94)
@@ -2,4 +2,7 @@
 
 import java.util.Collection;
+
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.MutableTreeNode;
 
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -15,5 +18,5 @@
 	 * The command sequenz to be executed.
 	 */
-	private Command[] sequenz;
+	private Command[] sequence;
 
 	/**
@@ -22,22 +25,28 @@
 	 */
 	public SequenceCommand(Collection<Command> sequenz) {
-		this.sequenz = new Command[sequenz.size()];
-		this.sequenz = sequenz.toArray(this.sequenz);
+		this.sequence = new Command[sequenz.size()];
+		this.sequence = sequenz.toArray(this.sequence);
 	}
 	
 	@Override public void executeCommand() {
-		for (Command c : sequenz)
+		for (Command c : sequence)
 			c.executeCommand();
 	}
 
 	@Override public void undoCommand() {
-		for (int i = sequenz.length-1; i >= 0; --i)
-			sequenz[i].undoCommand();
+		for (int i = sequence.length-1; i >= 0; --i)
+			sequence[i].undoCommand();
 	}
 
 	@Override public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, Collection<OsmPrimitive> added) {
-		for (Command c : sequenz)
+		for (Command c : sequence)
 			c.fillModifiedData(modified, deleted, added);
 	}
 
+	@Override public MutableTreeNode description() {
+		DefaultMutableTreeNode root = new DefaultMutableTreeNode("Sequence");
+		for (Command c : sequence)
+			root.add(c.description());
+	    return root;
+    }
 }
Index: src/org/openstreetmap/josm/data/SelectionChangedListener.java
===================================================================
--- src/org/openstreetmap/josm/data/SelectionChangedListener.java	(revision 93)
+++ src/org/openstreetmap/josm/data/SelectionChangedListener.java	(revision 94)
@@ -22,4 +22,4 @@
 	 * @param newSelection The new selection.
 	 */
-	public void selectionChanged(Collection<OsmPrimitive> newSelection);
+	public void selectionChanged(Collection<? extends OsmPrimitive> newSelection);
 }
Index: src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 93)
+++ src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 94)
@@ -1,4 +1,5 @@
 package org.openstreetmap.josm.data.osm;
 
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -91,9 +92,17 @@
 	}
 
-	public void setSelected(Collection<OsmPrimitive> selection) {
+	public void setSelected(Collection<? extends OsmPrimitive> selection) {
 		clearSelection();
 		for (OsmPrimitive osm : selection)
 			osm.selected = true;
 		fireSelectionChanged(selection);
+	}
+
+	public void setSelected(OsmPrimitive osm) {
+		clearSelection();
+		if (osm == null)
+			return;
+		osm.selected = true;
+		fireSelectionChanged(Arrays.asList(new OsmPrimitive[]{osm}));
 	}
 	
@@ -127,5 +136,5 @@
      * the event immediately. For more, @see SelectionChangedListener
      */
-    private void fireSelectionChanged(Collection<OsmPrimitive> sel) {
+    public void fireSelectionChanged(Collection<? extends OsmPrimitive> sel) {
 		for (SelectionChangedListener l : listeners)
 			l.selectionChanged(sel);
Index: src/org/openstreetmap/josm/data/osm/Node.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/Node.java	(revision 93)
+++ src/org/openstreetmap/josm/data/osm/Node.java	(revision 94)
@@ -46,3 +46,7 @@
 		return osm instanceof Node ? super.realEqual(osm) && coor.equals(((Node)osm).coor) : false;
     }
+
+	public int compareTo(OsmPrimitive o) {
+	    return o instanceof Node ? Long.valueOf(id).compareTo(o.id) : -1;
+    }
 }
Index: src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 93)
+++ src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 94)
@@ -23,5 +23,5 @@
  * @author imi
  */
-abstract public class OsmPrimitive {
+abstract public class OsmPrimitive implements Comparable<OsmPrimitive> {
 
 	/**
Index: src/org/openstreetmap/josm/data/osm/Segment.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/Segment.java	(revision 93)
+++ src/org/openstreetmap/josm/data/osm/Segment.java	(revision 94)
@@ -85,3 +85,7 @@
 				to.equals(((Segment)osm).to) : false;
 	}
-}	
+
+	public int compareTo(OsmPrimitive o) {
+		return o instanceof Segment ? Long.valueOf(id).compareTo(o.id) : (o instanceof Node ? 1 : -1);
+	}
+}
Index: src/org/openstreetmap/josm/data/osm/Way.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/Way.java	(revision 93)
+++ src/org/openstreetmap/josm/data/osm/Way.java	(revision 94)
@@ -46,3 +46,7 @@
 		return osm instanceof Way ? super.realEqual(osm) && segments.equals(((Way)osm).segments) : false;
     }
+
+	public int compareTo(OsmPrimitive o) {
+	    return o instanceof Way ? Long.valueOf(id).compareTo(o.id) : 1;
+    }
 }
Index: src/org/openstreetmap/josm/data/osm/visitor/NameVisitor.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/visitor/NameVisitor.java	(revision 93)
+++ src/org/openstreetmap/josm/data/osm/visitor/NameVisitor.java	(revision 94)
@@ -6,4 +6,5 @@
 
 import javax.swing.Icon;
+import javax.swing.JLabel;
 
 import org.openstreetmap.josm.data.osm.Segment;
@@ -82,3 +83,7 @@
 		className = "way";
 	}
+	
+	public JLabel toLabel() {
+		return new JLabel(name, icon, JLabel.HORIZONTAL);
+	}
 }
Index: src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapFrame.java	(revision 93)
+++ src/org/openstreetmap/josm/gui/MapFrame.java	(revision 94)
@@ -25,4 +25,5 @@
 import org.openstreetmap.josm.actions.mapmode.ZoomAction;
 import org.openstreetmap.josm.actions.mapmode.AddNodeAction.AddNodeGroup;
+import org.openstreetmap.josm.gui.dialogs.CommandStackDialog;
 import org.openstreetmap.josm.gui.dialogs.ConflictDialog;
 import org.openstreetmap.josm.gui.dialogs.LayerList;
@@ -82,5 +83,5 @@
 		toolBarActions.add(new IconToggleButton(new AddNodeGroup(this)));
 		toolBarActions.add(new IconToggleButton(new AddSegmentAction(this)));
-		toolBarActions.add(new IconToggleButton(new AddWayAction(this, selectionAction)));
+		toolBarActions.add(new IconToggleButton(new AddWayAction(this)));
 		toolBarActions.add(new IconToggleButton(new DeleteAction(this)));
 
@@ -122,4 +123,5 @@
 		addIconToggle(toggleDialogs, new SelectionListDialog(this));
 		addIconToggle(toggleDialogs, conflictDialog = new ConflictDialog());
+		addIconToggle(toggleDialogs, new CommandStackDialog(this));
 
 		// status line below the map
@@ -159,7 +161,7 @@
 			return;
 		if (this.mapMode != null)
-			this.mapMode.unregisterListener();
+			this.mapMode.exitMode();
 		this.mapMode = mapMode;
-		mapMode.registerListener();
+		mapMode.enterMode();
 	}
 
Index: src/org/openstreetmap/josm/gui/MapStatus.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapStatus.java	(revision 93)
+++ src/org/openstreetmap/josm/gui/MapStatus.java	(revision 94)
@@ -14,5 +14,4 @@
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.ConcurrentModificationException;
@@ -155,5 +154,5 @@
 								}
 								@Override public void mouseClicked(MouseEvent e) {
-									Main.ds.setSelected(Arrays.asList(new OsmPrimitive[]{osm}));
+									Main.ds.setSelected(osm);
 									mv.repaint();
 								}
Index: src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapView.java	(revision 93)
+++ src/org/openstreetmap/josm/gui/MapView.java	(revision 94)
@@ -85,5 +85,5 @@
 		// listend to selection changes to redraw the map
 		Main.ds.addSelectionChangedListener(new SelectionChangedListener(){
-			public void selectionChanged(Collection<OsmPrimitive> newSelection) {
+			public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
 				repaint();
 			}
@@ -106,9 +106,9 @@
 			dataLayer.data.addAllSelectionListener(Main.ds);
 			Main.ds = dataLayer.data;
-			dataLayer.addModifiedListener(new ModifiedChangedListener(){
-				public void modifiedChanged(boolean value, OsmDataLayer source) {
-					Main.main.setTitle((value?"*":"")+"Java Open Street Map - Editor");
-				}
-			});
+			dataLayer.listenerModified.add(new ModifiedChangedListener(){
+            	public void modifiedChanged(boolean value, OsmDataLayer source) {
+            		Main.main.setTitle((value?"*":"")+"Java Open Street Map - Editor");
+            	}
+            });
 		}
 
Index: src/org/openstreetmap/josm/gui/OsmPrimitivRenderer.java
===================================================================
--- src/org/openstreetmap/josm/gui/OsmPrimitivRenderer.java	(revision 93)
+++ src/org/openstreetmap/josm/gui/OsmPrimitivRenderer.java	(revision 94)
@@ -4,5 +4,4 @@
 
 import javax.swing.DefaultListCellRenderer;
-import javax.swing.JLabel;
 import javax.swing.JList;
 
@@ -19,11 +18,11 @@
 
 	@Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
-		Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
-		if (c instanceof JLabel && value != null) {
+		super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
+		if (value != null) {
 			((OsmPrimitive)value).visit(visitor);
-			((JLabel)c).setText(visitor.name);
-			((JLabel)c).setIcon(visitor.icon);
+			setText(visitor.name);
+			setIcon(visitor.icon);
 		}
-		return c;
+		return this;
 	}
 }
Index: src/org/openstreetmap/josm/gui/SelectionManager.java
===================================================================
--- src/org/openstreetmap/josm/gui/SelectionManager.java	(revision 93)
+++ src/org/openstreetmap/josm/gui/SelectionManager.java	(revision 94)
@@ -273,26 +273,29 @@
 			// nodes
 			for (Node n : Main.ds.nodes) {
-				if (r.contains(nc.getPoint(n.eastNorth)))
+				if (!n.deleted && r.contains(nc.getPoint(n.eastNorth)))
 					selection.add(n);
 			}
 			
 			// pending segments
-			for (Segment ls : Main.ds.segments)
-				if (rectangleContainSegment(r, alt, ls))
-					selection.add(ls);
+			for (Segment s : Main.ds.segments)
+				if (!s.deleted && rectangleContainSegment(r, alt, s))
+					selection.add(s);
 
 			// ways
-			for (Way t : Main.ds.ways) {
-				boolean wholeWaySelected = !t.segments.isEmpty();
-				for (Segment ls : t.segments)
-					if (rectangleContainSegment(r, alt, ls))
-						selection.add(ls);
-					else
+			for (Way w : Main.ds.ways) {
+				if (w.deleted)
+					continue;
+				boolean wholeWaySelected = !w.segments.isEmpty();
+				for (Segment s : w.segments) {
+					if (s.incomplete)
+						continue;
+					if (!rectangleContainSegment(r, alt, s)) {
 						wholeWaySelected = false;
+						break;
+					}
+				}
 				if (wholeWaySelected)
-					selection.add(t);
+					selection.add(w);
 			}
-			
-			// TODO areas
 		}
 		return selection;
Index: src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java	(revision 94)
+++ src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java	(revision 94)
@@ -0,0 +1,72 @@
+package org.openstreetmap.josm.gui.dialogs;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.event.KeyEvent;
+import java.util.Collection;
+
+import javax.swing.JLabel;
+import javax.swing.JScrollPane;
+import javax.swing.JTree;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.DefaultTreeCellRenderer;
+import javax.swing.tree.DefaultTreeModel;
+
+import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.gui.MapFrame;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer.CommandQueueListener;
+
+public class CommandStackDialog extends ToggleDialog implements CommandQueueListener {
+
+	private DefaultTreeModel treeModel = new DefaultTreeModel(new DefaultMutableTreeNode());
+    private JTree tree = new JTree(treeModel);
+	private final MapFrame mapFrame;
+
+	public CommandStackDialog(MapFrame mapFrame) {
+		super("Command Stack", "commandstack", "Open a list of all commands (undo buffer).", KeyEvent.VK_C);
+		this.mapFrame = mapFrame;
+		setPreferredSize(new Dimension(320,100));
+		mapFrame.mapView.editLayer().listenerCommands.add(this);
+		tree.setRootVisible(false);
+		tree.setShowsRootHandles(true);
+		tree.expandRow(0);
+		tree.setCellRenderer(new DefaultTreeCellRenderer(){
+			@Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
+				super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
+				DefaultMutableTreeNode v = (DefaultMutableTreeNode)value;
+				if (v.getUserObject() instanceof JLabel) {
+					JLabel l = (JLabel)v.getUserObject();
+					setIcon(l.getIcon());
+					setText(l.getText());
+				}
+				return this;
+			}
+		});
+		tree.setVisibleRowCount(8);
+		add(new JScrollPane(tree), BorderLayout.CENTER);
+	}
+
+	@Override public void setVisible(boolean v) {
+		if (v)
+			buildList();
+		else if (tree != null)
+			treeModel.setRoot(new DefaultMutableTreeNode());
+		super.setVisible(v);
+	}
+
+	private void buildList() {
+		Collection<Command> commands = mapFrame.mapView.editLayer().commands;
+		DefaultMutableTreeNode root = new DefaultMutableTreeNode();
+		for (Command c : commands)
+			root.add(c.description());
+		treeModel.setRoot(root);
+	}
+
+	public void commandChanged() {
+		if (!isVisible())
+			return;
+        treeModel.setRoot(new DefaultMutableTreeNode());
+		buildList();
+    }
+}
Index: src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 93)
+++ src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 94)
@@ -48,5 +48,5 @@
 
 	public ConflictDialog() {
-		super("Conflict", "Conflict Dialog", "merge", "Merging conflicts.", "C", KeyEvent.VK_C, "conflict");
+		super("Conflict", "conflict", "Merging conflicts.", KeyEvent.VK_C);
 		displaylist.setCellRenderer(new OsmPrimitivRenderer());
 		displaylist.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
@@ -60,5 +60,5 @@
 
 		JPanel buttonPanel = new JPanel(new GridLayout(1,2));
-		JButton button = new JButton("Resolve", ImageProvider.get("dialogs", "merge"));
+		JButton button = new JButton("Resolve", ImageProvider.get("dialogs", "conflict"));
 		button.setToolTipText("Open a merge dialog of all selected items in the list above.");
 		button.addActionListener(new ActionListener(){
@@ -84,5 +84,5 @@
 
 		Main.ds.addSelectionChangedListener(new SelectionChangedListener(){
-			public void selectionChanged(Collection<OsmPrimitive> newSelection) {
+			public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
 				displaylist.clearSelection();
 				for (OsmPrimitive osm : newSelection) {
Index: src/org/openstreetmap/josm/gui/dialogs/LayerList.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/LayerList.java	(revision 93)
+++ src/org/openstreetmap/josm/gui/dialogs/LayerList.java	(revision 94)
@@ -123,5 +123,5 @@
 	 */
 	public LayerList(MapFrame mapFrame) {
-		super("Layers", "List of all layers", "layerlist", "Open a list of all loaded layers.", "L", KeyEvent.VK_L, "layerlist");
+		super("Layers", "layerlist", "Open a list of all loaded layers.", KeyEvent.VK_L);
 		setPreferredSize(new Dimension(320,100));
 		add(new JScrollPane(layers), BorderLayout.CENTER);
Index: src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 93)
+++ src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 94)
@@ -210,5 +210,5 @@
 	 */
 	public PropertiesDialog(MapFrame mapFrame) {
-		super("Properties", "Properties Dialog", "properties", "Property for selected objects.", "P", KeyEvent.VK_P, "propertiesdialog");
+		super("Properties", "propertiesdialog", "Property for selected objects.", KeyEvent.VK_P);
 		mv = mapFrame.mapView;
 
@@ -284,5 +284,5 @@
 	}
 
-	public void selectionChanged(Collection<OsmPrimitive> newSelection) {
+	public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
 		if (propertyTable == null)
 			return; // selection changed may be received in base class constructor before init
Index: src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 93)
+++ src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 94)
@@ -18,4 +18,5 @@
 import java.util.LinkedList;
 import java.util.Map;
+import java.util.TreeSet;
 
 import javax.swing.ButtonGroup;
@@ -116,5 +117,5 @@
 	 */
 	public SelectionListDialog(MapFrame mapFrame) {
-		super("Current Selection", "Selection List", "selectionlist", "Open a selection list window.", "E", KeyEvent.VK_E, "selectionlist");
+		super("Current Selection", "selectionlist", "Open a selection list window.", KeyEvent.VK_E);
 		setPreferredSize(new Dimension(320,150));
 		displaylist.setCellRenderer(new OsmPrimitivRenderer());
@@ -141,4 +142,13 @@
 		buttonPanel.add(button);
 
+		button = new JButton("Reload", ImageProvider.get("dialogs", "refresh"));
+		button.setToolTipText("Refresh the selection list.");
+		button.addActionListener(new ActionListener(){
+			public void actionPerformed(ActionEvent e) {
+				selectionChanged(Main.ds.getSelected());
+			}
+		});
+		buttonPanel.add(button);
+		
 		button = new JButton("Search", ImageProvider.get("dialogs", "search"));
 		button.setToolTipText("Search for objects.");
@@ -205,11 +215,11 @@
 	 * @param newSelection The new selection array.
 	 */
-	public void selectionChanged(Collection<OsmPrimitive> newSelection) {
+	public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
+		TreeSet<OsmPrimitive> sortedSel = new TreeSet<OsmPrimitive>(newSelection);
 		if (list == null)
 			return; // selection changed may be received in base class constructor before init
-		list.removeAllElements();
-		list.setSize(newSelection.size());
+		list.setSize(sortedSel.size());
 		int i = 0;
-		for (OsmPrimitive osm : newSelection)
+		for (OsmPrimitive osm : sortedSel)
 			list.setElementAt(osm, i++);
 	}
Index: src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 93)
+++ src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 94)
@@ -13,4 +13,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.tools.ShortCutLabel;
 
 /**
@@ -44,13 +45,8 @@
 	public ToggleDialogAction action;
 
-	/**
-	 * Create a new ToggleDialog.
-	 * @param title The title of the dialog.
-     * @param prefName Name of the base preference setting string (prefix)
-	 */
-	public ToggleDialog(String title, String name, String iconName, String tooltip, String shortCutName, int shortCut, final String prefName) {
-		action = new ToggleDialogAction(name, "dialogs/"+iconName, tooltip, "Alt-"+shortCutName, KeyStroke.getKeyStroke(shortCut, KeyEvent.ALT_MASK), prefName);
+	public ToggleDialog(String name, String iconName, String tooltip, int shortCut) {
+		action = new ToggleDialogAction(name, "dialogs/"+iconName, tooltip, ShortCutLabel.name(shortCut, KeyEvent.ALT_MASK), KeyStroke.getKeyStroke(shortCut, KeyEvent.ALT_MASK), iconName);
 		setLayout(new BorderLayout());
-		add(new JLabel(title), BorderLayout.NORTH);
+		add(new JLabel(name), BorderLayout.NORTH);
 		setVisible(false);
 		setBorder(BorderFactory.createEtchedBorder());
Index: src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 93)
+++ src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 94)
@@ -23,7 +23,7 @@
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.Segment;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Segment;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
@@ -72,4 +72,7 @@
 		void modifiedChanged(boolean value, OsmDataLayer source);
 	}
+	public interface CommandQueueListener {
+		void commandChanged();
+	}
 
 	private static Icon icon;
@@ -94,7 +97,7 @@
 	private boolean fromDisk = false;
 	/**
-	 * All commands that were made on the dataset.
-	 */
-	private LinkedList<Command> commands = new LinkedList<Command>();
+	 * All commands that were made on the dataset. Don't write from outside!
+	 */
+	public final LinkedList<Command> commands = new LinkedList<Command>();
 	/**
 	 * The stack for redoing commands
@@ -102,8 +105,6 @@
 	private Stack<Command> redoCommands = new Stack<Command>();
 
-	/**
-	 * List of all listeners for changes of modified flag.
-	 */
-	LinkedList<ModifiedChangedListener> listener;
+	public final LinkedList<ModifiedChangedListener> listenerModified = new LinkedList<ModifiedChangedListener>();
+	public final LinkedList<CommandQueueListener> listenerCommands = new LinkedList<CommandQueueListener>();
 
 
@@ -175,12 +176,6 @@
 	@Override public void visitBoundingBox(BoundingXYVisitor v) {
 		for (Node n : data.nodes)
-			v.visit(n);
-	}
-
-	/**
-	 * @return the last command added or <code>null</code> if no command in queue.
-	 */
-	public Command lastCommand() {
-		return commands.isEmpty() ? null : commands.getLast();
+			if (!n.deleted)
+				v.visit(n);
 	}
 
@@ -197,4 +192,6 @@
 		Main.main.redoAction.setEnabled(false);
 		setModified(true);
+		for (CommandQueueListener l : listenerCommands)
+			l.commandChanged();
 	}
 
@@ -213,4 +210,7 @@
 		if (commands.isEmpty())
 			setModified(uploadedModified);
+		Main.ds.clearSelection();
+		for (CommandQueueListener l : listenerCommands)
+			l.commandChanged();
 	}
 	/**
@@ -227,4 +227,6 @@
 		Main.main.redoAction.setEnabled(!redoCommands.isEmpty());
 		setModified(true);
+		for (CommandQueueListener l : listenerCommands)
+			l.commandChanged();
 	}
 
@@ -234,5 +236,4 @@
 	 * after a successfull upload.
 	 * 
-	 * @param uploaded <code>true</code>, if the data was uploaded, false if saved to disk
 	 * @param processed A list of all objects, that were actually uploaded. 
 	 * 		May be <code>null</code>, which means nothing has been uploaded but 
@@ -292,17 +293,6 @@
 			return;
 		this.modified = modified;
-		if (listener != null)
-			for (ModifiedChangedListener l : listener)
-				l.modifiedChanged(modified, this);
-	}
-
-	/**
-	 * Add the parameter to the intern list of listener for modified state.
-	 * @param l Listener to add to the list. Must not be null.
-	 */
-	public void addModifiedListener(ModifiedChangedListener l) {
-		if (listener == null)
-			listener = new LinkedList<ModifiedChangedListener>();
-		listener.add(l);
+		for (ModifiedChangedListener l : listenerModified)
+			l.modifiedChanged(modified, this);
 	}
 
@@ -328,5 +318,5 @@
 			if (counter.deleted[i] > 0)
 				s += " ("+counter.deleted[i]+" deleted)";
-			p.add(new JLabel(s, ImageProvider.get("data", counter.names[i]), JLabel.HORIZONTAL), GBC.eol().insets(15,0,0,0));
+			p.add(new JLabel(s, ImageProvider.get("data", counter.names[i]), JLabel.HORIZONTAL), GBC.eop().insets(15,0,0,0));
 		}
 		return p;
Index: src/org/openstreetmap/josm/tools/ShortCutLabel.java
===================================================================
--- src/org/openstreetmap/josm/tools/ShortCutLabel.java	(revision 94)
+++ src/org/openstreetmap/josm/tools/ShortCutLabel.java	(revision 94)
@@ -0,0 +1,19 @@
+package org.openstreetmap.josm.tools;
+
+import java.awt.event.KeyEvent;
+
+public class ShortCutLabel {
+	public static String name(int shortCut, int modifiers) {
+		String s = "";
+		if ((modifiers & KeyEvent.CTRL_MASK) != 0)
+			s += "Ctrl-";
+		if ((modifiers & KeyEvent.ALT_MASK) != 0)
+			s += "Alt-";
+		if ((modifiers & KeyEvent.ALT_GRAPH_MASK) != 0)
+			s += "AltGr-";
+		if ((modifiers & KeyEvent.SHIFT_MASK) != 0)
+			s += "Shift-";
+		s += Character.toUpperCase((char)shortCut);
+		return s;
+	}
+}
