diff --git src/bp-groups/bp-groups-classes.php src/bp-groups/bp-groups-classes.php
index b9017b9..baa7931 100644
--- src/bp-groups/bp-groups-classes.php
+++ src/bp-groups/bp-groups-classes.php
@@ -2440,20 +2440,39 @@ class BP_Groups_Member {
 	 * @param string $type If 'sent', results are limited to those
 	 *        invitations that have actually been sent (non-draft).
 	 *        Default: 'sent'.
+	 * @param int $inviter_id ID of the user who invited
 	 * @return int|null The ID of the invitation if found, otherwise null.
 	 */
-	public static function check_has_invite( $user_id, $group_id, $type = 'sent' ) {
-		global $wpdb, $bp;
+	public static function check_has_invite( $user_id, $group_id, $type = 'sent', $inviter_id = 0 ) {
+		global $wpdb;
+		$bp = buddypress();
 
-		if ( empty( $user_id ) )
+		if ( empty( $user_id ) ) {
 			return false;
+		}
 
-		$sql = "SELECT id FROM {$bp->groups->table_name_members} WHERE user_id = %d AND group_id = %d AND is_confirmed = 0 AND inviter_id != 0";
+		$sql = array(
+			'select' => "SELECT id FROM {$bp->groups->table_name_members}",
+			'where'  => array(
+				'user'      => $wpdb->prepare( 'user_id = %d', $user_id ),
+				'group'     => $wpdb->prepare( 'group_id = %d', $group_id ),
+				'confirmed' => 'is_confirmed = 0',
+				'inviter'   => 'inviter_id != 0',
+			),
+		);
 
-		if ( 'sent' == $type )
-			$sql .= " AND invite_sent = 1";
+		if ( ! empty( $inviter_id ) ) {
+			$sql['where']['inviter'] = $wpdb->prepare( 'inviter_id = %d', $inviter_id );
+		}
+
+		if ( 'sent' == $type ) {
+			$sql['where']['sent'] = 'invite_sent = 1';
+		}
+
+		$where = ' WHERE ' . join( ' AND ', $sql['where'] );
+		$query = $sql['select'] . $where;
 
-		return $wpdb->get_var( $wpdb->prepare( $sql, $user_id, $group_id ) );
+		return $wpdb->get_var( $query );
 	}
 
 	/**
@@ -2461,15 +2480,42 @@ class BP_Groups_Member {
 	 *
 	 * @param int $user_id ID of the user.
 	 * @param int $group_id ID of the group.
+	 * @param string $type If 'sent', results are limited to those
+	 *        invitations that have actually been sent (non-draft).
+	 *        Default: 'sent'.
+	 * @param int $inviter_id ID of the user who invited
 	 * @return int Number of records deleted.
 	 */
-	public static function delete_invite( $user_id, $group_id ) {
-		global $wpdb, $bp;
+	public static function delete_invite( $user_id, $group_id, $type = 'sent', $inviter_id = 0 ) {
+		global $wpdb;
+		$bp = buddypress();
 
-		if ( empty( $user_id ) )
+		if ( empty( $user_id ) ) {
 			return false;
+		}
+
+		$sql = array(
+			'delete' => "DELETE FROM {$bp->groups->table_name_members}",
+			'where'  => array(
+				'user'      => $wpdb->prepare( 'user_id = %d', $user_id ),
+				'group'     => $wpdb->prepare( 'group_id = %d', $group_id ),
+				'confirmed' => 'is_confirmed = 0',
+				'inviter'   => 'inviter_id != 0',
+			),
+		);
+
+		if ( ! empty( $inviter_id ) ) {
+			$sql['where']['inviter'] = $wpdb->prepare( 'inviter_id = %d', $inviter_id );
+		}
+
+		if ( 'sent' == $type ) {
+			$sql['where']['sent'] = 'invite_sent = 1';
+		}
+
+		$where = ' WHERE ' . join( ' AND ', $sql['where'] );
+		$query = $sql['delete'] . $where;
 
-		return $wpdb->query( $wpdb->prepare( "DELETE FROM {$bp->groups->table_name_members} WHERE user_id = %d AND group_id = %d AND is_confirmed = 0 AND inviter_id != 0 AND invite_sent = 1", $user_id, $group_id ) );
+		return $wpdb->query( $query );
 	}
 
 	/**
diff --git src/bp-groups/bp-groups-functions.php src/bp-groups/bp-groups-functions.php
index ec3ec01..d374e84 100644
--- src/bp-groups/bp-groups-functions.php
+++ src/bp-groups/bp-groups-functions.php
@@ -377,8 +377,8 @@ function groups_leave_group( $group_id, $user_id = 0 ) {
 		}
 	}
 
-	// This is exactly the same as deleting an invite, just is_confirmed = 1 NOT 0.
-	if ( !groups_uninvite_user( $user_id, $group_id ) ) {
+	// This is exactly the same as rejecting an invite, just is_confirmed = 1 NOT 0.
+	if ( ! groups_reject_invite( $user_id, $group_id ) ) {
 		return false;
 	}
 
@@ -910,29 +910,30 @@ function groups_invite_user( $args = '' ) {
 		'is_confirmed'  => 0
 	);
 
-	$args = wp_parse_args( $args, $defaults );
-	extract( $args, EXTR_SKIP );
+	$r = wp_parse_args( $args, $defaults );
 
-	if ( empty( $user_id ) || empty( $group_id ) )
+	if ( empty( $r['user_id'] ) || empty( $r['group_id'] ) ) {
 		return false;
+	}
 
-	// if the user has already requested membership, accept the request
-	if ( $membership_id = groups_check_for_membership_request( $user_id, $group_id ) ) {
-		groups_accept_membership_request( $membership_id, $user_id, $group_id );
+	// bail if the user is already a member
+	if ( groups_is_user_member( $r['user_id'], $r['group_id'] ) ) {
+		return false;
 
 	// Otherwise, create a new invitation
-	} else if ( ! groups_is_user_member( $user_id, $group_id ) && ! groups_check_user_has_invite( $user_id, $group_id, 'all' ) ) {
+	} else if ( ! groups_check_user_has_invite( $r['user_id'], $r['group_id'], 'all', $r['inviter_id'] ) ) {
 		$invite                = new BP_Groups_Member;
-		$invite->group_id      = $group_id;
-		$invite->user_id       = $user_id;
-		$invite->date_modified = $date_modified;
-		$invite->inviter_id    = $inviter_id;
-		$invite->is_confirmed  = $is_confirmed;
+		$invite->group_id      = $r['group_id'];
+		$invite->user_id       = $r['user_id'];
+		$invite->date_modified = $r['date_modified'];
+		$invite->inviter_id    = $r['inviter_id'];
+		$invite->is_confirmed  = $r['is_confirmed'];
 
-		if ( !$invite->save() )
+		if ( ! $invite->save() ) {
 			return false;
+		}
 
-		do_action( 'groups_invite_user', $args );
+		do_action( 'groups_invite_user', $r );
 	}
 
 	return true;
@@ -945,14 +946,16 @@ function groups_invite_user( $args = '' ) {
  *
  * @param int $user_id ID of the user.
  * @param int $group_id ID of the group.
+ * @param int $inviter_id ID of the user who invited.
  * @return bool True on success, false on failure.
  */
-function groups_uninvite_user( $user_id, $group_id ) {
+function groups_uninvite_user( $user_id, $group_id, $type = 'sent', $inviter_id = 0 ) {
 
-	if ( !BP_Groups_Member::delete( $user_id, $group_id ) )
+	if ( ! BP_Groups_Member::delete_invite( $user_id, $group_id, $type, $inviter_id ) ) {
 		return false;
+	}
 
-	do_action( 'groups_uninvite_user', $group_id, $user_id );
+	do_action( 'groups_uninvite_user', $group_id, $user_id, $inviter_id );
 
 	return true;
 }
@@ -994,6 +997,9 @@ function groups_accept_invite( $user_id, $group_id ) {
 		$member->delete_request( $user_id, $group_id );
 	}
 
+	// Remove all invites
+	groups_uninvite_user( $user_id, $group_id, 'all' );
+
 	// Modify group meta
 	groups_update_groupmeta( $group_id, 'last_activity', bp_core_current_time() );
 
@@ -1050,6 +1056,14 @@ function groups_send_invites( $user_id, $group_id ) {
 	$group = groups_get_group( array( 'group_id' => $group_id ) );
 
 	for ( $i = 0, $count = count( $invited_users ); $i < $count; ++$i ) {
+		$membership_id = groups_check_for_membership_request( $invited_users[$i], $group_id );
+
+		if ( ! empty( $membership_id ) ) {
+			groups_accept_membership_request( $membership_id, $invited_users[$i], $group_id );
+			groups_uninvite_user( $invited_users[$i], $group_id, 'all', $user_id );
+			continue;
+		}
+
 		$member = new BP_Groups_Member( $invited_users[$i], $group_id );
 
 		// Send the actual invite
@@ -1085,10 +1099,11 @@ function groups_get_invites_for_group( $user_id, $group_id ) {
  * @param int $group_id ID of potential group.
  * @param string $type Optional. Use 'sent' to check for sent invites, 'all' to
  *        check for all. Default: 'sent'.
+ * @param int $inviter_id ID of the user who invited
  * @return bool True if an invitation is found, otherwise false.
  */
-function groups_check_user_has_invite( $user_id, $group_id, $type = 'sent' ) {
-	return BP_Groups_Member::check_has_invite( $user_id, $group_id, $type );
+function groups_check_user_has_invite( $user_id, $group_id, $type = 'sent', $inviter_id = 0 ) {
+	return BP_Groups_Member::check_has_invite( $user_id, $group_id, $type, $inviter_id );
 }
 
 /**
diff --git src/bp-groups/bp-groups-template.php src/bp-groups/bp-groups-template.php
index 37a4904..9137b9f 100644
--- src/bp-groups/bp-groups-template.php
+++ src/bp-groups/bp-groups-template.php
@@ -4502,6 +4502,43 @@ function bp_group_invite_user_remove_invite_url() {
 	}
 
 /**
+ * Output an information if the invited user has previously requested a membership
+ *
+ * @since BuddyPress (2.2.0)
+ *
+ * @uses  bp_get_group_membership_requested()
+ */
+function bp_group_membership_requested() {
+	echo bp_get_group_membership_requested();
+}
+add_action( 'bp_group_send_invites_item', 'bp_group_membership_requested' );
+
+	/**
+	 * Returns an information if the invited user has previously requested a membership
+	 *
+	 * @since BuddyPress (2.2.0)
+	 *
+	 * @uses  groups_check_for_membership_request() to check if the member has requested a membership
+	 * @uses  apply_filters() calls 'bp_get_group_membership_requested' to override output
+	 * @return string HTML Output
+	 */
+	function bp_get_group_membership_requested() {
+		global $invites_template;
+
+		$user_id  = intval( $invites_template->invite->user->id );
+		$group_id = intval( $invites_template->invite->group_id );
+		$output   = '';
+
+		if ( ! groups_check_for_membership_request( $user_id, $group_id ) ) {
+			return $output;
+		}
+
+		$output = '<p class="description">' . sprintf( __( '%s has previously requested to join this group. Sending an invitation will automatically add the member to the group.', 'buddypress' ), $invites_template->invite->user->user_link ) . '</p>';
+
+		return apply_filters( 'bp_get_group_membership_requested', $output, $user_id, $group_id );
+	}
+
+/**
  * Output pagination links for group invitations.
  *
  * @since BuddyPress (2.0.0)
diff --git src/bp-templates/bp-legacy/buddypress-functions.php src/bp-templates/bp-legacy/buddypress-functions.php
index a5230c7..9a97411 100644
--- src/bp-templates/bp-legacy/buddypress-functions.php
+++ src/bp-templates/bp-legacy/buddypress-functions.php
@@ -1037,18 +1037,20 @@ function bp_legacy_theme_ajax_invite_user() {
 
 	if ( 'invite' == $_POST['friend_action'] ) {
 		$group = groups_get_group( $group_id );
+		$user_status = 'is_invited';
 
 		// Users who have previously requested membership do not need
 		// another invitation created for them
 		if ( BP_Groups_Member::check_for_membership_request( $friend_id, $group_id ) ) {
 			$user_status = 'is_pending';
+		}
 
 		// Create the user invitation
-		} else if ( groups_invite_user( array( 'user_id' => $friend_id, 'group_id' => $group_id ) ) ) {
-			$user_status = 'is_invited';
+		if ( ! groups_invite_user( array( 'user_id' => $friend_id, 'group_id' => $group_id ) ) ) {
+			return;
+		}
 
-		// Miscellaneous failure
-		} else {
+		if ( ! empty( $_POST['is_new_template'] ) ) {
 			return;
 		}
 
@@ -1072,14 +1074,9 @@ function bp_legacy_theme_ajax_invite_user() {
 		exit;
 
 	} elseif ( 'uninvite' == $_POST['friend_action'] ) {
-		// Users who have previously requested membership should not
-		// have their requests deleted on the "uninvite" action
-		if ( BP_Groups_Member::check_for_membership_request( $friend_id, $group_id ) ) {
-			return;
-		}
 
 		// Remove the unsent invitation
-		if ( ! groups_uninvite_user( $friend_id, $group_id ) ) {
+		if ( ! groups_uninvite_user( $friend_id, $group_id, 'all', bp_loggedin_user_id() ) ) {
 			return;
 		}
 
diff --git src/bp-templates/bp-legacy/buddypress/groups/single/send-invites.php src/bp-templates/bp-legacy/buddypress/groups/single/send-invites.php
index 6f3d9ef..6fe2a58 100644
--- src/bp-templates/bp-legacy/buddypress/groups/single/send-invites.php
+++ src/bp-templates/bp-legacy/buddypress/groups/single/send-invites.php
@@ -16,6 +16,12 @@
 
 	</form><!-- #send-invite-form -->
 
+<?php else : ?>
+
+	<div id="message" class="info">
+		<p><?php _e( 'Once you have built up friend connections you will be able to invite others to your group.', 'buddypress' ); ?></p>
+	</div>
+
 <?php endif; ?>
 
 <?php do_action( 'bp_after_group_send_invites_content' ); ?>
diff --git src/bp-templates/bp-legacy/js/buddypress.js src/bp-templates/bp-legacy/js/buddypress.js
index e2eec0b..8fa3ae1 100644
--- src/bp-templates/bp-legacy/js/buddypress.js
+++ src/bp-templates/bp-legacy/js/buddypress.js
@@ -1039,18 +1039,22 @@ jq(document).ready( function() {
 			friend_action = 'uninvite';
 		}
 
+		ajaxdata = {
+			action: 'groups_invite_user',
+			'friend_action'   : friend_action,
+			'cookie'          : bp_get_cookies(),
+			'_wpnonce'        : jq('#_wpnonce_invite_uninvite_user').val(),
+			'friend_id'       : friend_id,
+			'group_id'        : jq('#group_id').val(),
+			'is_new_template' : 1,
+		};
+
 		if ( ! invites_new_template ) {
 			jq( '.item-list-tabs li.selected' ).addClass( 'loading' );
+			ajaxdata.is_new_template = 0;
 		}
 
-		jq.post( ajaxurl, {
-			action: 'groups_invite_user',
-			'friend_action': friend_action,
-			'cookie': bp_get_cookies(),
-			'_wpnonce': jq('#_wpnonce_invite_uninvite_user').val(),
-			'friend_id': friend_id,
-			'group_id': jq('#group_id').val()
-		},
+		jq.post( ajaxurl, ajaxdata,
 		function(response)
 		{
 			if ( jq('#message') ) {
diff --git tests/phpunit/testcases/groups/functions.php tests/phpunit/testcases/groups/functions.php
index 6433349..eaa77b6 100644
--- tests/phpunit/testcases/groups/functions.php
+++ tests/phpunit/testcases/groups/functions.php
@@ -647,4 +647,180 @@ Bar!';
 		groups_accept_invite( $u2, $g );
 		$this->assertEquals( 0, groups_get_invite_count_for_user( $u2 ) );
 	}
+
+	/**
+	 * @group invites
+	 * @group BP5911
+	 */
+	public function test_groups_invite_user_private_group() {
+		$u1 = $this->factory->user->create();
+		$u2 = $this->factory->user->create();
+		$u3 = $this->factory->user->create();
+
+		$g = $this->factory->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
+
+		self::add_user_to_group( $u3, $g );
+
+		// create invitation
+		$invite_not_member = groups_invite_user( array(
+			'user_id'    => $u2,
+			'group_id'   => $g,
+			'inviter_id' => $u1,
+		) );
+
+		// create invitation
+		$invite_is_member = groups_invite_user( array(
+			'user_id'    => $u3,
+			'group_id'   => $g,
+			'inviter_id' => $u1,
+		) );
+
+		$this->assertTrue( $invite_not_member );
+		$this->assertFalse( $invite_is_member );
+	}
+
+	/**
+	 * @group invites
+	 * @group BP5911
+	 */
+	public function test_groups_invite_user_multiple_invites() {
+		$u1 = $this->factory->user->create();
+		$u2 = $this->factory->user->create();
+		$u3 = $this->factory->user->create();
+		$u4 = $this->factory->user->create();
+
+		$g = $this->factory->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
+
+		// Add u3 so that he can invite
+		self::add_user_to_group( $u3, $g );
+
+		// u2 is requesting membership
+		groups_send_membership_request( $u2, $g );
+
+		// u1 invites u2
+		$invite_not_member = groups_invite_user( array(
+			'user_id'    => $u2,
+			'group_id'   => $g,
+			'inviter_id' => $u1,
+		) );
+
+		// u1 invites u4
+		$invite_not_member = groups_invite_user( array(
+			'user_id'    => $u4,
+			'group_id'   => $g,
+			'inviter_id' => $u1,
+		) );
+
+		// u3 is also inviting u4
+		$invite_is_member = groups_invite_user( array(
+			'user_id'    => $u4,
+			'group_id'   => $g,
+			'inviter_id' => $u3,
+		) );
+
+		// Send invites
+		groups_send_invites( $u1, $g );
+		groups_send_invites( $u3, $g );
+
+		// Check u2 is now a member
+		$this->assertEquals( 1, groups_is_user_member( $u2, $g ) );
+
+		// Check u4 has invites
+		$this->assertNotEmpty( groups_check_user_has_invite( $u4, $g ) );
+
+		// u4 is accepting the invite
+		groups_accept_invite( $u4, $g );
+
+		// Check u2 is now a member
+		$this->assertEquals( 1, groups_is_user_member( $u2, $g ) );
+
+		// Check u1 & u3 has no more invites
+		$this->assertEmpty( groups_get_invites_for_group( $u1, $g ) );
+		$this->assertEmpty( groups_get_invites_for_group( $u3, $g ) );
+	}
+
+	/**
+	 * @group invites
+	 * @group BP5911
+	 */
+	public function test_groups_send_membership_request_has_multiple_invites() {
+		$u1 = $this->factory->user->create();
+		$u2 = $this->factory->user->create();
+		$u3 = $this->factory->user->create();
+
+		$g = $this->factory->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
+
+		// Add u3 so that he can invite
+		self::add_user_to_group( $u3, $g );
+
+		// u1 invites u2
+		$invite_not_member = groups_invite_user( array(
+			'user_id'    => $u2,
+			'group_id'   => $g,
+			'inviter_id' => $u1,
+		) );
+
+		// u3 invites u2
+		$invite_not_member = groups_invite_user( array(
+			'user_id'    => $u2,
+			'group_id'   => $g,
+			'inviter_id' => $u3,
+		) );
+
+		// Send invites
+		groups_send_invites( $u1, $g );
+		groups_send_invites( $u3, $g );
+
+		// u2 is requesting membership
+		groups_send_membership_request( $u2, $g );
+
+		// Check u2 is now a member
+		$this->assertEquals( 1, groups_is_user_member( $u2, $g ) );
+
+		// Check u1 & u3 has no more invites
+		$this->assertEmpty( groups_get_invites_for_group( $u1, $g ) );
+		$this->assertEmpty( groups_get_invites_for_group( $u3, $g ) );
+	}
+
+	/**
+	 * @group invites
+	 * @group BP5911
+	 */
+	public function test_groups_reject_invite_multiple_invites() {
+		$u1 = $this->factory->user->create();
+		$u2 = $this->factory->user->create();
+		$u3 = $this->factory->user->create();
+
+		$g = $this->factory->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
+
+		// Add u3 so that he can invite
+		self::add_user_to_group( $u3, $g );
+
+		// u1 invites u2
+		$invite_not_member = groups_invite_user( array(
+			'user_id'    => $u2,
+			'group_id'   => $g,
+			'inviter_id' => $u1,
+		) );
+
+		// u3 invites u2
+		$invite_not_member = groups_invite_user( array(
+			'user_id'    => $u2,
+			'group_id'   => $g,
+			'inviter_id' => $u3,
+		) );
+
+		// Send invites
+		groups_send_invites( $u1, $g );
+		groups_send_invites( $u3, $g );
+
+		groups_reject_invite( $u2, $g );
+
+		// Check u2 is not a member
+		$this->assertEmpty( groups_is_user_member( $u2, $g ) );
+
+		// Check u1 & u3 has no more invites
+		$this->assertEmpty( groups_get_invites_for_group( $u1, $g ) );
+		$this->assertEmpty( groups_get_invites_for_group( $u3, $g ) );
+	}
 }
