diff --exclude=.svn -ur plugins.orig/buddypress/bp-groups/bp-groups-actions.php plugins/buddypress/bp-groups/bp-groups-actions.php
--- plugins.orig/buddypress/bp-groups/bp-groups-actions.php	2014-10-07 03:36:25.000000000 +0200
+++ plugins/buddypress/bp-groups/bp-groups-actions.php	2015-01-13 11:43:29.550203634 +0100
@@ -28,7 +28,7 @@
 	$user_has_access = $current_group->user_has_access;
 	$no_access_args  = array();
 
-	if ( ! $user_has_access && 'hidden' !== $current_group->status ) {
+	if ( ! $user_has_access && !groups_hidden_group($current_group->status) ) {
 		// Always allow access to home and request-membership
 		if ( bp_is_current_action( 'home' ) || bp_is_current_action( 'request-membership' ) ) {
 			$user_has_access = true;
@@ -79,7 +79,7 @@
 	// Hidden groups should return a 404 for non-members.
 	// Unset the current group so that you're not redirected
 	// to the default group tab
-	if ( 'hidden' == $current_group->status ) {
+	if ( groups_hidden_group($current_group->status) ) {
 		buddypress()->groups->current_group = 0;
 		buddypress()->is_single_item        = false;
 		bp_do_404();
@@ -162,14 +162,13 @@
 
 			$new_group_id = isset( $bp->groups->new_group_id ) ? $bp->groups->new_group_id : 0;
 
-			if ( !$bp->groups->new_group_id = groups_create_group( array( 'group_id' => $new_group_id, 'name' => $_POST['group-name'], 'description' => $_POST['group-desc'], 'slug' => groups_check_slug( sanitize_title( esc_attr( $_POST['group-name'] ) ) ), 'date_created' => bp_core_current_time(), 'status' => 'public' ) ) ) {
+			if ( !$bp->groups->new_group_id = groups_create_group( array( 'group_id' => $new_group_id, 'name' => $_POST['group-name'], 'description' => $_POST['group-desc'], 'slug' => groups_check_slug( sanitize_title( esc_attr( $_POST['group-name'] ) ) ), 'date_created' => bp_core_current_time(), 'status' => groups_default_creation_status() ) ) ) {
 				bp_core_add_message( __( 'There was an error saving group details, please try again.', 'buddypress' ), 'error' );
 				bp_core_redirect( bp_get_root_domain() . '/' . bp_get_groups_root_slug() . '/create/step/' . bp_get_groups_current_create_step() . '/' );
 			}
 		}
 
 		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 = groups_default_creation_status();
 
 			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' );
@@ -333,7 +332,7 @@
 	if ( !groups_is_user_member( bp_loggedin_user_id(), $bp->groups->current_group->id ) && !groups_is_user_banned( bp_loggedin_user_id(), $bp->groups->current_group->id ) ) {
 
 		// User wants to join a group that is not public
-		if ( $bp->groups->current_group->status != 'public' ) {
+		if ( groups_private_group($bp->groups->current_group->status) ) {
 			if ( !groups_check_user_has_invite( bp_loggedin_user_id(), $bp->groups->current_group->id ) ) {
 				bp_core_add_message( __( 'There was an error joining the group.', 'buddypress' ), 'error' );
 				bp_core_redirect( bp_get_group_permalink( $bp->groups->current_group ) );
@@ -391,7 +390,7 @@
 
 		$redirect = bp_get_group_permalink( groups_get_current_group() );
 
-		if( 'hidden' == $bp->groups->current_group->status ) {
+		if ( groups_hidden_group($bp->groups->current_group->status) ) {
 			$redirect = trailingslashit( bp_loggedin_user_domain() . bp_get_groups_slug() );
 		}
 
diff --exclude=.svn -ur plugins.orig/buddypress/bp-groups/bp-groups-adminbar.php plugins/buddypress/bp-groups/bp-groups-adminbar.php
--- plugins.orig/buddypress/bp-groups/bp-groups-adminbar.php	2014-10-07 03:36:25.000000000 +0200
+++ plugins/buddypress/bp-groups/bp-groups-adminbar.php	2015-01-13 11:44:24.188058688 +0100
@@ -88,7 +88,7 @@
 	) );
 
 	// Group Admin > Membership Requests
-	if ( bp_get_group_status( $bp->groups->current_group ) == 'private' ) {
+	if ( groups_membership_request_moderated( $bp->groups->current_group->status ) ) {
 		$wp_admin_bar->add_menu( array(
 			'parent' => $bp->group_admin_menu_id,
 			'id'     => 'membership-requests',
diff --exclude=.svn -ur plugins.orig/buddypress/bp-groups/bp-groups-admin.php plugins/buddypress/bp-groups/bp-groups-admin.php
--- plugins.orig/buddypress/bp-groups/bp-groups-admin.php	2014-10-07 03:36:25.000000000 +0200
+++ plugins/buddypress/bp-groups/bp-groups-admin.php	2015-01-13 12:13:08.941927743 +0100
@@ -679,6 +679,7 @@
  * @param object $item Information about the current group.
  */
 function bp_groups_admin_edit_metabox_settings( $item ) {
+	global $bp;
 
 	$invite_status = groups_get_groupmeta( $item->id, 'invite_status' ); ?>
 
@@ -693,9 +694,22 @@
 			<legend><?php _e( 'Privacy', 'buddypress' ); ?></legend>
 
 			<ul>
-				<li><input type="radio" name="group-status" id="bp-group-status-public" value="public" <?php checked( $item->status, 'public' ) ?> /><label for="bp-group-status-public"><?php _e( 'Public', 'buddypress' ) ?></label></li>
-				<li><input type="radio" name="group-status" id="bp-group-status-private" value="private" <?php checked( $item->status, 'private' ) ?> /><label for="bp-group-status-private"><?php _e( 'Private', 'buddypress' ) ?></label></li>
-				<li><input type="radio" name="group-status" id="bp-group-status-hidden" value="hidden" <?php checked( $item->status, 'hidden' ) ?> /><label for="bp-group-status-hidden"><?php _e( 'Hidden', 'buddypress' ) ?></label></li>
+<?php
+	if ( is_super_admin() ) {
+		foreach ( $bp->groups->valid_status as $status ) { ?>
+			<li><input type="radio" name="group-status" id="bp-group-status-<?php echo sanitize_html_class( $status, 'x' ); ?>" value="<?php echo esc_attr( $status ); ?>" <?php checked( $item->status, $status ) ?> /><label for="bp-group-status-<?php echo sanitize_html_class( $status, 'x' ); ?>"><?php _e( ucfirst( $status ), 'buddypress' ) ?></label></li>
+<?php
+		}
+	} elseif ( !groups_is_valid_creation_status( $item->status )) { ?>
+			<li><input type="radio" name="group-status" id="bp-group-status-<?php echo sanitize_html_class( $item->status, 'x' ); ?>" value="<?php echo esc_attr( $item->status ); ?>" checked="checked" /><label for="bp-group-status-<?php echo sanitize_html_class( $status, 'x' ); ?>"><?php _e( ucfirst( $status ), 'buddypress' ) ?></label></li>
+<?php
+	} else {
+		foreach ( $bp->groups->valid_creation_status as $status ) { ?>
+			<li><input type="radio" name="group-status" id="bp-group-status-<?php echo sanitize_html_class( $status, 'x' ); ?>" value="<?php echo esc_attr( $status ); ?>" <?php checked( $item->status, $status ) ?> /><label for="bp-group-status-<?php echo sanitize_html_class( $status, 'x' ); ?>"><?php _e( ucfirst( $status ), 'buddypress' ) ?></label></li>
+<?php
+		}
+	}
+?>
 			</ul>
 		</fieldset>
 	</div>
@@ -1124,7 +1138,7 @@
 			$include_id = (int) $_REQUEST['gid'];
 
 		// Set the current view
-		if ( isset( $_GET['group_status'] ) && in_array( $_GET['group_status'], array( 'public', 'private', 'hidden' ) ) ) {
+		if ( isset( $_GET['group_status'] ) && groups_is_valid_status( $_GET['group_status'] ) ) {
 			$this->view = $_GET['group_status'];
 		}
 
@@ -1272,6 +1286,16 @@
 			<li class="public"><a href="<?php echo esc_attr( esc_url( add_query_arg( 'group_status', 'public', $url_base ) ) ); ?>" class="<?php if ( 'public' == $this->view ) echo 'current'; ?>"><?php printf( _n( 'Public <span class="count">(%s)</span>', 'Public <span class="count">(%s)</span>', $this->group_counts['public'], 'buddypress' ), number_format_i18n( $this->group_counts['public'] ) ); ?></a> |</li>
 			<li class="private"><a href="<?php echo esc_attr( esc_url( add_query_arg( 'group_status', 'private', $url_base ) ) ); ?>" class="<?php if ( 'private' == $this->view ) echo 'current'; ?>"><?php printf( _n( 'Private <span class="count">(%s)</span>', 'Private <span class="count">(%s)</span>', $this->group_counts['private'], 'buddypress' ), number_format_i18n( $this->group_counts['private'] ) ); ?></a> |</li>
 			<li class="hidden"><a href="<?php echo esc_attr( esc_url( add_query_arg( 'group_status', 'hidden', $url_base ) ) ); ?>" class="<?php if ( 'hidden' == $this->view ) echo 'current'; ?>"><?php printf( _n( 'Hidden <span class="count">(%s)</span>', 'Hidden <span class="count">(%s)</span>', $this->group_counts['hidden'], 'buddypress' ), number_format_i18n( $this->group_counts['hidden'] ) ); ?></a></li>
+<?php
+		global $bp;
+
+		foreach ($bp->groups->valid_status as $status) {
+		    if ($status != 'public' && $status != 'private' && $status != 'hidden') { ?>
+			<li class="<?php echo $status ?>"><a href="<?php echo esc_attr( esc_url( add_query_arg( 'group_status', $status, $url_base ) ) ); ?>" class="<?php if ( $status == $this->view ) echo 'current'; ?>"><?php printf( _n( ucfirst($status).' <span class="count">(%s)</span>', ucfirst($status).' <span class="count">(%s)</span>', $this->group_counts[$status], 'buddypress' ), number_format_i18n( $this->group_counts[$status] ) ); ?></a></li>
+<?php
+		    }
+		}
+?>
 
 			<?php do_action( 'bp_groups_list_table_get_views', $url_base, $this->view ); ?>
 		</ul>
@@ -1447,22 +1471,7 @@
 	 */
 	public function column_status( $item = array() ) {
 		$status      = $item['status'];
-		$status_desc = '';
-
-		// @todo This should be abstracted out somewhere for the whole
-		// Groups component
-		switch ( $status ) {
-			case 'public' :
-				$status_desc = __( 'Public', 'buddypress' );
-				break;
-			case 'private' :
-				$status_desc = __( 'Private', 'buddypress' );
-				break;
-			case 'hidden' :
-				$status_desc = __( 'Hidden', 'buddypress' );
-				break;
-		}
-
+		$status_desc = __( ucfirst($status), 'buddypress' );
 		echo apply_filters_ref_array( 'bp_groups_admin_get_group_status', array( $status_desc, $item ) );
 	}
 
diff --exclude=.svn -ur plugins.orig/buddypress/bp-groups/bp-groups-buddybar.php plugins/buddypress/bp-groups/bp-groups-buddybar.php
--- plugins.orig/buddypress/bp-groups/bp-groups-buddybar.php	2014-08-08 00:27:03.000000000 +0200
+++ plugins/buddypress/bp-groups/bp-groups-buddybar.php	2015-01-08 12:10:14.436988554 +0100
@@ -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 --exclude=.svn -ur plugins.orig/buddypress/bp-groups/bp-groups-classes.php plugins/buddypress/bp-groups/bp-groups-classes.php
--- plugins.orig/buddypress/bp-groups/bp-groups-classes.php	2014-10-07 03:36:25.000000000 +0200
+++ plugins/buddypress/bp-groups/bp-groups-classes.php	2015-01-15 09:26:13.271278862 +0100
@@ -238,7 +238,7 @@
 			$this->is_pending = BP_Groups_Member::check_for_membership_request( $user_id, $this->id );
 
 			// If this is a private or hidden group, does the current user have access?
-			if ( ( 'private' === $this->status ) || ( 'hidden' === $this->status ) ) {
+			if ( groups_private_group( $this->status ) ) {
 
 				// Assume user does not have access to hidden/private groups
 				$this->user_has_access = false;
@@ -505,8 +505,9 @@
 			$order_sql = "ORDER BY {$sort_by} {$order}";
 		}
 
-		if ( !bp_current_user_can( 'bp_moderate' ) )
-			$hidden_sql = "AND status != 'hidden'";
+		if ( !bp_current_user_can( 'bp_moderate' ) ) {
+			$hidden_sql = "AND status NOT IN ('".join("','", esc_sql($bp->groups->hidden_status)). "')";
+		}
 
 		$paged_groups = $wpdb->get_results( $wpdb->prepare( "SELECT id as group_id FROM {$bp->groups->table_name} WHERE ( name LIKE %s OR description LIKE %s ) {$hidden_sql} {$order_sql} {$pag_sql}", $search_terms_like, $search_terms_like ) );
 		$total_groups = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(id) FROM {$bp->groups->table_name} WHERE ( name LIKE %s OR description LIKE %s ) {$hidden_sql}", $search_terms_like, $search_terms_like ) );
@@ -706,7 +707,7 @@
 		$sql['where'] = " g.id = gm1.group_id AND g.id = gm2.group_id AND gm2.meta_key = 'last_activity' AND gm1.meta_key = 'total_member_count'";
 
 		if ( empty( $r['show_hidden'] ) ) {
-			$sql['hidden'] = " AND g.status != 'hidden'";
+			$sql['hidden'] = " AND g.status NOT IN ('".join("','", esc_sql($bp->groups->hidden_status)). "')";
 		}
 
 		if ( ! empty( $r['search_terms'] ) ) {
@@ -788,7 +789,7 @@
 		}
 
 		if ( ! empty( $sql['hidden'] ) ) {
-			$total_sql['where'][] = "g.status != 'hidden'";
+			$total_sql['where'][] = "g.status NOT IN ('".join("','", esc_sql($bp->groups->hidden_status)). "')";
 		}
 
 		if ( ! empty( $sql['search'] ) ) {
@@ -1023,7 +1024,7 @@
 		}
 
 		if ( !is_user_logged_in() || ( !bp_current_user_can( 'bp_moderate' ) && ( $user_id != bp_loggedin_user_id() ) ) )
-			$hidden_sql = " AND g.status != 'hidden'";
+			$hidden_sql = " AND g.status NOT IN ('".join("','", esc_sql($bp->groups->hidden_status)). "')";
 
 		if ( !empty( $search_terms ) ) {
 			$search_terms_like = '%' . bp_esc_like( $search_terms ) . '%';
@@ -1087,7 +1088,7 @@
 		}
 
 		if ( !is_user_logged_in() || ( !bp_current_user_can( 'bp_moderate' ) && ( $user_id != bp_loggedin_user_id() ) ) )
-			$hidden_sql = " AND g.status != 'hidden'";
+			$hidden_sql = " AND g.status NOT IN ('".join("','", esc_sql($bp->groups->hidden_status)). "')";
 
 		if ( !empty( $search_terms ) ) {
 			$search_terms_like = '%' . bp_esc_like( $search_terms ) . '%';
@@ -1159,7 +1160,7 @@
 		}
 
 		if ( !bp_current_user_can( 'bp_moderate' ) )
-			$hidden_sql = " AND status != 'hidden'";
+			$hidden_sql = " AND g.status NOT IN ('".join("','", esc_sql($bp->groups->hidden_status)). "')";
 
 		$letter_like = bp_esc_like( $letter ) . '%';
 
@@ -1214,7 +1215,7 @@
 			$pag_sql = $wpdb->prepare( " LIMIT %d, %d", intval( ( $page - 1 ) * $limit), intval( $limit ) );
 
 		if ( !is_user_logged_in() || ( !bp_current_user_can( 'bp_moderate' ) && ( $user_id != bp_loggedin_user_id() ) ) )
-			$hidden_sql = "AND g.status != 'hidden'";
+			$hidden_sql = "AND g.status NOT IN ('".join("','", esc_sql($bp->groups->hidden_status)). "')";
 
 		if ( !empty( $search_terms ) ) {
 			$search_terms_like = '%' . bp_esc_like( $search_terms ) . '%';
@@ -1356,7 +1357,7 @@
 
 		$hidden_sql = '';
 		if ( !bp_current_user_can( 'bp_moderate' ) )
-			$hidden_sql = "WHERE status != 'hidden'";
+			$hidden_sql = "WHERE status NOT IN ('".join("','", esc_sql($bp->groups->hidden_status)). "')";
 
 		return $wpdb->get_var( "SELECT COUNT(id) FROM {$bp->groups->table_name} {$hidden_sql}" );
 	}
@@ -1408,24 +1409,10 @@
 	public static function get_global_topic_count( $status = 'public', $search_terms = false ) {
 		global $bbdb, $wpdb, $bp;
 
-		switch ( $status ) {
-			case 'all' :
-				$status_sql = '';
-				break;
-
-			case 'hidden' :
-				$status_sql = "AND g.status = 'hidden'";
-				break;
-
-			case 'private' :
-				$status_sql = "AND g.status = 'private'";
-				break;
-
-			case 'public' :
-			default :
-				$status_sql = "AND g.status = 'public'";
-				break;
-		}
+		if ( $status == 'all' )
+			$status_sql = '';
+		else
+			$status_sql = "AND g.status = '".esc_sql($status)."'";
 
 		$sql = array();
 
@@ -1457,9 +1444,9 @@
 		$ids = array();
 
 		$ids['all']     = $wpdb->get_col( "SELECT id FROM {$bp->groups->table_name}" );
-		$ids['public']  = $wpdb->get_col( "SELECT id FROM {$bp->groups->table_name} WHERE status = 'public'" );
-		$ids['private'] = $wpdb->get_col( "SELECT id FROM {$bp->groups->table_name} WHERE status = 'private'" );
-		$ids['hidden']  = $wpdb->get_col( "SELECT id FROM {$bp->groups->table_name} WHERE status = 'hidden'" );
+		foreach ($bp->valid_status as $status) {
+		  $ids[$status]  = $wpdb->get_col( "SELECT id FROM {$bp->groups->table_name} WHERE status = '".esc_sql($status)."'" );
+		}
 
 		return $ids;
 	}
@@ -2230,8 +2217,8 @@
 
 		// If the user is logged in and viewing their own groups, we can show hidden and private groups
 		if ( $user_id != bp_loggedin_user_id() ) {
-			$group_sql = $wpdb->prepare( "SELECT DISTINCT m.group_id FROM {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE g.status != 'hidden' AND m.user_id = %d AND m.is_confirmed = 1 AND m.is_banned = 0{$pag_sql}", $user_id );
-			$total_groups = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(DISTINCT m.group_id) FROM {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE g.status != 'hidden' AND m.user_id = %d AND m.is_confirmed = 1 AND m.is_banned = 0", $user_id ) );
+			$group_sql = $wpdb->prepare( "SELECT DISTINCT m.group_id FROM {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE g.status NOT IN ('".join("','", esc_sql($bp->groups->hidden_status))."') AND m.user_id = %d AND m.is_confirmed = 1 AND m.is_banned = 0{$pag_sql}", $user_id );
+			$total_groups = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(DISTINCT m.group_id) FROM {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE g.status NOT IN ('".join("','", esc_sql($bp->groups->hidden_status))."' AND m.user_id = %d AND m.is_confirmed = 1 AND m.is_banned = 0", $user_id ) );
 		} else {
 			$group_sql = $wpdb->prepare( "SELECT DISTINCT group_id FROM {$bp->groups->table_name_members} WHERE user_id = %d AND is_confirmed = 1 AND is_banned = 0{$pag_sql}", $user_id );
 			$total_groups = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(DISTINCT group_id) FROM {$bp->groups->table_name_members} WHERE user_id = %d AND is_confirmed = 1 AND is_banned = 0", $user_id ) );
@@ -2273,7 +2260,7 @@
 		}
 
 		if ( $user_id != bp_loggedin_user_id() )
-			$hidden_sql = " AND g.status != 'hidden'";
+			$hidden_sql = " AND g.status NOT IN ('".join("','", esc_sql($bp->groups->hidden_status))."')";
 
 		$paged_groups = $wpdb->get_results( "SELECT g.*, gm1.meta_value as total_member_count, gm2.meta_value as last_activity FROM {$bp->groups->table_name_groupmeta} gm1, {$bp->groups->table_name_groupmeta} gm2, {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE g.id = m.group_id AND g.id = gm1.group_id AND g.id = gm2.group_id AND gm2.meta_key = 'last_activity' AND gm1.meta_key = 'total_member_count'{$hidden_sql}{$filter_sql} AND {$user_id_sql} AND m.is_confirmed = 1 AND m.is_banned = 0 ORDER BY m.date_modified DESC {$pag_sql}" );
 		$total_groups = $wpdb->get_var( "SELECT COUNT(DISTINCT m.group_id) FROM {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE m.group_id = g.id{$hidden_sql}{$filter_sql} AND {$user_id_sql} AND m.is_banned = 0 AND m.is_confirmed = 1 ORDER BY m.date_modified DESC" );
@@ -2312,7 +2299,7 @@
 		}
 
 		if ( $user_id != bp_loggedin_user_id() )
-			$hidden_sql = " AND g.status != 'hidden'";
+			$hidden_sql = " AND g.status NOT IN ('".join("','", esc_sql($bp->groups->hidden_status))."')";
 
 		$paged_groups = $wpdb->get_results( "SELECT g.*, gm1.meta_value as total_member_count, gm2.meta_value as last_activity FROM {$bp->groups->table_name_groupmeta} gm1, {$bp->groups->table_name_groupmeta} gm2, {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE g.id = m.group_id AND g.id = gm1.group_id AND g.id = gm2.group_id AND gm2.meta_key = 'last_activity' AND gm1.meta_key = 'total_member_count'{$hidden_sql}{$filter_sql} AND {$user_id_sql} AND m.is_confirmed = 1 AND m.is_banned = 0 AND m.is_admin = 1 ORDER BY m.date_modified ASC {$pag_sql}" );
 		$total_groups = $wpdb->get_var( "SELECT COUNT(DISTINCT m.group_id) FROM {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE m.group_id = g.id{$hidden_sql}{$filter_sql} AND {$user_id_sql} AND m.is_confirmed = 1 AND m.is_banned = 0 AND m.is_admin = 1 ORDER BY date_modified ASC" );
@@ -2351,7 +2338,7 @@
 		}
 
 		if ( $user_id != bp_loggedin_user_id() )
-			$hidden_sql = " AND g.status != 'hidden'";
+			$hidden_sql = " AND g.status NOT IN ('".join("','", esc_sql($bp->groups->hidden_status))."')";
 
 		$paged_groups = $wpdb->get_results( "SELECT g.*, gm1.meta_value as total_member_count, gm2.meta_value as last_activity FROM {$bp->groups->table_name_groupmeta} gm1, {$bp->groups->table_name_groupmeta} gm2, {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE g.id = m.group_id AND g.id = gm1.group_id AND g.id = gm2.group_id AND gm2.meta_key = 'last_activity' AND gm1.meta_key = 'total_member_count'{$hidden_sql}{$filter_sql} AND {$user_id_sql} AND m.is_confirmed = 1 AND m.is_banned = 0 AND m.is_mod = 1 ORDER BY m.date_modified ASC {$pag_sql}" );
 		$total_groups = $wpdb->get_var( "SELECT COUNT(DISTINCT m.group_id) FROM {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE m.group_id = g.id{$hidden_sql}{$filter_sql} AND {$user_id_sql} AND m.is_confirmed = 1 AND m.is_banned = 0 AND m.is_mod = 1 ORDER BY date_modified ASC" );
@@ -2372,7 +2359,7 @@
 			$user_id = bp_displayed_user_id();
 
 		if ( $user_id != bp_loggedin_user_id() && !bp_current_user_can( 'bp_moderate' ) ) {
-			return $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(DISTINCT m.group_id) FROM {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE m.group_id = g.id AND g.status != 'hidden' AND m.user_id = %d AND m.is_confirmed = 1 AND m.is_banned = 0", $user_id ) );
+			return $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(DISTINCT m.group_id) FROM {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE m.group_id = g.id AND g.status NOT IN ('".join("','", esc_sql($bp->groups->hidden_status))."') AND m.user_id = %d AND m.is_confirmed = 1 AND m.is_banned = 0", $user_id ) );
 		} else {
 			return $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(DISTINCT m.group_id) FROM {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE m.group_id = g.id AND m.user_id = %d AND m.is_confirmed = 1 AND m.is_banned = 0", $user_id ) );
 		}
@@ -2606,7 +2593,7 @@
 		if ( bp_is_my_profile() ) {
 			return $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT group_id FROM {$bp->groups->table_name_members} WHERE user_id = %d AND is_confirmed = 1 AND is_banned = 0 ORDER BY rand() LIMIT %d", $user_id, $total_groups ) );
 		} else {
-			return $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT m.group_id FROM {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE m.group_id = g.id AND g.status != 'hidden' AND m.user_id = %d AND m.is_confirmed = 1 AND m.is_banned = 0 ORDER BY rand() LIMIT %d", $user_id, $total_groups ) );
+			return $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT m.group_id FROM {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE m.group_id = g.id AND g.status NOT IN ('".hoin("','", esc_sql($bp->groups->hidden_status))."') AND m.user_id = %d AND m.is_confirmed = 1 AND m.is_banned = 0 ORDER BY rand() LIMIT %d", $user_id, $total_groups ) );
 		}
 	}
 
diff --exclude=.svn -ur plugins.orig/buddypress/bp-groups/bp-groups-functions.php plugins/buddypress/bp-groups/bp-groups-functions.php
--- plugins.orig/buddypress/bp-groups/bp-groups-functions.php	2014-10-07 03:36:25.000000000 +0200
+++ plugins/buddypress/bp-groups/bp-groups-functions.php	2015-01-19 10:08:54.724328253 +0100
@@ -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,94 @@
 }
 
 /**
+ * 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 );
+}
+
+/**
+ * Returns the default group status (eg 'public').
+ *
+ * @return string First valid creation status
+ */
+function groups_default_creation_status() {
+	global $bp;
+
+	return apply_filters( 'groups_default_creation_status',
+		reset($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' );
+}
+
+/**
+ * Check if this group status (eg 'private') make contents private.
+ *
+ * @param string $status Status to check.
+ * @return bool True if status allows joining, otherwise false.
+ */
+function groups_private_group( $status ) {
+	global $bp;
+
+	return in_array( $status, $bp->groups->private_status );
+}
+
+/**
+ * Check if this group status (eg 'hidden') make group hidden to non-members.
+ *
+ * @param string $status Status to check.
+ * @return bool True if status allows joining, otherwise false.
+ */
+function groups_hidden_group( $status ) {
+	global $bp;
+
+	return in_array( $status, $bp->groups->hidden_status );
+}
+
+
+/**
  * Provide a unique, sanitized version of a group slug.
  *
  * @param string $slug Group slug to check.
diff --exclude=.svn -ur plugins.orig/buddypress/bp-groups/bp-groups-loader.php plugins/buddypress/bp-groups/bp-groups-loader.php
--- plugins.orig/buddypress/bp-groups/bp-groups-loader.php	2014-10-07 03:36:25.000000000 +0200
+++ plugins/buddypress/bp-groups/bp-groups-loader.php	2015-01-13 11:14:46.355930630 +0100
@@ -80,6 +80,52 @@
 	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;
+
+	/**
+	 * Group statuses hidden to non-members in lists
+	 *
+	 * @since BuddyPress (2.1.0)
+	 * @access public
+	 * @var array
+	 */
+	public $hidden_status;
+
+	/**
+	 * Group statuses whose contents are hidden to non-members
+	 *
+	 * @since BuddyPress (2.1.0)
+	 * @access public
+	 * @var array
+	 */
+	public $private_status;
+
+
+	/**
 	 * Start the groups component creation process.
 	 *
 	 * @since BuddyPress (1.5.0)
@@ -213,13 +259,11 @@
 				$this->current_group->is_user_member = false;
 
 			// Should this group be visible to the logged in user?
-			if ( 'public' == $this->current_group->status || $this->current_group->is_user_member )
-				$this->current_group->is_visible = true;
-			else
-				$this->current_group->is_visible = false;
+			$this->current_group->is_visible = ( $this->current_group->is_user_member ||
+				!groups_hidden_group( $this->current_group->status ) );
 
 			// If this is a private or hidden group, does the user have access?
-			if ( 'private' == $this->current_group->status || 'hidden' == $this->current_group->status ) {
+			if ( groups_private_group($this->current_group->status) ) {
 				if ( $this->current_group->is_user_member && is_user_logged_in() || bp_current_user_can( 'bp_moderate' ) )
 					$this->current_group->user_has_access = true;
 				else
@@ -292,6 +336,32 @@
 			'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'
+		) );
+
+		$this->hidden_status = apply_filters( 'groups_hidden_status', array(
+			'hidden'
+		) );
+
+		$this->private_status = apply_filters( 'groups_private_status', array(
+			'private',
+			'hidden'
+		) );
+
+
 		// 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 +510,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 --exclude=.svn -ur plugins.orig/buddypress/bp-groups/bp-groups-screens.php plugins/buddypress/bp-groups/bp-groups-screens.php
--- plugins.orig/buddypress/bp-groups/bp-groups-screens.php	2014-10-07 03:36:25.000000000 +0200
+++ plugins/buddypress/bp-groups/bp-groups-screens.php	2015-01-13 09:17:02.563995119 +0100
@@ -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 --exclude=.svn -ur plugins.orig/buddypress/bp-groups/bp-groups-template.php plugins/buddypress/bp-groups/bp-groups-template.php
--- plugins.orig/buddypress/bp-groups/bp-groups-template.php	2014-10-07 03:36:25.000000000 +0200
+++ plugins/buddypress/bp-groups/bp-groups-template.php	2015-01-08 11:50:51.622057993 +0100
@@ -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 --exclude=.svn -ur plugins.orig/buddypress/bp-templates/bp-legacy/buddypress/groups/create.php plugins/buddypress/bp-templates/bp-legacy/buddypress/groups/create.php
--- plugins.orig/buddypress/bp-templates/bp-legacy/buddypress/groups/create.php	2014-10-07 03:36:25.000000000 +0200
+++ plugins/buddypress/bp-templates/bp-legacy/buddypress/groups/create.php	2015-01-08 12:53:40.500994274 +0100
@@ -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>
 
diff --exclude=.svn -ur plugins.orig/buddypress/bp-templates/bp-legacy/buddypress/groups/single/admin.php plugins/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 03:36:25.000000000 +0200
+++ plugins/buddypress/bp-templates/bp-legacy/buddypress/groups/single/admin.php	2015-01-19 10:21:49.171587563 +0100
@@ -55,36 +55,64 @@
 
 	<h4><?php _e( 'Privacy Options', 'buddypress' ); ?></h4>
 
+<?php
+
+$current_group_status = bp_get_group_status();
+if (!is_super_admin() && !groups_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
+		printf( __( 'This is a %s group', 'buddypress' ), $current_group_status );
+	?>
+			</strong>
+		</label>
+		<ul>
+		</ul>
+<?php else : ?>
 	<div class="radio">
+	<?php if (is_super_admin() || groups_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() || groups_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() || groups_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 --exclude=.svn -ur plugins.orig/buddypress/bp-templates/bp-legacy/buddypress-functions.php plugins/buddypress/bp-templates/bp-legacy/buddypress-functions.php
--- plugins.orig/buddypress/bp-templates/bp-legacy/buddypress-functions.php	2014-10-07 03:36:25.000000000 +0200
+++ plugins/buddypress/bp-templates/bp-legacy/buddypress-functions.php	2015-01-08 14:27:14.668057520 +0100
@@ -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 --exclude=.svn -ur plugins.orig/buddypress/bp-themes/bp-default/groups/create.php plugins/buddypress/bp-themes/bp-default/groups/create.php
--- plugins.orig/buddypress/bp-themes/bp-default/groups/create.php	2014-10-07 03:36:25.000000000 +0200
+++ plugins/buddypress/bp-themes/bp-default/groups/create.php	2015-01-19 11:05:33.670565306 +0100
@@ -58,32 +58,27 @@
 					<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>
-							<ul>
-								<li><?php _e( 'Any site member can join this group.', 'buddypress' ); ?></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>
-
-						<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 _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
+	global $bp;
 
-						<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>
+	$new_group_status = bp_get_new_group_status();
+	if ( !$new_group_status )
+		$new_group_status = groups_default_creation_status();
+
+	foreach ( $bp->groups->valid_status as $group_status ) {
+		if ( is_super_admin() || groups_is_valid_creation_status( $group_status ) ) { ?>
+						<label><input type="radio" name="group-status" value="<?php echo esc_attr($group_status) ?>"<?php if ( $group_status == $new_group_status ) { ?> checked="checked"<?php } ?> />
+							<strong><?php printf(__( 'This is a %s group', 'buddypress' ), $group_status); ?></strong>
 							<ul>
-								<li><?php _e( 'Only users who are invited can join the group.', 'buddypress' ); ?></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>
+								<li><?php group_membership_request_description( 'public' ); ?></li>
+								<li><?php group_listing_visibility_description( 'public' ); ?></li>
+								<li><?php group_content_visibility_description( 'public' ); ?></li>
 							</ul>
 						</label>
+<?php 
+		}
+	}
+?>
 					</div>
 
 					<h4><?php _e( 'Group Invitations', 'buddypress' ); ?></h4>
diff --exclude=.svn -ur plugins.orig/buddypress/bp-themes/bp-default/groups/single/admin.php plugins/buddypress/bp-themes/bp-default/groups/single/admin.php
--- plugins.orig/buddypress/bp-themes/bp-default/_inc/ajax.php	2014-10-07 03:36:25.000000000 +0200
+++ plugins/buddypress/bp-themes/bp-default/_inc/ajax.php	2015-01-08 11:45:12.404968518 +0100
@@ -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>';
 		}
 	}
 
--- plugins.orig/buddypress/bp-themes/bp-default/_inc/ajax.php	2014-10-07 03:36:25.000000000 +0200
+++ plugins/buddypress/bp-themes/bp-default/_inc/ajax.php	2015-01-08 11:45:12.404968518 +0100
@@ -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>';
 		}
 	}
 
