diff --git src/bp-core/admin/bp-core-admin-functions.php src/bp-core/admin/bp-core-admin-functions.php
index b50ad98c6..8f4a98a2b 100644
--- src/bp-core/admin/bp-core-admin-functions.php
+++ src/bp-core/admin/bp-core-admin-functions.php
@@ -278,7 +278,7 @@ function bp_core_activation_notice() {
 
 	// Activate and Register are special cases. They are not components but they need WP pages.
 	// If user registration is disabled, we can skip this step.
-	if ( bp_get_signup_allowed() ) {
+	if ( bp_get_signup_allowed() || bp_get_members_invitations_allowed() ) {
 		$wp_page_components[] = array(
 			'id'   => 'activate',
 			'name' => __( 'Activate', 'buddypress' ),
diff --git src/bp-core/admin/bp-core-admin-settings.php src/bp-core/admin/bp-core-admin-settings.php
index cf8d43468..550e6a26a 100644
--- src/bp-core/admin/bp-core-admin-settings.php
+++ src/bp-core/admin/bp-core-admin-settings.php
@@ -182,6 +182,27 @@ function bp_admin_setting_callback_cover_image_uploads() {
 <?php
 }
 
+/**
+ * Allow members to invite non-members to the network.
+ *
+ * @since 7.0.0
+ */
+function bp_admin_setting_callback_members_invitations() {
+?>
+	<input id="bp-enable-members-invitations" name="bp-enable-members-invitations" type="checkbox" value="1" <?php checked( bp_get_members_invitations_allowed() ); ?> />
+	<label for="bp-enable-members-invitations"><?php _e( 'Allow registered members to invite people to join this network', 'buddypress' ); ?></label>
+	<?php if ( ! bp_get_signup_allowed() ) : ?>
+		<p class="description"><?php _e( 'Public registration is currently disabled. However, invitees will still be able to register if network invitations are enabled.', 'buddypress' ); ?></p>
+	<?php endif; ?>
+	<?php
+	/**
+	 * Fires after the output of the invitations settings section.
+	 *
+	 * @since 7.0.0
+	 */
+	do_action( 'bp_admin_settings_after_members_invitations' );
+}
+
 /** XProfile ******************************************************************/
 
 /**
diff --git src/bp-core/admin/bp-core-admin-slugs.php src/bp-core/admin/bp-core-admin-slugs.php
index 8831e7189..3b85b950f 100644
--- src/bp-core/admin/bp-core-admin-slugs.php
+++ src/bp-core/admin/bp-core-admin-slugs.php
@@ -186,7 +186,7 @@ function bp_core_admin_slugs_options() {
 
 		<h3><?php _e( 'Registration', 'buddypress' ); ?></h3>
 
-		<?php if ( bp_get_signup_allowed() ) : ?>
+		<?php if ( bp_get_signup_allowed() || bp_get_members_invitations_allowed() ) : ?>
 			<p><?php _e( 'Associate WordPress Pages with the following BuddyPress Registration pages.', 'buddypress' ); ?></p>
 		<?php else : ?>
 			<?php if ( is_multisite() ) : ?>
@@ -209,7 +209,7 @@ function bp_core_admin_slugs_options() {
 		<table class="form-table">
 			<tbody>
 
-				<?php if ( bp_get_signup_allowed() ) : foreach ( $static_pages as $name => $label ) : ?>
+				<?php if ( bp_get_signup_allowed() || bp_get_members_invitations_allowed() ) : foreach ( $static_pages as $name => $label ) : ?>
 
 					<tr valign="top">
 						<th scope="row">
diff --git src/bp-core/bp-core-functions.php src/bp-core/bp-core-functions.php
index c1481135e..d626a38da 100644
--- src/bp-core/bp-core-functions.php
+++ src/bp-core/bp-core-functions.php
@@ -693,7 +693,7 @@ function bp_core_add_page_mappings( $components, $existing = 'keep' ) {
 
 	// Register and Activate are not components, but need pages when
 	// registration is enabled.
-	if ( bp_get_signup_allowed() ) {
+	if ( bp_get_signup_allowed() || bp_get_members_invitations_allowed()  ) {
 		foreach ( array( 'register', 'activate' ) as $slug ) {
 			if ( ! isset( $pages[ $slug ] ) ) {
 				$pages_to_create[ $slug ] = $page_titles[ $slug ];
@@ -3153,6 +3153,9 @@ function bp_send_email( $email_type, $to, $args = array() ) {
 	// From, subject, content are set automatically.
 	if ( 'settings-verify-email-change' === $email_type && isset( $args['tokens']['displayname'] ) ) {
 		$email->set_to( $to, $args['tokens']['displayname'] );
+	// Emails sent to nonmembers will have no recipient.name populated.
+	} else if ( 'bp-members-invitation' === $email_type ) {
+		$email->set_to( $to, $to );
 	} else {
 		$email->set_to( $to );
 	}
@@ -3488,9 +3491,9 @@ function bp_email_get_schema() {
 			/* translators: do not remove {} brackets or translate its contents. */
 			'post_title'   => __( '[{{{site.name}}}] You have an invitation to the group: "{{group.name}}"', 'buddypress' ),
 			/* translators: do not remove {} brackets or translate its contents. */
-			'post_content' => __( "<a href=\"{{{inviter.url}}}\">{{inviter.name}}</a> has invited you to join the group: &quot;{{group.name}}&quot;.\n{{invite.message}}\n<a href=\"{{{invites.url}}}\">Go here to accept your invitation</a> or <a href=\"{{{group.url}}}\">visit the group</a> to learn more.", 'buddypress' ),
+			'post_content' => __( "<a href=\"{{{inviter.url}}}\">{{inviter.name}}</a> has invited you to join the group: &quot;{{group.name}}&quot;.\n\n{{invite.message}}\n\n<a href=\"{{{invites.url}}}\">Go here to accept your invitation</a> or <a href=\"{{{group.url}}}\">visit the group</a> to learn more.", 'buddypress' ),
 			/* translators: do not remove {} brackets or translate its contents. */
-			'post_excerpt' => __( "{{inviter.name}} has invited you to join the group: \"{{group.name}}\".\n\nTo accept your invitation, visit: {{{invites.url}}}\n\nTo learn more about the group, visit: {{{group.url}}}.\nTo view {{inviter.name}}'s profile, visit: {{{inviter.url}}}", 'buddypress' ),
+			'post_excerpt' => __( "{{inviter.name}} has invited you to join the group: \"{{group.name}}\".\n\n{{invite.message}}\n\nTo accept your invitation, visit: {{{invites.url}}}\n\nTo learn more about the group, visit: {{{group.url}}}.\nTo view {{inviter.name}}'s profile, visit: {{{inviter.url}}}", 'buddypress' ),
 		),
 		'groups-member-promoted' => array(
 			/* translators: do not remove {} brackets or translate its contents. */
@@ -3540,6 +3543,14 @@ function bp_email_get_schema() {
 			/* translators: do not remove {} brackets or translate its contents. */
 			'post_excerpt' => __( "Your membership request for the group \"{{group.name}}\" has been rejected.\n\nTo request membership again, visit: {{{group.url}}}", 'buddypress' ),
 		),
+		'bp-members-invitation' => array(
+			/* translators: do not remove {} brackets or translate its contents. */
+			'post_title'   => __( '[{{{site.name}}}] You have an invitation to the site: "{{network.name}}"', 'buddypress' ),
+			/* translators: do not remove {} brackets or translate its contents. */
+			'post_content' => __( "<a href=\"{{{inviter.url}}}\">{{inviter.name}}</a> has invited you to join the site: &quot;{{network.name}}&quot;.\n\n{{invite.message}}\n\n<a href=\"{{{invites.url}}}\">Go here to accept your invitation</a> or <a href=\"{{{network.url}}}\">visit the site</a> to learn more.", 'buddypress' ),
+			/* translators: do not remove {} brackets or translate its contents. */
+			'post_excerpt' => __( "{{inviter.name}} has invited you to join the site: \"{{network.name}}\".\n\n{{invite.message}}\n\nTo accept your invitation, visit: {{{invites.url}}}\n\nTo learn more about the site, visit: {{{network.url}}}.\nTo view {{inviter.name}}'s profile, visit: {{{inviter.url}}}", 'buddypress' ),
+		),
 	) );
 }
 
@@ -3681,6 +3692,14 @@ function bp_email_get_type_schema( $field = 'description' ) {
 		),
 	);
 
