Index: /trunk/src/org/openstreetmap/josm/gui/MapStatus.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 4603)
+++ /trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 4604)
@@ -95,11 +95,11 @@
     }
 
-    ImageLabel lonText = new ImageLabel("lon", tr("The geographic longitude at the mouse pointer."), 11);
-    ImageLabel nameText = new ImageLabel("name", tr("The name of the object at the mouse pointer."), 20);
-    JTextField helpText = new JTextField();
-    ImageLabel latText = new ImageLabel("lat", tr("The geographic latitude at the mouse pointer."), 11);
-    ImageLabel angleText = new ImageLabel("angle", tr("The angle between the previous and the current way segment."), 6);
-    ImageLabel headingText = new ImageLabel("heading", tr("The (compass) heading of the line segment being drawn."), 6);
-    ImageLabel distText = new ImageLabel("dist", tr("The length of the new way segment being drawn."), 10);
+    final ImageLabel lonText = new ImageLabel("lon", tr("The geographic longitude at the mouse pointer."), 11);
+    final ImageLabel nameText = new ImageLabel("name", tr("The name of the object at the mouse pointer."), 20);
+    final JTextField helpText = new JTextField();
+    final ImageLabel latText = new ImageLabel("lat", tr("The geographic latitude at the mouse pointer."), 11);
+    final ImageLabel angleText = new ImageLabel("angle", tr("The angle between the previous and the current way segment."), 6);
+    final ImageLabel headingText = new ImageLabel("heading", tr("The (compass) heading of the line segment being drawn."), 6);
+    final ImageLabel distText = new ImageLabel("dist", tr("The length of the new way segment being drawn."), 10);
 
     /**
@@ -108,4 +108,26 @@
      */
     public Thread thread;
