diff --git src/bp-core/bp-core-buddybar.php src/bp-core/bp-core-buddybar.php
index 9f1ffb0..e676c00 100644
--- src/bp-core/bp-core-buddybar.php
+++ src/bp-core/bp-core-buddybar.php
@@ -16,6 +16,7 @@ defined( 'ABSPATH' ) || exit;
  * Add an item to the main BuddyPress navigation array.
  *
  * @since 1.1.0
+ * @since 2.6.0 Adds the $nav parameter.
  *
  * @param array|string $args {
  *     Array describing the new nav item.
@@ -32,9 +33,10 @@ defined( 'ABSPATH' ) || exit;
  *     @type bool|string $default_subnav_slug     Optional. The slug of the default subnav item to select when the nav
  *                                                item is clicked.
  * }
+ * @param  BP_Core_Item_Nav $nav The specific main nav to use. Optional.
  * @return bool|null Returns false on failure.
  */
-function bp_core_new_nav_item( $args = '' ) {
+function bp_core_new_nav_item( $args = '', $nav = null ) {
 
 	$defaults = array(
 		'name'                    => false, // Display name for the nav item.
@@ -50,7 +52,7 @@ function bp_core_new_nav_item( $args = '' ) {
 	$r = wp_parse_args( $args, $defaults );
 
 	// First, add the nav item link to the bp_nav array.
-	$created = bp_core_create_nav_link( $r );
+	$created = bp_core_create_nav_link( $r, $nav );
 
 	// To mimic the existing behavior, if bp_core_create_nav_link()
 	// returns false, we make an early exit and don't attempt to register
@@ -84,6 +86,7 @@ function bp_core_new_nav_item( $args = '' ) {
  * Add a link to the main BuddyPress navigation array.
  *
  * @since 2.4.0
+ * @since 2.6.0 Adds the $nav parameter.
  *
  * @param array|string $args {
  *     Array describing the new nav item.
@@ -100,11 +103,16 @@ function bp_core_new_nav_item( $args = '' ) {
  *     @type bool|string $default_subnav_slug     Optional. The slug of the default subnav item to select when the nav
  *                                                item is clicked.
  * }
+ * @param  BP_Core_Item_Nav $nav The specific main nav to use. Optional.
  * @return bool|null Returns false on failure.
  */
-function bp_core_create_nav_link( $args = '' ) {
+function bp_core_create_nav_link( $args = '', $nav = null ) {
 	$bp = buddypress();
 
+	if ( ! is_a( $nav, 'BP_Core_Item_Nav' ) ) {
+		$nav = $bp->bp_nav;
+	}
+
 	$defaults = array(
 		'name'                    => false, // Display name for the nav item.
 		'slug'                    => false, // URL slug for the nav item.
@@ -132,7 +140,7 @@ function bp_core_create_nav_link( $args = '' ) {
 		$r['item_css_id'] = $r['slug'];
 	}
 
-	$bp->bp_nav[$r['slug']] = array(
+	$nav->{ $r['slug'] } = array(
 		'name'                    => $r['name'],
 		'slug'                    => $r['slug'],
 		'link'                    => trailingslashit( bp_loggedin_user_domain() . $r['slug'] ),
@@ -290,14 +298,17 @@ function bp_core_new_nav_default( $args = '' ) {
 
 	$r = wp_parse_args( $args, $defaults );
 
-	if ( $function = $bp->bp_nav[$r['parent_slug']]['screen_function'] ) {
+	if ( $function = $bp->bp_nav->{ $r['parent_slug'] }['screen_function'] ) {
 		// Remove our screen hook if screen function is callable.
 		if ( is_callable( $function ) ) {
 			remove_action( 'bp_screens', $function, 3 );
 		}
 	}
 
-	$bp->bp_nav[$r['parent_slug']]['screen_function'] = &$r['screen_function'];
+	$reset_item = $bp->bp_nav->{ $r['parent_slug'] };
+	$reset_item['screen_function'] = &$r['screen_function'];
+
+	$bp->bp_nav->reset( $reset_item, $r['parent_slug'] );
 
 	if ( bp_is_current_component( $r['parent_slug'] ) ) {
 
@@ -351,13 +362,13 @@ function bp_core_new_nav_default( $args = '' ) {
 function bp_core_sort_nav_items() {
 	$bp = buddypress();
 
-	if ( empty( $bp->bp_nav ) || ! is_array( $bp->bp_nav ) ) {
+	if ( empty( $bp->bp_nav ) || ! is_a( $bp->bp_nav, 'BP_Core_Item_Nav' ) ) {
 		return false;
 	}
 
 	$temp = array();
 
-	foreach ( (array) $bp->bp_nav as $slug => $nav_item ) {
+	foreach ( (array) $bp->bp_nav->get() as $slug => $nav_item ) {
 		if ( empty( $temp[$nav_item['position']] ) ) {
 			$temp[$nav_item['position']] = $nav_item;
 		} else {
@@ -371,7 +382,7 @@ function bp_core_sort_nav_items() {
 	}
 
 	ksort( $temp );
-	$bp->bp_nav = &$temp;
+	$bp->bp_nav->reset( $temp );
 }
 add_action( 'wp_head',    'bp_core_sort_nav_items' );
 add_action( 'admin_head', 'bp_core_sort_nav_items' );
@@ -380,6 +391,7 @@ add_action( 'admin_head', 'bp_core_sort_nav_items' );
  * Add a subnav item to the BuddyPress navigation.
  *
  * @since 1.1.0
+ * @since 2.6.0 Adds the $subnav & $nav parameters.
  *
  * @param array|string $args {
  *     Array describing the new subnav item.
@@ -403,12 +415,14 @@ add_action( 'admin_head', 'bp_core_sort_nav_items' );
  *     @type bool        $show_in_admin_bar Optional. Whether the nav item should be added into the group's "Edit"
  *                                          Admin Bar menu for group admins. Default: false.
  * }
+ * @param  BP_Core_Item_Nav $subnav The specific subnav to use. Optional.
+ * @param  BP_Core_Item_Nav $nav    The specific main nav to use. Optional.
  * @return bool|null Returns false on failure.
  */
-function bp_core_new_subnav_item( $args = '' ) {
+function bp_core_new_subnav_item( $args = '', $subnav = null, $nav = null ) {
 
 	// First, add the subnav item link to the bp_options_nav array.
-	$created = bp_core_create_subnav_link( $args );
+	$created = bp_core_create_subnav_link( $args, $subnav, $nav );
 
 	// To mimic the existing behavior, if bp_core_create_subnav_link()
 	// returns false, we make an early exit and don't attempt to register
@@ -418,7 +432,7 @@ function bp_core_new_subnav_item( $args = '' ) {
 	}
 
 	// Then, hook the screen function for the added subnav item.
-	$hooked = bp_core_register_subnav_screen_function( $args );
+	$hooked = bp_core_register_subnav_screen_function( $args, $nav );
 	if ( false === $hooked ) {
 		return false;
 	}
@@ -428,6 +442,7 @@ function bp_core_new_subnav_item( $args = '' ) {
  * Add a subnav link to the BuddyPress navigation.
  *
  * @since 2.4.0
+ * @since 2.6.0 Adds the $subnav & $nav parameters.
  *
  * @param array|string $args {
  *     Array describing the new subnav item.
@@ -455,11 +470,21 @@ function bp_core_new_subnav_item( $args = '' ) {
  *                                          the group's "Edit" Admin Bar menu for group admins.
  *                                          Default: false.
  * }
+ * @param  BP_Core_Item_Nav $subnav The specific subnav to use. Optional.
+ * @param  BP_Core_Item_Nav $nav    The specific main nav to use. Optional.
  * @return bool|null Returns false on failure.
  */
-function bp_core_create_subnav_link( $args = '' ) {
+function bp_core_create_subnav_link( $args = '', $subnav = null, $nav = null ) {
 	$bp = buddypress();
 
+	if ( ! is_a( $subnav, 'BP_Core_Item_Nav' ) ) {
+		$subnav = $bp->bp_options_nav;
+	}
+
+	if ( ! is_a( $nav, 'BP_Core_Item_Nav' ) ) {
+		$nav = $bp->bp_nav;
+	}
+
 	$r = wp_parse_args( $args, array(
 		'name'              => false, // Display name for the nav item.
 		'slug'              => false, // URL slug for the nav item.
@@ -484,7 +509,7 @@ function bp_core_create_subnav_link( $args = '' ) {
 		$r['link'] = trailingslashit( $r['parent_url'] . $r['slug'] );
 
 		// If this sub item is the default for its parent, skip the slug.
-		if ( ! empty( $bp->bp_nav[$r['parent_slug']]['default_subnav_slug'] ) && $r['slug'] == $bp->bp_nav[$r['parent_slug']]['default_subnav_slug'] ) {
+		if ( ! empty( $nav->{ $r['parent_slug'] }['default_subnav_slug'] ) && $r['slug'] == $nav->{ $r['parent_slug'] }['default_subnav_slug'] ) {
 			$r['link'] = trailingslashit( $r['parent_url'] );
 		}
 	}
@@ -510,13 +535,14 @@ function bp_core_create_subnav_link( $args = '' ) {
 		'show_in_admin_bar' => (bool) $r['show_in_admin_bar'],
 	);
 
-	$bp->bp_options_nav[$r['parent_slug']][$r['slug']] = $subnav_item;
+	$subnav->add_subitem( $r['parent_slug'], $r['slug'], $subnav_item );
 }
 
 /**
  * Register a screen function, whether or not a related subnav link exists.
  *
  * @since 2.4.0
+ * @since 2.6.0 Adds the $nav parameters.
  *
  * @param array|string $args {
  *     Array describing the new subnav item.
@@ -541,11 +567,16 @@ function bp_core_create_subnav_link( $args = '' ) {
  *                                       the group's "Edit" Admin Bar menu for group admins.
  *                                       Default: false.
  * }
+ * @param  BP_Core_Item_Nav $nav The specific main nav to use. Optional.
  * @return bool|null Returns false on failure.
  */
-function bp_core_register_subnav_screen_function( $args = '' ) {
+function bp_core_register_subnav_screen_function( $args = '', $nav = null ) {
 	$bp = buddypress();
 
+	if ( ! is_a( $nav, 'BP_Core_Item_Nav' ) ) {
+		$nav = $bp->bp_nav;
+	}
+
 	$r = wp_parse_args( $args, array(
 		'slug'              => false, // URL slug for the screen.
 		'parent_slug'       => false, // URL slug of the parent screen.
@@ -578,14 +609,14 @@ function bp_core_register_subnav_screen_function( $args = '' ) {
 	}
 
 	// If we *do* meet condition (2), then the added subnav item is currently being requested.
-	if ( ( bp_current_action() && bp_is_current_action( $r['slug'] ) ) || ( bp_is_user() && ! bp_current_action() && ( $r['screen_function'] == $bp->bp_nav[$r['parent_slug']]['screen_function'] ) ) ) {
+	if ( ( bp_current_action() && bp_is_current_action( $r['slug'] ) ) || ( bp_is_user() && ! bp_current_action() && ( $r['screen_function'] == $nav->{ $r['parent_slug'] }['screen_function'] ) ) ) {
 
 		// If this is for site admins only and the user is not one, don't create the subnav item.
 		if ( ! empty( $r['site_admin_only'] ) && ! bp_current_user_can( 'bp_moderate' ) ) {
 			return false;
 		}
 
-		$hooked = bp_core_maybe_hook_new_subnav_screen_function( $r );
+		$hooked = bp_core_maybe_hook_new_subnav_screen_function( $r, $nav );
 
 		// If redirect args have been returned, perform the redirect now.
 		if ( ! empty( $hooked['status'] ) && 'failure' === $hooked['status'] && isset( $hooked['redirect_args'] ) ) {
@@ -598,11 +629,13 @@ function bp_core_register_subnav_screen_function( $args = '' ) {
  * For a given subnav item, either hook the screen function or generate redirect arguments, as necessary.
  *
  * @since 2.1.0
+ * @since 2.6.0 Adds the $nav parameters.
  *
- * @param array $subnav_item The subnav array added to bp_options_nav in `bp_core_new_subnav_item()`.
+ * @param array            $subnav_item The subnav array added to bp_options_nav in `bp_core_new_subnav_item()`.
+ * @param BP_Core_Item_Nav $nav         The specific main nav to use. Optional.
  * @return array
  */
-function bp_core_maybe_hook_new_subnav_screen_function( $subnav_item ) {
+function bp_core_maybe_hook_new_subnav_screen_function( $subnav_item, $nav = null ) {
 	$retval = array(
 		'status' => '',
 	);
@@ -635,6 +668,10 @@ function bp_core_maybe_hook_new_subnav_screen_function( $subnav_item ) {
 
 			$bp = buddypress();
 
+			if ( ! is_a( $nav, 'BP_Core_Item_Nav' ) ) {
+				$nav = $bp->bp_nav;
+			}
+
 			// If a redirect URL has been passed to the subnav
 			// item, respect it.
 			if ( ! empty( $subnav_item['no_access_url'] ) ) {
@@ -648,7 +685,7 @@ function bp_core_maybe_hook_new_subnav_screen_function( $subnav_item ) {
 				// Redirect to the displayed user's default
 				// component, as long as that component is
 				// publicly accessible.
-				if ( bp_is_my_profile() || ! empty( $bp->bp_nav[ $bp->default_component ]['show_for_displayed_user'] ) ) {
+				if ( bp_is_my_profile() || ! empty( $nav->{ $bp->default_component }['show_for_displayed_user'] ) ) {
 					$message     = __( 'You do not have access to this page.', 'buddypress' );
 					$redirect_to = bp_displayed_user_domain();
 
@@ -691,6 +728,37 @@ function bp_core_maybe_hook_new_subnav_screen_function( $subnav_item ) {
 }
 
 /**
+ * Sort subnav items by position
+ *
+ * @since  2.6.0
+ *
+ * @param  array $subnav_items The subnav items to sort.
+ * @return array               The sorted subnav items.
+ */
+function bp_core_sort_get_sorted_subnav_by_position( $subnav_items ) {
+	$temp = array();
+
+	if ( empty( $subnav_items ) ) {
+		return $temp;
+	}
+
+	foreach ( (array) $subnav_items as $subnav_item ) {
+		if ( empty( $temp[ $subnav_item['position'] ] ) ) {
+			$temp[ $subnav_item['position'] ] = $subnav_item;
+		} else {
+			// Increase numbers here to fit new items in.
+			do {
+				$subnav_item['position']++;
+			} while ( ! empty( $temp[ $subnav_item['position'] ] ) );
+
+			$temp[ $subnav_item['position'] ] = $subnav_item;
+		}
+	}
+
+	return $temp;
+}
+
+/**
  * Sort all subnavigation arrays.
  *
  * @since 1.1.0
@@ -700,27 +768,19 @@ function bp_core_maybe_hook_new_subnav_screen_function( $subnav_item ) {
 function bp_core_sort_subnav_items() {
 	$bp = buddypress();
 
-	if ( empty( $bp->bp_options_nav ) || !is_array( $bp->bp_options_nav ) )
+	if ( empty( $bp->bp_options_nav ) || ! is_a( $bp->bp_options_nav, 'BP_Core_Item_Nav' ) ) {
 		return false;
+	}
 
-	foreach ( (array) $bp->bp_options_nav as $parent_slug => $subnav_items ) {
-		if ( !is_array( $subnav_items ) )
+	foreach ( (array) $bp->bp_options_nav->get() as $parent_slug => $subnav_items ) {
+		if ( ! is_array( $subnav_items ) ) {
 			continue;
+		}
 
-		foreach ( (array) $subnav_items as $subnav_item ) {
-			if ( empty( $temp[$subnav_item['position']]) )
-				$temp[$subnav_item['position']] = $subnav_item;
-			else {
-				// Increase numbers here to fit new items in.
-				do {
-					$subnav_item['position']++;
-				} while ( !empty( $temp[$subnav_item['position']] ) );
+		$temp = bp_core_sort_get_sorted_subnav_by_position( $subnav_items );
 
-				$temp[$subnav_item['position']] = $subnav_item;
-			}
-		}
 		ksort( $temp );
-		$bp->bp_options_nav[$parent_slug] = &$temp;
+		$bp->bp_options_nav->reset( $temp, $parent_slug );
 		unset( $temp );
 	}
 }
@@ -731,18 +791,26 @@ add_action( 'admin_head', 'bp_core_sort_subnav_items' );
  * Check whether a given nav item has subnav items.
  *
  * @since 1.5.0
+ * @since 2.6.0 Add the subnav parameter.
  *
- * @param string $nav_item The slug of the top-level nav item whose subnav items you're checking.
- *                         Default: the current component slug.
+ * @param string           $nav_item The slug of the top-level nav item whose subnav items you're checking.
+ *                                   Default: the current component slug.
+ * @param BP_Core_Item_Nav $subnav   The Nav object to check upon. Optional.
+ *                                   Default Legacy's buddypress()->bp_options_nav
  * @return bool $has_subnav True if the nav item is found and has subnav items; false otherwise.
  */
-function bp_nav_item_has_subnav( $nav_item = '' ) {
+function bp_nav_item_has_subnav( $nav_item = '', $subnav = null ) {
 	$bp = buddypress();
 
-	if ( !$nav_item )
+	if ( ! is_a( $subnav, 'BP_Core_Item_Nav' ) ) {
+		$subnav = $bp->bp_options_nav;
+	}
+
+	if ( ! $nav_item ) {
 		$nav_item = bp_current_component();
+	}
 
-	$has_subnav = isset( $bp->bp_options_nav[$nav_item] ) && count( $bp->bp_options_nav[$nav_item] ) > 0;
+	$has_subnav = isset( $subnav->{ $nav_item } ) && count( $subnav->{ $nav_item } ) > 0;
 
 	/**
 	 * Filters whether or not a given nav item has subnav items.
@@ -759,46 +827,64 @@ function bp_nav_item_has_subnav( $nav_item = '' ) {
  * Remove a nav item from the navigation array.
  *
  * @since 1.0.0
+ * @since 2.6.0 Adds the $nav & $subnav parameters.
  *
- * @param int $parent_id The slug of the parent navigation item.
+ * @param int              $parent_id The slug of the parent navigation item.
+ * @param BP_Core_Item_Nav $nav       The specific main nav to use. Optional.
+ * @param BP_Core_Item_Nav $subnav    The specific subnav to use. Optional.
  * @return bool Returns false on failure, ie if the nav item can't be found.
  */
-function bp_core_remove_nav_item( $parent_id ) {
+function bp_core_remove_nav_item( $parent_id, $nav = null, $subnav = null ) {
 	$bp = buddypress();
 
+	if ( ! is_a( $nav, 'BP_Core_Item_Nav' ) ) {
+		$nav = $bp->bp_nav;
+	}
+
+	if ( ! is_a( $subnav, 'BP_Core_Item_Nav' ) ) {
+		$subnav = $bp->bp_options_nav;
+	}
+
 	// Unset subnav items for this nav item.
-	if ( isset( $bp->bp_options_nav[$parent_id] ) && is_array( $bp->bp_options_nav[$parent_id] ) ) {
-		foreach( (array) $bp->bp_options_nav[$parent_id] as $subnav_item ) {
-			bp_core_remove_subnav_item( $parent_id, $subnav_item['slug'] );
+	if ( isset( $subnav->{ $parent_id } ) && is_array( $subnav->{ $parent_id } ) ) {
+		foreach( (array) $subnav->{ $parent_id } as $subnav_item ) {
+			bp_core_remove_subnav_item( $parent_id, $subnav_item['slug'], $subnav );
 		}
 	}
 
-	if ( empty( $bp->bp_nav[ $parent_id ] ) )
+	if ( empty( $nav->{ $parent_id } ) ) {
 		return false;
+	}
 
-	if ( $function = $bp->bp_nav[$parent_id]['screen_function'] ) {
+	if ( $function = $nav->{ $parent_id }['screen_function'] ) {
 		// Remove our screen hook if screen function is callable.
 		if ( is_callable( $function ) ) {
 			remove_action( 'bp_screens', $function, 3 );
 		}
 	}
 
-	unset( $bp->bp_nav[$parent_id] );
+	$nav->delete( $parent_id );
 }
 
 /**
  * Remove a subnav item from the navigation array.
  *
  * @since 1.0.0
+ * @since 2.6.0 Adds the $subnav parameter.
  *
- * @param string $parent_id The slug of the parent navigation item.
- * @param string $slug      The slug of the subnav item to be removed.
+ * @param string           $parent_id The slug of the parent navigation item.
+ * @param string           $slug      The slug of the subnav item to be removed.
+ * @param BP_Core_Item_Nav $subnav    The specific subnav to use. Optional.
  */
-function bp_core_remove_subnav_item( $parent_id, $slug ) {
+function bp_core_remove_subnav_item( $parent_id, $slug, $subnav = null ) {
 	$bp = buddypress();
 
-	$screen_function = isset( $bp->bp_options_nav[$parent_id][$slug]['screen_function'] )
-		? $bp->bp_options_nav[$parent_id][$slug]['screen_function']
+	if ( ! is_a( $subnav, 'BP_Core_Item_Nav' ) ) {
+		$subnav = $bp->bp_options_nav;
+	}
+
+	$screen_function = isset( $subnav->{ $parent_id }[ $slug ]['screen_function'] )
+		? $subnav->{ $parent_id }[ $slug ]['screen_function']
 		: false;
 
 	if ( ! empty( $screen_function ) ) {
@@ -808,23 +894,30 @@ function bp_core_remove_subnav_item( $parent_id, $slug ) {
 		}
 	}
 
-	unset( $bp->bp_options_nav[$parent_id][$slug] );
+	$subnav->delete( $parent_id, $slug );
 
-	if ( isset( $bp->bp_options_nav[$parent_id] ) && !count( $bp->bp_options_nav[$parent_id] ) )
-		unset($bp->bp_options_nav[$parent_id]);
+	if ( isset( $subnav->{ $parent_id } ) && ! count( $subnav->{ $parent_id } ) ) {
+		$subnav->delete( $parent_id );
+	}
 }
 
 /**
  * Clear all subnav items from a specific nav item.
  *
  * @since 1.0.0
+ * @since 2.6.0 Adds the $subnav parameter.
  *
- * @param string $parent_slug The slug of the parent navigation item.
+ * @param string           $parent_slug The slug of the parent navigation item.
+ * @param BP_Core_Item_Nav $subnav      The specific subnav to use. Optional.
  */
-function bp_core_reset_subnav_items( $parent_slug ) {
+function bp_core_reset_subnav_items( $parent_slug, $subnav = null ) {
 	$bp = buddypress();
 
-	unset( $bp->bp_options_nav[$parent_slug] );
+	if ( ! is_a( $subnav, 'BP_Core_Item_Nav' ) ) {
+		$subnav = $bp->bp_options_nav;
+	}
+
+	$subnav->delete( $parent_slug );;
 }
 
 
diff --git src/bp-core/bp-core-classes.php src/bp-core/bp-core-classes.php
index bebf4ed..1bd97b9 100644
--- src/bp-core/bp-core-classes.php
+++ src/bp-core/bp-core-classes.php
@@ -30,3 +30,4 @@ require dirname( __FILE__ ) . '/classes/class-bp-email-recipient.php';
 require dirname( __FILE__ ) . '/classes/class-bp-email.php';
 require dirname( __FILE__ ) . '/classes/class-bp-email-delivery.php';
 require dirname( __FILE__ ) . '/classes/class-bp-phpmailer.php';
+require dirname( __FILE__ ) . '/classes/class-bp-core-item-nav.php';
diff --git src/bp-core/bp-core-functions.php src/bp-core/bp-core-functions.php
index 227237b..9f19a2a 100644
--- src/bp-core/bp-core-functions.php
+++ src/bp-core/bp-core-functions.php
@@ -2359,7 +2359,7 @@ function bp_nav_menu_get_loggedin_pages() {
 	}
 
 	// Pull up a list of items registered in BP's top-level nav array.
-	$bp_menu_items = buddypress()->bp_nav;
+	$bp_menu_items = buddypress()->bp_nav->get();
 
 	// Alphabetize.
 	$bp_menu_items = bp_alpha_sort_by_key( $bp_menu_items, 'name' );
diff --git src/bp-core/bp-core-template.php src/bp-core/bp-core-template.php
index 1f2c5e9..b52756b 100644
--- src/bp-core/bp-core-template.php
+++ src/bp-core/bp-core-template.php
@@ -40,8 +40,17 @@ function bp_get_options_nav( $parent_slug = '' ) {
 	$component_index = !empty( $bp->displayed_user ) ? bp_current_component() : bp_get_root_slug( bp_current_component() );
 	$selected_item   = bp_current_action();
 
+	// Default nav & list type
+	$nav = $bp->bp_options_nav;
+	$list_type = 'personal';
+
+	if ( bp_is_group() ) {
+		$nav       = $bp->groups->sub_nav;
+		$list_type = 'groups';
+	}
+
 	if ( ! bp_is_single_item() ) {
-		if ( !isset( $bp->bp_options_nav[$component_index] ) || count( $bp->bp_options_nav[$component_index] ) < 1 ) {
+		if ( !isset( $nav->{ $component_index } ) || count( $nav->{ $component_index } ) < 1 ) {
 			return false;
 		} else {
 			$the_index = $component_index;
@@ -54,7 +63,7 @@ function bp_get_options_nav( $parent_slug = '' ) {
 			$selected_item = bp_action_variable( 0 );
 		}
 
-		if ( !isset( $bp->bp_options_nav[$current_item] ) || count( $bp->bp_options_nav[$current_item] ) < 1 ) {
+		if ( !isset( $nav->{ $current_item } ) || count( $nav->{ $current_item } ) < 1 ) {
 			return false;
 		} else {
 			$the_index = $current_item;
@@ -62,7 +71,7 @@ function bp_get_options_nav( $parent_slug = '' ) {
 	}
 
 	// Loop through each navigation item.
-	foreach ( (array) $bp->bp_options_nav[$the_index] as $subnav_item ) {
+	foreach ( (array) $nav->{ $the_index } as $subnav_item ) {
 		if ( empty( $subnav_item['user_has_access'] ) ) {
 			continue;
 		}
@@ -74,8 +83,7 @@ function bp_get_options_nav( $parent_slug = '' ) {
 			$selected = '';
 		}
 
-		// List type depends on our current component.
-		$list_type = bp_is_group() ? 'groups' : 'personal';
+
 
 		/**
 		 * Filters the "options nav", the secondary-level single item navigation menu.
@@ -3011,8 +3019,8 @@ function bp_get_title_parts( $seplocation = 'right' ) {
 		$component_subnav_name = '';
 
 		// Use the component nav name.
-		if ( ! empty( $bp->bp_nav[$component_id] ) ) {
-			$component_name = _bp_strip_spans_from_title( $bp->bp_nav[ $component_id ]['name'] );
+		if ( ! empty( $bp->bp_nav->{ $component_id } ) ) {
+			$component_name = _bp_strip_spans_from_title( $bp->bp_nav->{ $component_id }['name'] );
 
 		// Fall back on the component ID.
 		} elseif ( ! empty( $bp->{$component_id}->id ) ) {
@@ -3020,8 +3028,8 @@ function bp_get_title_parts( $seplocation = 'right' ) {
 		}
 
 		// Append action name if we're on a member component sub-page.
-		if ( ! empty( $bp->bp_options_nav[ $component_id ] ) && ! empty( $bp->canonical_stack['action'] ) ) {
-			$component_subnav_name = wp_filter_object_list( $bp->bp_options_nav[ $component_id ], array( 'slug' => bp_current_action() ), 'and', 'name' );
+		if ( ! empty( $bp->bp_options_nav->{ $component_id } ) && ! empty( $bp->canonical_stack['action'] ) ) {
+			$component_subnav_name = wp_filter_object_list( $bp->bp_options_nav->{ $component_id }, array( 'slug' => bp_current_action() ), 'and', 'name' );
 
 			if ( ! empty( $component_subnav_name ) ) {
 				$component_subnav_name = array_shift( $component_subnav_name );
@@ -3046,13 +3054,13 @@ function bp_get_title_parts( $seplocation = 'right' ) {
 		}
 
 	// A single group.
-	} elseif ( bp_is_active( 'groups' ) && ! empty( $bp->groups->current_group ) && ! empty( $bp->bp_options_nav[ $bp->groups->current_group->slug ] ) ) {
-		$subnav      = isset( $bp->bp_options_nav[ $bp->groups->current_group->slug ][ bp_current_action() ]['name'] ) ? $bp->bp_options_nav[ $bp->groups->current_group->slug ][ bp_current_action() ]['name'] : '';
+	} elseif ( bp_is_active( 'groups' ) && ! empty( $bp->groups->current_group ) && ! empty( $bp->groups->sub_nav->{ $bp->groups->current_group->slug } ) ) {
+		$subnav      = isset( $bp->groups->sub_nav->{ $bp->groups->current_group->slug }[ bp_current_action() ]['name'] ) ? $bp->groups->sub_nav->{ $bp->groups->current_group->slug }[ bp_current_action() ]['name'] : '';
 		$bp_title_parts = array( $bp->bp_options_title, $subnav );
 
 	// A single item from a component other than groups.
 	} elseif ( bp_is_single_item() ) {
-		$bp_title_parts = array( $bp->bp_options_title, $bp->bp_options_nav[ bp_current_item() ][ bp_current_action() ]['name'] );
+		$bp_title_parts = array( $bp->bp_options_title, $bp->bp_options_nav->{ bp_current_item() }[ bp_current_action() ]['name'] );
 
 	// An index or directory.
 	} elseif ( bp_is_directory() ) {
@@ -3435,7 +3443,7 @@ function bp_get_nav_menu_items() {
 	$menus = $selected_menus = array();
 
 	// Get the second level menus.
-	foreach ( (array) buddypress()->bp_options_nav as $parent_menu => $sub_menus ) {
+	foreach ( (array) buddypress()->bp_options_nav->get() as $parent_menu => $sub_menus ) {
 
 		// The root menu's ID is "xprofile", but the Profile submenus are using "profile". See BP_Core::setup_nav().
 		if ( 'profile' === $parent_menu ) {
diff --git src/bp-core/classes/class-bp-core-item-nav.php src/bp-core/classes/class-bp-core-item-nav.php
index e69de29..fede9f2 100644
--- src/bp-core/classes/class-bp-core-item-nav.php
+++ src/bp-core/classes/class-bp-core-item-nav.php
@@ -0,0 +1,172 @@
+<?php
+/**
+ * Core component class.
+ *
+ * @package BuddyPress
+ * @subpackage Core
+ * @since  2.6.0
+ */
+
+// Exit if accessed directly.
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * BuddyPress Item Nav.
+ *
+ * This class is used to store the Single Items nav
+ *
+ * @since 2.6.0
+ */
+class BP_Core_Item_Nav {
+	/**
+	 * An associative array containing the nav items for the Item ID
+	 *
+	 * @var array
+	 */
+	private $nav;
+
+	/**
+	 * The Current Item ID
+	 *
+	 * @var int
+	 */
+	private $item_id;
+
+	/**
+	 * Init the Nav for the given Item ID
+	 *
+	 * @since 2.6.0
+	 *
+	 * @param int $item_id The item ID to build the nav for. Optional.
+	 *                     Default: The displayed user ID
+	 */
+	public function __construct( $item_id = 0 ) {
+		if ( empty( $item_id ) ) {
+			$this->item_id = (int) bp_displayed_user_id();
+		} else {
+			$this->item_id = (int) $item_id;
+		}
+
+		$this->nav[ $this->item_id ] = array();
+	}
+
+	/**
+	 * Checks if a nav attribute is set.
+	 *
+	 * @since 2.6.0
+	 *
+	 * @param  string  $key The requested nav slug
+	 * @return bool    True if the nav attribute is set, false otherwise.
+	 */
+	public function __isset( $key ) {
+		return isset( $this->nav[ $this->item_id ][ $key ] );
+	}
+
+	/**
+	 * Gets a nav attribute.
+	 *
+	 * @since 2.6.0
+	 *
+	 * @param  string  $key The requested nav slug.
+	 * @return mixed   The value corresponding to the requested attribute.
+	 */
+	public function __get( $key ) {
+		if ( ! isset( $this->nav[ $this->item_id ][ $key ] ) ) {
+			$this->nav[ $this->item_id ][ $key ] = null;
+		}
+
+		return $this->nav[ $this->item_id ][ $key ];
+	}
+
+	/**
+	 * Sets a nav attribute.
+	 *
+	 * @since 2.6.0
+	 *
+	 * @param  string  $key   The requested nav slug.
+	 * @param  mixed   $value The value of the attribute.
+	 */
+	public function __set( $key, $value ) {
+		$this->nav[ $this->item_id ][ $key ] = $value;
+	}
+
+	/**
+	 * Gets a specific Item Nav attribute or all attributes.
+	 *
+	 * @since 2.6.0
+	 *
+	 * @param  string $key The attribute to get. Optional.
+	 * @return mixed       An array of attribute(s), null if not found.
+	 */
+	public function get( $key = '' ) {
+		$return = null;
+
+		// Return the requested nav item attribute
+		if ( ! empty( $key ) ) {
+			if ( ! isset( $this->nav[ $this->item_id ][ $key ] ) ) {
+				$return = null;
+			} else {
+				$return = $this->nav[ $this->item_id ][ $key ];
+			}
+
+		// Return all nav item attributes
+		} else {
+			$return = $this->nav[ $this->item_id ];
+		}
+
+		return $return;
+	}
+
+	/**
+	 * Completely resets the nav or a specific attribute of the nav.
+	 *
+	 * NB: This is used when sorting the nav items.
+	 *
+	 * @since 2.6.0
+	 *
+	 * @param  array $args The arguments to update with. Required.
+	 * @param  string $key The specific attribute to update. Optional.
+	 */
+	public function reset( $args, $key = '' ) {
+		if ( empty( $key ) ) {
+			$this->nav[ $this->item_id ] = $args;
+		} elseif ( isset( $this->nav[ $this->item_id ][ $key ] ) ) {
+			$this->nav[ $this->item_id ][ $key ] = $args;
+		}
+	}
+
+	/**
+	 * Unset an item or a subitem of the nav.
+	 *
+	 * @since 2.6.0
+	 *
+	 * @param  string $key     The slug of the main item.
+	 * @param  string $sub_key The slug of the sub item.
+	 */
+	public function delete( $key, $sub_key = '' ) {
+		if ( isset( $this->nav[ $this->item_id ][ $key ] ) ) {
+			if ( ! empty( $sub_key ) ) {
+				unset( $this->nav[ $this->item_id ][ $key ][ $sub_key ] );
+			} else {
+				unset( $this->nav[ $this->item_id ][ $key ] );
+			}
+		}
+	}
+
+	/**
+	 * Adds one or more subitems to the nav.
+	 *
+	 * @since 2.6.0
+	 *
+	 * @param  string $key       The slug of the main item.
+	 * @param  string $sub_key   The slug of the sub item.
+	 * @param  array  $sub_value The value of the sub item.
+	 */
+	public function add_subitem( $key, $sub_key, $sub_value ) {
+		if ( ! empty( $this->nav[ $this->item_id ][ $key ] ) ) {
+			$this->nav[ $this->item_id ][ $key ][ $sub_key ] = $sub_value;
+		} else {
+			$this->nav[ $this->item_id ][ $key ] = array(  $sub_key => $sub_value );
+		}
+	}
+}
diff --git src/bp-groups/bp-groups-actions.php src/bp-groups/bp-groups-actions.php
index 2190cec..7a75fc3 100644
--- src/bp-groups/bp-groups-actions.php
+++ src/bp-groups/bp-groups-actions.php
@@ -551,3 +551,32 @@ function groups_action_group_feed() {
 	) );
 }
 add_action( 'bp_actions', 'groups_action_group_feed' );
+
+
+/**
+ * Sort all subnavigation arrays.
+ *
+ * @since 2.6.0
+ *
+ * @return bool|null Returns false on failure.
+ */
+function bp_groups_sort_subnav_items() {
+	$bp = buddypress();
+
+	if ( ! bp_is_group() || empty( $bp->groups->sub_nav ) || ! is_a( $bp->groups->sub_nav, 'BP_Core_Item_Nav' ) ) {
+		return false;
+	}
+
+	foreach ( (array) $bp->groups->sub_nav->get() as $parent_slug => $subnav_items ) {
+		if ( ! is_array( $subnav_items ) ) {
+			continue;
+		}
+
+		$temp = bp_core_sort_get_sorted_subnav_by_position( $subnav_items );
+
+		ksort( $temp );
+		$bp->groups->sub_nav->reset( $temp, $parent_slug );
+		unset( $temp );
+	}
+}
+add_action( 'wp_head', 'bp_groups_sort_subnav_items' );
diff --git src/bp-groups/bp-groups-adminbar.php src/bp-groups/bp-groups-adminbar.php
index f27f74e..174f84f 100644
--- src/bp-groups/bp-groups-adminbar.php
+++ src/bp-groups/bp-groups-adminbar.php
@@ -50,12 +50,12 @@ function bp_groups_group_admin_menu() {
 	$nav_index = $bp->groups->current_group->slug . '_manage';
 
 	// Check if current group has Manage tabs.
-	if ( empty( $bp->bp_options_nav[ $nav_index ] ) ) {
+	if ( empty( $bp->groups->sub_nav->{ $nav_index } ) ) {
 		return;
 	}
 
 	// Build the Group Admin menus.
-	foreach ( $bp->bp_options_nav[ $nav_index ] as $menu ) {
+	foreach ( $bp->groups->sub_nav->{ $nav_index } as $menu ) {
 		/**
 		 * Should we add the current manage link in the Group's "Edit" Admin Bar menu ?
 		 *
diff --git src/bp-groups/classes/class-bp-group-extension.php src/bp-groups/classes/class-bp-group-extension.php
index 5709b0b..69b168d 100644
--- src/bp-groups/classes/class-bp-group-extension.php
+++ src/bp-groups/classes/class-bp-group-extension.php
@@ -737,7 +737,7 @@ class BP_Group_Extension {
 				'screen_function' => array( &$this, '_display_hook' ),
 				'user_has_access' => $user_can_see_nav_item,
 				'no_access_url'   => $group_permalink,
-			) );
+			), buddypress()->groups->sub_nav );
 		}
 
 		// If the user can visit the screen, we register it.
@@ -967,7 +967,7 @@ class BP_Group_Extension {
 		}
 
 		// Add the tab to the manage navigation.
-		bp_core_new_subnav_item( $subnav_args );
+		bp_core_new_subnav_item( $subnav_args, buddypress()->groups->sub_nav );
 
 		// Catch the edit screen and forward it to the plugin template.
 		if ( bp_is_groups_component() && bp_is_current_action( 'admin' ) && bp_is_action_variable( $screen['slug'], 0 ) ) {
diff --git src/bp-groups/classes/class-bp-groups-component.php src/bp-groups/classes/class-bp-groups-component.php
index 355ab8c..d46ba34 100644
--- src/bp-groups/classes/class-bp-groups-component.php
+++ src/bp-groups/classes/class-bp-groups-component.php
@@ -253,6 +253,18 @@ class BP_Groups_Component extends BP_Component {
 			// Check once if the current group has a custom front template.
 			$this->current_group->front_template = bp_groups_get_front_template( $this->current_group );
 
+			/**
+			 * Since 2.6.0 The Groups single items are using their own navigation to avoid slug
+			 * collisions with the displayed user options nav (buddypress()->bp_options_nav)
+			 * and for more flexibility in future releases.
+			 */
+
+			// Current Group's Primary Nav
+			$this->nav = new BP_Core_Item_Nav( $this->current_group->id );
+
+			// Current Group's Secondary Nav
+			$this->sub_nav = new BP_Core_Item_Nav( $this->current_group->id );
+
 		// Set current_group to 0 to prevent debug errors.
 		} else {
 			$this->current_group = 0;
@@ -492,19 +504,23 @@ class BP_Groups_Component extends BP_Component {
 		}
 
 		if ( bp_is_groups_component() && bp_is_single_item() ) {
-
 			// Reset sub nav.
 			$sub_nav = array();
 
-			// Add 'Groups' to the main navigation.
-			$main_nav = array(
+			/**
+			 * Set the Current Group's main navigation
+			 *
+			 * Since 2.6.0 it's now using its own navigation by passing it
+			 * as the second argument of bp_core_new_nav_item()
+			 */
+			bp_core_new_nav_item( array(
 				'name'                => __( 'Memberships', 'buddypress' ),
 				'slug'                => $this->current_group->slug,
 				'position'            => -1, // Do not show in BuddyBar.
 				'screen_function'     => 'groups_screen_group_home',
 				'default_subnav_slug' => $this->default_extension,
 				'item_css_id'         => $this->id
-			);
+			), $this->nav );
 
 			$group_link = bp_get_group_permalink( $this->current_group );
 
@@ -675,7 +691,15 @@ class BP_Groups_Component extends BP_Component {
 				), $default_params );
 			}
 
-			parent::setup_nav( $main_nav, $sub_nav );
+			foreach( $sub_nav as $nav ) {
+				/**
+				 * Set the Current Group's sub navigation
+				 *
+				 * Since 2.6.0 it's now using its own sub navigation by passing it
+				 * as the second argument of bp_core_new_subnav_item()
+				 */
+				bp_core_new_subnav_item( $nav, $this->sub_nav );
+			}
 		}
 
 		if ( isset( $this->current_group->user_has_access ) ) {
diff --git src/bp-loader.php src/bp-loader.php
index f7b3f3f..2ace4e8 100644
--- src/bp-loader.php
+++ src/bp-loader.php
@@ -54,14 +54,14 @@ class BuddyPress {
 	/** Not Magic *************************************************************/
 
 	/**
-	 * @var array Primary BuddyPress navigation.
+	 * @var object Primary BuddyPress navigation.
 	 */
-	public $bp_nav = array();
+	public $bp_nav = null;
 
 	/**
-	 * @var array Secondary BuddyPress navigation to $bp_nav.
+	 * @var object Secondary BuddyPress navigation to $bp_nav.
 	 */
-	public $bp_options_nav = array();
+	public $bp_options_nav = null;
 
 	/**
 	 * @var array The unfiltered URI broken down into chunks.
diff --git src/bp-members/bp-members-template.php src/bp-members/bp-members-template.php
index bffd155..939d859 100644
--- src/bp-members/bp-members-template.php
+++ src/bp-members/bp-members-template.php
@@ -1333,7 +1333,7 @@ function bp_get_loggedin_user_nav() {
 function bp_get_displayed_user_nav() {
 	$bp = buddypress();
 
-	foreach ( (array) $bp->bp_nav as $user_nav_item ) {
+	foreach ( (array) $bp->bp_nav->get() as $user_nav_item ) {
 		if ( empty( $user_nav_item['show_for_displayed_user'] ) && !bp_is_my_profile() )
 			continue;
 
diff --git src/bp-members/classes/class-bp-members-component.php src/bp-members/classes/class-bp-members-component.php
index 92a2c85..63bb928 100644
--- src/bp-members/classes/class-bp-members-component.php
+++ src/bp-members/classes/class-bp-members-component.php
@@ -150,6 +150,12 @@ class BP_Members_Component extends BP_Component {
 		// The domain for the user currently being displayed.
 		$bp->displayed_user->domain   = bp_core_get_user_domain( bp_displayed_user_id() );
 
+		// Set User's primary nav
+		$bp->bp_nav = new BP_Core_Item_Nav( bp_displayed_user_id() );
+
+		// Set User's secondary nav
+		$bp->bp_options_nav = new BP_Core_Item_Nav( bp_displayed_user_id() );
+
 		/** Signup ***********************************************************
 		 */
 
diff --git tests/phpunit/includes/testcase.php tests/phpunit/includes/testcase.php
index 1e8bcb4..e3e3d6d 100644
--- tests/phpunit/includes/testcase.php
+++ tests/phpunit/includes/testcase.php
@@ -91,7 +91,8 @@ class BP_UnitTestCase extends WP_UnitTestCase {
 	}
 
 	function clean_up_global_scope() {
-		buddypress()->bp_nav                = buddypress()->bp_options_nav = buddypress()->action_variables = buddypress()->canonical_stack = buddypress()->unfiltered_uri = $GLOBALS['bp_unfiltered_uri'] = array();
+		buddypress()->bp_nav                = buddypress()->bp_options_nav = null;
+		buddypress()->action_variables      = buddypress()->canonical_stack = buddypress()->unfiltered_uri = $GLOBALS['bp_unfiltered_uri'] = array();
 		buddypress()->current_component     = buddypress()->current_item = buddypress()->current_action = buddypress()->current_member_type = '';
 		buddypress()->unfiltered_uri_offset = 0;
 		buddypress()->is_single_item        = false;
diff --git tests/phpunit/testcases/blogs/activity.php tests/phpunit/testcases/blogs/activity.php
index d7595ef..38c9dc6 100644
--- tests/phpunit/testcases/blogs/activity.php
+++ tests/phpunit/testcases/blogs/activity.php
@@ -618,7 +618,6 @@ class BP_Tests_Blogs_Activity extends BP_UnitTestCase {
 	/**
 	 * @group bp_blogs_sync_activity_edit_to_post_comment
 	 * @group post_type_comment_activities
-	 * @group imath
 	 */
 	public function test_bp_blogs_sync_activity_edit_to_post_comment_trash_comment_ham_activity() {
 		$old_user = get_current_user_id();
diff --git tests/phpunit/testcases/core/nav.php tests/phpunit/testcases/core/nav.php
index 721217d..84fdfe7 100644
--- tests/phpunit/testcases/core/nav.php
+++ tests/phpunit/testcases/core/nav.php
@@ -39,7 +39,8 @@ class BP_Tests_Core_Nav extends BP_UnitTestCase {
 
 		bp_core_sort_nav_items();
 
-		$this->assertSame( buddypress()->bp_nav[25], $expected );
+
+		$this->assertSame( buddypress()->bp_nav->get()[25], $expected );
 
 		// Clean up
 		buddypress()->bp_nav = $bp_nav;
@@ -83,10 +84,191 @@ class BP_Tests_Core_Nav extends BP_UnitTestCase {
 			'show_in_admin_bar' => false,
 		);
 
-		$this->assertSame( buddypress()->bp_options_nav['foo'][10], $expected );
+		$this->assertSame( buddypress()->bp_options_nav->get()['foo'][10], $expected );
 
 		// Clean up
 		buddypress()->bp_options_nav = $bp_options_nav;
 		$this->set_current_user( $old_current_user );
 	}
+
+	/**
+	 * @ticket BP5103
+	 */
+	public function test_bp_core_new_subnav_item_group_slug_collision() {
+		$u = $this->factory->user->create();
+		$old_current_user = get_current_user_id();
+		$this->set_current_user( $u );
+
+		$g = $this->factory->group->create( array( 'creator_id' => $u, 'slug' => 'profile' ) );
+		$group     = groups_get_group( array( 'group_id' => $g ) );
+		$group_url = bp_get_group_permalink( $group );
+
+		$not_group_menu_item = array();
+
+		$this->go_to( $group_url );
+
+		ob_start();
+		bp_get_options_nav( $group->slug );
+		$output = ob_get_clean();
+
+		preg_match_all( '/href=["\']?([^"\']*)["\' ]/is', $output, $hrefs );
+
+		foreach ( $hrefs[1] as $href ) {
+			if ( false === strpos( $href, $group_url ) ) {
+				$not_group_menu_item[] = $href;
+			}
+		}
+
+		$this->assertEmpty( $not_group_menu_item );
+
+		// Clean up
+		$this->set_current_user( $old_current_user );
+	}
+
+	/**
+	 * @ticket BP6534
+	 * @group bp_core_new_nav_default
+	 */
+	public function test_bp_core_new_nav_default() {
+		$bp = buddypress();
+		$bp_options_nav = $bp->bp_options_nav;
+		$bp_nav = $bp->bp_nav;
+
+		$u = $this->factory->user->create();
+		$old_current_user = get_current_user_id();
+		$this->set_current_user( $u );
+
+		$user_domain = bp_core_get_user_domain( $u );
+
+		$this->go_to( trailingslashit( $user_domain ) . 'activity/mentions' );
+
+		$this->assertTrue( 'mentions' === $bp->canonical_stack['action'] );
+
+		bp_core_new_nav_default( array( 'parent_slug' => 'activity', 'subnav_slug' => 'mentions' ) );
+
+		$this->assertTrue( ! isset( $bp->canonical_stack['action'] ) );
+
+		// Clean up
+		$bp->bp_options_nav = $bp_options_nav;
+		$bp->bp_nav = $bp_nav;
+		$this->set_current_user( $old_current_user );
+	}
+
+	/**
+	 * @ticket BP6534
+	 * @group bp_nav_item_has_subnav
+	 */
+	public function test_bp_nav_item_has_subnav() {
+		$bp = buddypress();
+		$bp_options_nav = $bp->bp_options_nav;
+		$bp_nav = $bp->bp_nav;
+
+		$u = $this->factory->user->create();
+		$old_current_user = get_current_user_id();
+		$this->set_current_user( $u );
+
+		$user_domain = bp_core_get_user_domain( $u );
+
+		$this->go_to( $user_domain );
+
+		bp_core_new_subnav_item( array(
+			'name'            => 'Bar',
+			'slug'            => 'bar',
+			'parent_url'      => trailingslashit( $user_domain . 'bar' ),
+			'parent_slug'     => 'bar',
+			'screen_function' => 'bar_screen_function',
+			'position'        => 10
+		) );
+
+		$this->assertTrue( bp_nav_item_has_subnav( 'bar' ) );
+
+		// Clean up
+		$bp->bp_options_nav = $bp_options_nav;
+		$bp->bp_nav = $bp_nav;
+		$this->set_current_user( $old_current_user );
+	}
+
+	/**
+	 * @ticket BP6534
+	 * @group bp_core_remove_nav_item
+	 * @group bp_core_remove_subnav_item
+	 * @group bp_nav_item_has_subnav
+	 */
+	public function test_bp_core_remove_nav_item() {
+		$bp = buddypress();
+		$bp_options_nav = $bp->bp_options_nav;
+		$bp_nav = $bp->bp_nav;
+
+		$u = $this->factory->user->create();
+		$old_current_user = get_current_user_id();
+		$this->set_current_user( $u );
+
+		$user_domain = bp_core_get_user_domain( $u );
+
+		$this->go_to( $user_domain );
+
+		bp_core_new_nav_item( array(
+			'name'                    => 'Foo',
+			'slug'                    => 'foo',
+			'position'                => 80,
+			'screen_function'         => 'foo_screen_function',
+			'default_subnav_slug'     => 'bar'
+		) );
+
+		bp_core_new_subnav_item( array(
+			'name'            => 'Bar',
+			'slug'            => 'bar',
+			'parent_url'      => trailingslashit( $user_domain . 'bar' ),
+			'parent_slug'     => 'foo',
+			'screen_function' => 'bar_screen_function',
+			'position'        => 10
+		) );
+
+		bp_core_remove_nav_item( 'foo' );
+
+		$this->assertFalse( bp_nav_item_has_subnav( 'bar' ) );
+
+		// Clean up
+		$bp->bp_options_nav = $bp_options_nav;
+		$bp->bp_nav = $bp_nav;
+		$this->set_current_user( $old_current_user );
+	}
+
+	/**
+	 * @ticket BP6534
+	 * @group bp_core_reset_subnav_items
+	 */
+	public function test_bp_core_reset_subnav_items() {
+		$bp = buddypress();
+		$bp_options_nav = $bp->bp_options_nav;
+		$bp_nav = $bp->bp_nav;
+
+		$u = $this->factory->user->create();
+		$old_current_user = get_current_user_id();
+		$this->set_current_user( $u );
+
+		$user_domain = bp_core_get_user_domain( $u );
+
+		$this->go_to( $user_domain );
+
+		bp_core_new_subnav_item( array(
+			'name'            => 'Bar',
+			'slug'            => 'bar',
+			'parent_url'      => trailingslashit( $user_domain . 'bar' ),
+			'parent_slug'     => 'bar',
+			'screen_function' => 'bar_screen_function',
+			'position'        => 10
+		) );
+
+		$this->assertTrue( bp_nav_item_has_subnav( 'bar' ) );
+
+		bp_core_reset_subnav_items( 'bar' );
+
+		$this->assertFalse( bp_nav_item_has_subnav( 'bar' ) );
+
+		// Clean up
+		$bp->bp_options_nav = $bp_options_nav;
+		$bp->bp_nav = $bp_nav;
+		$this->set_current_user( $old_current_user );
+	}
 }
diff --git tests/phpunit/testcases/core/nav/bpCoreMaybeHookNewSubnavScreenFunction.php tests/phpunit/testcases/core/nav/bpCoreMaybeHookNewSubnavScreenFunction.php
index 2ebc74c..5aa4b24 100644
--- tests/phpunit/testcases/core/nav/bpCoreMaybeHookNewSubnavScreenFunction.php
+++ tests/phpunit/testcases/core/nav/bpCoreMaybeHookNewSubnavScreenFunction.php
@@ -82,11 +82,11 @@ class BP_Tests_Core_Nav_BpCoreMaybeHookNewSubnavScreenFunction extends BP_UnitTe
 		$old_bp_nav = buddypress()->bp_nav;
 		$old_default_component = buddypress()->default_component;
 		buddypress()->default_component = 'foo';
-		buddypress()->bp_nav = array(
-			'foo' => array(
-				'show_for_displayed_user' => true,
-			),
-		);
+
+		bp_core_new_nav_item( array(
+			'name' => 'Foo',
+			'slug' => 'foo',
+		) );
 
 		$subnav_item = array(
 			'user_has_access' => false,
@@ -94,6 +94,7 @@ class BP_Tests_Core_Nav_BpCoreMaybeHookNewSubnavScreenFunction extends BP_UnitTe
 
 		// Just test relevant info
 		$found = bp_core_maybe_hook_new_subnav_screen_function( $subnav_item );
+
 		$this->assertSame( 'failure', $found['status'] );
 		$this->assertSame( bp_core_get_user_domain( $u2 ), $found['redirect_args']['root'] );
 
@@ -114,11 +115,12 @@ class BP_Tests_Core_Nav_BpCoreMaybeHookNewSubnavScreenFunction extends BP_UnitTe
 		$old_bp_nav = buddypress()->bp_nav;
 		$old_default_component = buddypress()->default_component;
 		buddypress()->default_component = 'foo';
-		buddypress()->bp_nav = array(
-			'foo' => array(
-				'show_for_displayed_user' => false,
-			),
-		);
+
+		bp_core_new_nav_item( array(
+			'name'                    => 'Foo',
+			'slug'                    => 'foo',
+			'show_for_displayed_user' => false,
+		) );
 
 		$subnav_item = array(
 			'user_has_access' => false,
diff --git tests/phpunit/testcases/core/nav/bpCoreNewNavItem.php tests/phpunit/testcases/core/nav/bpCoreNewNavItem.php
index b6f6439..7e13def 100644
--- tests/phpunit/testcases/core/nav/bpCoreNewNavItem.php
+++ tests/phpunit/testcases/core/nav/bpCoreNewNavItem.php
@@ -33,7 +33,7 @@ class BP_Tests_Core_Nav_BpCoreNewNavItem extends BP_UnitTestCase {
 			'default_subnav_slug'     => 'foo-sub'
 		);
 
-		$this->assertSame( buddypress()->bp_nav['foo'], $expected );
+		$this->assertSame( buddypress()->bp_nav->get()['foo'], $expected );
 
 		// Clean up
 		buddypress()->bp_nav = $bp_nav;
@@ -41,8 +41,6 @@ class BP_Tests_Core_Nav_BpCoreNewNavItem extends BP_UnitTestCase {
 	}
 
 	public function test_group_nav() {
-		$bp_nav = buddypress()->bp_nav;
-
 		$u = $this->factory->user->create();
 		$g = $this->factory->group->create();
 		$old_current_user = get_current_user_id();
@@ -54,10 +52,9 @@ class BP_Tests_Core_Nav_BpCoreNewNavItem extends BP_UnitTestCase {
 
 		$this->go_to( bp_get_group_permalink( $group ) );
 
-		$this->assertTrue( buddypress()->bp_nav[ $group->slug ]['position'] === -1 );
+		$this->assertTrue( buddypress()->groups->nav->{ $group->slug }['position'] === -1 );
 
 		// Clean up
-		buddypress()->bp_nav = $bp_nav;
 		$this->set_current_user( $old_current_user );
 	}
 
@@ -96,7 +93,7 @@ class BP_Tests_Core_Nav_BpCoreNewNavItem extends BP_UnitTestCase {
 		);
 		bp_core_new_nav_item( $args );
 
-		$this->assertSame( 'foo', buddypress()->bp_nav['foo']['css_id'] );
+		$this->assertSame( 'foo', buddypress()->bp_nav->get()['foo']['css_id'] );
 	}
 
 	public function test_css_id_should_be_respected() {
@@ -107,7 +104,7 @@ class BP_Tests_Core_Nav_BpCoreNewNavItem extends BP_UnitTestCase {
 		);
 		bp_core_new_nav_item( $args );
 
-		$this->assertSame( 'bar', buddypress()->bp_nav['foo']['css_id'] );
+		$this->assertSame( 'bar', buddypress()->bp_nav->get()['foo']['css_id'] );
 	}
 
 	public function test_show_for_displayed_user_false_should_force_function_to_return_false_when_bp_user_has_access_is_also_false() {
@@ -145,7 +142,7 @@ class BP_Tests_Core_Nav_BpCoreNewNavItem extends BP_UnitTestCase {
 			'default_subnav_slug'     => 'general'
 		);
 
-		$this->assertSame( buddypress()->bp_nav['settings'], $expected );
+		$this->assertSame( buddypress()->bp_nav->settings, $expected );
 
 		// Clean up
 		buddypress()->bp_nav = $bp_nav;
@@ -184,7 +181,7 @@ class BP_Tests_Core_Nav_BpCoreNewNavItem extends BP_UnitTestCase {
 			'default_subnav_slug'     => 'woof-one'
 		);
 
-		$this->assertSame( buddypress()->bp_nav['woof'], $expected );
+		$this->assertSame( buddypress()->bp_nav->woof, $expected );
 
 		// Clean up
 		buddypress()->bp_nav = $bp_nav;
diff --git tests/phpunit/testcases/core/nav/bpCoreNewSubnavItem.php tests/phpunit/testcases/core/nav/bpCoreNewSubnavItem.php
index cf07a2f..e88413a 100644
--- tests/phpunit/testcases/core/nav/bpCoreNewSubnavItem.php
+++ tests/phpunit/testcases/core/nav/bpCoreNewSubnavItem.php
@@ -37,7 +37,7 @@ class BP_Tests_Core_Nav_BpCoreNewSubnavItem extends BP_UnitTestCase {
 			'show_in_admin_bar' => false,
 		);
 
-		$this->assertSame( buddypress()->bp_options_nav['foo']['foo'], $expected );
+		$this->assertSame( buddypress()->bp_options_nav->foo['foo'], $expected );
 
 		// Clean up
 		buddypress()->bp_options_nav = $bp_options_nav;
@@ -114,7 +114,7 @@ class BP_Tests_Core_Nav_BpCoreNewSubnavItem extends BP_UnitTestCase {
 			'link' => 'https://buddypress.org/',
 		) );
 
-		$this->assertSame( 'https://buddypress.org/', buddypress()->bp_options_nav['foo']['bar']['link'] );
+		$this->assertSame( 'https://buddypress.org/', buddypress()->bp_options_nav->foo['bar']['link'] );
 
 		buddypress()->bp_options_nav = $bp_options_nav;
 	}
@@ -130,7 +130,7 @@ class BP_Tests_Core_Nav_BpCoreNewSubnavItem extends BP_UnitTestCase {
 			'screen_function' => 'foo',
 		) );
 
-		$this->assertSame( 'http://example.com/foo/bar/', buddypress()->bp_options_nav['foo']['bar']['link'] );
+		$this->assertSame( 'http://example.com/foo/bar/', buddypress()->bp_options_nav->foo['bar']['link'] );
 
 		buddypress()->bp_options_nav = $bp_options_nav;
 	}
@@ -140,11 +140,13 @@ class BP_Tests_Core_Nav_BpCoreNewSubnavItem extends BP_UnitTestCase {
 		$bp_options_nav = buddypress()->bp_options_nav;
 
 		// fake the parent
-		buddypress()->bp_nav = array(
-			'foo' => array(
-				'default_subnav_slug' => 'bar',
-			),
-		);
+		bp_core_new_nav_item( array(
+			'name'                    => 'Foo',
+			'slug'                    => 'foo',
+			'position'                => 25,
+			'screen_function'         => 'foo',
+			'default_subnav_slug'     => 'bar'
+		) );
 
 		bp_core_new_subnav_item( array(
 			'name' => 'bar',
@@ -154,7 +156,7 @@ class BP_Tests_Core_Nav_BpCoreNewSubnavItem extends BP_UnitTestCase {
 			'screen_function' => 'foo',
 		) );
 
-		$this->assertSame( 'http://example.com/foo/', buddypress()->bp_options_nav['foo']['bar']['link'] );
+		$this->assertSame( 'http://example.com/foo/', buddypress()->bp_options_nav->foo['bar']['link'] );
 
 		// clean up
 		buddypress()->bp_nav = $bp_nav;
@@ -171,7 +173,7 @@ class BP_Tests_Core_Nav_BpCoreNewSubnavItem extends BP_UnitTestCase {
 		) );
 
 		$expected = bp_get_root_domain() . 'foo/bar/';
-		$this->assertSame( $expected, buddypress()->bp_options_nav['foo']['bar']['link'] );
+		$this->assertSame( $expected, buddypress()->bp_options_nav->foo['bar']['link'] );
 	}
 
 	public function test_should_trailingslash_link_when_link_is_autogenerated_not_using_slug() {
@@ -192,7 +194,7 @@ class BP_Tests_Core_Nav_BpCoreNewSubnavItem extends BP_UnitTestCase {
 		) );
 
 		$expected = bp_get_root_domain() . 'foo-parent/';
-		$this->assertSame( $expected, buddypress()->bp_options_nav['foo-parent']['bar']['link'] );
+		$this->assertSame( $expected, buddypress()->bp_options_nav->get()['foo-parent']['bar']['link'] );
 	}
 
 	/**
@@ -210,7 +212,7 @@ class BP_Tests_Core_Nav_BpCoreNewSubnavItem extends BP_UnitTestCase {
 			'link' => $link,
 		) );
 
-		$this->assertSame( $link, buddypress()->bp_options_nav['foo']['bar']['link'] );
+		$this->assertSame( $link, buddypress()->bp_options_nav->foo['bar']['link'] );
 	}
 
 	public function test_should_return_false_if_site_admin_only_and_current_user_cannot_bp_moderate() {
@@ -238,7 +240,7 @@ class BP_Tests_Core_Nav_BpCoreNewSubnavItem extends BP_UnitTestCase {
 		);
 		bp_core_new_subnav_item( $args );
 
-		$this->assertSame( 'foo', buddypress()->bp_options_nav['parent']['foo']['css_id'] );
+		$this->assertSame( 'foo', buddypress()->bp_options_nav->parent['foo']['css_id'] );
 	}
 
 	public function test_css_id_should_be_respected() {
@@ -252,6 +254,6 @@ class BP_Tests_Core_Nav_BpCoreNewSubnavItem extends BP_UnitTestCase {
 		);
 		bp_core_new_subnav_item( $args );
 
-		$this->assertSame( 'bar', buddypress()->bp_options_nav['parent']['foo']['css_id'] );
+		$this->assertSame( 'bar', buddypress()->bp_options_nav->parent['foo']['css_id'] );
 	}
 }
diff --git tests/phpunit/testcases/groups/class-bp-group-extension.php tests/phpunit/testcases/groups/class-bp-group-extension.php
index 55b12e5..b66fd0c 100644
--- tests/phpunit/testcases/groups/class-bp-group-extension.php
+++ tests/phpunit/testcases/groups/class-bp-group-extension.php
@@ -219,8 +219,6 @@ class BP_Tests_Group_Extension_TestCases extends BP_UnitTestCase {
 	 * @group enable_nav_item
 	 */
 	public function test_enable_nav_item_true() {
-		$old_options_nav = buddypress()->bp_options_nav;
-
 		$g = $this->factory->group->create();
 		$g_obj = groups_get_group( array( 'group_id' => $g ) );
 
@@ -231,18 +229,13 @@ class BP_Tests_Group_Extension_TestCases extends BP_UnitTestCase {
 
 		$e->_register();
 
-		$this->assertTrue( isset( buddypress()->bp_options_nav[ $g_obj->slug ][ $e->slug ] ) );
-
-		// Clean up
-		buddypress()->bp_options_nav = $old_options_nav;
+		$this->assertTrue( isset( buddypress()->groups->sub_nav->{ $g_obj->slug }[ $e->slug ] ) );
 	}
 
 	/**
 	 * @group enable_nav_item
 	 */
 	public function test_enable_nav_item_false() {
-		$old_options_nav = buddypress()->bp_options_nav;
-
 		$g = $this->factory->group->create();
 		$g_obj = groups_get_group( array( 'group_id' => $g ) );
 
@@ -253,17 +246,13 @@ class BP_Tests_Group_Extension_TestCases extends BP_UnitTestCase {
 
 		$e->_register();
 
-		$this->assertFalse( isset( buddypress()->bp_options_nav[ $g_obj->slug ][ $e->slug ] ) );
-
-		// Clean up
-		buddypress()->bp_options_nav = $old_options_nav;
+		$this->assertFalse( isset( buddypress()->groups->sub_nav->{ $g_obj->slug }[ $e->slug ] ) );
 	}
 
 	/**
 	 * @group visibility
 	 */
 	public function test_visibility_private() {
-		$old_options_nav = buddypress()->bp_options_nav;
 		$old_current_user = get_current_user_id();
 
 		$g = $this->factory->group->create( array(
@@ -278,10 +267,7 @@ class BP_Tests_Group_Extension_TestCases extends BP_UnitTestCase {
 		$this->set_current_user( 0 );
 		$this->go_to( bp_get_group_permalink( $g_obj ) );
 		$e->_register();
-		$this->assertFalse( isset( buddypress()->bp_options_nav[ $g_obj->slug ][ $e->slug ] ) );
-
-		// Clean up
-		buddypress()->bp_options_nav = $old_options_nav;
+		$this->assertFalse( isset( buddypress()->groups->sub_nav->{ $g_obj->slug }[ $e->slug ] ) );
 
 		// Test as group member
 		$u = $this->factory->user->create();
@@ -289,10 +275,9 @@ class BP_Tests_Group_Extension_TestCases extends BP_UnitTestCase {
 		$this->add_user_to_group( $u, $g );
 		$this->go_to( bp_get_group_permalink( $g_obj ) );
 		$e->_register();
-		$this->assertTrue( isset( buddypress()->bp_options_nav[ $g_obj->slug ][ $e->slug ] ) );
+		$this->assertTrue( isset( buddypress()->groups->sub_nav->{ $g_obj->slug }[ $e->slug ] ) );
 
 		// Clean up
-		buddypress()->bp_options_nav = $old_options_nav;
 		$this->set_current_user( $old_current_user );
 	}
 
@@ -306,7 +291,6 @@ class BP_Tests_Group_Extension_TestCases extends BP_UnitTestCase {
 	 * @see https://buddypress.trac.wordpress.org/ticket/4785
 	 */
 	public function test_visibility_public() {
-		$old_options_nav = buddypress()->bp_options_nav;
 		$old_current_user = get_current_user_id();
 
 		$g = $this->factory->group->create( array(
@@ -321,10 +305,7 @@ class BP_Tests_Group_Extension_TestCases extends BP_UnitTestCase {
 		$this->set_current_user( 0 );
 		$this->go_to( bp_get_group_permalink( $g_obj ) );
 		$e->_register();
-		$this->assertTrue( isset( buddypress()->bp_options_nav[ $g_obj->slug ][ $e->slug ] ) );
-
-		// Clean up
-		buddypress()->bp_options_nav = $old_options_nav;
+		$this->assertTrue( isset( buddypress()->groups->sub_nav->{ $g_obj->slug }[ $e->slug ] ) );
 
 		// Test as group member
 		$u = $this->factory->user->create();
@@ -332,10 +313,9 @@ class BP_Tests_Group_Extension_TestCases extends BP_UnitTestCase {
 		$this->add_user_to_group( $u, $g );
 		$this->go_to( bp_get_group_permalink( $g_obj ) );
 		$e->_register();
-		$this->assertTrue( isset( buddypress()->bp_options_nav[ $g_obj->slug ][ $e->slug ] ) );
+		$this->assertTrue( isset( buddypress()->groups->sub_nav->{ $g_obj->slug }[ $e->slug ] ) );
 
 		// Clean up
-		buddypress()->bp_options_nav = $old_options_nav;
 		$this->set_current_user( $old_current_user );
 	}
 
diff --git tests/phpunit/testcases/routing/anonymous.php tests/phpunit/testcases/routing/anonymous.php
index e83776f..130b338 100644
--- tests/phpunit/testcases/routing/anonymous.php
+++ tests/phpunit/testcases/routing/anonymous.php
@@ -10,6 +10,6 @@ class BP_Tests_Routing_Anonymous extends BP_UnitTestCase {
 
 	function test_nav_menu() {
 		$this->go_to( '/' );
-		$this->assertEmpty( buddypress()->bp_nav );
+		$this->assertEmpty( buddypress()->bp_nav->get() );
 	}
 }
diff --git tests/phpunit/testcases/routing/core.php tests/phpunit/testcases/routing/core.php
index 30f9a8e..e703ea0 100644
--- tests/phpunit/testcases/routing/core.php
+++ tests/phpunit/testcases/routing/core.php
@@ -24,7 +24,7 @@ class BP_Tests_Routing_Core extends BP_UnitTestCase {
 
 	function test_nav_menu() {
 		$this->go_to( '/' );
-		$this->assertArrayHasKey( 'activity', buddypress()->bp_nav );
-		$this->assertArrayHasKey( 'profile',  buddypress()->bp_nav );
+		$this->assertArrayHasKey( 'activity', buddypress()->bp_nav->get() );
+		$this->assertArrayHasKey( 'profile',  buddypress()->bp_nav->get() );
 	}
 }