+	$members_invitation = array(
+		'description'	=> __( 'A site member has sent a site invitation to the recipient.', 'buddypress' ),
+		'unsubscribe'	=> array(
+			'meta_key'	=> 'notification_bp_members_invite',
+			'message'	=> __( 'You will no longer receive emails when you are invited to join a site.', 'buddypress' ),
+		),
+	);
+
 	$types = array(
 		'activity-comment'                   => $activity_comment,
 		'activity-comment-author'            => $activity_comment_author,
@@ -3698,6 +3717,7 @@ function bp_email_get_type_schema( $field = 'description' ) {
 		'settings-verify-email-change'       => $settings_verify_email_change,
 		'groups-membership-request-accepted' => $groups_membership_request_accepted,
 		'groups-membership-request-rejected' => $groups_membership_request_rejected,
+		'bp-members-invitation'              => $members_invitation,
 	);
 
 	if ( $field !== 'all' ) {
diff --git src/bp-core/bp-core-template.php src/bp-core/bp-core-template.php
index 9fc92249a..c462cc799 100644
--- src/bp-core/bp-core-template.php
+++ src/bp-core/bp-core-template.php
@@ -2247,6 +2247,17 @@ function bp_is_settings_component() {
 	return (bool) bp_is_current_component( 'settings' );
 }
 
+/**
+ * Check whether the current page is an Invitations screen.
+ *
+ * @since 6.0.0
+ *
+ * @return bool True if the current page is an Invitations screen.
+ */
+function bp_is_community_invitations_screen() {
+	return (bool) bp_is_current_component( bp_get_members_invitations_slug() );
+}
+
 /**
  * Is the current component an active core component?
  *
@@ -2647,6 +2658,45 @@ function bp_is_user_settings_profile() {
 	return (bool) ( bp_is_user_settings() && bp_is_current_action( 'profile' ) );
 }
 
+/**
+ * Is the current page a user's community invitations page?
+ *
+ * Eg http://example.com/members/cassie/invitations/ (or a subpage thereof).
+ *
+ * @since 7.0.0
+ *
+ * @return bool True if the current page is a user's community invitations page.
+ */
+function bp_is_user_members_invitations() {
+	return (bool) ( bp_is_user() && bp_is_community_invitations_screen() );
+}
+
+/**
+ * Is the current page a user's List Invites page?
+ *
+ * Eg http://example.com/members/cassie/invitations/list-invites/.
+ *
+ * @since 7.0.0
+ *
+ * @return bool True if the current page is a user's List Invites page.
+ */
+function bp_is_user_members_invitations_list() {
+	return (bool) ( bp_is_user_members_invitations() && bp_is_current_action( 'list-invites' ) );
+}
+
+/**
+ * Is the current page a user's Send Invites page?
+ *
+ * Eg http://example.com/members/cassie/invitations/send-invites/.
+ *
+ * @since 7.0.0
+ *
+ * @return bool True if the current page is a user's Send Invites page.
+ */
+function bp_is_user_members_invitations_send_screen() {
+	return (bool) ( bp_is_user_members_invitations() && bp_is_current_action( 'send-invites' ) );
+}
+
 /** Groups ********************************************************************/
 
 /**
diff --git src/bp-core/classes/class-bp-admin.php src/bp-core/classes/class-bp-admin.php
index 5457a816c..36ec1e0f3 100644
--- src/bp-core/classes/class-bp-admin.php
+++ src/bp-core/classes/class-bp-admin.php
@@ -409,6 +409,12 @@ class BP_Admin {
 			register_setting( 'buddypress', 'bp-disable-cover-image-uploads', 'intval' );
 		}
 
+		// Community Invitations.
+		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' );
+		}
+
 		/* XProfile Section **************************************************/
 
 		if ( bp_is_active( 'xprofile' ) ) {
diff --git src/bp-core/classes/class-bp-invitation-manager.php src/bp-core/classes/class-bp-invitation-manager.php
index 904fe3e4e..a8a128bfb 100644
--- src/bp-core/classes/class-bp-invitation-manager.php
+++ src/bp-core/classes/class-bp-invitation-manager.php
@@ -99,6 +99,11 @@ abstract class BP_Invitation_Manager {
 			return false;
 		}
 
+		// If an email address is specified, it must be a valid email address.
+		if ( $r['invitee_email'] && ! is_email( $r['invitee_email'] ) ) {
+			return false;
+		}
+
 		/**
 		 * Is this user allowed to extend invitations in this situation?
 		 *
@@ -156,7 +161,7 @@ abstract class BP_Invitation_Manager {
 	 *
 	 * @param int $invitation_id ID of invitation to send.
 	 *
-	 * @return int|bool The number of rows updated, or false on error.
+	 * @return bool The result of `run_send_action()`.
 	 */
 	public function send_invitation_by_id( $invitation_id = 0 ) {
 		$updated = false;
@@ -194,11 +199,13 @@ abstract class BP_Invitation_Manager {
 		}
 
 		// Perform the send action.
-		$this->run_send_action( $invitation );
+		$success = $this->run_send_action( $invitation );
 
-		$updated = BP_Invitation::mark_sent( $invitation->id );
+		if ( $success ) {
+			BP_Invitation::mark_sent( $invitation->id );
+		}
 
-		return $updated;
+		return $success;
 	}
 
 	/**
@@ -307,7 +314,7 @@ abstract class BP_Invitation_Manager {
 	 *
 	 * @param int $request_id ID of request to send.
 	 *
-	 * @return int|bool The number of rows updated, or false on error.
+	 * @return bool The result of `run_send_action()`.
 	 */
 	public function send_request_notification_by_id( $request_id = 0 ) {
 		$updated = false;
@@ -340,11 +347,13 @@ abstract class BP_Invitation_Manager {
 		}
 
 		// Perform the send action.
-		$this->run_send_action( $request );
+		$success = $this->run_send_action( $request );
 
-		$updated = BP_Invitation::mark_sent( $request->id );
+		if ( $success ) {
+			BP_Invitation::mark_sent( $request->id );
+		}
 
-		return $updated;
+		return $success;
 	}
 
 	/** Retrieve ******************************************************************/
@@ -381,6 +390,26 @@ abstract class BP_Invitation_Manager {
 		return BP_Invitation::get( $args );
 	}
 
+	/**
+	 * Get a count of the number of invitations that match provided filter parameters.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @see BP_Invitation::get_total_count() for a description of accepted parameters.
+	 *
+	 * @return int Total number of invitations.
+	 */
+	public function get_invitations_total_count( $args = array() ) {
+		// Default to returning invitations, not requests.
+		if ( empty( $args['type'] ) ) {
+			$args['type'] = 'invite';
+		}
+		// Use the class_name property value.
+		$args['class'] = $this->class_name;
+
+		return BP_Invitation::get_total_count( $args );
+	}
+
 	/**
 	 * Get requests, based on provided filter parameters.
 	 *
@@ -688,6 +717,26 @@ abstract class BP_Invitation_Manager {
 		) );
 	}
 
+	/**
+	 * Delete an invitation by id.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @param int $id ID of the invitation to delete.
+	 * @return int|bool Number of rows deleted on success, false on failure.
+	 */
+	public function delete_by_id( $id ) {
+		// Ensure that the invitation exists and was created by this class.
+		$invite = new BP_Invitation( $id );
+		if ( ! $invite->id || sanitize_key( $this->class_name ) !== $invite->class ) {
+			return false;
+		}
+
+		return BP_Invitation::delete_by_id( $id );
+	}
+
+
+
 	/**
 	 * This is where custom actions are added (in child classes)
 	 * to determine whether an invitation should be allowed.
diff --git src/bp-members/admin/bp-members-admin-classes.php src/bp-members/admin/bp-members-admin-classes.php
index 96e339e7a..4e2e79b54 100644
--- src/bp-members/admin/bp-members-admin-classes.php
+++ src/bp-members/admin/bp-members-admin-classes.php
@@ -12,6 +12,7 @@ defined( 'ABSPATH' ) || exit;
 
 if ( class_exists( 'WP_Users_List_Table' ) ) {
 	require dirname( dirname( __FILE__ ) ) . '/classes/class-bp-members-list-table.php';
+	require dirname( dirname( __FILE__ ) ) . '/classes/class-bp-members-invitations-list-table.php';
 }
 
 if ( class_exists( 'WP_MS_Users_List_Table' ) ) {
diff --git src/bp-members/bp-members-filters.php src/bp-members/bp-members-filters.php
index 5575ebef2..40156dac9 100644
--- src/bp-members/bp-members-filters.php
+++ src/bp-members/bp-members-filters.php
@@ -127,3 +127,150 @@ function bp_members_edit_profile_url( $url, $user_id, $scheme = 'admin' ) {
 	return apply_filters( 'bp_members_edit_profile_url', $profile_link, $url, $user_id, $scheme );
 }
 add_filter( 'edit_profile_url', 'bp_members_edit_profile_url', 10, 3 );
+
+/**
+ * Filter the bp_user_can value to determine what the user can do in the members component.
+ *
+ * @since 7.0.0
+ *
+ * @param bool   $retval     Whether or not the current user has the capability.
+ * @param int    $user_id
+ * @param string $capability The capability being checked for.
+ * @param int    $site_id    Site ID. Defaults to the BP root blog.
+ * @param array  $args       Array of extra arguments passed.
+ *
+ * @return bool
+ */
+function bp_members_user_can_filter( $retval, $user_id, $capability, $site_id, $args ) {
+
+	switch ( $capability ) {
+		case 'bp_members_manage_membership_requests':
+			$retval = bp_user_can( $user_id, 'bp_moderate' );
+			break;
+		case 'bp_members_send_invitation':
+			// @todo Add restrictions?
+			if ( bp_get_members_invitations_allowed() ) {
+				$retval = true;
+			}
+			break;
+		case 'bp_members_receive_invitation':
+			if ( bp_get_members_invitations_allowed() ) {
+				$retval = true;
+				// The invited user must not already be a member of the network.
+				if ( empty( $args['invitee_email'] ) || false !== get_user_by( 'email', $args['invitee_email'] ) ) {
+					$retval = false;
+				}
+			// @TODO: The invited user must not have opted out from receiving invitations.
+			}
+
+			break;
+	}
+
+	return $retval;
+
+}
+add_filter( 'bp_user_can', 'bp_members_user_can_filter', 10, 5 );
+
+/**
+ * If the signup is the result of a member request, do not send the
+ * activation email. We will send the activation email once the
+ * the request has ben approved.
+ *
+ * @since 7.0.0
+ *
+ * @param array  $usermeta The field attributes.
+ *
+ * @return array $usermeta The field attributes.
+ */
+function bp_members_invitations_prevent_activation_emails_for_requests( $usermeta ) {
+	// Stop the activation email from being sent if registration is by request only.
+	// if "anyone can join is not true,"
+	// @TODO
+	if ( true ) {
+
+	}
+	return $usermeta;
+}
+add_filter( 'bp_signup_usermeta', 'bp_members_invitations_prevent_activation_emails_for_requests', 10, 1 );
+
+/**
+ * Do not allow the new user to change the email address
+ * if they are accepting a community invitation.
+ *
+ * @since 7.0.0
+ *
+ * @param array  $attributes The field attributes.
+ * @param string $name       The field name.
+ *
+ * @return array $attributes The field attributes.
+ */
+function bp_members_invitations_make_registration_email_input_readonly_if_invite( $attributes, $name ) {
+	if ( 'email' === $name && bp_get_members_invitations_allowed() ) {
+		$invite = bp_get_members_invitation_from_request();
+		if ( $invite->id ) {
+			$attributes['readonly'] = 'readonly';
+		}
+	}
+	return $attributes;
+}
+add_filter( 'bp_get_form_field_attributes', 'bp_members_invitations_make_registration_email_input_readonly_if_invite', 10, 2 );
+
+/**
+ * Provide a more-specific welcome message if the new user
+ * is accepting a network invitation.
+ *
+ * @since 7.0.0
+ *
+ * @return string $message The message text.
+ */
+function bp_members_invitations_get_registration_welcome_message() {
+	$message = '';
+	if ( ! bp_get_members_invitations_allowed() ) {
+		return $message;
+	}
+	$invite = bp_get_members_invitation_from_request();
+	if ( ! $invite->id ) {
+		return $message;
+	}
+
+	// Fetch the display names of all inviters to personalize the welcome message.
+	$all_invites = bp_members_invitations_get_invites(
+		array(
+			'invitee_email' => $invite->invitee_email,
+			'invite_sent'   => 'sent',
+		)
+	);
+	$inviters = array();
+	foreach ( $all_invites as $inv ) {
+		$inviters[] = bp_core_get_user_displayname( $inv->inviter_id );
+	}
+
+	if ( ! empty( $inviters ) ) {
+		$message = sprintf( _n( 'Welcome! You&#8217;ve been invited to join the site by the following user: %s. ', 'Welcome! You&#8217;ve been invited to join the site by the following users: %s. ', count( $inviters ), 'buddypress' ), implode( ', ', $inviters ) );
+	} else {
+		$message = __( 'Welcome! You&#8217;ve been invited to join the site. ', 'buddypress' );
+	}
+	return $message;
+}
+
+/**
+ * Provide a more-specific "registration is disabled" message
+ * if registration is available by invitation only.
+ * Also provide failure note if new user is trying to accept
+ * a network invitation but there's a problem.
+ *
+ * @since 7.0.0
+ *
+ * @return string $message The message text.
+ */
+function bp_members_invitations_get_modified_registration_disabled_message() {
+	$message = '';
+	if ( bp_get_members_invitations_allowed() ) {
+		$message = __( 'Member registration is allowed by invitation only.', 'buddypress' );
+		// Is the user trying to accept an invitation but something is wrong?
+		if ( ! empty( $_GET['inv'] ) ) {
+			$message .= __( ' It looks like there is a problem with your invitation. Please try again.', 'buddypress' );
+		}
+	}
+	return $message;
+}
diff --git src/bp-members/bp-members-functions.php src/bp-members/bp-members-functions.php
index 925759030..8f7f5c55b 100644
--- src/bp-members/bp-members-functions.php
+++ src/bp-members/bp-members-functions.php
@@ -3046,3 +3046,275 @@ function bp_members_avatar_upload_dir( $directory = 'avatars', $user_id = 0 ) {
 		'error'   => false
 	) );
 }
+
+/**
+ * Get invitations to the BP community filtered by arguments.
+ *
+ * @since 7.0.0
+ *
+ * @param array $args     Invitation arguments.
+ *                        See BP_Invitation::get() for list.
+ *
+ * @return array $invites     Matching BP_Invitation objects.
+ */
+function bp_members_invitations_get_invites( $args = array() ) {
+	$invites_class = new BP_Members_Invitation_Manager();
+	return $invites_class->get_invitations( $args );
+}
+
+/**
+ * Invite a user to a BP community.
+ *
+ * @since 7.0.0
+ *
+ * @param array|string $args {
+ *     Array of arguments.
+ *     @type int    $invitee_email Email address of the user being invited.
+ *     @type int    $network_id    ID of the network to which the user is being invited.
+ *     @type int    $inviter_id    Optional. ID of the inviting user. Default:
+ *                                 ID of the logged-in user.
+ *     @type string $date_modified Optional. Modified date for the invitation.
+ *                                 Default: current date/time.
+ *     @type string $content       Optional. Message to invitee.
+ *     @type bool   $send_invite   Optional. Whether the invitation should be
+ *                                 sent now. Default: false.
+ * }
+ * @return bool True on success, false on failure.
+ */
+function bp_members_invitations_invite_user( $args ) {
+	$r = bp_parse_args( $args, array(
+		'invitee_email' => '',
+		'network_id'    => get_current_network_id(),
+		'inviter_id'    => bp_loggedin_user_id(),
+		'date_modified' => bp_core_current_time(),
+		'content'       => '',
+		'send_invite'   => 0
+	), 'community_invite_user' );
+
+	$inv_args = array(
+		'invitee_email' => $r['invitee_email'],
+		'item_id'       => $r['network_id'],
+		'inviter_id'    => $r['inviter_id'],
+		'date_modified' => $r['date_modified'],
+		'content'       => $r['content'],
+		'send_invite'   => $r['send_invite']
+	);
+
+	// Create the invitataion.
+	$invites_class = new BP_Members_Invitation_Manager();
+	$created       = $invites_class->add_invitation( $inv_args );
+
+	/**
+	 * Fires after the creation of a new network invite.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @param array    $r       Array of parsed arguments for the network invite.
+	 * @param int|bool $created The ID of the invitation or false if it couldn't be created.
+	 */
+	do_action( 'bp_members_invitations_invite_user', $r, $created );
+
+	return $created;
+}
+
+/**
+ * Resend a community invitation email by id.
+ *
+ * @since 7.0.0
+ *
+ * @param int $id ID of the invitation to resend.
+ * @return bool True on success, false on failure.
+ */
+function bp_members_invitation_resend_by_id( $id = 0 ) {
+
+	// Find the invitation before deleting it.
+	$existing_invite = new BP_Invitation( $id );
+	$invites_class   = new BP_Members_Invitation_Manager();
+	$success         = $invites_class->send_invitation_by_id( $id );
+
+	if ( ! $success ) {
+		return $success;
+	}
+
+	/**
+	 * Fires after the re-sending of a network invite.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @param BP_Invitation $existing_invite The invitation that was resent.
+	 */
+	do_action( 'bp_members_invitations_resend_invitation', $existing_invite );
+
+	return $success;
+}
+
+/**
+ * Delete a community invitation by id.
+ *
+ * @since 7.0.0
+ *
+ * @param int $id ID of the invitation to delete.
+ * @return int|bool Number of rows deleted on success, false on failure.
+ */
+function bp_members_invitations_delete_by_id( $id = 0 ) {
+
+	// Find the invitation before deleting it.
+	$existing_invite = new BP_Invitation( $id );
+	$invites_class   = new BP_Members_Invitation_Manager();
+	$success         = $invites_class->delete_by_id( $id );
+
+	if ( ! $success ) {
+		return $success;
+	}
+
+	// Run a different action depending on the status of the invite.
+	if ( ! $existing_invite->invite_sent ) {
+		/**
+		 * Fires after the deletion of an unsent community invite.
+		 *
+		 * @since 7.0.0
+		 *
+		 * @param BP_Invitation $existing_invite The invitation to be deleted.
+		 */
+		do_action( 'bp_members_invitations_canceled_invitation', $existing_invite );
+	} else if ( ! $existing_invite->accepted ) {
+		/**
+		 * Fires after the deletion of a sent, but not yet accepted, community invite.
+		 *
+		 * @since 7.0.0
+		 *
+		 * @param BP_Invitation $existing_invite The invitation to be deleted.
+		 */
+		do_action( 'bp_members_invitations_revoked_invitation', $existing_invite );
+	} else {
+		/**
+		 * Fires after the deletion of a sent and accepted community invite.
+		 *
+		 * @since 7.0.0
+		 *
+		 * @param BP_Invitation $existing_invite The invitation to be deleted.
+		 */
+		do_action( 'bp_members_invitations_deleted_invitation', $existing_invite );
+	}
+
+	return $success;
+}
+
+/**
+ * Delete a network invitation.
+ *
+ * @since 7.0.0
+ *
+ * @param intring $args {
+ *     Array of arguments.
+ *     @type int|array $id            Id(s) of the invitation(s) to remove.
+ *     @type int       $invitee_email Email address of the user being invited.
+ *     @type int       $network_id    ID of the network to which the user is being invited.
+ *     @type int       $inviter_id    ID of the inviting user.
+ *     @type int       $accepted      Whether the invitation has been accepted yet.
+ *     @type int       $invite_sent   Whether the invitation has been sent yet.
+ * }
+ * @return bool True if all were deleted.
+ */
+function bp_members_invitations_delete_invites( $args ) {
+	$r = bp_parse_args( $args, array(
+		'id'            => 0,
+ 		'invitee_email' => '',
+		'network_id'    => get_current_network_id(),
+		'inviter_id'    => null,
+		'accepted'      => null,
+		'invite_sent'   => null
+	), 'community_invitation_delete_invites' );
+
+	$inv_args = array(
+		'id'            => $r['id'],
+		'invitee_email' => $r['invitee_email'],
+		'item_id'       => $r['network_id'],
+		'inviter_id'    => $r['inviter_id'],
+	);
+
+	// Find the invitation(s).
+	$invites_class = new BP_Members_Invitation_Manager();
+	$invites       = $invites_class->get_invitations( $inv_args );
+	$total_count   = count( $invites );
+
+	// Loop through, deleting each invitation.
+	$deleted = 0;
+	foreach ( $invites as $invite ) {
+		$success = bp_members_invitations_delete_by_id( $invite->id );
+		if ( $success ) {
+			$deleted++;
+		}
+	}
+
+	return $deleted === $total_count;
+}
+
+/**
+ * Get hash based on details of a community invitation and the inviter.
+ *
+ * @since 7.0.0
+ *
+ * @param BP_Invitation object $invitation Invitation to create hash from.
+ *
+ * @return string $hash Calculated sha1 hash.
+ */
+function bp_members_invitations_get_hash( BP_Invitation $invitation ) {
+	$hash = false;
+
+	if ( ! empty( $invitation->id ) ) {
+		$inviter_ud = get_userdata( $invitation->inviter_id );
+		if ( $inviter_ud ) {
+			/*
+			 * Use some inviter details as part of the salt so that invitations from
+			 * users who are subsequently marked as spam will be invalidated.
+			 */
+			$hash = wp_hash( "{$invitation->inviter_id}:{$invitation->date_modified}", "{$inviter_ud->user_status}:{$inviter_ud->user_registered}" );
+		}
+	}
+
+	// If there's a problem, return a string that will change and thus fail.
+	if ( ! $hash ) {
+		$hash = wp_generate_password( 32, false );
+	}
+
+	/**
+	 * Filters the hash calculated by the invitation details.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @param string $hash Calculated sha1 hash.
+	 * @param BP_Invitation object $invitation Invitation hash was created from.
+	 */
+	return apply_filters( 'bp_members_invitations_get_hash', $hash, $invitation );
+}
+
+/**
+ * Get the current invitation specified by the $_GET parameters.
+ *
+ * @since 7.0.0
+ *
+ * @return BP_Invitation $invite Invitation specified by the $_GET parameters.
+ */
+function bp_get_members_invitation_from_request() {
+	$invites_class = new BP_Members_Invitation_Manager();
+	$invite        = $invites_class->get_by_id( 0 );
+
+	if ( bp_get_members_invitations_allowed() && ! empty( $_GET['inv'] ) ) {
+		// Check to make sure the passed hash matches a calculated hash.
+		$maybe_invite = $invites_class->get_by_id( absint( $_GET['inv'] ) );
+		$hash = bp_members_invitations_get_hash( $maybe_invite );
+		if ( $_GET['ih'] === $hash ) {
+			$invite = $maybe_invite;
+		}
+	}
+
+	/**
+	 * Filters the invitation specified by the $_GET parameters.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @param BP_Invitation $invite Invitation specified by the $_GET parameters.
+	 */
+	return apply_filters( 'bp_get_members_invitation_from_request', $invite );
+}
diff --git src/bp-members/bp-members-invitations.php src/bp-members/bp-members-invitations.php
new file mode 100644
index 000000000..a91d82377
--- /dev/null
+++ src/bp-members/bp-members-invitations.php
@@ -0,0 +1,148 @@
+<?php
+/**
+ * BuddyPress Member Activity
+ *
+ * @package BuddyPress
+ * @subpackage MembersActivity
+ * @since 2.2.0
+ */
+
+// Exit if accessed directly.
+defined( 'ABSPATH' ) || exit;
+
+function bp_members_invitations_setup_nav() {
+	if ( ! bp_get_members_invitations_allowed() ) {
+		return;
+	}
+
+	$user_has_access = bp_user_has_access() && bp_user_can( bp_displayed_user_id(), 'bp_members_send_invitation' );
+
+	/* Add 'Invitations' to the main user profile navigation */
+	bp_core_new_nav_item(
+		array(
+			'name'                    => __( 'Invitations', 'buddypress' ),
+			'slug'                    => bp_get_members_invitations_slug(),
+			'position'                => 80,
+			'screen_function'         => 'members_screen_send_invites',
+			'default_subnav_slug'     => 'list-invites',
+			'show_for_displayed_user' => $user_has_access
+		)
+	);
+
+	$parent_link = trailingslashit( bp_displayed_user_domain() . bp_get_members_invitations_slug() );
+
+	/* Create two subnav items for community invitations */
+	bp_core_new_subnav_item(
+		array(
+			'name'            => __( 'Sent Invites', 'buddypress' ),
+			'slug'            => 'list-invites',
+			'parent_slug'     => bp_get_members_invitations_slug(),
+			'parent_url'      => $parent_link,
+			'screen_function' => 'members_screen_list_sent_invites',
+			'position'        => 10,
+			'user_has_access' => $user_has_access
+		)
+	);
+
+	bp_core_new_subnav_item(
+		array(
+			'name'            => __( 'Invite New Members', 'buddypress' ),
+			'slug'            => 'send-invites',
+			'parent_slug'     => bp_get_members_invitations_slug(),
+			'parent_url'      => $parent_link,
+			'screen_function' => 'members_screen_send_invites',
+			'position'        => 20,
+			'user_has_access' => $user_has_access && bp_is_my_profile()
+		)
+	);
+}
+add_action( 'bp_setup_nav', 'bp_members_invitations_setup_nav' );
+
+/**
+ * When a user joins the network via an invitation, skip sending the activation email.
+ *
+ * @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).
+ */
+function bp_members_invitations_cancel_activation_email( $send, $user_id, $user_email, $activation_key, $usermeta ) {
+
+	$invite = bp_members_invitations_get_invites(
+		array(
+			'invitee_email' => $user_email,
+			'invite_sent'   => 'sent'
+		)
+	);
+
+	if ( $invite ) {
+		$send = false;
+	}
+
+	return $send;
+}
+add_filter( 'bp_core_signup_send_activation_key', 'bp_members_invitations_cancel_activation_email', 10, 5 );
+
+
+/**
+ * When a user joins the network via an invitation:
+ * - mark all invitations and requests as accepted
+ * - activate the user upon signup
+ *
+ * @param bool|WP_Error   $user_id       True on success, WP_Error on failure.
+ * @param string          $user_login    Login name requested by the user.
+ * @param string          $user_password Password requested by the user.
+ * @param string          $user_email    Email address requested by the user.
+ */
+function bp_members_invitations_complete_signup( $user_id, $user_login, $user_password, $user_email ) {
+	if ( ! $user_id ) {
+		return;
+	}
+
+	// Is this new signup the result of an invitation?
+	$invite = bp_members_invitations_get_invites(
+		array(
+			'invitee_email' => $user_email,
+			'invite_sent'   => 'sent'
+		)
+	);
+
+
+	if ( ! $invite ) {
+		return;
+	}
+
+	$invites_class = new BP_Members_Invitation_Manager();
+	$args = array(
+		'invitee_email' => $user_email,
+		'item_id'       => get_current_network_id(),
+		'type'          => 'all'
+	);
+	$invites_class->mark_accepted( $args );
+
+	// User has already verified their email by responding to the invitation, so we can activate.
+	$key = bp_get_user_meta( $user_id, 'activation_key', true );
+	if ( $key ) {
+		/**
+		 * Filters the activation signup.
+		 *
+		 * @since 1.1.0
+		 *
+		 * @param bool|int $value Value returned by activation.
+		 *                        Integer on success, boolean on failure.
+		 */
+		$user = apply_filters( 'bp_core_activate_account', bp_core_activate_signup( $key ) );
+
+		// If there were errors, add a message and redirect.
+		if ( ! empty( $user->errors ) ) {
+			bp_core_add_message( $user->get_error_message(), 'error' );
+			bp_core_redirect( trailingslashit( bp_get_root_domain() . '/' . $bp->pages->activate->slug ) );
+		}
+
+		bp_core_add_message( __( 'Your account is now active!', 'buddypress' ) );
+		bp_core_redirect( add_query_arg( 'activated', '1', bp_get_activation_page() ) );
+	}
+}
+add_action( 'bp_core_signup_user', 'bp_members_invitations_complete_signup', 10, 4 );
\ No newline at end of file
diff --git src/bp-members/bp-members-notifications.php src/bp-members/bp-members-notifications.php
new file mode 100644
index 000000000..c544e87d8
--- /dev/null
+++ src/bp-members/bp-members-notifications.php
@@ -0,0 +1,567 @@
+<?php
+/**
+ * BuddyPress Members Notification Functions.
+ *
+ * These functions handle the recording, deleting and formatting of notifications
+ * for the user and for this specific component.
+ *
+ * @package BuddyPress
+ * @subpackage Members
+ * @since 1.0.0
+ */
+
+// Exit if accessed directly.
+defined( 'ABSPATH' ) || exit;
+
+/** Emails ********************************************************************/
+
+/**
+ * Notify site admins about new membership request.
+ *
+ * @since 1.0.0
+ *
+ * @param int $requesting_user_id ID of the user requesting site membership.
+ * @param int $admin_id           ID of the site admin.
+ * @param int $invitation_id      ID of the network invitation object.
+ */
+function bp_members_new_membership_request( $requesting_user_id = 0, $admin_id = 0, $membership_id = 0 ) {
+
+	// @TODO
+	return;
+
+	// Trigger a BuddyPress Notification.
+	if ( bp_is_active( 'notifications' ) ) {
+		bp_notifications_add_notification( array(
+			'user_id'           => $admin_id,
+			'item_id'           => $group_id,
+			'secondary_item_id' => $requesting_user_id,
+			'component_name'    => buddypress()->members->id,
+			'component_action'  => 'new_membership_request',
+		) );
+	}
+
+	// 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',
+	);
+
+	$request_message = '';
+	$requests = groups_get_requests( $args = array(
+		'user_id'    => $requesting_user_id,
+		'item_id'    => $group_id,
+	) );
+	if ( $requests ) {
+		$request_message = current( $requests )->content;
+	}
+
+	$group = groups_get_group( $group_id );
+	$args  = array(
+		'tokens' => array(
+			'admin.id'             => $admin_id,
+			'group'                => $group,
+			'group.name'           => $group->name,
+			'group.id'             => $group_id,
+			'group-requests.url'   => esc_url( bp_get_group_permalink( $group ) . 'admin/membership-requests' ),
+			'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 ),
+			'request.message'      => $request_message,
+			'unsubscribe'          => esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) ),
+		),
+	);
+	bp_send_email( 'network-membership-request', (int) $admin_id, $args );
+}
+
+/**
+ * Notify member about their group membership request.
+ *
+ * @since 1.0.0
+ *
+ * @param int  $requesting_user_id ID of the user requesting group membership.
+ * @param int  $group_id           ID of the group.
+ * @param bool $accepted           Optional. Whether the membership request was accepted.
+ *                                 Default: true.
+ */
+function bp_members_membership_request_completed( $requesting_user_id = 0, $group_id = 0, $accepted = true ) {
+
+	// @TODO
+	return;
+
+	// Trigger a BuddyPress Notification.
+	if ( bp_is_active( 'notifications' ) ) {
+
+		// What type of acknowledgement.
+		$type = ! empty( $accepted ) ? 'membership_request_accepted' : 'membership_request_rejected';
+
+		bp_notifications_add_notification( array(
+			'user_id'           => $requesting_user_id,
+			'item_id'           => $group_id,
+			'component_name'    => buddypress()->groups->id,
+			'component_action'  => $type,
+		) );
+	}
+
+	// Bail if member opted out of receiving this email.
+	if ( 'no' === bp_get_user_meta( $requesting_user_id, 'notification_membership_request_completed', true ) ) {
+		return;
+	}
+
+	$group = groups_get_group( $group_id );
+	$args  = array(
+		'tokens' => array(
+			'group'              => $group,
+			'group.id'           => $group_id,
+			'group.name'         => $group->name,
+			'group.url'          => esc_url( bp_get_group_permalink( $group ) ),
+			'requesting-user.id' => $requesting_user_id,
+		),
+	);
+
+	if ( ! empty( $accepted ) ) {
+
+		$unsubscribe_args = array(
+			'user_id'           => $requesting_user_id,
+			'notification_type' => 'groups-membership-request-accepted',
+		);
+
+		$args['tokens']['unsubscribe'] = esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) );
+
+		bp_send_email( 'groups-membership-request-accepted', (int) $requesting_user_id, $args );
+
+	} else {
+
+		$unsubscribe_args = array(
+			'user_id'           => $requesting_user_id,
+			'notification_type' => 'groups-membership-request-rejected',
+		);
+
+		$args['tokens']['unsubscribe'] = esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) );
+
+		bp_send_email( 'groups-membership-request-rejected', (int) $requesting_user_id, $args );
+	}
+}
+// @TODO
+// add_action( 'groups_membership_accepted', 'groups_notification_membership_request_completed', 10, 3 );
+// add_action( 'groups_membership_rejected', 'groups_notification_membership_request_completed', 10, 3 );
+
+/** Notifications *************************************************************/
+
+/**
+ * Format notifications for the Groups component.
+ *
+ * @since 1.0.0
+ *
+ * @param string $action            The kind of notification being rendered.
+ * @param int    $item_id           The primary item ID.
+ * @param int    $secondary_item_id The secondary item ID.
+ * @param int    $total_items       The total number of messaging-related notifications
+ *                                  waiting for the user.
+ * @param string $format            'string' for BuddyBar-compatible notifications; 'array'
+ *                                  for WP Toolbar. Default: 'string'.
+ * @return string
+ */
+function bp_members_format_notifications( $action, $item_id, $secondary_item_id, $total_items, $format = 'string' ) {
+
+	// @TODO
+	switch ( $action ) {
+		case 'new_membership_request':
+			$group_id = $item_id;
+			$requesting_user_id = $secondary_item_id;
+
+			$group = groups_get_group( $group_id );
+			$group_link = bp_get_group_permalink( $group );
+			$amount = 'single';
+
+			// Set up the string and the filter
+			// because different values are passed to the filters,
+			// we'll return values inline.
+			if ( (int) $total_items > 1 ) {
+				$text = sprintf( __( '%1$d new membership requests for the group "%2$s"', 'buddypress' ), (int) $total_items, $group->name );
+				$amount = 'multiple';
+				$notification_link = $group_link . 'admin/membership-requests/?n=1';
+
+				if ( 'string' == $format ) {
+
+					/**
+					 * Filters groups multiple new membership request notification for string format.
+					 *
+					 * This is a dynamic filter that is dependent on item count and action.
+					 * Complete filter - bp_groups_multiple_new_membership_requests_notification.
+					 *
+					 * @since 1.0.0
+					 *
+					 * @param string $string            HTML anchor tag for request.
+					 * @param string $group_link        The permalink for the group.
+					 * @param int    $total_items       Total number of membership requests.
+					 * @param string $group->name       Name of the group.
+					 * @param string $text              Notification content.
+					 * @param string $notification_link The permalink for notification.
+					 */
+					return apply_filters( 'bp_groups_' . $amount . '_' . $action . 's_notification', '<a href="' . $notification_link . '">' . $text . '</a>', $group_link, $total_items, $group->name, $text, $notification_link );
+				} else {
+
+					/**
+					 * Filters groups multiple new membership request notification for any non-string format.
+					 *
+					 * This is a dynamic filter that is dependent on item count and action.
+					 * Complete filter - bp_groups_multiple_new_membership_requests_notification.
+					 *
+					 * @since 1.0.0
+					 *
+					 * @param array  $array             Array holding permalink and content for notification.
+					 * @param string $group_link        The permalink for the group.
+					 * @param int    $total_items       Total number of membership requests.
+					 * @param string $group->name       Name of the group.
+					 * @param string $text              Notification content.
+					 * @param string $notification_link The permalink for notification.
+					 */
+					return apply_filters( 'bp_groups_' . $amount . '_' . $action . 's_notification', array(
+						'link' => $notification_link,
+						'text' => $text
+					), $group_link, $total_items, $group->name, $text, $notification_link );
+				}
+			} else {
+				$user_fullname = bp_core_get_user_displayname( $requesting_user_id );
+				$text = sprintf( __( '%s requests group membership', 'buddypress' ), $user_fullname );
+				$notification_link = $group_link . 'admin/membership-requests/?n=1';
+
+				if ( 'string' == $format ) {
+
+					/**
+					 * Filters groups single new membership request notification for string format.
+					 *
+					 * This is a dynamic filter that is dependent on item count and action.
+					 * Complete filter - bp_groups_single_new_membership_request_notification.
+					 *
+					 * @since 1.0.0
+					 *
+					 * @param string $string            HTML anchor tag for request.
+					 * @param string $group_link        The permalink for the group.
+					 * @param string $user_fullname     Full name of requesting user.
+					 * @param string $group->name       Name of the group.
+					 * @param string $text              Notification content.
+					 * @param string $notification_link The permalink for notification.
+					 */
+					return apply_filters( 'bp_groups_' . $amount . '_' . $action . '_notification', '<a href="' . $notification_link . '">' . $text . '</a>', $group_link, $user_fullname, $group->name, $text, $notification_link );
+				} else {
+
+					/**
+					 * Filters groups single new membership request notification for any non-string format.
+					 *
+					 * This is a dynamic filter that is dependent on item count and action.
+					 * Complete filter - bp_groups_single_new_membership_request_notification.
+					 *
+					 * @since 1.0.0
+					 *
+					 * @param array  $array             Array holding permalink and content for notification.
+					 * @param string $group_link        The permalink for the group.
+					 * @param string $user_fullname     Full name of requesting user.
+					 * @param string $group->name       Name of the group.
+					 * @param string $text              Notification content.
+					 * @param string $notification_link The permalink for notification.
+					 */
+					return apply_filters( 'bp_groups_' . $amount . '_' . $action . '_notification', array(
+						'link' => $notification_link,
+						'text' => $text
+					), $group_link, $user_fullname, $group->name, $text, $notification_link );
+				}
+			}
+
+			break;
+
+		case 'membership_request_accepted':
+			$group_id = $item_id;
+
+			$group = groups_get_group( $group_id );
+			$group_link = bp_get_group_permalink( $group );
+			$amount = 'single';
+
+			if ( (int) $total_items > 1 ) {
+				$text = sprintf( __( '%d accepted group membership requests', 'buddypress' ), (int) $total_items, $group->name );
+				$amount = 'multiple';
+				$notification_link = trailingslashit( bp_loggedin_user_domain() . bp_get_groups_slug() ) . '?n=1';
+
+				if ( 'string' == $format ) {
+
+					/**
+					 * Filters multiple accepted group membership requests notification for string format.
+					 * Complete filter - bp_groups_multiple_membership_request_accepted_notification.
+					 *
+					 * @since 1.0.0
+					 *
+					 * @param string $string            HTML anchor tag for notification.
+					 * @param int    $total_items       Total number of accepted requests.
+					 * @param string $group->name       Name of the group.
+					 * @param string $text              Notification content.
+					 * @param string $notification_link The permalink for notification.
+					 */
+					return apply_filters( 'bp_groups_' . $amount . '_' . $action . '_notification', '<a href="' . $notification_link . '">' . $text . '</a>', $total_items, $group->name, $text, $notification_link );
+				} else {
+
+					/**
+					 * Filters multiple accepted group membership requests notification for non-string format.
+					 * Complete filter - bp_groups_multiple_membership_request_accepted_notification.
+					 *
+					 * @since 1.0.0
+					 *
+					 * @param array  $array             Array holding permalink and content for notification
+					 * @param int    $total_items       Total number of accepted requests.
+					 * @param string $group->name       Name of the group.
+					 * @param string $text              Notification content.
+					 * @param string $notification_link The permalink for notification.
+					 */
+					return apply_filters( 'bp_groups_' . $amount . '_' . $action . '_notification', array(
+						'link' => $notification_link,
+						'text' => $text
+					), $total_items, $group->name, $text, $notification_link );
+				}
+			} else {
+				$text = sprintf( __( 'Membership for group "%s" accepted', 'buddypress' ), $group->name );
+				$filter = 'bp_groups_single_membership_request_accepted_notification';
+				$notification_link = $group_link . '?n=1';
+
+				if ( 'string' == $format ) {
+
+					/**
+					 * Filters single accepted group membership request notification for string format.
+					 * Complete filter - bp_groups_single_membership_request_accepted_notification.
+					 *
+					 * @since 1.0.0
+					 *
+					 * @param string $string            HTML anchor tag for notification.
+					 * @param string $group_link        The permalink for the group.
+					 * @param string $group->name       Name of the group.
+					 * @param string $text              Notification content.
+					 * @param string $notification_link The permalink for notification.
+					 */
+					return apply_filters( 'bp_groups_' . $amount . '_' . $action . '_notification', '<a href="' . $notification_link . '">' . $text . '</a>', $group_link, $group->name, $text, $notification_link );
+				} else {
+
+					/**
+					 * Filters single accepted group membership request notification for non-string format.
+					 * Complete filter - bp_groups_single_membership_request_accepted_notification.
+					 *
+					 * @since 1.0.0
+					 *
+					 * @param array  $array             Array holding permalink and content for notification.
+					 * @param string $group_link        The permalink for the group.
+					 * @param string $group->name       Name of the group.
+					 * @param string $text              Notification content.
+					 * @param string $notification_link The permalink for notification.
+					 */
+					return apply_filters( $filter, array(
+						'link' => $notification_link,
+						'text' => $text
+					), $group_link, $group->name, $text, $notification_link );
+				}
+			}
+
+			break;
+
+		case 'membership_request_rejected':
+			$group_id = $item_id;
+
+			$group = groups_get_group( $group_id );
+			$group_link = bp_get_group_permalink( $group );
+			$amount = 'single';
+
+			if ( (int) $total_items > 1 ) {
+				$text = sprintf( __( '%d rejected group membership requests', 'buddypress' ), (int) $total_items, $group->name );
+				$amount = 'multiple';
+				$notification_link = trailingslashit( bp_loggedin_user_domain() . bp_get_groups_slug() ) . '?n=1';
+
+				if ( 'string' == $format ) {
+
+					/**
+					 * Filters multiple rejected group membership requests notification for string format.
+					 * Complete filter - bp_groups_multiple_membership_request_rejected_notification.
+					 *
+					 * @since 1.0.0
+					 *
+					 * @param string $string            HTML anchor tag for notification.
+					 * @param int    $total_items       Total number of rejected requests.
+					 * @param string $group->name       Name of the group.
+					 * @param string $text              Notification content.
+					 * @param string $notification_link The permalink for notification.
+					 */
+					return apply_filters( 'bp_groups_' . $amount . '_' . $action . '_notification', '<a href="' . $notification_link . '">' . $text . '</a>', $total_items, $group->name );
+				} else {
+
+					/**
+					 * Filters multiple rejected group membership requests notification for non-string format.
+					 * Complete filter - bp_groups_multiple_membership_request_rejected_notification.
+					 *
+					 * @since 1.0.0
+					 *
+					 * @param array  $array             Array holding permalink and content for notification.
+					 * @param int    $total_items       Total number of rejected requests.
+					 * @param string $group->name       Name of the group.
+					 * @param string $text              Notification content.
+					 * @param string $notification_link The permalink for notification.
+					 */
+					return apply_filters( 'bp_groups_' . $amount . '_' . $action . '_notification', array(
+						'link' => $notification_link,
+						'text' => $text
+					), $total_items, $group->name, $text, $notification_link );
+				}
+			} else {
+				$text = sprintf( __( 'Membership for group "%s" rejected', 'buddypress' ), $group->name );
+				$notification_link = $group_link . '?n=1';
+
+				if ( 'string' == $format ) {
+
+					/**
+					 * Filters single rejected group membership requests notification for string format.
+					 * Complete filter - bp_groups_single_membership_request_rejected_notification.
+					 *
+					 * @since 1.0.0
+					 *
+					 * @param string $string            HTML anchor tag for notification.
+					 * @param int    $group_link        The permalink for the group.
+					 * @param string $group->name       Name of the group.
+					 * @param string $text              Notification content.
+					 * @param string $notification_link The permalink for notification.
+					 */
+					return apply_filters( 'bp_groups_' . $amount . '_' . $action . '_notification', '<a href="' . $notification_link . '">' . $text . '</a>', $group_link, $group->name, $text, $notification_link );
+				} else {
+
+					/**
+					 * Filters single rejected group membership requests notification for non-string format.
+					 * Complete filter - bp_groups_single_membership_request_rejected_notification.
+					 *
+					 * @since 1.0.0
+					 *
+					 * @param array  $array             Array holding permalink and content for notification.
+					 * @param int    $group_link        The permalink for the group.
+					 * @param string $group->name       Name of the group.
+					 * @param string $text              Notification content.
+					 * @param string $notification_link The permalink for notification.
+					 */
+					return apply_filters( 'bp_groups_' . $amount . '_' . $action . '_notification', array(
+						'link' => $notification_link,
+						'text' => $text
+					), $group_link, $group->name, $text, $notification_link );
+				}
+			}
+
+			break;
+
+		default:
+
+			/**
+			 * Filters plugin-added group-related custom component_actions.
+			 *
+			 * @since 2.4.0
+			 *
+			 * @param string $notification      Null value.
+			 * @param int    $item_id           The primary item ID.
+			 * @param int    $secondary_item_id The secondary item ID.
+			 * @param int    $total_items       The total number of messaging-related notifications
+			 *                                  waiting for the user.
+			 * @param string $format            'string' for BuddyBar-compatible notifications;
+			 *                                  'array' for WP Toolbar.
+			 */
+			$custom_action_notification = apply_filters( 'bp_members_' . $action . '_notification', null, $item_id, $secondary_item_id, $total_items, $format );
+
+			if ( ! is_null( $custom_action_notification ) ) {
+				return $custom_action_notification;
+			}
+
+			break;
+	}
+
+	/**
+	 * Fires right before returning the formatted group notifications.
+	 *
+	 * @since 1.0.0
+	 *
+	 * @param string $action            The type of notification being rendered.
+	 * @param int    $item_id           The primary item ID.
+	 * @param int    $secondary_item_id The secondary item ID.
+	 * @param int    $total_items       Total amount of items to format.
+	 */
+	do_action( 'members_format_notifications', $action, $item_id, $secondary_item_id, $total_items );
+
+	return false;
+}
+
+/**
+ * Mark notifications read when a member's group membership request is granted.
+ *
+ * @since 2.8.0
+ *
+ * @param int $user_id  ID of the user.
+ * @param int $group_id ID of the group.
+ */
+function bp_members_accept_request_mark_notifications( $user_id, $group_id ) {
+	// @TODO
+	if ( bp_is_active( 'notifications' ) ) {
+		// First null parameter marks read for all admins.
+		bp_notifications_mark_notifications_by_item_id( null, $group_id, buddypress()->groups->id, 'new_membership_request', $user_id );
+	}
+}
+// @TODO
+// add_action( 'groups_membership_accepted', 'bp_groups_accept_request_mark_notifications', 10, 2 );
+// add_action( 'groups_membership_rejected', 'bp_groups_accept_request_mark_notifications', 10, 2 );
+
+/**
+ * Render the group settings fields on the Notification Settings page.
+ *
+ * @since 6.0.0
+ */
+function bp_members_screen_notification_settings() {
+
+	if ( ! bp_user_can( bp_displayed_user_id(), 'manage_network_membership_requests' ) ) {
+		return;
+	}
+
+	if ( ! $network_membership_request = bp_get_user_meta( bp_displayed_user_id(), 'notification_network_membership_request', true ) ) {
+		$network_membership_request = 'yes';
+	}
+
+	?>
+
+	<table class="notification-settings" id="bp-members-notification-settings">
+		<thead>
+			<tr>
+				<th class="icon"></th>
+				<th class="title"><?php _ex( 'Members', 'Member component settings on notification settings page', 'buddypress' ) ?></th>
+				<th class="yes"><?php _e( 'Yes', 'buddypress' ) ?></th>
+				<th class="no"><?php _e( 'No', 'buddypress' )?></th>
+			</tr>
+		</thead>
+
+		<tbody>
+			<tr id="bp-members-notification-settings-invitation">
+				<td></td>
+				<td><?php _ex( 'A user requests membership on this network', 'Member component settings on notification settings page','buddypress' ) ?></td>
+				<td class="yes"><input type="radio" name="notifications[notification_network_membership_request]" id="notification_network_membership_request-yes" value="yes" <?php checked( $network_membership_request, 'yes', true ) ?>/><label for="notification_network_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_network_membership_request]" id="notification_network_membership_request-no" value="no" <?php checked( $network_membership_request, 'no', true ) ?>/><label for="notification_network_membership_request-no" class="bp-screen-reader-text"><?php
+					/* translators: accessibility text */
+					_e( 'No, do not send email', 'buddypress' );
+				?></label></td>
+			</tr>
+
+			<?php
+
+			/**
+			 * Fires at the end of the available group settings fields on Notification Settings page.
+			 *
+			 * @since 6.0.0
+			 */
+			do_action( 'bp_members_screen_notification_settings' ); ?>
+
+		</tbody>
+	</table>
+
+<?php
+}
+add_action( 'bp_notification_settings', 'bp_members_screen_notification_settings' );
diff --git src/bp-members/bp-members-template.php src/bp-members/bp-members-template.php
index b6dac6b9e..a0bf4f5a2 100644
--- src/bp-members/bp-members-template.php
+++ src/bp-members/bp-members-template.php
@@ -274,6 +274,34 @@ function bp_activate_slug() {
 		return apply_filters( 'bp_get_activate_slug', $slug );
 	}
 
