Index: bp-themes/bp-default/groups/single/admin.php
===================================================================
--- bp-themes/bp-default/groups/single/admin.php	(revision 4523)
+++ bp-themes/bp-default/groups/single/admin.php	(working copy)
@@ -57,7 +57,7 @@
 
 	<div class="radio">
 		<label>
-			<input type="radio" name="group-status" value="public"<?php bp_group_show_status_setting('public') ?> />
+			<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>
@@ -67,7 +67,7 @@
 		</label>
 
 		<label>
-			<input type="radio" name="group-status" value="private"<?php bp_group_show_status_setting('private') ?> />
+			<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>
@@ -77,7 +77,7 @@
 		</label>
 
 		<label>
-			<input type="radio" name="group-status" value="hidden"<?php bp_group_show_status_setting('hidden') ?> />
+			<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>
@@ -87,6 +87,31 @@
 		</label>
 	</div>
 
+	<hr /> 
+	 
+	<h4><?php _e( 'Group Invitations', 'buddypress' ); ?></h4> 
+
+	<p><?php _e( 'Which members of this group are allowed to invite others?', 'buddypress' ) ?></p> 
+
+	<div class="radio"> 
+		<label> 
+			<input type="radio" name="group-invite-status" value="members"<?php bp_group_show_invite_status_setting( 'members' ) ?> /> 
+			<strong><?php _e( 'All group members', 'buddypress' ) ?></strong> 
+		</label> 
+
+		<label> 
+			<input type="radio" name="group-invite-status" value="mods"<?php bp_group_show_invite_status_setting( 'mods' ) ?> /> 
+			<strong><?php _e( 'Group admins and mods only', 'buddypress' ) ?></strong> 
+		</label>
+		
+		<label> 
+			<input type="radio" name="group-invite-status" value="admins"<?php bp_group_show_invite_status_setting( 'admins' ) ?> /> 
+			<strong><?php _e( 'Group admins only', 'buddypress' ) ?></strong> 
+		</label> 
+ 	</div> 
+
+	<hr /> 
+
 	<?php do_action( 'bp_after_group_settings_admin' ); ?>
 
 	<p><input type="submit" value="<?php _e( 'Save Changes', 'buddypress' ) ?> &rarr;" id="save" name="save" /></p>
Index: bp-themes/bp-default/groups/create.php
===================================================================
--- bp-themes/bp-default/groups/create.php	(revision 4523)
+++ bp-themes/bp-default/groups/create.php	(working copy)
@@ -106,6 +106,31 @@
 						</label>
 					</div>
 
+					<hr />
+					
+					<h4><?php _e( 'Group Invitations', 'buddypress' ); ?></h4> 
+
+					<p><?php _e( 'Which members of this group are allowed to invite others?', 'buddypress' ) ?></p> 
+				
+					<div class="radio"> 
+						<label> 
+							<input type="radio" name="group-invite-status" value="members"<?php bp_group_show_invite_status_setting( 'members' ) ?> /> 
+							<strong><?php _e( 'All group members', 'buddypress' ) ?></strong> 
+						</label> 
+				
+						<label> 
+							<input type="radio" name="group-invite-status" value="mods"<?php bp_group_show_invite_status_setting( 'mods' ) ?> /> 
+							<strong><?php _e( 'Group admins and mods only', 'buddypress' ) ?></strong> 
+						</label>
+						
+						<label> 
+							<input type="radio" name="group-invite-status" value="admins"<?php bp_group_show_invite_status_setting( 'admins' ) ?> /> 
+							<strong><?php _e( 'Group admins only', 'buddypress' ) ?></strong> 
+						</label> 
+					</div> 
+				
+					<hr /> 
+
 					<?php do_action( 'bp_after_group_settings_creation_step' ); ?>
 
 					<?php wp_nonce_field( 'groups_create_save_group-settings' ); ?>
Index: bp-themes/bp-default/_inc/ajax.php
===================================================================
--- bp-themes/bp-default/_inc/ajax.php	(revision 4523)
+++ bp-themes/bp-default/_inc/ajax.php	(working copy)
@@ -353,7 +353,7 @@
 	if ( !$_POST['friend_id'] || !$_POST['friend_action'] || !$_POST['group_id'] )
 		return false;
 
-	if ( !groups_is_user_admin( $bp->loggedin_user->id, $_POST['group_id'] ) )
+	if ( !bp_groups_user_can_send_invites( $_POST['group_id'] ) )
 		return false;
 
 	if ( !friends_check_friendship( $bp->loggedin_user->id, $_POST['friend_id'] ) )
