Index: /trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java	(revision 5953)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java	(revision 5954)
@@ -243,4 +243,8 @@
     public final ImageryPreference getImageryPreference() {
         return getSetting(ImageryPreference.class);
+    }
+    
+    public final ShortcutPreference getShortcutPreference() {
+        return getSetting(ShortcutPreference.class);
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java	(revision 5953)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java	(revision 5954)
@@ -17,4 +17,5 @@
 import java.awt.event.ActionListener;
 import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
@@ -61,4 +62,5 @@
 import org.openstreetmap.josm.actions.ActionParameter;
 import org.openstreetmap.josm.actions.AdaptableAction;
+import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.actions.ParameterizedAction;
 import org.openstreetmap.josm.actions.ParameterizedActionDecorator;
@@ -67,4 +69,5 @@
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.Shortcut;
 
 public class ToolbarPreferences implements PreferenceSettingFactory {
@@ -141,4 +144,12 @@
         public static ActionDefinition getSeparator() {
             return new ActionDefinition(null);
+        }
+        
+        public boolean hasParameters() {
+            if (!(getAction() instanceof ParameterizedAction)) return false;
+            for (Object o: parameters.values()) {
+                if (o!=null) return true;
+            } 
+            return false;
         }
     }
@@ -295,8 +306,10 @@
         private ActionDefinition currentAction = ActionDefinition.getSeparator();
 
+        @Override
         public int getColumnCount() {
             return 2;
         }
 
+        @Override
         public int getRowCount() {
             int adaptable = ((currentAction.getAction() instanceof AdaptableAction) ? 2 : 0);
@@ -313,4 +326,5 @@
         }
 
+        @Override
         public Object getValueAt(int rowIndex, int columnIndex) {
             if(currentAction.getAction() instanceof AdaptableAction)
@@ -375,5 +389,5 @@
                 add(tr("Remove from toolbar",action.getDisplayName()))
                         .addActionListener(new ActionListener() {
-                            public void actionPerformed(ActionEvent e) {
+                            @Override public void actionPerformed(ActionEvent e) {
                                 Collection<String> t = new LinkedList<String>(getToolString());
                                 ActionParser parser = new ActionParser(null);
@@ -389,5 +403,5 @@
             
             add(tr("Configure toolbar")).addActionListener(new ActionListener() {
-                public void actionPerformed(ActionEvent e) {
+                @Override public void actionPerformed(ActionEvent e) {
                     final PreferenceDialog p =new PreferenceDialog(Main.parent);
                     p.selectPreferencesTabByName("toolbar");
@@ -395,5 +409,15 @@
                 }
             });
-            
+
+            add(tr("Edit shortcut")).addActionListener(new ActionListener() {
+                @Override public void actionPerformed(ActionEvent e) {
+                    final PreferenceDialog p =new PreferenceDialog(Main.parent);
+                    p.getTabbedPane().getShortcutPreference().setDefaultFilter(action.getDisplayName());
+                    p.selectPreferencesTabByName("shortcuts");
+                    p.setVisible(true);
+                    // refresh toolbar to accept changes of shortcuts without restart
+                    Main.toolbar.refreshToolbarControl(); 
+                }
+            });
         }
     }
@@ -410,4 +434,5 @@
     public JToolBar control = new JToolBar();
 
+    @Override
     public PreferenceSetting createPreferenceSetting() {
         return new Settings(rootActionsNode);
@@ -417,4 +442,5 @@
 
         private final class Move implements ActionListener {
+            @Override 
             public void actionPerformed(ActionEvent e) {
                 if (e.getActionCommand().equals("<") && actionsTree.getSelectionCount() > 0) {
@@ -468,12 +494,15 @@
             }
 
+            @Override
             public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
                 return actions;
             }
 
+            @Override
             public DataFlavor[] getTransferDataFlavors() {
                 return flavors;
             }
 
+            @Override
             public boolean isDataFlavorSupported(DataFlavor flavor) {
                 return flavors[0] == flavor;
@@ -528,4 +557,5 @@
         }
 
+        @Override
         public void addGui(PreferenceTabbedPane gui) {
             actionsTree.setCellRenderer(new DefaultTreeCellRenderer() {
@@ -568,4 +598,5 @@
             selectedList.setCellRenderer(renderer);
             selectedList.addListSelectionListener(new ListSelectionListener(){
+                @Override
                 public void valueChanged(ListSelectionEvent e) {
                     boolean sel = selectedList.getSelectedIndex() != -1;
@@ -715,5 +746,5 @@
             actionsTree.setDragEnabled(true);
             actionsTree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
-                public void valueChanged(TreeSelectionEvent e) {
+                @Override public void valueChanged(TreeSelectionEvent e) {
                     updateEnabledState();
                 }
@@ -737,6 +768,9 @@
             final JPanel p = new JPanel();
             p.setLayout(new LayoutManager(){
+                @Override
                 public void addLayoutComponent(String name, Component comp) {}
+                @Override
                 public void removeLayoutComponent(Component comp) {}
+                @Override
                 public Dimension minimumLayoutSize(Container parent) {
                     Dimension l = left.getMinimumSize();
@@ -745,4 +779,5 @@
                     return new Dimension(l.width+b.width+10+r.width,l.height+b.height+10+r.height);
                 }
+                @Override
                 public Dimension preferredLayoutSize(Container parent) {
                     Dimension l = new Dimension(200, 200); //left.getPreferredSize();
@@ -750,4 +785,5 @@
                     return new Dimension(l.width+r.width+10+buttons.getPreferredSize().width,Math.max(l.height, r.height));
                 }
+                @Override
                 public void layoutContainer(Container parent) {
                     Dimension d = p.getSize();
@@ -780,4 +816,5 @@
         }
 
+        @Override
         public boolean ok() {
             Collection<String> t = new LinkedList<String>();
@@ -884,5 +921,5 @@
 
         Collection<String> toolStr = Main.pref.getCollection("toolbar", Arrays.asList(deftoolbar));
-        if (toolStr == null || toolStr.size() == 0) {
+        if (toolStr == null || toolStr.isEmpty()) {
             toolStr = Arrays.asList(deftoolbar);
         }
@@ -947,8 +984,6 @@
                 control.addSeparator();
             } else {
-                final JButton b = control.add(action.getParametrizedAction());
-                String tt = action.getDisplayTooltip();
-                if (tt != null && !tt.isEmpty())
-                    b.setToolTipText(tt);
+                final JButton b = addButtonAndShortcut(action);
+                
                 Icon i = action.getDisplayIcon();
                 if (i != null) {
@@ -971,4 +1006,45 @@
         control.setVisible(control.getComponentCount() != 0);
     }
+    
+    private JButton addButtonAndShortcut(ActionDefinition action) {
+        Action act = action.getParametrizedAction();
+        JButton b = control.add(act);
+        
+        Shortcut sc = null;
+        if (action.getAction() instanceof JosmAction) {
+            sc = ((JosmAction) action.getAction()).getShortcut();
+            if (sc.getAssignedKey() == KeyEvent.CHAR_UNDEFINED) sc = null;
+        }
+
+        long paramCode = 0;
+        if (action.hasParameters()) {
+            paramCode =  action.parameters.hashCode();
+        }
+        
+        String tt = action.getDisplayTooltip();
+        if (tt==null) tt="";
+
+        if (sc == null || paramCode != 0) {
+            String name = (String) action.getAction().getValue("toolbar");
+            if (name==null) name=action.getDisplayName();
+            if (paramCode!=0) name = name+paramCode;
+            String desc = action.getDisplayName() + ((paramCode==0)?"":action.parameters.toString());
+            sc = Shortcut.registerShortcut("toolbar:"+name, tr("Toolbar: {0}", desc),
+                KeyEvent.CHAR_UNDEFINED, Shortcut.NONE);
+            Main.unregisterShortcut(sc);
+            Main.registerActionShortcut(act, sc);
+            
+            // add shortcut info to the tooltip if needed
+            if (sc.getAssignedUser()) {
+                if (tt.startsWith("<html>") && tt.endsWith("</html>")) {
+                    tt = tt.substring(6,tt.length()-6);
+                }
+                tt = Main.platform.makeTooltip(tt, sc);
+            }
+        }
+        
+        if (!tt.isEmpty()) b.setToolTipText(tt);
+        return b;
+    }
 
     private static DataFlavor ACTION_FLAVOR = new DataFlavor(
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/shortcut/PrefJPanel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/shortcut/PrefJPanel.java	(revision 5953)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/shortcut/PrefJPanel.java	(revision 5954)
@@ -147,4 +147,11 @@
     }
 
+    /**
+     * Show only shortcuts with descriptions coontaing given substring
+     */
+    public void filter(String substring) {
+        filterField.setText(substring);
+    }
+
     private class ShortcutTableCellRenderer extends DefaultTableCellRenderer {
 
@@ -284,4 +291,5 @@
             this.panel = panel;
         }
+        @Override
         public void valueChanged(ListSelectionEvent e) {
             ListSelectionModel lsm = panel.shortcutTable.getSelectionModel(); // can't use e here
@@ -313,4 +321,5 @@
             }
         }
+        @Override
         public void actionPerformed(java.awt.event.ActionEvent e) {
             ListSelectionModel lsm = panel.shortcutTable.getSelectionModel();
@@ -378,6 +387,9 @@
         }
 
+        @Override
         public void changedUpdate(DocumentEvent arg0) { filter(); }
+        @Override
         public void insertUpdate(DocumentEvent arg0) {  filter(); }
+        @Override
         public void removeUpdate(DocumentEvent arg0) { filter(); }
     }
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/shortcut/ShortcutPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/shortcut/ShortcutPreference.java	(revision 5953)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/shortcut/ShortcutPreference.java	(revision 5954)
@@ -18,4 +18,6 @@
 public class ShortcutPreference extends DefaultTabPreferenceSetting {
 
+    private String defaultFilter;
+            
     public static class Factory implements PreferenceSettingFactory {
         public PreferenceSetting createPreferenceSetting() {
@@ -33,5 +35,6 @@
         super("shortcuts", tr("Keyboard Shortcuts"), tr("Changing keyboard shortcuts manually."));
     }
-
+    
+    @Override
     public void addGui(PreferenceTabbedPane gui) {
         JPanel p = gui.createPreferenceTab(this);
@@ -39,9 +42,14 @@
         PrefJPanel prefpanel = new PrefJPanel(new scListModel());
         p.add(prefpanel, GBC.eol().fill(GBC.BOTH));
-
+        if (defaultFilter!=null) prefpanel.filter(defaultFilter);
     }
 
+    @Override
     public boolean ok() {
         return Shortcut.savePrefs();
+    }
+    
+    public void setDefaultFilter(String substring) {
+        defaultFilter = substring;
     }
 
@@ -54,7 +62,9 @@
             data = Shortcut.listAll();
         }
+        @Override
         public int getColumnCount() {
             return columnNames.length;
         }
+        @Override
         public int getRowCount() {
             return data.size();
@@ -64,4 +74,5 @@
             return columnNames[col];
         }
+        @Override
         public Object getValueAt(int row, int col) {
             return (col==0)?  data.get(row).getLongText() : data.get(row);
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetMenu.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetMenu.java	(revision 5953)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetMenu.java	(revision 5954)
@@ -5,4 +5,6 @@
 
 import java.awt.Component;
+import java.awt.MouseInfo;
+import java.awt.Point;
 import java.awt.event.ActionEvent;
 import java.util.ArrayList;
@@ -14,4 +16,5 @@
 import javax.swing.JPopupMenu;
 import javax.swing.JSeparator;
+import org.openstreetmap.josm.Main;
 
 import org.openstreetmap.josm.tools.PresetTextComparator;
@@ -57,9 +60,11 @@
         {
             Component co = (Component)s;
+
             JPopupMenu pm = new JPopupMenu(getName());
             for (Component c : menu.getMenuComponents()) {
                 pm.add(copyMenuComponent(c));
             }
-            pm.show(co, co.getWidth()/2, co.getHeight()/2);
+            Point p = MouseInfo.getPointerInfo().getLocation();
+            pm.show(Main.parent, p.x-Main.parent.getX(), p.y-Main.parent.getY());
         }
     }
