diff --git src/bp-activity/bp-activity-filters.php src/bp-activity/bp-activity-filters.php
index 82f992a..4b799a1 100644
--- src/bp-activity/bp-activity-filters.php
+++ src/bp-activity/bp-activity-filters.php
@@ -532,44 +532,52 @@ function bp_activity_heartbeat_last_recorded( $response = array(), $data = array
 		return $response;
 	}
 
-	// Use the querystring argument stored in the cookie (to preserve
-	// filters), but force the offset to get only new items
-	$activity_latest_args = bp_parse_args(
-		bp_ajax_querystring( 'activity' ),
-		array( 'since' => date( 'Y-m-d H:i:s', $data['bp_activity_last_recorded'] ) ),
-		'activity_latest_args'
-	);
+	$bp = buddypress();
+	$reset_post = $_POST;
+
+	$activity_latest_args = array( 'since' => date( 'Y-m-d H:i:s', $data['bp_activity_last_recorded'] ) );
 
 	if ( ! empty( $data['bp_activity_last_recorded_search_terms'] ) && empty( $activity_latest_args['search_terms'] ) ) {
 		$activity_latest_args['search_terms'] = addslashes( $data['bp_activity_last_recorded_search_terms'] );
 	}
 
+	$bp->activity->heartbeat_query = apply_filters( 'bp_after_activity_latest_args_parse_args', $activity_latest_args );
+
 	$newest_activities = array();
-	$last_activity_recorded = 0;
+	$bp->activity->last_recorded = 0;
+
+	/**
+	 * Temporary hookd to add a just-posted class for new activity items
+	 * and include heartbeat args to querystring
+	 */
+	add_filter( 'bp_get_activity_css_class', 'bp_activity_newest_class',                       10, 1 );
+	add_filter( 'bp_ajax_querystring',       'bp_activity_heartbeat_filter_ajax_querystring', 999, 1 );
+	add_action( 'bp_after_activity_entry',   'bp_activity_heartbeat_get_last_recorded'               );
 
-	// Temporarily add a just-posted class for new activity items
-	add_filter( 'bp_get_activity_css_class', 'bp_activity_newest_class', 10, 1 );
+	// We need to simulate a posted page to avoid the ul/form elements of activity loop to be output
+	$_POST['page'] = 1;
 
 	ob_start();
-	if ( bp_has_activities( $activity_latest_args ) ) {
-		while ( bp_activities() ) {
-			bp_the_activity();
 
-			$atime = strtotime( bp_get_activity_date_recorded() );
-			if ( $last_activity_recorded < $atime ) {
-				$last_activity_recorded = $atime;
-			}
-
-			bp_get_template_part( 'activity/entry' );
-		}
-	}
+	// Use the activity-loop to include hardcoded parameters
+	bp_get_template_part( 'activity/activity-loop' );
 
 	$newest_activities['activities']    = ob_get_contents();
-	$newest_activities['last_recorded'] = $last_activity_recorded;
+	$newest_activities['last_recorded'] = $bp->activity->last_recorded;
+
 	ob_end_clean();
 
