Index: bp-groups/bp-groups-classes.php
===================================================================
--- bp-groups/bp-groups-classes.php	(revision 7234)
+++ bp-groups/bp-groups-classes.php	(working copy)
@@ -1475,6 +1475,17 @@ class BP_Groups_Member {
 		return $wpdb->get_var( $wpdb->prepare( $sql, $user_id, $group_id ) );
 	}
 
+	function get_invites_and_requests( $user_id, $group_id ) {
+		global $wpdb, $bp;
+
+		if ( empty( $user_id ) )
+			return false;
+
+		$sql = "SELECT id, inviter_id FROM {$bp->groups->table_name_members} WHERE user_id = %d AND group_id = %d AND is_confirmed = 0 AND is_banned = 0";
+
+		return $wpdb->get_results( $wpdb->prepare( $sql, $user_id, $group_id ), "ARRAY_A" );
+	}
+
 	function delete_invite( $user_id, $group_id ) {
 		global $wpdb, $bp;
 
Index: bp-groups/bp-groups-functions.php
===================================================================
--- bp-groups/bp-groups-functions.php	(revision 7234)
+++ bp-groups/bp-groups-functions.php	(working copy)
@@ -655,6 +655,13 @@ function groups_invite_user( $args = '' ) {
 		return false;
 
 	if ( !groups_is_user_member( $user_id, $group_id ) && !groups_check_user_has_invite( $user_id, $group_id, 'all' ) ) {
+
+		// Check if the user already requested membership - if so, simply accept membership request
+		if ( $membership_id = groups_check_for_membership_request ( $user_id, $group_id ) ) {
+			groups_accept_membership_request ($membership_id, $user_id, $group_id);
+			return true;
+		}
+
 		$invite                = new BP_Groups_Member;
 		$invite->group_id      = $group_id;
 		$invite->user_id       = $user_id;
@@ -872,6 +879,12 @@ function groups_send_membership_request( $requesting_user_id, $group_id ) {
 	if ( groups_is_user_member( $requesting_user_id, $group_id ) || groups_is_user_banned( $requesting_user_id, $group_id ) )
 		return false;
 
+	// Check if the user is already invited - if so, simply accept invite
+	if ( groups_check_user_has_invite ( $requesting_user_id, $group_id ) ) {
+		groups_accept_invite ( $requesting_user_id, $group_id );
+		return true;
+	}
+
 	$requesting_user                = new BP_Groups_Member;
 	$requesting_user->group_id      = $group_id;
 	$requesting_user->user_id       = $requesting_user_id;
@@ -973,6 +986,24 @@ function groups_accept_all_pending_membership_requests( $group_id ) {
 	return true;
 }
 
+function groups_check_for_membership_request_and_invite( $user_id, $group_id ) {
+	$ret = array(
+		'has_invite'	=> false,
+		'has_request'	=> false,
+	);
+
+	$data = BP_Groups_Member::get_invites_and_requests( $user_id, $group_id );
+	foreach ( $data as $row ) {
+		if ( $row['inviter_id'] != 0 ) {
+			$ret['has_invite'] = true;
+		} else {
+			$ret['has_request'] = true;
+		}
+	}
+
+	return $ret;
+}
+
 /*** Group Meta ****************************************************/
 
 function groups_delete_groupmeta( $group_id, $meta_key = false, $meta_value = false ) {
Index: bp-groups/bp-groups-loader.php
===================================================================
--- bp-groups/bp-groups-loader.php	(revision 7234)
+++ bp-groups/bp-groups-loader.php	(working copy)
@@ -423,8 +423,13 @@ class BP_Groups_Component extends BP_Component {
 				 !groups_check_for_membership_request( bp_loggedin_user_id(), $this->current_group->id ) &&
 				 $this->current_group->status == 'private'
 				) {
+				if ( groups_check_user_has_invite( bp_loggedin_user_id(), $this->current_group->id ) )
+					$label = __( 'Accept Invitation', 'buddypress' );
+				else
+					$label = __( 'Request Membership', 'buddypress' );
+
 				$sub_nav[] = array(
-					'name'               => __( 'Request Membership', 'buddypress' ),
+					'name'               => $label,
 					'slug'               => 'request-membership',
 					'parent_url'         => $group_link,
 					'parent_slug'        => $this->current_group->slug,
Index: bp-groups/bp-groups-screens.php
===================================================================
--- bp-groups/bp-groups-screens.php	(revision 7234)
+++ bp-groups/bp-groups-screens.php	(working copy)
@@ -467,6 +467,15 @@ function groups_screen_group_request_membership() {
 	if ( 'private' != $bp->groups->current_group->status )
 		return false;
 
+	// If the user is already invited, accept invitation
+	if ( groups_check_user_has_invite( bp_loggedin_user_id(), $bp->groups->current_group->id ) ) {
+		if ( groups_accept_invite( bp_loggedin_user_id(), $bp->groups->current_group->id ) )
+			bp_core_add_message( __( 'Group invite accepted', 'buddypress' ) );
+		else
+			bp_core_add_message( __( 'There was an error accepting the group invitation, please try again.', 'buddypress' ), 'error' );
+		bp_core_redirect( bp_get_group_permalink( $bp->groups->current_group ) );
+	}
+
 	// If the user has submitted a request, send it.
 	if ( isset( $_POST['group-request-send']) ) {
 
@@ -1115,7 +1124,7 @@ class BP_Groups_Theme_Compat {
 	/** Single ****************************************************************/
 
 	/**
-	 * Add custom template hierarchy to theme compat for group pages. 
+	 * Add custom template hierarchy to theme compat for group pages.
 	 *
 	 * This is to mirror how WordPress has {@link https://codex.wordpress.org/Template_Hierarchy template hierarchy}.
 	 *
Index: bp-groups/bp-groups-template.php
===================================================================
--- bp-groups/bp-groups-template.php	(revision 7234)
+++ bp-groups/bp-groups-template.php	(working copy)
@@ -1780,23 +1780,25 @@ function bp_group_join_button( $group = false ) {
 
 				case 'private' :
 
-					// Member has not requested membership yet
-					if ( !bp_group_has_requested_membership( $group ) ) {
+					$membership_status = groups_check_for_membership_request_and_invite( bp_loggedin_user_id(), $group->id );
+
+					// Member has invite
+					if (  $membership_status['has_invite'] ) {
 						$button = array(
-							'id'                => 'request_membership',
+							'id'                => 'accept_invite',
 							'component'         => 'groups',
 							'must_be_logged_in' => true,
 							'block_self'        => false,
 							'wrapper_class'     => 'group-button ' . $group->status,
 							'wrapper_id'        => 'groupbutton-' . $group->id,
 							'link_href'         => wp_nonce_url( bp_get_group_permalink( $group ) . 'request-membership', 'groups_request_membership' ),
-							'link_text'         => __( 'Request Membership', 'buddypress' ),
-							'link_title'        => __( 'Request Membership', 'buddypress' ),
-							'link_class'        => 'group-button request-membership',
+							'link_text'         => __( 'Accept Invitation', 'buddypress' ),
+							'link_title'        => __( 'Accept Invitation', 'buddypress' ),
+							'link_class'        => 'group-button accept-invite',
 						);
 
 					// Member has requested membership already
-					} else {
+					} elseif ( $membership_status['has_request'] ) {
 						$button = array(
 							'id'                => 'membership_requested',
 							'component'         => 'groups',
@@ -1809,6 +1811,21 @@ function bp_group_join_button( $group = false ) {
 							'link_title'        => __( 'Request Sent', 'buddypress' ),
 							'link_class'        => 'group-button pending membership-requested',
 						);
+
+					// Member has not requested membership yet
+					} else {
+						$button = array(
+							'id'                => 'request_membership',
+							'component'         => 'groups',
+							'must_be_logged_in' => true,
+							'block_self'        => false,
+							'wrapper_class'     => 'group-button ' . $group->status,
+							'wrapper_id'        => 'groupbutton-' . $group->id,
+							'link_href'         => wp_nonce_url( bp_get_group_permalink( $group ) . 'request-membership', 'groups_request_membership' ),
+							'link_text'         => __( 'Request Membership', 'buddypress' ),
+							'link_title'        => __( 'Request Membership', 'buddypress' ),
+							'link_class'        => 'group-button request-membership',
+						);
 					}
 
 					break;
Index: bp-templates/bp-legacy/buddypress-functions.php
===================================================================
--- bp-templates/bp-legacy/buddypress-functions.php	(revision 7234)
+++ bp-templates/bp-legacy/buddypress-functions.php	(working copy)
@@ -1056,7 +1056,13 @@ function bp_legacy_theme_ajax_joinleave_group() {
 		} elseif ( 'private' == $group->status ) {
 			check_ajax_referer( 'groups_request_membership' );
 
-			if ( ! groups_send_membership_request( bp_loggedin_user_id(), $group->id ) ) {
+			if ( groups_check_user_has_invite ( bp_loggedin_user_id(), $group->id ) ) {
+				if ( ! groups_accept_invite ( bp_loggedin_user_id(), $group->id ) ) {
+					_e( 'Error requesting membership', 'buddypress' );
+				} else {
+					echo '<a id="group-' . esc_attr( $group->id ) . '" class="leave-group" rel="leave" title="' . __( 'Leave Group', 'buddypress' ) . '" href="' . wp_nonce_url( bp_get_group_permalink( $group ) . 'leave-group', 'groups_leave_group' ) . '">' . __( 'Leave Group', 'buddypress' ) . '</a>';
+				}
+			} elseif ( ! groups_send_membership_request( bp_loggedin_user_id(), $group->id ) ) {
 				_e( 'Error requesting membership', 'buddypress' );
 			} else {
 				echo '<a id="group-' . esc_attr( $group->id ) . '" class="membership-requested" rel="membership-requested" title="' . __( 'Membership Requested', 'buddypress' ) . '" href="' . bp_get_group_permalink( $group ) . '">' . __( 'Membership Requested', 'buddypress' ) . '</a>';
Index: bp-themes/bp-default/_inc/ajax.php
===================================================================
--- bp-themes/bp-default/_inc/ajax.php	(revision 7234)
+++ bp-themes/bp-default/_inc/ajax.php	(working copy)
@@ -718,7 +718,13 @@ function bp_dtheme_ajax_joinleave_group() {
 		} elseif ( 'private' == $group->status ) {
 			check_ajax_referer( 'groups_request_membership' );
 
-			if ( ! groups_send_membership_request( bp_loggedin_user_id(), $group->id ) ) {
+			if ( groups_check_user_has_invite ( bp_loggedin_user_id(), $group->id ) ) {
+				if ( ! groups_accept_invite ( bp_loggedin_user_id(), $group->id ) ) {
+					_e( 'Error requesting membership', 'buddypress' );
+				} else {
+					echo '<a id="group-' . esc_attr( $group->id ) . '" class="leave-group" rel="leave" title="' . __( 'Leave Group', 'buddypress' ) . '" href="' . wp_nonce_url( bp_get_group_permalink( $group ) . 'leave-group', 'groups_leave_group' ) . '">' . __( 'Leave Group', 'buddypress' ) . '</a>';
+				}
+			} elseif ( ! groups_send_membership_request( bp_loggedin_user_id(), $group->id ) ) {
 				_e( 'Error requesting membership', 'buddypress' );
 			} else {
 				echo '<a id="group-' . esc_attr( $group->id ) . '" class="membership-requested" rel="membership-requested" title="' . __( 'Membership Requested', 'buddypress' ) . '" href="' . bp_get_group_permalink( $group ) . '">' . __( 'Membership Requested', 'buddypress' ) . '</a>';
