diff --git src/bp-core/bp-core-filters.php src/bp-core/bp-core-filters.php
index 1b285555c..85a8978d2 100644
--- src/bp-core/bp-core-filters.php
+++ src/bp-core/bp-core-filters.php
@@ -1074,9 +1074,11 @@ function bp_email_set_default_headers( $headers, $property, $transform, $email )
 			'user_id'           => $user_id,
 			'notification_type' => $email->get( 'type' ),
 		);
-		// If this email is not to a current member, include the nonmember's email address.
+
+		// If this email is not to a current member, include the nonmember's email address and the Inviter ID.
 		if ( ! $user_id ) {
 			$args['email_address'] = $tokens['recipient.email'];
+			$args['member_id']     = bp_loggedin_user_id();
 		}
 
 		$link = bp_email_get_unsubscribe_link( $args );
diff --git src/bp-core/bp-core-functions.php src/bp-core/bp-core-functions.php
index 98b46f5ce..9464d61ad 100644
--- src/bp-core/bp-core-functions.php
+++ src/bp-core/bp-core-functions.php
@@ -4027,7 +4027,7 @@ function bp_email_get_type_schema( $field = 'description' ) {
 		'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' ),
+			'message'	=> __( 'You will no longer receive emails when you are invited to join this site.', 'buddypress' ),
 		),
 	);
 
