Index: src/bp-activity/bp-activity-actions.php
===================================================================
--- src/bp-activity/bp-activity-actions.php
+++ src/bp-activity/bp-activity-actions.php
@@ -746,6 +746,19 @@
 }
 
 /**
+ * Helper method to map action arguments to function parameters.
+ *
+ * @since 1.9.0
+ *
+ * @param int   $comment_id ID of the comment being notified about.
+ * @param array $params     Parameters to use with notification.
+ */
+function bp_activity_new_comment_notification_helper( $comment_id, $params ) {
+	bp_activity_new_comment_notification( $comment_id, $params['user_id'], $params );
+}
+add_action( 'bp_activity_comment_posted', 'bp_activity_new_comment_notification_helper', 10, 2 );
+
+/**
  * AJAX endpoint for Suggestions API lookups.
  *
  * @since 2.1.0
Index: src/bp-activity/bp-activity-functions.php
===================================================================
--- src/bp-activity/bp-activity-functions.php
+++ src/bp-activity/bp-activity-functions.php
@@ -3476,6 +3476,185 @@
 	do_action( 'bp_activity_mark_as_ham', $activity, $source );
 }
 
+/** Emails *******************************************************************/
+
+/**
+ * Send email when a user is mentioned in an update.
+ *
+ * @since 1.2.0
+ *
+ * @uses bp_notifications_add_notification()
+ * @uses bp_get_user_meta()
+ * @uses bp_core_get_user_displayname()
+ * @uses bp_activity_get_permalink()
+ * @uses bp_core_get_user_domain()
+ * @uses bp_get_settings_slug()
+ * @uses bp_activity_filter_kses()
+ * @uses bp_core_get_core_userdata()
+ * @uses wp_specialchars_decode()
+ * @uses get_blog_option()
+ * @uses bp_is_active()
+ * @uses bp_is_group()
+ * @uses bp_get_current_group_name()
+ * @uses apply_filters() To call the 'bp_activity_at_message_notification_to' hook.
+ * @uses apply_filters() To call the 'bp_activity_at_message_notification_subject' hook.
+ * @uses apply_filters() To call the 'bp_activity_at_message_notification_message' hook.
+ * @uses wp_mail()
+ * @uses do_action() To call the 'bp_activity_sent_mention_email' hook.
+ *
+ * @param int $activity_id      The ID of the activity update.
+ * @param int $receiver_user_id The ID of the user who is receiving the update.
+ */
+function bp_activity_at_message_notification( $activity_id, $receiver_user_id ) {
+	$notifications = BP_Core_Notification::get_all_for_user( $receiver_user_id, 'all' );
+
+	// Don't leave multiple notifications for the same activity item.
+	foreach( $notifications as $notification ) {
+		if ( $activity_id == $notification->item_id ) {
+			return;
+		}
+	}
+
+	$activity     = new BP_Activity_Activity( $activity_id );
+	$email_type   = 'activity-at-message';
+	$group_name   = '';
+	$message_link = bp_activity_get_permalink( $activity_id );
+	$poster_name  = bp_core_get_user_displayname( $activity->user_id );
+
+	remove_filter( 'bp_get_activity_content_body', 'convert_smilies' );
+	remove_filter( 'bp_get_activity_content_body', 'wpautop' );
+	remove_filter( 'bp_get_activity_content_body', 'bp_activity_truncate_entry', 5 );
+
+	/** This filter is documented in bp-activity/bp-activity-template.php */
+	$content = apply_filters( 'bp_get_activity_content_body', $activity->content );
+
+	add_filter( 'bp_get_activity_content_body', 'convert_smilies' );
+	add_filter( 'bp_get_activity_content_body', 'wpautop' );
+	add_filter( 'bp_get_activity_content_body', 'bp_activity_truncate_entry', 5 );
+
+	// Now email the user with the contents of the message (if they have enabled email notifications).
+	if ( 'no' != bp_get_user_meta( $receiver_user_id, 'notification_activity_new_mention', true ) ) {
+		if ( bp_is_active( 'groups' ) && bp_is_group() ) {
+			$email_type = 'groups-at-message';
+			$group_name = bp_get_current_group_name();
+		}
+
+		$args = array(
+			'tokens' => array(
+				'activity'         => $activity,
+				'usermessage'      => wp_strip_all_tags( $content ),
+				'group.name'       => $group_name,
+				'mentioned.url'    => $message_link,
+				'poster.name'      => $poster_name,
+				'receiver-user.id' => $receiver_user_id,
+			),
+		);
+
+		bp_send_email( $email_type, $receiver_user_id, $args );
+	}
+
+	/**
+	 * Fires after the sending of an @mention email notification.
+	 *
+	 * @since 1.5.0
+	 * @since 2.5.0 $subject, $message, $content arguments unset and deprecated.
+	 *
+	 * @param BP_Activity_Activity $activity         Activity Item object.
+	 * @param string               $deprecated       Removed in 2.5; now an empty string.
+	 * @param string               $deprecated       Removed in 2.5; now an empty string.
+	 * @param string               $deprecated       Removed in 2.5; now an empty string.
+	 * @param int                  $receiver_user_id The ID of the user who is receiving the update.
+	 */
+	do_action( 'bp_activity_sent_mention_email', $activity, '', '', '', $receiver_user_id );
+}
+
+/**
+ * Send email when an activity item receives a comment.
+ *
+ * @since 1.2.0
+ * @since 2.5.0 Updated to use new email APIs.
+ *
+ * @uses bp_get_user_meta()
+ * @uses bp_core_get_user_displayname()
+ * @uses bp_activity_get_permalink()
+ * @uses bp_core_get_user_domain()
+ * @uses bp_get_settings_slug()
+ * @uses bp_activity_filter_kses()
+ * @uses bp_core_get_core_userdata()
+ * @uses wp_specialchars_decode()
+ * @uses get_blog_option()
+ * @uses bp_get_root_blog_id()
+ * @uses apply_filters() To call the 'bp_activity_new_comment_notification_to' hook.
+ * @uses apply_filters() To call the 'bp_activity_new_comment_notification_subject' hook.
+ * @uses apply_filters() To call the 'bp_activity_new_comment_notification_message' hook.
+ * @uses wp_mail()
+ * @uses do_action() To call the 'bp_activity_sent_reply_to_update_email' hook.
+ * @uses apply_filters() To call the 'bp_activity_new_comment_notification_comment_author_to' hook.
+ * @uses apply_filters() To call the 'bp_activity_new_comment_notification_comment_author_subject' hook.
+ * @uses apply_filters() To call the 'bp_activity_new_comment_notification_comment_author_message' hook.
+ * @uses do_action() To call the 'bp_activity_sent_reply_to_reply_email' hook.
+ *
+ * @param int   $comment_id   The comment id.
+ * @param int   $commenter_id The ID of the user who posted the comment.
+ * @param array $params       {@link bp_activity_new_comment()}.
+ */
+function bp_activity_new_comment_notification( $comment_id = 0, $commenter_id = 0, $params = array() ) {
+	$original_activity = new BP_Activity_Activity( $params['activity_id'] );
+	$poster_name       = bp_core_get_user_displayname( $commenter_id );
+	$thread_link       = bp_activity_get_permalink( $params['activity_id'] );
+
+	remove_filter( 'bp_get_activity_content_body', 'convert_smilies' );
+	remove_filter( 'bp_get_activity_content_body', 'wpautop' );
+	remove_filter( 'bp_get_activity_content_body', 'bp_activity_truncate_entry', 5 );
+
+	/** This filter is documented in bp-activity/bp-activity-template.php */
+	$content = apply_filters( 'bp_get_activity_content_body', $params['content'] );
+
+	add_filter( 'bp_get_activity_content_body', 'convert_smilies' );
+	add_filter( 'bp_get_activity_content_body', 'wpautop' );
+	add_filter( 'bp_get_activity_content_body', 'bp_activity_truncate_entry', 5 );
+
+	if ( $original_activity->user_id != $commenter_id && 'no' != bp_get_user_meta( $original_activity->user_id, 'notification_activity_new_reply', true ) ) {
+	       $args = array(
+		       'tokens' => array(
+			       'comment.id'                => $comment_id,
+			       'commenter.id'              => $commenter_id,
+			       'usermessage'               => wp_strip_all_tags( $content ),
+			       'original_activity.user_id' => $original_activity->user_id,
+			       'poster.name'               => $poster_name,
+			       'thread.url'                => esc_url( $thread_link ),
+		       ),
+	       );
+
+	       bp_send_email( 'activity-comment', $original_activity->user_id, $args );
+       }
+
+
+       /*
+	* If this is a reply to another comment, send an email notification to the
+	* author of the immediate parent comment.
+	*/
+       if ( empty( $params['parent_id'] ) || ( $params['activity_id'] == $params['parent_id'] ) ) {
+	       return;
+       }
+
+       $parent_comment = new BP_Activity_Activity( $params['parent_id'] );
+
+       if ( $parent_comment->user_id != $commenter_id && $original_activity->user_id != $parent_comment->user_id && 'no' != bp_get_user_meta( $parent_comment->user_id, 'notification_activity_new_reply', true ) ) {
+		$args = array(
+			'tokens' => array(
+				'comment.id'             => $comment_id,
+				'commenter.id'           => $commenter_id,
+				'usermessage'            => wp_strip_all_tags( $content ),
+				'parent-comment-user.id' => $parent_comment->user_id,
+				'poster.name'            => $poster_name,
+				'thread.url'             => esc_url( $thread_link ),
+			),
+		);
+
+		bp_send_email( 'activity-comment-author', $parent_comment->user_id, $args );
+	}
+}
 
 /** Embeds *******************************************************************/
 
Index: src/bp-activity/bp-activity-notifications.php
===================================================================
--- src/bp-activity/bp-activity-notifications.php
+++ src/bp-activity/bp-activity-notifications.php
@@ -10,202 +10,35 @@
 // Exit if accessed directly.
 defined( 'ABSPATH' ) || exit;
 