+/**
+ * Output the members invitation pane slug.
+ *
+ * @since 7.0.0
+ *
+ */
+function bp_members_invitations_slug() {
+	echo bp_get_members_invitations_slug();
+}
+	/**
+	 * Return the members invitations root slug.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @return string
+	 */
+	function bp_get_members_invitations_slug() {
+
+		/**
+		 * Filters the Members invitations pane root slug.
+		 *
+		 * @since 7.0.0
+		 *
+		 * @param string $slug Members invitations pane root slug.
+		 */
+		return apply_filters( 'bp_get_members_invitations_slug', _x( 'invitations', 'Member profile invitations pane URL base', 'buddypress' ) );
+	}
+
 /**
  * Initialize the members loop.
  *
@@ -2194,8 +2222,14 @@ function bp_signup_email_value() {
 	 */
 	function bp_get_signup_email_value() {
 		$value = '';
-		if ( isset( $_POST['signup_email'] ) )
+		if ( isset( $_POST['signup_email'] ) ) {
 			$value = $_POST['signup_email'];
+		} else if ( bp_get_members_invitations_allowed() ) {
+			$invite = bp_get_members_invitation_from_request();
+			if ( $invite ) {
+				$value = $invite->invitee_email;
+			}
+		}
 
 		/**
 		 * Filters the email address submitted during signup.
@@ -2568,6 +2602,24 @@ function bp_signup_allowed() {
 		return apply_filters( 'bp_get_signup_allowed', (bool) bp_get_option( 'users_can_register' ) );
 	}
 
+/**
+ * Are users allowed to invite users to join this site?
+ *
+ * @since 7.0.0
+ *
+ * @return bool
+ */
+function bp_get_members_invitations_allowed() {
+	/**
+	 * Filters whether or not community invitations are allowed.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @param bool $allowed Whether or not community invitations are allowed.
+	 */
+	return apply_filters( 'bp_get_members_invitations_allowed', bp_is_active( 'members', 'invitations' ) && (bool) bp_get_option( 'bp-enable-members-invitations' ) );
+}
+
 /**
  * Hook member activity feed to <head>.
  *
@@ -2674,3 +2726,538 @@ function bp_avatar_delete_link() {
 		 */
 		return apply_filters( 'bp_get_avatar_delete_link', wp_nonce_url( bp_displayed_user_domain() . bp_get_profile_slug() . '/change-avatar/delete-avatar/', 'bp_delete_avatar_link' ) );
 	}