Index: bp-groups/bp-groups-actions.php
===================================================================
--- bp-groups/bp-groups-actions.php	(revision 4523)
+++ bp-groups/bp-groups-actions.php	(working copy)
@@ -101,6 +101,13 @@
 				bp_core_add_message( __( 'There was an error saving group details, please try again.', 'buddypress' ), 'error' );
 				bp_core_redirect( bp_get_root_domain() . '/' . $bp->groups->root_slug . '/create/step/' . $bp->groups->current_create_step . '/' );
 			}
+			
+			// Set the invite status			
+			// Checked against a whitelist for security
+			$allowed_invite_status = apply_filters( 'groups_allowed_invite_status', array( 'members', 'mods', 'admins' ) );
+			$invite_status	       = in_array( $_POST['group-invite-status'], (array)$allowed_invite_status ) ? $_POST['group-invite-status'] : 'members';
+			
+			groups_update_groupmeta( $bp->groups->new_group_id, 'invite_status', $invite_status );
 		}
 
 		if ( 'group-invites' == $bp->groups->current_create_step )
Index: bp-groups/bp-groups-screens.php
===================================================================
--- bp-groups/bp-groups-screens.php	(revision 4523)
+++ bp-groups/bp-groups-screens.php	(working copy)
@@ -505,14 +505,20 @@
 		// If the edit form has been submitted, save the edited details
 		if ( isset( $_POST['save'] ) ) {
 			$enable_forum   = ( isset($_POST['group-show-forum'] ) ) ? 1 : 0;
+			
+			// Checked against a whitelist for security
 			$allowed_status = apply_filters( 'groups_allowed_status', array( 'public', 'private', 'hidden' ) );
 			$status         = ( in_array( $_POST['group-status'], (array)$allowed_status ) ) ? $_POST['group-status'] : 'public';
+			
+			// Checked against a whitelist for security
+			$allowed_invite_status = apply_filters( 'groups_allowed_invite_status', array( 'members', 'mods', 'admins' ) );
+			$invite_status	       = in_array( $_POST['group-invite-status'], (array)$allowed_invite_status ) ? $_POST['group-invite-status'] : 'members';
 
 			// Check the nonce
 			if ( !check_admin_referer( 'groups_edit_group_settings' ) )
 				return false;
 
-			if ( !groups_edit_group_settings( $_POST['group-id'], $enable_forum, $status ) ) {
+			if ( !groups_edit_group_settings( $_POST['group-id'], $enable_forum, $status, $invite_status ) ) {
 				bp_core_add_message( __( 'There was an error updating group settings, please try again.', 'buddypress' ), 'error' );
 			} else {
 				bp_core_add_message( __( 'Group settings were successfully updated.', 'buddypress' ) );
Index: bp-groups/bp-groups-loader.php
===================================================================
--- bp-groups/bp-groups-loader.php	(revision 4523)
+++ bp-groups/bp-groups-loader.php	(working copy)
@@ -338,19 +338,17 @@
 				'item_css_id'     => 'members'
 			);
 
-			if ( is_user_logged_in() && groups_is_user_member( $bp->loggedin_user->id, $this->current_group->id ) ) {
-				if ( bp_is_active( 'friends' ) ) {
-					$sub_nav[] = array(
-						'name'            => __( 'Send Invites', 'buddypress' ),
-						'slug'            => 'send-invites',
-						'parent_url'      => $group_link,
-						'parent_slug'     => $this->current_group->slug,
-						'screen_function' => 'groups_screen_group_invite',
-						'item_css_id'     => 'invite',
-						'position'        => 70,
-						'user_has_access' => $this->current_group->user_has_access
-					);
-				}
+			if ( bp_is_active( 'friends' ) && bp_groups_user_can_send_invites() ) {
+				$sub_nav[] = array(
+					'name'            => __( 'Send Invites', 'buddypress' ),
+					'slug'            => 'send-invites',
+					'parent_url'      => $group_link,
+					'parent_slug'     => $this->current_group->slug,
+					'screen_function' => 'groups_screen_group_invite',
+					'item_css_id'     => 'invite',
+					'position'        => 70,
+					'user_has_access' => $this->current_group->user_has_access
+				);
 			}
 
 			parent::_setup_nav( $main_nav, $sub_nav );
Index: bp-groups/bp-groups-functions.php
===================================================================
--- bp-groups/bp-groups-functions.php	(revision 4523)
+++ bp-groups/bp-groups-functions.php	(working copy)
@@ -118,7 +118,7 @@
 	return true;
 }
 
-function groups_edit_group_settings( $group_id, $enable_forum, $status ) {
+function groups_edit_group_settings( $group_id, $enable_forum, $status, $invite_status = false ) {
 	global $bp;
 
 	$group = new BP_Groups_Group( $group_id );
@@ -144,6 +144,10 @@
 		}
 	}
 
+	// Set the invite status
+	if ( $invite_status )
+		groups_update_groupmeta( $group->id, 'invite_status', $invite_status );
+
 	groups_update_groupmeta( $group->id, 'last_activity', bp_core_current_time() );
 	do_action( 'groups_settings_updated', $group->id );
 
Index: bp-groups/bp-groups-template.php
===================================================================
--- bp-groups/bp-groups-template.php	(revision 4523)
+++ bp-groups/bp-groups-template.php	(working copy)
@@ -859,6 +859,123 @@
 }
 
 /**
+ * Get the 'checked' value, if needed, for a given invite_status on the group create/admin screens
+ *
+ * @package BuddyPress
+ * @subpackage Groups Template
+ * @since 1.3
+ *
+ * @param str $setting The setting you want to check against ('members', 'mods', or 'admins')
+ * @param obj $group (optional) The group whose status you want to check
+ */
+function bp_group_show_invite_status_setting( $setting, $group = false ) { 
+	$group_id = isset( $group->id ) ? $group->id : false;
+	
+	$invite_status = bp_group_get_invite_status( $group_id );
+	
+	if ( $setting == $invite_status )
+		echo ' checked="checked"';
+}
+
+/**
+ * Get the invite status of a group
+ *
+ * 'invite_status' became part of BuddyPress in BP 1.3. In order to provide backward compatibility,
+ * groups without a status set will default to 'members', ie all members in a group can send
+ * invitations. Filter 'bp_group_invite_status_fallback' to change this fallback behavior.
+ *
+ * This function can be used either in or out of the loop.
+ *
+ * @package BuddyPress
+ * @subpackage Groups Template
+ * @since 1.3
+ *
+ * @param int $group_id (optional) The id of the group whose status you want to check
+ * @return mixed Returns false when no group can be found. Otherwise returns the group invite
+ *    status, from among 'members', 'mods', and 'admins'
+ */
+function bp_group_get_invite_status( $group_id = false ) {
+	global $bp, $groups_template;
+		
+	if ( !$group_id ) {
+		if ( isset( $bp->groups->current_group->id ) ) {
+			// Default to the current group first
+			$group_id = $bp->groups->current_group->id;
+		} else if ( isset( $groups_template->group->id ) ) {
+			// Then see if we're in the loop
+			$group_id = $groups_template->group->id;
+		} else {
+			return false;
+		}
+	}
+	
+	$invite_status = groups_get_groupmeta( $group_id, 'invite_status' );
+
+	// Backward compatibility. When 'invite_status' is not set, fall back to a default value
+	if ( !$invite_status ) {
+		$invite_status = apply_filters( 'bp_group_invite_status_fallback', 'members' );
+	}
+
+	return apply_filters( 'bp_group_get_invite_status', $invite_status, $group_id );
+}
+
+/**
+ * Can the logged-in user send invitations in the specified group?
+ *
+ * @package BuddyPress
+ * @subpackage Groups Template
+ * @since 1.3
+ *
+ * @param int $group_id (optional) The id of the group whose status you want to check
+ * @return bool $can_send_invites
+ */
+function bp_groups_user_can_send_invites( $group_id = false ) { 
+	global $bp; 
+
+	$can_send_invites = false;
+	$invite_status    = false;
+	
+	if ( is_user_logged_in() ) {
+		if ( is_super_admin() ) { 
+			// Super admins can always send invitations 
+			$can_send_invites = true;
+
+		} else {
+			// If no $group_id is provided, default to the current group id
+			if ( !$group_id )
+				$group_id = isset( $bp->groups->current_group->id ) ? $bp->groups->current_group->id : 0;
+
+			// If no group has been found, bail
+			if ( !$group_id )
+				return false;
+
+			$invite_status = bp_group_get_invite_status( $group_id );
+			if ( !$invite_status )
+				return false;
+
+			switch ( $invite_status ) {
+				case 'admins' : 
+					if ( groups_is_user_admin( bp_loggedin_user_id(), $group_id ) ) 
+						$can_send_invites = true;
+					break;
+
+				case 'mods' :
+					if ( groups_is_user_mod( bp_loggedin_user_id(), $group_id ) || groups_is_user_admin( bp_loggedin_user_id(), $group_id ) )
+						$can_send_invites = true;
+					break;
+
+				case 'members' :
+					if ( groups_is_user_member( bp_loggedin_user_id(), $group_id ) )
+						$can_send_invites = true;
+					break;
+			}
+		}
+	}
+
+	return apply_filters( 'bp_groups_user_can_send_invites', $can_send_invites, $group_id, $invite_status );
+} 
+
+/**
  * Since BuddyPress 1.0, this generated the group settings admin/member screen.
  * As of BuddyPress 1.3 (r4489), and because this function outputs HTML, it was moved into /bp-default/groups/single/admin.php.
  *
