Index: trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- trunk/src/org/openstreetmap/josm/Main.java	(revision 8071)
+++ trunk/src/org/openstreetmap/josm/Main.java	(revision 8072)
@@ -221,5 +221,5 @@
      * The MOTD Layer.
      */
-    private GettingStarted gettingStarted = new GettingStarted();
+    public final GettingStarted gettingStarted = new GettingStarted();
 
     private static final Collection<MapFrameListener> mapFrameListeners = new ArrayList<>();
Index: trunk/src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 8071)
+++ trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 8072)
@@ -442,4 +442,5 @@
                 splash.dispose();
                 mainFrame.setVisible(true);
+                main.gettingStarted.requestFocusInWindow();
             }
         });
Index: trunk/src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 8071)
+++ trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 8072)
@@ -7,10 +7,18 @@
 
 import java.awt.Component;
+import java.awt.Dimension;
 import java.awt.GraphicsEnvironment;
+import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
+import javax.swing.Action;
+import javax.swing.Box;
 import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JComponent;
 import javax.swing.JMenu;
 import javax.swing.JMenuBar;
@@ -18,5 +26,10 @@
 import javax.swing.JPopupMenu;
 import javax.swing.JSeparator;
+import javax.swing.JTextField;
 import javax.swing.KeyStroke;
+import javax.swing.MenuElement;
+import javax.swing.MenuSelectionManager;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
 import javax.swing.event.MenuEvent;
 import javax.swing.event.MenuListener;
@@ -117,4 +130,5 @@
 import org.openstreetmap.josm.gui.tagging.TaggingPresetSearchAction;
 import org.openstreetmap.josm.gui.tagging.TaggingPresetSearchPrimitiveDialog;
+import org.openstreetmap.josm.gui.widgets.DisableShortcutsOnFocusGainedTextField;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -388,4 +402,9 @@
     public FullscreenToggleAction fullscreenToggleAction = null;
 
+    /**
+     * Popup menu to display menu items search result.
+     */
+    private JPopupMenu searchResultsMenu = new JPopupMenu();
+
     /** this menu listener hides unnecessary JSeparators in a menu list but does not remove them.
      * If at a later time the separators are required, they will be made visible again. Intended
@@ -777,9 +796,73 @@
                 Shortcut.DIRECT).getKeyStroke());
         add(helpMenu, about);
-
+        add(Box.createHorizontalGlue());
+        add(createSearchField());
 
         windowMenu.addMenuListener(menuSeparatorHandler);
 
         new PresetsMenuEnabler(presetsMenu).refreshEnabled();
+    }
+
+    /**
+     * Create search field.
+     */
+    private JComponent createSearchField() {
+        DisableShortcutsOnFocusGainedTextField searchField = new DisableShortcutsOnFocusGainedTextField();
+        searchField.setEditable(true);
+        Dimension d = new Dimension(200, helpMenu.getPreferredSize().height);
+        searchField.setPreferredSize(d);
+        searchField.setMaximumSize(d);
+        searchField.setHint(tr("Search menu items"));
+        searchField.setToolTipText(tr("Search menu items"));
+        searchField.addKeyListener(new SearchFieldKeyListener());
+        searchField.getDocument().addDocumentListener(new SearchFieldTextListener(this, searchField));
+        return searchField;
+    }
+
+    /**
+     * Search main menu for items with {@code textToFind} in title.
+     * @param textToFind The text to find
+     * @return not null list of found menu items.
+     */
+    private List<JMenuItem> findMenuItems(String textToFind) {
+        textToFind = textToFind.toLowerCase();
+        List<JMenuItem> result = new ArrayList<>();
+
+        // Iterate over main menus
+        for (MenuElement menuElement : getSubElements()) {
+            if( !(menuElement instanceof JMenu)) continue;
+
+            JMenu mainMenuItem = (JMenu) menuElement;
+            if(mainMenuItem.getAction()!=null && mainMenuItem.getText().toLowerCase().contains(textToFind)) {
+                result.add(mainMenuItem);
+            }
+
+            //Search recursively
+            findMenuItems(mainMenuItem, textToFind, result);
+        }
+        return result;
+    }
+
+    /**
+     * Recursive walker for menu items. Only menu items with action are selected. If menu item
+     * contains {@code textToFind} it's appended to result.
+     * @param menu menu in which search will be performed
+     * @param textToFind The text to find
+     * @param result resulting list ofmenu items
+     */
+    private void findMenuItems(final JMenu menu, final String textToFind, final List<JMenuItem> result) {
+        for (int i=0; i<menu.getItemCount(); i++) {
+            JMenuItem menuItem = menu.getItem(i);
+            if (menuItem == null) continue;
+
+            if (menuItem.getAction()!=null && menuItem.getText().toLowerCase().contains(textToFind)) {
+                result.add(menuItem);
+            }
+
+            // Go recursive if needed
+            if (menuItem instanceof JMenu) {
+                findMenuItems((JMenu) menuItem, textToFind, result);
+            }
+        }
     }
 