+
+    private final List<StatusTextHistory> statusText = new ArrayList<StatusTextHistory>();
+
+    private static class StatusTextHistory {
+        final Object id;
+        final String text;
+
+        public StatusTextHistory(Object id, String text) {
+            this.id = id;
+            this.text = text;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            return obj instanceof StatusTextHistory && ((StatusTextHistory)obj).id == id;
+        }
+
+        @Override
+        public int hashCode() {
+            return System.identityHashCode(id);
+        }
+    }
 
     /**
@@ -218,8 +240,8 @@
                                         final JLabel lbl = new JLabel(
                                                 "<html>"+tr("Middle click again to cycle through.<br>"+
-                                                "Hold CTRL to select directly from this list with the mouse.<hr>")+"</html>",
-                                                null,
-                                                JLabel.HORIZONTAL
-                                        );
+                                                        "Hold CTRL to select directly from this list with the mouse.<hr>")+"</html>",
+                                                        null,
+                                                        JLabel.HORIZONTAL
+                                                );
                                         lbl.setHorizontalAlignment(JLabel.LEFT);
                                         c.add(lbl, GBC.eol().insets(2, 0, 2, 0));
@@ -472,5 +494,5 @@
                     ImageProvider.get(OsmPrimitiveType.from(osm)),
                     JLabel.HORIZONTAL
-            ) {
+                    ) {
                 // This is necessary so the label updates its colors when the
                 // selection is changed from the outside
@@ -656,6 +678,30 @@
 
     public void setHelpText(String t) {
-        helpText.setText(t);
-        helpText.setToolTipText(t);
+        setHelpText(null, t);
+    }
+    public void setHelpText(Object id, String text)  {
+
+        StatusTextHistory entry = new StatusTextHistory(id, text);
+
+        statusText.remove(entry);
+        statusText.add(entry);
+
+        helpText.setText(text);
+        helpText.setToolTipText(text);
+    }
+    public void resetHelpText(Object id) {
+        if (statusText.isEmpty())
+            return;
+
+        StatusTextHistory entry = new StatusTextHistory(id, null);
+        if (statusText.get(statusText.size() - 1).equals(entry)) {
+            if (statusText.size() == 1) {
+                setHelpText("");
+            } else {
+                StatusTextHistory history = statusText.get(statusText.size() - 2);
+                setHelpText(history.id, history.text);
+            }
+        }
+        statusText.remove(entry);
     }
     public void setAngle(double a) {
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 4603)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 4604)
@@ -460,16 +460,11 @@
 
         @Override
-        public void executeMultikeyAction(int index) {
+        public void executeMultikeyAction(int index, boolean repeat) {
             Layer l = LayerListDialog.getLayerForIndex(index);
             if (l != null) {
                 l.toggleVisible();
                 lastLayer = new WeakReference<Layer>(l);
-            }
-        }
-
-        @Override
-        public void repeateLastMultikeyAction() {
-            if (lastLayer != null) {
-                Layer l = lastLayer.get();
+            } else if (repeat && lastLayer != null) {
+                l = lastLayer.get();
                 if (LayerListDialog.isLayerValid(l)) {
                     l.toggleVisible();
@@ -690,14 +685,9 @@
 
         @Override
-        public void executeMultikeyAction(int index) {
+        public void executeMultikeyAction(int index, boolean repeat) {
             Layer l = LayerListDialog.getLayerForIndex(index);
             if (l != null) {
                 execute(l);
             }
-        }
-
-        @Override
-        public void repeateLastMultikeyAction() {
-            // Do nothing, repating not supported
         }
 
@@ -1558,5 +1548,5 @@
         List<Layer> layers = Main.map.mapView.getAllLayersAsList();
 
-        if (index < layers.size())
+        if (index < layers.size() && index >= 0)
             return layers.get(index);
         else
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 4603)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 4604)
@@ -32,6 +32,6 @@
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.Map.Entry;
-import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
@@ -67,4 +67,6 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.actions.search.SearchAction.SearchMode;
+import org.openstreetmap.josm.actions.search.SearchAction.SearchSetting;
 import org.openstreetmap.josm.command.ChangeCommand;
 import org.openstreetmap.josm.command.ChangePropertyCommand;
@@ -72,4 +74,5 @@
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.SelectionChangedListener;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.IRelation;
 import org.openstreetmap.josm.data.osm.Node;
@@ -105,6 +108,4 @@
 import org.openstreetmap.josm.tools.Shortcut;
 import org.openstreetmap.josm.tools.Utils;
-import org.openstreetmap.josm.actions.search.SearchAction.SearchMode;
-import org.openstreetmap.josm.actions.search.SearchAction.SearchSetting;
 
 /**
@@ -170,5 +171,5 @@
     // button in the upper right corner of this dialog
     public static JPanel pluginHook = new JPanel();
-    
+
     private JPopupMenu propertyMenu;
     private JPopupMenu membershipMenu;
@@ -338,12 +339,11 @@
                     ed.setButtonIcons(new String[]{"purge", "cancel"});
                     ed.setContent(tr("You changed the key from ''{0}'' to ''{1}''.\n"
-                    + "The new key is already used, overwrite values?", key, newkey));
+                            + "The new key is already used, overwrite values?", key, newkey));
                     ed.setCancelButton(2);
                     ed.toggleEnable("overwriteEditKey");
                     ed.showDialog();
 
-                    if (ed.getValue() != 1) {
+                    if (ed.getValue() != 1)
                         return;
-                    }
                     break;
                 }
@@ -389,5 +389,5 @@
 
     /**
-     * For a given key k, return a list of keys which are used as keys for 
+     * For a given key k, return a list of keys which are used as keys for
      * auto-completing values to increase the search space.
      * @param key the key k
@@ -395,9 +395,8 @@
      */
     static List<String> getAutocompletionKeys(String key) {
-        if ("name".equals(key) || "addr:street".equals(key)) {
+        if ("name".equals(key) || "addr:street".equals(key))
             return Arrays.asList("addr:street", "name");
-        } else {
+        else
             return Arrays.asList(key);
-        }
     }
 
