diff --git src/bp-core/bp-core-buddybar.php src/bp-core/bp-core-buddybar.php
index a854fd3..a307af4 100644
--- src/bp-core/bp-core-buddybar.php
+++ src/bp-core/bp-core-buddybar.php
@@ -266,6 +266,7 @@ function bp_core_new_subnav_item( $args = '' ) {
 		'parent_url'      => false, // URL of the parent item
 		'item_css_id'     => false, // The CSS ID to apply to the HTML of the nav item
 		'user_has_access' => true,  // Can the logged in user see this nav item?
+		'no_access_url'   => '',
 		'site_admin_only' => false, // Can only site admins see this nav item?
 		'position'        => 90,    // Index of where this nav item should be positioned
 		'screen_function' => false, // The name of the function to run when clicked
@@ -302,6 +303,7 @@ function bp_core_new_subnav_item( $args = '' ) {
 		'css_id'          => $item_css_id,
 		'position'        => $position,
 		'user_has_access' => $user_has_access,
+		'no_access_url'   => $no_access_url,
 		'screen_function' => &$screen_function
 	);
 	$bp->bp_options_nav[$parent_slug][$slug] = $subnav_item;
@@ -375,26 +377,42 @@ function bp_core_maybe_hook_new_subnav_screen_function( $subnav_item ) {
 
 			$bp = buddypress();
 
-			// Redirect to the displayed user's default component
-			// If the displayed user is different from the logged-
-			// in user, we first check to ensure that the user has
-			// access to the default component
-			if ( bp_is_my_profile() || ! empty( $bp->bp_nav[ $bp->default_component ]['show_for_displayed_user'] ) ) {
+			// If a redirect URL has been passed to the subnav
+			// item, respect it
+			if ( ! empty( $subnav_item['no_access_url'] ) ) {
 				$message     = __( 'You do not have access to this page.', 'buddypress' );
-				$redirect_to = bp_displayed_user_domain();
-
-			// In some cases, the default tab is not accessible to
-			// the logged-in user. So we look for a fallback.
-			} else {
-				// Try 'activity' first
-				if ( bp_is_active( 'activity' ) && isset( $bp->pages->activity ) ) {
-					$redirect_to = trailingslashit( bp_displayed_user_domain() . bp_get_activity_slug() );
-				// Then try 'profile'
+				$redirect_to = trailingslashit( $subnav_item['no_access_url'] );
+
+			// In the case of a user page, we try to assume a
+			// redirect URL
+			} else if ( bp_is_user() ) {
+
+				// 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'] ) ) {
+					$message     = __( 'You do not have access to this page.', 'buddypress' );
+					$redirect_to = bp_displayed_user_domain();
+
+				// In some cases, the default tab is not accessible to
+				// the logged-in user. So we fall back on a tab that we
+				// know will be accessible.
 				} else {
-					$redirect_to = trailingslashit( bp_displayed_user_domain() . ( 'xprofile' == $bp->profile->id ? 'profile' : $bp->profile->id ) );
+					// Try 'activity' first
+					if ( bp_is_active( 'activity' ) && isset( $bp->pages->activity ) ) {
+						$redirect_to = trailingslashit( bp_displayed_user_domain() . bp_get_activity_slug() );
+					// Then try 'profile'
+					} else {
+						$redirect_to = trailingslashit( bp_displayed_user_domain() . ( 'xprofile' == $bp->profile->id ? 'profile' : $bp->profile->id ) );
+					}
+
+					$message     = '';
 				}
 
-				$message     = '';
+			// Fall back to the home page
+			} else {
+				$message     = __( 'You do not have access to this page.', 'buddypress' );
+				$redirect_to = bp_get_root_domain();
 			}
 
 			$retval['redirect_args'] = array(
diff --git tests/phpunit/testcases/core/nav.php tests/phpunit/testcases/core/nav.php
index 8da0dcd..9af82ca 100644
--- tests/phpunit/testcases/core/nav.php
+++ tests/phpunit/testcases/core/nav.php
@@ -284,4 +284,61 @@ class BP_Tests_Core_Nav extends BP_UnitTestCase {
 		buddypress()->default_component = $old_default_component;
 		buddypress()->bp_nav = $old_bp_nav;
 	}
+
+	/**
+	 * @group bp_core_maybe_hook_new_subnav_screen_function
+	 */
+	public function test_maybe_hook_new_subnav_screen_function_user_has_access_false_user_logged_in_group() {
+		$u = $this->create_user();
+		$g = $this->factory->group->create();
+		$old_current_user = get_current_user_id();
+		$this->set_current_user( $u );
+
+		$group = groups_get_group( array(
+			'group_id' => $g,
+		) );
+
+		$this->go_to( bp_get_group_permalink( $group ) );
+
+		$subnav_item = array(
+			'user_has_access' => false,
+			'no_access_url' => bp_get_group_permalink( $group ),
+		);
+
+		// Just test relevant info
+		$found = bp_core_maybe_hook_new_subnav_screen_function( $subnav_item );
+		$this->assertSame( 'failure', $found['status'] );
+		$this->assertSame( bp_get_group_permalink( $group ), $found['redirect_args']['root'] );
+
+		// Clean up
+		$this->set_current_user( $old_current_user );
+	}
+
+	/**
+	 * @group bp_core_maybe_hook_new_subnav_screen_function
+	 */
+	public function test_maybe_hook_new_subnav_screen_function_user_has_access_false_user_logged_in_group_no_redirect_url_provided() {
+		$u = $this->create_user();
+		$g = $this->factory->group->create();
+		$old_current_user = get_current_user_id();
+		$this->set_current_user( $u );
+
+		$group = groups_get_group( array(
+			'group_id' => $g,
+		) );
+
+		$this->go_to( bp_get_group_permalink( $group ) );
+
+		$subnav_item = array(
+			'user_has_access' => false,
+		);
+
+		// Just test relevant info
+		$found = bp_core_maybe_hook_new_subnav_screen_function( $subnav_item );
+		$this->assertSame( 'failure', $found['status'] );
+		$this->assertSame( bp_get_root_domain(), $found['redirect_args']['root'] );
+
+		// Clean up
+		$this->set_current_user( $old_current_user );
+	}
 }
