Index: /trunk/src/org/openstreetmap/josm/actions/AboutAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/AboutAction.java	(revision 1049)
+++ /trunk/src/org/openstreetmap/josm/actions/AboutAction.java	(revision 1050)
@@ -68,5 +68,5 @@
 
 	public AboutAction() {
-		super(tr("About"), "about", tr("Display the about screen."), ShortCut.registerShortCut("system:about", tr("About..."), KeyEvent.VK_F1, ShortCut.GROUP_DIRECT), true);
+		super(tr("About"), "about", tr("Display the about screen."), ShortCut.registerShortCut("system:about", tr("About..."), KeyEvent.VK_F1, ShortCut.GROUP_DIRECT, ShortCut.SHIFT), true);
 	}
 
Index: /trunk/src/org/openstreetmap/josm/actions/CreateCircleAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/CreateCircleAction.java	(revision 1049)
+++ /trunk/src/org/openstreetmap/josm/actions/CreateCircleAction.java	(revision 1050)
@@ -36,5 +36,5 @@
 	public CreateCircleAction() {
 		super(tr("Create Circle"), "createcircle", tr("Create a circle from three selected nodes."),
-		ShortCut.registerShortCut("tools:createcircle", tr("Tool: Create circle"), KeyEvent.VK_O, ShortCut.GROUP_EDIT), true);
+		ShortCut.registerShortCut("tools:createcircle", tr("Tool: Create circle"), KeyEvent.VK_O, ShortCut.GROUP_EDIT, ShortCut.SHIFT), true);
 	}
 
Index: /trunk/src/org/openstreetmap/josm/actions/PasteTagsAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/PasteTagsAction.java	(revision 1049)
+++ /trunk/src/org/openstreetmap/josm/actions/PasteTagsAction.java	(revision 1050)
@@ -27,5 +27,5 @@
 		super(tr("Paste Tags"), "pastetags",
 			tr("Apply tags of contents of paste buffer to all selected items."),
-			ShortCut.registerShortCut("system:pastestyle", tr("Edit: Paste tags"), KeyEvent.VK_V, ShortCut.GROUP_MENU), true);
+			ShortCut.registerShortCut("system:pastestyle", tr("Edit: Paste tags"), KeyEvent.VK_V, ShortCut.GROUP_MENU, ShortCut.SHIFT_CTRL), true);
 		DataSet.selListeners.add(this);
 		copyAction.addListener(this);
Index: /trunk/src/org/openstreetmap/josm/actions/SaveAsAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/SaveAsAction.java	(revision 1049)
+++ /trunk/src/org/openstreetmap/josm/actions/SaveAsAction.java	(revision 1050)
@@ -23,5 +23,5 @@
 	public SaveAsAction(Layer layer) {
 		super(tr("Save as ..."), "save_as", tr("Save the current data to a new file."),
-		ShortCut.registerShortCut("system:saveas", tr("File: Save as..."), KeyEvent.VK_S, ShortCut.GROUP_MENU), layer);
+		ShortCut.registerShortCut("system:saveas", tr("File: Save as..."), KeyEvent.VK_S, ShortCut.GROUP_MENU, ShortCut.SHIFT_CTRL), layer);
 	}
 
Index: /trunk/src/org/openstreetmap/josm/actions/UnselectAllAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/UnselectAllAction.java	(revision 1049)
+++ /trunk/src/org/openstreetmap/josm/actions/UnselectAllAction.java	(revision 1050)
@@ -21,5 +21,6 @@
 		// Add extra shortcut C-S-a
 		Main.contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
-		ShortCut.registerShortCut("edit:unselectall2", tr("Edit: Unselect all (2)"), KeyEvent.VK_A, ShortCut.GROUP_MENU).getKeyStroke(),
+		ShortCut.registerShortCut("edit:unselectall2", tr("Edit: Unselect all (2)"),
+		KeyEvent.VK_A, ShortCut.GROUP_MENU, ShortCut.SHIFT_CTRL).getKeyStroke(),
 		tr("Unselect All"));
 
Index: /trunk/src/org/openstreetmap/josm/actions/audio/AudioSlowerAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/audio/AudioSlowerAction.java	(revision 1049)
+++ /trunk/src/org/openstreetmap/josm/actions/audio/AudioSlowerAction.java	(revision 1050)
@@ -11,5 +11,5 @@
 	public AudioSlowerAction() {
 		super(tr("Slower"), "audio-slower", tr("Slower Forward"),
-		ShortCut.registerShortCut("audio:slower", tr("Audio: Slower"), KeyEvent.VK_F9, ShortCut.GROUP_DIRECT), true);
+		ShortCut.registerShortCut("audio:slower", tr("Audio: Slower"), KeyEvent.VK_F4, ShortCut.GROUP_DIRECT), true);
 	}
 }
