Index: /src/org/openstreetmap/josm/Main.java
===================================================================
--- /src/org/openstreetmap/josm/Main.java	(revision 177)
+++ /src/org/openstreetmap/josm/Main.java	(revision 178)
@@ -43,4 +43,5 @@
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer.CommandQueueListener;
+import org.openstreetmap.josm.gui.preferences.AnnotationPresetPreference;
 import org.openstreetmap.josm.gui.preferences.ToolbarPreferences;
 import org.openstreetmap.josm.plugins.PluginException;
@@ -175,11 +176,13 @@
 		contentPane.add(toolbar.control, BorderLayout.NORTH);
 
-        contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0), "Help");
-        contentPane.getActionMap().put("Help", menu.help);
-
-        toolbar.refreshToolbarControl();
-
-        toolbar.control.updateUI();
-        contentPane.updateUI();
+		contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0), "Help");
+		contentPane.getActionMap().put("Help", menu.help);
+
+		AnnotationPresetPreference.initialize();
+
+		toolbar.refreshToolbarControl();
+
+		toolbar.control.updateUI();
+		contentPane.updateUI();
 	}
 
@@ -189,5 +192,5 @@
 	 */
 	public void loadPlugins() {
-	    if (Main.pref.hasKey("plugins")) {
+		if (Main.pref.hasKey("plugins")) {
 			for (String pluginName : Main.pref.get("plugins").split(",")) {
 				try {
@@ -206,5 +209,5 @@
 			}
 		}
-    }
+	}
 
 	/**
@@ -307,5 +310,5 @@
 			bounds = !args.containsKey("no-fullscreen") ? new Rectangle(0,0,screenDimension.width,screenDimension.height) : new Rectangle(1000,740);
 
-		pleaseWaitDlg = new PleaseWaitDialog();
+			pleaseWaitDlg = new PleaseWaitDialog();
 	}
 
@@ -323,25 +326,25 @@
 
 	public static boolean breakBecauseUnsavedChanges() {
-	    if (map != null) {
-	    	boolean modified = false;
-	    	boolean uploadedModified = false;
-	    	for (final Layer l : map.mapView.getAllLayers()) {
-	    		if (l instanceof OsmDataLayer && ((OsmDataLayer)l).isModified()) {
-	    			modified = true;
-	    			uploadedModified = ((OsmDataLayer)l).uploadedModified;
-	    			break;
-	    		}
-	    	}
-	    	if (modified) {
-	    		final String msg = uploadedModified ? "\n"+tr("Hint: Some changes came from uploading new data to the server.") : "";
-	    		final int answer = JOptionPane.showConfirmDialog(
-	    				parent, tr("There are unsaved changes. Discard the changes and continue?")+msg,
-	    				tr("Unsaved Changes"), JOptionPane.YES_NO_OPTION);
-	    		if (answer != JOptionPane.YES_OPTION)
-	    			return true;
-	    	}
-	    }
-	    return false;
-    }
+		if (map != null) {
+			boolean modified = false;
+			boolean uploadedModified = false;
+			for (final Layer l : map.mapView.getAllLayers()) {
+				if (l instanceof OsmDataLayer && ((OsmDataLayer)l).isModified()) {
+					modified = true;
+					uploadedModified = ((OsmDataLayer)l).uploadedModified;
+					break;
+				}
+			}
+			if (modified) {
+				final String msg = uploadedModified ? "\n"+tr("Hint: Some changes came from uploading new data to the server.") : "";
+				final int answer = JOptionPane.showConfirmDialog(
+						parent, tr("There are unsaved changes. Discard the changes and continue?")+msg,
+						tr("Unsaved Changes"), JOptionPane.YES_NO_OPTION);
+				if (answer != JOptionPane.YES_OPTION)
+					return true;
+			}
+		}
+		return false;
+	}
 
 	private static void downloadFromParamString(final boolean rawGps, String s) {
Index: /src/org/openstreetmap/josm/actions/AboutAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/AboutAction.java	(revision 177)
+++ /src/org/openstreetmap/josm/actions/AboutAction.java	(revision 178)
@@ -55,5 +55,5 @@
 
 	public AboutAction() {
-		super(tr("About"), "about",tr("Display the about screen."), KeyEvent.VK_F1, KeyEvent.SHIFT_DOWN_MASK);
+		super(tr("About"), "about",tr("Display the about screen."), KeyEvent.VK_F1, KeyEvent.SHIFT_DOWN_MASK, true);
 	}
 
Index: /src/org/openstreetmap/josm/actions/AlignInCircleAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/AlignInCircleAction.java	(revision 177)
+++ /src/org/openstreetmap/josm/actions/AlignInCircleAction.java	(revision 178)
@@ -27,5 +27,5 @@
 
 	public AlignInCircleAction() {
-		super(tr("Align Nodes in Circle"), "aligncircle", tr("Move the selected nodes into a circle."), KeyEvent.VK_O, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK);
+		super(tr("Align Nodes in Circle"), "aligncircle", tr("Move the selected nodes into a circle."), KeyEvent.VK_O, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK, true);
 	}
 
Index: /src/org/openstreetmap/josm/actions/AlignInLineAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/AlignInLineAction.java	(revision 177)
+++ /src/org/openstreetmap/josm/actions/AlignInLineAction.java	(revision 178)
@@ -27,5 +27,5 @@
 
 	public AlignInLineAction() {
-		super(tr("Align Nodes in Line"), "alignline", tr("Move the selected nodes onto a line."), KeyEvent.VK_L, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK);
+		super(tr("Align Nodes in Line"), "alignline", tr("Move the selected nodes onto a line."), KeyEvent.VK_L, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK, true);
 	}
 
Index: /src/org/openstreetmap/josm/actions/DiskAccessAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/DiskAccessAction.java	(revision 177)
+++ /src/org/openstreetmap/josm/actions/DiskAccessAction.java	(revision 178)
@@ -39,5 +39,5 @@
 
 	public DiskAccessAction(String name, String iconName, String tooltip, int shortCut, int modifiers) {
-		super(name, iconName, tooltip, shortCut, modifiers);
+		super(name, iconName, tooltip, shortCut, modifiers, true);
 	}
 	
Index: /src/org/openstreetmap/josm/actions/DownloadAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/DownloadAction.java	(revision 177)
+++ /src/org/openstreetmap/josm/actions/DownloadAction.java	(revision 178)
@@ -85,5 +85,5 @@
 
 	public DownloadAction() {
-		super(tr("Download from OSM"), "download", tr("Download map data from the OSM server."), KeyEvent.VK_D, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK);
+		super(tr("Download from OSM"), "download", tr("Download map data from the OSM server."), KeyEvent.VK_D, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK, true);
 		// TODO remove when bug in Java6 is fixed
 		for (JTextField f : latlon)
Index: /src/org/openstreetmap/josm/actions/DownloadIncompleteAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/DownloadIncompleteAction.java	(revision 177)
+++ /src/org/openstreetmap/josm/actions/DownloadIncompleteAction.java	(revision 178)
@@ -60,5 +60,5 @@
 
 	public DownloadIncompleteAction() {
-		super(tr("Download incomplete objects"), "downloadincomplete", tr("Download all (selected) incomplete ways from the OSM server."), KeyEvent.VK_D, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK | InputEvent.ALT_DOWN_MASK);
+		super(tr("Download incomplete objects"), "downloadincomplete", tr("Download all (selected) incomplete ways from the OSM server."), KeyEvent.VK_D, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK | InputEvent.ALT_DOWN_MASK, true);
 	}
 
Index: /src/org/openstreetmap/josm/actions/ExitAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/ExitAction.java	(revision 177)
+++ /src/org/openstreetmap/josm/actions/ExitAction.java	(revision 178)
@@ -16,5 +16,5 @@
 	 */
 	public ExitAction() {
-		super(tr("Exit"), "exit", tr("Exit the application."), KeyEvent.VK_X);
+		super(tr("Exit"), "exit", tr("Exit the application."), KeyEvent.VK_Q, KeyEvent.CTRL_DOWN_MASK, true);
 	}
 	
Index: /src/org/openstreetmap/josm/actions/JosmAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/JosmAction.java	(revision 177)
+++ /src/org/openstreetmap/josm/actions/JosmAction.java	(revision 178)
@@ -16,22 +16,5 @@
 abstract public class JosmAction extends AbstractAction {
 
-	/**
-	 * Construct the action as menu action entry.
-	 *
-	 * @param name		Name of the action (entry name in menu)
-	 * @param iconName	Name of the icon (without extension)
-	 * @param tooltip	Short tooltip description
-	 * @param mnemonic	Mnemonic in the menu
-	 */
-	public JosmAction(String name, String iconName, String tooltip, int mnemonic) {
-		super(name, ImageProvider.get(iconName));
-		putValue(SHORT_DESCRIPTION, tooltip);
-		putValue(MNEMONIC_KEY, mnemonic);
-		putValue("toolbar", iconName);
-		Main.toolbar.register(this);
-	}
-
-
-	public JosmAction(String name, String iconName, String tooltip, int shortCut, int modifier) {
+	public JosmAction(String name, String iconName, String tooltip, int shortCut, int modifier, boolean register) {
 		super(name, ImageProvider.get(iconName));
 		setHelpId();
@@ -40,5 +23,6 @@
         Main.contentPane.getActionMap().put(name, this);
         putValue("toolbar", iconName);
-        Main.toolbar.register(this);
+        if (register)
+        	Main.toolbar.register(this);
 	}
 
Index: /src/org/openstreetmap/josm/actions/NewAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/NewAction.java	(revision 177)
+++ /src/org/openstreetmap/josm/actions/NewAction.java	(revision 178)
@@ -12,5 +12,5 @@
 
 	public NewAction() {
-		super(tr("New"), "new", tr("Create a new map."), KeyEvent.VK_N, InputEvent.CTRL_DOWN_MASK);
+		super(tr("New"), "new", tr("Create a new map."), KeyEvent.VK_N, InputEvent.CTRL_DOWN_MASK, true);
 	}
 
Index: /src/org/openstreetmap/josm/actions/PreferencesAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/PreferencesAction.java	(revision 177)
+++ /src/org/openstreetmap/josm/actions/PreferencesAction.java	(revision 178)
@@ -26,5 +26,5 @@
 	 */
 	public PreferencesAction() {
-		super(tr("Preferences"), "preference", tr("Open a preferences page for global settings."), KeyEvent.VK_F12, 0);
+		super(tr("Preferences"), "preference", tr("Open a preferences page for global settings."), KeyEvent.VK_F12, 0, true);
 	}
 
Index: /src/org/openstreetmap/josm/actions/RedoAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/RedoAction.java	(revision 177)
+++ /src/org/openstreetmap/josm/actions/RedoAction.java	(revision 178)
@@ -21,5 +21,5 @@
 	 */
 	public RedoAction() {
-		super(tr("Redo"), "redo", tr("Redo the last undone action."), KeyEvent.VK_Z, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK);
+		super(tr("Redo"), "redo", tr("Redo the last undone action."), KeyEvent.VK_Z, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK, true);
 		setEnabled(false);
 	}
Index: /src/org/openstreetmap/josm/actions/ReverseSegmentAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/ReverseSegmentAction.java	(revision 177)
+++ /src/org/openstreetmap/josm/actions/ReverseSegmentAction.java	(revision 178)
@@ -24,5 +24,5 @@
 
     public ReverseSegmentAction() {
-    	super(tr("Reverse Segments"), "segmentflip", tr("Revert the direction of all selected Segments."), KeyEvent.VK_R, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK);
+    	super(tr("Reverse Segments"), "segmentflip", tr("Revert the direction of all selected Segments."), KeyEvent.VK_R, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK, true);
     }
 
Index: /src/org/openstreetmap/josm/actions/UndoAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/UndoAction.java	(revision 177)
+++ /src/org/openstreetmap/josm/actions/UndoAction.java	(revision 178)
@@ -21,5 +21,5 @@
 	 */
 	public UndoAction() {
-		super(tr("Undo"), "undo", tr("Undo the last action."), KeyEvent.VK_Z, InputEvent.CTRL_DOWN_MASK);
+		super(tr("Undo"), "undo", tr("Undo the last action."), KeyEvent.VK_Z, InputEvent.CTRL_DOWN_MASK, true);
 		setEnabled(false);
 	}
Index: /src/org/openstreetmap/josm/actions/UploadAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/UploadAction.java	(revision 177)
+++ /src/org/openstreetmap/josm/actions/UploadAction.java	(revision 178)
@@ -34,5 +34,5 @@
 public class UploadAction extends JosmAction {
 	public UploadAction() {
-		super(tr("Upload to OSM"), "upload", tr("Upload all changes to the OSM server."), KeyEvent.VK_U, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK);
+		super(tr("Upload to OSM"), "upload", tr("Upload all changes to the OSM server."), KeyEvent.VK_U, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK, true);
 	}
 
Index: /src/org/openstreetmap/josm/actions/mapmode/MapMode.java
===================================================================
--- /src/org/openstreetmap/josm/actions/mapmode/MapMode.java	(revision 177)
+++ /src/org/openstreetmap/josm/actions/mapmode/MapMode.java	(revision 178)
@@ -28,5 +28,5 @@
 	 */
 	public MapMode(String name, String iconName, String tooltip, int keystroke, MapFrame mapFrame, Cursor cursor) {
-		super(name, "mapmode/"+iconName, tooltip, keystroke, 0);
+		super(name, "mapmode/"+iconName, tooltip, keystroke, 0, false);
 //		this.cursor = cursor;
 		putValue("active", false);
Index: /src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- /src/org/openstreetmap/josm/gui/MapView.java	(revision 177)
+++ /src/org/openstreetmap/josm/gui/MapView.java	(revision 178)
@@ -323,5 +323,5 @@
 		recalculateCenterScale();
 
-		if (!oldCenter.equals(center))
+		if ((oldCenter == null && center != null) || !oldCenter.equals(center))
 			firePropertyChange("center", oldCenter, center);
 		if (oldAutoScale != autoScale)
Index: /src/org/openstreetmap/josm/gui/annotation/AnnotationCellRenderer.java
===================================================================
--- /src/org/openstreetmap/josm/gui/annotation/AnnotationCellRenderer.java	(revision 177)
+++ /src/org/openstreetmap/josm/gui/annotation/AnnotationCellRenderer.java	(revision 178)
@@ -1,10 +1,10 @@
-/**
- * 
- */
 package org.openstreetmap.josm.gui.annotation;
 
 import java.awt.Component;
+import java.awt.Image;
 
+import javax.swing.Action;
 import javax.swing.DefaultListCellRenderer;
+import javax.swing.ImageIcon;
 import javax.swing.JComponent;
 import javax.swing.JLabel;
@@ -15,21 +15,27 @@
 final public class AnnotationCellRenderer extends DefaultListCellRenderer {
 	@Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
-        AnnotationPreset a = (AnnotationPreset)value;
-    	if (a == null || a.name == null)
-        	return super.getListCellRendererComponent(list, "", index, false, false);
-    	JComponent c = (JComponent)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
-        JLabel l = new JLabel((a).name);
-        l.setForeground(c.getForeground());
-        l.setBackground(c.getBackground());
-        l.setFont(c.getFont());
-        l.setBorder(c.getBorder());
-        if (a.types == null)
-        	l.setIcon(ImageProvider.get("data", "empty"));
-        else if (a.types.size() != 1)
-        	l.setIcon(ImageProvider.get("data", "object"));
-        else
-        	l.setIcon(ImageProvider.get("data", a.types.iterator().next().getSimpleName().toLowerCase()));
-        l.setOpaque(true);
-        return l;
-    }
+		AnnotationPreset a = ((ForwardActionListener)value).preset;
+		String name = a == null ? null : (String)a.getValue(Action.NAME);
+		if (name == null)
+			return super.getListCellRendererComponent(list, "", index, false, false);
+		JComponent c = (JComponent)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
+		JLabel l = new JLabel(name);
+		l.setForeground(c.getForeground());
+		l.setBackground(c.getBackground());
+		l.setFont(c.getFont());
+		l.setBorder(c.getBorder());
+		ImageIcon icon = (ImageIcon)a.getValue(Action.SMALL_ICON);
+		if (icon != null)
+			l.setIcon(new ImageIcon(icon.getImage().getScaledInstance(16, 16, Image.SCALE_SMOOTH)));
+		else {
+			if (a.types == null)
+				l.setIcon(ImageProvider.get("data", "empty"));
+			else if (a.types.size() != 1)
+				l.setIcon(ImageProvider.get("data", "object"));
+			else
+				l.setIcon(ImageProvider.get("data", a.types.iterator().next().getSimpleName().toLowerCase()));
+		}
+		l.setOpaque(true);
+		return l;
+	}
 }
Index: /src/org/openstreetmap/josm/gui/annotation/AnnotationPreset.java
===================================================================
--- /src/org/openstreetmap/josm/gui/annotation/AnnotationPreset.java	(revision 177)
+++ /src/org/openstreetmap/josm/gui/annotation/AnnotationPreset.java	(revision 178)
@@ -5,19 +5,28 @@
 
 import java.awt.GridBagLayout;
+import java.awt.Image;
+import java.awt.event.ActionEvent;
 import java.io.BufferedReader;
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.UnsupportedEncodingException;
+import java.net.URL;
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
-
+import java.util.StringTokenizer;
+
+import javax.swing.AbstractAction;
+import javax.swing.ImageIcon;
 import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
 import javax.swing.JLabel;
+import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JTextField;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.ChangePropertyCommand;
 import org.openstreetmap.josm.command.Command;
@@ -38,5 +47,5 @@
  * It is also able to construct dialogs out of preset definitions.
  */
-public class AnnotationPreset {
+public class AnnotationPreset extends AbstractAction {
 
 	private static interface Item {
@@ -146,4 +155,5 @@
 		String currentName;
 		Collection<Class<?>> currentTypes;
+		ImageIcon currentIcon;
 		private static int unknownCounter = 1;
 
@@ -170,4 +180,5 @@
 					}
 				}
+				currentIcon = (a.getValue("icon") == null) ? null : new ImageIcon(a.getValue("icon"));
 			} else if (qname.equals("text"))
 				current.add(new Text(a.getValue("key"), a.getValue("text"), a.getValue("default"), parseBoolean(a.getValue("delete_if_empty"))));
@@ -201,13 +212,14 @@
 
 		private boolean parseBoolean(String s) {
-	        return s == null || s.equals("0") || s.startsWith("off") || s.startsWith("false") || s.startsWith("no");
-        }
+			return s == null || s.equals("0") || s.startsWith("off") || s.startsWith("false") || s.startsWith("no");
+		}
 
 		@Override public void endElement(String ns, String lname, String qname) {
 			if (qname.equals("item")) {
-				data.add(new AnnotationPreset(current, currentName, currentTypes));
+				data.add(new AnnotationPreset(current, currentName, currentIcon, currentTypes));
 				current = null;
 				currentName = null;
 				currentTypes = null;
+				currentIcon = null;
 			}
 		}
@@ -215,11 +227,12 @@
 
 	private List<Item> data;
-	public String name;
 	public Collection<Class<?>> types;
-
-	public AnnotationPreset(List<Item> data, String name, Collection<Class<?>> currentTypes) {
+	
+	public AnnotationPreset(List<Item> data, String name, ImageIcon icon, Collection<Class<?>> currentTypes) {
+		super(name, icon == null ? null : new ImageIcon(icon.getImage().getScaledInstance(24, 24, Image.SCALE_SMOOTH)));
+		putValue("toolbar", "annotation_"+name);
 		this.data = data;
-		this.name = name;
 		this.types = currentTypes;
+		Main.toolbar.register(this);
 	}
 
@@ -244,4 +257,32 @@
 	}
 
+	public static Collection<AnnotationPreset> readFromPreferences() {
+		LinkedList<AnnotationPreset> allPresets = new LinkedList<AnnotationPreset>();
+		String allAnnotations = Main.pref.get("annotation.sources");
+		StringTokenizer st = new StringTokenizer(allAnnotations, ";");
+		while (st.hasMoreTokens()) {
+			InputStream in = null;
+			String source = st.nextToken();
+			try {
+				if (source.startsWith("http") || source.startsWith("ftp") || source.startsWith("file"))
+					in = new URL(source).openStream();
+				else if (source.startsWith("resource://"))
+					in = Main.class.getResourceAsStream(source.substring("resource:/".length()));
+				else
+					in = new FileInputStream(source);
+				allPresets.addAll(AnnotationPreset.readAll(in));
+				in.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+				JOptionPane.showMessageDialog(Main.parent, tr("Could not read annotation preset source: {0}",source));
+			} catch (SAXException e) {
+				e.printStackTrace();
+				JOptionPane.showMessageDialog(Main.parent, tr("Error parsing {0}: ", source)+e.getMessage());
+			}
+		}
+		return allPresets;
+	}
+
+	
 	public JPanel createPanel() {
 		if (data == null)
@@ -253,5 +294,23 @@
 	}
 
-	public Command createCommand(Collection<OsmPrimitive> participants) {
+	public void actionPerformed(ActionEvent e) {
+		Collection<OsmPrimitive> sel = Main.ds.getSelected();
+		JPanel p = createPanel();
+		if (p == null)
+			return;
+		int answer;
+		if (p.getComponentCount() == 0)
+			answer = JOptionPane.OK_OPTION;
+		else
+			answer = JOptionPane.showConfirmDialog(Main.parent, p, trn("Change {0} object", "Change {0} objects", sel.size(), sel.size()), JOptionPane.OK_CANCEL_OPTION);
+		if (answer == JOptionPane.OK_OPTION) {
+			Command cmd = createCommand(Main.ds.getSelected());
+			if (cmd != null)
+				Main.main.editLayer().add(cmd);
+		}
+		Main.ds.setSelected(Main.ds.getSelected()); // force update
+	}
+
+	private Command createCommand(Collection<OsmPrimitive> participants) {
 		Collection<OsmPrimitive> sel = new LinkedList<OsmPrimitive>();
 		for (OsmPrimitive osm : participants)
Index: /src/org/openstreetmap/josm/gui/annotation/ForwardActionListener.java
===================================================================
--- /src/org/openstreetmap/josm/gui/annotation/ForwardActionListener.java	(revision 178)
+++ /src/org/openstreetmap/josm/gui/annotation/ForwardActionListener.java	(revision 178)
@@ -0,0 +1,28 @@
+package org.openstreetmap.josm.gui.annotation;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import org.openstreetmap.josm.gui.dialogs.PropertiesDialog;
+
+/**
+ * Just an ActionListener that forwards calls to actionPerformed to some other
+ * listener doing some refresh stuff on the way.
+ * @author imi
+ */
+public final class ForwardActionListener implements ActionListener {
+	public final AnnotationPreset preset;
+
+	private final PropertiesDialog propertiesDialog;
+
+	public ForwardActionListener(PropertiesDialog propertiesDialog, AnnotationPreset preset) {
+		this.propertiesDialog = propertiesDialog;
+		this.preset = preset;
+	}
+
+	public void actionPerformed(ActionEvent e) {
+		this.propertiesDialog.annotationPresets.setSelectedIndex(0);
+		e.setSource(this);
+		preset.actionPerformed(e);
+	}
+}
Index: /src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java
===================================================================
--- /src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 177)
+++ /src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 178)
@@ -14,12 +14,7 @@
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.StringTokenizer;
 import java.util.TreeMap;
 import java.util.TreeSet;
@@ -43,5 +38,4 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.ChangePropertyCommand;
-import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -49,6 +43,7 @@
 import org.openstreetmap.josm.gui.annotation.AnnotationCellRenderer;
 import org.openstreetmap.josm.gui.annotation.AnnotationPreset;
+import org.openstreetmap.josm.gui.annotation.ForwardActionListener;
+import org.openstreetmap.josm.gui.preferences.AnnotationPresetPreference;
 import org.openstreetmap.josm.tools.ImageProvider;
-import org.xml.sax.SAXException;
 
 /**
@@ -214,5 +209,6 @@
 	 */
 	private final JTable propertyTable = new JTable(data);
-	private JComboBox annotationPresets = new JComboBox();
+	public JComboBox annotationPresets = new JComboBox();
+
 
 	/**
@@ -222,29 +218,10 @@
 		super(tr("Properties"), "propertiesdialog", tr("Property for selected objects."), KeyEvent.VK_P, 150);
 
-		Vector<AnnotationPreset> allPresets = new Vector<AnnotationPreset>();
-		String allAnnotations = Main.pref.get("annotation.sources");
-		StringTokenizer st = new StringTokenizer(allAnnotations, ";");
-		while (st.hasMoreTokens()) {
-			InputStream in = null;
-			String source = st.nextToken();
-			try {
-				if (source.startsWith("http") || source.startsWith("ftp") || source.startsWith("file"))
-					in = new URL(source).openStream();
-				else if (source.startsWith("resource://"))
-					in = Main.class.getResourceAsStream(source.substring("resource:/".length()));
-				else
-					in = new FileInputStream(source);
-				allPresets.addAll(AnnotationPreset.readAll(in));
-				in.close();
-			} catch (IOException e) {
-				e.printStackTrace();
-				JOptionPane.showMessageDialog(Main.parent, tr("Could not read annotation preset source: {0}",source));
-			} catch (SAXException e) {
-				e.printStackTrace();
-				JOptionPane.showMessageDialog(Main.parent, tr("Error parsing {0}: ", source)+e.getMessage());
-			}
-		}
-		if (allPresets.size() > 0) {
-			allPresets.add(0, new AnnotationPreset());
+		if (AnnotationPresetPreference.annotationPresets.size() > 0) {
+			Vector<ActionListener> allPresets = new Vector<ActionListener>();
+			for (final AnnotationPreset p : AnnotationPresetPreference.annotationPresets)
+				allPresets.add(new ForwardActionListener(this, p));
+
+			allPresets.add(0, new ForwardActionListener(this, new AnnotationPreset()));
 			annotationPresets.setModel(new DefaultComboBoxModel(allPresets));
 			add(annotationPresets, BorderLayout.NORTH);
@@ -252,22 +229,6 @@
 		annotationPresets.addActionListener(new ActionListener(){
 			public void actionPerformed(ActionEvent e) {
-				Collection<OsmPrimitive> sel = Main.ds.getSelected();
-				AnnotationPreset preset = (AnnotationPreset)annotationPresets.getSelectedItem();
-				JPanel p = preset.createPanel();
-				if (p == null)
-					return;
-				int answer;
-				if (p.getComponentCount() == 0)
-					answer = JOptionPane.OK_OPTION;
-				else
-					answer = JOptionPane.showConfirmDialog(Main.parent, p, trn("Change {0} object", "Change {0} objects", sel.size(), sel.size()), JOptionPane.OK_CANCEL_OPTION);
-				if (answer == JOptionPane.OK_OPTION) {
-					Command cmd = preset.createCommand(sel);
-					if (cmd != null) {
-						Main.main.editLayer().add(cmd);
-						selectionChanged(sel); // update whole table
-					}
-				}
-				annotationPresets.setSelectedIndex(0);
+				AnnotationPreset preset = ((ForwardActionListener)annotationPresets.getSelectedItem()).preset;
+				preset.actionPerformed(e);
 			}
 		});
Index: /src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
===================================================================
--- /src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 177)
+++ /src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 178)
@@ -24,19 +24,19 @@
 
 	public final class ToggleDialogAction extends JosmAction {
-	    public final String prefname;
-	    public AbstractButton button;
+		public final String prefname;
+		public AbstractButton button;
 
-	    private ToggleDialogAction(String name, String iconName, String tooltip, int shortCut, int modifier, String prefname) {
-		    super(name, iconName, tooltip, shortCut, modifier);
-		    this.prefname = prefname;
-	    }
+		private ToggleDialogAction(String name, String iconName, String tooltip, int shortCut, int modifier, String prefname) {
+			super(name, iconName, tooltip, shortCut, modifier, false);
+			this.prefname = prefname;
+		}
 
-	    public void actionPerformed(ActionEvent e) {
-	    	if (e != null && !(e.getSource() instanceof AbstractButton))
-	    		button.setSelected(!button.isSelected());
-	    	setVisible(button.isSelected());
-	        Main.pref.put(prefname+".visible", button.isSelected());
-	    }
-    }
+		public void actionPerformed(ActionEvent e) {
+			if (e != null && !(e.getSource() instanceof AbstractButton))
+				button.setSelected(!button.isSelected());
+			setVisible(button.isSelected());
+			Main.pref.put(prefname+".visible", button.isSelected());
+		}
+	}
 
 	/**
@@ -61,5 +61,5 @@
 		String help = getClass().getName();
 		help = help.substring(help.lastIndexOf('.')+1, help.length()-6);
-	    return "Dialog/"+help;
-    }
+		return "Dialog/"+help;
+	}
 }
Index: /src/org/openstreetmap/josm/gui/preferences/AnnotationPresetPreference.java
===================================================================
--- /src/org/openstreetmap/josm/gui/preferences/AnnotationPresetPreference.java	(revision 177)
+++ /src/org/openstreetmap/josm/gui/preferences/AnnotationPresetPreference.java	(revision 178)
@@ -6,4 +6,5 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.util.Collection;
 import java.util.StringTokenizer;
 
@@ -18,11 +19,14 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.annotation.AnnotationPreset;
 import org.openstreetmap.josm.tools.GBC;
 
 public class AnnotationPresetPreference implements PreferenceSetting {
 
-	private JList annotationSources = new JList(new DefaultListModel());
+	public static Collection<AnnotationPreset> annotationPresets;
+	private JList annotationSources;
 
 	public void addGui(final PreferenceDialog gui) {
+		annotationSources = new JList(new DefaultListModel());
 		String annos = Main.pref.get("annotation.sources");
 		StringTokenizer st = new StringTokenizer(annos, ";");
@@ -92,3 +96,10 @@
 			Main.pref.put("annotation.sources", null);
 	}
+
+	/** 
+	 * Initialize the annotation presets (load and may display error)
+	 */
+	public static void initialize() {
+		annotationPresets = AnnotationPreset.readFromPreferences();
+	}
 }
Index: /src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
===================================================================
--- /src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java	(revision 177)
+++ /src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java	(revision 178)
@@ -82,4 +82,8 @@
 	private Move moveAction = new Move();
 
+	/**
+	 * Key: Registered name (property "toolbar" of action).
+	 * Value: The action to execute.
+	 */
 	private Map<String, Action> actions = new HashMap<String, Action>();
 
Index: /src/org/openstreetmap/josm/tools/ShortCutLabel.java
===================================================================
--- /src/org/openstreetmap/josm/tools/ShortCutLabel.java	(revision 177)
+++ /src/org/openstreetmap/josm/tools/ShortCutLabel.java	(revision 178)
@@ -9,11 +9,11 @@
 	public static String name(int shortCut, int modifiers) {
 		String s = "";
-		if ((modifiers & KeyEvent.CTRL_MASK) != 0)
+		if ((modifiers & KeyEvent.CTRL_MASK) != 0 || (modifiers & KeyEvent.CTRL_DOWN_MASK) != 0)
 			s += tr("Ctrl-");
-		if ((modifiers & KeyEvent.ALT_MASK) != 0)
+		if ((modifiers & KeyEvent.ALT_MASK) != 0 || (modifiers & KeyEvent.ALT_DOWN_MASK) != 0)
 			s += tr("Alt-");
-		if ((modifiers & KeyEvent.ALT_GRAPH_MASK) != 0)
+		if ((modifiers & KeyEvent.ALT_GRAPH_MASK) != 0 || (modifiers & KeyEvent.ALT_GRAPH_DOWN_MASK) != 0)
 			s += tr("AltGr-");
-		if ((modifiers & KeyEvent.SHIFT_MASK) != 0)
+		if ((modifiers & KeyEvent.SHIFT_MASK) != 0 || (modifiers & KeyEvent.SHIFT_DOWN_MASK) != 0)
 			s += tr("Shift-");
 		if (shortCut >= KeyEvent.VK_F1 && shortCut <= KeyEvent.VK_F12)
Index: /start.html
===================================================================
--- /start.html	(revision 177)
+++ /start.html	(revision 178)
@@ -1,5 +1,5 @@
 <applet 
   code="org/openstreetmap/josm/gui/MainApplet.class" 
-  archive="bin/,lib/gettext-commons-0.9.jar,lib/metadata-extractor-2.3.1.jar,lib/MinML2.jar" 
+  archive="dist/josm-custom.jar,lib/gettext-commons-0.9.jar,lib/metadata-extractor-2.3.1.jar,lib/MinML2.jar" 
   width="800" 
   height="600"
