diff --git src/bp-core/bp-core-filters.php src/bp-core/bp-core-filters.php
index c7c9147..f8d92d1 100644
--- src/bp-core/bp-core-filters.php
+++ src/bp-core/bp-core-filters.php
@@ -649,123 +649,16 @@ add_filter( 'wpmu_signup_user_notification', 'bp_core_activation_signup_user_not
  * @return string              New page title.
  */
 function bp_modify_page_title( $title = '', $sep = '&raquo;', $seplocation = 'right' ) {
-	global $bp, $paged, $page, $_wp_theme_features;
+	global $paged, $page, $_wp_theme_features;
 
-	// If this is not a BP page, just return the title produced by WP.
-	if ( bp_is_blog_page() ) {
-		return $title;
-	}
-
-	// If this is a 404, let WordPress handle it.
-	if ( is_404() ) {
-		return $title;
-	}
-
-	// If this is the front page of the site, return WP's title.
-	if ( is_front_page() || is_home() ) {
-		return $title;
-	}
+	// Get the BuddyPress title parts
+	$bp_title_parts = bp_get_title_parts( $seplocation );
 
-	// Return WP's title if not a BuddyPress page.
-	if ( ! is_buddypress() ) {
+	// If not set, simply return the original title
+	if ( ! $bp_title_parts ) {
 		return $title;
 	}
 
-	// Setup an empty title parts array.
-	$title_parts = array();
-
-	// Is there a displayed user, and do they have a name?
-	$displayed_user_name = bp_get_displayed_user_fullname();
-
-	// Displayed user.
-	if ( ! empty( $displayed_user_name ) && ! is_404() ) {
-
-		// Get the component's ID to try and get its name.
-		$component_id = $component_name = bp_current_component();
-
-		// Set empty subnav name.
-		$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'] );
-
-		// Fall back on the component ID.
-		} elseif ( ! empty( $bp->{$component_id}->id ) ) {
-			$component_name = ucwords( $bp->{$component_id}->id );
-		}
-
-		// 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( $component_subnav_name ) ) {
-				$component_subnav_name = array_shift( $component_subnav_name );
-			}
-		}
-
-		// If on the user profile's landing page, just use the fullname.
-		if ( bp_is_current_component( $bp->default_component ) && ( bp_get_requested_url() === bp_displayed_user_domain() ) ) {
-			$title_parts[] = $displayed_user_name;
-
-		// Use component name on member pages.
-		} else {
-			$title_parts = array_merge( $title_parts, array_map( 'strip_tags', array(
-				$displayed_user_name,
-				$component_name,
-			) ) );
-
-			// If we have a subnav name, add it separately for localization.
-			if ( ! empty( $component_subnav_name ) ) {
-				$title_parts[] = strip_tags( $component_subnav_name );
-			}
-		}
-
-	// 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'] : '';
-		$title_parts = array( $bp->bp_options_title, $subnav );
-
-	// A single item from a component other than groups.
-	} elseif ( bp_is_single_item() ) {
-		$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() ) {
-		$current_component = bp_current_component();
-
-		// No current component (when does this happen?).
-		$title_parts = array( _x( 'Directory', 'component directory title', 'buddypress' ) );
-
-		if ( ! empty( $current_component ) ) {
-			$title_parts = array( bp_get_directory_title( $current_component ) );
- 		}
-
-	// Sign up page.
-	} elseif ( bp_is_register_page() ) {
-		$title_parts = array( __( 'Create an Account', 'buddypress' ) );
-
-	// Activation page.
-	} elseif ( bp_is_activation_page() ) {
-		$title_parts = array( __( 'Activate Your Account', 'buddypress' ) );
-
-	// Group creation page.
-	} elseif ( bp_is_group_create() ) {
-		$title_parts = array( __( 'Create a Group', 'buddypress' ) );
-
-	// Blog creation page.
-	} elseif ( bp_is_create_blog() ) {
-		$title_parts = array( __( 'Create a Site', 'buddypress' ) );
-	}
-
-	// Strip spans.
-	$title_parts = array_map( '_bp_strip_spans_from_title', $title_parts );
-
-	// Sep on right, so reverse the order.
-	if ( 'right' == $seplocation ) {
-		$title_parts = array_reverse( $title_parts );
-	}
-
 	// Get the blog name, so we can check if the original $title included it.
 	$blogname = get_bloginfo( 'name', 'display' );
 
