diff --git src/bp-core/bp-core-filters.php src/bp-core/bp-core-filters.php
index 85a8978d2..b41c54410 100644
--- src/bp-core/bp-core-filters.php
+++ src/bp-core/bp-core-filters.php
@@ -473,21 +473,31 @@ function bp_core_activation_signup_blog_notification( $domain, $path, $title, $u
 		),
 	);
 
-	$signups = BP_Signup::get(
-		array(
-			'user_login' => $user,
-		)
-	);
-
+	$signup     = bp_members_get_signup_by( 'activation_key', $key );
 	$salutation = $user;
-	if ( $signups && bp_is_active( 'xprofile' ) ) {
-		$signup = $signups['signups'][0];
+	if ( $signup && bp_is_active( 'xprofile' ) ) {
 		if ( isset( $signup->meta[ 'field_' . bp_xprofile_fullname_field_id() ] ) ) {
 			$salutation = $signup->meta[ 'field_' . bp_xprofile_fullname_field_id() ];
 		}
 	}
 
-	bp_send_email( 'core-user-registration-with-blog', array( array( $user_email => $salutation ) ), $args );
+	/**
+	 * Filters if BuddyPress should send an activation key for a new multisite signup.
+	 *
+	 * @since 10.0.0
+	 *
+	 * @param string $user       The user's login name.
+	 * @param string $user_email The user's email address.
+	 * @param string $key        The activation key created in wpmu_signup_blog().
+	 * @param string $domain     The new blog domain.
+	 * @param string $path       The new blog path.
+	 * @param string $title      The site title.
+	 */
+	if ( apply_filters( 'bp_core_signup_send_activation_key_multisite_blog', true, $user, $user_email, $key, $domain, $path, $title ) ) {
+
+		bp_send_email( 'core-user-registration-with-blog', array( array( $user_email => $salutation ) ), $args );
+
+	}
 
 	// Return false to stop the original WPMU function from continuing.
 	return false;
@@ -556,13 +566,52 @@ function bp_core_activation_signup_user_notification( $user, $user_email, $key,
 			'user.id'      => $user_id,
 		),
 	);
-	bp_send_email( 'core-user-registration', array( array( $user_email => $salutation ) ), $args );
+
+	/**
+	 * Filters if BuddyPress should send an activation key for a new multisite signup.
+	 *
+	 * @since 10.0.0
+	 *
+	 * @param string $user       The user's login name.
+	 * @param string $user_email The user's email address.
+	 * @param string $key        The activation key created in wpmu_signup_blog().
+	 */
+	if ( apply_filters( 'bp_core_signup_send_activation_key_multisite', true, $user, $user_email, $key ) ) {
+
+		bp_send_email( 'core-user-registration', array( array( $user_email => $salutation ) ), $args );
+
+	}
+
 
 	// Return false to stop the original WPMU function from continuing.
 	return false;
 }
 add_filter( 'wpmu_signup_user_notification', 'bp_core_activation_signup_user_notification', 1, 4 );
 