@@ -424,5 +423,7 @@
      */
     void add() {
-        Collection<OsmPrimitive> sel = Main.main.getCurrentDataSet().getSelected();
+        DataSet ds = Main.main.getCurrentDataSet();
+        if (ds == null) return;
+        Collection<OsmPrimitive> sel = ds.getSelected();
         if (sel.isEmpty()) return;
 
@@ -435,5 +436,5 @@
         List<AutoCompletionListItem> keyList = autocomplete.getKeys();
 
-        AutoCompletionListItem itemToSelect = null; 
+        AutoCompletionListItem itemToSelect = null;
         // remove the object's tag keys from the list
         Iterator<AutoCompletionListItem> iter = keyList.iterator();
@@ -445,6 +446,7 @@
             for (int i = 0; i < propertyData.getRowCount(); ++i) {
                 if (item.getValue().equals(propertyData.getValueAt(i, 0))) {
-                    if (itemToSelect == item)
+                    if (itemToSelect == item) {
                         itemToSelect = null;
+                    }
                     iter.remove();
                     break;
@@ -468,6 +470,7 @@
             keys.setSelectedItem(itemToSelect);
             /* don't add single chars, as they are no properly selected */
-            if(lastAddValue != null && lastAddValue.length() > 1)
+            if(lastAddValue != null && lastAddValue.length() > 1) {
                 values.setSelectedItem(lastAddValue);
+            }
         }
 
@@ -506,5 +509,5 @@
         // get the combo box' editor component
         JTextComponent editor = (JTextComponent)values.getEditor()
-        .getEditorComponent();
+                .getEditorComponent();
         // Refresh the values model when focus is gained
         FocusAdapter focus = new FocusAdapter() {
@@ -632,5 +635,5 @@
         propertyMenu.addSeparator();
         propertyMenu.add(helpAction);
-        
+
         propertyData.setColumnIdentifiers(new String[]{tr("Key"),tr("Value")});
         propertyTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
@@ -813,9 +816,9 @@
         getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(
                 KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0),"delete"
-        );
+                );
         getActionMap().put("delete", deleteAction);
 
         JScrollPane scrollPane = (JScrollPane) createLayout(bothTables, true, Arrays.asList(new SideButton[] {
-            this.btnAdd, this.btnEdit, this.btnDel
+                this.btnAdd, this.btnEdit, this.btnDel
         }));
 
@@ -962,5 +965,5 @@
                 return comp;
             }}
-        );
+                );
 
         for (Relation r: sortedRelations) {
@@ -1027,5 +1030,5 @@
             super(tr("Delete"), "dialogs/delete", tr("Delete the selected key in all objects"),
                     Shortcut.registerShortcut("properties:delete", tr("Delete Properties"), KeyEvent.VK_D,
-                    Shortcut.GROUP_MNEMONIC), false);
+                            Shortcut.GROUP_MNEMONIC), false);
             updateEnabledState();
         }
@@ -1098,5 +1101,5 @@
                     (propertyTable != null && propertyTable.getSelectedRowCount() == 1)
                     ^ (membershipTable != null && membershipTable.getSelectedRowCount() == 1)
-            );
+                    );
         }
 
@@ -1111,5 +1114,5 @@
             super(tr("Add"), "dialogs/add", tr("Add a new key/value pair to all objects"),
                     Shortcut.registerShortcut("properties:add", tr("Add Property"), KeyEvent.VK_A,
-                    Shortcut.GROUP_MNEMONIC), false);
+                            Shortcut.GROUP_MNEMONIC), false);
         }
 
@@ -1124,5 +1127,5 @@
             super(tr("Edit"), "dialogs/edit", tr("Edit the value of the selected key for all objects"),
                     Shortcut.registerShortcut("properties:edit", tr("Edit Properties"), KeyEvent.VK_S,
-                    Shortcut.GROUP_MNEMONIC), false);
+                            Shortcut.GROUP_MNEMONIC), false);
             updateEnabledState();
         }
@@ -1146,5 +1149,5 @@
                     (propertyTable != null && propertyTable.getSelectedRowCount() == 1)
                     ^ (membershipTable != null && membershipTable.getSelectedRowCount() == 1)
