diff --git src/bp-core/admin/bp-core-admin-settings.php src/bp-core/admin/bp-core-admin-settings.php
index b37b914ff..29d7ce4f5 100644
--- src/bp-core/admin/bp-core-admin-settings.php
+++ src/bp-core/admin/bp-core-admin-settings.php
@@ -203,6 +203,27 @@ function bp_admin_setting_callback_members_invitations() {
 	do_action( 'bp_admin_settings_after_members_invitations' );
 }
 
+/**
+ * Allow new users to request membership to the network.
+ *
+ * @since 10.0.0
+ */
+function bp_admin_setting_callback_membership_requests() {
+?>
+	<input id="bp-enable-membership-requests" name="bp-enable-membership-requests" type="checkbox" value="1" <?php checked( bp_get_membership_requests_required( 'raw' ) ); ?> />
+	<label for="bp-enable-membership-requests"><?php _e( 'Enable network membership requests. If enabled, an administrator must approve each new network membership.', 'buddypress' ); ?></label>
+	<?php if ( bp_get_signup_allowed() ) : ?>
+		<p class="description"><?php _e( 'Public registration is currently enabled. If you wish to require approval for new memberships, disable public registration and enable the membership requests feature.', 'buddypress' ); ?></p>
+	<?php endif; ?>
+	<?php
+	/**
+	 * Fires after the output of the membership requests settings section.
+	 *
+	 * @since 10.0.0
+	 */
+	do_action( 'bp_admin_settings_after_membership_requests' );
+}
+
 /** XProfile ******************************************************************/
 
 /**
diff --git src/bp-core/bp-core-functions.php src/bp-core/bp-core-functions.php
index 3dbc32f11..ba99e6e57 100644
--- src/bp-core/bp-core-functions.php
+++ src/bp-core/bp-core-functions.php
@@ -3800,6 +3800,7 @@ function bp_core_replace_tokens_in_text( $text, $tokens ) {
  * Get a list of emails for populating the email post type.
  *
  * @since 2.5.1
+ * @since 10.0.0 Added members-membership-request email type.
  *
  * @return array
  */
@@ -3960,6 +3961,14 @@ function bp_email_get_schema() {
 			/* translators: do not remove {} brackets or translate its contents. */
 			'post_excerpt' => __( "{{inviter.name}} has invited you to join the site \"{{site.name}}\".\n\n{{usermessage}}\n\nTo accept your invitation, visit: {{{invite.accept_url}}}\n\nTo learn more about the site, visit: {{{site.url}}}.\nTo view {{inviter.name}}'s profile, visit: {{{inviter.url}}}", 'buddypress' ),
 		),
+		'members-membership-request' => array(
+			/* translators: do not remove {} brackets or translate its contents. */
+			'post_title'   => __( '{{requesting-user.name}} would like to join {{site.name}}', 'buddypress' ),
+			/* translators: do not remove {} brackets or translate its contents. */
+			'post_content' => __( "<a href=\"{{{profile.url}}}\">{{requesting-user.name}}</a> would like to join the site: &quot;{{site.name}}&quot;.\n\n<a href=\"{{{manage.url}}}\">Manage the request</a> or <a href=\"{{{site.url}}}\">visit the site</a> to learn more.", 'buddypress' ),
+			/* translators: do not remove {} brackets or translate its contents. */
+			'post_excerpt' => __( "{{requesting-user.name}} would like to join the site \"{{site.name}}\".\n\nTo manage the request, visit: {{{manage.url}}}\n\nTo learn more about the site, visit: {{{site.url}}}.\nTo view {{requesting-user.name}}'s profile, visit: {{{profile.url}}}", 'buddypress' ),
+		),
 	) );
 }
 
@@ -4132,6 +4141,15 @@ function bp_email_get_type_schema( $field = 'description' ) {
 		),
 	);
 
