Index: src/org/openstreetmap/josm/actions/mapmode/AddNodeAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/AddNodeAction.java	(revision 197)
+++ src/org/openstreetmap/josm/actions/mapmode/AddNodeAction.java	(revision 198)
@@ -25,5 +25,4 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.MapFrame;
-import org.openstreetmap.josm.tools.ImageProvider;
 
 /**
@@ -54,5 +53,5 @@
 
 	public AddNodeAction(MapFrame mapFrame, String name, Mode mode, String desc) {
-		super(name, "node/"+mode, desc, mapFrame, ImageProvider.getCursor("crosshair", "node"));
+		super(name, "node/"+mode, desc, mapFrame, Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
 		this.mode = mode;
 		putValue("help", "Action/AddNode/"+Character.toUpperCase(mode.toString().charAt(0))+mode.toString().substring(1));
@@ -62,5 +61,4 @@
 		super.enterMode();
 		Main.map.mapView.addMouseListener(this);
-		Main.map.mapView.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
 	}
 
@@ -68,5 +66,4 @@
 		super.exitMode();
 		Main.map.mapView.removeMouseListener(this);
-		Main.map.mapView.setCursor(Cursor.getDefaultCursor());
 	}
 
Index: src/org/openstreetmap/josm/actions/mapmode/MapMode.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/MapMode.java	(revision 197)
+++ src/org/openstreetmap/josm/actions/mapmode/MapMode.java	(revision 198)
@@ -21,6 +21,6 @@
  */
 abstract public class MapMode extends JosmAction implements MouseListener, MouseMotionListener {
-//	private final Cursor cursor;
-//	private Cursor oldCursor;
+	private final Cursor cursor;
+	private Cursor oldCursor;
 
 	/**
@@ -29,5 +29,5 @@
 	public MapMode(String name, String iconName, String tooltip, int keystroke, MapFrame mapFrame, Cursor cursor) {
 		super(name, "mapmode/"+iconName, tooltip, keystroke, 0, false);
-//		this.cursor = cursor;
+		this.cursor = cursor;
 		putValue("active", false);
 	}
@@ -40,16 +40,16 @@
 		putValue(SMALL_ICON, ImageProvider.get("mapmode", iconName));
 		putValue(SHORT_DESCRIPTION, tooltip);
-//		this.cursor = cursor;
+		this.cursor = cursor;
 	}
 
 	public void enterMode() {
 		putValue("active", true);
-//		oldCursor = Main.map.mapView.getCursor();
-//		Main.map.mapView.setCursor(cursor);
+		oldCursor = Main.map.mapView.getCursor();
+		Main.map.mapView.setCursor(cursor);
 		
 	}
 	public void exitMode() {
 		putValue("active", false);
-//		Main.map.mapView.setCursor(oldCursor);
+		Main.map.mapView.setCursor(oldCursor);
 	}
 
Index: src/org/openstreetmap/josm/command/SequenceCommand.java
===================================================================
--- src/org/openstreetmap/josm/command/SequenceCommand.java	(revision 197)
+++ src/org/openstreetmap/josm/command/SequenceCommand.java	(revision 198)
@@ -3,4 +3,5 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.util.Arrays;
 import java.util.Collection;
 
@@ -32,4 +33,11 @@
 		this.sequence = sequenz.toArray(this.sequence);
 	}
+
+	/**
+	 * Convinient constructor, if the commands are known at compile time.
+	 */
+	public SequenceCommand(String name, Command... sequenz) {
+		this(name, Arrays.asList(sequenz));
+	}
 	
 	@Override public void executeCommand() {
Index: src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- src/org/openstreetmap/josm/gui/MainApplication.java	(revision 197)
+++ src/org/openstreetmap/josm/gui/MainApplication.java	(revision 198)
@@ -4,4 +4,5 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.EventQueue;
 import java.awt.Toolkit;
 import java.awt.event.WindowAdapter;
@@ -67,5 +68,5 @@
 		// construct argument table
 		List<String> argList = Arrays.asList(argArray);
-		Map<String, Collection<String>> args = new HashMap<String, Collection<String>>();
+		final Map<String, Collection<String>> args = new HashMap<String, Collection<String>>();
 		for (String arg : argArray) {
 			if (!arg.startsWith("--"))
@@ -157,5 +158,5 @@
 		JFrame mainFrame = new JFrame(tr("Java Open Street Map - Editor"));
 		Main.parent = mainFrame;
-		Main main = new MainApplication(mainFrame);
+		final Main main = new MainApplication(mainFrame);
 		main.loadPlugins();
 
@@ -165,5 +166,9 @@
 			mainFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
 
-		main.postConstructorProcessCmdLine(args);
+		EventQueue.invokeLater(new Runnable(){
+			public void run() {
+				main.postConstructorProcessCmdLine(args);
+            }
+		});
 	}
 }
Index: src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapFrame.java	(revision 197)
+++ src/org/openstreetmap/josm/gui/MapFrame.java	(revision 198)
@@ -150,4 +150,5 @@
 		IconToggleButton button = new IconToggleButton(dlg.action);
 		dlg.action.button = button;
+		dlg.parent = toggleDialogs;
 		toolBarActions.add(button);
 		toggleDialogs.add(dlg);
Index: src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapView.java	(revision 197)
+++ src/org/openstreetmap/josm/gui/MapView.java	(revision 198)
@@ -153,4 +153,5 @@
 			Main.ds.clearSelection();
 		}