+/**
+ * Ensure that some meta values are set for new multisite signups.
+ *
+ * @since 10.0.0
+ *
+ * @see wpmu_signup_user() for a full description of params.
+ *
+ * @param array $meta Signup meta data. Default empty array.
+ * @return array Signup meta data.
+ */
+function bp_core_add_meta_to_multisite_signups( $meta ) {
+
+	// Ensure that sent_date and count_sent are set in meta.
+	if ( ! isset( $meta['sent_date'] ) ) {
+		$meta['sent_date'] = '0000-00-00 00:00:00';
+	}
+	if ( ! isset( $meta['count_sent'] ) ) {
+		$meta['count_sent'] = 0;
+	}
+
+	return $meta;
+}
+add_filter( 'signup_user_meta', 'bp_core_add_meta_to_multisite_signups' );
+
 /**
  * Filter the page title for BuddyPress pages.
  *
diff --git src/bp-members/bp-members-functions.php src/bp-members/bp-members-functions.php
index 9a389cdda..e61bdf632 100644
--- src/bp-members/bp-members-functions.php
+++ src/bp-members/bp-members-functions.php
@@ -2451,8 +2451,8 @@ function bp_core_signup_disable_inactive( $user = null, $username = '', $passwor
 	if ( bp_get_membership_requests_required() ) {
 		$error_message = sprintf(
 			'<strong>%1$s</strong> %2$s',
-			esc_html_x( 'Error:', 'Warning used into the WP Login screen', 'buddypress' ),
-			esc_html_x( 'Your membership request has not yet been approved.', 'Error message used into the WP Login screen', 'buddypress' )
+			esc_html_x( 'Error:', 'Warning displayed on the WP Login screen', 'buddypress' ),
+			esc_html_x( 'Your membership request has not yet been approved.', 'Error message displayed on the WP Login screen', 'buddypress' )
 		);
 	} else {
 		// Set up the feedback message.
@@ -2470,8 +2470,8 @@ function bp_core_signup_disable_inactive( $user = null, $username = '', $passwor
 
 		$error_message = sprintf(
 			'<strong>%1$s</strong> %2$s<br /><br />%3$s',
-			esc_html_x( 'Error:', 'Warning used into the WP Login screen', 'buddypress' ),
-			esc_html_x( 'Your account has not been activated. Check your email for the activation link.', 'Error message used into the WP Login screen', 'buddypress' ),
+			esc_html_x( 'Error:', 'Warning displayed on the WP Login screen', 'buddypress' ),
+			esc_html_x( 'Your account has not been activated. Check your email for the activation link.', 'Error message displayed on the WP Login screen', 'buddypress' ),
 			sprintf(
 				/* translators: %s: the link to resend the activation email. */
 				esc_html_x( 'If you have not received an email yet, %s.', 'WP Login screen message', 'buddypress' ),
diff --git src/bp-members/bp-members-invitations.php src/bp-members/bp-members-invitations.php
index 1924710cc..2fadc0e94 100644
--- src/bp-members/bp-members-invitations.php
+++ src/bp-members/bp-members-invitations.php
@@ -221,3 +221,4 @@ function bp_members_invitations_maybe_bypass_request_approval( $send, $details )
 	return $send;
 }
 add_filter( 'bp_members_membership_requests_bypass_manual_approval', 'bp_members_invitations_maybe_bypass_request_approval', 10, 2 );
