diff --git a/src/bp-activity/classes/class-bp-activity-component.php b/src/bp-activity/classes/class-bp-activity-component.php
index 66005ebde..8daa46759 100644
--- a/src/bp-activity/classes/class-bp-activity-component.php
+++ b/src/bp-activity/classes/class-bp-activity-component.php
@@ -51,8 +51,6 @@ class BP_Activity_Component extends BP_Component {
 		// Files to include.
 		$includes = array(
 			'cssjs',
-			'actions',
-			'screens',
 			'filters',
 			'adminbar',
 			'template',
@@ -85,6 +83,22 @@ class BP_Activity_Component extends BP_Component {
 		parent::includes( $includes );
 	}
 
+	/**
+	 * Load screen and action files only when viewing the activity component.
+	 *
+	 * @since 3.0.0
+	 */
+	public function late_includes( $includes = array() ) {
+		if ( ! bp_is_activity_component() ) {
+			return;
+		}
+
+		parent::late_includes( array(
+			'actions',
+			'screens',
+		) );
+	}
+
 	/**
 	 * Set up component global variables.
 	 *
diff --git a/src/bp-core/bp-core-actions.php b/src/bp-core/bp-core-actions.php
index 6e2ad3857..ba32e0828 100644
--- a/src/bp-core/bp-core-actions.php
+++ b/src/bp-core/bp-core-actions.php
@@ -96,6 +96,7 @@ add_action( 'bp_register_taxonomies', 'bp_register_member_types' );
  * places. This won't always be this way, we promise.
  *                                                           v---Load order
  */
+add_action( 'bp_template_redirect', 'bp_late_includes',      0  );
 add_action( 'bp_template_redirect', 'bp_redirect_canonical', 2  );
 add_action( 'bp_template_redirect', 'bp_actions',            4  );
 add_action( 'bp_template_redirect', 'bp_screens',            6  );
diff --git a/src/bp-core/bp-core-dependency.php b/src/bp-core/bp-core-dependency.php
index f1791ecb8..bc824476e 100644
--- a/src/bp-core/bp-core-dependency.php
+++ b/src/bp-core/bp-core-dependency.php
@@ -666,6 +666,20 @@ function bp_allowed_themes( $themes ) {
 	return apply_filters( 'bp_allowed_themes', $themes );
 }
 
+/**
+ * Fires the 'bp_late_includes' hook for including late-loading files.
+ *
+ * @since 3.0.0
+ */
+function bp_late_includes() {
+	/**
+	 * Fires just before BP runs its controller functions.
+	 *
+	 * @since 3.0.0
+	 */
+	do_action( 'bp_late_includes' );
+}
+
 /** Requests ******************************************************************/
 
 /**
diff --git a/src/bp-core/classes/class-bp-component.php b/src/bp-core/classes/class-bp-component.php
index 137c8cb33..199735978 100644
--- a/src/bp-core/classes/class-bp-component.php
+++ b/src/bp-core/classes/class-bp-component.php
@@ -353,35 +353,7 @@ class BP_Component {
 	 *                        to be parsed and then included.
 	 */
 	public function includes( $includes = array() ) {
-
-		// Bail if no files to include.
-		if ( ! empty( $includes ) ) {
-			$slashed_path = trailingslashit( $this->path );
-
-			// Loop through files to be included.
-			foreach ( (array) $includes as $file ) {
-
-				$paths = array(
-
-					// Passed with no extension.
-					'bp-' . $this->id . '/bp-' . $this->id . '-' . $file  . '.php',
-					'bp-' . $this->id . '-' . $file . '.php',
-					'bp-' . $this->id . '/' . $file . '.php',
-
-					// Passed with extension.
-					$file,
-					'bp-' . $this->id . '-' . $file,
-					'bp-' . $this->id . '/' . $file,
-				);
-
-				foreach ( $paths as $path ) {
-					if ( @is_file( $slashed_path . $path ) ) {
-						require( $slashed_path . $path );
-						break;
-					}
-				}
-			}
-		}
+		$this->perform_includes( $includes );
 
 		/**
 		 * Fires at the end of the includes method inside BP_Component.
@@ -393,6 +365,17 @@ class BP_Component {
 		do_action( 'bp_' . $this->id . '_includes' );
 	}
 
+	/**
+	 * Performs late includes.
+	 *
+	 * @since 3.0.0
+	 *
+	 * @param array See BP_Component::includes().
+	 */
+	public function late_includes( $includes = array() ) {
+		$this->perform_includes( $includes );
+	}
+
 	/**
 	 * Set up the actions.
 	 *
@@ -414,6 +397,9 @@ class BP_Component {
 		// extending this base class.
 		add_action( 'bp_include',                array( $this, 'includes'               ), 8 );
 
+		// Use this hook to load files that only need to be present for screen/actions.
+		add_action( 'bp_late_includes',          array( $this, 'late_includes'          ) );
+
 		// Setup navigation.
 		add_action( 'bp_setup_nav',              array( $this, 'setup_nav'              ), 10 );
 
@@ -840,5 +826,36 @@ class BP_Component {
 		 */
 		do_action( 'bp_' . $this->id . '_generate_rewrite_rules' );
 	}
+
+	protected function perform_includes( $includes = array() ) {
+		// Bail if no files to include.
+		if ( ! empty( $includes ) ) {
+			$slashed_path = trailingslashit( $this->path );
+
+			// Loop through files to be included.
+			foreach ( (array) $includes as $file ) {
+
+				$paths = array(
+
+					// Passed with no extension.
+					'bp-' . $this->id . '/bp-' . $this->id . '-' . $file  . '.php',
+					'bp-' . $this->id . '-' . $file . '.php',
+					'bp-' . $this->id . '/' . $file . '.php',
+
+					// Passed with extension.
+					$file,
+					'bp-' . $this->id . '-' . $file,
+					'bp-' . $this->id . '/' . $file,
+				);
+
+				foreach ( $paths as $path ) {
+					if ( @is_file( $slashed_path . $path ) ) {
+						require( $slashed_path . $path );
+						break;
+					}
+				}
+			}
+		}
+	}
 }
 endif; // BP_Component.
