Index: wp-includes/nav-menu-template.php
===================================================================
--- wp-includes/nav-menu-template.php	(revision 38722)
+++ wp-includes/nav-menu-template.php	(working copy)
@@ -361,15 +361,7 @@
 		) {
 			$classes[] = 'current-menu-item';
 			$menu_items[$key]->current = true;
-			$_anc_id = (int) $menu_item->db_id;
 
-			while(
-				( $_anc_id = get_post_meta( $_anc_id, '_menu_item_menu_item_parent', true ) ) &&
-				! in_array( $_anc_id, $active_ancestor_item_ids )
-			) {
-				$active_ancestor_item_ids[] = $_anc_id;
-			}
-
 			if ( 'post_type' == $menu_item->type && 'page' == $menu_item->object ) {
 				// Back compat classes for pages to match wp_page_menu()
 				$classes[] = 'page_item';
@@ -376,9 +368,6 @@
 				$classes[] = 'page-item-' . $menu_item->object_id;
 				$classes[] = 'current_page_item';
 			}
-			$active_parent_item_ids[] = (int) $menu_item->menu_item_parent;
-			$active_parent_object_ids[] = (int) $menu_item->post_parent;
-			$active_object = $menu_item->object;
 
 		// if the menu item corresponds to the currently-queried post type archive
 		} elseif (
@@ -387,6 +376,7 @@
 		) {
 			$classes[] = 'current-menu-item';
 			$menu_items[$key]->current = true;
+
 		// if the menu item corresponds to the currently-requested URL
 		} elseif ( 'custom' == $menu_item->object && isset( $_SERVER['HTTP_HOST'] ) ) {
 			$_root_relative_current = untrailingslashit( $_SERVER['REQUEST_URI'] );
@@ -398,22 +388,11 @@
 			if ( $raw_item_url && in_array( $item_url, array( $current_url, $_indexless_current, $_root_relative_current ) ) ) {
 				$classes[] = 'current-menu-item';
 				$menu_items[$key]->current = true;
-				$_anc_id = (int) $menu_item->db_id;
 
-				while(
-					( $_anc_id = get_post_meta( $_anc_id, '_menu_item_menu_item_parent', true ) ) &&
-					! in_array( $_anc_id, $active_ancestor_item_ids )
-				) {
-					$active_ancestor_item_ids[] = $_anc_id;
-				}
-
 				if ( in_array( home_url(), array( untrailingslashit( $current_url ), untrailingslashit( $_indexless_current ) ) ) ) {
 					// Back compat for home link to match wp_page_menu()
 					$classes[] = 'current_page_item';
 				}
-				$active_parent_item_ids[] = (int) $menu_item->menu_item_parent;
-				$active_parent_object_ids[] = (int) $menu_item->post_parent;
-				$active_object = $menu_item->object;
 
 			// give front page item current-menu-item class when extra query arguments involved
 			} elseif ( $item_url == $front_page_url && is_front_page() ) {
@@ -424,6 +403,26 @@
 				$classes[] = 'menu-item-home';
 		}
 
+		// if current item, set active menu parent and ancestors
+		if ( $menu_items[$key]->current ) {
+			$active_parent_item_ids[] = (int) $menu_item->menu_item_parent;
+			$active_parent_object_ids[] = (int) $menu_item->post_parent;
+			$active_object = $menu_item->object;
+
+			$_anc_id = (int) $menu_item->menu_item_parent;
+			while(
+				! in_array( $_anc_id, $active_ancestor_item_ids )
+			) {
+				$active_ancestor_item_ids[] = $_anc_id;
+				foreach ( (array) $menu_items as $_key => $_parent ) {
+					if ( $_parent->db_id == $_anc_id ) {
+						$_anc_id = $_parent->menu_item_parent;
+						break;
+					}
+				}
+			}
+		}
+
 		// back-compat with wp_page_menu: add "current_page_parent" to static home page link for any non-page query
 		if ( ! empty( $home_page_id ) && 'post_type' == $menu_item->type && empty( $wp_query->is_page ) && $home_page_id == $menu_item->object_id )
 			$classes[] = 'current_page_parent';
@@ -430,6 +429,7 @@
 
 		$menu_items[$key]->classes = array_unique( $classes );
 	}
+
 	$active_ancestor_item_ids = array_filter( array_unique( $active_ancestor_item_ids ) );
 	$active_parent_item_ids = array_filter( array_unique( $active_parent_item_ids ) );
 	$active_parent_object_ids = array_filter( array_unique( $active_parent_object_ids ) );