+add_filter( 'bp_members_membership_requests_bypass_manual_approval_multisite', 'bp_members_invitations_maybe_bypass_request_approval', 10, 2 );
diff --git src/bp-members/bp-members-membership-requests.php src/bp-members/bp-members-membership-requests.php
index e1ab537ad..a55f71726 100644
--- src/bp-members/bp-members-membership-requests.php
+++ src/bp-members/bp-members-membership-requests.php
@@ -11,7 +11,7 @@
 defined( 'ABSPATH' ) || exit;
 
 /**
- * When a user creates a membership request,
+ * Single site: When a user creates a membership request,
  * prevent the sending of the activation email so that
  * the site admins can send it manually.
  *
@@ -69,6 +69,62 @@ function bp_members_membership_requests_cancel_activation_email( $send, $user_id
 }
 add_filter( 'bp_core_signup_send_activation_key', 'bp_members_membership_requests_cancel_activation_email', 10, 5 );
 
+/**
+ * WP Multisite: When a user creates a membership request,
+ * prevent the sending of the activation email so that
+ * the site admins can send it manually.
+ *
+ * @since 10.0.0
+ *
+ * @param bool   $send           Whether or not to send the activation key.
+ * @param string $user_login     User login name.
+ * @param string $user_email     User email address.
+ * @param string $activation_key Activation key created in wpmu_signup_user().
+ * @return bool Whether or not to send the activation key.
+ */
+function bp_members_membership_requests_cancel_activation_email_multisite( $send = true, $user_login = '', $user_email = '', $activation_key = '' ) {
+
+	$details = array(
+		'user_login'     => $user_login,
+		'user_email'     => $user_email,
+		'activation_key' => $activation_key,
+	);
+
+	/**
+	 * Allow some membership requests to be approved immediately.
+	 * For example, you might want to approve all requests
+	 * coming from users with certain email address domains.
+	 * If `true` is returned the activation email will be sent to the user.
+	 *
+	 * @since 10.0.0
+	 *
+	 * @param bool  $send    Whether or not this membership request should be approved
+	 *                       immediately and the activation email sent.
+	 *                       Default is `false` meaning that the request should be
+	 *                       manually approved by a site admin.
+	 * @param array $details The details of the request.
+	 */
+	$send = apply_filters( 'bp_members_membership_requests_bypass_manual_approval_multisite', false, $details );
+
+	// If the registration process has been interrupted, this is a new membership request.
+	if ( ! $send ) {
+		$signup = bp_members_get_signup_by( 'activation_key', $activation_key );
+
+		/**
+		 * Fires when a site membership request has been created and is pending.
+		 *
+		 * @since 10.0.0
+		 *
+		 * @param BP_Signup $signup  The signup object that has been created.
+		 * @param array     $details The details of the request.
+		 */
+		do_action( 'bp_members_membership_request_submitted', $signup, $details );
+	}
+
+	return $send;
+}
+add_filter( 'bp_core_signup_send_activation_key_multisite', 'bp_members_membership_requests_cancel_activation_email_multisite', 10, 4 );
+add_filter( 'bp_core_signup_send_activation_key_multisite_blog', 'bp_members_membership_requests_cancel_activation_email_multisite', 10, 4 );
 
 /**
  * Notifications
@@ -83,6 +139,10 @@ add_filter( 'bp_core_signup_send_activation_key', 'bp_members_membership_request
  */
 function bp_members_membership_requests_notify_site_admins( $signup ) {
 
+	if ( ! isset( $signup->signup_id ) ) {
+		return;
+	}
+
 	// Notify all site admins so the request can be handled.
 	$admin_ids = get_users(
 		array(
diff --git src/bp-members/bp-members-notifications.php src/bp-members/bp-members-notifications.php
index b84a0938a..08285bcb6 100644
--- src/bp-members/bp-members-notifications.php
+++ src/bp-members/bp-members-notifications.php
@@ -205,7 +205,9 @@ add_action( 'bp_screens', 'bp_members_mark_read_accepted_invitation_notification
  * @since 10.0.0
  */
 function bp_members_mark_read_submitted_membership_request_notification() {
-	if ( ! wp_doing_ajax() && 'users_page_bp-signups' === get_current_screen()->base && ! empty( $_GET['mod_req'] ) && ! empty( $_GET['signup_id'] ) ) {
+
+	$signup_screens = array( 'users_page_bp-signups', 'users_page_bp-signups-network' );
+	if ( ! wp_doing_ajax() && in_array( get_current_screen()->base, $signup_screens, true ) && ! empty( $_GET['mod_req'] ) && ! empty( $_GET['signup_id'] ) ) {
 		// Mark all notifications about this request as read.
 		BP_Notifications_Notification::update(
 			array(
diff --git src/bp-members/classes/class-bp-members-component.php src/bp-members/classes/class-bp-members-component.php
index dca58193e..17c82b95f 100644
--- src/bp-members/classes/class-bp-members-component.php
+++ src/bp-members/classes/class-bp-members-component.php
@@ -74,7 +74,16 @@ class BP_Members_Component extends BP_Component {
 			$includes[] = 'activity';
 		}
 
-		if ( bp_is_active( 'members', 'membership_requests' ) && (bool) bp_get_option( 'bp-enable-membership-requests' ) ) {
+		/**
+		 * Duplicate bp_get_membership_requests_required() and
+		 * bp_get_signup_allowed() logic here,
+		 * because those functions are not available yet.
+		 * The `bp_get_signup_allowed` filter is documented in
+		 * bp-members/bp-members-template.php.
+		 */
+		$signup_allowed = apply_filters( 'bp_get_signup_allowed', (bool) bp_get_option( 'users_can_register' ) );
+		$membership_requests_enabled = (bool) bp_get_option( 'bp-enable-membership-requests' );
+		if ( bp_is_active( 'members', 'membership_requests' ) && ! $signup_allowed && $membership_requests_enabled ) {
 			$includes[] = 'membership-requests';
 		}
 
diff --git src/bp-members/screens/register.php src/bp-members/screens/register.php
index 40dd280dc..2f3f1da1b 100644
--- src/bp-members/screens/register.php
+++ src/bp-members/screens/register.php
@@ -199,7 +199,7 @@ function bp_core_screen_signup() {
 			// No errors! Let's register those deets.
 			$active_signup = bp_core_get_root_option( 'registration' );
 
-			if ( 'none' != $active_signup ) {
+			if ( 'none' != $active_signup || $requests_enabled ) {
 
 				// Make sure the extended profiles module is enabled.
 				if ( bp_is_active( 'xprofile' ) ) {