-            );
+                    );
         }
 
@@ -1174,5 +1177,5 @@
                             ((Map<String,Integer>)propertyData.getValueAt(row, 1))
                             .entrySet().iterator().next().getKey(), "UTF-8"
-                    );
+                            );
 
                     uris.add(new URI(String.format("%s%sTag:%s=%s", base, lang, key, val)));
@@ -1186,5 +1189,5 @@
                     String type = URLEncoder.encode(
                             ((Relation)membershipData.getValueAt(row, 0)).get("type"), "UTF-8"
-                    );
+                            );
 
                     if (type != null && !type.equals("")) {
@@ -1220,5 +1223,5 @@
                                             .replace("=", "%3D") /* do not URLencode whole string! */
                                             .replaceFirst("/wiki/", "/w/index.php?redirect=no&title=")
-                                    ).toURL().openConnection();
+                                            ).toURL().openConnection();
                                     conn.setConnectTimeout(Main.pref.getInteger("socket.timeout.connect",15)*1000);
 
@@ -1257,5 +1260,5 @@
         return propertyMenu.add(a);
     }
-    
+
     public void addPropertyPopupMenuListener(PopupMenuListener l) {
         propertyMenu.addPopupMenuListener(l);
@@ -1265,5 +1268,5 @@
         propertyMenu.addPopupMenuListener(l);
     }
-    
+
     @SuppressWarnings("unchecked")
     public Tag getSelectedProperty() {
@@ -1272,16 +1275,16 @@
         TreeMap<String, Integer> map = (TreeMap<String, Integer>) propertyData.getValueAt(row, 1);
         return new Tag(
-                propertyData.getValueAt(row, 0).toString(), 
+                propertyData.getValueAt(row, 0).toString(),
                 map.size() > 1 ? "" : map.keySet().iterator().next());
     }
-    
+
     public void addMembershipPopupMenuSeparator() {
         membershipMenu.addSeparator();
     }
-    
+
     public JMenuItem addMembershipPopupMenuAction(Action a) {
         return membershipMenu.add(a);
     }
-    
+
     public void addMembershipPopupMenuListener(PopupMenuListener l) {
         membershipMenu.addPopupMenuListener(l);
@@ -1291,5 +1294,5 @@
         membershipMenu.addPopupMenuListener(l);
     }
-    
+
     public IRelation getSelectedMembershipRelation() {
         int row = membershipTable.getSelectedRow();
@@ -1301,5 +1304,5 @@
         public void setRelation(Relation relation);
     }
-    
+
     static abstract class AbstractRelationAction extends AbstractAction implements RelationRelated {
         protected Relation relation;
@@ -1311,5 +1314,5 @@
         }
     }
-    
+
     static class SelectRelationAction extends AbstractRelationAction {
         boolean selectionmode;
@@ -1382,5 +1385,5 @@
                     buildSetOfIncompleteMembers(relation),
                     Main.map.mapView.getEditLayer()
-            ));
+                    ));
         }
     }