-	// Remove the temporary filter
-	remove_filter( 'bp_get_activity_css_class', 'bp_activity_newest_class', 10, 1 );
+	// Remove the temporary hooks
+	remove_filter( 'bp_get_activity_css_class', 'bp_activity_newest_class',                  10, 1 );
+	remove_filter( 'bp_ajax_querystring',       'bp_activity_heartbeat_filter_querystring', 999, 1 );
+	remove_action( 'bp_after_activity_entry',   'bp_activity_heartbeat_get_last_recorded'          );
+
+	// Reset $_POST
+	$_POST = $reset_post;
+
+	// Reset globals
+	$bp->activity->heartbeat_query = array();
+	$bp->activity->last_recorded = 0;
 
 	if ( ! empty( $newest_activities['last_recorded'] ) ) {
 		$response['bp_activity_newest_activities'] = $newest_activities;
@@ -581,6 +589,55 @@ add_filter( 'heartbeat_received', 'bp_activity_heartbeat_last_recorded', 10, 2 )
 add_filter( 'heartbeat_nopriv_received', 'bp_activity_heartbeat_last_recorded', 10, 2 );
 
 /**
+ * Filter the querystring to include heartbeat activities args.
+ *
+ * @since BuddyPress (2.3.0)
+ *
+ * @see https://buddypress.trac.wordpress.org/ticket/6234
+ *
+ * @param string $querystring
+ * @return string edited or unchanged querystring
+ */
+function bp_activity_heartbeat_filter_ajax_querystring( $querystring = '' ) {
+	$bp = buddypress();
+
+	// Init new to current
+	$new_query_string = $querystring;
+
+	// Make sure we will manipulate an array
+	$query_args = wp_parse_args( $querystring, array() );
+
+	if ( ! empty( $bp->activity->heartbeat_query ) ) {
+		$query_args = array_merge( $query_args, $bp->activity->heartbeat_query );
+
+		// Build the new querystring
+		$new_query_string = http_build_query( $query_args );
+	}
+
+	return apply_filters( 'bp_activity_heartbeat_filter_ajax_querystring', $new_query_string, $querystring );
+}
+
+/**
+ * Get the activity last recorded time displayed in the activity loop template.
+ *
+ * @since BuddyPress (2.3.0)
+ *
+ * @see https://buddypress.trac.wordpress.org/ticket/6234
+ */
+function bp_activity_heartbeat_get_last_recorded() {
+	$bp = buddypress();
+
+	if ( ! isset( $bp->activity->last_recorded ) ) {
+		$bp->activity->last_recorded = 0;
+	}
+
+	$atime = strtotime( bp_get_activity_date_recorded() );
+	if ( $bp->activity->last_recorded < $atime ) {
+		$bp->activity->last_recorded = $atime;
+	}
+}
+
+/**
  * Set the strings for WP HeartBeat API where needed.
  *
  * @since BuddyPress (2.0.0)
diff --git src/bp-templates/bp-legacy/buddypress-functions.php src/bp-templates/bp-legacy/buddypress-functions.php
index 7b7f1b9..6a3dcb8 100644
--- src/bp-templates/bp-legacy/buddypress-functions.php
+++ src/bp-templates/bp-legacy/buddypress-functions.php
@@ -804,6 +804,7 @@ function bp_legacy_theme_activity_template_loader() {
  */
 function bp_legacy_theme_post_update() {
 	$bp = buddypress();
+	$reset_post = $_POST;
 
 	// Bail if not a POST action
 	if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
@@ -834,25 +835,49 @@ function bp_legacy_theme_post_update() {
 		exit( '-1<div id="message" class="error bp-ajax-message"><p>' . __( 'There was a problem posting your update. Please try again.', 'buddypress' ) . '</p></div>' );
 
 	$last_recorded = ! empty( $_POST['since'] ) ? date( 'Y-m-d H:i:s', intval( $_POST['since'] ) ) : 0;
+
+	// Check for "heartbeat" activities
 	if ( $last_recorded ) {
-		$activity_args = array( 'since' => $last_recorded );
+		$bp->activity->heartbeat_query = apply_filters( 'bp_after_activity_latest_args_parse_args', array( 'since' => $last_recorded ) );
 		$bp->activity->last_recorded = $last_recorded;
-		add_filter( 'bp_get_activity_css_class', 'bp_activity_newest_class', 10, 1 );
-	} else {
-		$activity_args = array( 'include' => $activity_id );
-	}
 
-	if ( bp_has_activities ( $activity_args ) ) {
-		while ( bp_activities() ) {
-			bp_the_activity();
-			bp_get_template_part( 'activity/entry' );
-		}
-	}
+		/**
+		 * Temporary hookd to add a just-posted class for new activity items
+		 * and include heartbeat args to querystring
+		 */
+		add_filter( 'bp_get_activity_css_class', 'bp_activity_newest_class',                       10, 1 );
+		add_filter( 'bp_ajax_querystring',       'bp_activity_heartbeat_filter_ajax_querystring', 999, 1 );
+		add_action( 'bp_after_activity_entry',   'bp_activity_heartbeat_get_last_recorded'               );
 
-	if ( ! empty( $last_recorded ) ) {
-		remove_filter( 'bp_get_activity_css_class', 'bp_activity_newest_class', 10, 1 );
-	}
+		// We need to simulate a posted page to avoid the ul/form elements of activity loop to be output
+		$_POST['page'] = 1;
+
+		// Use the activity-loop to include hardcoded parameters
+		bp_get_template_part( 'activity/activity-loop' );
 
+		// Remove the temporary hooks
+		remove_filter( 'bp_get_activity_css_class', 'bp_activity_newest_class',                  10, 1 );
+		remove_filter( 'bp_ajax_querystring',       'bp_activity_heartbeat_filter_querystring', 999, 1 );
+		remove_action( 'bp_after_activity_entry',   'bp_activity_heartbeat_get_last_recorded'          );
+
+		// Reset $_POST
+		$_POST = $reset_post;
+
+		/**
+		 * Reset globals except the last recorded as it's needed later to apply a specific css class
+		 * @see bp_activity_newest_class()
+		 */
+		$bp->activity->heartbeat_query = array();
+
+	// Simply include the just posted activity
+	} else {
+		if ( bp_has_activities ( array( 'include' => $activity_id ) ) ) {
+			while ( bp_activities() ) {
+				bp_the_activity();
+				bp_get_template_part( 'activity/entry' );
+			}
+		}
+	}
 	exit;
 }
 
