Index: src/bp-core/bp-core-template.php
===================================================================
--- src/bp-core/bp-core-template.php
+++ src/bp-core/bp-core-template.php
@@ -2534,7 +2534,17 @@
  * @return True if the current page is a group's activity page.
  */
 function bp_is_group_activity() {
-	return (bool) ( bp_is_single_item() && bp_is_groups_component() && bp_is_current_action( 'activity' ) );
+	$retval = false;
+
+	if ( bp_is_single_item() && bp_is_groups_component() && bp_is_current_action( 'activity' ) ) {
+		$retval = true;
+	}
+
+	if ( bp_is_group_home() && bp_is_active( 'activity' ) && ! bp_is_group_custom_front() ) {
+		$retval = true;
+	}
+
+	return $retval;
 }
 
 /**
@@ -2567,7 +2577,17 @@
  * @return bool True if the current page is part of a group's Members page.
  */
 function bp_is_group_members() {
-	return (bool) ( bp_is_single_item() && bp_is_groups_component() && bp_is_current_action( 'members' ) );
+	$retval = false;
+
+	if ( bp_is_single_item() && bp_is_groups_component() && bp_is_current_action( 'members' ) ) {
+		$retval = true;
+	}
+
+	if ( bp_is_group_home() && ! bp_is_active( 'activity' ) && ! bp_is_group_custom_front() ) {
+		$retval = true;
+	}
+
+	return $retval;
 }
 
 /**
@@ -2615,6 +2635,18 @@
 }
 
 /**
+ * Is the current group page a custom front?
+ *
+ * @since 2.4.0
+ *
+ * @return bool True if the current group page is a custom front.
+ */
+function bp_is_group_custom_front() {
+	$bp = buddypress();
+	return (bool) bp_is_group_home() && ! empty( $bp->groups->current_group->front_template );
+}
+
+/**
  * Is the current page the Create a Blog page?
  *
  * Eg http://example.com/sites/create/.
Index: src/bp-groups/bp-groups-loader.php
===================================================================
--- src/bp-groups/bp-groups-loader.php
+++ src/bp-groups/bp-groups-loader.php
@@ -252,6 +252,9 @@
 				$this->current_group->user_has_access = true;
 			}
 
+			// Check once if the current group has a custom front template
+			$this->current_group->front_template = bp_groups_get_front_template( $this->current_group );
+
 		// Set current_group to 0 to prevent debug errors
 		} else {
 			$this->current_group = 0;
@@ -365,6 +368,11 @@
 
 		$bp = buddypress();
 
+		// If the activity component is not active and the current group has no custom front, members are displayed in the home nav
+		if ( 'members' === $this->default_extension && ! bp_is_active( 'activity' ) && ! $this->current_group->front_template ) {
+			$this->default_extension = 'home';
+		}
+
 		if ( ! bp_current_action() ) {
 			$bp->current_action = $this->default_extension;
 		}
@@ -521,17 +529,39 @@
 				);
 			}
 
-			$sub_nav[] = array(
-				'name'            => sprintf( _x( 'Members <span>%s</span>', 'My Group screen nav', 'buddypress' ), number_format( $this->current_group->total_member_count ) ),
-				'slug'            => 'members',
-				'parent_url'      => $group_link,
-				'parent_slug'     => $this->current_group->slug,
-				'screen_function' => 'groups_screen_group_members',
-				'position'        => 60,
-				'user_has_access' => $this->current_group->user_has_access,
-				'item_css_id'     => 'members',
-				'no_access_url'   => $group_link,
-			);
+			if ( $this->current_group->front_template || bp_is_active( 'activity' ) ) {
+				/**
+				 * If the theme is using a custom front, create activity subnav.
+				 */
+				if ( $this->current_group->front_template && bp_is_active( 'activity' ) ) {
+					$sub_nav[] = array(
+						'name'            => _x( 'Activity', 'My Group screen nav', 'buddypress' ),
+						'slug'            => 'activity',
+						'parent_url'      => $group_link,
+						'parent_slug'     => $this->current_group->slug,
+						'screen_function' => 'groups_screen_group_activity',
+						'position'        => 11,
+						'user_has_access' => $this->current_group->user_has_access,
+						'item_css_id'     => 'activity',
+						'no_access_url'   => $group_link,
+					);
+				}
+
+				/**
+				 * Only add the members subnav if it's not the home's nav
+				 */
+				$sub_nav[] = array(
+					'name'            => sprintf( _x( 'Members <span>%s</span>', 'My Group screen nav', 'buddypress' ), number_format( $this->current_group->total_member_count ) ),
+					'slug'            => 'members',
+					'parent_url'      => $group_link,
+					'parent_slug'     => $this->current_group->slug,
+					'screen_function' => 'groups_screen_group_members',
+					'position'        => 60,
+					'user_has_access' => $this->current_group->user_has_access,
+					'item_css_id'     => 'members',
+					'no_access_url'   => $group_link,
+				);
+			}
 
 			if ( bp_is_active( 'friends' ) && bp_groups_user_can_send_invites() ) {
 				$sub_nav[] = array(
Index: src/bp-groups/bp-groups-screens.php
===================================================================
--- src/bp-groups/bp-groups-screens.php
+++ src/bp-groups/bp-groups-screens.php
@@ -742,6 +742,34 @@
 }
 
 /**
+ * Handle the loading of a single group's activity.
+ *
+ * @since 2.4.0
+ */
+function groups_screen_group_activity() {
+
+	if ( ! bp_is_single_item() ) {
+		return false;
+	}
+
+	/**
+	 * Fires before the loading of a single group's activity page.
+	 *
+	 * @since 2.4.0
+	 */
+	do_action( 'groups_screen_group_activity' );
+
+	/**
+	 * Filters the template to load for a single group's activity page.
+	 *
+	 * @since 2.4.0
+	 *
+	 * @param string $value Path to a single group's template to load.
+	 */
+	bp_core_load_template( apply_filters( 'groups_screen_group_activity', 'groups/single/activity' ) );
+}
+
+/**
  * Handle the display of a single group activity item.
  */
 function groups_screen_group_activity_permalink() {
Index: src/bp-groups/bp-groups-template.php
===================================================================
--- src/bp-groups/bp-groups-template.php
+++ src/bp-groups/bp-groups-template.php
@@ -4327,6 +4327,70 @@
 	}
 
 /**
+ * Output the contents of the current group's home page.
+ *
+ * You should only use this when on a single group page.
+ *
+ * @since 2.4.0
+ */
+function bp_groups_front_template_part() {
+	$located = bp_groups_get_front_template();
+
+	if ( false !== $located ) {
+		$slug = str_replace( '.php', '', $located );
+
+		/**
+		 * Let plugins adding an action to bp_get_template_part get it from here
+		 *
+		 * @param string $slug Template part slug requested.
+		 * @param string $name Template part name requested.
+		 */
+		do_action( 'get_template_part_' . $slug, $slug, false );
+
+		load_template( $located, true );
+
+	} else if ( bp_is_active( 'activity' ) ) {
+		bp_get_template_part( 'groups/single/activity' );
+
+	} else if ( bp_is_active( 'members'  ) ) {
+		bp_groups_members_template_part();
+	}
+
+	return $located;
+}
+
+/**
+ * Locate a custom group front template if it exists.
+ *
+ * @since 2.4.0
+ *
+ * @param  BP_Groups_Group|null $group Optional. Falls back to current group if not passed.
+ * @return string|bool                 Path to front template on success; boolean false on failure.
+ */
+function bp_groups_get_front_template( $group = null ) {
+	if ( ! is_a( $group, 'BP_Groups_Group' ) ) {
+		$group = groups_get_current_group();
+	}
+
+	if ( ! isset( $group->id ) ) {
+		return false;
+	}
+
+	if ( isset( $group->front_template ) ) {
+		return $group->front_template;
+	}
+
+	$template_names = apply_filters( 'bp_groups_get_front_template', array(
+		'groups/single/front-id-'     . sanitize_file_name( $group->id )     . '.php',
+		'groups/single/front-slug-'   . sanitize_file_name( $group->slug )   . '.php',
+		'groups/single/front-status-' . sanitize_file_name( $group->status ) . '.php',
+		'groups/single/front.php'
+	) );
+
+	return bp_locate_template( $template_names, false, true );
+}
+
+/**
  * Output the Group members template
  *
  * @since BuddyPress (2.0.0)
Index: src/bp-templates/bp-legacy/buddypress/activity/post-form.php
===================================================================
--- src/bp-templates/bp-legacy/buddypress/activity/post-form.php
+++ src/bp-templates/bp-legacy/buddypress/activity/post-form.php
@@ -67,7 +67,7 @@
 				</div>
 				<input type="hidden" id="whats-new-post-object" name="whats-new-post-object" value="groups" />
 
-			<?php elseif ( bp_is_group_home() ) : ?>
+			<?php elseif ( bp_is_group_activity() ) : ?>
 
 				<input type="hidden" id="whats-new-post-object" name="whats-new-post-object" value="groups" />
 				<input type="hidden" id="whats-new-post-in" name="whats-new-post-in" value="<?php bp_group_id(); ?>" />
Index: src/bp-templates/bp-legacy/buddypress/groups/single/home.php
===================================================================
--- src/bp-templates/bp-legacy/buddypress/groups/single/home.php
+++ src/bp-templates/bp-legacy/buddypress/groups/single/home.php
@@ -59,17 +59,8 @@
 
 				if ( bp_group_is_visible() ) {
 
-					// Use custom front if one exists
-					$custom_front = bp_locate_template( array( 'groups/single/front.php' ), false, true );
-					if     ( ! empty( $custom_front   ) ) : load_template( $custom_front, true );
-
-					// Default to activity
-					elseif ( bp_is_active( 'activity' ) ) : bp_get_template_part( 'groups/single/activity' );
-
-					// Otherwise show members
-					elseif ( bp_is_active( 'members'  ) ) : bp_groups_members_template_part();
-
-					endif;
+					// Load appropriate front template
+					bp_groups_front_template_part();
 
 				} else {
 