Index: /trunk/src/org/openstreetmap/josm/tools/ShortCut.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/ShortCut.java	(revision 1049)
+++ /trunk/src/org/openstreetmap/josm/tools/ShortCut.java	(revision 1050)
@@ -29,4 +29,7 @@
  */
 public class ShortCut {
+	public static final int SHIFT = KeyEvent.SHIFT_DOWN_MASK;
+	public static final int CTRL = KeyEvent.CTRL_DOWN_MASK;
+	public static final int SHIFT_CTRL = KeyEvent.SHIFT_DOWN_MASK|KeyEvent.CTRL_DOWN_MASK;
 	private String shortText;        // the unique ID of the shortcut
 	private String longText;         // a human readable description that will be shown in the preferences
@@ -306,5 +309,5 @@
 		int i = 0;
 		for (ShortCut sc : ShortCuts.values()) {
-			if (!sc.getAutomatic() && !sc.getReset()) {
+			if (!sc.getAutomatic() && !sc.getReset() && sc.getAssignedUser()) {
 				Main.pref.put("shortcut.shortcut."+i, sc.asPrefString());
 				i++;
@@ -316,16 +319,5 @@
 	// this is used to register a shortcut that was read from the preferences
 	private static void registerShortCut(ShortCut sc) {
-		if (sc.getAssignedDefault()) { // a 100% default shortcut will go though unchanged -- unless the groups have been reconfigured
-			registerShortCut(sc.getShortText(), sc.getLongText(), sc.getRequestedKey(), sc.getRequestedGroup(), sc);
-		} else if (sc.getAssignedUser()) { // put a user configured shortcut in as-is -- unless there's a conflict
-			ShortCut potentialShortCut = findShortcut(sc.getAssignedKey(), sc.getAssignedModifier());
-			if (potentialShortCut == null) {
-				ShortCuts.put(sc.getShortText(), sc);
-			} else {
-				registerShortCut(sc.getShortText(), sc.getLongText(), sc.getRequestedKey(), sc.getRequestedGroup(), sc);
-			}
-		} else { // this shortcut was auto-moved before, re-register and warn if it changes
-			registerShortCut(sc.getShortText(), sc.getLongText(), sc.getRequestedKey(), sc.getRequestedGroup(), sc);
-		}
+		registerShortCut(sc.getShortText(), sc.getLongText(), sc.getRequestedKey(), sc.getRequestedGroup(), sc.getAssignedModifier(), sc);
 	}
 
@@ -367,6 +359,14 @@
 	 *                  constants defined above.
 	 */
+	public static ShortCut registerShortCut(String shortText, String longText, int requestedKey, int requestedGroup, int modifier) {
+		return registerShortCut(shortText, longText, requestedKey, requestedGroup, modifier, null);
+	}
 	public static ShortCut registerShortCut(String shortText, String longText, int requestedKey, int requestedGroup) {
-		return registerShortCut(shortText, longText, requestedKey, requestedGroup, null);
+		return registerShortCut(shortText, longText, requestedKey, requestedGroup, null, null);
+	}
+
+	private static ShortCut registerShortCut(String shortText, String longText, int requestedKey, int requestedGroup,
+        ShortCut originalShortCut) {
+		return registerShortCut(shortText, longText, requestedKey, requestedGroup, null, originalShortCut);
 	}
 
@@ -376,5 +376,6 @@
 	// read from the preferences file). New shortcuts will never warn, even when they land on some funny
 	// random fallback key like Ctrl+Alt+Shift+Z for "File Open..." <g>
-	private static ShortCut registerShortCut(String shortText, String longText, int requestedKey, int requestedGroup, ShortCut originalShortCut) {
+	private static ShortCut registerShortCut(String shortText, String longText, int requestedKey, int requestedGroup, Integer modifier,
+        ShortCut originalShortCut) {
 		doInit();
 		if (ShortCuts.containsKey(shortText)) { // a re-register? maybe a sc already read from the preferences?
@@ -384,5 +385,8 @@
 		}
 		Integer defaultModifier = Groups.get(requestedGroup + GROUPS_DEFAULT);
-		if (defaultModifier == null) { // garbage in, no shortcurt out
+		if(modifier != null) {
+			defaultModifier = modifier;
+		}
+		else if (defaultModifier == null) { // garbage in, no shortcurt out
 			defaultModifier = Groups.get(GROUP_NONE + GROUPS_DEFAULT);
 		}
