Index: trunk/src/org/openstreetmap/josm/gui/preferences/PrefJPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/PrefJPanel.java	(revision 4915)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/PrefJPanel.java	(revision 4916)
@@ -15,9 +15,26 @@
 
 import java.util.regex.PatternSyntaxException;
-import javax.swing.*;
+import javax.swing.AbstractAction;
+import javax.swing.BorderFactory;
+import javax.swing.BoxLayout;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JEditorPane;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
+import javax.swing.JTable;
+import javax.swing.JTextField;
+import javax.swing.KeyStroke;
+import javax.swing.ListSelectionModel;
+import javax.swing.RowFilter;
+import javax.swing.SwingConstants;
 import javax.swing.event.DocumentEvent;
 import javax.swing.event.DocumentListener;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
+import javax.swing.table.AbstractTableModel;
 import javax.swing.table.TableModel;
 
@@ -34,5 +51,5 @@
 
     // table of shortcuts
-    private TableModel model;
+    private AbstractTableModel model;
     // comboboxes of modifier groups, mapping selectedIndex to real data
     private static int[] modifInts = new int[]{
@@ -124,5 +141,5 @@
     /** Creates new form prefJPanel */
     // Ain't those auto-generated comments helpful or what? <g>
-    public PrefJPanel(TableModel model) {
+    public PrefJPanel(AbstractTableModel model) {
         this.model = model;
         initComponents();
@@ -130,10 +147,4 @@
 
     private void initComponents() {
-
-        // Did I mention auto-generated? That's the reason we
-        // have lots of properties here and not some arrays...
-        
-        // r4914 - autogenerated code rearranged manually 
-        
         JPanel editGroupPane = new JPanel();
         JPanel hotkeyGroupPane = new JPanel();
@@ -191,5 +202,5 @@
         shortcutTable.setModel(model);
         shortcutTable.getSelectionModel().addListSelectionListener(new CbAction(this));
-        //shortcutTable.setFillsViewportHeight(true); Java 1.6
+        shortcutTable.setFillsViewportHeight(true);
         shortcutTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
         shortcutTable.setAutoCreateRowSorter(true);
@@ -364,4 +375,5 @@
                     actionPerformed(null);
                 }
+                model.fireTableCellUpdated(row, 1);
             } else {
                 panel.disableAllModifierCheckboxes();
@@ -375,5 +387,4 @@
                     int row = panel.shortcutTable.convertRowIndexToModel(lsm.getMinSelectionIndex());
                     Shortcut sc = (Shortcut)panel.model.getValueAt(row, -1);
-                    sc.setAssignedUser(!panel.cbDefault.isSelected());
                     if (panel.cbDisable.isSelected()) {
                         sc.setAssignedModifier(-1);
@@ -393,4 +404,5 @@
                         }
                     }
+                    sc.setAssignedUser(!panel.cbDefault.isSelected());
                     valueChanged(null);
                 }
@@ -464,6 +476,6 @@
             if (expr.length()==0) { expr=null; }
             try {
-                final TableRowSorter<TableModel> sorter =
-                    ((TableRowSorter<TableModel> )shortcutTable.getRowSorter());
+                final TableRowSorter<? extends TableModel> sorter =
+                    ((TableRowSorter<? extends TableModel> )shortcutTable.getRowSorter());
                 if (expr == null) {
                     sorter.setRowFilter(null);
Index: trunk/src/org/openstreetmap/josm/tools/Shortcut.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/Shortcut.java	(revision 4915)
+++ trunk/src/org/openstreetmap/josm/tools/Shortcut.java	(revision 4916)
@@ -138,7 +138,10 @@
      */
     public void setAssignedUser(boolean assignedUser) {
-        this.reset = (!this.assignedUser && assignedUser);
+        this.reset = (this.assignedUser || reset) && !assignedUser;
         if (assignedUser) {
             assignedDefault = false;
+        } else if (reset) {
+            assignedKey = requestedKey;
+            assignedModifier = findModifier(requestedGroup, null);
         }
         this.assignedUser = assignedUser;
@@ -172,15 +175,19 @@
     }
 
-    private void saveDefault() {
+    private void saveDefault(int modifier) {
         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)}));
+        String.valueOf(requestedKey), String.valueOf(requestedGroup), String.valueOf(requestedKey),
+        String.valueOf(modifier), String.valueOf(true), String.valueOf(false)}));
     }
 
     // get a string that can be put into the preferences
     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)}));
+        if (getAutomatic() || getReset() || !getAssignedUser()) {
+            return Main.pref.putCollection("shortcut.entry."+shortText, null);
+        } else {
+            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)}));
+        }
     }
 
@@ -347,7 +354,5 @@
         boolean changed = false;
         for (Shortcut sc : shortcuts.values()) {
-            if (!sc.getAutomatic() && !sc.getReset() && sc.getAssignedUser()) {
-                changed = changed | sc.save();
-            }
+            changed = changed | sc.save();
         }
         return changed;
@@ -427,4 +432,19 @@
     }
 
+    private static int findModifier(int group, Integer modifier) {
+        Integer defaultModifier = getGroupModifier(group + GROUPS_DEFAULT);
+        if(modifier != null) {
+            if(modifier == SHIFT_DEFAULT) {
+                defaultModifier |= KeyEvent.SHIFT_DOWN_MASK;
+            } else {
+                defaultModifier = modifier;
+            }
+        }
+        else if (defaultModifier == null) { // garbage in, no shortcut out
+            defaultModifier = getGroupModifier(GROUP_NONE + GROUPS_DEFAULT);
+        }
+        return defaultModifier;
+    }
+
     // and now the workhorse. same parameters as above, just one more: if originalShortcut is not null and
     // is different from the shortcut that will be assigned, a popup warning will be displayed to the user.
@@ -435,19 +455,10 @@
             Shortcut originalShortcut) {
         doInit();
+        Integer defaultModifier = findModifier(requestedGroup, modifier);
         if (shortcuts.containsKey(shortText)) { // a re-register? maybe a sc already read from the preferences?
             Shortcut sc = shortcuts.get(shortText);
             sc.setLongText(longText); // or set by the platformHook, in this case the original longText doesn't match the real action
+            sc.saveDefault(defaultModifier);
             return sc;
-        }
-        Integer defaultModifier = getGroupModifier(requestedGroup + GROUPS_DEFAULT);
-        if(modifier != null) {
-            if(modifier == SHIFT_DEFAULT) {
-                defaultModifier |= KeyEvent.SHIFT_DOWN_MASK;
-            } else {
-                defaultModifier = modifier;
-            }
-        }
-        else if (defaultModifier == null) { // garbage in, no shortcut out
-            defaultModifier = getGroupModifier(GROUP_NONE + GROUPS_DEFAULT);
         }
         Shortcut conflictsWith = null;
@@ -483,5 +494,5 @@
         }
 
-        potentialShortcut.saveDefault();
+        potentialShortcut.saveDefault(defaultModifier);
         shortcuts.put(shortText, potentialShortcut);
         return potentialShortcut;
