Index: src/bp-activity/bp-activity-notifications.php
===================================================================
--- src/bp-activity/bp-activity-notifications.php
+++ src/bp-activity/bp-activity-notifications.php
@@ -11,6 +11,34 @@
 defined( 'ABSPATH' ) || exit;
 
 /**
+ * Register screen notification actions with the Notifications component.
+ *
+ * @since 2.6.0
+ */
+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 default activity notification actions are registered.
+	 *
+	 * @since 2.6.0
+	 */
+	do_action( 'bp_activity_register_notification_actions' );
+}
+
+/**
  * Format notifications related to activity.
  *
  * @since 1.5.0
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
@@ -121,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-notifications.php
===================================================================
--- src/bp-friends/bp-friends-notifications.php
+++ src/bp-friends/bp-friends-notifications.php
@@ -14,6 +14,39 @@
 defined( 'ABSPATH' ) || exit;
 
 /**
+ * Register screen notification actions with the Notifications component.
+ *
+ * @since 2.6.0
+ */
+function bp_friends_register_notification_actions() {
+	// Set labels
+	bp_notifications_set_prop(
+		'settings_component_label',
+		_x( 'Friends', 'Settings > Notifications component label', 'buddypress' ),
+		'labels',
+		'friends'
+	);
+
+	// Register actions.
+	bp_notifications_set_action( 'friends', array(
+		'action' => 'friendship_requested',
+		'settings_label' => __( 'A member sends you a friendship request', 'buddypress' )
+	) );
+
+	bp_notifications_set_action( 'friends', array(
+		'action' => 'friendship_accepted',
+		'settings_label' => __( 'A member accepts your friendship request', 'buddypress' )
+	) );
+
+	/**
+	 * 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.
  *
  * @since 1.0.0
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
@@ -107,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-notifications.php
===================================================================
--- src/bp-messages/bp-messages-notifications.php
+++ src/bp-messages/bp-messages-notifications.php
@@ -11,6 +11,34 @@
 defined( 'ABSPATH' ) || exit;
 
 /**
+ * Register screen notification actions with the Notifications component.
+ *
+ * @since 2.6.0
+ */
+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 default message notification actions are registered.
+	 *
+	 * @since 2.6.0
+	 */
+	do_action( 'bp_messages_register_notification_actions' );
+}
+
+/**
  * Format notifications for the Messages component.
  *
  * @since 1.0.0
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
@@ -120,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'];
@@ -643,6 +662,132 @@
 	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' );
 }
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
@@ -171,10 +207,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
@@ -242,6 +320,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
@@ -7,7 +7,27 @@
  * @since 1.0.0
  */
 
-/** 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.
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 );
+	}
 }