+		layer.destroy();
 	}
 
Index: src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 197)
+++ src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 198)
@@ -23,4 +23,5 @@
 import java.util.Map.Entry;
 
+import javax.swing.Box;
 import javax.swing.DefaultComboBoxModel;
 import javax.swing.JButton;
@@ -39,4 +40,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.ChangePropertyCommand;
+import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -97,11 +99,23 @@
 			return;
 		}
-		String msg = "<html>"+trn("This will change {0} object.", "This will change {0} objects.", sel.size(), sel.size())+"<br><br> "+tr("Please select a new value for \"{0}\".<br>(Empty string deletes the key.)", key)+"</html>";
+		String msg = "<html>"+trn("This will change {0} object.", "This will change {0} objects.", sel.size(), sel.size())+"<br><br>("+tr("An empty value deletes the key.", key)+")</html>";
+		
+		JPanel panel = new JPanel(new BorderLayout());
+		panel.add(new JLabel(msg), BorderLayout.NORTH);
+
+		JPanel p = new JPanel(new GridBagLayout());
+		panel.add(p, BorderLayout.CENTER);
+		
+		final JTextField keyField = new JTextField(key);
+		p.add(new JLabel(tr("Key")), GBC.std());
+		p.add(Box.createHorizontalStrut(10), GBC.std());
+		p.add(keyField, GBC.eol().fill(GBC.HORIZONTAL));
+				
 		final JComboBox combo = (JComboBox)data.getValueAt(row, 1);
-		JPanel p = new JPanel(new BorderLayout());
-		p.add(new JLabel(msg), BorderLayout.NORTH);
-		p.add(combo, BorderLayout.CENTER);
-
-		final JOptionPane optionPane = new JOptionPane(p, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION){
+		p.add(new JLabel(tr("Value")), GBC.std());
+		p.add(Box.createHorizontalStrut(10), GBC.std());
+		p.add(combo, GBC.eol().fill(GBC.HORIZONTAL));
+
+		final JOptionPane optionPane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION){
 			@Override public void selectInitialValue() {
 				combo.requestFocusInWindow();
@@ -131,7 +145,18 @@
 		if (value.equals(""))
 			value = null; // delete the key
-		Main.main.editLayer().add(new ChangePropertyCommand(sel, key, value));
-
-		if (value == null)
+		String newkey = keyField.getText();
+		if (newkey.equals("")) {
+			newkey = key;
+			value = null; // delete the key instead
+		}
+		if (key.equals(newkey) || value == null)
+			Main.main.editLayer().add(new ChangePropertyCommand(sel, newkey, value));
+		else {
+			Main.main.editLayer().add(new SequenceCommand(trn("Change properties of {0} object", "Change properties of {0} objects", sel.size(), sel.size()),
+					new ChangePropertyCommand(sel, key, null),
+					new ChangePropertyCommand(sel, newkey, value)));
+		}
+
+		if (!key.equals(newkey) || value == null)
 			selectionChanged(sel); // update whole table
 
Index: src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 197)
+++ src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 198)
@@ -3,9 +3,19 @@
 import java.awt.BorderLayout;
 import java.awt.Dimension;
+import java.awt.EventQueue;
+import java.awt.GridBagLayout;
 import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
 import java.awt.event.KeyEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
 
 import javax.swing.AbstractButton;
 import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
@@ -14,4 +24,6 @@
 import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.actions.HelpAction.Helpful;
