diff --git src/bp-core/admin/bp-core-admin-settings.php src/bp-core/admin/bp-core-admin-settings.php
index 86e456c84..0b249b889 100644
--- src/bp-core/admin/bp-core-admin-settings.php
+++ src/bp-core/admin/bp-core-admin-settings.php
@@ -211,9 +211,9 @@ function bp_admin_setting_callback_members_invitations() {
 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>
+	<label for="bp-enable-membership-requests"><?php esc_html_e( 'Allow visitors to request a site membership. If enabled, an administrator must approve each new site membership request.', '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>
+		<p class="description"><?php esc_html_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
 	/**
diff --git src/bp-core/bp-core-update.php src/bp-core/bp-core-update.php
index 533efdb86..d7e0d5b5b 100644
--- src/bp-core/bp-core-update.php
+++ src/bp-core/bp-core-update.php
@@ -708,6 +708,7 @@ function bp_core_get_8_0_upgrade_email_schema( $emails ) {
  * 10.0.0 update routine.
  *
  * - Explicitly set all signups to count_sent = 1 & sent_date to registered_date
+ * - **Create the new BP Emails**.
  *
  * @since 10.0.0
  */
@@ -716,6 +717,8 @@ 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.
 
+	// Do we need this upgrade routine?
+	// Could we just assume if count_sent or sent_date defaults to 1 and to the registered_date into the PHP Code?
 }
 
 /**
diff --git src/bp-members/bp-members-membership-requests.php src/bp-members/bp-members-membership-requests.php
new file mode 100644
index 000000000..7b02da0d1
--- /dev/null
+++ src/bp-members/bp-members-membership-requests.php
@@ -0,0 +1,174 @@
+<?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 ) {
+	// Why not just using get_option( 'admin_email' ) ?
+	$admin_ids = get_users(
+		array(
+			'fields' => 'ids',
+			'role'   => 'administrator',
+		)
+	);
+
+	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,
+					'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' => $signup->signup_id,
+				'action'    => 'resend',
+			),
+			bp_get_admin_url( 'users.php' )
+		);
+
+		$args  = array(
+			'tokens' => array(
+				'admin.id'                   => $admin_id,
+				'manage.url'                 => esc_url_raw( $manage_url ),
+				'requesting-user.user_login' => esc_html( $signup->user_login ),
+				'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 esc_html_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 d63126341..ab63dd8cd 100644
--- src/bp-members/bp-members-notifications.php
+++ src/bp-members/bp-members-notifications.php
@@ -254,14 +254,14 @@ function members_screen_notification_settings() {
 				?>
 				<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><?php echo esc_html_x( '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' );
+						esc_html_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' );
+						esc_html_e( 'No, do not send email', 'buddypress' );
 					?></label></td>
 				</tr>
 				<?php
@@ -274,14 +274,14 @@ function members_screen_notification_settings() {
 				?>
 				<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><?php echo esc_html_x( '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' );
+						esc_html_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' );
+						esc_html_e( 'No, do not send email', 'buddypress' );
 					?></label></td>
 				</tr>
 				<?php
diff --git src/bp-members/classes/class-bp-members-admin.php src/bp-members/classes/class-bp-members-admin.php
index 08eb51dbf..ba80808d7 100644
--- src/bp-members/classes/class-bp-members-admin.php
+++ src/bp-members/classes/class-bp-members-admin.php
@@ -2230,14 +2230,14 @@ class BP_Members_Admin {
 
 				if ( bp_get_membership_requests_required() ) {
 					$header_text = __( 'Approve Membership Requests', 'buddypress' );
-					if ( 1 == count( $signup_ids ) ) {
+					if ( 1 === count( $signup_ids ) ) {
 						$helper_text = __( 'You are about to send an approval email to the following user:', 'buddypress' );
 					} else {
 						$helper_text = __( 'You are about to send approval emails to the following users:', 'buddypress' );
 					}
 				} else {
 					$header_text = __( 'Resend Activation Emails', 'buddypress' );
-					if ( 1 == count( $signup_ids ) ) {
+					if ( 1 === count( $signup_ids ) ) {
 						$helper_text = __( 'You are about to resend an activation email to the following account:', 'buddypress' );
 					} else {
 						$helper_text = __( 'You are about to resend an activation email to the following accounts:', 'buddypress' );
diff --git src/bp-members/classes/class-bp-members-component.php src/bp-members/classes/class-bp-members-component.php
index ddf725356..8e7e79eb0 100644
--- src/bp-members/classes/class-bp-members-component.php
+++ src/bp-members/classes/class-bp-members-component.php
@@ -67,7 +67,6 @@ class BP_Members_Component extends BP_Component {
 			'widgets',
 			'cache',
 			'invitations',
-			'membership-requests',
 			'notifications',
 		);
 
@@ -75,6 +74,10 @@ class BP_Members_Component extends BP_Component {
 			$includes[] = 'activity';
 		}
 
+		if ( bp_is_active( 'members', 'invitations' ) && (bool) bp_get_option( 'bp-enable-membership-requests' ) ) {
+			$includes[] = 'membership-requests';
+		}
+
 		// Include these only if in admin.
 		if ( is_admin() ) {
 			$includes[] = 'admin';
diff --git src/bp-members/classes/class-bp-members-list-table.php src/bp-members/classes/class-bp-members-list-table.php
index ddf4b6d02..feb9b4668 100644
--- src/bp-members/classes/class-bp-members-list-table.php
+++ src/bp-members/classes/class-bp-members-list-table.php
@@ -470,14 +470,17 @@ class BP_Members_List_Table extends WP_Users_List_Table {
 			<h2><?php echo esc_html__( 'Extended Profile Information', 'buddypress' ); ?></h2>
 
 			<table class="signup-profile-data-drawer wp-list-table widefat fixed striped">
-				<?php foreach ( $profile_field_ids as $pid => $noop ) :
+				<?php if ( 1 <= count( $profile_field_ids ) ): foreach ( $profile_field_ids as $pid => $noop ) :
 					$field_value = isset( $signup_object->meta[ "field_{$pid}" ] ) ? $signup_object->meta[ "field_{$pid}" ] : ''; ?>
 					<tr>
 						<td class="column-fields"><?php echo esc_html( $fdata[ $pid ] ); ?></td>
 						<td><?php echo $this->format_xprofile_field_for_display( $field_value ); ?></td>
 					</tr>
-
-				<?php endforeach;  ?>
+				<?php endforeach;else:  ?>
+					<tr>
+						<td><?php esc_html_e( 'There are no additional information to display.', 'buddypress' ); ?></td>
+					</tr>
+				<?php endif; ?>
 			</table>
 		</div>
 		<?php
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 557e58952..918748378 100644
--- src/bp-members/classes/class-bp-members-ms-list-table.php
+++ src/bp-members/classes/class-bp-members-ms-list-table.php
@@ -472,14 +472,17 @@ class BP_Members_MS_List_Table extends WP_MS_Users_List_Table {
 			<h2><?php echo esc_html__( 'Extended Profile Information', 'buddypress' ); ?></h2>
 
 			<table class="signup-profile-data-drawer wp-list-table widefat fixed striped">
-				<?php foreach ( $profile_field_ids as $pid => $noop ) :
+				<?php if ( 1 <= count( $profile_field_ids ) ): foreach ( $profile_field_ids as $pid => $noop ) :
 					$field_value = isset( $signup_object->meta[ "field_{$pid}" ] ) ? $signup_object->meta[ "field_{$pid}" ] : ''; ?>
 					<tr>
 						<td class="column-fields"><?php echo esc_html( $fdata[ $pid ] ); ?></td>
 						<td><?php echo $this->format_xprofile_field_for_display( $field_value ); ?></td>
 					</tr>
-
-				<?php endforeach;  ?>
+				<?php endforeach;else:  ?>
+					<tr>
+						<td><?php esc_html_e( 'There are no additional information to display.', 'buddypress' ); ?></td>
+					</tr>
+				<?php endif; ?>
 			</table>
 		</div>
 		<?php
