Index: src/wp-admin/css/edit.css
===================================================================
--- src/wp-admin/css/edit.css	(revision 36378)
+++ src/wp-admin/css/edit.css	(working copy)
@@ -1105,13 +1105,13 @@
 }
 
 .ac_results {
+	display: none;
+	margin: -1px 0 0;
 	padding: 0;
-	margin: 0;
 	list-style: none;
 	position: absolute;
 	z-index: 10000;
-	display: none;
-	border: 1px solid #808080;
+	border: 1px solid #5b9dd9;
 	background-color: #fff;
 }
 
@@ -1120,15 +1120,16 @@
 }
 
 .ac_results li {
-	padding: 2px 5px;
+	margin: 0;
+	padding: 5px 10px;
 	white-space: nowrap;
-	color: #101010;
-	text-align: left;
+	cursor: pointer;
 }
 
-.ac_over {
-	background-color: #f0f0b8;
-	cursor: pointer;
+.ac_results .ac_over,
+.ac_over .ac_match {
+	background-color: #0073aa;
+	color: #fff;
 }
 
 .ac_match {
Index: src/wp-includes/js/jquery/suggest.js
===================================================================
--- src/wp-includes/js/jquery/suggest.js	(revision 36378)
+++ src/wp-includes/js/jquery/suggest.js	(working copy)
@@ -12,31 +12,62 @@
  *
  */
 
-(function($) {
+window.wp = window.wp || {};
 
+( function( $, wp ) {
+
+	var uid = 1,
+		l10n = window.suggestL10n;
+
 	$.suggest = function(input, options) {
 		var $input, $results, timeout, prevLength, cache, cacheSize;
 
-		$input = $(input).attr("autocomplete", "off");
-		$results = $("<ul/>");
+		$input = $( input ).attr({
+			'autocomplete': 'off',
+			'autocorrect': 'off',
+			'autocapitalize': 'none',
+			'spellcheck': 'false',
+			'role': 'combobox',
+			'aria-owns': 'results-list-' + uid,
+			'aria-autocomplete': 'list',
+			'aria-expanded': 'false'
+		});
 
-		timeout = false;		// hold timeout ID for suggestion results to appear
-		prevLength = 0;			// last recorded length of $input.val()
-		cache = [];				// cache MRU list
-		cacheSize = 0;			// size of cache in chars (bytes?)
+		$results = $("<ul/>").attr({
+			'id': 'results-list-' + uid,
+			'role': 'listbox'
+		});
 
+		// Increment the unique ID in case of multiple suggest on the same page.
+		uid++;
+
+		// Hold timeout ID for suggestion results to appear.
+		timeout = false;
+		// Last recorded length of $input.val().
+		prevLength = 0;
+		// Cache MRU list
+		cache = [];
+		// Size of cache in chars (bytes?).
+		cacheSize = 0;
+
 		$results.addClass(options.resultsClass).appendTo('body');
 
+		resetPosition();
 
-		resetPosition();
 		$(window)
 			.on( 'load', resetPosition ) // just in case user is changing size of page while loading
 			.on( 'resize', resetPosition );
 
-		$input.blur(function() {
-			setTimeout(function() { $results.hide() }, 200);
-		});
+		$input.blur( function() {
+			if ( timeout ) {
+				clearTimeout( timeout );
+			}
 
+			setTimeout( function() {
+				hideItems();
+			}, 200 );
+ 		});
+
 		$input.keydown(processKey);
 
 		function resetPosition() {
@@ -48,7 +79,6 @@
 			});
 		}
 
-
 		function processKey(e) {
 
 			// handling up/down/escape requires results to be visible
@@ -80,7 +110,7 @@
 						break;
 
 					case 27: //	escape
-						$results.hide();
+						hideItems();
 						break;
 
 				}
@@ -93,11 +123,8 @@
 				prevLength = $input.val().length;
 
 			}
-
-
 		}
 
-
 		function suggest() {
 
 			var q = $.trim($input.val()), multipleSepPos, items;
@@ -120,7 +147,7 @@
 
 					$.get(options.source, {q: q}, function(txt) {
 
-						$results.hide();
+						hideItems();
 
 						items = parseTxt(txt, q);
 
@@ -133,7 +160,7 @@
 
 			} else {
 
-				$results.hide();
+				hideItems();
 
 			}
 
@@ -170,22 +197,36 @@
 		}
 
 		function displayItems(items) {
-			var html = '', i;
+			var html = '', i, ariaLabel;
 			if (!items)
 				return;
 
 			if (!items.length) {
-				$results.hide();
+				hideItems();
 				return;
 			}
 
 			resetPosition(); // when the form moves after the page has loaded
 
-			for (i = 0; i < items.length; i++)
-				html += '<li>' + items[i] + '</li>';
+			for ( i = 0; i < items.length; i++ ) {
+				uid++;
+				/*
+				 * `aria-label` is used just to override the results text which
+				 * is split in two parts, the highlighted term and other parts of the term.
+				 */
+				ariaLabel = '<span>' + items[i] + '</span>';
+				ariaLabel = $( ariaLabel ).text();
+				html += '<li role="option" id="suggestion-' + uid + '" aria-label="' + ariaLabel + '">' + items[i] + '</li>';
+			}
 
 			$results.html(html).show();
 
+			$input.attr( 'aria-expanded', 'true' );
+
+			setTimeout( function() {
+				wp.a11y.speak( l10n.suggestionsFound.replace( '%d', items.length ) );
+			}, 10 );
+
 			$results
 				.children('li')
 				.mouseover(function() {
@@ -200,6 +241,11 @@
 
 		}
 
+		function hideItems() {
+			$results.hide();
+			$input.attr( 'aria-expanded', 'false' );
+		}
+
 		function parseTxt(txt, q) {
 
 			var items = [], tokens = txt.split(options.delimiter), i, token;
@@ -249,8 +295,9 @@
 				} else {
 					$input.val($currentResult.text());
 				}
-				$results.hide();
-				$input.trigger('change');
+				hideItems();
+				$input.trigger( 'change' ).removeAttr( 'aria-activedescendant' );
+				wp.a11y.speak( l10n.selected + ' ' + $currentResult.text() );
 
 				if (options.onSelect)
 					options.onSelect.apply($input[0]);
@@ -263,27 +310,41 @@
 
 			$currentResult = getCurrentResult();
 
-			if ($currentResult)
+			if ( $currentResult ) {
 				$currentResult
 					.removeClass(options.selectClass)
 					.next()
 						.addClass(options.selectClass);
-			else
+
+				if ( $currentResult.next().length ) {
+					$input.attr( 'aria-activedescendant', $currentResult.next().attr( 'id' ) );
+				} else {
+					$input.removeAttr( 'aria-activedescendant' );
+				}
+			} else {
 				$results.children('li:first-child').addClass(options.selectClass);
-
+				$input.attr( 'aria-activedescendant', $results.children( 'li:first-child' ).attr( 'id' ) );
+			}
 		}
 
 		function prevResult() {
 			var $currentResult = getCurrentResult();
 
-			if ($currentResult)
+			if ( $currentResult ) {
 				$currentResult
 					.removeClass(options.selectClass)
 					.prev()
 						.addClass(options.selectClass);
-			else
-				$results.children('li:last-child').addClass(options.selectClass);
 
+				if ( $currentResult.prev().length ) {
+					$input.attr( 'aria-activedescendant', $currentResult.prev().attr( 'id' ) );
+				} else {
+					$input.removeAttr( 'aria-activedescendant' );
+				}
+			} else {
+ 				$results.children( 'li:last-child' ).addClass( options.selectClass );
+				$input.attr( 'aria-activedescendant', $results.children( 'li:last-child' ).attr( 'id' ) );
+			}
 		}
 	}
 
@@ -313,4 +374,4 @@
 
 	};
 
-})(jQuery);
+})( jQuery, window.wp );
Index: src/wp-includes/script-loader.php
===================================================================
--- src/wp-includes/script-loader.php	(revision 36378)
+++ src/wp-includes/script-loader.php	(working copy)
@@ -235,6 +235,11 @@
 	// jQuery plugins
 	$scripts->add( 'jquery-color', "/wp-includes/js/jquery/jquery.color.min.js", array('jquery'), '2.1.1', 1 );
 	$scripts->add( 'suggest', "/wp-includes/js/jquery/suggest$suffix.js", array('jquery'), '1.1-20110113', 1 );
