diff --git a/admin_menu.js b/admin_menu.js
index 600d0b6..00c15a1 100644
--- a/admin_menu.js
+++ b/admin_menu.js
@@ -277,8 +277,7 @@ Drupal.admin.behaviors.search = function (context, settings, $adminMenu) {
       needle = value;
       // Initialize the cache of menu links upon first search.
       if (!links && needle.length >= needleMinLength) {
-        // @todo Limit to links in dropdown menus; i.e., skip menu additions.
-        links = buildSearchIndex($adminMenu);
+        links = buildSearchIndex($adminMenu.find('li:not(.admin-menu-action, .admin-menu-action li) > a'));
       }
       // Empty results container when deleting search text.
       if (needle.length < needleMinLength) {
@@ -298,9 +297,8 @@ Drupal.admin.behaviors.search = function (context, settings, $adminMenu) {
   /**
    * Builds the search index.
    */
-  function buildSearchIndex($root) {
-    return $root
-      .find('li:not(.admin-menu-action, .admin-menu-action li) > a')
+  function buildSearchIndex($links) {
+    return $links
       .map(function () {
         var text = (this.textContent || this.innerText);
         // Skip menu entries that do not contain any text (e.g., the icon).
@@ -330,15 +328,16 @@ Drupal.admin.behaviors.search = function (context, settings, $adminMenu) {
    * Builds the search result list in a detached DOM node.
    */
   function buildResultsList(matches) {
-    var $html =$('<ul class="dropdown admin-menu-search-results" />');
+    var $html = $('<ul class="dropdown admin-menu-search-results" />');
     $.each(matches, function () {
       var result = this.text;
       var $element = $(this.element);
 
       // Check whether there is a top-level category that can be prepended.
       var $category = $element.closest('#admin-menu-wrapper > ul > li');
-      if ($category.length) {
-        result = $category.find('> a').text() + ': ' + result;
+      var categoryText = $category.find('> a').text()
+      if ($category.length && categoryText) {
+        result = categoryText + ': ' + result;
       }
 
       var $result = $('<li><a href="' + $element.attr('href') + '">' + result + '</a></li>');
@@ -350,8 +349,6 @@ Drupal.admin.behaviors.search = function (context, settings, $adminMenu) {
 
   /**
    * Highlights selected result.
-   *
-   * @todo Check whether this indirection is really required.
    */
   function resultsHandler(e) {
     var $this = $(this);
@@ -360,19 +357,39 @@ Drupal.admin.behaviors.search = function (context, settings, $adminMenu) {
   }
 
   /**
+   * Takes care of closing and clearing the results list.
+   */
+  function resultsClickHandler(e, link) {
+    var $original = $(this).data('original-link');
+    $original.trigger('mouseleave');
+    $input.val('').trigger('keyup');
+  }
+
+  /**
    * Shows the link in the menu that corresponds to a search result.
    */
   function highlightPathHandler(e, link) {
-    var $original = $(link).data('original-link');
-    var show = e.type === 'showPath';
-    // Toggle an additional CSS class to visually highlight the matching link.
-    // @todo Consider using same visual appearance as regular hover.
-    $original.toggleClass('highlight', show);
-    $original.trigger(show ? 'mouseenter' : 'mouseleave');
+    if (link) {
+      var $original = $(link).data('original-link');
+      var show = e.type === 'showPath';
+      // Toggle an additional CSS class to visually highlight the matching link.
+      // @todo Consider using same visual appearance as regular hover.
+      $original.toggleClass('highlight', show);
+      $original.trigger(show ? 'mouseenter' : 'mouseleave');
+    }
   }
 
   // Attach showPath/hidePath handler to search result entries.
   $results.delegate('li', 'mouseenter mouseleave focus blur', resultsHandler);
+  // Hide the result list after a link has been clicked, useful for overlay.
+  $results.delegate('li', 'click', resultsClickHandler);
+  // Same behavior as other menu links.
+  $input.parent().hoverIntent({
+    over: function () { $(this).find('ul').css('display', 'block'); },
+    out: function () { $(this).find('ul').css('display', 'none'); },
+    timeout: 400
+  });
+
   // Attach hover/active highlight behavior to search result entries.
   $adminMenu.delegate('.admin-menu-search-results li', 'showPath hidePath', highlightPathHandler);
   // Attach the search input event handler.
diff --git a/admin_menu.module b/admin_menu.module
index b3f170c..ef5b504 100644
--- a/admin_menu.module
+++ b/admin_menu.module
@@ -177,6 +177,7 @@ function admin_menu_page_build(&$page) {
   // performance. At least starting with Firefox 3.6, deferred .js files are
   // loaded, but Drupal.behaviors are not contained in the DOM when drupal.js
   // executes Drupal.attachBehaviors().
+  $attached['js'][$path . '/jquery.hoverIntent.minified.js'] = $options;
   $attached['js'][$path . '/admin_menu.js'] = $options;
 
   // Destination query strings are applied via JS.
diff --git a/jquery.hoverIntent.minified.js b/jquery.hoverIntent.minified.js
new file mode 100644
index 0000000..75c22ca
--- /dev/null
+++ b/jquery.hoverIntent.minified.js
@@ -0,0 +1,9 @@
+/**
+* hoverIntent r6 // 2011.02.26 // jQuery 1.5.1+
+* <http://cherne.net/brian/resources/jquery.hoverIntent.html>
+* 
+* @param  f  onMouseOver function || An object with configuration options
+* @param  g  onMouseOut function  || Nothing (use configuration options object)
+* @author    Brian Cherne brian(at)cherne(dot)net
+*/
+(function($){$.fn.hoverIntent=function(f,g){var cfg={sensitivity:7,interval:100,timeout:0};cfg=$.extend(cfg,g?{over:f,out:g}:f);var cX,cY,pX,pY;var track=function(ev){cX=ev.pageX;cY=ev.pageY};var compare=function(ev,ob){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);if((Math.abs(pX-cX)+Math.abs(pY-cY))<cfg.sensitivity){$(ob).unbind("mousemove",track);ob.hoverIntent_s=1;return cfg.over.apply(ob,[ev])}else{pX=cX;pY=cY;ob.hoverIntent_t=setTimeout(function(){compare(ev,ob)},cfg.interval)}};var delay=function(ev,ob){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);ob.hoverIntent_s=0;return cfg.out.apply(ob,[ev])};var handleHover=function(e){var ev=jQuery.extend({},e);var ob=this;if(ob.hoverIntent_t){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t)}if(e.type=="mouseenter"){pX=ev.pageX;pY=ev.pageY;$(ob).bind("mousemove",track);if(ob.hoverIntent_s!=1){ob.hoverIntent_t=setTimeout(function(){compare(ev,ob)},cfg.interval)}}else{$(ob).unbind("mousemove",track);if(ob.hoverIntent_s==1){ob.hoverIntent_t=setTimeout(function(){delay(ev,ob)},cfg.timeout)}}};return this.bind('mouseenter',handleHover).bind('mouseleave',handleHover)}})(jQuery);
\ No newline at end of file