-/* Emails *********************************************************************/
-
 /**
- * Send email and BP notifications when a user is mentioned in an update.
- *
- * @since 1.2.0
- *
- * @uses bp_notifications_add_notification()
- * @uses bp_get_user_meta()
- * @uses bp_core_get_user_displayname()
- * @uses bp_activity_get_permalink()
- * @uses bp_core_get_user_domain()
- * @uses bp_get_settings_slug()
- * @uses bp_activity_filter_kses()
- * @uses bp_core_get_core_userdata()
- * @uses wp_specialchars_decode()
- * @uses get_blog_option()
- * @uses bp_is_active()
- * @uses bp_is_group()
- * @uses bp_get_current_group_name()
- * @uses apply_filters() To call the 'bp_activity_at_message_notification_to' hook.
- * @uses apply_filters() To call the 'bp_activity_at_message_notification_subject' hook.
- * @uses apply_filters() To call the 'bp_activity_at_message_notification_message' hook.
- * @uses wp_mail()
- * @uses do_action() To call the 'bp_activity_sent_mention_email' hook.
+ * Register screen notification actions with the Notifications component.
  *
- * @param int $activity_id      The ID of the activity update.
- * @param int $receiver_user_id The ID of the user who is receiving the update.
+ * @since 2.6.0
  */