@@ -777,28 +670,28 @@ function bp_modify_page_title( $title = '', $sep = '&raquo;', $seplocation = 'ri
 	 */
 	$title_tag_compatibility = (bool) ( ! empty( $_wp_theme_features['title-tag'] ) || strstr( $title, $blogname ) );
 
-	// Append the site title to title parts if theme supports title tag.
+	// Append the site title to title parts if theme supports title tag
 	if ( true === $title_tag_compatibility ) {
-		$title_parts[] = $blogname;
+		$bp_title_parts['site'] = $blogname;
 
-		if ( ( $paged >= 2 || $page >= 2 ) && ! is_404() ) {
-			$title_parts[] = sprintf( __( 'Page %s', 'buddypress' ), max( $paged, $page ) );
+		if ( ( $paged >= 2 || $page >= 2 ) && ! is_404() && ! bp_is_single_activity() ) {
+			$bp_title_parts['page'] = sprintf( __( 'Page %s', 'buddypress' ), max( $paged, $page ) );
 		}
 	}
 
-	// Pad the separator with 1 space on each side.
+	// Pad the separator with 1 space on each side
 	$prefix = str_pad( $sep, strlen( $sep ) + 2, ' ', STR_PAD_BOTH );
 
-	// Join the parts together.
-	$new_title = join( $prefix, array_filter( $title_parts ) );
+	// Join the parts together
+	$new_title = join( $prefix, array_filter( $bp_title_parts ) );
 
-	// Append the prefix for pre `title-tag` compatibility.
+	// Append the prefix for pre `title-tag` compatibility
 	if ( false === $title_tag_compatibility ) {
 		$new_title = $new_title . $prefix;
 	}
 
 	/**
-	 * Filters the page title for BuddyPress pages.
+	 * Filters the older 'wp_title' page title for BuddyPress pages.
 	 *
 	 * @since  1.5.0
 	 *
@@ -809,28 +702,58 @@ function bp_modify_page_title( $title = '', $sep = '&raquo;', $seplocation = 'ri
 	 */
 	return apply_filters( 'bp_modify_page_title', $new_title, $title, $sep, $seplocation );
 }
-add_filter( 'wp_title', 'bp_modify_page_title', 20, 3 );
-add_filter( 'bp_modify_page_title', 'wptexturize'     );
-add_filter( 'bp_modify_page_title', 'convert_chars'   );
-add_filter( 'bp_modify_page_title', 'esc_html'        );
+add_filter( 'wp_title',             'bp_modify_page_title', 20, 3 );
+add_filter( 'bp_modify_page_title', 'wptexturize'                 );
+add_filter( 'bp_modify_page_title', 'convert_chars'               );
+add_filter( 'bp_modify_page_title', 'esc_html'                    );
 
 /**
- * Strip span tags out of title part strings.
+ * Filter the document title for BuddyPress pages.
  *
- * This is a temporary function for compatibility with WordPress versions
- * less than 4.0, and should be removed at a later date.
+ * @since 2.4.3
  *
- * @param string $title_part Title part to clean up.
- * @return string
+ * @param array $title The WordPress document title parts
+ * @return array the unchanged title parts or the BuddyPress ones
  */
-function _bp_strip_spans_from_title( $title_part = '' ) {
-	$title = $title_part;
-	$span = strpos( $title, '<span' );
-	if ( false !== $span ) {
-		$title = substr( $title, 0, $span - 1 );
+function bp_modify_document_title_parts( $title = array() ) {
+	// Get the BuddyPress title parts
+	$bp_title_parts = bp_get_title_parts();
+
+	// If not set, simply return the original title
+	if ( ! $bp_title_parts ) {
+		return $title;
 	}
-	return $title;
+
+	// Get the separator used by wp_get_document_title()
+	$sep = apply_filters( 'document_title_separator', '-' );
+
+	// Build the BuddyPress portion of the title.
+	// We don't need to sanitize this as WordPress will take care of it.
+	$bp_title = array(
+		'title' => join( " $sep ", $bp_title_parts )
+	);
+
+	// Add the pagination number if needed (not sure if this is necessary).
+	if ( isset( $title['page'] ) && ! bp_is_single_activity() ) {
+		$bp_title['page'] = $title['page'];
+	}
+
+	// Add the sitename if needed.
+	if ( isset( $title['site'] ) ) {
+		$bp_title['site'] = $title['site'];
+	}
+
+	/**
+	 * Filters BuddyPress title parts that will be used into the document title.
+	 *
+	 * @since  2.4.3
+	 *
+	 * @param  array $bp_title   The BuddyPress page title parts.
+	 * @param  array $title      The original WordPress title parts.
+	 */
+	return apply_filters( 'bp_modify_document_title_parts', $bp_title, $title );
 }
+add_filter( 'document_title_parts', 'bp_modify_document_title_parts', 20, 1 );
 
 /**
  * Add BuddyPress-specific items to the wp_nav_menu.
diff --git src/bp-core/bp-core-functions.php src/bp-core/bp-core-functions.php
index 76ec0c9..f865d7c 100644
--- src/bp-core/bp-core-functions.php
+++ src/bp-core/bp-core-functions.php
@@ -2282,6 +2282,23 @@ function bp_remove_adjacent_posts_rel_link() {
 }
 add_action( 'bp_init', 'bp_remove_adjacent_posts_rel_link' );
 
+/**
+ * Strip the span count of a menu item or of a title part.
+ *
+ * @since 2.2.2
+ *
+ * @param string $title_part Title part to clean up.
+ * @return string
+ */
+function _bp_strip_spans_from_title( $title_part = '' ) {
+	$title = $title_part;
+	$span = strpos( $title, '<span' );
+	if ( false !== $span ) {
+		$title = substr( $title, 0, $span - 1 );
+	}
+	return trim( $title );
+}
+
 /** Nav Menu ******************************************************************/
 
 /**
@@ -2333,8 +2350,7 @@ function bp_nav_menu_get_loggedin_pages() {
 	foreach ( $bp_menu_items as $bp_item ) {
 
 		// Remove <span>number</span>.
-		$item_name = preg_replace( '/([.0-9]+)/', '', $bp_item['name'] );
-		$item_name = trim( strip_tags( $item_name ) );
+		$item_name = _bp_strip_spans_from_title( $bp_item['name'] );
 
 		$page_args[ $bp_item['slug'] ] = (object) array(
 			'ID'             => -1,
diff --git src/bp-core/bp-core-template.php src/bp-core/bp-core-template.php
index 3431f80..88d4bca 100644
--- src/bp-core/bp-core-template.php
+++ src/bp-core/bp-core-template.php
@@ -2782,6 +2782,144 @@ function bp_is_register_page() {
 }
 
 /**
+ * Get the title parts of the BuddyPress displayed page
+ *
+ * @since 2.4.3
+ *
+ * @param string $seplocation
+ * @return array the title parts
+ */
+function bp_get_title_parts( $seplocation = 'right' ) {
+	$bp = buddypress();
+
+	// Defaults to an empty array
+	$bp_title_parts = array();
+
+	// If this is not a BP page, return the empty array.
+	if ( bp_is_blog_page() ) {
+		return $bp_title_parts;
+	}
+
+	// If this is a 404, return the empty array.
+	if ( is_404() ) {
+		return $bp_title_parts;
+	}
+
+	// If this is the front page of the site, return the empty array.
+	if ( is_front_page() || is_home() ) {
+		return $bp_title_parts;
+	}
+
+	// Return the empty array if not a BuddyPress page.
+	if ( ! is_buddypress() ) {
+		return $bp_title_parts;
+	}
+
+	// Now we can build the BP Title Parts
+	// Is there a displayed user, and do they have a name?
+	$displayed_user_name = bp_get_displayed_user_fullname();
+
+	// Displayed user.
+	if ( ! empty( $displayed_user_name ) && ! is_404() ) {
+
+		// Get the component's ID to try and get its name.
+		$component_id = $component_name = bp_current_component();
+
+		// Set empty subnav name.
+		$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'] );
+
+		// Fall back on the component ID.
+		} elseif ( ! empty( $bp->{$component_id}->id ) ) {
+			$component_name = ucwords( $bp->{$component_id}->id );
+		}
+
+		// 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( $component_subnav_name ) ) {
+				$component_subnav_name = array_shift( $component_subnav_name );
+			}
+		}
+
+		// If on the user profile's landing page, just use the fullname.
+		if ( bp_is_current_component( $bp->default_component ) && ( bp_get_requested_url() === bp_displayed_user_domain() ) ) {
+			$bp_title_parts[] = $displayed_user_name;
+
+		// Use component name on member pages.
+		} else {
+			$bp_title_parts = array_merge( $bp_title_parts, array_map( 'strip_tags', array(
+				$displayed_user_name,
+				$component_name,
+			) ) );
+
+			// If we have a subnav name, add it separately for localization.
+			if ( ! empty( $component_subnav_name ) ) {
+				$bp_title_parts[] = strip_tags( $component_subnav_name );
+			}
+		}
+
+	// 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'] : '';
+		$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'] );
+
+	// An index or directory.
+	} elseif ( bp_is_directory() ) {
+		$current_component = bp_current_component();
+
+		// No current component (when does this happen?).
+		$bp_title_parts = array( _x( 'Directory', 'component directory title', 'buddypress' ) );
+
+		if ( ! empty( $current_component ) ) {
+			$bp_title_parts = array( bp_get_directory_title( $current_component ) );
+ 		}
+
+	// Sign up page.
+	} elseif ( bp_is_register_page() ) {
+		$bp_title_parts = array( __( 'Create an Account', 'buddypress' ) );
+
+	// Activation page.
+	} elseif ( bp_is_activation_page() ) {
+		$bp_title_parts = array( __( 'Activate Your Account', 'buddypress' ) );
+
+	// Group creation page.
+	} elseif ( bp_is_group_create() ) {
+		$bp_title_parts = array( __( 'Create a Group', 'buddypress' ) );
+
+	// Blog creation page.
+	} elseif ( bp_is_create_blog() ) {
+		$bp_title_parts = array( __( 'Create a Site', 'buddypress' ) );
+	}
+
+	// Strip spans.
+	$bp_title_parts = array_map( '_bp_strip_spans_from_title', $bp_title_parts );
+
+	// Sep on right, so reverse the order.
+	if ( 'right' === $seplocation ) {
+		$bp_title_parts = array_reverse( $bp_title_parts );
+	}
+
+	/**
+	 * Filter BuddyPress title parts before joining.
+	 *
+	 * @since 2.4.3
+	 *
+	 * @param  array $bp_title_parts Current BuddyPress title parts
+	 * @return array
+	 */
+	return (array) apply_filters( 'bp_get_title_parts', $bp_title_parts );
+}
+
+/**
  * Customize the body class, according to the currently displayed BP content.
  */
 function bp_the_body_class() {