+
+
+/** The Members Invitations Loop ******************************************************************/
+
+/**
+ * Initialize the community invitations loop.
+ *
+ * Based on the $args passed, bp_has_invitations() populates
+ * buddypress()->invitations->query_loop global, enabling the use of BP
+ * templates and template functions to display a list of invitations.
+ *
+ * @since 7.0.0
+ *
+ * @param array|string $args {
+ *     Arguments for limiting the contents of the invitations loop. Can be
+ *     passed as an associative array, or as a URL query string.
+ *
+ *     See {@link BP_Invitations_Invitation::get()} for detailed
+ *     information on the arguments.  In addition, also supports:
+ *
+ *     @type int    $max      Optional. Max items to display. Default: false.
+ *     @type string $page_arg URL argument to use for pagination.
+ *                            Default: 'ipage'.
+ * }
+ * @return bool
+ */
+function bp_has_members_invitations( $args = '' ) {
+
+	// Get the user ID.
+	if ( bp_displayed_user_id() ) {
+		$user_id = bp_displayed_user_id();
+	} else {
+		$user_id = bp_loggedin_user_id();
+	}
+
+	// Set the search terms (by default an empty string to get all notifications)
+	$search_terms = '';
+
+	if ( isset( $_REQUEST['s'] ) ) {
+		$search_terms = stripslashes( $_REQUEST['s'] );
+	}
+
+	// Parse the args.
+	$r = bp_parse_args( $args, array(
+		'id'                => false,
+		'inviter_id'        => $user_id,
+		'invitee_email'     => false,
+		'item_id'           => false,
+		'type'              => 'invite',
+		'invite_sent'       => 'all',
+		'accepted'          => 'pending',
+		'search_terms'      => $search_terms,
+		'order_by'          => 'date_modified',
+		'sort_order'        => 'DESC',
+		'page'              => 1,
+		'per_page'          => 25,
+		'fields'            => 'all',
+
+		// These are additional arguments that are not available in
+		// BP_Invitations_Invitation::get().
+		'page_arg'          => 'ipage',
+	), 'has_community_invitations' );
+
+	// Get the notifications.
+	$query_loop = new BP_Members_Invitations_Template( $r );
+
+	// Setup the global query loop.
+	buddypress()->members->invitations->query_loop = $query_loop;
+
+	/**
+	 * Filters whether or not the user has network invitations to display.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @param bool                      $value      Whether or not there are network invitations to display.
+	 * @param BP_Notifications_Template $query_loop BP_Members_Invitations_Template object instance.
+	 * @param array                     $r          Array of arguments passed into the BP_Members_Invitations_Template class.
+	 */
+	return apply_filters( 'bp_has_members_invitations', $query_loop->has_invitations(), $query_loop, $r );
+}
+
+/**
+ * Get the network invitations returned by the template loop.
+ *
+ * @since 7.0.0
+ *
+ * @return array List of network invitations.
+ */
+function bp_the_members_invitations() {
+	return buddypress()->members->invitations->query_loop->invitations();
+}
+
+/**
+ * Get the current network invitation object in the loop.
+ *
+ * @since 7.0.0
+ *
+ * @return object The current network invitation within the loop.
+ */
+function bp_the_members_invitation() {
+	return buddypress()->members->invitations->query_loop->the_invitation();
+}
+
+/**
+ * Output the pagination count for the current network invitations loop.
+ *
+ * @since 7.0.0
+ */
+function bp_members_invitations_pagination_count() {
+	echo bp_get_members_invitations_pagination_count();
+}
+	/**
+	 * Return the pagination count for the current network invitation loop.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @return string HTML for the pagination count.
+	 */
+	function bp_get_members_invitations_pagination_count() {
+		$query_loop = buddypress()->members->invitations->query_loop;
+		$start_num  = intval( ( $query_loop->pag_page - 1 ) * $query_loop->pag_num ) + 1;
+		$from_num   = bp_core_number_format( $start_num );
+		$to_num     = bp_core_number_format( ( $start_num + ( $query_loop->pag_num - 1 ) > $query_loop->total_invitation_count ) ? $query_loop->total_invitation_count : $start_num + ( $query_loop->pag_num - 1 ) );
+		$total      = bp_core_number_format( $query_loop->total_invitation_count );
+
+		if ( 1 == $query_loop->total_invitation_count ) {
+			$pag = __( 'Viewing 1 invitation', 'buddypress' );
+		} else {
+			/* translators: 1: notification from number. 2: notification to number. 3: total notifications. */
+			$pag = sprintf( _n( 'Viewing %1$s - %2$s of %3$s invitation', 'Viewing %1$s - %2$s of %3$s invitations', $query_loop->total_invitation_count, 'buddypress' ), $from_num, $to_num, $total );
+		}
+
+		/**
+		 * Filters the pagination count for the current network invitation loop.
+		 *
+		 * @since 1.9.0
+		 *
+		 * @param string $pag HTML for the pagination count.
+		 */
+		return apply_filters( 'bp_get_members_invitations_pagination_count', $pag );
+	}
+
+/**
+ * Output the pagination links for the current network invitation loop.
+ *
+ * @since 7.0.0
+ */
+function bp_members_invitations_pagination_links() {
+	echo bp_get_members_invitations_pagination_links();
+}
+	/**
+	 * Return the pagination links for the current network invitations loop.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @return string HTML for the pagination links.
+	 */
+	function bp_get_members_invitations_pagination_links() {
+
+		/**
+		 * Filters the pagination links for the current network invitations loop.
+		 *
+		 * @since 7.0.0
+		 *
+		 * @param string $pag_links HTML for the pagination links.
+		 */
+		return apply_filters( 'bp_get_members_invitations_pagination_links', buddypress()->members->invitations->query_loop->pag_links );
+	}
+
+/**
+ * Output the ID of the invitation currently being iterated on.
+ *
+ * @since 7.0.0
+ */
+function bp_the_members_invitation_property( $property ) {
+	echo bp_get_the_members_invitation_property( $property );
+}
+	/**
+	 * Return the value for a property of the network invitation currently being iterated on.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @return int ID of the current network invitation.
+	 */
+	function bp_get_the_members_invitation_property( $property = 'id' ) {
+
+		switch ( $property ) {
+			case 'id':
+			case 'user_id':
+			case 'item_id':
+			case 'secondary_item_id':
+			case 'invite_sent':
+			case 'accepted':
+				$value = 0;
+				break;
+			case 'invitee_email':
+			case 'type':
+			case 'content':
+			case 'date_modified':
+				$value = '';
+				break;
+			default:
+				// A known property has not been specified.
+				$property = null;
+				$value = '';
+				break;
+		}
+
+		if ( isset( buddypress()->members->invitations->query_loop->invitation->{$property} ) ) {
+			$value = buddypress()->members->invitations->query_loop->invitation->{$property};
+		}
+
+		/**
+		 * Filters the property of the network invitation currently being iterated on.
+		 *
+		 * @since 7.0.0
+		 *
+		 * @param int|string $value Property value of the network invitation being iterated on.
+		 */
+		return apply_filters( 'bp_get_the_members_invitation_property_' . $property, $value );
+	}
+
+/**
+ * Output the action links for the current invitation.
+ *
+ * @since 7.0.0
+ *
+ * @param array|string $args Array of arguments.
+ */
+function bp_the_members_invitation_action_links( $args = '' ) {
+	echo bp_get_the_members_invitation_action_links( $args );
+}
+	/**
+	 * Return the action links for the current invitation.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @param array|string $args {
+	 *     @type string $before  HTML before the links.
+	 *     @type string $after   HTML after the links.
+	 *     @type string $sep     HTML between the links.
+	 *     @type array  $links   Array of links to implode by 'sep'.
+	 *     @type int    $user_id User ID to fetch action links for. Defaults to displayed user ID.
+	 * }
+	 * @return string HTML links for actions to take on single notifications.
+	 */
+	function bp_get_the_members_invitation_action_links( $args = '' ) {
+		// Set default user ID to use.
+		$inviter_id = isset( $args['inviter_id'] ) ? $args['inviter_id'] : bp_displayed_user_id();
+
+		// Parse.
+		$r = wp_parse_args( $args, array(
+			'before' => '',
+			'after'  => '',
+			'sep'    => ' | ',
+			'links'  => array(
+				bp_get_the_members_invitation_resend_link( $inviter_id ),
+				bp_get_the_members_invitation_delete_link( $inviter_id )
+			)
+		) );
+
+		// Build the links.
+		$retval = $r['before'] . implode( $r['sep'], $r['links'] ) . $r['after'];
+
+		/**
+		 * Filters the action links for the current notification.
+		 *
+		 * @since 1.9.0
+		 * @since 2.6.0 Added the `$r` parameter.
+		 *
+		 * @param string $retval HTML links for actions to take on single notifications.
+		 * @param array  $r      Array of parsed arguments.
+		 */
+		return apply_filters( 'bp_get_the_members_invitation_action_links', $retval, $r );
+	}
+
+/**
+ * Output the resend link for the current invitation.
+ *
+ * @since 7.0.0
+ *
+ * @param int $user_id The user ID.
+ */
+function bp_the_members_invitations_resend_link( $user_id = 0 ) {
+	echo bp_get_the_members_invitation_delete_link( $user_id );
+}
+	/**
+	 * Return the resend link for the current notification.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @param int $user_id The user ID.
+	 * @return string
+	 */
+	function bp_get_the_members_invitation_resend_link( $user_id = 0 ) {
+		// Set default user ID to use.
+		$user_id = 0 === $user_id ? bp_displayed_user_id() : $user_id;
+
+		// Don't allow resending of accepted invitations.
+		if ( bp_get_the_members_invitation_property( 'accepted' ) ) {
+			return;
+		}
+
+		$retval = sprintf( '<a href="%1$s" class="resend secondary confirm bp-tooltip">%2$s</a>', esc_url( bp_get_the_members_invitations_resend_url( $user_id ) ), __( 'Resend', 'buddypress' ) );
+
+		/**
+		 * Filters the resend link for the current invitation.
+		 *
+		 * @since 7.0.0
+		 *
+		 * @param string $retval  HTML for the delete link for the current notification.
+		 * @param int    $user_id The user ID.
+		 */
+		return apply_filters( 'bp_get_the_members_invitation_resend_link', $retval, $user_id );
+	}
+
+/**
+ * Output the URL used for resending a single invitation.
+ *
+ * Since this function directly outputs a URL, it is escaped.
+ *
+ * @since 7.0.0
+ *
+ * @param int $user_id The user ID.
+ */
+function bp_the_members_invitations_resend_url( $user_id = 0 ) {
+	echo esc_url( bp_get_the_members_invitations_resend_url( $user_id ) );
+}
+	/**
+	 * Return the URL used for resending a single invitation.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @param int $user_id The user ID.
+	 * @return string
+	 */
+	function bp_get_the_members_invitations_resend_url( $user_id = 0 ) {
+		// Set default user ID to use.
+		$user_id = 0 === $user_id ? bp_displayed_user_id() : $user_id;
+		$link = bp_get_members_invitations_list_invites_permalink( $user_id );
+
+		// Get the ID.
+		$id = bp_get_the_members_invitation_property( 'id' );
+
+		// Get the args to add to the URL.
+		$args = array(
+			'action'        => 'resend',
+			'invitation_id' => $id
+		);
+
+		// Add the args.
+		$url = add_query_arg( $args, $link );
+
+		// Add the nonce.
+		$url = wp_nonce_url( $url, 'bp_network_invitation_resend_' . $id );
+
+		/**
+		 * Filters the URL used for resending a single invitation.
+		 *
+		 * @since 7.0.0
+		 *
+		 * @param string $url     URL used for deleting a single invitation.
+		 * @param int    $user_id The user ID.
+		 */
+		return apply_filters( 'bp_get_the_members_invitations_resend_url', $url, $user_id );
+	}
+
+/**
+ * Output the delete link for the current invitation.
+ *
+ * @since 7.0.0
+ *
+ * @param int $user_id The user ID.
+ */
+function bp_the_members_invitations_delete_link( $user_id = 0 ) {
+	echo bp_get_the_members_invitation_delete_link( $user_id );
+}
+	/**
+	 * Return the delete link for the current invitation.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @param int $user_id The user ID.
+	 * @return string
+	 */
+	function bp_get_the_members_invitation_delete_link( $user_id = 0 ) {
+		// Set default user ID to use.
+		$user_id = 0 === $user_id ? bp_displayed_user_id() : $user_id;
+
+		// Modify the message for accepted/not accepted invitatons.
+		if ( bp_get_the_members_invitation_property( 'accepted' ) ) {
+			$message = __( 'Delete', 'buddypress' );
+		} else {
+			$message = __( 'Cancel', 'buddypress' );
+		}
+
+		$retval = sprintf( '<a href="%1$s" class="delete secondary confirm bp-tooltip">%2$s</a>', esc_url( bp_get_the_members_invitations_delete_url( $user_id ) ), $message );
+
+		/**
+		 * Filters the delete link for the current invitation.
+		 *
+		 * @since 7.0.0
+		 *
+		 * @param string $retval  HTML for the delete link for the current notification.
+		 * @param int    $user_id The user ID.
+		 */
+		return apply_filters( 'bp_get_the_members_invitation_delete_link', $retval, $user_id );
+	}
+
+/**
+ * Output the URL used for deleting a single invitation.
+ *
+ * Since this function directly outputs a URL, it is escaped.
+ *
+ * @since 7.0.0
+ *
+ * @param int $user_id The user ID.
+ */
+function bp_the_members_invitations_delete_url( $user_id = 0 ) {
+	echo esc_url( bp_get_the_members_invitations_delete_url( $user_id ) );
+}
+	/**
+	 * Return the URL used for deleting a single invitation.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @param int $user_id The user ID.
+	 * @return string
+	 */
+	function bp_get_the_members_invitations_delete_url( $user_id = 0 ) {
+		// Set default user ID to use.
+		$user_id = 0 === $user_id ? bp_displayed_user_id() : $user_id;
+		$link = bp_get_members_invitations_list_invites_permalink( $user_id );
+
+		// Get the ID.
+		$id = bp_get_the_members_invitation_property( 'id' );
+
+		// Get the args to add to the URL.
+		$args = array(
+			'action'        => 'cancel',
+			'invitation_id' => $id
+		);
+
+		// Add the args.
+		$url = add_query_arg( $args, $link );
+
+		// Add the nonce.
+		$url = wp_nonce_url( $url, 'bp_members_invitations_cancel_' . $id );
+
+		/**
+		 * Filters the URL used for deleting a single invitation.
+		 *
+		 * @since 7.0.0
+		 *
+		 * @param string $url     URL used for deleting a single invitation.
+		 * @param int    $user_id The user ID.
+		 */
+		return apply_filters( 'bp_get_the_members_invitations_delete_url', $url, $user_id );
+	}
+
+/**
+ * Output the members invitations list permalink for a user.
+ *
+ * @since 7.0.0
+ *
+ * @param int $user_id The user ID.
+ */
+function bp_members_invitations_list_invites_permalink( $user_id = 0 ) {
+	echo bp_get_members_invitations_list_invites_permalink( $user_id );
+}
+	/**
+	 * Return the members invitations list permalink for a user.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @return string Members invitations list permalink for a user.
+	 */
+	function bp_get_members_invitations_list_invites_permalink( $user_id = 0 ) {
+		if ( 0 === $user_id ) {
+			$user_id = bp_loggedin_user_id();
+			$domain  = bp_loggedin_user_domain();
+		} else {
+			$domain = bp_core_get_user_domain( (int) $user_id );
+		}
+
+		$retval = trailingslashit( $domain . bp_get_members_invitations_slug() . '/list-invites' );
+
+		/**
+		 * Filters the members invitations list permalink for a user.
+		 *
+		 * @since 7.0.0
+		 *
+		 * @param string $retval  Permalink for the sent invitation list screen.
+		 * @param int    $user_id The user ID.
+		 */
+		return apply_filters( 'bp_get_members_invitations_list_invites_permalink', $retval, $user_id );
+	}
+
+/**
+ * Output the send invitation permalink for a user.
+ *
+ * @since 7.0.0
+ *
+ * @param int $user_id The user ID.
+ */
+function bp_members_invitations_send_invites_permalink( $user_id = 0 ) {
+	echo bp_get_members_invitations_send_invites_permalink( $user_id );
+}
+	/**
+	 * Return the send invitations permalink.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @return string Read notifications permalink.
+	 */
+	function bp_get_members_invitations_send_invites_permalink( $user_id = 0 ) {
+		if ( 0 === $user_id ) {
+			$user_id = bp_loggedin_user_id();
+			$domain  = bp_loggedin_user_domain();
+		} else {
+			$domain = bp_core_get_user_domain( (int) $user_id );
+		}
+
+		$retval = trailingslashit( $domain . bp_get_members_invitations_slug() . '/send-invites' );
+
+		/**
+		 * Filters the read notifications permalink.
+		 *
+		 * @since 7.0.0
+		 *
+		 * @param string $retval  Permalink for the sent invitation list screen.
+		 * @param int    $user_id The user ID.
+		 */
+		return apply_filters( 'bp_get_members_invitations_send_invites_permalink', $retval, $user_id );
+	}
\ No newline at end of file
diff --git src/bp-members/classes/class-bp-members-admin.php src/bp-members/classes/class-bp-members-admin.php
index 4846b8837..6ea9b3a4a 100644
--- src/bp-members/classes/class-bp-members-admin.php
+++ src/bp-members/classes/class-bp-members-admin.php
@@ -140,6 +140,8 @@ class BP_Members_Admin {
 		$this->users_url    = bp_get_admin_url( 'users.php' );
 		$this->users_screen = bp_core_do_network_admin() ? 'users-network' : 'users';
 
+		$this->members_invites_page = '';
+
 		// Specific config: BuddyPress is not network activated.
 		$this->subsite_activated = (bool) is_multisite() && ! bp_is_network_activated();
 
@@ -248,7 +250,9 @@ class BP_Members_Admin {
 	 * @param string $value
 	 */
 	public function multisite_registration_on( $option_name, $value ) {
-		if ( 'user' === $value || 'all' === $value ) {
+		// Is registration enabled or are network invitations enabled?
+		if ( ( 'user' === $value || 'all' === $value )
+			|| bp_get_members_invitations_allowed() ) {
 			bp_core_add_page_mappings( array(
 				'register' => 1,
 				'activate' => 1
@@ -266,7 +270,7 @@ class BP_Members_Admin {
 	 */
 	public function single_site_registration_on( $old_value, $value ) {
 		// Single site.
-		if ( ! is_multisite() && ! empty( $value ) ) {
+		if ( ! is_multisite() && ( ! empty( $value ) || bp_get_members_invitations_allowed() ) ) {
 			bp_core_add_page_mappings( array(
 				'register' => 1,
 				'activate' => 1
@@ -488,6 +492,15 @@ class BP_Members_Admin {
 				'bp-signups',
 				array( $this, 'signups_admin' )
 			);
+
+			// Manage invitations.
+			$hooks['members_invitations'] = $this->members_invites_page = add_users_page(
+				__( 'Manage Invitations',  'buddypress' ),
+				__( 'Manage Invitations',  'buddypress' ),
+				$this->capability,
+				'bp-members-invitations',
+				array( $this, 'invitations_admin' )
+			);
 		}
 
 		$edit_page         = 'user-edit';
@@ -509,6 +522,8 @@ class BP_Members_Admin {
 			$this->user_page    .= '-network';
 			$this->users_page   .= '-network';
 			$this->signups_page .= '-network';
+
+			$this->members_invites_page .= '-network';
 		}
 
 		// Setup the screen ID's.
@@ -2588,5 +2603,38 @@ class BP_Members_Admin {
 
 		return $value;
 	}
+
+	/**
+	 * Set up the signups admin page.
+	 *
+	 * Loaded before the page is rendered, this function does all initial
+	 * setup, including: processing form requests, registering contextual
+	 * help, and setting up screen options.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @global $bp_members_signup_list_table
+	 */
+	public function members_invitations_admin_load() {
+		// @TODO
+	}
+
+	/**
+	 * Network invitations admin page router.
+	 *
+	 * Depending on the context, display
+	 * - the list of invitations,
+	 * - or the delete confirmation screen,
+	 * - or the activate confirmation screen,
+	 * - or the "resend" email confirmation screen.
+	 *
+	 * Also prepare the admin notices.
+	 *
+	 * @since 7.0.0
+	 */
+	public function invitations_admin() {
+		// @TODO
+		echo "<p>Coming Soon? :)</p>";
+	}
 }
 endif; // End class_exists check.
diff --git src/bp-members/classes/class-bp-members-component.php src/bp-members/classes/class-bp-members-component.php
index daebb2ab2..2faf9723d 100644
--- src/bp-members/classes/class-bp-members-component.php
+++ src/bp-members/classes/class-bp-members-component.php
@@ -39,7 +39,8 @@ class BP_Members_Component extends BP_Component {
 			buddypress()->plugin_dir,
 			array(
 				'adminbar_myaccount_order' => 20,
-				'search_query_arg' => 'members_search',
+				'search_query_arg'         => 'members_search',
+				'features'                 => array( 'invitations' )
 			)
 		);
 	}
@@ -64,6 +65,8 @@ class BP_Members_Component extends BP_Component {
 			'blocks',
 			'widgets',
 			'cache',
+			'notifications',
+			'invitations',
 		);
 
 		if ( bp_is_active( 'activity' ) ) {
@@ -137,6 +140,15 @@ class BP_Members_Component extends BP_Component {
 			// Theme compatibility.
 			new BP_Registration_Theme_Compat();
 		}
+
+		// Invitations.
+		if ( is_user_logged_in() && bp_is_user_members_invitations() ) {
+			if ( bp_is_user_members_invitations_send_screen() ) {
+				require $this->path . 'bp-members/screens/send-invites.php';
+			} else {
+				require $this->path . 'bp-members/screens/list-invites.php';
+			}
+		}
 	}
 
 	/**
@@ -231,6 +243,11 @@ class BP_Members_Component extends BP_Component {
 			$bp->profile->slug = 'profile';
 			$bp->profile->id   = 'profile';
 		}
+
+		/** Network Invitations **************************************************
+		 */
+
+		$bp->members->invitations = new stdClass;
 	}
 
 	/**
@@ -466,7 +483,6 @@ class BP_Members_Component extends BP_Component {
 			}
 		}
 
-
 		parent::setup_nav( $main_nav, $sub_nav );
 	}
 
diff --git src/bp-members/classes/class-bp-members-invitation-manager.php src/bp-members/classes/class-bp-members-invitation-manager.php
new file mode 100644
index 000000000..11647fcfe
--- /dev/null
+++ src/bp-members/classes/class-bp-members-invitation-manager.php
@@ -0,0 +1,164 @@
+<?php
+/**
+ * Group invitations class.
+ *
+ * @package BuddyPress
+ * @subpackage Core
+ * @since 7.0.0
+ */
+
+// Exit if accessed directly.
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * Group invitations class.
+ *
+ * An extension of the core Invitations class that adapts the
+ * core logic to accommodate group invitation behavior.
+ *
+ * @since 7.0.0
+ */
+class BP_Members_Invitation_Manager extends BP_Invitation_Manager {
+	/**
+	 * Construct parameters.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @param array|string $args.
+	 */
+	public function __construct( $args = '' ) {
+		parent::__construct();
+	}
+
+	/**
+	 * This is where custom actions are added to run when notifications of an
+	 * invitation or request need to be generated & sent.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @param obj BP_Invitation $invitation The invitation to send.
+	 * @return bool True on success, false on failure.
+	 */
+	public function run_send_action( BP_Invitation $invitation ) {
+		// Notify site admins of the pending request
+		if ( 'request' === $invitation->type ) {
+			// @TODO
+			return true;
+		// Notify the invitee of the invitation.
+		} else {
+			$inviter_ud = bp_core_get_core_userdata( $invitation->inviter_id );
+
+			// @TODO: Handle unsubscribes differently since these are not members?
+			$unsubscribe_args = array(
+				'user_id'           => 0,
+				'notification_type' => 'bp-members-invitation',
+			);
+			$invite_url = esc_url(
+				add_query_arg(
+					array(
+						'inv' => $invitation->id,
+						'ih'  => bp_members_invitations_get_hash( $invitation ),
+					), bp_get_signup_page()
+				)
+			);
+
+			$args = array(
+				'tokens' => array(
+					'displayname'         => $invitation->invitee_email,
+					'network.url'         => get_site_url( bp_get_root_blog_id() ),
+					'network.name'        => get_bloginfo( 'name' ),
+					'network.description' => get_bloginfo( 'description' ),
+					'inviter.name'        => bp_core_get_userlink( $invitation->inviter_id, true, false, true ),
+					'inviter.url'         => bp_core_get_user_domain( $invitation->inviter_id ),
+					'inviter.id'          => $invitation->inviter_id,
+					'invites.url'         => esc_url( $invite_url ),
+					'invite.message'      => $invitation->content,
+					// @TODO: add unsubscribe method that isn't reliant on user being a member of the site.
+					// 'unsubscribe'         => esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) ),
+				),
+			);
+
+			return bp_send_email( 'bp-members-invitation', $invitation->invitee_email, $args );
+		}
+	}
+
+	/**
+	 * This is where custom actions are added to run when an invitation
+	 * or request is accepted.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @param string $type Are we accepting an invitation or request?
+	 * @param array  $r    Parameters that describe the invitation being accepted.
+	 * @return bool True on success, false on failure.
+	 */
+	public function run_acceptance_action( $type = 'invite', $r  ) {
+		// If the user is already a member (because BP at one point allowed two invitations to
+		// slip through), return early.
+
+		if ( 'request' === $type ) {
+			/**
+			 * Fires after a network membership request has been accepted.
+			 *
+			 * @since 1.0.0
+			 *
+			 * @param int  $user_id  ID of the user who accepted membership.
+			 * @param int  $group_id ID of the group that was accepted membership to.
+			 */
+			do_action( 'network_membership_request_accepted', $r['user_id'], $r['item_id'] );
+		} else {
+			/**
+			 * Fires after a user has accepted a group invite.
+			 *
+			 * @since 1.0.0
+			 * @since 2.8.0 The $inviter_id arg was added.
+			 *
+			 * @param int $user_id    ID of the user who accepted the membership invite.
+			 * @param int $inviter_id ID of the user who invited this user to the group.
+			 */
+			do_action( 'network_membership_invite_accepted', $r['user_id'], $inviter_id );
+		}
+
+
+		return true;
+	}
+
+	/**
+	 * Should this invitation be created?
+	 *
+	 * @since 7.0.0
+	 *
+	 * @param array $args.
+	 * @return bool
+	 */
+	public function allow_invitation( $args ) {
+		// Does the inviter have this capability?
+		if ( ! bp_user_can( $args['inviter_id'], 'bp_members_send_invitation' ) ) {
+			return false;
+		}
+
+		// Is the invited user eligible to receive an invitation? Hasn't opted out?
+		if ( ! bp_user_can( 0, 'bp_members_receive_invitation', $args ) ) {
+			return false;
+		}
+
+		return true;
+	}
+
+	/**
+	 * Should this request be created?
+	 *
+	 * @since 7.0.0
+	 *
+	 * @param array $args.
+	 * @return bool.
+	 */
+	public function allow_request( $args ) {
+		// Does the requester have this capability?
+		if ( ! bp_user_can( 0, 'bp_network_request_membership', $args ) ) {
+			return false;
+		}
+
+		return true;
+	}
+}
diff --git src/bp-members/classes/class-bp-members-invitations-list-table.php src/bp-members/classes/class-bp-members-invitations-list-table.php
new file mode 100644
index 000000000..dcdccc0b7
--- /dev/null
+++ src/bp-members/classes/class-bp-members-invitations-list-table.php
@@ -0,0 +1,413 @@
+<?php
+/**
+ * BuddyPress Members List Table class.
+ *
+ * @package BuddyPress
+ * @subpackage MembersAdminClasses
+ * @since 2.3.0
+ */
+
+// Exit if accessed directly.
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * List table class for signups admin page.
+ *
+ * @since 2.0.0
+ */
+class BP_Members_Invitations_List_Table extends WP_Users_List_Table {
+
+	/**
+	 * Signup counts.
+	 *
+	 * @since 2.0.0
+	 *
+	 * @var int
+	 */
+	public $total_items = 0;
+
+	/**
+	 * Constructor.
+	 *
+	 * @since 2.0.0
+	 */
+	public function __construct() {
+		// Define singular and plural labels, as well as whether we support AJAX.
+		parent::__construct( array(
+			'ajax'     => false,
+			'plural'   => 'invitations',
+			'singular' => 'invitation',
+			'screen'   => get_current_screen()->id,
+		) );
+	}
+
+	/**
+	 * Set up items for display in the list table.
+	 *
+	 * Handles filtering of data, sorting, pagination, and any other data
+	 * manipulation required prior to rendering.
+	 *
+	 * @since 2.0.0
+	 */
+	public function prepare_items() {
+		global $usersearch;
+
+		$search       = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : '';
+		$per_page = $this->get_items_per_page( str_replace( '-', '_', "{$this->screen->id}_per_page" ) );
+		$paged            = $this->get_pagenum();
+
+		$args = array(
+			'invite_sent'       => 'all',
+			'accepted'          => 'all',
+			'search_terms'      => $search,
+			'order_by'          => 'date_modified',
+			'sort_order'        => 'DESC',
+			'page'              => $paged,
+			'per_page'          => $per_page,
+		);
+
+		if ( isset( $_REQUEST['orderby'] ) ) {
+			$args['order_by'] = $_REQUEST['orderby'];
+		}
+
+		if ( isset( $_REQUEST['order'] ) ) {
+			$args['sort_order'] = $_REQUEST['order'];
+		}
+
+		$invites_class = new BP_Members_Invitation_Manager();
+		$this->items = $invites_class->get_invitations( $args );
+		$this->total_items = $invites_class->get_invitations_total_count( $args );
+
+		$this->set_pagination_args( array(
+			'total_items' => $this->total_items,
+			'per_page'    => $per_page,
+		) );
+	}
+
+	/**
+	 * Display the users screen views
+	 *
+	 * @since 2.5.0
+	 *
+	 * @global string $role The name of role the users screens is filtered by
+	 */
+	public function views() {
+		global $role;
+
+		// Used to reset the role.
+		$reset_role = $role;
+
+		// Temporarly set the role to registered.
+		$role = 'registered';
+
+		// Used to reset the screen id once views are displayed.
+		$reset_screen_id = $this->screen->id;
+
+		// Temporarly set the screen id to the users one.
+		$this->screen->id = 'users';
+
+		// Use the parent function so that other plugins can safely add views.
+		parent::views();
+
+		// Reset the role.
+		$role = $reset_role;
+
+		// Reset the screen id.
+		$this->screen->id = $reset_screen_id;
+	}
+
+	/**
+	 * Get rid of the extra nav.
+	 *
+	 * WP_Users_List_Table will add an extra nav to change user's role.
+	 * As we're dealing with signups, we don't need this.
+	 *
+	 * @since 2.0.0
+	 *
+	 * @param array $which Current table nav item.
+	 */
+	public function extra_tablenav( $which ) {
+		return;
+	}
+
+	/**
+	 * Specific signups columns.
+	 *
+	 * @since 2.0.0
+	 *
+	 * @return array
+	 */
+	public function get_columns() {
+
+		/**
+		 * Filters the single site Members signup columns.
+		 *
+		 * @since 2.0.0
+		 *
+		 * @param array $value Array of columns to display.
+		 */
+		return apply_filters( 'bp_members_signup_columns', array(
+			'cb'         => '<input type="checkbox" />',
+			'username'   => __( 'Username',    'buddypress' ),
+			'name'       => __( 'Name',        'buddypress' ),
+			'email'      => __( 'Email',       'buddypress' ),
+			'registered' => __( 'Registered',  'buddypress' ),
+			'date_sent'  => __( 'Last Sent',   'buddypress' ),
+			'count_sent' => __( 'Emails Sent', 'buddypress' )
+		) );
+	}
+
+	/**
+	 * Specific bulk actions for signups.
+	 *
+	 * @since 2.0.0
+	 */
+	public function get_bulk_actions() {
+		$actions = array(
+			'activate' => _x( 'Activate', 'Pending signup action', 'buddypress' ),
+			'resend'   => _x( 'Email',    'Pending signup action', 'buddypress' ),
+		);
+
+		if ( current_user_can( 'delete_users' ) ) {
+			$actions['delete'] = __( 'Delete', 'buddypress' );
+		}
+
+		return $actions;
+	}
+
+	/**
+	 * The text shown when no items are found.
+	 *
+	 * Nice job, clean sheet!
+	 *
+	 * @since 2.0.0
+	 */
+	public function no_items() {
+
+		if ( bp_get_signup_allowed() ) {
+			esc_html_e( 'No pending accounts found.', 'buddypress' );
+		} else {
+			$link = false;
+
+			// Specific case when BuddyPress is not network activated.
+			if ( is_multisite() && current_user_can( 'manage_network_users') ) {
+				$link = sprintf( '<a href="%1$s">%2$s</a>', esc_url( network_admin_url( 'settings.php'       ) ), esc_html__( 'Edit settings', 'buddypress' ) );
+			} elseif ( current_user_can( 'manage_options' ) ) {
+				$link = sprintf( '<a href="%1$s">%2$s</a>', esc_url( bp_get_admin_url( 'options-general.php' ) ), esc_html__( 'Edit settings', 'buddypress' ) );
+			}
+
+			/* translators: %s: url to site settings */
+			printf( __( 'Registration is disabled. %s', 'buddypress' ), $link );
+		}
+
+	}
+
+	/**
+	 * The columns signups can be reordered with.
+	 *
+	 * @since 2.0.0
+	 */
+	public function get_sortable_columns() {
+		return array(
+			'username'   => 'login',
+			'email'      => 'email',
+			'registered' => 'signup_id',
+		);
+	}
+
+	/**
+	 * Display signups rows.
+	 *
+	 * @since 2.0.0
+	 */
+	public function display_rows() {
+		$style = '';
+		foreach ( $this->items as $userid => $signup_object ) {
+
+			// Avoid a notice error appearing since 4.3.0.
+			if ( isset( $signup_object->id ) ) {
+				$signup_object->ID = $signup_object->id;
+			}
+
+			$style = ( ' class="alternate"' == $style ) ? '' : ' class="alternate"';
+			echo "\n\t" . $this->single_row( $signup_object, $style );
+		}
+	}
+
+	/**
+	 * Display a signup row.
+	 *
+	 * @since 2.0.0
+	 *
+	 * @see WP_List_Table::single_row() for explanation of params.
+	 *
+	 * @param object|null $signup_object Signup user object.
+	 * @param string      $style         Styles for the row.
+	 * @param string      $role          Role to be assigned to user.
+	 * @param int         $numposts      Numper of posts.
+	 * @return void
+	 */
+	public function single_row( $signup_object = null, $style = '', $role = '', $numposts = 0 ) {
+		echo '<tr' . $style . ' id="signup-' . esc_attr( $signup_object->id ) . '">';
+		echo $this->single_row_columns( $signup_object );
+		echo '</tr>';
+	}
+
+	/**
+	 * Markup for the checkbox used to select items for bulk actions.
+	 *
+	 * @since 2.0.0
+	 *
+	 * @param object|null $signup_object The signup data object.
+	 */
+	public function column_cb( $signup_object = null ) {
+	?>
+		<label class="screen-reader-text" for="signup_<?php echo intval( $signup_object->id ); ?>"><?php
+			/* translators: accessibility text */
+			printf( esc_html__( 'Select user: %s', 'buddypress' ), $signup_object->user_login );
+		?></label>
+		<input type="checkbox" id="signup_<?php echo intval( $signup_object->id ) ?>" name="allsignups[]" value="<?php echo esc_attr( $signup_object->id ) ?>" />
+		<?php
+	}
+
+	/**
+	 * The row actions (delete/activate/email).
+	 *
+	 * @since 2.0.0
+	 *
+	 * @param object|null $signup_object The signup data object.
+	 */
+	public function column_username( $signup_object = null ) {
+		$avatar	= get_avatar( $signup_object->user_email, 32 );
+
+		// Activation email link.
+		$email_link = add_query_arg(
+			array(
+				'page'	    => 'bp-signups',
+				'signup_id' => $signup_object->id,
+				'action'    => 'resend',
+			),
+			bp_get_admin_url( 'users.php' )
+		);
+
+		// Activate link.
+		$activate_link = add_query_arg(
+			array(
+				'page'      => 'bp-signups',
+				'signup_id' => $signup_object->id,
+				'action'    => 'activate',
+			),
+			bp_get_admin_url( 'users.php' )
+		);
+
+		// Delete link.
+		$delete_link = add_query_arg(
+			array(
+				'page'      => 'bp-signups',
+				'signup_id' => $signup_object->id,
+				'action'    => 'delete',
+			),
+			bp_get_admin_url( 'users.php' )
+		);
+
+		echo $avatar . sprintf( '<strong><a href="%1$s" class="edit">%2$s</a></strong><br/>', esc_url( $activate_link ), $signup_object->user_login );
+
+		$actions = array();
+
+		$actions['activate'] = sprintf( '<a href="%1$s">%2$s</a>', esc_url( $activate_link ), __( 'Activate', 'buddypress' ) );
+		$actions['resend']   = sprintf( '<a href="%1$s">%2$s</a>', esc_url( $email_link ), __( 'Email', 'buddypress' ) );
+
+		if ( current_user_can( 'delete_users' ) ) {
+			$actions['delete'] = sprintf( '<a href="%1$s" class="delete">%2$s</a>', esc_url( $delete_link ), __( 'Delete', 'buddypress' ) );
+		}
+
+		/**
+		 * Filters the multisite row actions for each user in list.
+		 *
+		 * @since 2.0.0
+		 *
+		 * @param array  $actions       Array of actions and corresponding links.
+		 * @param object $signup_object The signup data object.
+		 */
+		$actions = apply_filters( 'bp_members_ms_signup_row_actions', $actions, $signup_object );
+
+		echo $this->row_actions( $actions );
+	}
+
+	/**
+	 * Display user name, if any.
+	 *
+	 * @since 2.0.0
+	 *
+	 * @param object|null $signup_object The signup data object.
+	 */
+	public function column_name( $signup_object = null ) {
+		echo esc_html( $signup_object->user_name );
+	}
+
+	/**
+	 * Display user email.
+	 *
+	 * @since 2.0.0
+	 *
+	 * @param object|null $signup_object The signup data object.
+	 */
+	public function column_email( $signup_object = null ) {
+		printf( '<a href="mailto:%1$s">%2$s</a>', esc_attr( $signup_object->user_email ), esc_html( $signup_object->user_email ) );
+	}
+
+	/**
+	 * Display registration date.
+	 *
+	 * @since 2.0.0
+	 *
+	 * @param object|null $signup_object The signup data object.
+	 */
+	public function column_registered( $signup_object = null ) {
+		echo mysql2date( 'Y/m/d', $signup_object->registered );
+	}
+
+	/**
+	 * Display the last time an activation email has been sent.
+	 *
+	 * @since 2.0.0
+	 *
+	 * @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 );
+	}
+
+	/**
+	 * Display number of time an activation email has been sent.
+	 *
+	 * @since 2.0.0
+	 *
+	 * @param object|null $signup_object Signup object instance.
+	 */
+	public function column_count_sent( $signup_object = null ) {
+		echo absint( $signup_object->count_sent );
+	}
+
+	/**
+	 * Allow plugins to add their custom column.
+	 *
+	 * @since 2.1.0
+	 *
+	 * @param object|null $signup_object The signup data object.
+	 * @param string      $column_name   The column name.
+	 * @return string
+	 */
+	function column_default( $signup_object = null, $column_name = '' ) {
+
+		/**
+		 * Filters the single site custom columns for plugins.
+		 *
+		 * @since 2.1.0
+		 *
+		 * @param string $column_name   The column name.
+		 * @param object $signup_object The signup data object.
+		 */
+		return apply_filters( 'bp_members_signup_custom_column', '', $column_name, $signup_object );
+	}
+}
diff --git src/bp-members/classes/class-bp-members-invitations-template.php src/bp-members/classes/class-bp-members-invitations-template.php
new file mode 100644
index 000000000..b8fcebd76
--- /dev/null
+++ src/bp-members/classes/class-bp-members-invitations-template.php
@@ -0,0 +1,348 @@
+<?php
+/**
+ * BuddyPress Members Invitation Template Loop Class.
+ *
+ * @package BuddyPress
+ * @subpackage TonificationsTemplate
+ * @since 1.9.0
+ */
+
+// Exit if accessed directly.
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * The main network_invitations template loop class.
+ *
+ * Responsible for loading a group of network_invitations into a loop for display.
+ *
+ * @since 1.9.0
+ */
+class BP_Members_Invitations_Template {
+
+	/**
+	 * The loop iterator.
+	 *
+	 * @since 1.9.0
+	 * @var int
+	 */
+	public $current_invitation = -1;
+
+	/**
+	 * The number of network_invitations returned by the paged query.
+	 *
+	 * @since 1.9.0
+	 * @var int
+	 */
+	public $current_invitation_count;
+
+	/**
+	 * Total number of network_invitations matching the query.
+	 *
+	 * @since 1.9.0
+	 * @var int
+	 */
+	public $total_invitation_count;
+
+	/**
+	 * Array of network invitations located by the query.
+	 *
+	 * @since 1.9.0
+	 * @var array
+	 */
+	public $invitations;
+
+	/**
+	 * The invitation object currently being iterated on.
+	 *
+	 * @since 1.9.0
+	 * @var object
+	 */
+	public $invitation;
+
+	/**
+	 * A flag for whether the loop is currently being iterated.
+	 *
+	 * @since 1.9.0
+	 * @var bool
+	 */
+	public $in_the_loop;
+
+	/**
+	 * The ID of the user to whom the displayed network_invitations were sent.
+	 *
+	 * @since 1.9.0
+	 * @var int
+	 */
+	public $user_id;
+
+	/**
+	 * The ID of the user to whom the displayed network_invitations belong.
+	 *
+	 * @since 1.9.0
+	 * @var int
+	 */
+	public $inviter_id;
+
+	/**
+	 * The page number being requested.
+	 *
+	 * @since 1.9.0
+	 * @var int
+	 */
+	public $pag_page;
+
+	/**
+	 * The $_GET argument used in URLs for determining pagination.
+	 *
+	 * @since 1.9.0
+	 * @var int
+	 */
+	public $pag_arg;
+
+	/**
+	 * The number of items to display per page of results.
+	 *
+	 * @since 1.9.0
+	 * @var int
+	 */
+	public $pag_num;
+
+	/**
+	 * An HTML string containing pagination links.
+	 *
+	 * @since 1.9.0
+	 * @var string
+	 */
+	public $pag_links;
+
+	/**
+	 * A string to match against.
+	 *
+	 * @since 1.9.0
+	 * @var string
+	 */
+	public $search_terms;
+
+	/**
+	 * A database column to order the results by.
+	 *
+	 * @since 1.9.0
+	 * @var string
+	 */
+	public $order_by;
+
+	/**
+	 * The direction to sort the results (ASC or DESC).
+	 *
+	 * @since 1.9.0
+	 * @var string
+	 */
+	public $sort_order;
+
+	/**
+	 * Array of variables used in this invitation query.
+	 *
+	 * @since 2.2.2
+	 * @var array
+	 */
+	public $query_vars;
+
+	/**
+	 * Constructor method.
+	 *
+	 * @see bp_has_members_invitations() For information on the array format.
+	 *
+	 * @since 1.9.0
+	 *
+	 * @param array $args {
+	 *     An array of arguments. See {@link bp_has_members_invitations()}
+	 *     for more details.
+	 * }
+	 */
+	public function __construct( $args = array() ) {
+
+		// Parse arguments.
+		$r = wp_parse_args( $args, array(
+			'id'                => false,
+			'user_id'           => false,
+			'inviter_id'        => false,
+			'invitee_email'     => false,
+			'item_id'           => false,
+			'type'              => 'invite',
+			'invite_sent'       => 'all',
+			'accepted'          => 'all',
+			'search_terms'      => '',
+			'order_by'          => 'date_modified',
+			'sort_order'        => 'DESC',
+			'page'              => 1,
+			'per_page'          => 25,
+			'fields'            => 'all',
+			'page_arg'          => 'ipage',
+		) );
+
+		// Sort order direction.
+		$orders = array( 'ASC', 'DESC' );
+		if ( ! empty( $_GET['sort_order'] ) && in_array( $_GET['sort_order'], $orders ) ) {
+			$r['sort_order'] = $_GET['sort_order'];
+		} else {
+			$r['sort_order'] = in_array( $r['sort_order'], $orders ) ? $r['sort_order'] : 'DESC';
+		}
+
+		// Setup variables.
+		$this->pag_arg      = sanitize_key( $r['page_arg'] );
+		$this->pag_page     = bp_sanitize_pagination_arg( $this->pag_arg, $r['page']     );
+		$this->pag_num      = bp_sanitize_pagination_arg( 'num',          $r['per_page'] );
+		$this->user_id      = $r['user_id'];
+		$this->search_terms = $r['search_terms'];
+		$this->order_by     = $r['order_by'];
+		$this->sort_order   = $r['sort_order'];
+		$this->query_vars   = array(
+			'id'                => $r['id'],
+			'user_id'           => $r['user_id'],
+			'inviter_id'        => $r['inviter_id'],
+			'invitee_email'     => $r['invitee_email'],
+			'item_id'           => $r['item_id'],
+			'type'              => $r['type'],
+			'invite_sent'       => $r['invite_sent'],
+			'accepted'          => $r['accepted'],
+			'search_terms'      => $this->search_terms,
+			'order_by'          => $this->order_by,
+			'sort_order'        => $this->sort_order,
+			'page'              => $this->pag_page,
+			'per_page'          => $this->pag_num,
+		);
+
+		// Setup the network_invitations to loop through.
+		$invites_class = new BP_Members_Invitation_Manager();
+
+		$this->invitations              = $invites_class->get_invitations( $this->query_vars );
+		$this->current_invitation_count = count( $this->invitations );
+		$this->total_invitation_count   = $invites_class->get_invitations_total_count( $this->query_vars );
+
+		if ( (int) $this->total_invitation_count && (int) $this->pag_num ) {
+			$add_args = array(
+				'sort_order' => $this->sort_order,
+			);
+
+			$this->pag_links = paginate_links( array(
+				'base'      => add_query_arg( $this->pag_arg, '%#%' ),
+				'format'    => '',
+				'total'     => ceil( (int) $this->total_invitation_count / (int) $this->pag_num ),
+				'current'   => $this->pag_page,
+				'prev_text' => _x( '&larr;', 'Network invitation pagination previous text', 'buddypress' ),
+				'next_text' => _x( '&rarr;', 'Network invitation pagination next text',     'buddypress' ),
+				'mid_size'  => 1,
+				'add_args'  => $add_args,
+			) );
+		}
+	}
+
+	/**
+	 * Whether there are network_invitations available in the loop.
+	 *
+	 * @since 1.9.0
+	 *
+	 * @see bp_has_members_invitations()
+	 *
+	 * @return bool True if there are items in the loop, otherwise false.
+	 */
+	public function has_invitations() {
+		if ( $this->current_invitation_count ) {
+			return true;
+		}
+
+		return false;
+	}
+
+	/**
+	 * Set up the next invitation and iterate index.
+	 *
+	 * @since 1.9.0
+	 *
+	 * @return object The next invitation to iterate over.
+	 */
+	public function next_invitation() {
+
+		$this->current_invitation++;
+
+		$this->invitation = $this->invitations[ $this->current_invitation ];
+
+		return $this->invitation;
+	}
+
+	/**
+	 * Rewind the blogs and reset blog index.
+	 *
+	 * @since 1.9.0
+	 */
+	public function rewind_invitations() {
+
+		$this->current_invitation = -1;
+
+		if ( $this->current_invitation_count > 0 ) {
+			$this->invitation = $this->invitations[0];
+		}
+	}
+
+	/**
+	 * Whether there are network_invitations left in the loop to iterate over.
+	 *
+	 * This method is used by {@link bp_network_invitations()} as part of the
+	 * while loop that controls iteration inside the network_invitations loop, eg:
+	 *     while ( bp_network_invitations() ) { ...
+	 *
+	 * @since 1.9.0
+	 *
+	 * @see bp_network_invitations()
+	 *
+	 * @return bool True if there are more network_invitations to show,
+	 *              otherwise false.
+	 */
+	public function invitations() {
+
+		if ( $this->current_invitation + 1 < $this->current_invitation_count ) {
+			return true;
+
+		} elseif ( $this->current_invitation + 1 == $this->current_invitation_count ) {
+
+			/**
+			 * Fires right before the rewinding of invitation posts.
+			 *
+			 * @since 1.9.0
+			 */
+			do_action( 'network_invitations_loop_end');
+
+			$this->rewind_invitations();
+		}
+
+		$this->in_the_loop = false;
+		return false;
+	}
+
+	/**
+	 * Set up the current invitation inside the loop.
+	 *
+	 * Used by {@link bp_the_invitation()} to set up the current
+	 * invitation data while looping, so that template tags used during
+	 * that iteration make reference to the current invitation.
+	 *
+	 * @since 1.9.0
+	 *
+	 * @see bp_the_invitation()
+	 */
+	public function the_invitation() {
+		$this->in_the_loop  = true;
+		$this->invitation = $this->next_invitation();
+
+		// Loop has just started.
+		if ( 0 === $this->current_invitation ) {
+
+			/**
+			 * Fires if the current invitation item is the first in the invitation loop.
+			 *
+			 * @since 1.9.0
+			 */
+			do_action( 'network_invitations_loop_start' );
+		}
+	}
+}
diff --git src/bp-members/screens/list-invites.php src/bp-members/screens/list-invites.php
new file mode 100644
index 000000000..d1eeddd8f
--- /dev/null
+++ src/bp-members/screens/list-invites.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ * Members: Sent Invitations Status
+ *
+ * @package BuddyPress
+ * @subpackage MembersScreens
+ * @since 6.0.0
+ */
+
+/**
+ * Catch and process the Send Invites page.
+ *
+ * @since 1.0.0
+ */
+function members_screen_list_sent_invites() {
+
+	/**
+	 * Fires before the loading of template for the My Friends page.
+	 *
+	 * @since 1.0.0
+	 */
+	do_action( 'members_screen_list_sent_invites' );
+
+	/**
+	 * Filters the template used to display the My Friends page.
+	 *
+	 * @since 1.0.0
+	 *
+	 * @param string $template Path to the my friends template to load.
+	 */
+	bp_core_load_template( apply_filters( 'members_template_list_sent_invites', 'members/single/invitations' ) );
+}
+
+/**
+ * Handle marking single notifications as unread.
+ *
+ * @since 1.9.0
+ *
+ * @return bool
+ */
+function bp_network_invitations_action_handling() {
+
+	// Bail if not the read screen.
+	if ( ! bp_is_user_members_invitations_list() ) {
+		return false;
+	}
+
+	// Get the action.
+	$action = ! empty( $_GET['action']          ) ? $_GET['action']          : '';
+	$nonce  = ! empty( $_GET['_wpnonce']        ) ? $_GET['_wpnonce']        : '';
+	$id     = ! empty( $_GET['invitation_id']   ) ? $_GET['invitation_id']   : '';
+
+	// Bail if no action or no ID.
+	if ( empty( $action ) || empty( $id ) ) {
+		return false;
+	}
+
+	if ( 'cancel' === $action ) {
+		// Check the nonce and delete the invitation.
+		if ( bp_verify_nonce_request( 'bp_members_invitations_cancel_' . $id ) && bp_members_invitations_delete_by_id( $id ) ) {
+			bp_core_add_message( __( 'Invitation successfully canceled.', 'buddypress' )          );
+		} else {
+			bp_core_add_message( __( 'There was a problem canceling that invitation.', 'buddypress' ), 'error' );
+		}
+	} else if ( 'resend' === $action ) {
+		// Check the nonce and resend the invitation.
+		if ( bp_verify_nonce_request( 'bp_network_invitation_resend_' . $id ) && bp_members_invitation_resend_by_id( $id ) ) {
+			bp_core_add_message( __( 'Invitation successfully resent.', 'buddypress' )          );
+		} else {
+			bp_core_add_message( __( 'There was a problem resending that invitation.', 'buddypress' ), 'error' );
+		}
+	} else {
+		return false;
+	}
+
+	// Redirect.
+	$user_id = bp_displayed_user_id();
+	bp_core_redirect( bp_get_members_invitations_list_invites_permalink( $user_id ) );
+}
+add_action( 'bp_actions', 'bp_network_invitations_action_handling' );
diff --git src/bp-members/screens/register.php src/bp-members/screens/register.php
index f954f3f41..5cb76a097 100644
--- src/bp-members/screens/register.php
+++ src/bp-members/screens/register.php
@@ -42,9 +42,18 @@ function bp_core_screen_signup() {
 
 	$bp->signup->step = 'request-details';
 
-	if ( !bp_get_signup_allowed() ) {
-		$bp->signup->step = 'registration-disabled';
+	// Could the user be accepting an invitation?
+	$active_invite = false;
+	if ( bp_get_members_invitations_allowed() ) {
+		// Check to see if there's a valid invitation.
+		$maybe_invite = bp_get_members_invitation_from_request();
+		if ( $maybe_invite->id ) {
+			$active_invite = true;
+		}
+	}
 
+	if ( ! bp_get_signup_allowed() && ! $active_invite ) {
+		$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-members/screens/send-invites.php src/bp-members/screens/send-invites.php
new file mode 100644
index 000000000..61ddc0d3f
--- /dev/null
+++ src/bp-members/screens/send-invites.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Members: Send Invitations
+ *
+ * @package BuddyPress
+ * @subpackage MembersScreens
+ * @since 3.0.0
+ */
+
+/**
+ * Catch and process the Send Invites page.
+ *
+ * @since 1.0.0
+ */
+function members_screen_send_invites() {
+
+	/**
+	 * Fires before the loading of template for the My Friends page.
+	 *
+	 * @since 1.0.0
+	 */
+	do_action( 'members_screen_send_invites' );
+
+	/**
+	 * Filters the template used to display the My Friends page.
+	 *
+	 * @since 1.0.0
+	 *
+	 * @param string $template Path to the my friends template to load.
+	 */
+	bp_core_load_template( apply_filters( 'members_template_send_invites', 'members/single/invitations' ) );
+}
+
+/**
+ * Handle marking single notifications as unread.
+ *
+ * @since 1.9.0
+ *
+ * @return bool
+ */
+function bp_network_invitations_catch_send_action() {
+
+	// Bail if not the read screen.
+	if ( ! bp_is_user_members_invitations_send_screen() ) {
+		return false;
+	}
+
+	// Get the action.
+	$action  = ! empty( $_REQUEST['action']          ) ? $_REQUEST['action']          : '';
+	$nonce   = ! empty( $_REQUEST['_wpnonce']        ) ? $_REQUEST['_wpnonce']        : '';
+	$email   = ! empty( $_REQUEST['invitee_email']   ) ? $_REQUEST['invitee_email']   : '';
+	$message = ! empty( $_REQUEST['invite_message']  ) ? $_REQUEST['invite_message']  : '';
+
+	// Bail if missing required info.
+	if ( ( 'send-invite' !== $action ) ) {
+		return false;
+	}
+
+	$invite_args = array(
+		'invitee_email' => $email,
+		'inviter_id'    => bp_displayed_user_id(),
+		'content'       => $message,
+		'send_invite'   => 1
+	);
+
+	// Check the nonce and delete the invitation.
+	if ( bp_verify_nonce_request( 'bp_network_invitation_send_' . bp_displayed_user_id() ) && bp_members_invitations_invite_user( $invite_args ) ) {
+		bp_core_add_message( __( 'Invitation successfully sent!', 'buddypress' )          );
+	} else {
+		bp_core_add_message( __( 'There was a problem sending that invitation.', 'buddypress' ), 'error' );
+	}
+
+	// Redirect.
+	$user_id = bp_displayed_user_id();
+	bp_core_redirect( bp_get_members_invitations_send_invites_permalink( $user_id ) );
+}
+add_action( 'bp_actions', 'bp_network_invitations_catch_send_action' );
\ No newline at end of file
diff --git src/bp-templates/bp-legacy/buddypress-functions.php src/bp-templates/bp-legacy/buddypress-functions.php
index f4a3e1016..e3d0f63fb 100644
--- src/bp-templates/bp-legacy/buddypress-functions.php
+++ src/bp-templates/bp-legacy/buddypress-functions.php
@@ -2014,3 +2014,36 @@ function bp_legacy_theme_group_manage_members_add_search() {
 		<?php
 	endif;
 }
+
+/**
+ * Modify welcome message in Legacy template pack when
+ * community invitations are enabled.
+ *
+ * @since 7.0.0
+ *
+ * @return string $message The message text.
+ */
+function bp_members_invitations_add_legacy_welcome_message() {
+	$message = bp_members_invitations_get_registration_welcome_message();
+	if ( $message ) {
+		echo '<p>' . esc_html( $message ) . '</p>';
+	}
+}
+add_action( 'bp_before_register_page', 'bp_members_invitations_add_legacy_welcome_message' );
+
+
+/**
+ * Modify "registration disabled" message in Legacy template pack when
+ * community invitations are enabled.
+ *
+ * @since 7.0.0
+ *
+ * @return string $message The message text.
+ */
+function bp_members_invitations_add_legacy_registration_disabled_message() {
+	$message = bp_members_invitations_get_modified_registration_disabled_message();
+	if ( $message ) {
+		echo '<p>' . esc_html( $message ) . '</p>';
+	}
+}
+add_action( 'bp_after_registration_disabled', 'bp_members_invitations_add_legacy_registration_disabled_message' );
diff --git src/bp-templates/bp-legacy/buddypress/members/single/home.php src/bp-templates/bp-legacy/buddypress/members/single/home.php
index f56af6e9c..bed9da1bf 100644
--- src/bp-templates/bp-legacy/buddypress/members/single/home.php
+++ src/bp-templates/bp-legacy/buddypress/members/single/home.php
@@ -89,6 +89,9 @@
 		elseif ( bp_is_user_notifications() ) :
 			bp_get_template_part( 'members/single/notifications' );
 
+		elseif ( bp_is_user_members_invitations() ) :
+			bp_get_template_part( 'members/single/invitations' );
+
 		elseif ( bp_is_user_settings() ) :
 			bp_get_template_part( 'members/single/settings' );
 
diff --git src/bp-templates/bp-legacy/buddypress/members/single/invitations.php src/bp-templates/bp-legacy/buddypress/members/single/invitations.php
new file mode 100644
index 000000000..0933b896d
--- /dev/null
+++ src/bp-templates/bp-legacy/buddypress/members/single/invitations.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * BuddyPress - Users Notifications
+ *
+ * @package BuddyPress
+ * @subpackage bp-legacy
+ * @version 3.0.0
+ */
+
+?>
+
+<div class="item-list-tabs no-ajax" id="subnav" aria-label="<?php esc_attr_e( 'Member secondary navigation', 'buddypress' ); ?>" role="navigation">
+	<ul>
+		<?php bp_get_options_nav(); ?>
+	</ul>
+</div>
+
+<?php
+switch ( bp_current_action() ) :
+
+	case 'send-invites' :
+		bp_get_template_part( 'members/single/invitations/send-invites' );
+		break;
+
+	case 'list-invites' :
+	default :
+		bp_get_template_part( 'members/single/invitations/list-invites' );
+		break;
+
+endswitch;
+
diff --git src/bp-templates/bp-legacy/buddypress/members/single/invitations/invitations-loop.php src/bp-templates/bp-legacy/buddypress/members/single/invitations/invitations-loop.php
new file mode 100644
index 000000000..61bc68001
--- /dev/null
+++ src/bp-templates/bp-legacy/buddypress/members/single/invitations/invitations-loop.php
@@ -0,0 +1,57 @@
+<?php
+/**
+ * BuddyPress - Members Invitations Loop
+ *
+ * @package BuddyPress
+ * @subpackage bp-legacy
+ * @version 3.0.0
+ */
+
+?>
+<form action="" method="post" id="invitations-bulk-management">
+	<table class="invitations">
+		<thead>
+			<tr>
+				<th class="icon"></th>
+				<th class="bulk-select-all"><input id="select-all-invitations" type="checkbox"><label class="bp-screen-reader-text" for="select-all-invitations"><?php
+					/* translators: accessibility text */
+					_e( 'Select all', 'buddypress' );
+				?></label></th>
+				<th class="title"><?php _e( 'Invitee', 'buddypress' ); ?></th>
+				<th class="content"><?php _e( 'Message', 'buddypress' ); ?></th>
+				<th class="sent"><?php _e( 'Sent', 'buddypress' ); ?></th>
+				<th class="accepted"><?php _e( 'Accepted', 'buddypress' ); ?></th>
+				<th class="date"><?php _e( 'Date Modified', 'buddypress' ); ?></th>
+				<th class="actions"><?php _e( 'Actions',    'buddypress' ); ?></th>
+			</tr>
+		</thead>
+
+		<tbody>
+
+			<?php while ( bp_the_members_invitations() ) : bp_the_members_invitation(); ?>
+
+				<tr>
+					<td></td>
+					<td class="bulk-select-check"><label for="<?php bp_the_members_invitation_property( 'id' ); ?>"><input id="<?php bp_the_members_invitation_property( 'id' ); ?>" type="checkbox" name="network_invitations[]" value="<?php bp_the_members_invitation_property( 'id' ); ?>" class="invitation-check"><span class="bp-screen-reader-text"><?php
+						/* translators: accessibility text */
+						_e( 'Select this invitation', 'buddypress' );
+					?></span></label></td>
+					<td class="invitation-invitee"><?php bp_the_members_invitation_property( 'invitee_email' );  ?></td>
+					<td class="invitation-content"><?php wptexturize( bp_the_members_invitation_property( 'content' ) );  ?></td>
+					<td class="invitation-sent"><?php bp_the_members_invitation_property( 'invite_sent' );  ?></td>
+					<td class="invitation-accepted"><?php bp_the_members_invitation_property( 'accepted' );  ?></td>
+					<td class="invitation-date-modified"><?php bp_the_members_invitation_property( 'date_modified' );   ?></td>
+					<td class="invitation-actions"><?php bp_the_members_invitation_action_links(); ?></td>
+				</tr>
+
+			<?php endwhile; ?>
+
+		</tbody>
+	</table>
+
+	<div class="invitations-options-nav">
+		<?php // @TODO //bp_invitations_bulk_management_dropdown(); ?>
+	</div><!-- .invitations-options-nav -->
+
+	<?php wp_nonce_field( 'invitations_bulk_nonce', 'invitations_bulk_nonce' ); ?>
+</form>
diff --git src/bp-templates/bp-legacy/buddypress/members/single/invitations/list-invites.php src/bp-templates/bp-legacy/buddypress/members/single/invitations/list-invites.php
new file mode 100644
index 000000000..50810d424
--- /dev/null
+++ src/bp-templates/bp-legacy/buddypress/members/single/invitations/list-invites.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * BuddyPress - Members Sent Network Invitations
+ *
+ * @package BuddyPress
+ * @subpackage bp-legacy
+ * @version 3.0.0
+ */
+?>
+
+<?php if ( bp_has_members_invitations() ) : ?>
+
+	<h2 class="bp-screen-reader-text"><?php
+		/* translators: accessibility text */
+		_e( 'Invitations', 'buddypress' );
+	?></h2>
+
+	<div id="pag-top" class="pagination no-ajax">
+		<div class="pag-count" id="invitations-count-top">
+			<?php bp_members_invitations_pagination_count(); ?>
+		</div>
+
+		<div class="pagination-links" id="invitations-pag-top">
+			<?php bp_members_invitations_pagination_links(); ?>
+		</div>
+	</div>
+
+	<?php bp_get_template_part( 'members/single/invitations/invitations-loop' ); ?>
+
+	<div id="pag-bottom" class="pagination no-ajax">
+		<div class="pag-count" id="invitations-count-bottom">
+			<?php bp_members_invitations_pagination_count(); ?>
+		</div>
+
+		<div class="pagination-links" id="invitations-pag-bottom">
+			<?php bp_members_invitations_pagination_links(); ?>
+		</div>
+	</div>
+
+<?php else : ?>
+
+	<p><?php _e( 'There are no invitations to display.', 'buddypress' ); ?></p>
+
+<?php endif;
diff --git src/bp-templates/bp-legacy/buddypress/members/single/invitations/send-invites.php src/bp-templates/bp-legacy/buddypress/members/single/invitations/send-invites.php
new file mode 100644
index 000000000..e3fec5519
--- /dev/null
+++ src/bp-templates/bp-legacy/buddypress/members/single/invitations/send-invites.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * BuddyPress - Members Sent Network Invitations
+ *
+ * @package BuddyPress
+ * @subpackage bp-legacy
+ * @version 3.0.0
+ */
+?>
+<h2 class="bp-screen-reader-text"><?php
+	/* translators: accessibility text */
+	_e( 'Send Invitations', 'buddypress' );
+?></h2>
+
+<form class="standard-form network-invitation-form" id="network-invitation-form" method="post">
+	<label for="bp_network_invitation_invitee_email"><?php _e( 'Email address of new user', 'buddypress' ); ?></label>
+	<input id="bp_network_invitation_invitee_email" type="email" name="invitee_email" required="required">
+
+	<label for="bp_network_invitation_message"><?php _e( 'Add a personalized message to the invitation (optional)', 'buddypress' ); ?></label>
+	<textarea id="bp_network_invitation_message" name="invite_message"></textarea>
+
+	<input type="hidden" name="action" value="send-invite">
+
+	<?php wp_nonce_field( 'bp_network_invitation_send_' . bp_displayed_user_id() ) ?>
+	<p>
+		<input id="submit" type="submit" name="submit" class="submit" value="<?php esc_attr_e( 'Send Invitation', 'buddypress' ) ?>" />
+	</p>
+</form>
diff --git src/bp-templates/bp-nouveau/buddypress-functions.php src/bp-templates/bp-nouveau/buddypress-functions.php
index e2c6535e9..47db49706 100644
--- src/bp-templates/bp-nouveau/buddypress-functions.php
+++ src/bp-templates/bp-nouveau/buddypress-functions.php
@@ -195,6 +195,9 @@ class BP_Nouveau extends BP_Theme_Compat {
 		// Set the BP Uri for the Ajax customizer preview.
 		add_filter( 'bp_uri', array( $this, 'customizer_set_uri' ), 10, 1 );
 
+		// Modify "registration disabled" and welcome message if invitations are enabled.
+		add_action( 'bp_nouveau_feedback_messages', array( $this, 'filter_registration_messages' ), 99 );
+
 		/** Override **********************************************************/
 
 		/**
@@ -649,6 +652,29 @@ class BP_Nouveau extends BP_Theme_Compat {
 
 		return $path;
 	}
+	/**
+	 * Modify "registration disabled" message in Nouveau template pack.
+	 * Modify welcome message in Nouveau template pack.
+	 *
+	 * @since 7.0.0
+	 *
+	 * @param array $messages The list of feedback messages.
+	 *
+	 * @return array $messages
+	 */
+	function filter_registration_messages( $messages ) {
+		// Change the "registration is disabled" message.
+		$disallowed_message = bp_members_invitations_get_modified_registration_disabled_message();
+		if ( $disallowed_message ) {
+			$messages['registration-disabled']['message'] = $disallowed_message;
+		}
+		// Add information about invitations to the welcome block.
+		$welcome_message = bp_members_invitations_get_registration_welcome_message();
+		if ( $welcome_message ) {
+			$messages['request-details']['message'] = $welcome_message . $messages['request-details']['message'];
+		}
+		return $messages;
+	}
 }
 
 /**
diff --git src/bp-templates/bp-nouveau/buddypress/members/single/invitations.php src/bp-templates/bp-nouveau/buddypress/members/single/invitations.php
new file mode 100644
index 000000000..1cf1d8d6a
--- /dev/null
+++ src/bp-templates/bp-nouveau/buddypress/members/single/invitations.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * BuddyPress - Users Groups
+ *
+ * @since 3.0.0
+ * @version 3.0.0
+ */
+?>
+
+<nav class="<?php bp_nouveau_single_item_subnav_classes(); ?>" id="subnav" role="navigation" aria-label="<?php esc_attr_e( 'Groups menu', 'buddypress' ); ?>">
+	<ul class="subnav">
+
+		<?php if ( bp_is_my_profile() ) : ?>
+
+			<?php bp_get_template_part( 'members/single/parts/item-subnav' ); ?>
+
+		<?php endif; ?>
+
+	</ul>
+</nav><!-- .bp-navs -->
+
+<?php bp_get_template_part( 'common/search-and-filters-bar' ); ?>
+eh?
+<?php
+if ( 'sent-invites' === bp_current_action() ) {
+		echo "send tinvites";
+} else {
+		echo "default";
+
+}
+
diff --git src/class-buddypress.php src/class-buddypress.php
index 5464e5c4a..5b222cff2 100644
--- src/class-buddypress.php
+++ src/class-buddypress.php
@@ -615,6 +615,8 @@ class BuddyPress {
 			'BP_REST_Attachments_Member_Avatar_Endpoint' => 'members',
 			'BP_REST_Attachments_Member_Cover_Endpoint'  => 'members',
 			'BP_REST_Signup_Endpoint'                    => 'members',
+			'BP_Members_Invitation_Manager'              => 'members',
+			'BP_Members_Invitations_Template'            => 'members',
 
 			'BP_REST_Messages_Endpoint' => 'messages',
 
