Index: src/bp-core/bp-core-filters.php
===================================================================
--- src/bp-core/bp-core-filters.php
+++ src/bp-core/bp-core-filters.php
@@ -649,7 +649,7 @@
  * @return string              New page title.
  */
 function bp_modify_page_title( $title = '', $sep = '&raquo;', $seplocation = 'right' ) {
-	global $bp, $paged, $page, $_wp_theme_features;
+	global $bp;
 
 	// If this is not a BP page, just return the title produced by WP.
 	if ( bp_is_blog_page() ) {
@@ -766,53 +766,113 @@
 		$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' );
-
 	/**
-	 * Are we going to fake 'title-tag' theme functionality?
+	 * Filter BuddyPress title parts before joining.
+	 *
+	 * @since 2.4.1 Perhaps move this to 2.5?
 	 *
-	 * @link https://buddypress.trac.wordpress.org/ticket/6107
-	 * @see wp_title()
+	 * @param  array $title_parts Current BuddyPress title parts
+	 * @return array
 	 */
-	$title_tag_compatibility = (bool) ( ! empty( $_wp_theme_features['title-tag'] ) || strstr( $title, $blogname ) );
+	$title_parts = (array) apply_filters( 'bp_title_parts', $title_parts );
+
+	// 'wp_title'
+	if ( ! is_array( $title ) ) {
+		global $paged, $page, $_wp_theme_features;
 
-	// Append the site title to title parts if theme supports title tag.
-	if ( true === $title_tag_compatibility ) {
-		$title_parts[] = $blogname;
+		// Get the blog name, so we can check if the original $title included it.
+		$blogname = get_bloginfo( 'name', 'display' );
 
-		if ( ( $paged >= 2 || $page >= 2 ) && ! is_404() ) {
-			$title_parts[] = sprintf( __( 'Page %s', 'buddypress' ), max( $paged, $page ) );
+		/**
+		 * Are we going to fake 'title-tag' theme functionality?
+		 *
+		 * @link https://buddypress.trac.wordpress.org/ticket/6107
+		 * @see wp_title()
+		 */
+		$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
+		if ( true === $title_tag_compatibility ) {
+			$title_parts['site'] = $blogname;
+
+			if ( ( $paged >= 2 || $page >= 2 ) && ! is_404() && ! bp_is_single_activity() ) {
+				$title_parts['page'] = sprintf( __( 'Page %s', 'buddypress' ), max( $paged, $page ) );
+			}
 		}
-	}
 
-	// Pad the separator with 1 space on each side.
-	$prefix = str_pad( $sep, strlen( $sep ) + 2, ' ', STR_PAD_BOTH );
+		// 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 ) );
+
+		// Append the prefix for pre `title-tag` compatibility
+		if ( false === $title_tag_compatibility ) {
+			$new_title = $new_title . $prefix;
+		}
+
+		/**
+		 * Filters the older 'wp_title' page title for BuddyPress pages.
+		 *
+		 * @since  1.5.0
+		 *
+		 * @param  string $new_title   The BuddyPress page title.
+		 * @param  string $title       The original WordPress page title.
+		 * @param  string $sep         The title parts separator.
+		 * @param  string $seplocation Location of the separator (left or right).
+		 */
+		return apply_filters( 'bp_modify_page_title', $new_title, $title, $sep, $seplocation );
+
+	// 'document_title_parts' - WP 4.4+
+	} else {
+		// 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(
+			// @todo Perhaps re-apply the 'bp_modify_page_title' filter? The problem with that
+			//       is the sitename is included in the older filter; it isn't included here...
+			'title' => join( " $sep ", $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'];
+		}
 
-	// Join the parts together.
-	$new_title = join( $prefix, array_filter( $title_parts ) );
+		// Add the sitename if needed.
+		if ( isset( $title['site'] ) ) {
+			$bp_title['site'] = $title['site'];
+		}
 
-	// Append the prefix for pre `title-tag` compatibility.
-	if ( false === $title_tag_compatibility ) {
-		$new_title = $new_title . $prefix;
+		return $bp_title;
 	}
+}
 
-	/**
-	 * Filters the page title for BuddyPress pages.
-	 *
-	 * @since  1.5.0
-	 *
-	 * @param  string $new_title   The BuddyPress page title.
-	 * @param  string $title       The original WordPress page title.
-	 * @param  string $sep         The title parts separator.
-	 * @param  string $seplocation Location of the separator (left or right).
-	 */
-	return apply_filters( 'bp_modify_page_title', $new_title, $title, $sep, $seplocation );
+/**
+ * Set up the document title after theme set up.
+ *
+ * We do logic here to determine if we should use the newer title-tag or the
+ * older 'wp_title'.
+ *
+ * @since 2.4.1
+ */
+function bp_setup_document_title() {
+	// Use new WP 4.4 page title filter
+	if ( function_exists( 'wp_get_document_title' ) && true === current_theme_supports( 'title-tag' ) ) {
+		add_filter( 'document_title_parts', 'bp_modify_page_title', 20, 1 );
+
+	// Older 'wp_title' page title filter
+	} else {
+		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( '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_action( 'bp_after_setup_theme', 'bp_setup_document_title' );
 
 /**
  * Strip span tags out of title part strings.