+	$members_membership_request= array(
+		'description'	   => __( 'Someone has requested membership on this site.', 'buddypress' ),
+		'named_salutation' => true,
+		'unsubscribe'	   => array(
+			'meta_key' => 'notification_members_membership_request',
+			'message'  => __( 'You will no longer receive emails when people submit requests to join this site.', 'buddypress' ),
+		),
+	);
+
 	$types = array(
 		'activity-comment'                   => $activity_comment,
 		'activity-comment-author'            => $activity_comment_author,
@@ -4151,6 +4169,8 @@ function bp_email_get_type_schema( $field = 'description' ) {
 		'groups-membership-request-rejected' => $groups_membership_request_rejected,
 		'core-user-activation'               => $core_user_activation,
 		'bp-members-invitation'              => $members_invitation,
+		'members-membership-request'         => $members_membership_request,
+
 	);
 
 	if ( $field !== 'all' ) {
diff --git src/bp-core/bp-core-template.php src/bp-core/bp-core-template.php
index efb251957..87a16b7a6 100644
--- src/bp-core/bp-core-template.php
+++ src/bp-core/bp-core-template.php
@@ -3192,7 +3192,11 @@ function bp_get_title_parts( $seplocation = 'right' ) {
 
 	// Sign up page.
 	} elseif ( bp_is_register_page() ) {
-		$bp_title_parts = array( __( 'Create an Account', 'buddypress' ) );
+		if ( bp_get_membership_requests_required() ) {
+			$bp_title_parts = array( __( 'Request Membership', 'buddypress' ) );
+		} else {
+			$bp_title_parts = array( __( 'Create an Account', 'buddypress' ) );
+		}
 
 	// Activation page.
 	} elseif ( bp_is_activation_page() ) {
diff --git src/bp-core/bp-core-update.php src/bp-core/bp-core-update.php
index 03710213c..533efdb86 100644
--- src/bp-core/bp-core-update.php
+++ src/bp-core/bp-core-update.php
@@ -704,6 +704,20 @@ function bp_core_get_8_0_upgrade_email_schema( $emails ) {
 	return $new_emails;
 }
 
+/**
+ * 10.0.0 update routine.
+ *
+ * - Explicitly set all signups to count_sent = 1 & sent_date to registered_date
+ *
+ * @since 10.0.0
+ */
+function bp_update_to_10_0() {
+
+	// @TODO: Explicitly set all signups to count_sent = 1 & sent_date to registered_date
+	// Is there any way to update that meta in bulk? I think it will have to be one at a time.
+
+}
+
 /**
  * Updates the component field for new_members type.
  *
diff --git src/bp-core/classes/class-bp-admin.php src/bp-core/classes/class-bp-admin.php
index ee80328cc..191a8dfb8 100644
--- src/bp-core/classes/class-bp-admin.php
+++ src/bp-core/classes/class-bp-admin.php
@@ -415,6 +415,9 @@ class BP_Admin {
 		if ( bp_is_active( 'members', 'invitations' ) ) {
 			add_settings_field( 'bp-enable-members-invitations', __( 'Invitations', 'buddypress' ), 'bp_admin_setting_callback_members_invitations', 'buddypress', 'bp_members' );
 			register_setting( 'buddypress', 'bp-enable-members-invitations', 'intval' );
+
+			add_settings_field( 'bp-enable-membership-requests', __( 'Membership Requests', 'buddypress' ), 'bp_admin_setting_callback_membership_requests', 'buddypress', 'bp_members' );
+			register_setting( 'buddypress', 'bp-enable-membership-requests', 'intval' );
 		}
 
 		/* XProfile Section **************************************************/
diff --git src/bp-members/bp-members-filters.php src/bp-members/bp-members-filters.php
index e1a0c69fd..c536e639d 100644
--- src/bp-members/bp-members-filters.php
+++ src/bp-members/bp-members-filters.php
@@ -366,3 +366,111 @@ function bp_members_sanitize_invitation_property( $value = '', $property = '', $
 	return $value;
 }
 add_filter( 'bp_the_members_invitation_property', 'bp_members_sanitize_invitation_property', 10, 3 );
+
+/**
+ * Filter the actions available on the signups list table.
+ *
+ * @since 10.0.0
+ *
+ * @param array  $actions       Array of actions and corresponding links.
+ * @param object $signup_object The signup data object.
+ */
+function bp_members_membership_requests_filter_signup_row_actions( $actions, $signup_object ) {
+	if ( bp_get_membership_requests_required() ) {
+		// Rename the "email" resend option when membership requests are active.
+		$email_link = add_query_arg(
+			array(
+				'page'	    => 'bp-signups',
+				'signup_id' => $signup_object->id,
+				'action'    => 'resend',
+			),
+			bp_get_admin_url( 'users.php' )
+		);
+
+		$resend_label = ( 0 === $signup_object->count_sent ) ? __( 'Approve Request', 'buddypress' ) : __( 'Resend Approval', 'buddypress' );
+
+		$actions['resend']   = sprintf( '<a href="%1$s">%2$s</a>', esc_url( $email_link ), $resend_label );
+
+		/*
+		 * Add an "extended" link to the row action on the pending users table
+		 * so admins can see what registration info the user supplied on the
+		 * request membership form.
+		 * http://bpdev.local/wp-admin/users.php?page=bp-profile-edit&user_id=40
+		 http://bpdev.local/wp-admin/users.php?page=bp-signups&=http://bpdev.local/wp-admin/users.php?page=bp-profile-edit&user_id=38
+		 *
+		 */
+		$user = get_user_by( 'email', $signup_object->user_email );
+		if ( $user ) {
+			$edit_profile_args = array(
+				'page'    => 'bp-profile-edit',
+				'user_id' => $user->ID,
+			);
+			if ( is_network_admin() ) {
+				$base_edit_url = network_admin_url( 'users.php' );
+			} else {
+				$base_edit_url = admin_url( 'users.php' );
+			}
+			$edit_profile      = add_query_arg( $edit_profile_args, $base_edit_url );
+			$edit_profile_link = sprintf( '<a href="%1$s">%2$s</a>',  esc_url( $edit_profile ), esc_html__( 'Extended', 'buddypress' ) );
+
+			$new_edit_actions = array( 'edit-profile' => $edit_profile_link );
+
+			$actions = array_merge( $new_edit_actions, $actions );
+		}
+	}
+	return $actions;
+	//@TODO add help to manage signups screen:
+	// Activate will activate the user immediately without requiring that they validate their email.
+	// Approve Request will send the user an activation email, so they will still need to take action. This also will check that the user's email address is valid.
+}
+add_filter( 'bp_members_ms_signup_row_actions', 'bp_members_membership_requests_filter_signup_row_actions', 10, 2 );
+
+/**
+ * Filter the bulk actions available on the signups list table.
+ *
+ * @since 10.0.0
+ *
+ * @param array  $actions       Array of actions and corresponding links.
+ */
+function bp_members_membership_requests_filter_signup_bulk_actions( $actions ) {
+	if ( bp_get_membership_requests_required() ) {
+		// Rename the "email" resend option when membership requests are active.
+		$actions['resend'] = _x( 'Approve', 'Pending signup action', 'buddypress' );
+	}
+	return $actions;
+}
+add_filter( 'bp_members_ms_signup_bulk_actions', 'bp_members_membership_requests_filter_signup_bulk_actions' );
+
+/**
+ * Filter the "Last Sent" column header on the pending users table.
+ *
+ * @since 10.0.0
+ *
+* @param array $value Array of columns to display.
+ */
+function bp_members_membership_requests_filter_signup_table_date_sent_header( $columns ) {
+	if ( bp_get_membership_requests_required() ) {
+		$columns['date_sent'] = __( 'Approved', 'buddypress' );
+	}
+	return $columns;
+}
+add_filter( 'bp_members_signup_columns', 'bp_members_membership_requests_filter_signup_table_date_sent_header' );
+add_filter( 'bp_members_ms_signup_columns', 'bp_members_membership_requests_filter_signup_table_date_sent_header' );
+
+/**
+ * Filter the "Last Sent" column message on the pending users table.
+ *
+ * @since 10.0.0
+ *
+ * @param string      $message "Not yet sent" message.
+ * @param object|null $signup  Signup object instance.
+ */
+function bp_members_membership_requests_filter_signup_table_unsent_message( $message, $signup ) {
+	if ( bp_get_membership_requests_required() && 0 === $signup->count_sent ) {
+		$message = __( 'Not yet approved', 'buddypress' );
+	}
+	return $message;
+}
+add_filter( 'bp_members_signup_date_sent_unsent_message', 'bp_members_membership_requests_filter_signup_table_unsent_message', 10, 2 );
+add_filter( 'bp_members_ms_signup_date_sent_unsent_message', 'bp_members_membership_requests_filter_signup_table_unsent_message', 10, 2 );
+
diff --git src/bp-members/bp-members-functions.php src/bp-members/bp-members-functions.php
index 93fd7cafd..2099c7d90 100644
--- src/bp-members/bp-members-functions.php
+++ src/bp-members/bp-members-functions.php
@@ -2388,24 +2388,18 @@ function bp_core_signup_send_validation_email( $user_id, $user_email, $key, $sal
 	bp_send_email( 'core-user-registration', $to, $args );
 
 	// Record that the activation email has been sent.
-	$signups = BP_Signup::get(
-		array(
-			'activation_key' => $key,
-		)
-	);
+	$signup = bp_members_get_signup_by( 'activation_key', $key );
 
-	if ( ! empty( $signups['signups'] ) ) {
-		foreach ( $signups['signups'] as $signup ) {
-			$meta = array(
-				'sent_date'  => current_time( 'mysql', true ),
-				'count_sent' => $signup->count_sent + 1
-			);
+	if ( $signup ) {
+		$meta = array(
+			'sent_date'  => current_time( 'mysql', true ),
+			'count_sent' => $signup->count_sent + 1
+		);
 
-			BP_Signup::update( array(
-				'signup_id' => $signup->id,
-				'meta'      => $meta,
-			) );
-		}
+		BP_Signup::update( array(
+			'signup_id' => $signup->id,
+			'meta'      => $meta,
+		) );
 	}
 }
 
@@ -2450,25 +2444,33 @@ function bp_core_signup_disable_inactive( $user = null, $username = '', $passwor
 	}
 
 	// Unactivated user account found!
-	// Set up the feedback message.
-	$signup_id = $signup['signups'][0]->signup_id;
+	/*
+	 * Don't allow users to resend their own activation email
+	 * when membership requests are enabled.
+	 */
+	if ( bp_get_membership_requests_required() ) {
+		return new WP_Error( 'bp_account_not_activated', __( '<strong>Error</strong>: Your membership request has not yet been approved.', 'buddypress' ) );
+	} else {
+		// Set up the feedback message.
+		$signup_id = $signup['signups'][0]->signup_id;
 
-	$resend_url_params = array(
-		'action' => 'bp-resend-activation',
-		'id'     => $signup_id,
-	);
+		$resend_url_params = array(
+			'action' => 'bp-resend-activation',
+			'id'     => $signup_id,
+		);
 
-	$resend_url = wp_nonce_url(
-		add_query_arg( $resend_url_params, wp_login_url() ),
-		'bp-resend-activation'
-	);
+		$resend_url = wp_nonce_url(
+			add_query_arg( $resend_url_params, wp_login_url() ),
+			'bp-resend-activation'
+		);
 
-	$resend_string = '<br /><br />';
+		$resend_string = '<br /><br />';
 
-	/* translators: %s: the activation url */
-	$resend_string .= sprintf( __( 'If you have not received an email yet, <a href="%s">click here to resend it</a>.', 'buddypress' ), esc_url( $resend_url ) );
+		/* translators: %s: the activation url */
+		$resend_string .= sprintf( __( 'If you have not received an email yet, <a href="%s">click here to resend it</a>.', 'buddypress' ), esc_url( $resend_url ) );
 
-	return new WP_Error( 'bp_account_not_activated', __( '<strong>Error</strong>: Your account has not been activated. Check your email for the activation link.', 'buddypress' ) . $resend_string );
+		return new WP_Error( 'bp_account_not_activated', __( '<strong>Error</strong>: Your account has not been activated. Check your email for the activation link.', 'buddypress' ) . $resend_string );
+	}
 }
 add_filter( 'authenticate', 'bp_core_signup_disable_inactive', 30, 3 );
 
@@ -3694,3 +3696,65 @@ function bp_get_members_invitation_from_request() {
 	 */
 	return apply_filters( 'bp_get_members_invitation_from_request', $invite );
 }
+
+/**
+ * Get WP_User object corresponding to a record in the signups table.
+ *
+ * @since 10.0.0
+ *
+ * @param string $field Which fields to search by. Possible values are
+ *                      activation_key, user_email, id.
+ * @param string $value Value to search by.
+ * @return bool|WP_User $user Found user, returns first found
+ *                            if more than one is found.
+ */
+function bp_members_get_user_from_signup_field( $field = 'activation_key', $value ) {
+	$signup = bp_members_get_signup_by( $field, $value );
+
+	if ( $signup ) {
+		$user = get_user_by( 'email', $signup->user_email );
+	} else {
+		$user = false;
+	}
+
+	return $user;
+}
+
+/**
+ * Get WP_User object corresponding to a record in the signups table.
+ *
+ * @since 10.0.0
+ *
+ * @param string $field Which fields to search by. Possible values are
+ *                      activation_key, user_email, id.
+ * @param string $value Value to search by.
+ * @return bool|BP_Signup $signup Found signup, returns first found
+ *                                if more than one is found.
+ */
+function bp_members_get_signup_by( $field = 'activation_key', $value ) {
+	switch ( $field ) {
+		case 'activation_key':
+		case 'user_email':
+			$key = $field;
+			break;
+
+		case 'id':
+		default:
+			$key = 'include';
+			break;
+	}
+
+	$signups = BP_Signup::get(
+		array(
+			$key => $value,
+		)
+	);
+
+	if ( ! empty( $signups['signups'] ) ) {
+		$signup = current( $signups['signups'] );
+	} else {
+		$signup = false;
+	}
+
+	return $signup;
+}
diff --git src/bp-members/bp-members-invitations.php src/bp-members/bp-members-invitations.php
index 94e05e5bf..ebf20a74d 100644
--- src/bp-members/bp-members-invitations.php
+++ src/bp-members/bp-members-invitations.php
@@ -162,3 +162,39 @@ function bp_members_invitations_delete_optedout_invites( $optout ) {
 	);
 }
 add_action( 'bp_optout_after_save', 'bp_members_invitations_delete_optedout_invites' );
+
+/**
+ * If a user submits a site membership request, but there's a
+ * sent invitation to her, bypass the manual approval of the request.
+ *
+ * @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.
+ */
+function bp_members_invitations_maybe_bypass_request_approval( $send, $details ) {
+	if ( ! bp_get_members_invitations_allowed() ) {
+		return $send;
+	}
+
+	// We'll need the prospective user's email address.
+	if ( empty( $details['user_email'] ) ) {
+		return $send;
+	}
+
+	$invites = bp_members_invitations_get_invites(
+		array(
+			'invitee_email' => $details['user_email'],
+			'invite_sent'   => 'sent'
+		)
+	);
+	// If pending invitations exist, send the verification mail.
+	if ( $invites ) {
+		$send = true;
+	}
+	return $send;
+}
+add_filter( 'bp_members_membership_requests_bypass_manual_approval', '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
new file mode 100644
index 000000000..d040b2432
--- /dev/null
+++ src/bp-members/bp-members-membership-requests.php
@@ -0,0 +1,168 @@
+<?php
+/**
+ * BuddyPress Membership Requests
+ *
+ * @package BuddyPress
+ * @subpackage MembersMembershipRequest
+ * @since 10.0.0
+ */
+
+// Exit if accessed directly.
+defined( 'ABSPATH' ) || exit;
+
+
+/**
+ * When a user creates a network membership request,
+ * prevent the sending of the activation email so that
+ * the site admins can send it later.
+ *
+ * @since 10.0.0
+ *
+ * @param bool   $send           Whether or not to send the activation key.
+ * @param int    $user_id        User ID to send activation key to.
+ * @param string $user_email     User email to send activation key to.
+ * @param string $activation_key Activation key to be sent.
+ * @param array  $usermeta       Miscellaneous metadata about the user (blog-specific
+ *                               signup data, xprofile data, etc).
+ * @return bool Whether or not to send the activation key.
+ */
+function bp_members_membership_requests_cancel_activation_email( $send, $user_id = 0, $user_email = '', $activation_key = '', $usermeta = array() ) {
+
+	if ( bp_get_membership_requests_required() ) {
+		$details = array(
+			'user_id'        => $user_id,
+			'user_email'     => $user_email,
+			'activation_key' => $activation_key,
+			'usermeta'       => $usermeta,
+		);
+
+		/**
+		 * 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', 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', 'bp_members_membership_requests_cancel_activation_email', 10, 5 );
+
+
+/**
+ * Notify site admins about a new membership request.
+ *
+ * @since 10.0.0
+ *
+ * @param BP_Signup $signup  The signup object that has been created.
+ */
+function bp_members_membership_requests_notify_site_admins( $signup ) {
+	$requesting_user    = get_user_by( 'email', $signup->user_email );
+	$requesting_user_id = isset( $requesting_user->ID ) ? $requesting_user->ID : 0;
+
+	$admins_query = new WP_User_Query( array(
+		'role'   => 'administrator',
+		'fields' => 'ids'
+	) );
+	$admin_ids   = $admins_query->get_results();
+
+	foreach ( $admin_ids as $admin_id ) {
+		// Trigger a BuddyPress Notification.
+		if ( bp_is_active( 'notifications' ) ) {
+			bp_notifications_add_notification( array(
+				'user_id'           => $admin_id,
+				'item_id'           => $signup->signup_id,
+				'secondary_item_id' => $requesting_user_id,
+				'component_name'    => buddypress()->members->id,
+				'component_action'  => 'membership_request_submitted',
+				'date_notified'     => bp_core_current_time(),
+				'is_new'            => 1,
+			) );
+		}
+
+		// Bail if member opted out of receiving this email.
+		if ( 'no' === bp_get_user_meta( $admin_id, 'notification_members_membership_request', true ) ) {
+			return;
+		}
+
+		$unsubscribe_args = array(
+			'user_id'           => $admin_id,
+			'notification_type' => 'members-membership-request',
+		);
+		$manage_url = add_query_arg( array(
+			'mod_req'   => 1,
+			'page'      => 'bp-signups',
+			'signup_id' => $item_id,
+		), bp_get_admin_url( 'users.php' ) );
+		$args  = array(
+			'tokens' => array(
+				'admin.id'             => $admin_id,
+				'manage.url'           => $manage_url,
+				'profile.url'          => esc_url( bp_core_get_user_domain( $requesting_user_id ) ),
+				'requesting-user.id'   => $requesting_user_id,
+				'requesting-user.name' => bp_core_get_user_displayname( $requesting_user_id ),
+				'unsubscribe'          => esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) ),
+			),
+		);
+		bp_send_email( 'members-membership-request', (int) $admin_id, $args );
+	}
+
+}
+add_action( 'bp_members_membership_request_submitted', 'bp_members_membership_requests_notify_site_admins' );
+
+/**
+ * Add "Request Membership" link to Widget login form.
+ *
+ * @since 10.0.0
+ *
+ * @return string $retval the HTML for the request membership link.
+ */
+function bp_members_membership_requests_add_link_to_widget_login_form() {
+	if ( ! bp_get_membership_requests_required() ) {
+		return;
+	}
+	?>
+	<span class="bp-login-widget-request-membership-link"><a href="<?php echo esc_url( bp_get_signup_page() ); ?>"><?php _e( 'Request Membership', 'buddypress' ); ?></a></span>
+	<?php
+}
+add_action( 'bp_login_widget_form', 'bp_members_membership_requests_add_link_to_widget_login_form' );
+
+/**
+ * In the Nouveau template pack, when membership requests are required,
+ * change registration form submit button label to "Submit Request".
+ *
+ * @since 10.0.0
+ *
+ * @return string $retval the HTML for the request membership link.
+ */
+function bp_members_membership_requests_filter_complete_signup_button( $buttons ) {
+	if ( bp_get_membership_requests_required() ) {
+		$buttons['register']['attributes']['value'] = __( 'Submit Request', 'buddypress' );
+	}
+	return $buttons;
+}
+add_filter( 'bp_nouveau_get_submit_button', 'bp_members_membership_requests_filter_complete_signup_button' );
diff --git src/bp-members/bp-members-notifications.php src/bp-members/bp-members-notifications.php
index 93cee7b89..0c9ff824a 100644
--- src/bp-members/bp-members-notifications.php
+++ src/bp-members/bp-members-notifications.php
@@ -61,6 +61,30 @@ function members_format_notifications( $action, $item_id, $secondary_item_id, $t
 				}
 			}
 			break;
+
+		case 'membership_request_submitted':
+			// $item_id is the id of the signup, not the user ID.
+			$user = bp_members_get_user_from_signup_field( 'id', $item_id );
+
+			// Set up the string and the filter.
+			if ( (int) $total_items > 1 ) {
+				$link   = bp_get_notifications_permalink();
+				$amount = 'multiple';
+
+				$text = sprintf( __( '%d people have requested site membership.', 'buddypress' ), (int) $total_items );
+			} else {
+				$link   = add_query_arg( array(
+					'mod_req'   => 1,
+					'page'      => 'bp-signups',
+					'signup_id' => $item_id,
+
+				), bp_get_admin_url( 'users.php' ) );
+				$amount = 'single';
+
+				/* translators: %s: new user name */
+				$text = sprintf( __( '%s has requested site membership.', 'buddypress' ),  bp_core_get_user_displayname( $user->ID ) );
+			}
+			break;
 	}
 
 	// Return either an HTML link or an array, depending on the requested format.
@@ -167,13 +191,36 @@ function bp_members_mark_read_accepted_invitation_notification() {
 			'is_new' => false,
 		),
 		array(
-			'user_id' => bp_loggedin_user_id(),
-			'item_id' => bp_displayed_user_id(),
+			'user_id'           => bp_loggedin_user_id(),
+			'item_id'           => bp_displayed_user_id(),
+			'component_action'  => 'accepted_invitation',
 		)
 	);
 }
 add_action( 'bp_screens', 'bp_members_mark_read_accepted_invitation_notification' );
 
