Index: src/bp-core/bp-core-catchuri.php
===================================================================
--- src/bp-core/bp-core-catchuri.php
+++ src/bp-core/bp-core-catchuri.php
@@ -342,34 +342,12 @@
 function bp_core_load_template( $templates ) {
 	global $wp_query;
 
-	// check if BP page belongs to, or is a child of, a BP directory page
-	$page_id = false;
-	foreach ( (array) buddypress()->pages as $page ) {
-		if ( $page->name == buddypress()->unfiltered_uri[buddypress()->unfiltered_uri_offset] ) {
-			$page_id = $page->id;
-			break;
-		}
-	}
-
-	// Set up reset post args
-	$reset_post_args = array(
+	// Reset the post
+	bp_theme_compat_reset_post( array(
+		'ID'          => 0,
 		'is_404'      => true,
 		'post_status' => 'publish',
-	);
-
-	// BP page exists - fill in the $wp_query->post object
-	//
-	// bp_theme_compat_reset_post() looks at the $wp_query->post object to fill in
-	// the post globals
-	if ( ! empty( $page_id ) ) {
-		$wp_query->post = get_post( $page_id );
-		$reset_post_args['ID'] = $page_id;
-	} else {
-		$reset_post_args['ID'] = 0;
-	}
-
-	// Reset the post
-	bp_theme_compat_reset_post( $reset_post_args );
+	) );
 
 	// Set theme compat to false since the reset post function automatically sets
 	// theme compat to true
@@ -393,7 +371,6 @@
 	// Filter the template locations so that plugins can alter where they are located
 	$located_template = apply_filters( 'bp_located_template', $template, $filtered_templates );
 	if ( !empty( $located_template ) ) {
-
 		// Template was located, lets set this as a valid page and not a 404.
 		status_header( 200 );
 		$wp_query->is_page     = true;
Index: src/bp-core/bp-core-filters.php
===================================================================
--- src/bp-core/bp-core-filters.php
+++ src/bp-core/bp-core-filters.php
@@ -140,6 +140,65 @@
 add_filter( 'nav_menu_meta_box_object', 'bp_core_exclude_pages_from_nav_menu_admin', 11, 1 );
 
 /**
+ * Adds the 'current_page_item' CSS class to the parent BP page in a WP menu.
+ *
+ * Because BuddyPress primarily uses virtual pages, we need a way to highlight
+ * the BP parent page during WP menu generation.  This function checks the
+ * current BP component against the current page in the WP menu to see if we
+ * should highlight the WP page.
+ *
+ * @since BuddyPress (2.2.0)
+ *
+ * @param array $retval CSS classes for the current menu page in the menu
+ * @param object $page The page properties for the current menu item
+ * @return array
+ */
+function bp_core_menu_highlight_parent_page( $retval, $page ) {
+	if ( ! is_buddypress() ) {
+		return $retval;
+	}
+
+	$page_id = false;
+
+	// loop against all BP component pages
+	foreach ( (array) buddypress()->pages as $component => $bp_page ) {
+		// handles the majority of components
+		if ( bp_is_current_component( $component ) ) {
+	                $page_id = (int) $bp_page->id;
+		}
+
+		// stop if not on a user page
+		if ( ! bp_is_user() && ! empty( $page_id ) ) {
+			break;
+		}
+
+		// members component requires an explicit check due to overlapping components
+		if ( bp_is_user() && 'members' === $component ) {
+			$page_id = (int) $bp_page->id;
+			break;
+		}
+	}
+
+	// duplicate some logic from Walker_Page::start_el() to highlight menu items
+	if ( ! empty( $page_id ) ) {
+		$_bp_page = get_post( $page_id );
+		if ( in_array( $page->ID, $_bp_page->ancestors ) ) {
+			$retval[] = 'current_page_ancestor';
+		}
+		if ( $page->ID == $page_id ) {
+			$retval[] = 'current_page_item';
+		} elseif ( $_bp_page && $page->ID == $_bp_page->post_parent ) {
+			$retval[] = 'current_page_parent';
+		}
+	}
+
+	$retval = array_unique( $retval );
+
+	return $retval;
+}
+add_filter( 'page_css_class', 'bp_core_menu_highlight_parent_page', 10, 2 );
+
+/**
  * Set "From" name in outgoing email to the site name.
  *
  * @uses bp_get_option() fetches the value for a meta_key in the wp_X_options table.