@@ -1392,12 +1395,10 @@
         @Override
         public void actionPerformed(ActionEvent ae) {
-            if (propertyTable.getSelectedRowCount() != 1) {
+            if (propertyTable.getSelectedRowCount() != 1)
                 return;
-            }
             String key = propertyData.getValueAt(propertyTable.getSelectedRow(), 0).toString();
             Collection<OsmPrimitive> sel = Main.main.getCurrentDataSet().getSelected();
-            if (sel.isEmpty()) {
+            if (sel.isEmpty())
                 return;
-            }
             Set<String> values = new TreeSet<String>();
             for (OsmPrimitive p : sel) {
@@ -1470,12 +1471,10 @@
 
         public void actionPerformed(ActionEvent e) {
-            if (propertyTable.getSelectedRowCount() != 1) {
+            if (propertyTable.getSelectedRowCount() != 1)
                 return;
-            }
             String key = propertyData.getValueAt(propertyTable.getSelectedRow(), 0).toString();
             Collection<OsmPrimitive> sel = Main.main.getCurrentDataSet().getSelected();
-            if (sel.isEmpty()) {
+            if (sel.isEmpty())
                 return;
-            }
             String sep = "";
             String s = "";
Index: /trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java	(revision 4603)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java	(revision 4604)
@@ -460,20 +460,18 @@
 
         @Override
-        public void executeMultikeyAction(int index) {
+        public void executeMultikeyAction(int index, boolean repeat) {
             Layer l = LayerListDialog.getLayerForIndex(index);
-            if (l != null && l instanceof MarkerLayer) {
-                execute((MarkerLayer) l);
-            }
-        }
-
-        @Override
-        public void repeateLastMultikeyAction() {
-            if (lastLayer != null) {
-                MarkerLayer l = lastLayer.get();
+            if (l != null) {
+                if (l instanceof MarkerLayer) {
+                    execute((MarkerLayer) l);
+                }
+            } else if (repeat && lastLayer != null) {
+                l = lastLayer.get();
                 if (LayerListDialog.isLayerValid(l)) {
-                    execute(l);
-                }
-            }
-        }
+                    execute((MarkerLayer) l);
+                }
+            }
+        }
+
 
         private void execute(MarkerLayer l) {
@@ -516,17 +514,14 @@
 
         @Override
-        public void executeMultikeyAction(int index) {
+        public void executeMultikeyAction(int index, boolean repeat) {
             Layer l = LayerListDialog.getLayerForIndex(index);
-            if (l != null && l instanceof MarkerLayer) {
-                execute((MarkerLayer) l);
-            }
-        }
-
-        @Override
-        public void repeateLastMultikeyAction() {
-            if (lastLayer != null) {
-                MarkerLayer l = lastLayer.get();
+            if (l != null) {
+                if (l instanceof MarkerLayer) {
+                    execute((MarkerLayer) l);
+                }
+            } else if (repeat && lastLayer != null) {
+                l = lastLayer.get();
                 if (LayerListDialog.isLayerValid(l)) {
-                    execute(l);
+                    execute((MarkerLayer) l);
                 }
             }
Index: /trunk/src/org/openstreetmap/josm/tools/MultikeyActionsHandler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/MultikeyActionsHandler.java	(revision 4603)
+++ /trunk/src/org/openstreetmap/josm/tools/MultikeyActionsHandler.java	(revision 4604)
@@ -1,4 +1,6 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.tools;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.awt.KeyEventDispatcher;
@@ -21,5 +23,6 @@
 public class MultikeyActionsHandler {
 
-    private static final long DIALOG_DELAY = 2000;
+    private static final long DIALOG_DELAY = 1000;
+    private static final String STATUS_BAR_ID = new String("multikeyShortcut");
 
     private class MyKeyEventDispatcher implements KeyEventDispatcher {
@@ -31,13 +34,10 @@
 
             if (lastAction != null && e.getID() == KeyEvent.KEY_PRESSED) {
-                if (e.getKeyCode() == lastAction.shortcut.getKeyCode()) {
-                    lastAction.action.repeateLastMultikeyAction();
-                } else {
-                    int index = getIndex(e.getKeyChar());
-                    if (index >= 0) {
-                        lastAction.action.executeMultikeyAction(index);
-                    }
+                int index = getIndex(e.getKeyCode());
+                if (index >= 0) {
+                    lastAction.action.executeMultikeyAction(index, e.getKeyCode() == lastAction.shortcut.getKeyCode());
                 }
                 lastAction = null;
+                Main.map.statusLine.resetHelpText(STATUS_BAR_ID);
                 return true;
             }
@@ -45,7 +45,9 @@
         }
 
-        private int getIndex(char lastKey) {
-            if (lastKey >= KeyEvent.VK_0 && lastKey <= KeyEvent.VK_9)
-                return lastKey - KeyEvent.VK_0;
+        private int getIndex(int lastKey) {
+            if (lastKey >= KeyEvent.VK_1 && lastKey <= KeyEvent.VK_9)
+                return lastKey - KeyEvent.VK_1;
+            else if (lastKey == KeyEvent.VK_0)
+                return 9;
             else if (lastKey >= KeyEvent.VK_A && lastKey <= KeyEvent.VK_Z)
                 return lastKey - KeyEvent.VK_A + 10;
@@ -70,4 +72,5 @@
             lastAction = this;
             timer.schedule(new MyTimerTask(lastTimestamp, lastAction), DIALOG_DELAY);
+            Main.map.statusLine.setHelpText(STATUS_BAR_ID, tr("{0}... [please type its number]", (String) action.getValue(SHORT_DESCRIPTION)));
         }
 
@@ -132,6 +135,14 @@
         layers.add(lbTitle);
 
+        char repeatKey = (char) action.shortcut.getKeyCode();
+        boolean repeatKeyUsed = false;
+
 
         for (final MultikeyInfo info: action.action.getMultikeyCombinations()) {
+
+            if (info.getShortcut() == repeatKey) {
+                repeatKeyUsed = true;
+            }
+
             JMenuItem item = new JMenuItem(formatMenuText(action.shortcut, String.valueOf(info.getShortcut()), info.getDescription()));
             item.setMnemonic(info.getShortcut());
@@ -139,5 +150,6 @@
                 @Override
                 public void actionPerformed(ActionEvent e) {
-                    action.action.executeMultikeyAction(info.getIndex());
+                    Main.map.statusLine.resetHelpText(STATUS_BAR_ID);
+                    action.action.executeMultikeyAction(info.getIndex(), false);
                 }
             });
@@ -145,16 +157,20 @@
         }
 
-        MultikeyInfo lastLayer = action.action.getLastMultikeyAction();
-        if (lastLayer != null) {
-            JMenuItem repeateItem = new JMenuItem(formatMenuText(action.shortcut,
-                    KeyEvent.getKeyText(action.shortcut.getKeyCode()),
-                    "Repeat " + lastLayer.getDescription()));
-            repeateItem.addActionListener(new ActionListener() {
-                @Override
-                public void actionPerformed(ActionEvent e) {
-                    action.action.repeateLastMultikeyAction();
-                }
-            });
-            layers.add(repeateItem);
+        if (!repeatKeyUsed) {
+            MultikeyInfo lastLayer = action.action.getLastMultikeyAction();
+            if (lastLayer != null) {
+                JMenuItem repeateItem = new JMenuItem(formatMenuText(action.shortcut,
+                        KeyEvent.getKeyText(action.shortcut.getKeyCode()),
+                        "Repeat " + lastLayer.getDescription()));
+                repeateItem.setMnemonic(action.shortcut.getKeyCode());
+                repeateItem.addActionListener(new ActionListener() {
+                    @Override
+                    public void actionPerformed(ActionEvent e) {
+                        Main.map.statusLine.resetHelpText(STATUS_BAR_ID);
+                        action.action.executeMultikeyAction(-1, true);
+                    }
+                });
+                layers.add(repeateItem);
+            }
         }
 
Index: /trunk/src/org/openstreetmap/josm/tools/MultikeyShortcutAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/MultikeyShortcutAction.java	(revision 4603)
+++ /trunk/src/org/openstreetmap/josm/tools/MultikeyShortcutAction.java	(revision 4604)
@@ -22,6 +22,8 @@
 
         public char getShortcut() {
-            if (index < 10)
-                return (char)('0' + index);
+            if (index < 9)
+                return (char)('1' + index);
+            else if (index == 9)
+                return '0';
             else
                 return (char)('A' +  index - 10);
@@ -33,6 +35,5 @@
     }
 
-    void executeMultikeyAction(int index);
-    void repeateLastMultikeyAction();
+    void executeMultikeyAction(int index, boolean repeatLastAction);
     List<MultikeyInfo> getMultikeyCombinations();
     MultikeyInfo getLastMultikeyAction();