@@ -831,3 +914,101 @@
         }
     }
+
+    /**
+     * This listener is designed to handle ENTER key pressed in menu search field.
+     * When user presses Enter key then selected item of "searchResultsMenu" is triggered.
+     */
+    private class SearchFieldKeyListener implements KeyListener {
+
+        @Override
+        public void keyPressed(KeyEvent e) {
+            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
+                // On ENTER selected menu item must be triggered
+                MenuElement[] selection = MenuSelectionManager.defaultManager().getSelectedPath();
+                if(selection.length > 1) {
+                    MenuElement selectedElement = selection[selection.length-1];
+                    if(selectedElement instanceof JMenuItem) {
+                        JMenuItem selectedItem = (JMenuItem) selectedElement;
+                        Action menuAction = selectedItem.getAction();
+                        menuAction.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null));
+                        e.consume();
+                    }
+                }
+            }
+        }
+
+        @Override
+        public void keyTyped(KeyEvent e) { }
+
+        @Override
+        public void keyReleased(KeyEvent e) { }
+    }
+
+    private class SearchFieldTextListener implements DocumentListener {
+        private final JTextField searchField;
+        private final MainMenu mainMenu;
+        private String currentSearchText = null;
+
+        public SearchFieldTextListener(MainMenu mainMenu, JTextField searchField) {
+            this.mainMenu = mainMenu;
+            this.searchField = searchField;
+        }
+
+        @Override
+        public void insertUpdate(DocumentEvent e) {
+            doSearch(searchField.getText());
+        }
+
+        @Override
+        public void removeUpdate(DocumentEvent e) {
+            doSearch(searchField.getText());
+        }
+
+        @Override
+        public void changedUpdate(DocumentEvent e) {
+            doSearch(searchField.getText());
+        }
+
+        //TODO: perform some delay (maybe 200 ms) before actual searching.
+        void doSearch(String searchTerm) {
+            searchTerm = searchTerm.trim().toLowerCase();
+
+            if (searchTerm.equals(currentSearchText)) {
+                return;
+            }
+            currentSearchText = searchTerm;
+            if (searchTerm.length() == 0) {
+                //No text to search
+                hideMenu();
+                return;
+            }
+
+            List<JMenuItem> searchResult = mainMenu.findMenuItems(currentSearchText);
+            if(searchResult.size() == 0) {
+                //Nothing found
+                hideMenu();
+                return;
+            }
+
+            if(searchResult.size() > 20) {
+                //Too many items found...
+                searchResult = searchResult.subList(0, 20);
+            }
+
+            //Update Popup menu
+            searchResultsMenu.removeAll();
+            for (JMenuItem foundItem : searchResult) {
+                searchResultsMenu.add(foundItem.getText()).setAction(foundItem.getAction());
+            }
+            searchResultsMenu.pack();
+            searchResultsMenu.show(mainMenu, searchField.getX(), searchField.getY() + searchField.getHeight()); //Put menu right under search field
+
+            searchField.grabFocus(); //This is tricky. User still is able to edit search text. While Up and Down keys are handled by Popup Menu.
+        }
+
+        private void hideMenu() {
+            searchResultsMenu.setVisible(false);
+        }
+
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 8071)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 8072)
@@ -587,4 +587,8 @@
                             dialogsPanel.reconstruct(Action.ELEMENT_SHRINKS, null);
                             hideNotify();
+                            if (Main.map != null) {
+                                // To avoid menu bar search field from taking focus when a toggle dialog is closed
+                                Main.map.requestFocusInWindow();
+                            }
                         }
                     }
Index: trunk/src/org/openstreetmap/josm/gui/util/AdvancedKeyPressDetector.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/util/AdvancedKeyPressDetector.java	(revision 8071)
+++ trunk/src/org/openstreetmap/josm/gui/util/AdvancedKeyPressDetector.java	(revision 8072)
@@ -23,6 +23,6 @@
 
 /**
- * Helper object that allows cross-platform detection of key press and realease events
- * instance is available globally as Main.map.keyDetector
+ * Helper object that allows cross-platform detection of key press and release events
+ * instance is available globally as {@code Main.map.keyDetector}.
  * @since 7217
  */
