Index: trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- trunk/src/org/openstreetmap/josm/Main.java	(revision 4896)
+++ trunk/src/org/openstreetmap/josm/Main.java	(revision 4897)
@@ -76,4 +76,5 @@
 import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
 import org.openstreetmap.josm.gui.progress.ProgressMonitorExecutor;
+import org.openstreetmap.josm.gui.util.RedirectInputMap;
 import org.openstreetmap.josm.io.OsmApi;
 import org.openstreetmap.josm.plugins.PluginHandler;
@@ -378,9 +379,7 @@
     protected static final JPanel contentPanePrivate = new JPanel(new BorderLayout());
 
-    /**
-     * @deprecated If you just need to register shortcut for action, use registerActionShortcut instead of accessing InputMap directly
-     */
-    @Deprecated
-    public static final JPanel contentPane = contentPanePrivate;
+    public static void redirectToMainContentPane(JComponent source) {
+        RedirectInputMap.redirect(source, contentPanePrivate);
+    }
 
     public static void registerActionShortcut(Action action, Shortcut shortcut) {
@@ -843,10 +842,8 @@
     /**
      * The projection method used.
-     * @deprecated use {@link #getProjection()} and {@link #setProjection(Projection)} instead.
-     * For the time being still publicly available, but avoid/migrate write access to it. Use
-     * {@link #setProjection(Projection)} in order to trigger a projection change event.
-     */
-    @Deprecated
-    public static Projection proj;
+     * use {@link #getProjection()} and {@link #setProjection(Projection)} for access.
+     * Use {@link #setProjection(Projection)} in order to trigger a projection change event.
+     */
+    private static Projection proj;
 
     /**
Index: trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 4896)
+++ trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 4897)
@@ -666,9 +666,4 @@
     }
 
-    @Deprecated
-    public final Node getNearestNode(Point p) {
-        return getNearestNode(p, OsmPrimitive.isUsablePredicate);
-    }
-
     /**
      * The *result* does not depend on the current map selection state,
@@ -887,9 +882,4 @@
     }
 
-    @Deprecated
-    public final Way getNearestWay(Point p) {
-        return getNearestWay(p, OsmPrimitive.isUsablePredicate);
-    }
-
     /**
      * The *result* does not depend on the current map selection state,
@@ -1025,14 +1015,4 @@
 
         return osm;
-    }
-
-    @Deprecated
-    public final OsmPrimitive getNearest(Point p, Predicate<OsmPrimitive> predicate) {
-        return getNearestNodeOrWay(p, predicate, false);
-    }
-
-    @Deprecated
-    public final Collection<OsmPrimitive> getNearestCollection(Point p, Predicate<OsmPrimitive> predicate) {
-        return asColl(getNearest(p, predicate));
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 4896)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 4897)
@@ -47,5 +47,4 @@
 import org.openstreetmap.josm.gui.help.Helpful;
 import org.openstreetmap.josm.gui.ShowHideButtonListener;
-import org.openstreetmap.josm.gui.util.RedirectInputMap;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.tools.GBC;
@@ -150,5 +149,5 @@
         setBorder(BorderFactory.createEtchedBorder());
 
-        RedirectInputMap.redirectToMainContentPane(this);
+        Main.redirectToMainContentPane(this);
 
         windowMenuItem = MainMenu.addWithCheckbox(Main.main.menu.windowMenu,
Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java	(revision 4896)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java	(revision 4897)
@@ -94,5 +94,5 @@
         btnDelete.setPreferredSize(buttonDim);
         Shortcut scDelete = Shortcut.registerShortcut(
-                "geoimage:deleteimagefromlayer", tr("Geoimage: {0}", tr("Remove photo from layer")), KeyEvent.VK_DELETE, Shortcut.GROUP_DIRECT, Shortcut.SHIFT_DEFAULT);
+                "geoimage:deleteimagefromlayer", tr("Geoimage: {0}", tr("Remove photo from layer")), KeyEvent.VK_DELETE, Shortcut.GROUPS_ALT1+Shortcut.GROUP_DIRECT);
         Main.registerActionShortcut(delAction, scDelete);
         btnDelete.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(scDelete.getKeyStroke(), DELETE_TEXT);
@@ -103,5 +103,5 @@
         btnDeleteFromDisk.setPreferredSize(buttonDim);
         Shortcut scDeleteFromDisk = Shortcut.registerShortcut(
-                "geoimage:deletefilefromdisk", tr("Geoimage: {0}", tr("Delete File from disk")), KeyEvent.VK_DELETE, Shortcut.GROUP_DIRECT, KeyEvent.SHIFT_DOWN_MASK|KeyEvent.CTRL_DOWN_MASK);
+                "geoimage:deletefilefromdisk", tr("Geoimage: {0}", tr("Delete File from disk")), KeyEvent.VK_DELETE, Shortcut.GROUPS_ALT1+Shortcut.GROUP_HOTKEY);
         final String ADELFROMDISK = "Delete image file from disk";
         Main.registerActionShortcut(delFromDiskAction, scDeleteFromDisk);
Index: trunk/src/org/openstreetmap/josm/gui/preferences/PrefJPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/PrefJPanel.java	(revision 4896)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/PrefJPanel.java	(revision 4897)
@@ -6,4 +6,5 @@
 import java.awt.event.KeyEvent;
 import java.util.LinkedHashMap;
+import java.util.HashMap;
 import java.util.Map;
 
@@ -459,41 +460,42 @@
     private class bxAction extends javax.swing.AbstractAction {
         public void actionPerformed(java.awt.event.ActionEvent e) {
-            Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_EDIT),    Integer.toString( modifInts[bxPrim1.getSelectedIndex()] ));
-            Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1   +Shortcut.GROUP_EDIT),    Integer.toString( modifInts[ bxSec1.getSelectedIndex()] ));
-            Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2   +Shortcut.GROUP_EDIT),    Integer.toString( modifInts[ bxTer1.getSelectedIndex()] ));
-
-            Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MENU),    Integer.toString( modifInts[bxPrim2.getSelectedIndex()] ));
-            Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1   +Shortcut.GROUP_MENU),    Integer.toString( modifInts[ bxSec2.getSelectedIndex()] ));
-            Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2   +Shortcut.GROUP_MENU),    Integer.toString( modifInts[ bxTer2.getSelectedIndex()] ));
-
-            Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_HOTKEY),  Integer.toString( modifInts[bxPrim3.getSelectedIndex()] ));
-            Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1   +Shortcut.GROUP_HOTKEY),  Integer.toString( modifInts[ bxSec3.getSelectedIndex()] ));
-            Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2   +Shortcut.GROUP_HOTKEY),  Integer.toString( modifInts[ bxTer3.getSelectedIndex()] ));
-
-            Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_LAYER),   Integer.toString( modifInts[bxPrim4.getSelectedIndex()] ));
-            Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1   +Shortcut.GROUP_LAYER),   Integer.toString( modifInts[ bxSec4.getSelectedIndex()] ));
-            Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2   +Shortcut.GROUP_LAYER),   Integer.toString( modifInts[ bxTer4.getSelectedIndex()] ));
+            Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_EDIT),    modifInts[bxPrim1.getSelectedIndex()]);
+            Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT1   +Shortcut.GROUP_EDIT),    modifInts[ bxSec1.getSelectedIndex()]);
+            Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT2   +Shortcut.GROUP_EDIT),    modifInts[ bxTer1.getSelectedIndex()]);
+
+            Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MENU),    modifInts[bxPrim2.getSelectedIndex()]);
+            Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT1   +Shortcut.GROUP_MENU),    modifInts[ bxSec2.getSelectedIndex()]);
+            Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT2   +Shortcut.GROUP_MENU),    modifInts[ bxTer2.getSelectedIndex()]);
+
+            Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_HOTKEY),  modifInts[bxPrim3.getSelectedIndex()]);
+            Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT1   +Shortcut.GROUP_HOTKEY),  modifInts[ bxSec3.getSelectedIndex()]);
+            Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT2   +Shortcut.GROUP_HOTKEY),  modifInts[ bxTer3.getSelectedIndex()]);
+
+            Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_LAYER),   modifInts[bxPrim4.getSelectedIndex()]);
+            Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT1   +Shortcut.GROUP_LAYER),   modifInts[ bxSec4.getSelectedIndex()]);
+            Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT2   +Shortcut.GROUP_LAYER),   modifInts[ bxTer4.getSelectedIndex()]);
         }
     }
 
     private void initbx() {
-        setBx(bxPrim1, "shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_EDIT));
-        setBx(bxSec1,  "shortcut.groups."+(Shortcut.GROUPS_ALT1   +Shortcut.GROUP_EDIT));
-        setBx(bxTer1,  "shortcut.groups."+(Shortcut.GROUPS_ALT2   +Shortcut.GROUP_EDIT));
-
-        setBx(bxPrim2, "shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MENU));
-        setBx(bxSec2,  "shortcut.groups."+(Shortcut.GROUPS_ALT1   +Shortcut.GROUP_MENU));
-        setBx(bxTer2,  "shortcut.groups."+(Shortcut.GROUPS_ALT2   +Shortcut.GROUP_MENU));
-
-        setBx(bxPrim3, "shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_HOTKEY));
-        setBx(bxSec3,  "shortcut.groups."+(Shortcut.GROUPS_ALT1   +Shortcut.GROUP_HOTKEY));
-        setBx(bxTer3,  "shortcut.groups."+(Shortcut.GROUPS_ALT2   +Shortcut.GROUP_HOTKEY));
-
-        setBx(bxPrim4, "shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_LAYER));
-        setBx(bxSec4,  "shortcut.groups."+(Shortcut.GROUPS_ALT1   +Shortcut.GROUP_LAYER));
-        setBx(bxTer4,  "shortcut.groups."+(Shortcut.GROUPS_ALT2   +Shortcut.GROUP_LAYER));
-    }
-    private void setBx(javax.swing.JComboBox bx, String key) {
-        int target = Main.pref.getInteger(key, -1);
+        HashMap<Integer, Integer> groups = Main.platform.initShortcutGroups(false);
+        setBx(bxPrim1, groups, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_EDIT);
+        setBx(bxSec1,  groups, Shortcut.GROUPS_ALT1   +Shortcut.GROUP_EDIT);
+        setBx(bxTer1,  groups, Shortcut.GROUPS_ALT2   +Shortcut.GROUP_EDIT);
+
+        setBx(bxPrim2, groups, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MENU);
+        setBx(bxSec2,  groups, Shortcut.GROUPS_ALT1   +Shortcut.GROUP_MENU);
+        setBx(bxTer2,  groups, Shortcut.GROUPS_ALT2   +Shortcut.GROUP_MENU);
+
+        setBx(bxPrim3, groups, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_HOTKEY);
+        setBx(bxSec3,  groups, Shortcut.GROUPS_ALT1   +Shortcut.GROUP_HOTKEY);
+        setBx(bxTer3,  groups, Shortcut.GROUPS_ALT2   +Shortcut.GROUP_HOTKEY);
+
+        setBx(bxPrim4, groups, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_LAYER);
+        setBx(bxSec4,  groups, Shortcut.GROUPS_ALT1   +Shortcut.GROUP_LAYER);
+        setBx(bxTer4,  groups, Shortcut.GROUPS_ALT2   +Shortcut.GROUP_LAYER);
+    }
+    private void setBx(javax.swing.JComboBox bx, HashMap<Integer, Integer> groups, int key) {
+        int target = Main.pref.getInteger("shortcut.groups."+key, groups.get(key));
         for (int i = 0; i < modifInts.length; i++) {
             if (modifInts[i] == target) {
Index: trunk/src/org/openstreetmap/josm/gui/util/RedirectInputMap.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/util/RedirectInputMap.java	(revision 4896)
+++ trunk/src/org/openstreetmap/josm/gui/util/RedirectInputMap.java	(revision 4897)
@@ -62,9 +62,4 @@
     }
 
-    public static void redirectToMainContentPane(JComponent source) {
-        @SuppressWarnings("deprecation") JComponent target = Main.contentPane;
-        redirect(source, target);
-    }
-
     public static void redirect(JComponent source, JComponent target) {
         InputMap lastParent = source.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
Index: trunk/src/org/openstreetmap/josm/tools/PlatformHook.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/PlatformHook.java	(revision 4896)
+++ trunk/src/org/openstreetmap/josm/tools/PlatformHook.java	(revision 4897)
@@ -4,4 +4,5 @@
 import java.io.File;
 import java.io.IOException;
+import java.util.HashMap;
 
 /**
@@ -65,5 +66,5 @@
       * to register any shortcuts from within.
       */
-    public void initShortcutGroups();
+    public HashMap<Integer, Integer> initShortcutGroups(boolean load);
 
     /**
Index: trunk/src/org/openstreetmap/josm/tools/PlatformHookOsx.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/PlatformHookOsx.java	(revision 4896)
+++ trunk/src/org/openstreetmap/josm/tools/PlatformHookOsx.java	(revision 4897)
@@ -8,4 +8,5 @@
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
+import java.util.HashMap;
 
 import javax.swing.UIManager;
@@ -71,30 +72,35 @@
     }
     @Override
-    public void initShortcutGroups() {
+    public HashMap<Integer, Integer>  initShortcutGroups(boolean load) {
+        HashMap<Integer, Integer> groups = new HashMap<Integer, Integer>();
+
         // Everything but Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MENU is guesswork.
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_NONE),    Integer.toString(-1));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_HOTKEY),  Integer.toString(KeyEvent.CTRL_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MENU),    Integer.toString(KeyEvent.META_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_EDIT),    Integer.toString(0));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_LAYER),   Integer.toString(KeyEvent.ALT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_DIRECT),  Integer.toString(0));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MNEMONIC),Integer.toString(KeyEvent.ALT_DOWN_MASK));
-
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1+Shortcut.GROUP_NONE),       Integer.toString(-1));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1+Shortcut.GROUP_HOTKEY),     Integer.toString(KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1+Shortcut.GROUP_MENU),       Integer.toString(KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1+Shortcut.GROUP_EDIT),       Integer.toString(KeyEvent.SHIFT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1+Shortcut.GROUP_LAYER),      Integer.toString(KeyEvent.ALT_DOWN_MASK  | KeyEvent.SHIFT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1+Shortcut.GROUP_DIRECT),     Integer.toString(KeyEvent.SHIFT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1+Shortcut.GROUP_MNEMONIC),   Integer.toString(KeyEvent.ALT_DOWN_MASK));
-
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2+Shortcut.GROUP_NONE),       Integer.toString(-1));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2+Shortcut.GROUP_HOTKEY),     Integer.toString(KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2+Shortcut.GROUP_MENU),       Integer.toString(KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2+Shortcut.GROUP_EDIT),       Integer.toString(KeyEvent.ALT_DOWN_MASK  | KeyEvent.SHIFT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2+Shortcut.GROUP_LAYER),      Integer.toString(KeyEvent.ALT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2+Shortcut.GROUP_DIRECT),     Integer.toString(KeyEvent.SHIFT_DOWN_MASK | KeyEvent.ALT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2+Shortcut.GROUP_MNEMONIC),   Integer.toString(KeyEvent.ALT_DOWN_MASK));
-    }
+        setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_NONE,    -1);
+        setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_HOTKEY,  KeyEvent.CTRL_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MENU,    KeyEvent.META_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_EDIT,    0);
+        setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_LAYER,   KeyEvent.ALT_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_DIRECT,  0);
+        setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MNEMONIC,KeyEvent.ALT_DOWN_MASK);
+
+        setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_NONE,       -1);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_HOTKEY,     KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_MENU,       KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_EDIT,       KeyEvent.SHIFT_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_LAYER,      KeyEvent.ALT_DOWN_MASK  | KeyEvent.SHIFT_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_DIRECT,     KeyEvent.SHIFT_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_MNEMONIC,   KeyEvent.ALT_DOWN_MASK);
+
+        setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_NONE,       -1);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_HOTKEY,     KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_MENU,       KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_EDIT,       KeyEvent.ALT_DOWN_MASK  | KeyEvent.SHIFT_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_LAYER,      KeyEvent.SHIFT_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_DIRECT,     KeyEvent.CTRL_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_MNEMONIC,   KeyEvent.ALT_DOWN_MASK);
+
+        return groups;
+    }
+
     @Override
     public void initSystemShortcuts() {
@@ -276,9 +282,3 @@
         return false;
     }
-
-    @Override
-    public boolean rename(File from, File to)
-    {
-        return from.renameTo(to);
-    }
 }
Index: trunk/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java	(revision 4896)
+++ trunk/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java	(revision 4897)
@@ -6,4 +6,5 @@
 import java.io.File;
 import java.io.IOException;
+import java.util.HashMap;
 
 import org.openstreetmap.josm.Main;
@@ -18,8 +19,13 @@
  */
 public class PlatformHookUnixoid implements PlatformHook {
+    @Override
     public void preStartupHook(){
     }
+
+    @Override
     public void startupHook() {
     }
+
+    @Override
     public void openUrl(String url) throws IOException {
         String[] programs = {"gnome-open", "kfmclient openURL", "firefox"};
@@ -32,32 +38,46 @@
         }
     }
-    public void initShortcutGroups() {
-        // This is the Windows list. Someone should look over it and make it more "*nix"...
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_NONE),    Integer.toString(-1));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_HOTKEY),  Integer.toString(KeyEvent.CTRL_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MENU),    Integer.toString(KeyEvent.CTRL_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_EDIT),    Integer.toString(0));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_LAYER),   Integer.toString(KeyEvent.ALT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_DIRECT),  Integer.toString(0));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MNEMONIC),Integer.toString(KeyEvent.ALT_DOWN_MASK));
 
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1+Shortcut.GROUP_NONE),       Integer.toString(-1));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1+Shortcut.GROUP_HOTKEY),     Integer.toString(KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1+Shortcut.GROUP_MENU),       Integer.toString(KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1+Shortcut.GROUP_EDIT),       Integer.toString(KeyEvent.SHIFT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1+Shortcut.GROUP_LAYER),      Integer.toString(KeyEvent.ALT_DOWN_MASK  | KeyEvent.SHIFT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1+Shortcut.GROUP_DIRECT),     Integer.toString(KeyEvent.SHIFT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1+Shortcut.GROUP_MNEMONIC),   Integer.toString(KeyEvent.ALT_DOWN_MASK));
+    protected void setupGroup(HashMap<Integer, Integer> groups, boolean load, int group, int value) {
+        if(load)
+            groups.put(group, Main.pref.getInteger("shortcut.groups."+group, value));
+        else
+            groups.put(group, value);
+    }
 
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2+Shortcut.GROUP_NONE),       Integer.toString(-1));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2+Shortcut.GROUP_HOTKEY),     Integer.toString(KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2+Shortcut.GROUP_MENU),       Integer.toString(KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2+Shortcut.GROUP_EDIT),       Integer.toString(KeyEvent.ALT_DOWN_MASK  | KeyEvent.SHIFT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2+Shortcut.GROUP_LAYER),      Integer.toString(KeyEvent.ALT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2+Shortcut.GROUP_DIRECT),     Integer.toString(KeyEvent.CTRL_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2+Shortcut.GROUP_MNEMONIC),   Integer.toString(KeyEvent.ALT_DOWN_MASK));
+    @Override
+    public HashMap<Integer, Integer>  initShortcutGroups(boolean load) {
+        HashMap<Integer, Integer> groups = new HashMap<Integer, Integer>();
+
+        setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_NONE,    -1);
+        setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_HOTKEY,  KeyEvent.CTRL_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MENU,    KeyEvent.CTRL_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_EDIT,    0);
+        setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_LAYER,   KeyEvent.ALT_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_DIRECT,  0);
+        setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MNEMONIC,KeyEvent.ALT_DOWN_MASK);
+
+        setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_NONE,       -1);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_HOTKEY,     KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_MENU,       KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_EDIT,       KeyEvent.SHIFT_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_LAYER,      KeyEvent.ALT_DOWN_MASK  | KeyEvent.SHIFT_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_DIRECT,     KeyEvent.SHIFT_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_MNEMONIC,   KeyEvent.ALT_DOWN_MASK);
+
+        setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_NONE,       -1);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_HOTKEY,     KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_MENU,       KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_EDIT,       KeyEvent.ALT_DOWN_MASK  | KeyEvent.SHIFT_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_LAYER,      KeyEvent.SHIFT_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_DIRECT,     KeyEvent.CTRL_DOWN_MASK);
+        setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_MNEMONIC,   KeyEvent.ALT_DOWN_MASK);
+
+        return groups;
     }