+	did_action( 'init' ) && $scripts->localize( 'suggest', 'suggestL10n', array(
+		'suggestionsFound' => __( 'Suggestions found: %d' ),
+		'selected'         => __( 'Selected:' ),
+	) );
+
 	$scripts->add( 'schedule', '/wp-includes/js/jquery/jquery.schedule.js', array('jquery'), '20m', 1 );
 	$scripts->add( 'jquery-query', "/wp-includes/js/jquery/jquery.query.js", array('jquery'), '2.1.7', 1 );
 	$scripts->add( 'jquery-serialize-object', "/wp-includes/js/jquery/jquery.serialize-object.js", array('jquery'), '0.2', 1 );
@@ -499,7 +504,7 @@
 			'postBoxEmptyString' => __( 'Drag boxes here' ),
 		) );
 
-		$scripts->add( 'tags-box', "/wp-admin/js/tags-box$suffix.js", array( 'jquery', 'suggest' ), false, 1 );
+		$scripts->add( 'tags-box', "/wp-admin/js/tags-box$suffix.js", array( 'jquery', 'suggest', 'wp-a11y' ), false, 1 );
 		did_action( 'init' ) && $scripts->localize( 'tags-box', 'tagsBoxL10n', array(
 			'tagDelimiter' => _x( ',', 'tag delimiter' ),
 		) );