+import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.ImageProvider;
 
 /**
@@ -46,5 +58,9 @@
 	public final String prefName;
 
-	public ToggleDialog(String name, String iconName, String tooltip, int shortCut, int preferredHeight) {
+	public JPanel parent;
+	private final JPanel titleBar = new JPanel(new GridBagLayout());
+
+	public ToggleDialog(final String name, String iconName, String tooltip, int shortCut, int preferredHeight) {
+		super(new BorderLayout());
 		this.prefName = iconName;
 		setPreferredSize(new Dimension(330,preferredHeight));
@@ -53,7 +69,65 @@
 		action.putValue("help", helpId.substring(0, helpId.length()-6));
 		setLayout(new BorderLayout());
-		add(new JLabel(name), BorderLayout.NORTH);
+
+		titleBar.add(new JLabel(name), GBC.std());
+		titleBar.add(Box.createHorizontalGlue(),GBC.std().fill(GBC.HORIZONTAL));
+
+		JButton sticky = new JButton(ImageProvider.get("misc", "sticky"));
+		sticky.setBorder(BorderFactory.createEmptyBorder());
+		final ActionListener stickyActionListener = new ActionListener(){
+			public void actionPerformed(ActionEvent e) {
+				final JFrame f = new JFrame(name);
+				f.setAlwaysOnTop(true);
+				parent.remove(ToggleDialog.this);
+				f.getContentPane().add(ToggleDialog.this);
+				f.addWindowListener(new WindowAdapter(){
+					@Override public void windowClosing(WindowEvent e) {
+						titleBar.setVisible(true);
+						f.getContentPane().removeAll();
+						parent.add(ToggleDialog.this);
+						f.dispose();
+
+						// doLayout() - workaround
+						setVisible(false);
+						setVisible(true);
+
+						Main.pref.put(action.prefname+".docked", true);
+					}
+				});
+				f.addComponentListener(new ComponentAdapter(){
+					@Override public void componentMoved(ComponentEvent e) {
+						Main.pref.put(action.prefname+".bounds", f.getX()+","+f.getY()+","+f.getWidth()+","+f.getHeight());
+                    }
+				});
+				String bounds = Main.pref.get(action.prefname+".bounds",null);
+				if (bounds != null) {
+					String[] b = bounds.split(",");
+					f.setBounds(Integer.parseInt(b[0]),Integer.parseInt(b[1]),Integer.parseInt(b[2]),Integer.parseInt(b[3]));
+				} else
+					f.pack();
+				Main.pref.put(action.prefname+".docked", false);
+				f.setVisible(true);
+				titleBar.setVisible(false);
+
+				// doLayout() - workaround
+				parent.setVisible(false);
+				parent.setVisible(true);
+			}
+		};
+		sticky.addActionListener(stickyActionListener);
+
+		titleBar.add(sticky);
+		add(titleBar, BorderLayout.NORTH);
+
 		setVisible(false);
 		setBorder(BorderFactory.createEtchedBorder());
+
+		if (!Main.pref.getBoolean(action.prefname+".docked", true)) {
+			EventQueue.invokeLater(new Runnable(){
+				public void run() {
+					stickyActionListener.actionPerformed(null);
+                }
+			});
+		}
 	}
 
Index: src/org/openstreetmap/josm/gui/layer/Layer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/Layer.java	(revision 197)
+++ src/org/openstreetmap/josm/gui/layer/Layer.java	(revision 198)
@@ -88,3 +88,13 @@
 	
 	abstract public Component[] getMenuEntries();
+	
+	/**
+	 * Called, when the layer is removed from the mapview and is going to be
+	 * destroyed.
+	 * 
+	 * This is because the Layer constructor can not add itself safely as listener
+	 * to the layerlist dialog, because there may be no such dialog yet (loaded
+	 * via command line parameter).
+	 */
+	public void destroy() {}
 }
Index: src/org/openstreetmap/josm/gui/layer/RawGpsLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/RawGpsLayer.java	(revision 197)
+++ src/org/openstreetmap/josm/gui/layer/RawGpsLayer.java	(revision 198)
@@ -27,5 +27,4 @@
 import javax.swing.JRadioButton;
 import javax.swing.JSeparator;
-import javax.swing.SwingUtilities;
 import javax.swing.filechooser.FileFilter;
 
@@ -42,5 +41,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;
@@ -111,15 +109,4 @@
 		this.data = data;
 		Main.pref.listener.add(this);
-		SwingUtilities.invokeLater(new Runnable(){
-			public void run() {
-				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(RawGpsLayer.this);
-					}
-				});
-			}
-		});
 	}
 
@@ -318,3 +305,7 @@
 			Main.map.repaint();
 	}
+
+	@Override public void destroy() {
+		Main.pref.listener.remove(RawGpsLayer.this);
+    }
 }
