diff -ur ../plugins.orig/buddypress/bp-groups/bp-groups-actions.php buddypress/bp-groups/bp-groups-actions.php
--- ../plugins.orig/buddypress/bp-groups/bp-groups-actions.php	2014-10-07 01:36:25.000000000 +0000
+++ buddypress/bp-groups/bp-groups-actions.php	2015-01-07 11:54:03.274938558 +0000
@@ -169,7 +169,6 @@
 		}
 
 		if ( 'group-settings' == bp_get_groups_current_create_step() ) {
-			$group_status = 'public';
 			$group_enable_forum = 1;
 
 			if ( !isset($_POST['group-show-forum']) ) {
@@ -181,10 +180,10 @@
 				}
 			}
 
-			if ( 'private' == $_POST['group-status'] )
-				$group_status = 'private';
-			else if ( 'hidden' == $_POST['group-status'] )
-				$group_status = 'hidden';
+			if ( groups_is_valid_status( $_POST['group-status'] ) )
+				$group_status = $_POST['group-status'];
+			else
+				$group_status = 'public';
 
 			if ( !$bp->groups->new_group_id = groups_create_group( array( 'group_id' => $bp->groups->new_group_id, 'status' => $group_status, 'enable_forum' => $group_enable_forum ) ) ) {
 				bp_core_add_message( __( 'There was an error saving group details, please try again.', 'buddypress' ), 'error' );
diff -ur ../plugins.orig/buddypress/bp-groups/bp-groups-adminbar.php buddypress/bp-groups/bp-groups-adminbar.php
--- ../plugins.orig/buddypress/bp-groups/bp-groups-adminbar.php	2014-10-07 01:36:25.000000000 +0000
+++ buddypress/bp-groups/bp-groups-adminbar.php	2015-01-08 09:50:30.524936615 +0000
@@ -88,7 +88,7 @@
 	) );
 
 	// Group Admin > Membership Requests