-function bp_activity_at_message_notification( $activity_id, $receiver_user_id ) {
-	$notifications = BP_Core_Notification::get_all_for_user( $receiver_user_id, 'all' );
-
-	// Don't leave multiple notifications for the same activity item.
-	foreach( $notifications as $notification ) {
-		if ( $activity_id == $notification->item_id ) {
-			return;
-		}
-	}
-
-	$activity     = new BP_Activity_Activity( $activity_id );
-	$email_type   = 'activity-at-message';
-	$group_name   = '';
-	$message_link = bp_activity_get_permalink( $activity_id );
-	$poster_name  = bp_core_get_user_displayname( $activity->user_id );
-
-	remove_filter( 'bp_get_activity_content_body', 'convert_smilies' );
-	remove_filter( 'bp_get_activity_content_body', 'wpautop' );
-	remove_filter( 'bp_get_activity_content_body', 'bp_activity_truncate_entry', 5 );
-
-	/** This filter is documented in bp-activity/bp-activity-template.php */
-	$content = apply_filters( 'bp_get_activity_content_body', $activity->content );
-
-	add_filter( 'bp_get_activity_content_body', 'convert_smilies' );
-	add_filter( 'bp_get_activity_content_body', 'wpautop' );
-	add_filter( 'bp_get_activity_content_body', 'bp_activity_truncate_entry', 5 );
-
-	// Now email the user with the contents of the message (if they have enabled email notifications).
-	if ( 'no' != bp_get_user_meta( $receiver_user_id, 'notification_activity_new_mention', true ) ) {
-		if ( bp_is_active( 'groups' ) && bp_is_group() ) {
-			$email_type = 'groups-at-message';
-			$group_name = bp_get_current_group_name();
-		}
-
-		$args = array(
-			'tokens' => array(
-				'activity'         => $activity,
-				'usermessage'      => wp_strip_all_tags( $content ),
-				'group.name'       => $group_name,
-				'mentioned.url'    => $message_link,
-				'poster.name'      => $poster_name,
-				'receiver-user.id' => $receiver_user_id,
-			),
-		);
-
-		bp_send_email( $email_type, $receiver_user_id, $args );
-	}
+function bp_activity_register_notification_actions() {
+	// Set labels
+	bp_notifications_set_prop(
+		'settings_component_label',
+		_x( 'Activity', 'Settings > Notifications component label', 'buddypress' ),
+		'labels',
+		'activity'
+	);
+
+	// Register actions.
+	bp_notifications_set_action( 'activity', array(
+		'action' => 'new_at_mention',
+		'settings_label' => sprintf( __( 'A member mentions you in an update using "@%s"', 'buddypress' ), bp_core_get_username( bp_displayed_user_id() ) )
+	) );
 
 	/**
-	 * Fires after the sending of an @mention email notification.
+	 * Fires after default activity notification actions are registered.
 	 *
-	 * @since 1.5.0
-	 * @since 2.5.0 $subject, $message, $content arguments unset and deprecated.
-	 *
-	 * @param BP_Activity_Activity $activity         Activity Item object.
-	 * @param string               $deprecated       Removed in 2.5; now an empty string.
-	 * @param string               $deprecated       Removed in 2.5; now an empty string.
-	 * @param string               $deprecated       Removed in 2.5; now an empty string.
-	 * @param int                  $receiver_user_id The ID of the user who is receiving the update.
+	 * @since 2.6.0
 	 */
-	do_action( 'bp_activity_sent_mention_email', $activity, '', '', '', $receiver_user_id );
+	do_action( 'bp_activity_register_notification_actions' );
 }
 
 /**
- * Send email and BP notifications when an activity item receives a comment.
- *
- * @since 1.2.0
- * @since 2.5.0 Updated to use new email APIs.
- *
- * @uses bp_get_user_meta()
- * @uses bp_core_get_user_displayname()
- * @uses bp_activity_get_permalink()
- * @uses bp_core_get_user_domain()
- * @uses bp_get_settings_slug()
- * @uses bp_activity_filter_kses()
- * @uses bp_core_get_core_userdata()
- * @uses wp_specialchars_decode()
- * @uses get_blog_option()
- * @uses bp_get_root_blog_id()
- * @uses apply_filters() To call the 'bp_activity_new_comment_notification_to' hook.
- * @uses apply_filters() To call the 'bp_activity_new_comment_notification_subject' hook.
- * @uses apply_filters() To call the 'bp_activity_new_comment_notification_message' hook.
- * @uses wp_mail()
- * @uses do_action() To call the 'bp_activity_sent_reply_to_update_email' hook.
- * @uses apply_filters() To call the 'bp_activity_new_comment_notification_comment_author_to' hook.
- * @uses apply_filters() To call the 'bp_activity_new_comment_notification_comment_author_subject' hook.
- * @uses apply_filters() To call the 'bp_activity_new_comment_notification_comment_author_message' hook.
- * @uses do_action() To call the 'bp_activity_sent_reply_to_reply_email' hook.
- *
- * @param int   $comment_id   The comment id.
- * @param int   $commenter_id The ID of the user who posted the comment.
- * @param array $params       {@link bp_activity_new_comment()}.
- */
-function bp_activity_new_comment_notification( $comment_id = 0, $commenter_id = 0, $params = array() ) {
-	$original_activity = new BP_Activity_Activity( $params['activity_id'] );
-	$poster_name       = bp_core_get_user_displayname( $commenter_id );
-	$thread_link       = bp_activity_get_permalink( $params['activity_id'] );
-
-	remove_filter( 'bp_get_activity_content_body', 'convert_smilies' );
-	remove_filter( 'bp_get_activity_content_body', 'wpautop' );
-	remove_filter( 'bp_get_activity_content_body', 'bp_activity_truncate_entry', 5 );
-
-	/** This filter is documented in bp-activity/bp-activity-template.php */
-	$content = apply_filters( 'bp_get_activity_content_body', $params['content'] );
-
-	add_filter( 'bp_get_activity_content_body', 'convert_smilies' );
-	add_filter( 'bp_get_activity_content_body', 'wpautop' );
-	add_filter( 'bp_get_activity_content_body', 'bp_activity_truncate_entry', 5 );
-
-	if ( $original_activity->user_id != $commenter_id && 'no' != bp_get_user_meta( $original_activity->user_id, 'notification_activity_new_reply', true ) ) {
-		$args = array(
-			'tokens' => array(
-				'comment.id'                => $comment_id,
-				'commenter.id'              => $commenter_id,
-				'usermessage'               => wp_strip_all_tags( $content ),
-				'original_activity.user_id' => $original_activity->user_id,
-				'poster.name'               => $poster_name,
-				'thread.url'                => esc_url( $thread_link ),
-			),
-		);
-
-		bp_send_email( 'activity-comment', $original_activity->user_id, $args );
-	}
-
-
-	/*
-	 * If this is a reply to another comment, send an email notification to the
-	 * author of the immediate parent comment.
-	 */
-	if ( empty( $params['parent_id'] ) || ( $params['activity_id'] == $params['parent_id'] ) ) {
-		return;
-	}
-
-	$parent_comment = new BP_Activity_Activity( $params['parent_id'] );
-
-	if ( $parent_comment->user_id != $commenter_id && $original_activity->user_id != $parent_comment->user_id && 'no' != bp_get_user_meta( $parent_comment->user_id, 'notification_activity_new_reply', true ) ) {
-		$args = array(
-			'tokens' => array(
-				'comment.id'             => $comment_id,
-				'commenter.id'           => $commenter_id,
-				'usermessage'            => wp_strip_all_tags( $content ),
-				'parent-comment-user.id' => $parent_comment->user_id,
-				'poster.name'            => $poster_name,
-				'thread.url'             => esc_url( $thread_link ),
-			),
-		);
-
-		bp_send_email( 'activity-comment-author', $parent_comment->user_id, $args );
-	}
-}
-
-/**
- * Helper method to map action arguments to function parameters.
- *
- * @since 1.9.0
- *
- * @param int   $comment_id ID of the comment being notified about.
- * @param array $params     Parameters to use with notification.
- */
-function bp_activity_new_comment_notification_helper( $comment_id, $params ) {
-	bp_activity_new_comment_notification( $comment_id, $params['user_id'], $params );
-}
-add_action( 'bp_activity_comment_posted', 'bp_activity_new_comment_notification_helper', 10, 2 );
-
-/** Notifications *************************************************************/
-
-/**
  * Format notifications related to activity.
  *
  * @since 1.5.0
@@ -317,17 +150,15 @@
  * @param int    $receiver_user_id   ID of user receiving notification.
  */
 function bp_activity_at_mention_add_notification( $activity, $subject, $message, $content, $receiver_user_id ) {
-	if ( bp_is_active( 'notifications' ) ) {
-		bp_notifications_add_notification( array(
-			'user_id'           => $receiver_user_id,
-			'item_id'           => $activity->id,
-			'secondary_item_id' => $activity->user_id,
-			'component_name'    => buddypress()->activity->id,
-			'component_action'  => 'new_at_mention',
-			'date_notified'     => bp_core_current_time(),
-			'is_new'            => 1,
-		) );
-	}
+	bp_notifications_add_notification( array(
+		'user_id'           => $receiver_user_id,
+		'item_id'           => $activity->id,
+		'secondary_item_id' => $activity->user_id,
+		'component_name'    => buddypress()->activity->id,
+		'component_action'  => 'new_at_mention',
+		'date_notified'     => bp_core_current_time(),
+		'is_new'            => 1,
+	) );
 }
 add_action( 'bp_activity_sent_mention_email', 'bp_activity_at_mention_add_notification', 10, 5 );
 
@@ -341,10 +172,6 @@
  * @uses bp_notifications_mark_all_notifications_by_type()
  */
 function bp_activity_remove_screen_notifications( $user_id = 0 ) {
-	if ( ! bp_is_active( 'notifications' ) ) {
-		return;
-	}
-
 	// Only mark read if the current user is looking at his own mentions.
 	if ( empty( $user_id ) || (int) $user_id !== (int) bp_loggedin_user_id() ) {
 		return;
@@ -362,10 +189,6 @@
  * @param BP_Activity_Activity $activity Activity object.
  */
 function bp_activity_remove_screen_notifications_single_activity_permalink( $activity ) {
-	if ( ! bp_is_active( 'notifications' ) ) {
-		return;
-	}
-
 	if ( ! is_user_logged_in() ) {
 		return;
 	}
@@ -385,7 +208,7 @@
 function bp_activity_at_mention_delete_notification( $activity_ids_deleted = array() ) {
 	// Let's delete all without checking if content contains any mentions
 	// to avoid a query to get the activity.
-	if ( bp_is_active( 'notifications' ) && ! empty( $activity_ids_deleted ) ) {
+	if ( ! empty( $activity_ids_deleted ) ) {
 		foreach ( $activity_ids_deleted as $activity_id ) {
 			bp_notifications_delete_all_notifications_by_type( $activity_id, buddypress()->activity->id );
 		}
Index: src/bp-activity/classes/class-bp-activity-component.php
===================================================================
--- src/bp-activity/classes/class-bp-activity-component.php
+++ src/bp-activity/classes/class-bp-activity-component.php
@@ -55,10 +55,14 @@
 			'filters',
 			'template',
 			'functions',
-			'notifications',
 			'cache'
 		);
 
+		// Notifications support.
+		if ( bp_is_active( 'notifications' ) ) {
+			$includes[] = 'notifications';
+		}
+
 		if ( ! buddypress()->do_autoload ) {
 			$includes[] = 'classes';
 		}
@@ -117,6 +121,7 @@
 			'has_directory'         => true,
 			'directory_title'       => _x( 'Site-Wide Activity', 'component directory title', 'buddypress' ),
 			'notification_callback' => 'bp_activity_format_notifications',
+			'notification_action_callback' => 'bp_activity_register_notification_actions',
 			'search_string'         => __( 'Search Activity...', 'buddypress' ),
 			'global_tables'         => $global_tables,
 			'meta_tables'           => $meta_tables,
Index: src/bp-core/classes/class-bp-component.php
===================================================================
--- src/bp-core/classes/class-bp-component.php
+++ src/bp-core/classes/class-bp-component.php
@@ -205,6 +205,7 @@
 	 * Set up component global variables.
 	 *
 	 * @since 1.5.0
+	 * @since 2.6.0 Added 'notification_action_callback' parameter to $args.
 	 *
 	 * @uses apply_filters() Calls 'bp_{@link bp_Component::name}_id'.
 	 * @uses apply_filters() Calls 'bp_{@link bp_Component::name}_slug'.
@@ -223,6 +224,8 @@
 	 *                                           'Search Groups...'.
 	 *     @type array    $global_tables         Optional. An array of database table names.
 	 *     @type array    $meta_tables           Optional. An array of metadata table names.
+	 *     @type callable $notification_action_callback Optional. The callable function that registers the component's
+	 *                                                  notification actions.
 	 * }
 	 */
 	public function setup_globals( $args = array() ) {
@@ -235,14 +238,15 @@
 		$default_root_slug = isset( buddypress()->pages->{$this->id}->slug ) ? buddypress()->pages->{$this->id}->slug : '';
 
 		$r = wp_parse_args( $args, array(
-			'slug'                  => $this->id,
-			'root_slug'             => $default_root_slug,
-			'has_directory'         => false,
-			'directory_title'       => '',
-			'notification_callback' => '',
-			'search_string'         => '',
-			'global_tables'         => '',
-			'meta_tables'           => '',
+			'slug'            => $this->id,
+			'root_slug'       => $default_root_slug,
+			'has_directory'   => false,
+			'directory_title' => '',
+			'notification_callback'        => '',
+			'notification_action_callback' => '',
+			'search_string'                => '',
+			'global_tables'                => '',
+			'meta_tables'                  => '',
 		) );
 
 		/**
@@ -252,7 +256,7 @@
 		 *
 		 * @param string $value Slug to use in permalink URI chunk.
 		 */
-		$this->slug                  = apply_filters( 'bp_' . $this->id . '_slug',                  $r['slug']                  );
+		$this->slug = apply_filters( 'bp_' . $this->id . '_slug',                  $r['slug']                  );
 
 		/**
 		 * Filters the slug used for root directory.
@@ -261,7 +265,7 @@
 		 *
 		 * @param string $value Root directory slug.
 		 */
-		$this->root_slug             = apply_filters( 'bp_' . $this->id . '_root_slug',             $r['root_slug']             );
+		$this->root_slug = apply_filters( 'bp_' . $this->id . '_root_slug',             $r['root_slug']             );
 
 		/**
 		 * Filters the component's top-level directory if available.
@@ -270,7 +274,7 @@
 		 *
 		 * @param bool $value Whether or not there is a top-level directory.
 		 */
-		$this->has_directory         = apply_filters( 'bp_' . $this->id . '_has_directory',         $r['has_directory']         );
+		$this->has_directory = apply_filters( 'bp_' . $this->id . '_has_directory',         $r['has_directory']         );
 
 		/**
 		 * Filters the component's directory title.
@@ -279,7 +283,7 @@
 		 *
 		 * @param string $value Title to use for the directory.
 		 */
-		$this->directory_title       = apply_filters( 'bp_' . $this->id . '_directory_title',       $r['directory_title']         );
+		$this->directory_title = apply_filters( 'bp_' . $this->id . '_directory_title',       $r['directory_title']         );
 
 		/**
 		 * Filters the placeholder text for search inputs for component.
@@ -288,7 +292,7 @@
 		 *
 		 * @param string $value Name to use in search input placeholders.
 		 */
-		$this->search_string         = apply_filters( 'bp_' . $this->id . '_search_string',         $r['search_string']         );
+		$this->search_string = apply_filters( 'bp_' . $this->id . '_search_string',         $r['search_string']         );
 
 		/**
 		 * Filters the callable function that formats the component's notifications.
@@ -299,6 +303,15 @@
 		 */
 		$this->notification_callback = apply_filters( 'bp_' . $this->id . '_notification_callback', $r['notification_callback'] );
 
+		/**
+		 * Filters the callable function that registers the component's notification actions.
+		 *
+		 * @since 2.6.0
+		 *
+		 * @param string $value Function callback.
+		 */
+		$this->notification_action_callback = apply_filters( 'bp_' . $this->id . '_notification_action_callback', $r['notification_action_callback'] );
+
 		// Set the global table names, if applicable.
 		if ( ! empty( $r['global_tables'] ) ) {
 			$this->register_global_tables( $r['global_tables'] );
Index: src/bp-forums/bp-forums-loader.php
===================================================================
--- src/bp-forums/bp-forums-loader.php
+++ src/bp-forums/bp-forums-loader.php
@@ -70,7 +70,6 @@
 			'slug'                  => BP_FORUMS_SLUG,
 			'root_slug'             => isset( $bp->pages->forums->slug ) ? $bp->pages->forums->slug : BP_FORUMS_SLUG,
 			'has_directory'         => true,
-			'notification_callback' => 'messages_format_notifications',
 			'search_string'         => __( 'Search Forums...', 'buddypress' ),
 		);
 
Index: src/bp-friends/bp-friends-functions.php
===================================================================
--- src/bp-friends/bp-friends-functions.php
+++ src/bp-friends/bp-friends-functions.php
@@ -795,3 +795,66 @@
 	) );
 }
 add_action( 'bp_activity_mentions_prime_results', 'bp_friends_prime_mentions_results' );
+
+/** Emails ********************************************************************/
+
+/**
+ * Send an email after a friendship request is requested.
+ *
+ * When a friendship is requested, an email is sent to the user of whom
+ * friendship has been requested ($friend_id).
+ *
+ * @since 1.0
+ *
+ * @param int $friendship_id ID of the friendship object.
+ * @param int $initiator_id  ID of the user who initiated the request.
+ * @param int $friend_id     ID of the request recipient.
+ */
+function friends_notification_new_request( $friendship_id, $initiator_id, $friend_id ) {
+	if ( 'no' == bp_get_user_meta( (int) $friend_id, 'notification_friends_friendship_request', true ) ) {
+		return;
+	}
+
+	$args = array(
+		'tokens' => array(
+			'friend-requests.url' => esc_url( bp_core_get_user_domain( $friend_id ) . bp_get_friends_slug() . '/requests/' ),
+			'friend.id'           => $friend_id,
+			'friendship.id'       => $friendship_id,
+			'initiator.id'        => $initiator_id,
+			'initiator.url'       => esc_url( bp_core_get_user_domain( $initiator_id ) ),
+			'initiator.name'      => bp_core_get_user_displayname( $initiator_id ),
+		),
+	);
+	bp_send_email( 'friends-request', $friend_id, $args );
+}
+add_action( 'friends_friendship_requested', 'friends_notification_new_request', 10, 3 );
+
+/**
+ * Send an email after a friendship request is accepted.
+ *
+ * When a friendship request is accepted, an email is sent to the user who
+ * requested the friendship ($initiator_id).
+ *
+ * @since 1.0
+ *
+ * @param int $friendship_id ID of the friendship object.
+ * @param int $initiator_id  ID of the user who initiated the request.
+ * @param int $friend_id     ID of the request recipient.
+ */
+function friends_notification_accepted_request( $friendship_id, $initiator_id, $friend_id ) {
+	if ( 'no' == bp_get_user_meta( (int) $initiator_id, 'notification_friends_friendship_accepted', true ) ) {
+		return;
+	}
+
+	$args = array(
+		'tokens' => array(
+			'friend.id'      => $friend_id,
+			'friendship.url' => esc_url( bp_core_get_user_domain( $friend_id ) ),
+			'friend.name'    => bp_core_get_user_displayname( $friend_id ),
+			'friendship.id'  => $friendship_id,
+			'initiator.id'   => $initiator_id,
+		),
+	);
+	bp_send_email( 'friends-request-accepted', $initiator_id, $args );
+}
+add_action( 'friends_friendship_accepted', 'friends_notification_accepted_request', 10, 3 );
Index: src/bp-friends/bp-friends-notifications.php
===================================================================
--- src/bp-friends/bp-friends-notifications.php
+++ src/bp-friends/bp-friends-notifications.php
@@ -13,70 +13,38 @@
 // Exit if accessed directly.
 defined( 'ABSPATH' ) || exit;
 
-/** Emails ********************************************************************/
-
 /**
- * Send notifications related to a new friendship request.
- *
- * When a friendship is requested, an email and a BP notification are sent to
- * the user of whom friendship has been requested ($friend_id).
+ * Register screen notification actions with the Notifications component.
  *
- * @since 1.0.0
- *
- * @param int $friendship_id ID of the friendship object.
- * @param int $initiator_id  ID of the user who initiated the request.
- * @param int $friend_id     ID of the request recipient.
+ * @since 2.6.0
  */
-function friends_notification_new_request( $friendship_id, $initiator_id, $friend_id ) {
-	if ( 'no' == bp_get_user_meta( (int) $friend_id, 'notification_friends_friendship_request', true ) ) {
-		return;
-	}
-
-	$args = array(
-		'tokens' => array(
-			'friend-requests.url' => esc_url( bp_core_get_user_domain( $friend_id ) . bp_get_friends_slug() . '/requests/' ),
-			'friend.id'           => $friend_id,
-			'friendship.id'       => $friendship_id,
-			'initiator.id'        => $initiator_id,
-			'initiator.url'       => esc_url( bp_core_get_user_domain( $initiator_id ) ),
-			'initiator.name'      => bp_core_get_user_displayname( $initiator_id ),
-		),
+function bp_friends_register_notification_actions() {
+	// Set labels
+	bp_notifications_set_prop(
+		'settings_component_label',
+		_x( 'Friends', 'Settings > Notifications component label', 'buddypress' ),
+		'labels',
+		'friends'
 	);
-	bp_send_email( 'friends-request', $friend_id, $args );
-}
-add_action( 'friends_friendship_requested', 'friends_notification_new_request', 10, 3 );
 
-/**
- * Send notifications related to the acceptance of a friendship request.
- *
- * When a friendship request is accepted, an email and a BP notification are
- * sent to the user who requested the friendship ($initiator_id).
- *
- * @since 1.0.0
- *
- * @param int $friendship_id ID of the friendship object.
- * @param int $initiator_id  ID of the user who initiated the request.
- * @param int $friend_id     ID of the request recipient.
- */
-function friends_notification_accepted_request( $friendship_id, $initiator_id, $friend_id ) {
-	if ( 'no' == bp_get_user_meta( (int) $initiator_id, 'notification_friends_friendship_accepted', true ) ) {
-		return;
-	}
+	// Register actions.
+	bp_notifications_set_action( 'friends', array(
+		'action' => 'friendship_requested',
+		'settings_label' => __( 'A member sends you a friendship request', 'buddypress' )
+	) );
 
-	$args = array(
-		'tokens' => array(
-			'friend.id'      => $friend_id,
-			'friendship.url' => esc_url( bp_core_get_user_domain( $friend_id ) ),
-			'friend.name'    => bp_core_get_user_displayname( $friend_id ),
-			'friendship.id'  => $friendship_id,
-			'initiator.id'   => $initiator_id,
-		),
-	);
-	bp_send_email( 'friends-request-accepted', $initiator_id, $args );
-}
-add_action( 'friends_friendship_accepted', 'friends_notification_accepted_request', 10, 3 );
+	bp_notifications_set_action( 'friends', array(
+		'action' => 'friendship_accepted',
+		'settings_label' => __( 'A member accepts your friendship request', 'buddypress' )
+	) );
 
-/** Notifications *************************************************************/
+	/**
+	 * Fires after default friend notification actions are registered.
+	 *
+	 * @since 2.6.0
+	 */
+	do_action( 'bp_friends_register_notification_actions' );
+}
 
 /**
  * Notification formatting callback for bp-friends notifications.
@@ -182,7 +150,7 @@
  * @since 1.2.0
  */
 function friends_clear_friend_notifications() {
-	if ( isset( $_GET['new'] ) && bp_is_active( 'notifications' ) ) {
+	if ( isset( $_GET['new'] ) ) {
 		bp_notifications_mark_notifications_by_type( bp_loggedin_user_id(), buddypress()->friends->id, 'friendship_accepted' );
 	}
 }
@@ -194,7 +162,7 @@
  * @since 1.9.0
  */
 function bp_friends_mark_friendship_request_notifications_by_type() {
-	if ( isset( $_GET['new'] ) && bp_is_active( 'notifications' ) ) {
+	if ( isset( $_GET['new'] ) ) {
 		bp_notifications_mark_notifications_by_type( bp_loggedin_user_id(), buddypress()->friends->id, 'friendship_request' );
 	}
 }
@@ -206,9 +174,7 @@
  * @since 1.9.0
  */
 function bp_friends_mark_friendship_accepted_notifications_by_type() {
-	if ( bp_is_active( 'notifications' ) ) {
-		bp_notifications_mark_notifications_by_type( bp_loggedin_user_id(), buddypress()->friends->id, 'friendship_accepted' );
-	}
+	bp_notifications_mark_notifications_by_type( bp_loggedin_user_id(), buddypress()->friends->id, 'friendship_accepted' );
 }
 add_action( 'friends_screen_my_friends', 'bp_friends_mark_friendship_accepted_notifications_by_type' );
 
@@ -222,17 +188,15 @@
  * @param int $friend_user_id    The friendship request receiver user ID.
  */
 function bp_friends_friendship_requested_notification( $friendship_id, $initiator_user_id, $friend_user_id ) {
-	if ( bp_is_active( 'notifications' ) ) {
-		bp_notifications_add_notification( array(
-			'user_id'           => $friend_user_id,
-			'item_id'           => $initiator_user_id,
-			'secondary_item_id' => $friendship_id,
-			'component_name'    => buddypress()->friends->id,
-			'component_action'  => 'friendship_request',
-			'date_notified'     => bp_core_current_time(),
-			'is_new'            => 1,
-		) );
-	}
+	bp_notifications_add_notification( array(
+		'user_id'           => $friend_user_id,
+		'item_id'           => $initiator_user_id,
+		'secondary_item_id' => $friendship_id,
+		'component_name'    => buddypress()->friends->id,
+		'component_action'  => 'friendship_request',
+		'date_notified'     => bp_core_current_time(),
+		'is_new'            => 1,
+	) );
 }
 add_action( 'friends_friendship_requested', 'bp_friends_friendship_requested_notification', 10, 3 );
 
@@ -245,9 +209,7 @@
  * @param object $friendship    Friendship object.
  */
 function bp_friends_mark_friendship_rejected_notifications_by_item_id( $friendship_id, $friendship ) {
-	if ( bp_is_active( 'notifications' ) ) {
-		bp_notifications_mark_notifications_by_item_id( $friendship->friend_user_id, $friendship->initiator_user_id, buddypress()->friends->id, 'friendship_request' );
-	}
+	bp_notifications_mark_notifications_by_item_id( $friendship->friend_user_id, $friendship->initiator_user_id, buddypress()->friends->id, 'friendship_request' );
 }
 add_action( 'friends_friendship_rejected', 'bp_friends_mark_friendship_rejected_notifications_by_item_id', 10, 2 );
 
@@ -261,12 +223,6 @@
  * @param int $friend_user_id    The friendship request receiver user ID.
  */
 function bp_friends_add_friendship_accepted_notification( $friendship_id, $initiator_user_id, $friend_user_id ) {
-
-	// Bail if notifications is not active.
-	if ( ! bp_is_active( 'notifications' ) ) {
-		return;
-	}
-
 	// Remove the friend request notice.
 	bp_notifications_mark_notifications_by_item_id( $friend_user_id, $initiator_user_id, buddypress()->friends->id, 'friendship_request' );
 
@@ -292,9 +248,7 @@
  * @param object $friendship    Friendship Object.
  */
 function bp_friends_mark_friendship_withdrawn_notifications_by_item_id( $friendship_id, $friendship ) {
-	if ( bp_is_active( 'notifications' ) ) {
-		bp_notifications_delete_notifications_by_item_id( $friendship->friend_user_id, $friendship->initiator_user_id, buddypress()->friends->id, 'friendship_request' );
-	}
+	bp_notifications_delete_notifications_by_item_id( $friendship->friend_user_id, $friendship->initiator_user_id, buddypress()->friends->id, 'friendship_request' );
 }
 add_action( 'friends_friendship_withdrawn', 'bp_friends_mark_friendship_withdrawn_notifications_by_item_id', 10, 2 );
 
@@ -306,8 +260,6 @@
  * @param int $user_id ID of the user whose notifications are removed.
  */
 function bp_friends_remove_notifications_data( $user_id = 0 ) {
-	if ( bp_is_active( 'notifications' ) ) {
-		bp_notifications_delete_notifications_from_user( $user_id, buddypress()->friends->id, 'friendship_request' );
-	}
+	bp_notifications_delete_notifications_from_user( $user_id, buddypress()->friends->id, 'friendship_request' );
 }
 add_action( 'friends_remove_data', 'bp_friends_remove_notifications_data', 10, 1 );
Index: src/bp-friends/classes/class-bp-friends-component.php
===================================================================
--- src/bp-friends/classes/class-bp-friends-component.php
+++ src/bp-friends/classes/class-bp-friends-component.php
@@ -53,10 +53,14 @@
 			'activity',
 			'template',
 			'functions',
-			'notifications',
 			'widgets',
 		);
 
+		// Conditional includes.
+		if ( bp_is_active( 'notifications' ) ) {
+			$includes[] = 'notifications';
+		}
+
 		if ( ! buddypress()->do_autoload ) {
 			$includes[] = 'classes';
 		}
@@ -103,7 +107,8 @@
 			'has_directory'         => false,
 			'search_string'         => __( 'Search Friends...', 'buddypress' ),
 			'notification_callback' => 'friends_format_notifications',
-			'global_tables'         => $global_tables
+			'notification_action_callback' => 'bp_friends_register_notification_actions',
+			'global_tables'                => $global_tables
 		);
 
 		parent::setup_globals( $args );
Index: src/bp-groups/bp-groups-notifications.php
===================================================================
--- src/bp-groups/bp-groups-notifications.php
+++ src/bp-groups/bp-groups-notifications.php
@@ -294,6 +294,59 @@
 /** Notifications *************************************************************/
 
 /**
+ * Register screen notification actions with the Notifications component.
+ *
+ * @since 2.6.0
+ */
+function bp_groups_register_notification_actions() {
+	// Set labels
+	bp_notifications_set_prop(
+		'settings_component_label',
+		_x( 'Groups', 'Settings > Notifications component label', 'buddypress' ),
+		'labels',
+		'groups'
+	);
+
+	// Register actions.
+	bp_notifications_set_action( 'groups', array(
+		'action' => 'group_invite',
+		'settings_label' => __( 'A member invites you to join a group', 'buddypress' )
+	) );
+
+	bp_notifications_set_action( 'groups', array(
+		'action' => 'member_promoted_to_admin',
+		'settings_label' => __( 'You are promoted to a group administrator', 'buddypress' )
+	) );
+
+	bp_notifications_set_action( 'groups', array(
+		'action' => 'member_promoted_to_mod',
+		'settings_label' => __( 'You are promoted to a group moderator', 'buddypress' )
+	) );
+
+	bp_notifications_set_action( 'groups', array(
+		'action' => 'new_membership_request',
+		'settings_label' => __( 'A member requests to join a private group for which you are an admin', 'buddypress' )
+	) );
+
+	bp_notifications_set_action( 'groups', array(
+		'action' => 'membership_request_accepted',
+		'settings_label' => __( 'Your group membership request is accepted', 'buddypress' )
+	) );
+
+	bp_notifications_set_action( 'groups', array(
+		'action' => 'membership_request_rejected',
+		'settings_label' => __( 'Your group membership request is declined', 'buddypress' )
+	) );
+
+	/**
+	 * Fires after default friend notification actions are registered.
+	 *
+	 * @since 2.6.0
+	 */
+	do_action( 'bp_groups_register_notification_actions' );
+}
+
+/**
  * Format notifications for the Groups component.
  *
  * @since 1.0.0
Index: src/bp-groups/classes/class-bp-groups-component.php
===================================================================
--- src/bp-groups/classes/class-bp-groups-component.php
+++ src/bp-groups/classes/class-bp-groups-component.php
@@ -166,9 +166,10 @@
 			'has_directory'         => true,
 			'directory_title'       => _x( 'Groups', 'component directory title', 'buddypress' ),
 			'notification_callback' => 'groups_format_notifications',
-			'search_string'         => _x( 'Search Groups...', 'Component directory search', 'buddypress' ),
-			'global_tables'         => $global_tables,
-			'meta_tables'           => $meta_tables,
+			'notification_action_callback' => 'bp_groups_register_notification_actions',
+			'search_string'                => _x( 'Search Groups...', 'Component directory search', 'buddypress' ),
+			'global_tables'                => $global_tables,
+			'meta_tables'                  => $meta_tables,
 		);
 
 		parent::setup_globals( $args );
Index: src/bp-messages/bp-messages-functions.php
===================================================================
--- src/bp-messages/bp-messages-functions.php
+++ src/bp-messages/bp-messages-functions.php
@@ -524,3 +524,78 @@
 
 	return $retval;
 }
+
+/** Email *********************************************************************/
+
+/**
+ * Email message recipients to alert them of a new unread private message.
+ *
+ * @since 1.0.0
+ *
+ * @param array|BP_Messages_Message $raw_args {
+ *     Array of arguments. Also accepts a BP_Messages_Message object.
+ *     @type array  $recipients    User IDs of recipients.
+ *     @type string $email_subject Subject line of message.
+ *     @type string $email_content Content of message.
+ *     @type int    $sender_id     User ID of sender.
+ * }
+ */
+function messages_notification_new_message( $raw_args = array() ) {
+	if ( is_object( $raw_args ) ) {
+		$args = (array) $raw_args;
+	} else {
+		$args = $raw_args;
+	}
+
+	// These should be extracted below.
+	$recipients    = array();
+	$email_subject = $email_content = '';
+	$sender_id     = 0;
+
+	// Barf.
+	extract( $args );
+
+	if ( empty( $recipients ) ) {
+		return;
+	}
+
+	$sender_name = bp_core_get_user_displayname( $sender_id );
+
+	// Send an email to each recipient.
+	foreach ( $recipients as $recipient ) {
+		if ( $sender_id == $recipient->user_id || 'no' == bp_get_user_meta( $recipient->user_id, 'notification_messages_new_message', true ) ) {
+			continue;
+		}
+
+		// User data and links.
+		$ud = get_userdata( $recipient->user_id );
+		if ( empty( $ud ) ) {
+			continue;
+		}
+
+		$args = array(
+			'tokens' => array(
+				'usermessage' => wp_strip_all_tags( $message ),
+				'message.url' => esc_url( bp_core_get_user_domain( $recipient->user_id ) . bp_get_messages_slug() . '/' ),
+				'sender.name' => $sender_name,
+				'usersubject' => sanitize_text_field( $subject ),
+			),
+		);
+		bp_send_email( 'messages-unread', $ud, $args );
+	}
+
+	/**
+	 * Fires after the sending of a new message email notification.
+	 *
+	 * @since 1.5.0
+	 * @deprecated 2.5.0 Use the filters in BP_Email.
+	 *                   $email_subject and $email_content arguments unset and deprecated.
+	 *
+	 * @param array  $recipients    User IDs of recipients.
+	 * @param string $email_subject Deprecated in 2.5; now an empty string.
+	 * @param string $email_content Deprecated in 2.5; now an empty string.
+	 * @param array  $args          Array of originally provided arguments.
+	 */
+	do_action( 'bp_messages_sent_notification_email', $recipients, '', '', $args );
+}
+add_action( 'messages_message_sent', 'messages_notification_new_message', 10 );
Index: src/bp-messages/bp-messages-notifications.php
===================================================================
--- src/bp-messages/bp-messages-notifications.php
+++ src/bp-messages/bp-messages-notifications.php
@@ -10,82 +10,33 @@
 // Exit if accessed directly.
 defined( 'ABSPATH' ) || exit;
 
-/** Email *********************************************************************/
-
 /**
- * Email message recipients to alert them of a new unread private message.
- *
- * @since 1.0.0
+ * Register screen notification actions with the Notifications component.
  *
- * @param array|BP_Messages_Message $raw_args {
- *     Array of arguments. Also accepts a BP_Messages_Message object.
- *     @type array  $recipients    User IDs of recipients.
- *     @type string $email_subject Subject line of message.
- *     @type string $email_content Content of message.
- *     @type int    $sender_id     User ID of sender.
- * }
+ * @since 2.6.0
  */
-function messages_notification_new_message( $raw_args = array() ) {
-	if ( is_object( $raw_args ) ) {
-		$args = (array) $raw_args;
-	} else {
-		$args = $raw_args;
-	}
-
-	// These should be extracted below.
-	$recipients    = array();
-	$email_subject = $email_content = '';
-	$sender_id     = 0;
-
-	// Barf.
-	extract( $args );
-
-	if ( empty( $recipients ) ) {
-		return;
-	}
-
-	$sender_name = bp_core_get_user_displayname( $sender_id );
-
-	// Send an email to each recipient.
-	foreach ( $recipients as $recipient ) {
-		if ( $sender_id == $recipient->user_id || 'no' == bp_get_user_meta( $recipient->user_id, 'notification_messages_new_message', true ) ) {
-			continue;
-		}
-
-		// User data and links.
-		$ud = get_userdata( $recipient->user_id );
-		if ( empty( $ud ) ) {
-			continue;
-		}
-
-		$args = array(
-			'tokens' => array(
-				'usermessage' => wp_strip_all_tags( stripslashes( $message ) ),
-				'message.url' => esc_url( bp_core_get_user_domain( $recipient->user_id ) . bp_get_messages_slug() . '/view/' . $thread_id . '/' ),
-				'sender.name' => $sender_name,
-				'usersubject' => sanitize_text_field( stripslashes( $subject ) ),
-			),
-		);
-		bp_send_email( 'messages-unread', $ud, $args );
-	}
+function bp_messages_register_notification_actions() {
+	// Set labels
+	bp_notifications_set_prop(
+		'settings_component_label',
+		_x( 'Messages', 'Settings > Notifications component label', 'buddypress' ),
+		'labels',
+		'messages'
+	);
+
+	// Register actions.
+	bp_notifications_set_action( 'messages', array(
+		'action' => 'new_message',
+		'settings_label' => __( 'A member sends you a new message', 'buddypress' )
+	) );
 
 	/**
-	 * Fires after the sending of a new message email notification.
-	 *
-	 * @since 1.5.0
-	 * @deprecated 2.5.0 Use the filters in BP_Email.
-	 *                   $email_subject and $email_content arguments unset and deprecated.
+	 * Fires after default message notification actions are registered.
 	 *
-	 * @param array  $recipients    User IDs of recipients.
-	 * @param string $email_subject Deprecated in 2.5; now an empty string.
-	 * @param string $email_content Deprecated in 2.5; now an empty string.
-	 * @param array  $args          Array of originally provided arguments.
+	 * @since 2.6.0
 	 */
-	do_action( 'bp_messages_sent_notification_email', $recipients, '', '', $args );
+	do_action( 'bp_messages_register_notification_actions' );
 }
-add_action( 'messages_message_sent', 'messages_notification_new_message', 10 );
-
-/** Notifications *************************************************************/
 
 /**
  * Format notifications for the Messages component.
@@ -181,7 +132,7 @@
  * @param BP_Messages_Message $message Message object.
  */
 function bp_messages_message_sent_add_notification( $message ) {
-	if ( bp_is_active( 'notifications' ) && ! empty( $message->recipients ) ) {
+	if ( ! empty( $message->recipients ) ) {
 		foreach ( (array) $message->recipients as $recipient ) {
 			bp_notifications_add_notification( array(
 				'user_id'           => $recipient->user_id,
@@ -203,30 +154,28 @@
  * @since 1.9.0
  */
 function bp_messages_screen_conversation_mark_notifications() {
-	if ( bp_is_active( 'notifications' ) ) {
-		global $thread_template;
-
-		// Get unread PM notifications for the user.
-		$new_pm_notifications = BP_Notifications_Notification::get( array(
-			'user_id'           => bp_loggedin_user_id(),
-			'component_name'    => buddypress()->messages->id,
-			'component_action'  => 'new_message',
-			'is_new'            => 1,
-		) );
-		$unread_message_ids = wp_list_pluck( $new_pm_notifications, 'item_id' );
-
-		// No unread PMs, so stop!
-		if ( empty( $unread_message_ids ) ) {
-			return;
-		}
+	global $thread_template;
+
+	// Get unread PM notifications for the user.
+	$new_pm_notifications = BP_Notifications_Notification::get( array(
+		'user_id'           => bp_loggedin_user_id(),
+		'component_name'    => buddypress()->messages->id,
+		'component_action'  => 'new_message',
+		'is_new'            => 1,
+	) );
+	$unread_message_ids = wp_list_pluck( $new_pm_notifications, 'item_id' );
+
+	// No unread PMs, so stop!
+	if ( empty( $unread_message_ids ) ) {
+		return;
+	}
 
-		// Get the unread message ids for this thread only.
-		$message_ids = array_intersect( $unread_message_ids, wp_list_pluck( $thread_template->thread->messages, 'id' ) );
+	// Get the unread message ids for this thread only.
+	$message_ids = array_intersect( $unread_message_ids, wp_list_pluck( $thread_template->thread->messages, 'id' ) );
 
-		// Mark each notification for each PM message as read.
-		foreach ( $message_ids as $message_id ) {
-			bp_notifications_mark_notifications_by_item_id( bp_loggedin_user_id(), (int) $message_id, buddypress()->messages->id, 'new_message' );
-		}
+	// Mark each notification for each PM message as read.
+	foreach ( $message_ids as $message_id ) {
+		bp_notifications_mark_notifications_by_item_id( bp_loggedin_user_id(), (int) $message_id, buddypress()->messages->id, 'new_message' );
 	}
 }
 add_action( 'thread_loop_start', 'bp_messages_screen_conversation_mark_notifications', 10 );
@@ -240,10 +189,6 @@
  * @param array $message_ids IDs of the messages.
  */
 function bp_messages_message_delete_notifications( $thread_id, $message_ids ) {
-	if ( ! bp_is_active( 'notifications' ) ) {
-		return;
-	}
-
 	// For each recipient, delete notifications corresponding to each message.
 	$thread = new BP_Messages_Thread( $thread_id );
 	foreach ( $thread->get_recipients() as $recipient ) {
Index: src/bp-messages/classes/class-bp-messages-component.php
===================================================================
--- src/bp-messages/classes/class-bp-messages-component.php
+++ src/bp-messages/classes/class-bp-messages-component.php
@@ -63,7 +63,6 @@
 			'filters',
 			'template',
 			'functions',
-			'notifications',
 			'widgets',
 		);
 
@@ -72,6 +71,9 @@
 		}
 
 		// Conditional includes.
+		if ( bp_is_active( 'notifications' ) ) {
+			$includes[] = 'notifications';
+		}
 		if ( bp_is_active( $this->id, 'star' ) ) {
 			$includes[] = 'star';
 		}
@@ -118,9 +120,10 @@
 			'slug'                  => BP_MESSAGES_SLUG,
 			'has_directory'         => false,
 			'notification_callback' => 'messages_format_notifications',
-			'search_string'         => __( 'Search Messages...', 'buddypress' ),
-			'global_tables'         => $global_tables,
-			'meta_tables'           => $meta_tables
+			'notification_action_callback' => 'bp_messages_register_notification_actions',
+			'search_string'                => __( 'Search Messages...', 'buddypress' ),
+			'global_tables'                => $global_tables,
+			'meta_tables'                  => $meta_tables
 		) );
 	}
 
Index: src/bp-notifications/bp-notifications-functions.php
===================================================================
--- src/bp-notifications/bp-notifications-functions.php
+++ src/bp-notifications/bp-notifications-functions.php
@@ -63,6 +63,25 @@
 		}
 	}
 
+	// See if the user has disabled notifications for this component or action.
+	if ( bp_is_active( 'settings' ) ) {
+		// Eek.
+		// @see https://buddypress.trac.wordpress.org/ticket/6663#comment:4
+		if ( 'profile' === $r['component_name'] && bp_is_active( 'xprofile' ) ) {
+			$r['component_name'] = 'xprofile';
+		}
+
+		$did_user_disable_component = bp_get_user_meta( $r['user_id'], "notifications_{$r['component_name']}_enabled", true );
+		if ( '' !== $did_user_disable_component && 0 == $did_user_disable_component ) {
+			return false;
+		}
+
+		$did_user_disable_action = bp_get_user_meta( $r['user_id'], "notifications_{$r['component_name']}_{$r['component_action']}_enabled", true );
+		if ( '' !== $did_user_disable_action && 0 == $did_user_disable_action ) {
+			return false;
+		}
+	}
+
 	// Setup the new notification.
 	$notification                    = new BP_Notifications_Notification;
 	$notification->user_id           = $r['user_id'];
@@ -622,7 +641,7 @@
 
 	// Loop through components, look for callbacks, add to return value.
 	foreach ( $active_components as $component ) {
-		if ( !empty( $bp->$component->notification_callback ) ) {
+		if ( !empty( $bp->$component->notification_callback ) && is_callable( $bp->$component->notification_callback ) ) {
 			$component_names[] = $component;
 		}
 		// The extended profile component is identified in the active_components array as 'xprofile'.
@@ -643,6 +662,133 @@
 	return apply_filters( 'bp_notifications_get_registered_components', $component_names, $active_components );
 }
 
+/**
+ * Initialize registered notification actions.
+ *
+ * This loops through each component to fetch registered notification actions.
+ * This function is designed to be run when you need to fetch these actions in
+ * your code.
+ *
+ * @since 2.6.0
+ */
+function bp_notifications_init_registered_actions() {
+	// Load BuddyPress.
+	$bp = buddypress();
+
+	// We've already done this!
+	if ( ! empty( $bp->notifications->actions ) ) {
+		return;
+	}
+
+	// Setup return value.
+	$component_names = array();
+
+	// Get the active components.
+	$active_components = array_keys( $bp->active_components );
+
+	// Loop through components, look for callbacks and run them.
+	foreach ( $active_components as $component ) {
+		// The extended profile component is identified in the active_components array as 'xprofile'.
+		// However, the extended profile child object has the key 'profile' in the $bp global.
+		if ( 'xprofile' == $component ) {
+			$component = 'profile';
+		}
+
+		if ( ! empty( $bp->$component->notification_action_callback ) && is_callable( $bp->$component->notification_action_callback ) ) {
+			call_user_func( $bp->$component->notification_action_callback );
+		}
+	}
+}
+
+/**
+ * Register a notification action.
+ *
+ * Used primarily to output a user's "Settings > Notifications" page, but
+ * could be used for other things.
+ *
+ * You should run this function after 'bp_setup_globals'.
+ *
+ * @since 2.6.0
+ *
+ * @param array $args {
+ *     Array of arguments to register for the notification action.
+ *     @type string $action         The action name.
+ *     @type string $settings_label The label for the action. Used on a user's Settings page.
+ * }
+ * @param string $component The component that the action belongs to.
+ * @return bool
+ */
+function bp_notifications_set_action( $component = '', $args = array() ) {
+	if ( ! did_action( 'bp_setup_globals' ) ) {
+		_doing_it_wrong( __FUNCTION__, "Function must be called after the 'bp_setup_globals' hook." );
+		return false;
+	}
+
+	if ( empty( $component ) || empty( $args ) ) {
+		return false;
+	}
+
+	if ( ! isset( buddypress()->$component->notification_callback ) ) {
+		return false;
+	}
+
+	$action = $args['action'];
+	unset( $args['action'] );
+
+	if ( isset( buddypress()->notifications->actions[$component][$action] ) ) {
+		return false;
+	}
+
+	buddypress()->notifications->actions[$component][$action] = $args;
+
+	return true;
+}
+
+/**
+ * Set an arbitrary value in the buddypress()->notifications object.
+ *
+ * Useful for devs to stash various items.
+ *
+ * @since 2.6.0
+ *
+ * @param string $prop      The property name.
+ * @param mixed  $value     The value to set for the property.
+ * @param string $object    The object this property should be assigned to. Optional.
+ * @param string $component The component attached with this property. Optional.
+ *                          If filled in, this will prefix the $prop name.
+ * @return bool
+ */
+function bp_notifications_set_prop( $prop = '', $value = '', $object = '', $component = '' ) {
+	if ( ! did_action( 'bp_setup_globals' ) ) {
+		_doing_it_wrong( __FUNCTION__, "Function must be called after the 'bp_setup_globals' hook." );
+		return false;
+	}
+
+	if ( empty( $prop ) || empty( $value ) ) {
+		return false;
+	}
+
+	if ( ! empty( $component ) )  {
+		$prop = "{$component}_{$prop}";
+	}
+
+	$prop = sanitize_key( $prop );
+	$object = sanitize_key( $object );
+
+	if ( ! empty( $object ) ) {
+		if ( empty( buddypress()->notifications->$object ) ) {
+			buddypress()->notifications->$object = new stdClass;
+		}
+
+		buddypress()->notifications->$object->$prop = $value;
+	} else {
+		buddypress()->notifications->$prop = $value;
+	}
+
+	return true;
+}
+
+
 /** Meta **********************************************************************/
 
 /**
Index: src/bp-notifications/bp-notifications-screens.php
===================================================================
--- src/bp-notifications/bp-notifications-screens.php
+++ src/bp-notifications/bp-notifications-screens.php
@@ -68,5 +68,31 @@
  * @since 1.9.0
  */
 function bp_notifications_screen_settings() {
+	// Add hook to display notification content.
+	add_action( 'bp_template_content', 'bp_notifications_screen_content' );
 
+	/**
+	 * Fires right before the loading of the settings screen notifications screen template file.
+	 *
+	 * @since 2.6.0
+	 */
+	do_action( 'bp_notifications_screen_settings' );
+
+	/**
+	 * Filters the template to load for the Notifications settings screen.
+	 *
+	 * @since 2.6.0
+	 *
+	 * @param string $template Path to the XProfile change avatar template to load.
+	 */
+	bp_core_load_template( apply_filters( 'bp_settings_screen_notifications', '/members/single/home' ) );
+}
+
+/**
+ * Output the screen notification content via a template part.
+ *
+ * @since 2.6.0
+ */
+function bp_notifications_screen_content() {
+	bp_get_template_part( 'members/single/settings/screen-notifications' );
 }
\ No newline at end of file
Index: src/bp-notifications/bp-notifications-settings.php
new file mode 100644
===================================================================
--- /dev/null
+++ src/bp-notifications/bp-notifications-settings.php
@@ -0,0 +1,149 @@
+<?php
+/**
+ * BuddyPress Notifications Settings Functions.
+ *
+ * @package BuddyPress
+ * @subpackage NotificationsSettings
+ * @since 2.6.0
+ */
+
+// Exit if accessed directly.
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * Output the notification component settings title.
+ *
+ * @since 2.6.0
+ *
+ * @param string $component The component to retrieve the settings title for.
+ * @param string $element   The element to wrap the title around. Default: h3.
+ */
+function bp_notifications_component_settings_title( $component = '', $element = 'h3' ) {
+	echo bp_notifications_get_component_settings_title( $component, $element );
+}
+
+/**
+ * Return the notification component settings title.
+ *
+ * @since 2.6.0
+ *
+ * @param string $component The component to retrieve the settings title for.
+ * @param string $element   The element to wrap the title around. Default: h3.
+ * @return string
+ */
+function bp_notifications_get_component_settings_title( $component = '', $element = 'h3' ) {
+	// Load registered notification actions if we haven't already done so.
+	if ( empty( buddypress()->notifications->actions ) ) {
+		bp_notifications_init_registered_actions();
+	}
+
+	/** 
+	 * Filter the element used for the notification component settings title.
+	 *
+	 * @since 2.6.0
+	 *
+	 * @var string $element The element to use. Default: h3.
+	 */
+	$element = apply_filters( 'bp_notifications_component_settings_title_element', $element );
+	$element = sanitize_key( $element );
+
+	// Fallback title.
+	$title = ucfirst( sanitize_key( $component ) );
+
+	// Get registered component label if available.
+	$key = "{$component}_settings_component_label";
+	if ( isset( buddypress()->notifications->labels->$key ) ) {
+		$title = esc_html( buddypress()->notifications->labels->$key );
+	}
+
+	/**
+	 * Filter the notification component settings title.
+	 *
+	 * @since 2.6.0
+	 *
+	 * @var string $title     The component settings title.
+	 * @var string $component The component name.
+	 */
+	$title = apply_filters( 'bp_notifications_component_settings_title', $title, $component );
+
+	return "<{$element}>{$title}</{$element}>";
+}
+
+/**
+ * Handles the saving of user screen notification settings.
+ *
+ * @since 2.6.0
+ */
+function bp_notifications_settings_action_screen_notifications() {
+	// Bail if not a POST action
+	if ( false === bp_is_post_request() ) {
+		return;
+	}
+
+	// Bail if not in settings
+	if ( ! bp_is_user_settings() || ! bp_is_current_action( 'screen-notifications' ) ) {
+		return;
+	}
+
+	check_admin_referer( 'bp_settings_screen_notifications' );
+
+	// Load our registered notifications actions.
+	bp_notifications_init_registered_actions();
+
+	// Save settings.
+	foreach ( (array) bp_notifications_get_registered_components() as $component ) {
+		if ( empty( $_POST[ $component ] ) ) {
+			continue;
+		}
+
+		// Fudge xprofile component.
+		if ( 'xprofile' === $component ) {
+			$_POST[ 'xprofile' ] = $_POST[ 'profile' ];
+		}
+
+		// Disable notifications for this component.
+		if ( ! isset( $_POST[ $component ]['enabled'] ) ) {
+			bp_update_user_meta( bp_displayed_user_id(), "notifications_{$component}_enabled", 0 );
+			continue;
+
+		// Re-enable them.
+		} else {
+			bp_delete_user_meta( bp_displayed_user_id(), "notifications_{$component}_enabled" );
+		}
+
+		// Per-action handling.
+		foreach( $_POST[ $component ] as $action => $val ) {
+			if ( 'enabled' === $action ) {
+				continue;
+			}
+
+			if ( isset( buddypress()->notifications->actions[$component][$action] ) ) {
+				// Disable notifications for this action.
+				if ( 0 === (int) $val) {
+					bp_update_user_meta( bp_displayed_user_id(), "notifications_{$component}_{$action}_enabled", 0 );
+					continue;
+				} else {
+					bp_delete_user_meta( bp_displayed_user_id(), "notifications_{$component}_{$action}_enabled" );
+				}
+			}
+		}
+	}
+
+	// Switch feedback for super admins
+	if ( bp_is_my_profile() ) {
+		bp_core_add_message( __( 'Your screen notification settings have been saved.',        'buddypress' ), 'success' );
+	} else {
+		bp_core_add_message( __( "This user's screen notification settings have been saved.", 'buddypress' ), 'success' );
+	}
+
+	/**
+	 * Fires after screen notification settings are saved, and before redirect.
+	 *
+	 * @since 2.6.0
+	 */
+	do_action( 'bp_notifications_settings_action_after_save' );
+
+	bp_core_redirect( bp_displayed_user_domain() . bp_get_settings_slug() . '/screen-notifications/' );
+	die();
+}
+add_action( 'bp_actions', 'bp_notifications_settings_action_screen_notifications' );
\ No newline at end of file
Index: src/bp-notifications/classes/class-bp-notifications-component.php
===================================================================
--- src/bp-notifications/classes/class-bp-notifications-component.php
+++ src/bp-notifications/classes/class-bp-notifications-component.php
@@ -17,6 +17,24 @@
  */
 class BP_Notifications_Component extends BP_Component {
 
+	/*
+	 * Notification actions holder.
+	 *
+	 * @since 2.6.0
+	 *
+	 * @var array
+	 */
+	public $actions = array();
+
+	/**
+	 * Notification labels holder.
+	 *
+	 * @since 2.6.0
+	 *
+	 * @var object
+	 */
+	public $labels;
+
 	/**
 	 * Start the notifications component creation process.
 	 *
@@ -31,6 +49,8 @@
 				'adminbar_myaccount_order' => 30
 			)
 		);
+
+		$this->setup_hooks();
 	}
 
 	/**
@@ -52,6 +72,11 @@
 			'cache',
 		);
 
+		// @todo if ( bp_is_active( 'settings' ) && bp_is_user_settings() ) ?
+		if ( bp_is_active( 'settings' ) ) {
+			$includes[] = 'settings';
+		}
+
 		if ( ! buddypress()->do_autoload ) {
 			$includes[] = 'classes';
 		}
@@ -91,10 +116,21 @@
 			'global_tables' => $global_tables,
 		);
 
+		$this->labels = new stdClass;
+
 		parent::setup_globals( $args );
 	}
 
 	/**
+	 * Add custom hooks.
+	 *
+	 * @since 2.6.0
+	 */
+	public function setup_hooks() {
+		add_filter( 'bp_settings_admin_nav', array( $this, 'setup_settings_admin_nav' ), 1 );
+	}
+
+	/**
 	 * Set up component navigation.
 	 *
 	 * @since 1.9.0
@@ -163,10 +199,52 @@
 			'user_has_access' => $access,
 		);
 
+		/**
+		 * The Settings > Notifications nav item can only be set up after the Settings
+		 * component has run its own nav routine.
+		 */
+		add_action( 'bp_settings_setup_nav', array( $this, 'setup_settings_nav' ) );
+
 		parent::setup_nav( $main_nav, $sub_nav );
 	}
 
 	/**
+	 * Set up the Settings > Notifications nav item.
+	 *
+	 * Loaded in a separate method because the Settings component may not be
+	 * loaded in time during the BP_Notifications_Component::setup_nav() method.
+	 *
+	 * @since 2.6.0
+	 */
+	public function setup_settings_nav() {
+		if ( ! bp_is_active( 'settings' ) ) {
+			return;
+		}
+
+		// Determine user to use.
+		if ( bp_displayed_user_domain() ) {
+			$user_domain = bp_displayed_user_domain();
+		} elseif ( bp_loggedin_user_domain() ) {
+			$user_domain = bp_loggedin_user_domain();
+		} else {
+			return;
+		}
+
+		// Get the settings slug.
+		$settings_slug = bp_get_settings_slug();
+
+		bp_core_new_subnav_item( array(
+			'name'            => _x( 'Notifications', 'Notification settings sub nav', 'buddypress' ),
+			'slug'            => 'screen-notifications',
+			'parent_url'      => trailingslashit( $user_domain . $settings_slug ),
+			'parent_slug'     => $settings_slug,
+			'screen_function' => 'bp_notifications_screen_settings',
+			'position'        => 25,
+			'user_has_access' => bp_core_can_edit_settings()
+		) );
+	}
+
+	/**
 	 * Set up the component entries in the WordPress Admin Bar.
 	 *
 	 * @since 1.9.0
@@ -226,6 +304,30 @@
 	}
 
 	/**
+	 * Adds "Settings > Notifications" subnav item under the "Settings" adminbar menu.
+	 *
+	 * @since 2.6.0
+	 *
+	 * @param array $wp_admin_nav The settings adminbar nav array.
+	 * @return array
+	 */
+	public function setup_settings_admin_nav( $wp_admin_nav ) {
+
+		// Setup the logged in user variables.
+		$settings_link = trailingslashit( bp_loggedin_user_domain() . bp_get_settings_slug() );
+
+		// Add the "Notifications" subnav item.
+		$wp_admin_nav[] = array(
+			'parent' => 'my-account-' . buddypress()->settings->id,
+			'id'     => 'my-account-' . buddypress()->settings->id . '-screennotifications',
+			'title'  => _x( 'Notifications', 'My Account Settings sub nav', 'buddypress' ),
+			'href'   => trailingslashit( $settings_link . 'screen-notifications' )
+		);
+
+		return $wp_admin_nav;
+	}
+
+	/**
 	 * Set up the title for pages and <title>.
 	 *
 	 * @since 1.9.0
Index: src/bp-templates/bp-legacy/buddypress/members/single/settings/screen-notifications.php
new file mode 100644
===================================================================
--- /dev/null
+++ src/bp-templates/bp-legacy/buddypress/members/single/settings/screen-notifications.php
@@ -0,0 +1,139 @@
+<?php
+/**
+ * BuddyPress - Members Settings Screen Notifications
+ *
+ * @since 2.6.0
+ *
+ * @package BuddyPress
+ * @subpackage bp-legacy
+ */
+
+/** This action is documented in bp-templates/bp-legacy/buddypress/members/single/settings/profile.php */
+do_action( 'bp_before_member_settings_template' ); ?>
+
+<form action="<?php echo bp_displayed_user_domain() . bp_get_settings_slug() . '/screen-notifications'; ?>" method="post" class="standard-form" id="settings-form">
+
+<?php
+	$components = bp_notifications_get_registered_components();
+
+	// Fudge xprofile component.
+	$profile = array_search( 'xprofile', $components );
+	if ( false !== $profile ) {
+		$components[] = 'profile';
+		unset( $components[ $profile ] );
+	}
+
+	sort( $components, SORT_STRING );
+
+	// Initialize registered notification actions.
+	bp_notifications_init_registered_actions();
+
+	foreach ( $components as $component ) :
+		$enabled = bp_get_user_meta( bp_loggedin_user_id(), "notifications_{$component}_enabled", true );
+		if ( '' === $enabled ) {
+			$enabled = 1;
+		}
+
+		$action_count = ! empty( buddypress()->notifications->actions[$component] ) ? count( buddypress()->notifications->actions[$component] ) : 0;
+?>
+	<?php bp_notifications_component_settings_title( $component, 'h2' ); ?>	
+
+	<label for="<?php esc_attr_e( "{$component}-notification-enable" ); ?>">
+		<input type="checkbox" name="<?php esc_attr_e( "{$component}[enabled]" ); ?>" data-component="<?php esc_attr_e( $component ); ?>" id="<?php esc_attr_e( "{$component}-notification-enable" ); ?>" value="1" <?php checked( $enabled, 1, true ) ?>/>
+
+		<?php esc_html_e( 'Enable screen notifications for this component', 'buddypress' ); ?>
+	</label>
+
+	<?php if ( ! empty( buddypress()->notifications->actions[$component] ) ) : ?>
+
+		<table class="notification-settings" id="<?php esc_attr_e( "{$component}-screen-notification-settings" ); ?>">
+			<thead>
+				<tr>
+					<th class="icon">&nbsp;</th>
+					<th>&nbsp;</th>
+					<th class="yes"><?php _e( 'Yes', 'buddypress' ) ?></th>
+					<th class="no"><?php _e( 'No', 'buddypress' )?></th>
+				</tr>
+			</thead>
+	
+			<tbody>
+				<?php
+					foreach ( buddypress()->notifications->actions[$component] as $action => $val ) :
+						$action = sanitize_key( $action );
+	
+						$enabled = bp_get_user_meta( bp_loggedin_user_id(), "notifications_{$component}_{$action}_enabled", true );
+						if ( '' === $enabled ) {
+							$enabled = 1;
+						}
+				?>
+	
+					<tr id="<?php esc_html_e( "{$component}-{$action}" ); ?>" class="<?php esc_attr_e( "{$component}-screen-notification-singular" ); ?>">
+						<td>&nbsp;</td>
+						<td><?php esc_html_e( $val['settings_label' ] ); ?></td>
+						<td class="yes"><input type="radio" name="<?php esc_attr_e( "{$component}[{$action}]" ); ?>" id="<?php esc_attr_e( "{$component}-notification-{$action}-yes" ); ?>" value="1" <?php checked( $enabled, 1, true ) ?>/><label for="<?php esc_attr_e( "{$component}-notification-{$action}-yes" ); ?>" class="bp-screen-reader-text"><?php _e( 'Yes', 'buddypress' ); ?></label></td>
+						<td class="no"><input type="radio" name="<?php esc_attr_e( "{$component}[{$action}]" ); ?>" id="<?php esc_attr_e( "{$component}-notification-{$action}-no" ); ?>" value="0" <?php checked( $enabled, 0, true ) ?>/><label for="<?php esc_attr_e( "{$component}-notification-{$action}-no" ); ?>" class="bp-screen-reader-text"><?php _e( 'No', 'buddypress' ); ?></label></td>
+					</tr>
+	
+				<?php
+					endforeach;
+				?>
+			</tbody>
+		</table>
+
+	<?php endif; ?>
+
+<?php endforeach; ?>
+
+	<script type="text/javascript">
+	// This will be moved to bp-legacy's buddypress.js file.  Or maybe not?
+	jQuery(function($){
+		$('#settings-form input[type=checkbox]').each(function( index, elem ) {
+			toggleSettingsComponentFields( $(this) );
+		});
+
+		$('#settings-form').on('click', 'input[type=checkbox]', function(e) {
+			toggleSettingsComponentFields( $(this) );
+		});
+
+		function toggleSettingsComponentFields( elem ) {
+			var component = $( elem ).data( 'component' );
+
+			if ( elem.is(':checked') ) {
+				$('#' + component + '-screen-notification-settings').fadeIn('fast');
+			} else {
+				$('#' + component + '-screen-notification-settings').fadeOut('fast');
+			}
+		}
+	});
+	</script>
+
+	<?php
+
+	/**
+	 * Fires before the display of the submit button for user notification saving.
+	 *
+	 * @since 2.6.0
+	 */
+	do_action( 'bp_members_screen_notification_settings_before_submit' ); ?>
+
+	<div class="submit">
+		<input type="submit" name="screen-notifications-submit" value="<?php esc_attr_e( 'Save Changes', 'buddypress' ); ?>" id="submit" class="auto" />
+	</div>
+
+	<?php
+
+	/**
+	 * Fires after the display of the submit button for user notification saving.
+	 *
+	 * @since 2.6.0
+	 */
+	do_action( 'bp_members_screen_notification_settings_after_submit' ); ?>
+
+	<?php wp_nonce_field( 'bp_settings_screen_notifications' ); ?>
+
+</form>
+
+<?php
+
+/** This action is documented in bp-templates/bp-legacy/buddypress/members/single/settings/profile.php */
+do_action( 'bp_after_member_settings_template' );
\ No newline at end of file
Index: src/bp-xprofile/bp-xprofile-notifications.php
===================================================================
--- src/bp-xprofile/bp-xprofile-notifications.php
+++ src/bp-xprofile/bp-xprofile-notifications.php
@@ -10,6 +10,28 @@
 /** Notifications *************************************************************/
 
 /**
+ * Register screen notification actions with the Notifications component.
+ *
+ * @since 2.6.0
+ */
+function bp_xprofile_register_notification_actions() {
+	// Set labels
+	bp_notifications_set_prop(
+		'settings_component_label',
+		_x( 'Profile', 'Settings > Notifications component label', 'buddypress' ),
+		'labels',
+		'xprofile'
+	);
+
+	/**
+	 * Fires after default extended profile notification actions are registered.
+	 *
+	 * @since 2.6.0
+	 */
+	do_action( 'bp_xprofile_register_notification_actions' );
+}
+
+/**
  * Format notifications for the extended profile (Xprofile) component.
  *
  * @since 2.4.0
Index: tests/phpunit/testcases/notifications/functions.php
===================================================================
--- tests/phpunit/testcases/notifications/functions.php
+++ tests/phpunit/testcases/notifications/functions.php
@@ -294,4 +294,68 @@
 		$found2 = $wpdb->get_col( $query );
 		$this->assertEmpty( $found2 );
 	}
+
+	/**
+	 * @group notification_settings
+	 */
+	public function test_notifications_disabled_by_component_action_by_user() {
+		$u = $this->factory->user->create();
+
+		// Disable notifications for the 'new_at_mention' action.
+		bp_update_user_meta( $u, 'notifications_activity_new_at_mention_enabled', 0 );
+
+		$n1 = $this->factory->notification->create( array(
+			'component_name'    => 'activity',
+			'component_action'  => 'new_at_mention',
+			'item_id'           => 99,
+			'user_id'           => $u,
+		) );
+
+		// This should pass through.
+		$n2 = $this->factory->notification->create( array(
+			'component_name'    => 'activity',
+			'component_action'  => 'kwyjibo',
+			'item_id'           => 99,
+			'user_id'           => $u,
+		) );
+
+		$this->assertFalse( $n1 );
+		$this->assertNotFalse( $n2 );
+	}
+
+	/**
+	 * @group notification_settings
+	 */
+	public function test_notifications_disabled_by_component_name_by_user() {
+		$u = $this->factory->user->create();
+
+		// Disable notifications for the 'activity' component.
+		bp_update_user_meta( $u, 'notifications_activity_enabled', 0 );
+
+		$n1 = $this->factory->notification->create( array(
+			'component_name'    => 'activity',
+			'component_action'  => 'kwyjibo',
+			'item_id'           => 99,
+			'user_id'           => $u,
+		) );
+
+		$n2 = $this->factory->notification->create( array(
+			'component_name'    => 'activity',
+			'component_action'  => 'new_at_mention',
+			'item_id'           => 99,
+			'user_id'           => $u,
+		) );
+
+		// This should pass through.
+		$n3 = $this->factory->notification->create( array(
+			'component_name'    => 'messages',
+			'component_action'  => 'new_message',
+			'item_id'           => 99,
+			'user_id'           => $u,
+		) );
+
+		$this->assertFalse( $n1 );
+		$this->assertFalse( $n2 );
+		$this->assertNotFalse( $n3 );
+	}
 }
