diff --git a/src/js/_enqueues/lib/admin-bar.js b/src/js/_enqueues/lib/admin-bar.js
index 8cb94ea72f..deab1b4f62 100644
--- a/src/js/_enqueues/lib/admin-bar.js
+++ b/src/js/_enqueues/lib/admin-bar.js
@@ -149,7 +149,8 @@
 	function toggleHoverIfEnter( event ) {
 		var wrapper;
 
-		if ( event.which !== 13 ) {
+		// Follow link if pressing Ctrl and/or Shift with Enter (opening in a new tab or window).
+		if ( event.which !== 13 || event.ctrlKey || event.shiftKey ) {
 			return;
 		}
 
@@ -336,6 +337,11 @@
 
 			element.className += className;
 		}
+
+		var menuItemToggle = element.querySelector( 'a' );
+		if ( className === 'hover' && menuItemToggle && menuItemToggle.hasAttribute( 'aria-expanded' ) ) {
+			menuItemToggle.setAttribute( 'aria-expanded', 'true' );
+		}
 	}
 
 	/**
@@ -366,6 +372,11 @@
 
 			element.className = classes.replace( /^[\s]+|[\s]+$/g, '' );
 		}
+
+		var menuItemToggle = element.querySelector( 'a' );
+		if ( className === 'hover' && menuItemToggle && menuItemToggle.hasAttribute( 'aria-expanded' ) ) {
+			menuItemToggle.setAttribute( 'aria-expanded', 'false' );
+		}
 	}
 
 	/**
diff --git a/src/wp-includes/admin-bar.php b/src/wp-includes/admin-bar.php
index ba85e1f1ae..caa50ab9e4 100644
--- a/src/wp-includes/admin-bar.php
+++ b/src/wp-includes/admin-bar.php
@@ -133,6 +133,9 @@ function wp_admin_bar_wp_menu( $wp_admin_bar ) {
 		'id'    => 'wp-logo',
 		'title' => '<span class="ab-icon" aria-hidden="true"></span><span class="screen-reader-text">' . __( 'About WordPress' ) . '</span>',
 		'href'  => $about_url,
+		'meta' => array(
+			'menu_title' => __( 'About WordPress' ),
+		),
 	);
 
 	// Set tabindex="0" to make sub menus accessible when no URL is available.
@@ -252,6 +255,7 @@ function wp_admin_bar_my_account_item( $wp_admin_bar ) {
 			'href'   => $profile_url,
 			'meta'   => array(
 				'class' => $class,
+				'menu_title' => sprintf( __( 'Howdy, %s' ), $current_user->display_name ),
 			),
 		)
 	);
@@ -300,9 +304,6 @@ function wp_admin_bar_my_account_menu( $wp_admin_bar ) {
 			'id'     => 'user-info',
 			'title'  => $user_info,
 			'href'   => $profile_url,
-			'meta'   => array(
-				'tabindex' => -1,
-			),
 		)
 	);
 
@@ -366,6 +367,9 @@ function wp_admin_bar_site_menu( $wp_admin_bar ) {
 			'id'    => 'site-name',
 			'title' => $title,
 			'href'  => ( is_admin() || ! current_user_can( 'read' ) ) ? home_url( '/' ) : admin_url(),
+			'meta' => array(
+				'menu_title' => $title,
+			),
 		)
 	);
 
@@ -894,6 +898,9 @@ function wp_admin_bar_new_content_menu( $wp_admin_bar ) {
 			'id'    => 'new-content',
 			'title' => $title,
 			'href'  => admin_url( current( array_keys( $actions ) ) ),
+			'meta' => array(
+				'menu_title' => _x( 'New', 'admin bar menu group label' ),
+			),
 		)
 	);
 
diff --git a/src/wp-includes/class-wp-admin-bar.php b/src/wp-includes/class-wp-admin-bar.php
index 2d8814e590..b3e4f2f5e1 100644
--- a/src/wp-includes/class-wp-admin-bar.php
+++ b/src/wp-includes/class-wp-admin-bar.php
@@ -123,7 +123,7 @@ class WP_Admin_Bar {
 	 *     @type string $href   Optional. Link for the item.
 	 *     @type bool   $group  Optional. Whether or not the node is a group. Default false.
 	 *     @type array  $meta   Meta data including the following keys: 'html', 'class', 'rel', 'lang', 'dir',
-	 *                          'onclick', 'target', 'title', 'tabindex'. Default empty.
+	 *                          'onclick', 'target', 'title', 'tabindex', 'menu_title. Default empty.
 	 * }
 	 */
 	public function add_node( $args ) {
@@ -472,9 +472,6 @@ class WP_Admin_Bar {
 				}
 				?>
 			</div>
-			<?php if ( is_user_logged_in() ) : ?>
-			<a class="screen-reader-shortcut" href="<?php echo esc_url( wp_logout_url() ); ?>"><?php _e( 'Log Out' ); ?></a>
-			<?php endif; ?>
 		</div>
 
 		<?php
@@ -501,8 +498,9 @@ class WP_Admin_Bar {
 	 * @since 3.3.0
 	 *
 	 * @param object $node
+	 * @param string $menu_title
 	 */
-	final protected function _render_group( $node ) {
+	final protected function _render_group( $node, $menu_title = false ) {
 		if ( 'container' === $node->type ) {
 			$this->_render_container( $node );
 			return;
@@ -517,11 +515,15 @@ class WP_Admin_Bar {
 			$class = '';
 		}
 
-		echo "<ul id='" . esc_attr( 'wp-admin-bar-' . $node->id ) . "'$class>";
+		if ( empty( $menu_title ) ) {
+				echo "<ul role='menu' id='" . esc_attr( 'wp-admin-bar-' . $node->id ) . "'$class>";
+			} else {
+				echo "<ul role='menu' aria-label='" . esc_attr( $menu_title ) . "' id='" . esc_attr( 'wp-admin-bar-' . $node->id ) . "'$class>";
+			}
 		foreach ( $node->children as $item ) {
 			$this->_render_item( $item );
 		}
-		echo '</ul>';
+			echo "</ul>";
 	}
 
 	/**
@@ -542,13 +544,14 @@ class WP_Admin_Bar {
 		// Allow only numeric values, then casted to integers, and allow a tabindex value of `0` for a11y.
 		$tabindex        = ( isset( $node->meta['tabindex'] ) && is_numeric( $node->meta['tabindex'] ) ) ? (int) $node->meta['tabindex'] : '';
 		$aria_attributes = ( '' !== $tabindex ) ? ' tabindex="' . $tabindex . '"' : '';
+		$aria_attributes .= ' role="menuitem"';
 
 		$menuclass = '';
 		$arrow     = '';
 
 		if ( $is_parent ) {
 			$menuclass        = 'menupop ';
-			$aria_attributes .= ' aria-haspopup="true"';
+			$aria_attributes .= ' aria-expanded="false"';
 		}
 
 		if ( ! empty( $node->meta['class'] ) ) {
@@ -597,7 +600,11 @@ class WP_Admin_Bar {
 		if ( $is_parent ) {
 			echo '<div class="ab-sub-wrapper">';
 			foreach ( $node->children as $group ) {
-				$this->_render_group( $group );
+				if ( empty( $node->meta[ 'menu_title' ] ) ) {
+					$this->_render_group( $group, false );
+				} else {
+					$this->_render_group( $group, $node->meta[ 'menu_title' ] );
+				}
 			}
 			echo '</div>';
 		}