+
+    @Override
     public void initSystemShortcuts() {
-        // TODO: Insert system shortcuts here. See Windows and espacially OSX to see how to.
+        // TODO: Insert system shortcuts here. See Windows and especially OSX to see how to.
     }
     /**
@@ -66,4 +86,5 @@
      * this is implemented here...
      */
+    @Override
     public String makeTooltip(String name, Shortcut sc) {
         String result = "";
@@ -80,4 +101,5 @@
     }
 
+    @Override
     public String getDefaultStyle() {
         return "javax.swing.plaf.metal.MetalLookAndFeel";
Index: trunk/src/org/openstreetmap/josm/tools/PlatformHookWindows.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/PlatformHookWindows.java	(revision 4896)
+++ trunk/src/org/openstreetmap/josm/tools/PlatformHookWindows.java	(revision 4897)
@@ -15,36 +15,8 @@
   */
 public class PlatformHookWindows extends PlatformHookUnixoid implements PlatformHook {
-    public void preStartupHook(){
-    }
-    public void startupHook() {
-    }
     public void openUrl(String url) throws IOException {
         Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + url);
     }
-    public void initShortcutGroups() {
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_NONE),    Integer.toString(-1));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_HOTKEY),  Integer.toString(KeyEvent.CTRL_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MENU),    Integer.toString(KeyEvent.CTRL_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_EDIT),    Integer.toString(0));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_LAYER),   Integer.toString(KeyEvent.ALT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_DIRECT),  Integer.toString(0));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MNEMONIC),Integer.toString(KeyEvent.ALT_DOWN_MASK));
 
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1+Shortcut.GROUP_NONE),       Integer.toString(-1));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1+Shortcut.GROUP_HOTKEY),     Integer.toString(KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1+Shortcut.GROUP_MENU),       Integer.toString(KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1+Shortcut.GROUP_EDIT),       Integer.toString(KeyEvent.SHIFT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1+Shortcut.GROUP_LAYER),      Integer.toString(KeyEvent.ALT_DOWN_MASK  | KeyEvent.SHIFT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1+Shortcut.GROUP_DIRECT),     Integer.toString(KeyEvent.SHIFT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1+Shortcut.GROUP_MNEMONIC),   Integer.toString(KeyEvent.ALT_DOWN_MASK));
-
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2+Shortcut.GROUP_NONE),       Integer.toString(-1));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2+Shortcut.GROUP_HOTKEY),     Integer.toString(KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2+Shortcut.GROUP_MENU),       Integer.toString(KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2+Shortcut.GROUP_EDIT),       Integer.toString(KeyEvent.ALT_DOWN_MASK  | KeyEvent.SHIFT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2+Shortcut.GROUP_LAYER),      Integer.toString(KeyEvent.ALT_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2+Shortcut.GROUP_DIRECT),     Integer.toString(KeyEvent.CTRL_DOWN_MASK));
-        Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2+Shortcut.GROUP_MNEMONIC),   Integer.toString(KeyEvent.ALT_DOWN_MASK));
-    }
     public void initSystemShortcuts() {
         // This list if far from complete!
@@ -64,11 +36,4 @@
 
     @Override
-    public boolean canFullscreen()
-    {
-        return GraphicsEnvironment.getLocalGraphicsEnvironment()
-        .getDefaultScreenDevice().isFullScreenSupported();
-    }
-
-    @Override
     public boolean rename(File from, File to)
     {
Index: trunk/src/org/openstreetmap/josm/tools/Shortcut.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/Shortcut.java	(revision 4896)
+++ trunk/src/org/openstreetmap/josm/tools/Shortcut.java	(revision 4897)
@@ -6,6 +6,9 @@
 import java.awt.event.KeyEvent;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -33,7 +36,5 @@
  */
 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;
+    @Deprecated
     public static final int SHIFT_DEFAULT = 1;
     private String shortText;        // the unique ID of the shortcut
@@ -155,23 +156,31 @@
     private boolean isSame(int isKey, int isModifier) {
         // -1 --- an unassigned shortcut is different from any other shortcut
-        return( isKey == assignedKey && isModifier == assignedModifier && assignedModifier != groups.get(GROUP_NONE));
+        return( isKey == assignedKey && isModifier == assignedModifier && assignedModifier != getGroupModifier(GROUP_NONE));
     }
 
     // create a shortcut object from an string as saved in the preferences
     private Shortcut(String prefString) {
-        String[] s = prefString.split(";");
-        this.shortText = s[0];
-        this.longText = s[1];
-        this.requestedKey = Integer.parseInt(s[2]);
-        this.requestedGroup = Integer.parseInt(s[3]);
-        this.assignedKey = Integer.parseInt(s[4]);
-        this.assignedModifier = Integer.parseInt(s[5]);
-        this.assignedDefault = Boolean.parseBoolean(s[6]);
-        this.assignedUser = Boolean.parseBoolean(s[7]);
+        ArrayList<String> s = (new ArrayList<String>(Main.pref.getCollection(prefString)));
+        this.shortText = prefString.substring(15);
+        this.longText = s.get(0);
+        this.requestedKey = Integer.parseInt(s.get(1));
+        this.requestedGroup = Integer.parseInt(s.get(2));
+        this.assignedKey = Integer.parseInt(s.get(3));
+        this.assignedModifier = Integer.parseInt(s.get(4));
+        this.assignedDefault = Boolean.parseBoolean(s.get(5));
+        this.assignedUser = Boolean.parseBoolean(s.get(6));
+    }
+
+    private void saveDefault() {
+        Main.pref.getCollection("shortcut.entry."+shortText, Arrays.asList(new String[]{longText,
+        String.valueOf(requestedKey), String.valueOf(requestedGroup), String.valueOf(assignedKey),
+        String.valueOf(assignedModifier), String.valueOf(true), String.valueOf(false)}));
     }
 
     // get a string that can be put into the preferences
-    private String asPrefString() {
-        return shortText + ";" + longText + ";" + requestedKey + ";" + requestedGroup + ";" + assignedKey + ";" + assignedModifier + ";" + assignedDefault + ";" + assignedUser;
+    private boolean save() {
+        return Main.pref.putCollection("shortcut.entry."+shortText, Arrays.asList(new String[]{longText,
+        String.valueOf(requestedKey), String.valueOf(requestedGroup), String.valueOf(assignedKey),
+        String.valueOf(assignedModifier), String.valueOf(assignedDefault), String.valueOf(assignedUser)}));
     }
 
@@ -184,5 +193,5 @@
      */
     public void setMnemonic(JMenu menu) {
-        if (requestedGroup == GROUP_MNEMONIC && assignedModifier == groups.get(requestedGroup + GROUPS_DEFAULT) && getKeyStroke() != null && KeyEvent.getKeyText(assignedKey).length() == 1) {
+        if (requestedGroup == GROUP_MNEMONIC && assignedModifier == getGroupModifier(requestedGroup + GROUPS_DEFAULT) && getKeyStroke() != null && KeyEvent.getKeyText(assignedKey).length() == 1) {
             menu.setMnemonic(KeyEvent.getKeyText(assignedKey).charAt(0)); //getKeyStroke().getKeyChar() seems not to work here
         }
@@ -192,5 +201,5 @@
      */
     public void setMnemonic(AbstractButton button) {
-        if (requestedGroup == GROUP_MNEMONIC && assignedModifier == groups.get(requestedGroup + GROUPS_DEFAULT) && getKeyStroke() != null && KeyEvent.getKeyText(assignedKey).length() == 1) {
+        if (requestedGroup == GROUP_MNEMONIC && assignedModifier == getGroupModifier(requestedGroup + GROUPS_DEFAULT) && getKeyStroke() != null && KeyEvent.getKeyText(assignedKey).length() == 1) {
             button.setMnemonic(KeyEvent.getKeyText(assignedKey).charAt(0)); //getKeyStroke().getKeyChar() seems not to work here
         }
@@ -221,9 +230,9 @@
 
     // and here our modifier groups
-    private static Map<Integer, Integer> groups = new HashMap<Integer, Integer>();
+    private static Map<Integer, Integer> groups;
 
     // check if something collides with an existing shortcut
     private static Shortcut findShortcut(int requestedKey, int modifier) {
-        if (modifier == groups.get(GROUP_NONE))
+        if (modifier == getGroupModifier(GROUP_NONE))
             return null;
         for (Shortcut sc : shortcuts.values()) {
@@ -250,5 +259,5 @@
     // try to find an unused shortcut
     private static Shortcut findRandomShortcut(String shortText, String longText, int requestedKey, int requestedGroup) {
-        int[] mods = {groups.get(requestedGroup + GROUPS_DEFAULT), groups.get(requestedGroup + GROUPS_ALT1), groups.get(requestedGroup + GROUPS_ALT2)};
+        int[] mods = {getGroupModifier(requestedGroup + GROUPS_DEFAULT), getGroupModifier(requestedGroup + GROUPS_ALT1), getGroupModifier(requestedGroup + GROUPS_ALT2)};
         for (int m : mods) {
             for (int k = KeyEvent.VK_A; k < KeyEvent.VK_Z; k++) { // we'll limit ourself to 100% safe keys
@@ -257,5 +266,5 @@
             }
         }
-        return new Shortcut(shortText, longText, requestedKey, requestedGroup, requestedKey, groups.get(GROUP_NONE), false, false);
+        return new Shortcut(shortText, longText, requestedKey, requestedGroup, requestedKey, getGroupModifier(GROUP_NONE), false, false);
     }
 
@@ -300,66 +309,46 @@
         if (initdone) return;
         initdone = true;
-        // if we have no modifier groups in the config, we have to create them
-        if (Main.pref.get("shortcut.groups.configured", null) == null) {
-            Main.platform.initShortcutGroups();
-            Main.pref.put("shortcut.groups.configured", true);
-        }
-        // pull in the groups
-        for (int i = GROUP_NONE; i < GROUP__MAX+GROUPS_ALT2*2; i++) { // fill more groups, so registering with e.g. ALT2+MNEMONIC won't NPE
-            groups.put(i, Main.pref.getInteger("shortcut.groups."+i, -1));
-        }
+        groups = Main.platform.initShortcutGroups(true);
         // (1) System reserved shortcuts
         Main.platform.initSystemShortcuts();
         // (2) User defined shortcuts
-        int i = 0;
-        String p = Main.pref.get("shortcut.shortcut."+i, null);
-        while (p != null) {
-            Shortcut sc = new Shortcut(p);
+        LinkedList<Shortcut> shortcuts = new LinkedList<Shortcut>();
+        for(String s : Main.pref.getAllPrefixKeys("shortcut.entry.")) {
+            shortcuts.add(new Shortcut(s));
+        }
+        for(Shortcut sc : shortcuts) {
             if (sc.getAssignedUser()) {
                 registerShortcut(sc);
             }
-            i++;
-            p = Main.pref.get("shortcut.shortcut."+i, null);
         }
         // Shortcuts at their default values
-        i = 0;
-        p = Main.pref.get("shortcut.shortcut."+i, null);
-        while (p != null) {
-            Shortcut sc = new Shortcut(p);
+        for(Shortcut sc : shortcuts) {
             if (!sc.getAssignedUser() && sc.getAssignedDefault()) {
                 registerShortcut(sc);
             }
-            i++;
-            p = Main.pref.get("shortcut.shortcut."+i, null);
         }
         // Shortcuts that were automatically moved
-        i = 0;
-        p = Main.pref.get("shortcut.shortcut."+i, null);
-        while (p != null) {
-            Shortcut sc = new Shortcut(p);
+        for(Shortcut sc : shortcuts) {
             if (!sc.getAssignedUser() && !sc.getAssignedDefault()) {
                 registerShortcut(sc);
             }
-            i++;
-            p = Main.pref.get("shortcut.shortcut."+i, null);
-        }
+        }
+    }
+
+    private static int getGroupModifier(int group) {
+        Integer m = groups.get(group);
+        if(m == null)
+            m = -1;
+        return m;
     }
 
     // shutdown handling
     public static boolean savePrefs() {
-        //      we save this directly from the preferences pane, so don't overwrite these values here
-        //      for (int i = GROUP_NONE; i < GROUP__MAX+GROUPS_ALT2; i++) {
-        //      Main.pref.put("shortcut.groups."+i, Groups.get(i).toString());
-        //      }
         boolean changed = false;
-        int i = 0;
         for (Shortcut sc : shortcuts.values()) {
-            //          TODO: Remove sc.getAssignedUser() when we fixed all internal conflicts
             if (!sc.getAutomatic() && !sc.getReset() && sc.getAssignedUser()) {
-                changed = changed | Main.pref.put("shortcut.shortcut."+i, sc.asPrefString());
-                i++;
-            }
-        }
-        changed = changed | Main.pref.put("shortcut.shortcut."+i, "");
+                changed = changed | sc.save();
+            }
+        }
         return changed;
     }
@@ -413,4 +402,5 @@
      * @param modifier to register a {@code ctrl+shift} command, use {@see #SHIFT_DEFAULT}.
      */
+    @Deprecated
     public static Shortcut registerShortcut(String shortText, String longText, int requestedKey, int requestedGroup, int modifier) {
         return registerShortcut(shortText, longText, requestedKey, requestedGroup, modifier, null);
@@ -450,5 +440,5 @@
             return sc;
         }
-        Integer defaultModifier = groups.get(requestedGroup + GROUPS_DEFAULT);
+        Integer defaultModifier = getGroupModifier(requestedGroup + GROUPS_DEFAULT);
         if(modifier != null) {
             if(modifier == SHIFT_DEFAULT) {
@@ -459,5 +449,5 @@
         }
         else if (defaultModifier == null) { // garbage in, no shortcut out
-            defaultModifier = groups.get(GROUP_NONE + GROUPS_DEFAULT);
+            defaultModifier = getGroupModifier(GROUP_NONE + GROUPS_DEFAULT);
         }
         Shortcut conflictsWith = null;
@@ -465,13 +455,13 @@
         if (potentialShortcut != null) { // 3 stage conflict handling
             conflictsWith = potentialShortcut;
-            defaultModifier = groups.get(requestedGroup + GROUPS_ALT1);
+            defaultModifier = getGroupModifier(requestedGroup + GROUPS_ALT1);
             if (defaultModifier == null) { // garbage in, no shortcurt out
-                defaultModifier = groups.get(GROUP_NONE + GROUPS_DEFAULT);
+                defaultModifier = getGroupModifier(GROUP_NONE + GROUPS_DEFAULT);
             }
             potentialShortcut = findShortcut(requestedKey, defaultModifier);
             if (potentialShortcut != null) {
-                defaultModifier = groups.get(requestedGroup + GROUPS_ALT2);
+                defaultModifier = getGroupModifier(requestedGroup + GROUPS_ALT2);
                 if (defaultModifier == null) { // garbage in, no shortcurt out
-                    defaultModifier = groups.get(GROUP_NONE + GROUPS_DEFAULT);
+                    defaultModifier = getGroupModifier(GROUP_NONE + GROUPS_DEFAULT);
                 }
                 potentialShortcut = findShortcut(requestedKey, defaultModifier);
@@ -493,4 +483,5 @@
         }
 
+        potentialShortcut.saveDefault();
         shortcuts.put(shortText, potentialShortcut);
         return potentialShortcut;