+/**
+ * Mark new membership request notifications as read when user visits Manage BP Signups screen.
+ *
+ * @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'] ) ) {
+		// Mark notification as read.
+		BP_Notifications_Notification::update(
+			array(
+				'is_new' => false,
+			),
+			array(
+				'user_id'           => bp_loggedin_user_id(),
+				'item_id'           => $_GET['signup_id'],
+				'component_action'  => 'membership_request_submitted',
+			)
+		);
+	}
+}
+add_action( 'admin_footer', 'bp_members_mark_read_submitted_membership_request_notification' );
+
 /**
  * Add Members-related settings to the Settings > Notifications page.
  *
@@ -181,14 +228,10 @@ add_action( 'bp_screens', 'bp_members_mark_read_accepted_invitation_notification
  */
 function members_screen_notification_settings() {
 
-	// Bail early if invitations are not allowed--they are the only members notification so far.
-	if ( ! bp_get_members_invitations_allowed () ) {
+	// Bail early if invitations and requests are not allowed--they are the only members notification so far.
+	if ( ! bp_get_members_invitations_allowed() && ( ! bp_get_membership_requests_required() || ! user_can( bp_displayed_user_id(), 'bp_moderate' ) ) ) {
 		return;
 	}
-
-	if ( ! $allow_acceptance_emails = bp_get_user_meta( bp_displayed_user_id(), 'notification_members_invitation_accepted', true ) ) {
-		$allow_acceptance_emails = 'yes';
-	}
 	?>
 
 	<table class="notification-settings" id="members-notification-settings">
@@ -202,20 +245,47 @@ function members_screen_notification_settings() {
 		</thead>
 
 		<tbody>
-			<tr id="members-notification-settings-invitation_accepted">
-				<td></td>
-				<td><?php _ex( 'Someone accepts your membership invitation', 'Member settings on notification settings page', 'buddypress' ) ?></td>
-				<td class="yes"><input type="radio" name="notifications[notification_members_invitation_accepted]" id="notification-members-invitation-accepted-yes" value="yes" <?php checked( $allow_acceptance_emails, 'yes', true ) ?>/><label for="notification-members-invitation-accepted-yes" class="bp-screen-reader-text"><?php
-					/* translators: accessibility text */
-					_e( 'Yes, send email', 'buddypress' );
-				?></label></td>
-				<td class="no"><input type="radio" name="notifications[notification_members_invitation_accepted]" id="notification-members-invitation-accepted-no" value="no" <?php checked( $allow_acceptance_emails, 'no', true ) ?>/><label for="notification-members-invitation-accepted-no" class="bp-screen-reader-text"><?php
-					/* translators: accessibility text */
-					_e( 'No, do not send email', 'buddypress' );
-				?></label></td>
-			</tr>
 
 			<?php
+			if ( bp_get_members_invitations_allowed() ) :
+				if ( ! $allow_acceptance_emails = bp_get_user_meta( bp_displayed_user_id(), 'notification_members_invitation_accepted', true ) ) {
+					$allow_acceptance_emails = 'yes';
+				}
+				?>
+				<tr id="members-notification-settings-invitation_accepted">
+					<td></td>
+					<td><?php _ex( 'Someone accepts your membership invitation', 'Member settings on notification settings page', 'buddypress' ) ?></td>
+					<td class="yes"><input type="radio" name="notifications[notification_members_invitation_accepted]" id="notification-members-invitation-accepted-yes" value="yes" <?php checked( $allow_acceptance_emails, 'yes', true ) ?>/><label for="notification-members-invitation-accepted-yes" class="bp-screen-reader-text"><?php
+						/* translators: accessibility text */
+						_e( 'Yes, send email', 'buddypress' );
+					?></label></td>
+					<td class="no"><input type="radio" name="notifications[notification_members_invitation_accepted]" id="notification-members-invitation-accepted-no" value="no" <?php checked( $allow_acceptance_emails, 'no', true ) ?>/><label for="notification-members-invitation-accepted-no" class="bp-screen-reader-text"><?php
+						/* translators: accessibility text */
+						_e( 'No, do not send email', 'buddypress' );
+					?></label></td>
+				</tr>
+				<?php
+			endif;
+
+			if ( bp_get_membership_requests_required() && user_can( bp_displayed_user_id(), 'bp_moderate' ) ) :
+				if ( ! $allow_request_emails = bp_get_user_meta( bp_displayed_user_id(), 'notification_members_membership_request', true ) ) {
+					$allow_request_emails = 'yes';
+				}
+				?>
+				<tr id="members-notification-settings-submitted_membership_request">
+					<td></td>
+					<td><?php _ex( 'Someone has requested site membership', 'Member settings on notification settings page', 'buddypress' ) ?></td>
+					<td class="yes"><input type="radio" name="notifications[notification_members_membership_request]" id="notification-members-submitted_membership_request-yes" value="yes" <?php checked( $allow_request_emails, 'yes', true ) ?>/><label for="notification-members-submitted_membership_request-yes" class="bp-screen-reader-text"><?php
+						/* translators: accessibility text */
+						_e( 'Yes, send email', 'buddypress' );
+					?></label></td>
+					<td class="no"><input type="radio" name="notifications[notification_members_membership_request]" id="notification-members-submitted_membership_request-no" value="no" <?php checked( $allow_request_emails, 'no', true ) ?>/><label for="notification-members-submitted_membership_request-no" class="bp-screen-reader-text"><?php
+						/* translators: accessibility text */
+						_e( 'No, do not send email', 'buddypress' );
+					?></label></td>
+				</tr>
+				<?php
+			endif;
 
 			/**
 			 * Fires after the last table row on the members notification screen.
diff --git src/bp-members/bp-members-template.php src/bp-members/bp-members-template.php
index 39cfd6e65..32864d043 100644
--- src/bp-members/bp-members-template.php
+++ src/bp-members/bp-members-template.php
@@ -2925,6 +2925,35 @@ function bp_get_members_invitations_allowed() {
 	return apply_filters( 'bp_get_members_invitations_allowed', bp_is_active( 'members', 'invitations' ) && (bool) bp_get_option( 'bp-enable-members-invitations' ) );
 }
 
+/**
+ * Are membership requests required for joining this site?
+ *
+ * @since 10.0.0
+ *
+ * @param bool $context "raw" to fetch value from database,
+ *                      "site" to take "anyone can register" setting into account.
+ * @return bool
+ */
+function bp_get_membership_requests_required( $context = 'site' ) {
+	if ( 'raw' === $context ) {
+		$retval = bp_is_active( 'members', 'invitations' ) && (bool) bp_get_option( 'bp-enable-membership-requests' );
+	} else {
+		$retval = bp_is_active( 'members', 'invitations' ) && ! bp_get_signup_allowed() && (bool) bp_get_option( 'bp-enable-membership-requests' );
+	}
+
+	/**
+	 * Filters whether or not prospective members may submit network membership requests.
+	 *
+	 * @since 10.0.0
+	 *
+	 * @param bool $retval Whether or not membership requests are required.
+	 * @param bool $retval Whether this is the value stored in the database ('raw')
+	 *                     or whether the site's "anyone can register" setting is
+	 *                     being considered ('site' or anything else).
+	 */
+	return apply_filters( 'bp_get_membership_requests_required', $retval, $context );
+}
+
 /**
  * Should the system create and allow access
  * to the Register and Activate pages?
@@ -2934,7 +2963,7 @@ function bp_get_members_invitations_allowed() {
  * @return bool
  */
 function bp_allow_access_to_registration_pages() {
-	$retval = bp_get_signup_allowed() || bp_get_members_invitations_allowed();
+	$retval = bp_get_signup_allowed() || bp_get_members_invitations_allowed() || bp_get_membership_requests_required();
 
 	/**
 	 * Filters whether or not the system should create and allow access
diff --git src/bp-members/classes/class-bp-members-admin.php src/bp-members/classes/class-bp-members-admin.php
index 8027051b1..4dcad3d52 100644
--- src/bp-members/classes/class-bp-members-admin.php
+++ src/bp-members/classes/class-bp-members-admin.php
@@ -1120,11 +1120,11 @@ class BP_Members_Admin {
 
 		// Bail if user has not been activated yet (how did you get here?).
 		if ( isset( $user->user_status ) && ( 2 == $user->user_status ) ) : ?>
-
-			<p class="not-activated"><?php esc_html_e( 'User account has not yet been activated', 'buddypress' ); ?></p><br/>
-
-			<?php return;
-
+			<p class="not-activated"><?php esc_html_e( 'User account has not yet been activated', 'buddypress' ); ?></p>
+			<?php
+			if ( ! bp_get_membership_requests_required() ) {
+				return;
+			}
 		endif; ?>
 
 		<div class="submitbox" id="submitcomment">
@@ -1132,25 +1132,56 @@ class BP_Members_Admin {
 				<div id="misc-publishing-actions">
 					<?php
 
-					// Get the spam status once here to compare against below.
-					$is_spammer = bp_is_user_spammer( $user->ID );
+					if ( ! bp_get_membership_requests_required() ) :
+
+						// Get the spam status once here to compare against below.
+						$is_spammer = bp_is_user_spammer( $user->ID );
+
+						/**
+						 * In configs where BuddyPress is not network activated,
+						 * regular admins cannot mark a user as a spammer on front
+						 * end. This prevent them to do it in the back end.
+						 *
+						 * Also prevent admins from marking themselves or other
+						 * admins as spammers.
+						 */
+						if ( ( empty( $this->is_self_profile ) && ( ! in_array( $user->user_login, get_super_admins() ) ) && empty( $this->subsite_activated ) ) || ( ! empty( $this->subsite_activated ) && current_user_can( 'manage_network_users' ) ) ) : ?>
+
+							<div class="misc-pub-section" id="comment-status-radio">
+								<label class="approved"><input type="radio" name="user_status" value="ham" <?php checked( $is_spammer, false ); ?>><?php esc_html_e( 'Active', 'buddypress' ); ?></label><br />
+								<label class="spam"><input type="radio" name="user_status" value="spam" <?php checked( $is_spammer, true ); ?>><?php esc_html_e( 'Spammer', 'buddypress' ); ?></label>
+							</div>
+
+						<?php endif; ?>
+					<?php elseif ( ! empty( $user->user_email ) ) :
+						// Provide details on the pending signup.
+						$signup   = bp_members_get_signup_by( 'user_email', $user->user_email );
+						$approved = ( $signup->count_sent > 0 );
+						$label    = $approved ? __( 'Approve request', 'buddypress' ) : __( 'Resend approval email', 'buddypress' );
+
+						$email_link = add_query_arg(
+							array(
+								'page'	    => 'bp-signups',
+								'signup_id' => $signup->id,
+								'action'    => 'resend',
+							),
+							bp_get_admin_url( 'users.php' )
+						);
+
+						$resend_label = $approved ? __( 'Resend Approval', 'buddypress' ) : __( 'Approve Request', 'buddypress' );
+
+						$approved_message = $approved ? mysql2date( 'Y/m/d g:i:s a', $signup->date_sent ) : __( 'Not yet approved', 'buddypress' );
+						?>
+							<div class="misc-pub-section" id="comment-status-radio">
+								<p><?php printf( '<a href="%1$s" class="button">%2$s</a>', esc_url( $email_link ), $resend_label ); ?></p>
+
+								<p><strong><?php _e( 'Approved', 'buddypress' ) ?></strong> <?php echo $approved_message; ?></p>
 
-					/**
-					 * In configs where BuddyPress is not network activated,
-					 * regular admins cannot mark a user as a spammer on front
-					 * end. This prevent them to do it in the back end.
-					 *
-					 * Also prevent admins from marking themselves or other
-					 * admins as spammers.
-					 */
-					if ( ( empty( $this->is_self_profile ) && ( ! in_array( $user->user_login, get_super_admins() ) ) && empty( $this->subsite_activated ) ) || ( ! empty( $this->subsite_activated ) && current_user_can( 'manage_network_users' ) ) ) : ?>
+								<p><strong><?php _e( 'Emails Sent', 'buddypress' ) ?></strong> <?php echo $signup->count_sent; ?></p>
 
-						<div class="misc-pub-section" id="comment-status-radio">
-							<label class="approved"><input type="radio" name="user_status" value="ham" <?php checked( $is_spammer, false ); ?>><?php esc_html_e( 'Active', 'buddypress' ); ?></label><br />
-							<label class="spam"><input type="radio" name="user_status" value="spam" <?php checked( $is_spammer, true ); ?>><?php esc_html_e( 'Spammer', 'buddypress' ); ?></label>
-						</div>
+							</div>
 
-					<?php endif ;?>
+					<?php endif; ?>
 
 					<div class="misc-pub-section curtime misc-pub-section-last">
 						<?php
@@ -1161,8 +1192,14 @@ class BP_Members_Admin {
 						?>
 						<span id="timestamp">
 							<?php
-							/* translators: %s: registration date */
-							printf( __( 'Registered on: %s', 'buddypress' ), '<strong>' . $date . '</strong>' );
+							if ( ! bp_get_membership_requests_required() ) {
+								/* translators: %s: registration date */
+								$reg_message = __( 'Registered on: %s', 'buddypress' );
+							} else {
+								/* translators: %s: registration date */
+								$reg_message = __( 'Requested membership on: %s', 'buddypress' );
+							}
+							printf( $reg_message, '<strong>' . $date . '</strong>' );
 							?>
 						</span>
 					</div>
@@ -2173,7 +2210,7 @@ class BP_Members_Admin {
 		) );
 
 		$signups    = $signups_query['signups'];
-		$signup_ids = wp_list_pluck( $signups, 'signup_id' );
+		$signup_ids = wp_list_pluck( $signups, 'id' );
 
 		// Set up strings.
 		switch ( $action ) {
@@ -2255,7 +2292,11 @@ class BP_Members_Admin {
 
 			<ol class="bp-signups-list">
 			<?php foreach ( $signups as $signup ) :
-				$last_notified = mysql2date( 'Y/m/d g:i:s a', $signup->date_sent );
+				if ( $signup->count_sent > 0 ) {
+					$last_notified = mysql2date( 'Y/m/d g:i:s a', $signup->date_sent );
+				} else {
+					$last_notified = __( 'Not yet notified', 'buddypress' );
+				}
 				$profile_field_ids = array();
 
 				// Get all xprofile field IDs except field 1.
diff --git src/bp-members/classes/class-bp-members-component.php src/bp-members/classes/class-bp-members-component.php
index a7deff76d..a479619d4 100644
--- src/bp-members/classes/class-bp-members-component.php
+++ src/bp-members/classes/class-bp-members-component.php
@@ -67,6 +67,7 @@ class BP_Members_Component extends BP_Component {
 			'widgets',
 			'cache',
 			'invitations',
+			'membership-requests',
 			'notifications',
 		);
 
diff --git src/bp-members/classes/class-bp-members-list-table.php src/bp-members/classes/class-bp-members-list-table.php
index 8e7733b47..f659c3bea 100644
--- src/bp-members/classes/class-bp-members-list-table.php
+++ src/bp-members/classes/class-bp-members-list-table.php
@@ -171,7 +171,14 @@ class BP_Members_List_Table extends WP_Users_List_Table {
 			$actions['delete'] = __( 'Delete', 'buddypress' );
 		}
 
-		return $actions;
+		/**
+		 * Filters the bulk actions for signups.
+		 *
+		 * @since 10.0.0
+		 *
+		 * @param array $actions Array of actions and corresponding labels.
+		 */
+		return apply_filters( 'bp_members_ms_signup_bulk_actions', $actions );
 	}
 
 	/**
@@ -183,7 +190,7 @@ class BP_Members_List_Table extends WP_Users_List_Table {
 	 */
 	public function no_items() {
 
-		if ( bp_get_signup_allowed() ) {
+		if ( bp_get_signup_allowed() || bp_get_membership_requests_required() ) {
 			esc_html_e( 'No pending accounts found.', 'buddypress' );
 		} else {
 			$link = false;
@@ -374,7 +381,24 @@ class BP_Members_List_Table extends WP_Users_List_Table {
 	 * @param object|null $signup_object The signup data object.
 	 */
 	public function column_date_sent( $signup_object = null ) {
-		echo mysql2date( 'Y/m/d', $signup_object->date_sent );
+		if ( $signup_object->count_sent > 0 ) {
+			echo mysql2date( 'Y/m/d', $signup_object->date_sent );
+		} else {
+			$message = __( 'Not yet notified', 'buddypress' );
+
+			/**
+			 * Filters the "not yet sent" message for "Last Sent"
+			 * column in Manage Signups list table.
+			 *
+			 * @since 10.0.0
+			 *
+			 * @param string      $message       "Not yet sent" message.
+			 * @param object|null $signup_object Signup object instance.
+			 */
+			$message = apply_filters( 'bp_members_signup_date_sent_unsent_message', $message, $signup_object );
+
+			echo esc_html( $message );
+		}
 	}
 
 	/**
diff --git src/bp-members/classes/class-bp-members-ms-list-table.php src/bp-members/classes/class-bp-members-ms-list-table.php
index b8e86f906..21f085b1d 100644
--- src/bp-members/classes/class-bp-members-ms-list-table.php
+++ src/bp-members/classes/class-bp-members-ms-list-table.php
@@ -158,7 +158,14 @@ class BP_Members_MS_List_Table extends WP_MS_Users_List_Table {
 			$actions['delete'] = __( 'Delete', 'buddypress' );
 		}
 
-		return $actions;
+		/**
+		 * Filters the bulk actions for signups.
+		 *
+		 * @since 10.0.0
+		 *
+		 * @param array $actions Array of actions and corresponding labels.
+		 */
+		return apply_filters( 'bp_members_ms_signup_bulk_actions', $actions );
 	}
 
 	/**
@@ -169,7 +176,7 @@ class BP_Members_MS_List_Table extends WP_MS_Users_List_Table {
 	 * @since 2.0.0
 	 */
 	public function no_items() {
-		if ( bp_get_signup_allowed() ) {
+		if ( bp_get_signup_allowed() || bp_get_membership_requests_required() ) {
 			esc_html_e( 'No pending accounts found.', 'buddypress' );
 		} else {
 			$link = false;
@@ -376,7 +383,24 @@ class BP_Members_MS_List_Table extends WP_MS_Users_List_Table {
 			$date = 'Y/m/d \<\b\r \/\> g:i:s a';
 		}
 
-		echo mysql2date( $date, $signup_object->date_sent );
+		if ( $signup_object->count_sent > 0 ) {
+			echo mysql2date( $date, $signup_object->date_sent );
+		} else {
+			$message = __( 'Not yet notified', 'buddypress' );
+
+			/**
+			 * Filters the "not yet sent" message for "Last Sent"
+			 * column in Manage Signups list table.
+			 *
+			 * @since 10.0.0
+			 *
+			 * @param string      $message       "Not yet sent" message.
+			 * @param object|null $signup_object Signup object instance.
+			 */
+			$message = apply_filters( 'bp_members_ms_signup_date_sent_unsent_message', $message, $signup_object );
+
+			echo esc_html( $message );
+		}
 	}
 
 	/**
diff --git src/bp-members/classes/class-bp-registration-theme-compat.php src/bp-members/classes/class-bp-registration-theme-compat.php
index 6a942a58b..f4e3e6855 100644
--- src/bp-members/classes/class-bp-registration-theme-compat.php
+++ src/bp-members/classes/class-bp-registration-theme-compat.php
@@ -97,10 +97,18 @@ class BP_Registration_Theme_Compat {
 	public function dummy_post() {
 		// Registration page.
 		if ( bp_is_register_page() ) {
-			$title = __( 'Create an Account', 'buddypress' );
+			if ( bp_get_membership_requests_required() ) {
+				$title = __( 'Request Membership', 'buddypress' );
+			} else {
+				$title = __( 'Create an Account', 'buddypress' );
+			}
 
 			if ( 'completed-confirmation' == bp_get_current_signup_step() ) {
-				$title = __( 'Check Your Email To Activate Your Account!', 'buddypress' );
+				if ( bp_get_membership_requests_required() ) {
+					$title = __( 'Your Membership Request has been submitted.', 'buddypress' );
+				} else {
+					$title = __( 'Check Your Email To Activate Your Account!', 'buddypress' );
+				}
 			}
 
 		// Activation page.
diff --git src/bp-members/screens/register.php src/bp-members/screens/register.php
index 77929c442..40dd280dc 100644
--- src/bp-members/screens/register.php
+++ src/bp-members/screens/register.php
@@ -61,7 +61,9 @@ function bp_core_screen_signup() {
 		}
 	}
 
-	if ( ! bp_get_signup_allowed() && ! $active_invite ) {
+	$requests_enabled = bp_get_membership_requests_required();
+
+	if ( ! bp_get_signup_allowed() && ! $active_invite && ! $requests_enabled ) {
 		$bp->signup->step = 'registration-disabled';
 		// If the signup page is submitted, validate and save.
 	} elseif ( isset( $_POST['signup_submit'] ) && bp_verify_nonce_request( 'bp_new_signup' ) ) {
diff --git src/bp-templates/bp-legacy/buddypress/members/register.php src/bp-templates/bp-legacy/buddypress/members/register.php
index d263470f2..dd6365b45 100644
--- src/bp-templates/bp-legacy/buddypress/members/register.php
+++ src/bp-templates/bp-legacy/buddypress/members/register.php
@@ -351,10 +351,17 @@
 			 *
 			 * @since 1.1.0
 			 */
-			do_action( 'bp_before_registration_submit_buttons' ); ?>
+			do_action( 'bp_before_registration_submit_buttons' );
+
+			if ( bp_get_membership_requests_required() ) {
+				$button_text = __( 'Submit Request', 'buddypress' );
+			} else {
+				$button_text = __( 'Complete Sign Up', 'buddypress' );
+			}
+			?>
 
 			<div class="submit">
-				<input type="submit" name="signup_submit" id="signup_submit" value="<?php esc_attr_e( 'Complete Sign Up', 'buddypress' ); ?>" />
+				<input type="submit" name="signup_submit" id="signup_submit" value="<?php echo esc_attr( $button_text ); ?>" />
 			</div>
 
 			<?php
@@ -390,7 +397,9 @@
 			do_action( 'bp_before_registration_confirmed' ); ?>
 
 			<div id="template-notices" role="alert" aria-atomic="true">
-				<?php if ( bp_registration_needs_activation() ) : ?>
+				<?php if ( bp_get_membership_requests_required() ) : ?>
+					<p><?php _e( 'You have successfully submitted your membership request! Our site moderators will review your submission and send you an activation email if your request is approved.', 'buddypress' ); ?></p>
+				<?php elseif ( bp_registration_needs_activation() ) : ?>
 					<p><?php _e( 'You have successfully created your account! To begin using this site you will need to activate your account via the email we have just sent to your address.', 'buddypress' ); ?></p>
 				<?php else : ?>
 					<p><?php _e( 'You have successfully created your account! Please log in using the username and password you have just created.', 'buddypress' ); ?></p>
diff --git src/bp-templates/bp-nouveau/includes/functions.php src/bp-templates/bp-nouveau/includes/functions.php
index 3d85eace9..5faa6b0f9 100644
--- src/bp-templates/bp-nouveau/includes/functions.php
+++ src/bp-templates/bp-nouveau/includes/functions.php
@@ -1122,7 +1122,9 @@ function bp_nouveau_get_user_feedback( $feedback_id = '' ) {
 	/*
 	 * Adjust some messages to the context.
 	 */
-	if ( 'completed-confirmation' === $feedback_id && bp_registration_needs_activation() ) {
+	if ( 'completed-confirmation' === $feedback_id && bp_get_membership_requests_required() ) {
+		$feedback_messages['completed-confirmation']['message'] = __( 'You have successfully submitted your membership request! Our site moderators will review your submission and send you an activation email if your request is approved.', 'buddypress' );
+	} elseif ( 'completed-confirmation' === $feedback_id && bp_registration_needs_activation() ) {
 		$feedback_messages['completed-confirmation']['message'] = __( 'You have successfully created your account! To begin using this site you will need to activate your account via the email we have just sent to your address.', 'buddypress' );
 	} elseif ( 'member-notifications-none' === $feedback_id ) {
 		$is_myprofile = bp_is_my_profile();