@@ -4071,6 +4071,7 @@ function bp_email_unsubscribe_handler() {
 	$raw_user_id    = ! empty( $_GET['uid'] ) ? absint( $_GET['uid'] ) : 0;
 	$raw_user_email = ! empty( $_GET['uem'] ) ? $_GET['uem'] : '';
 	$raw_member_id  = ! empty( $_GET['mid'] ) ? absint( $_GET['mid'] ) : 0;
+	$redirect_to    = '';
 
 	$new_hash = '';
 	if ( ! empty( $raw_user_id ) ) {
@@ -4109,17 +4110,20 @@ function bp_email_unsubscribe_handler() {
 	// This is an unsubscribe request from a nonmember.
 	} else if ( $raw_user_email ) {
 		// Unsubscribe.
-		error_log( 'caught unsubscribe request {$raw_user_email}' );
-		$optout_args = array(
-			'email_address' => $raw_user_email,
-			'user_id'       => $raw_member_id,
-			'email_type'    => $raw_email_type,
-			'date_modified' => bp_core_current_time(),
-		);
-		$result      = bp_add_optout( $optout_args );
-		$redirect_to = home_url();
-		$result_msg  = $emails[ $raw_email_type ]['unsubscribe']['message'];
-		$unsub_msg   = __( 'You have been unsubscribed.', 'buddypress' );
+		if ( bp_user_has_opted_out() ) {
+			$result_msg = $emails[ $raw_email_type ]['unsubscribe']['message'];
+			$unsub_msg  = __( 'You have already unsubscribed from all communication from this site.', 'buddypress' );
+		} else {
+			$optout_args = array(
+				'email_address' => $raw_user_email,
+				'user_id'       => $raw_member_id,
+				'email_type'    => $raw_email_type,
+				'date_modified' => bp_core_current_time(),
+			);
+			bp_add_optout( $optout_args );
+			$result_msg = $emails[ $raw_email_type ]['unsubscribe']['message'];
+			$unsub_msg  = __( 'You have been unsubscribed.', 'buddypress' );
+		}
 
 	// This is an unsubscribe request from a current member.
 	} else {
@@ -4141,23 +4145,29 @@ function bp_email_unsubscribe_handler() {
 		$unsub_msg  = __( 'You can change this or any other email notification preferences in your email settings.', 'buddypress' );
 	}
 
-	$message = sprintf(
-		'%1$s <a href="%2$s">%3$s</a>',
-		$result_msg,
-		esc_url( $redirect_to ),
-		esc_html( $unsub_msg )
-	);
+	if ( $raw_user_id && $redirect_to ) {
+		$message = sprintf(
+			'%1$s <a href="%2$s">%3$s</a>',
+			$result_msg,
+			esc_url( $redirect_to ),
+			esc_html( $unsub_msg )
+		);
 
-	bp_core_add_message( $message );
+		// Template notices are only displayed on BP pages.
+		bp_core_add_message( $message );
+		bp_core_redirect( bp_core_get_user_domain( $raw_user_id ) );
 
-	$page_redirect = '';
-	if ( $raw_user_id  ) {
-		$page_redirect = bp_core_get_user_domain( $raw_user_id );
+		exit;
+	} else {
+		wp_die(
+			sprintf( '%1$s %2$s', esc_html( $unsub_msg ), esc_html( $result_msg ) ),
+			esc_html( $unsub_msg ),
+			array(
+				'link_url'  => home_url(),
+				'link_text' => __( 'Go to website\'s home page.', 'buddypress' ),
+			)
+		);
 	}
-
-	bp_core_redirect( $page_redirect );
-
-	exit;
 }
 
 /**
diff --git src/bp-core/classes/class-bp-email.php src/bp-core/classes/class-bp-email.php
index 78188fe4e..7c64102df 100644
--- src/bp-core/classes/class-bp-email.php
+++ src/bp-core/classes/class-bp-email.php
@@ -999,6 +999,12 @@ class BP_Email {
 			$retval = new WP_Error( 'missing_parameter', __CLASS__, $this );
 		}
 
+		// Has the user opted out of receiving any email from this site?
+		$recipient_address = array_shift( $this->get_to() )->get_address();
+		if ( bp_user_has_opted_out( $recipient_address ) ) {
+			$retval = new WP_Error( 'user_has_opted_out', 'The email recipient has opted out from receiving communication from this site.', $this );
+		}
+
 		/**
 		 * Filters whether the email passes basic validation checks.
 		 *
diff --git src/bp-core/classes/class-bp-invitation.php src/bp-core/classes/class-bp-invitation.php
index 2f5504df2..c1e941de2 100644
--- src/bp-core/classes/class-bp-invitation.php
+++ src/bp-core/classes/class-bp-invitation.php
@@ -660,7 +660,7 @@ class BP_Invitation {
 	 *     Associative array of arguments. All arguments but $page and
 	 *     $per_page can be treated as filter values for get_where_sql()
 	 *     and get_query_clauses(). All items are optional.
-	 *     @type int|array    $id                ID of invitation being updated.
+	 *     @type int|array    $id                ID of invitation being fetched.
 	 *                                           Can be an array of IDs.
 	 *     @type int|array    $user_id           ID of user being queried. Can be an
 	 *                                           Can be an array of IDs.
diff --git src/bp-members/bp-members-filters.php src/bp-members/bp-members-filters.php
index fcdcf4fa3..4c6eacead 100644
--- src/bp-members/bp-members-filters.php
+++ src/bp-members/bp-members-filters.php
@@ -209,27 +209,37 @@ function bp_members_invitations_get_registration_welcome_message() {
 		return $message;
 	}
 	$invite = bp_get_members_invitation_from_request();
-	if ( ! $invite->id ) {
+	if ( ! $invite->id || ! $invite->invitee_email ) {
 		return $message;
 	}
 
-	// Fetch the display names of all inviters to personalize the welcome message.
-	$all_invites = bp_members_invitations_get_invites(
-		array(
+	// Check if the user is already a site member.
+	$maybe_user = get_user_by( 'email', $invite->invitee_email );
+
+	// This user is already a member
+	if ( $maybe_user ) {
+		$message = sprintf( __( 'Welcome! You are already a member of this site. Please <a href="%1s">log in</a> to continue. If you have forgotten your password, you can <a href="%2s">reset it</a>.', 'buddypress' ), wp_login_url( bp_get_root_domain() ), wp_lostpassword_url(  bp_get_root_domain() ) );
+	// This user can register!
+	} else {
+
+		// Fetch the display names of all inviters to personalize the welcome message.
+		$args = 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 );
-	}
+		);
+		$all_invites = bp_members_invitations_get_invites( $all_args );
+		$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' );
+		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;
 }
 
@@ -246,10 +256,23 @@ function bp_members_invitations_get_registration_welcome_message() {
 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' );
+
+		$invite = bp_get_members_invitation_from_request();
+		if ( ! $invite->id || ! $invite->invitee_email ) {
+			return $message;
+		}
+
+		// Check if the user is already a site member.
+		$maybe_user = get_user_by( 'email', $invite->invitee_email );
+
+		if ( ! $maybe_user ) {
+			$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' );
+			}
+		} else if ( 'nouveau' === bp_get_theme_package_id() ) {
+			$message = sprintf( __( 'Welcome! You are already a member of this site. Please <a href="%1s">log in</a> to continue. If you have forgotten your password, you can <a href="%2s">reset it</a>.', 'buddypress' ), wp_login_url( bp_get_root_domain() ), wp_lostpassword_url(  bp_get_root_domain() ) );
 		}
 	}
 	return $message;
diff --git src/bp-members/bp-members-functions.php src/bp-members/bp-members-functions.php
index b6940ebb1..b6fdc0122 100644
--- src/bp-members/bp-members-functions.php
+++ src/bp-members/bp-members-functions.php
@@ -3538,19 +3538,21 @@ function bp_members_invitations_delete_by_id( $id = 0 ) {
  */
 function bp_members_invitations_delete_invites( $args ) {
 	$r = bp_parse_args( $args, array(
-		'id'            => 0,
+		'id'            => false,
  		'invitee_email' => '',
 		'network_id'    => get_current_network_id(),
 		'inviter_id'    => null,
 		'accepted'      => null,
 		'invite_sent'   => null
-	), 'community_invitation_delete_invites' );
+	), 'members_invitations_delete_invites' );
 
 	$inv_args = array(
 		'id'            => $r['id'],
 		'invitee_email' => $r['invitee_email'],
 		'item_id'       => $r['network_id'],
 		'inviter_id'    => $r['inviter_id'],
+		'accepted'      => $r['accepted'],
+		'invite_sent'   => $r['invite_sent']
 	);
 
 	// Find the invitation(s).
diff --git src/bp-members/bp-members-invitations.php src/bp-members/bp-members-invitations.php
index 2e1b5458e..2a04c3dbd 100644
--- src/bp-members/bp-members-invitations.php
+++ src/bp-members/bp-members-invitations.php
@@ -139,3 +139,18 @@ function bp_members_invitations_complete_signup( $user_id, $user_login, $user_pa
 }
 add_action( 'bp_core_signup_user', 'bp_members_invitations_complete_signup', 10, 4 );
 
+/**
+ * Delete site membership invitations when an opt-out request is saved.
+ *
+ * @since 8.0.0
+ *
+ * @param BP_Optout $optout Characteristics of the opt-out just saved.
+ */
+function bp_members_invitations_delete_optedout_invites( $optout ) {
+
+	$args = array(
+		'invitee_email' => $optout->email_address,
+	);
+	bp_members_invitations_delete_invites( $args );
+}
+add_action( 'bp_optout_after_save', 'bp_members_invitations_delete_optedout_invites' );
diff --git src/bp-members/bp-members-notifications.php src/bp-members/bp-members-notifications.php
index 23ee17a77..6571eb1e5 100644
--- src/bp-members/bp-members-notifications.php
+++ src/bp-members/bp-members-notifications.php
@@ -21,7 +21,7 @@ defined( 'ABSPATH' ) || exit;
  * @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
+ * @param int    $total_items       The total number of members-related notifications
  *                                  waiting for the user.
  * @param string $format            'string' for BuddyBar-compatible notifications;
  *                                  'array' for WP Toolbar. Default: 'string'.
@@ -34,17 +34,31 @@ function members_format_notifications( $action, $item_id, $secondary_item_id, $t
 
 			// Set up the string and the filter.
 			if ( (int) $total_items > 1 ) {
-				$link = bp_get_members_directory_permalink();
-				/* translators: %d: the number of new users */
-				$text = sprintf( __( '%d members accepted your membership invitations', 'buddypress' ), (int) $total_items );
+				$link   = bp_get_notifications_permalink();
 				$amount = 'multiple';
+
+				// This is the inviter whose invitation was accepted.
+				if ( 0 !== (int) $secondary_item_id )  {
+					/* translators: %d: the number of new users */
+					$text = sprintf( __( '%d members accepted your membership invitations', 'buddypress' ), (int) $total_items );
+				// This is someone who also invited that user to join.
+				} else {
+					/* translators: %d: the number of new users */
+					$text = sprintf( __( '%d members are now members of the site', 'buddypress' ), (int) $total_items );
+				}
 			} else {
-				$link = bp_core_get_user_domain( $item_id );
-				/* translators: %s: new user name */
-				$text = sprintf( __( '%s accepted your membership invitation', 'buddypress' ),  bp_core_get_user_displayname( $item_id ) );
+				$link   = add_query_arg( 'welcome', 1, bp_core_get_user_domain( $item_id ) );
 				$amount = 'single';
-			}
 
+				// This is the inviter whose invitation was accepted.
+				if ( 0 !== (int) $secondary_item_id )  {
+					/* translators: %s: new user name */
+					$text = sprintf( __( '%s accepted your membership invitation', 'buddypress' ),  bp_core_get_user_displayname( $item_id ) );				// This is someone who also invited that user to join.
+				} else {
+					/* translators: %s: new user name */
+					$text = sprintf( __( '%s is now a member of the site', 'buddypress' ),  bp_core_get_user_displayname( $item_id ) );
+				}
+			}
 			break;
 	}
 
@@ -103,18 +117,61 @@ function members_format_notifications( $action, $item_id, $secondary_item_id, $t
  */
 function bp_members_invitations_accepted_invitation_notification( $invite, $new_user, $inviter_id ) {
 
-	$res = bp_notifications_add_notification( array(
-		'user_id'           => $inviter_id,
-		'item_id'           => $new_user->ID,
-		'secondary_item_id' => $invite->id,
-		'component_name'    => buddypress()->members->id,
-		'component_action'  => 'accepted_invitation',
-		'date_notified'     => bp_core_current_time(),
-		'is_new'            => 1,
-	) );
+	// Add "user is a member of the site" notification for other inviters.
+	$args = array(
+		'invitee_email' => $new_user->user_email,
+		'accepted'      => 'all',
+	);
+	$invites = bp_members_invitations_get_invites( $args );
+
+	if ( ! $invites ) {
+		return;
+	}
+	foreach ( $invites as $invite) {
+		// Include the id of the "accepted" invitation.
+		if ( $invite->inviter_id === $inviter_id ) {
+			$secondary_item_id = $invite->id;
+		} else {
+			// Else don't store the invite id, so we know this is not the primary.
+			$secondary_item_id = 0;
+		}
+		$res = bp_notifications_add_notification( array(
+			'user_id'           => $invite->inviter_id,
+			'item_id'           => $new_user->ID,
+			'secondary_item_id' => $secondary_item_id,
+			'component_name'    => buddypress()->members->id,
+			'component_action'  => 'accepted_invitation',
+			'date_notified'     => bp_core_current_time(),
+			'is_new'            => 1,
+		) );
+	}
 }
 add_action( 'community_membership_invite_accepted', 'bp_members_invitations_accepted_invitation_notification', 10, 3 );
 
+/**
+ * Mark accepted invitation notifications as read when user visits new user profile.
+ *
+ *
+ * @since 8.0.0
+ */
+function bp_members_mark_read_accepted_invitation_notification() {
+	if ( false === is_singular() || false === is_user_logged_in() || ! bp_is_user() || empty( $_GET['welcome'] ) ) {
+		return;
+	}
+
+	// Mark notification as read.
+	BP_Notifications_Notification::update(
+		array(
+			'is_new'  => false
+		),
+		array(
+			'user_id' => bp_loggedin_user_id(),
+			'item_id' => bp_displayed_user_id(),
+		)
+	);
+}
+add_action( 'bp_screens', 'bp_members_mark_read_accepted_invitation_notification' );
+
 /**
  * Add Friends-related settings to the Settings > Notifications page.
  *
@@ -127,8 +184,9 @@ function members_screen_notification_settings() {
 		return;
 	}
 
-	if ( ! $allow_acceptance_emails = bp_get_user_meta( bp_displayed_user_id(), 'notification_members_invitation_accepted', true ) )
+	if ( ! $allow_acceptance_emails = bp_get_user_meta( bp_displayed_user_id(), 'notification_members_invitation_accepted', true ) ) {
 		$allow_acceptance_emails = 'yes';
+	}
 	?>
 
 	<table class="notification-settings" id="members-notification-settings">
diff --git src/bp-members/classes/class-bp-members-invitation-manager.php src/bp-members/classes/class-bp-members-invitation-manager.php
index 061c5bade..a708ee17b 100644
--- src/bp-members/classes/class-bp-members-invitation-manager.php
+++ src/bp-members/classes/class-bp-members-invitation-manager.php
@@ -112,19 +112,21 @@ class BP_Members_Invitation_Manager extends BP_Invitation_Manager {
 				bp_update_user_meta( $new_user->ID, 'accepted_members_invitation', $invite->id );
 
 				// We will mark all invitations to this user as "accepted."
-				$args  = array(
-					'invitee_email' => $invite->invitee_email,
-					'item_id'       => get_current_network_id(),
-					'type'          => 'all'
-				);
-				$this->mark_accepted( $args );
+				if ( ! empty( $invite->invitee_email )  ) {
+					$args  = array(
+						'invitee_email' => $invite->invitee_email,
+						'item_id'       => get_current_network_id(),
+						'type'          => 'all'
+					);
+					$this->mark_accepted( $args );
+				}
 
 				/**
 				 * Fires after a user has accepted a site membership invite.
 				 *
 				 * @since 8.0.0
 				 *
-				 * @param BP_Invitation $invite    Invitation that was accepted.
+				 * @param BP_Invitation $invite     Invitation that was accepted.
 				 * @param WP_user       $new_user   ID of the user who accepted the membership invite.
 				 * @param int           $inviter_id ID of the user who invited this user to the site.
 				 */
diff --git src/bp-members/screens/register.php src/bp-members/screens/register.php
index b08f6ece8..77929c442 100644
--- src/bp-members/screens/register.php
+++ src/bp-members/screens/register.php
@@ -47,8 +47,17 @@ function bp_core_screen_signup() {
 	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 ( $maybe_invite->id && $maybe_invite->invitee_email ) {
+			// Check if this user is already a member.
+			$args = array(
+				'invitee_email' => $maybe_invite->invitee_email,
+				'accepted'      => 'accepted',
+				'fields'        => 'ids',
+			);
+			$accepted_invites = bp_members_invitations_get_invites( $args );
+			if ( ! $accepted_invites ) {
+				$active_invite = true;
+			}
 		}
 	}
 
diff --git src/bp-members/screens/send-invites.php src/bp-members/screens/send-invites.php
index 6471ebf1d..f2af326e2 100644
--- src/bp-members/screens/send-invites.php
+++ src/bp-members/screens/send-invites.php
@@ -67,7 +67,7 @@ function bp_network_invitations_catch_send_action() {
 	if ( bp_verify_nonce_request( 'bp_members_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' );
+		bp_core_add_message( __( 'There was a problem sending that invitation. The user could already be a member of the site or have chosen not to receive invitations from this site.', 'buddypress' ), 'error' );
 	}
 
 	// Redirect.
diff --git src/bp-templates/bp-legacy/buddypress-functions.php src/bp-templates/bp-legacy/buddypress-functions.php
index 03c09ac00..4da3d1ae9 100644
--- src/bp-templates/bp-legacy/buddypress-functions.php
+++ src/bp-templates/bp-legacy/buddypress-functions.php
@@ -2026,7 +2026,7 @@ function bp_legacy_theme_group_manage_members_add_search() {
 function bp_members_invitations_add_legacy_welcome_message() {
 	$message = bp_members_invitations_get_registration_welcome_message();
 	if ( $message ) {
-		echo '<p>' . esc_html( $message ) . '</p>';
+		echo '<p>' . $message . '</p>';
 	}
 }
 add_action( 'bp_before_register_page', 'bp_members_invitations_add_legacy_welcome_message' );
