diff --git src/bp-activity/bp-activity-functions.php src/bp-activity/bp-activity-functions.php
index 30f4bef..8bcc546 100644
--- src/bp-activity/bp-activity-functions.php
+++ src/bp-activity/bp-activity-functions.php
@@ -3104,11 +3104,8 @@ function bp_embed_activity_save_cache( $cache, $cachekey, $id ) {
  * @uses bp_is_activity_heartbeat_active() to check if heartbeat setting is on.
  * @uses bp_is_activity_directory() to check if the current page is the activity
  *       directory.
- * @uses bp_is_active() to check if the group component is active.
  * @uses bp_is_group_activity() to check if on a single group, the current page
  *       is the group activities.
- * @uses bp_is_group_home() to check if the current page is a single group home
- *       page.
  *
  * @return bool True if activity heartbeat is enabled, otherwise false.
  */
@@ -3119,18 +3116,9 @@ function bp_activity_do_heartbeat() {
 		return $retval;
 	}
 
-	if ( bp_is_activity_directory() ) {
+	if ( bp_is_activity_directory() || bp_is_group_activity() ) {
 		$retval = true;
 	}
 
-	if ( bp_is_active( 'groups') ) {
-		// If no custom front, then activities are loaded in group's home
-		$has_custom_front = bp_locate_template( array( 'groups/single/front.php' ), false, true );
-
-		if ( bp_is_group_activity() || ( ! $has_custom_front && bp_is_group_home() ) ) {
-			$retval = true;
-		}
-	}
-
 	return $retval;
 }
diff --git src/bp-core/bp-core-template.php src/bp-core/bp-core-template.php
index be74901..93e0bb5 100644
--- src/bp-core/bp-core-template.php
+++ src/bp-core/bp-core-template.php
@@ -2552,7 +2552,17 @@ function bp_is_group_forum() {
  * @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;
 }
 
 /**
@@ -2585,7 +2595,17 @@ function bp_is_group_forum_topic_edit() {
  * @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;
 }
 
 /**
@@ -2633,6 +2653,18 @@ function bp_is_group_single() {
 }
 
 /**
+ * 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/.
diff --git src/bp-groups/bp-groups-filters.php src/bp-groups/bp-groups-filters.php
index 0e53571..470ce9b 100644
--- src/bp-groups/bp-groups-filters.php
+++ src/bp-groups/bp-groups-filters.php
@@ -269,7 +269,7 @@ function bp_groups_maybe_load_mentions_scripts( $load_mentions, $mentions_enable
 		return $load_mentions;
 	}
 
-	if ( $load_mentions || ( bp_is_group_activity() || bp_is_group_home() ) ) {
+	if ( $load_mentions || bp_is_group_activity() ) {
 		return true;
 	}
 
diff --git src/bp-groups/bp-groups-loader.php src/bp-groups/bp-groups-loader.php
index 3c5653b..d5b698f 100644
--- src/bp-groups/bp-groups-loader.php
+++ src/bp-groups/bp-groups-loader.php
@@ -251,6 +251,9 @@ class BP_Groups_Component extends BP_Component {
 				$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;
@@ -371,6 +374,11 @@ class BP_Groups_Component extends BP_Component {
 
 		$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;
 		}
@@ -527,17 +535,39 @@ class BP_Groups_Component extends BP_Component {
 				);
 			}
 
-			$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(
diff --git src/bp-groups/bp-groups-screens.php src/bp-groups/bp-groups-screens.php
index 875527f..5ffcbcb 100644
--- src/bp-groups/bp-groups-screens.php
+++ src/bp-groups/bp-groups-screens.php
@@ -741,6 +741,34 @@ function groups_screen_group_request_membership() {
 }
 
 /**
+ * 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() {
diff --git src/bp-groups/bp-groups-template.php src/bp-groups/bp-groups-template.php
index 9cbdcad..9aa5a2d 100644
--- src/bp-groups/bp-groups-template.php
+++ src/bp-groups/bp-groups-template.php
@@ -4343,6 +4343,70 @@ function bp_group_member_admin_pagination() {
 	}
 
 /**
+ * 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 2.0.0
diff --git src/bp-templates/bp-legacy/buddypress-functions.php src/bp-templates/bp-legacy/buddypress-functions.php
index 2532123..d5c436e 100644
--- src/bp-templates/bp-legacy/buddypress-functions.php
+++ src/bp-templates/bp-legacy/buddypress-functions.php
@@ -925,17 +925,36 @@ function bp_legacy_theme_post_update() {
 		exit( '-1<div id="message" class="error bp-ajax-message"><p>' . __( 'Please enter some content to post.', 'buddypress' ) . '</p></div>' );
 
 	$activity_id = 0;
-	if ( empty( $_POST['object'] ) && bp_is_active( 'activity' ) ) {
+	$item_id     = 0;
+	$object      = '';
+
+
+	// Try to get the item id from posted variables.
+	if ( ! empty( $_POST['item_id'] ) ) {
+		$item_id = (int) $_POST['item_id'];
+	}
+
+	// Try to get the object from posted variables.
+	if ( ! empty( $_POST['object'] ) ) {
+		$object  = sanitize_key( $_POST['object'] );
+
+	// If the object is not set and we're in a group, set the item id and the object
+	} elseif ( bp_is_group() ) {
+		$item_id = bp_get_current_group_id();
+		$object = 'groups';
+	}
+
+	if ( ! $object && bp_is_active( 'activity' ) ) {
 		$activity_id = bp_activity_post_update( array( 'content' => $_POST['content'] ) );
 
-	} elseif ( $_POST['object'] == 'groups' ) {
-		if ( ! empty( $_POST['item_id'] ) && bp_is_active( 'groups' ) )
-			$activity_id = groups_post_update( array( 'content' => $_POST['content'], 'group_id' => $_POST['item_id'] ) );
+	} elseif ( 'groups' === $object ) {
+		if ( $item_id && bp_is_active( 'groups' ) )
+			$activity_id = groups_post_update( array( 'content' => $_POST['content'], 'group_id' => $item_id ) );
 
 	} else {
 
 		/** This filter is documented in bp-activity/bp-activity-actions.php */
-		$activity_id = apply_filters( 'bp_activity_custom_update', false, $_POST['object'], $_POST['item_id'], $_POST['content'] );
+		$activity_id = apply_filters( 'bp_activity_custom_update', false, $object, $item_id, $_POST['content'] );
 	}
 
 	if ( empty( $activity_id ) )
diff --git src/bp-templates/bp-legacy/buddypress/activity/post-form.php src/bp-templates/bp-legacy/buddypress/activity/post-form.php
index fb4f175..5632973 100644
--- src/bp-templates/bp-legacy/buddypress/activity/post-form.php
+++ src/bp-templates/bp-legacy/buddypress/activity/post-form.php
@@ -66,7 +66,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(); ?>" />
diff --git src/bp-templates/bp-legacy/buddypress/groups/single/home.php src/bp-templates/bp-legacy/buddypress/groups/single/home.php
index 5097547..94dc19a 100644
--- src/bp-templates/bp-legacy/buddypress/groups/single/home.php
+++ src/bp-templates/bp-legacy/buddypress/groups/single/home.php
@@ -68,17 +68,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 {
 