-	if ( bp_get_group_status( $bp->groups->current_group ) == 'private' ) {
+	if ( groups_membership_request_moderated( bp_get_group_status( $bp->groups->current_group ) ) ) {
 		$wp_admin_bar->add_menu( array(
 			'parent' => $bp->group_admin_menu_id,
 			'id'     => 'membership-requests',
diff -ur ../plugins.orig/buddypress/bp-groups/bp-groups-buddybar.php buddypress/bp-groups/bp-groups-buddybar.php
--- ../plugins.orig/buddypress/bp-groups/bp-groups-buddybar.php	2014-08-07 22:27:03.000000000 +0000
+++ buddypress/bp-groups/bp-groups-buddybar.php	2015-01-08 11:10:14.436988554 +0000
@@ -49,7 +49,7 @@
 
 			<li><a href="<?php bp_groups_action_link( 'admin/manage-members' ); ?>"><?php _e( 'Manage Members', 'buddypress' ); ?></a></li>
 
-			<?php if ( $bp->groups->current_group->status == 'private' ) : ?>
+			<?php if ( groups_membership_request_moderated( $bp->groups->current_group->status ) ) : ?>
 
 				<li><a href="<?php bp_groups_action_link( 'admin/membership-requests' ); ?>"><?php _e( 'Membership Requests', 'buddypress' ); ?></a></li>
 
diff -ur ../plugins.orig/buddypress/bp-groups/bp-groups-functions.php buddypress/bp-groups/bp-groups-functions.php
--- ../plugins.orig/buddypress/bp-groups/bp-groups-functions.php	2014-10-07 01:36:25.000000000 +0000
+++ buddypress/bp-groups/bp-groups-functions.php	2015-01-08 11:37:45.076008636 +0000
@@ -221,10 +221,10 @@
 	$group->enable_forum = $enable_forum;
 
 	/***
-	 * Before we potentially switch the group status, if it has been changed to public
-	 * from private and there are outstanding membership requests, auto-accept those requests.
+	 * Before we potentially switch the group status, if it has been changed to a status
+	 * who not requires membership requests, auto-accept pending requests.
 	 */
-	if ( 'private' == $group->status && 'public' == $status )
+	if ( !groups_membership_request_moderated( $status ) )
 		groups_accept_all_pending_membership_requests( $group->id );
 
 	// Now update the status
@@ -291,6 +291,56 @@
 }
 
 /**
+ * Check if this group status (eg 'private') allows membership requests.
+ *
+ * @param string $status Status to check.
+ * @return bool True if status requires join moderation, otherwise false.
+ */
+function groups_membership_request_allowed( $status ) {
+	global $bp;
+
+	return in_array( $status, $bp->groups->membership_request_allowed_status );
+}
+
+/**
+ * Check if membership request to this group status (eg 'private') is moderated.
+ *
+ * @param string $status Status to check.
+ * @return bool True if status allows joining, otherwise false.
+ */
+function groups_membership_request_moderated( $status ) {
+	global $bp;
+
+	return in_array( $status, $bp->groups->membership_request_moderated_status );
+}
+
+/**
+ * Check a group status (eg 'private') against the whitelist of creation statuses.
+ *
+ * @param string $status Status to check.
+ * @return bool True if status is allowed, otherwise false.
+ */
+function groups_is_valid_creation_status( $status ) {
+	global $bp;
+
+	return in_array( $status, (array) $bp->groups->valid_creation_status );
+}
+
+/**
+ * Display membership request description for group status.
+ *
+ * @param string $status Status to check.
+ */
+function group_membership_request_description( $status ) {
+   if ( groups_membership_request_moderated( $status ) )
+     _e( 'Only users who request membership and are accepted can join the group.', 'buddypress' );
+   elseif ( groups_membership_request_allowed( $status ) )
+     _e( 'Any site member can join this group.', 'buddypress' );
+   else
+     _e( 'Only users who are invited can join the group.', 'buddypress' );
+}
+
+/**
  * Provide a unique, sanitized version of a group slug.
  *
  * @param string $slug Group slug to check.
diff -ur ../plugins.orig/buddypress/bp-groups/bp-groups-loader.php buddypress/bp-groups/bp-groups-loader.php
--- ../plugins.orig/buddypress/bp-groups/bp-groups-loader.php	2014-10-07 01:36:25.000000000 +0000
+++ buddypress/bp-groups/bp-groups-loader.php	2015-01-08 11:57:39.648225507 +0000
@@ -80,6 +80,34 @@
 	public $valid_status;
 
 	/**
+	 * Allowed group statuses (for non-super-admins) (Public, Private, Hidden).
+	 *
+	 * @since BuddyPress (1.5.0)
+	 * @access public
+	 * @var array
+	 */
+	public $valid_creation_status;
+
+	/**
+	 * Group statuses who allows membership request (Public, Private).
+	 *
+	 * @since BuddyPress (2.1.0)
+	 * @access public
+	 * @var array
+	 */
+	public $membeship_request_allowed_status;
+
+	/**
+	 * Group statuses who requires membership request moderation (Private).
+	 *
+	 * @since BuddyPress (2.1.0)
+	 * @access public
+	 * @var array
+	 */
+	public $membeship_request_moderated_status;
+
+
+	/**
 	 * Start the groups component creation process.
 	 *
 	 * @since BuddyPress (1.5.0)
@@ -292,6 +320,22 @@
 			'hidden'
 		) );
 
+		$this->valid_creation_status = apply_filters( 'groups_valid_creation_status', array(
+			'public',
+			'private',
+			'hidden'
+		) );
+
+
+		$this->membership_request_allowed_status = apply_filters( 'groups_membership_request_allowed', array(
+			'public',
+			'private'
+		) );
+
+		$this->membership_request_moderated_status = apply_filters( 'groups_membership_request_moderated', array(
+			'private'
+		) );
+
 		// Auto join group when non group member performs group activity
 		$this->auto_join = defined( 'BP_DISABLE_AUTO_GROUP_JOIN' ) && BP_DISABLE_AUTO_GROUP_JOIN ? false : true;
 	}
@@ -440,7 +484,8 @@
 			if ( is_user_logged_in() &&
 				 ! $this->current_group->is_user_member &&
 				 ! groups_check_for_membership_request( bp_loggedin_user_id(), $this->current_group->id ) &&
-				 $this->current_group->status == 'private' &&
+				 groups_membership_request_allowed( $this->current_group->status ) &&
+				 groups_membership_request_moderated( $this->current_group->status ) &&
 				 ! groups_check_user_has_invite( bp_loggedin_user_id(), $this->current_group->id )
 				) {
 
diff -ur ../plugins.orig/buddypress/bp-groups/bp-groups-screens.php buddypress/bp-groups/bp-groups-screens.php
--- ../plugins.orig/buddypress/bp-groups/bp-groups-screens.php	2014-10-07 01:36:25.000000000 +0000
+++ buddypress/bp-groups/bp-groups-screens.php	2015-01-08 10:00:42.782096292 +0000
@@ -150,7 +150,11 @@
 			check_admin_referer( 'bp_forums_new_reply' );
 
 			// Auto join this user if they are not yet a member of this group
-			if ( bp_groups_auto_join() && !bp_current_user_can( 'bp_moderate' ) && 'public' == $bp->groups->current_group->status && !groups_is_user_member( bp_loggedin_user_id(), $bp->groups->current_group->id ) ) {
+			if ( bp_groups_auto_join() &&
+			     !bp_current_user_can( 'bp_moderate' ) &&
+			     groups_membership_request_allowed($bp->groups->current_group->status) &&
+			     !groups_membership_request_moderated($bp->groups->current_group->status) &&
+			     !groups_is_user_member( bp_loggedin_user_id(), $bp->groups->current_group->id ) ) {
 				groups_join_group( $bp->groups->current_group->id, bp_loggedin_user_id() );
 			}
 
@@ -372,7 +376,11 @@
 			if ( $user_is_banned ) {
 				$error_message = __( "You have been banned from this group.", 'buddypress' );
 
-			} elseif ( bp_groups_auto_join() && !bp_current_user_can( 'bp_moderate' ) && 'public' == $bp->groups->current_group->status && !groups_is_user_member( bp_loggedin_user_id(), $bp->groups->current_group->id ) ) {
+			} elseif ( bp_groups_auto_join() &&
+				   !bp_current_user_can( 'bp_moderate' ) &&
+				   groups_membership_request_allowed($bp->groups->current_group->status) &&
+				   !groups_membership_request_moderated($bp->groups->current_group->status) &&
+                                   !groups_is_user_member( bp_loggedin_user_id(), $bp->groups->current_group->id ) ) {
 				// Auto join this user if they are not yet a member of this group
 				groups_join_group( $bp->groups->current_group->id, bp_loggedin_user_id() );
 			}
@@ -516,7 +524,7 @@
 
 	$bp = buddypress();
 
-	if ( 'private' != $bp->groups->current_group->status )
+	if ( !groups_membership_request_moderated( $bp->groups->current_group->status ) )
 		return false;
 
 	// If the user is already invited, accept invitation
@@ -866,7 +874,8 @@
 		return false;
 	}
 
-	if ( ! bp_is_item_admin() || ( 'public' == $bp->groups->current_group->status ) ) {
+	if ( !bp_is_item_admin() ||
+	     !groups_membership_request_moderated( $bp->groups->current_group->status )) {
 		return false;
 	}
 
diff -ur ../plugins.orig/buddypress/bp-groups/bp-groups-template.php buddypress/bp-groups/bp-groups-template.php
--- ../plugins.orig/buddypress/bp-groups/bp-groups-template.php	2014-10-07 01:36:25.000000000 +0000
+++ buddypress/bp-groups/bp-groups-template.php	2015-01-08 10:50:51.622057993 +0000
@@ -711,7 +711,7 @@
 		} else if ( 'private' == $group->status ) {
 			$type = __( "Private Group", "buddypress" );
 		} else {
-			$type = ucwords( $group->status ) . ' ' . __( 'Group', 'buddypress' );
+			$type = sprintf ( __( '%s Group', 'buddypress' ), ucwords( $group->status ) );
 		}
 
 		return apply_filters( 'bp_get_group_type', $type );
@@ -2083,7 +2083,7 @@
 
 	<li<?php if ( 'manage-members' == $current_tab ) : ?> class="current"<?php endif; ?>><a href="<?php echo trailingslashit( bp_get_group_permalink( $group ) . 'admin/manage-members' ) ?>"><?php _e( 'Members', 'buddypress' ); ?></a></li>
 
-	<?php if ( $groups_template->group->status == 'private' ) : ?>
+	<?php if ( groups_membership_request_moderated( $groups_template->group->status ) ) : ?>
 
 		<li<?php if ( 'membership-requests' == $current_tab ) : ?> class="current"<?php endif; ?>><a href="<?php echo trailingslashit( bp_get_group_permalink( $group ) . 'admin/membership-requests' ) ?>"><?php _e( 'Requests', 'buddypress' ); ?></a></li>
 
@@ -2404,78 +2404,70 @@
 		} else {
 
 			// Show different buttons based on group status
-			switch ( $group->status ) {
-				case 'hidden' :
-					return false;
-					break;
-
-				case 'public':
-					$button = array(
-						'id'                => 'join_group',
-						'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 ) . 'join', 'groups_join_group' ),
-						'link_text'         => __( 'Join Group', 'buddypress' ),
-						'link_title'        => __( 'Join Group', 'buddypress' ),
-						'link_class'        => 'group-button join-group',
-					);
-					break;
-
-				case 'private' :
+			if ( !groups_membership_request_allowed($group->status) ) {
+				return false;
+			}
 
-					// Member has outstanding invitation -
-					// show an "Accept Invitation" button
-					if ( $group->is_invited ) {
-						$button = array(
-							'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'         => add_query_arg( 'redirect_to', bp_get_group_permalink( $group ), bp_get_group_accept_invite_link( $group ) ),
-							'link_text'         => __( 'Accept Invitation', 'buddypress' ),
-							'link_title'        => __( 'Accept Invitation', 'buddypress' ),
-							'link_class'        => 'group-button accept-invite',
-						);
-
-					// Member has requested membership but request is pending -
-					// show a "Request Sent" button
-					} elseif ( $group->is_pending ) {
-						$button = array(
-							'id'                => 'membership_requested',
-							'component'         => 'groups',
-							'must_be_logged_in' => true,
-							'block_self'        => false,
-							'wrapper_class'     => 'group-button pending ' . $group->status,
-							'wrapper_id'        => 'groupbutton-' . $group->id,
-							'link_href'         => bp_get_group_permalink( $group ),
-							'link_text'         => __( 'Request Sent', 'buddypress' ),
-							'link_title'        => __( 'Request Sent', 'buddypress' ),
-							'link_class'        => 'group-button pending membership-requested',
-						);
-
-					// Member has not requested membership yet -
-					// show a "Request Membership" button
-					} 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',
-						);
-					}
+			if ( !groups_membership_request_moderated($group->status) ) {
+				$button = array(
+					'id'                => 'join_group',
+					'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 ) . 'join', 'groups_join_group' ),
+					'link_text'         => __( 'Join Group', 'buddypress' ),
+					'link_title'        => __( 'Join Group', 'buddypress' ),
+					'link_class'        => 'group-button join-group',
+				);
+			} elseif ( $group->is_invited ) {
+				// Member has outstanding invitation -
+				// show an "Accept Invitation" button
+				$button = array(
+					'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'         => add_query_arg( 'redirect_to', bp_get_group_permalink( $group ), bp_get_group_accept_invite_link( $group ) ),
+					'link_text'         => __( 'Accept Invitation', 'buddypress' ),
+					'link_title'        => __( 'Accept Invitation', 'buddypress' ),
+					'link_class'        => 'group-button accept-invite',
+				);
+
+			} elseif ( $group->is_pending ) {
+				// Member has requested membership but request is pending -
+				// show a "Request Sent" button
+				$button = array(
+					'id'                => 'membership_requested',
+					'component'         => 'groups',
+					'must_be_logged_in' => true,
+					'block_self'        => false,
+					'wrapper_class'     => 'group-button pending ' . $group->status,
+					'wrapper_id'        => 'groupbutton-' . $group->id,
+					'link_href'         => bp_get_group_permalink( $group ),
+					'link_text'         => __( 'Request Sent', 'buddypress' ),
+					'link_title'        => __( 'Request Sent', 'buddypress' ),
+					'link_class'        => 'group-button pending membership-requested',
+				);
 
-					break;
+			} else {
+				// Member has not requested membership yet -
+				// show a "Request Membership" button
+				$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',
+				);
 			}
 		}
 
@@ -2534,7 +2526,7 @@
 	if ( ! $group )
 		$group =& $groups_template->group;
 
-	if ( 'private' == $group->status ) {
+	if ( groups_membership_request_moderated( $group->status ) ) {
  		if ( ! bp_group_has_requested_membership() ) {
 			if ( is_user_logged_in() && bp_group_is_invited() ) {
 				$message = __( 'You must accept your pending invitation before you can access this private group.', 'buddypress' );
diff -ur ../plugins.orig/buddypress/bp-templates/bp-legacy/buddypress/groups/create.php buddypress/bp-templates/bp-legacy/buddypress/groups/create.php
--- ../plugins.orig/buddypress/bp-templates/bp-legacy/buddypress/groups/create.php	2014-10-07 01:36:25.000000000 +0000
+++ buddypress/bp-templates/bp-legacy/buddypress/groups/create.php	2015-01-08 11:53:40.500994274 +0000
@@ -51,34 +51,41 @@
 				<h4><?php _e( 'Privacy Options', 'buddypress' ); ?></h4>
 
 				<div class="radio">
-					<label><input type="radio" name="group-status" value="public"<?php if ( 'public' == bp_get_new_group_status() || !bp_get_new_group_status() ) { ?> checked="checked"<?php } ?> /> <strong><?php _e( 'This is a public group', 'buddypress' ); ?></strong></label>
+<?php if ( is_super_admin() || groups_is_valid_creation_status( 'public' ) ) : ?>
+					<label>
+						<input type="radio" name="group-status" value="public"<?php if ( 'public' == bp_get_new_group_status() || !bp_get_new_group_status() ) { ?> checked="checked"<?php } ?> /> <strong><?php _e( 'This is a public group', 'buddypress' ); ?></strong></label>
 					<ul>
-						<li><?php _e( 'Any site member can join this group.', 'buddypress' ); ?></li>
+						<li><?php group_membership_request_description( 'public' ); ?></li>
 						<li><?php _e( 'This group will be listed in the groups directory and in search results.', 'buddypress' ); ?></li>
 						<li><?php _e( 'Group content and activity will be visible to any site member.', 'buddypress' ); ?></li>
 					</ul>
+<?php endif; ?>
 
-
+<?php if ( is_super_admin() || groups_is_valid_creation_status( 'private' ) ) : ?>
 					<label>
 						<input type="radio" name="group-status" value="private"<?php if ( 'private' == bp_get_new_group_status() ) { ?> checked="checked"<?php } ?> /> 
 						<strong><?php _e( 'This is a private group', 'buddypress' ); ?></strong>
 					</label>
 					<ul>
-						<li><?php _e( 'Only users who request membership and are accepted can join the group.', 'buddypress' ); ?></li>
+						<li><?php group_membership_request_description( 'private' ); ?></li>
 						<li><?php _e( 'This group will be listed in the groups directory and in search results.', 'buddypress' ); ?></li>
 						<li><?php _e( 'Group content and activity will only be visible to members of the group.', 'buddypress' ); ?></li>
 					</ul>
+<?php endif; ?>
+
 
+<?php if ( is_super_admin() || groups_is_valid_creation_status( 'hidden' ) ) : ?>
 
 					<label>
 						<input type="radio" name="group-status" value="hidden"<?php if ( 'hidden' == bp_get_new_group_status() ) { ?> checked="checked"<?php } ?> /> 
 						<strong><?php _e('This is a hidden group', 'buddypress' ); ?></strong>
 					</label>
 					<ul>
-						<li><?php _e( 'Only users who are invited can join the group.', 'buddypress' ); ?></li>
+						<li><?php group_membership_request_description( 'hidden' ); ?></li>
 						<li><?php _e( 'This group will not be listed in the groups directory or search results.', 'buddypress' ); ?></li>
 						<li><?php _e( 'Group content and activity will only be visible to members of the group.', 'buddypress' ); ?></li>
 					</ul>
+<?php endif; ?>
 
 				</div>
 
@@ -306,4 +313,4 @@
 
 </div>
 
-<?php do_action( 'bp_after_create_group_page' ); ?>
\ No newline at end of file
+<?php do_action( 'bp_after_create_group_page' ); ?>
diff -ur ../plugins.orig/buddypress/bp-templates/bp-legacy/buddypress/groups/single/admin.php buddypress/bp-templates/bp-legacy/buddypress/groups/single/admin.php
--- ../plugins.orig/buddypress/bp-templates/bp-legacy/buddypress/groups/single/admin.php	2014-10-07 01:36:25.000000000 +0000
+++ buddypress/bp-templates/bp-legacy/buddypress/groups/single/admin.php	2015-01-08 11:55:09.354080689 +0000
@@ -55,36 +55,77 @@
 
 	<h4><?php _e( 'Privacy Options', 'buddypress' ); ?></h4>
 
+<?php
+
+$current_group_status = bp_get_group_status();
+if (!is_super_admin() && !is_valid_creation_status( $current_group_status ) ) : ?>
+	<div class="radio">
+		<label>
+			<input type="hidden" name="group-status" value="<?php
+				echo esc_attr($current_group_status);
+			?>" />
+			<strong>
+	<?php
+		switch ($current_group_status) {
+		  case 'public':
+			_e( 'This is a public group', 'buddypress' );
+			break;
+		  case 'private':
+			_e( 'This is a private group', 'buddypress' );
+			break;
+		  case 'hidden':
+			_e( 'This is a hidden group', 'buddypress' );
+			break;
+		  default:
+			printf( __( 'This is a %s group', 'buddypress' ),
+				$current_group_status );
+			break;
+		}
+	?>
+			</strong>
+		</label>
+	</div>
+<?php else : ?>
 	<div class="radio">
+	<?php if (is_super_admin() || is_valid_creation_status( 'public' ) ) : ?>
 		<label>
 			<input type="radio" name="group-status" value="public"<?php bp_group_show_status_setting( 'public' ); ?> />
 			<strong><?php _e( 'This is a public group', 'buddypress' ); ?></strong>
 			<ul>
-				<li><?php _e( 'Any site member can join this group.', 'buddypress' ); ?></li>
+				<li><?php group_membership_request_description( 'public' ); ?></li>
 				<li><?php _e( 'This group will be listed in the groups directory and in search results.', 'buddypress' ); ?></li>
 				<li><?php _e( 'Group content and activity will be visible to any site member.', 'buddypress' ); ?></li>
 			</ul>
 		</label>
+	<?php endif; ?>
 
+	<?php if (is_super_admin() || is_valid_creation_status( 'private' ) ) : ?>
 		<label>
 			<input type="radio" name="group-status" value="private"<?php bp_group_show_status_setting( 'private' ); ?> />
 			<strong><?php _e( 'This is a private group', 'buddypress' ); ?></strong>
 			<ul>
-				<li><?php _e( 'Only users who request membership and are accepted can join the group.', 'buddypress' ); ?></li>
+				<li><?php group_membership_request_description( 'public' ); ?></li>
 				<li><?php _e( 'This group will be listed in the groups directory and in search results.', 'buddypress' ); ?></li>
 				<li><?php _e( 'Group content and activity will only be visible to members of the group.', 'buddypress' ); ?></li>
 			</ul>
 		</label>
+	<?php endif; ?>
 
+	<?php if (is_super_admin() || is_valid_creation_status( 'hidden' ) ) : ?>
 		<label>
 			<input type="radio" name="group-status" value="hidden"<?php bp_group_show_status_setting( 'hidden' ); ?> />
 			<strong><?php _e( 'This is a hidden group', 'buddypress' ); ?></strong>
 			<ul>
-				<li><?php _e( 'Only users who are invited can join the group.', 'buddypress' ); ?></li>
+				<li><?php group_membership_request_description( 'public' ); ?></li>
 				<li><?php _e( 'This group will not be listed in the groups directory or search results.', 'buddypress' ); ?></li>
 				<li><?php _e( 'Group content and activity will only be visible to members of the group.', 'buddypress' ); ?></li>
 			</ul>
 		</label>
+
+	<?php endif; ?>
+
+<?php endif; ?>
+
 	</div>
 
 	<hr />
diff -ur ../plugins.orig/buddypress/bp-templates/bp-legacy/buddypress-functions.php buddypress/bp-templates/bp-legacy/buddypress-functions.php
--- ../plugins.orig/buddypress/bp-templates/bp-legacy/buddypress-functions.php	2014-10-07 01:36:25.000000000 +0000
+++ buddypress/bp-templates/bp-legacy/buddypress-functions.php	2015-01-08 13:27:14.668057520 +0000
@@ -1188,7 +1188,8 @@
 		return;
 
 	if ( ! groups_is_user_member( bp_loggedin_user_id(), $group->id ) ) {
-		if ( 'public' == $group->status ) {
+	    if ( groups_membership_request_allowed($group->status) ) {
+		if ( !groups_membership_request_moderated($group->status) ) {
 			check_ajax_referer( 'groups_join_group' );
 
 			if ( ! groups_join_group( $group->id ) ) {
@@ -1197,8 +1198,7 @@
 				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 ( 'private' == $group->status ) {
-
+		} else {
 			// If the user has already been invited, then this is
 			// an Accept Invitation button
 			if ( groups_check_user_has_invite( bp_loggedin_user_id(), $group->id ) ) {
@@ -1209,7 +1209,6 @@
 				} 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>';
 				}
-
 			// Otherwise, it's a Request Membership button
 			} else {
 				check_ajax_referer( 'groups_request_membership' );
@@ -1217,19 +1216,22 @@
 				if ( ! 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>';
+					echo '<a id="group-' . esc_attr( $group->id ) . '" class="membership-requested disabled" rel="membership-requested" title="' . __( 'Membership Requested', 'buddypress' ) . '" href="' . bp_get_group_permalink( $group ) . '" onClick="return false;">' . __( 'Membership Requested', 'buddypress' ) . '</a>';
 				}
 			}
 		}
-
+	    }
 	} else {
 		check_ajax_referer( 'groups_leave_group' );
 
 		if ( ! groups_leave_group( $group->id ) ) {
+
 			_e( 'Error leaving group', 'buddypress' );
-		} elseif ( 'public' == $group->status ) {
+		} elseif ( !groups_membership_request_moderated($group->status) ) {
 			echo '<a id="group-' . esc_attr( $group->id ) . '" class="join-group" rel="join" title="' . __( 'Join Group', 'buddypress' ) . '" href="' . wp_nonce_url( bp_get_group_permalink( $group ) . 'join', 'groups_join_group' ) . '">' . __( 'Join Group', 'buddypress' ) . '</a>';
-		} elseif ( 'private' == $group->status ) {
+
+		} elseif ( groups_membership_request_allowed($group->status) ) {
+
 			echo '<a id="group-' . esc_attr( $group->id ) . '" class="request-membership" rel="join" title="' . __( 'Request Membership', 'buddypress' ) . '" href="' . wp_nonce_url( bp_get_group_permalink( $group ) . 'request-membership', 'groups_send_membership_request' ) . '">' . __( 'Request Membership', 'buddypress' ) . '</a>';
 		}
 	}
diff -ur ../plugins.orig/buddypress/bp-themes/bp-default/groups/create.php buddypress/bp-themes/bp-default/groups/create.php
--- ../plugins.orig/buddypress/bp-themes/bp-default/groups/create.php	2014-10-07 01:36:25.000000000 +0000
+++ buddypress/bp-themes/bp-default/groups/create.php	2015-01-08 11:56:14.333004966 +0000
@@ -58,32 +58,39 @@
 					<h4><?php _e( 'Privacy Options', 'buddypress' ); ?></h4>
 
 					<div class="radio">
+
+<?php if ( is_super_admin() || groups_is_valid_creation_status( 'public' ) ) : ?>
 						<label><input type="radio" name="group-status" value="public"<?php if ( 'public' == bp_get_new_group_status() || !bp_get_new_group_status() ) { ?> checked="checked"<?php } ?> />
 							<strong><?php _e( 'This is a public group', 'buddypress' ); ?></strong>
 							<ul>
-								<li><?php _e( 'Any site member can join this group.', 'buddypress' ); ?></li>
+								<li><?php group_membership_request_description( 'public' ); ?></li>
 								<li><?php _e( 'This group will be listed in the groups directory and in search results.', 'buddypress' ); ?></li>
 								<li><?php _e( 'Group content and activity will be visible to any site member.', 'buddypress' ); ?></li>
 							</ul>
 						</label>
+<?php endif; ?>
 
+<?php if ( is_super_admin() || groups_is_valid_creation_status( 'private' ) ) : ?>
 						<label><input type="radio" name="group-status" value="private"<?php if ( 'private' == bp_get_new_group_status() ) { ?> checked="checked"<?php } ?> />
 							<strong><?php _e( 'This is a private group', 'buddypress' ); ?></strong>
 							<ul>
-								<li><?php _e( 'Only users who request membership and are accepted can join the group.', 'buddypress' ); ?></li>
+								<li><?php group_membership_request_description( 'private' ); ?></li>
 								<li><?php _e( 'This group will be listed in the groups directory and in search results.', 'buddypress' ); ?></li>
 								<li><?php _e( 'Group content and activity will only be visible to members of the group.', 'buddypress' ); ?></li>
 							</ul>
 						</label>
+<?php endif; ?>
 
+<?php if ( is_super_admin() || groups_is_valid_creation_status( 'hidden' ) ) : ?>
 						<label><input type="radio" name="group-status" value="hidden"<?php if ( 'hidden' == bp_get_new_group_status() ) { ?> checked="checked"<?php } ?> />
 							<strong><?php _e('This is a hidden group', 'buddypress'); ?></strong>
 							<ul>
-								<li><?php _e( 'Only users who are invited can join the group.', 'buddypress' ); ?></li>
+								<li><?php group_membership_request_description( 'hidden' ); ?></li>
 								<li><?php _e( 'This group will not be listed in the groups directory or search results.', 'buddypress' ); ?></li>
 								<li><?php _e( 'Group content and activity will only be visible to members of the group.', 'buddypress' ); ?></li>
 							</ul>
 						</label>
+<?php endif; ?>
 					</div>
 
 					<h4><?php _e( 'Group Invitations', 'buddypress' ); ?></h4>
diff -ur ../plugins.orig/buddypress/bp-themes/bp-default/groups/single/admin.php buddypress/bp-themes/bp-default/groups/single/admin.php
--- ../plugins.orig/buddypress/bp-themes/bp-default/groups/single/admin.php	2014-10-07 01:36:25.000000000 +0000
+++ buddypress/bp-themes/bp-default/groups/single/admin.php	2015-01-08 10:29:45.727925404 +0000
@@ -60,7 +60,7 @@
 			<input type="radio" name="group-status" value="public"<?php bp_group_show_status_setting( 'public' ); ?> />
 			<strong><?php _e( 'This is a public group', 'buddypress' ); ?></strong>
 			<ul>
-				<li><?php _e( 'Any site member can join this group.', 'buddypress' ); ?></li>
+				<li><?php group_membership_request_description( 'public' ); ?></li>
 				<li><?php _e( 'This group will be listed in the groups directory and in search results.', 'buddypress' ); ?></li>
 				<li><?php _e( 'Group content and activity will be visible to any site member.', 'buddypress' ); ?></li>
 			</ul>
@@ -70,7 +70,7 @@
 			<input type="radio" name="group-status" value="private"<?php bp_group_show_status_setting( 'private' ); ?> />
 			<strong><?php _e( 'This is a private group', 'buddypress' ); ?></strong>
 			<ul>
-				<li><?php _e( 'Only users who request membership and are accepted can join the group.', 'buddypress' ); ?></li>
+				<li><?php group_membership_request_description( 'private' ); ?></li>
 				<li><?php _e( 'This group will be listed in the groups directory and in search results.', 'buddypress' ); ?></li>
 				<li><?php _e( 'Group content and activity will only be visible to members of the group.', 'buddypress' ); ?></li>
 			</ul>
@@ -80,7 +80,7 @@
 			<input type="radio" name="group-status" value="hidden"<?php bp_group_show_status_setting( 'hidden' ); ?> />
 			<strong><?php _e( 'This is a hidden group', 'buddypress' ); ?></strong>
 			<ul>
-				<li><?php _e( 'Only users who are invited can join the group.', 'buddypress' ); ?></li>
+				<li><?php group_membership_request_description( 'hidden' ); ?></li>
 				<li><?php _e( 'This group will not be listed in the groups directory or search results.', 'buddypress' ); ?></li>
 				<li><?php _e( 'Group content and activity will only be visible to members of the group.', 'buddypress' ); ?></li>
 			</ul>
diff -ur ../plugins.orig/buddypress/bp-themes/bp-default/_inc/ajax.php buddypress/bp-themes/bp-default/_inc/ajax.php
--- ../plugins.orig/buddypress/bp-themes/bp-default/_inc/ajax.php	2014-10-07 01:36:25.000000000 +0000
+++ buddypress/bp-themes/bp-default/_inc/ajax.php	2015-01-08 10:45:12.404968518 +0000
@@ -735,7 +735,8 @@
 		return;
 
 	if ( ! groups_is_user_member( bp_loggedin_user_id(), $group->id ) ) {
-		if ( 'public' == $group->status ) {
+	    if ( groups_membership_request_allowed( $group->status ) ) {
+		if ( ! groups_membership_request_moderated( $group->status ) ) {
 			check_ajax_referer( 'groups_join_group' );
 
 			if ( ! groups_join_group( $group->id ) ) {
@@ -744,7 +745,7 @@
 				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 ( 'private' == $group->status ) {
+		} else {
 
 			// If the user has already been invited, then this is
 			// an Accept Invitation button
@@ -768,16 +769,16 @@
 				}
 			}
 		}
-
+	    }
 	} else {
 		check_ajax_referer( 'groups_leave_group' );
 
 		if ( ! groups_leave_group( $group->id ) ) {
 			_e( 'Error leaving group', 'buddypress' );
-		} elseif ( 'public' == $group->status ) {
-			echo '<a id="group-' . esc_attr( $group->id ) . '" class="join-group" rel="join" title="' . __( 'Join Group', 'buddypress' ) . '" href="' . wp_nonce_url( bp_get_group_permalink( $group ) . 'join', 'groups_join_group' ) . '">' . __( 'Join Group', 'buddypress' ) . '</a>';
-		} elseif ( 'private' == $group->status ) {
+		} elseif ( groups_membership_request_moderated( $group->status ) ) {
 			echo '<a id="group-' . esc_attr( $group->id ) . '" class="request-membership" rel="join" title="' . __( 'Request Membership', 'buddypress' ) . '" href="' . wp_nonce_url( bp_get_group_permalink( $group ) . 'request-membership', 'groups_send_membership_request' ) . '">' . __( 'Request Membership', 'buddypress' ) . '</a>';
+		} elseif ( groups_membership_request_allowed( $group->status ) ) {
+			echo '<a id="group-' . esc_attr( $group->id ) . '" class="join-group" rel="join" title="' . __( 'Join Group', 'buddypress' ) . '" href="' . wp_nonce_url( bp_get_group_permalink( $group ) . 'join', 'groups_join_group' ) . '">' . __( 'Join Group', 'buddypress' ) . '</a>';
 		}
 	}
 
