Index: src/bp-activity/bp-activity-actions.php
===================================================================
--- src/bp-activity/bp-activity-actions.php
+++ src/bp-activity/bp-activity-actions.php
@@ -797,7 +797,12 @@
 	if ( $new_status === $old_status ) {
 		// An edit of an existing post should update the existing activity item.
 		if ( $new_status == 'publish' ) {
-			bp_activity_post_type_update( $post );
+			$edit = bp_activity_post_type_update( $post );
+
+			// Post was never recorded into activity stream, so record it now!
+			if ( null === $edit ) {
+				bp_activity_post_type_publish( $post->ID, $post );
+			}
 		}
 
 		return;
Index: src/bp-activity/bp-activity-functions.php
===================================================================
--- src/bp-activity/bp-activity-functions.php
+++ src/bp-activity/bp-activity-functions.php
@@ -606,53 +606,57 @@
 }
 
 /**
- * Helper function to check if the activity action is about a "parent" post type activity
- * supporting comments tracking
+ * Check if a certain activity type supports a specific feature.
  *
  * @since 2.5.0
  *
- * @param  string $action_id the activity action to check
- * @return bool   true if it's a parent post type activity supporting comments
- *                false otherwise
+ * @param  string $activity_type The activity type to check.
+ * @param  string $supports      The feature to check. Currently supports:
+ *                               'comment-tracking', 'post-comments'. See inline doc for more info.
+ * @return bool
  */
-function bp_activity_action_is_post_tracking_action( $action_id ) {
-	if ( empty( $action_id ) ) {
-		return false;
-	}
+function bp_activity_type_supports( $activity_type = '', $supports = '' ) {
+	$retval = false;
 
 	$bp = buddypress();
 
-	$retval = bp_activity_action_supports_comments_tracking( $action_id );
-
-	if ( empty( $retval ) ) {
-		return $retval;
-	}
-
-	return ! empty( $bp->activity->track[ $action_id ]->comment_action_id );
-}
+	switch ( $supports ) {
+		/**
+		 * Does this activity type support comment tracking?
+		 *
+		 * eg. 'new_blog_post' and 'new_blog_comment' will both return true.
+		 */
+		case 'comment-tracking' :
+			// Set the activity track global if not set yet
+			if ( empty( $bp->activity->track ) ) {
+				$bp->activity->track = bp_activity_get_post_types_tracking_args();
+			}
 
-/**
- * Helper function to check if the activity action is supporting comments tracking
- *
- * @since 2.5.0
- *
- * @param  string $action_id the activity action to check
- * @return bool   true activity action supports comments tracking
- *                false otherwise
- */
-function bp_activity_action_supports_comments_tracking( $action_id ) {
-	if ( empty( $action_id ) ) {
-		return false;
-	}
+			if ( ! empty( $bp->activity->track[ $activity_type ]->comments_tracking ) ) {
+				$retval = true;
+			}
+			break;
 
-	$bp = buddypress();
+		/**
+		 * Is this a parent activity type that support post comments?
+		 *
+		 * eg. 'new_blog_post' will return true; 'new_blog_comment' will return false.
+		 *
+		 * Might need to rename 'post-comments' to something else...
+		 */
+		case 'post-comments' :
+			// Set the activity track global if not set yet
+			if ( empty( $bp->activity->track ) ) {
+				$bp->activity->track = bp_activity_get_post_types_tracking_args();
+			}
 
-	// Set the activity track global if not set yet
-	if ( empty( $bp->activity->track ) ) {
-		$bp->activity->track = bp_activity_get_post_types_tracking_args();
+			if ( ! empty( $bp->activity->track[ $activity_type ]->comments_tracking ) && ! empty( $bp->activity->track[ $activity_type ]->comment_action_id ) ) {
+				$retval = true;
+			}
+			break;
 	}
 
-	return ! empty( $bp->activity->track[ $action_id ]->comments_tracking );
+	return $retval;
 }
 
 /**
Index: src/bp-blogs/bp-blogs-activity.php
===================================================================
--- src/bp-blogs/bp-blogs-activity.php
+++ src/bp-blogs/bp-blogs-activity.php
@@ -18,16 +18,9 @@
  * @return bool|null Returns false if activity component is not active.
  */
 function bp_blogs_register_activity_actions() {
-	$bp = buddypress();
-
-	// Bail if activity is not active.
-	if ( ! bp_is_active( 'activity' ) ) {
-		return false;
-	}
-
 	if ( is_multisite() ) {
 		bp_activity_set_action(
-			$bp->blogs->id,
+			buddypress()->blogs->id,
 			'new_blog',
 			__( 'New site created', 'buddypress' ),
 			'bp_blogs_format_activity_action_new_blog',
@@ -47,6 +40,81 @@
 add_action( 'bp_register_activity_actions', 'bp_blogs_register_activity_actions' );
 
 /**
+ * Set up the tracking arguments for the 'post' post type.
+ *
+ * @since 2.5.0 This was moved out of the BP_Blogs_Component class.
+ *
+ * @see bp_activity_get_post_type_tracking_args() for information on parameters.
+ *
+ * @param object|null $params    Tracking arguments.
+ * @param string|int  $post_type Post type to track.
+ * @return object
+ */
+function bp_blogs_register_post_tracking_args( $params = null, $post_type = 0 ) {
+
+	/**
+	 * Filters the post types to track for the Blogs component.
+	 *
+	 * @since 1.5.0
+	 * @deprecated 2.3.0
+	 *
+	 * Make sure plugins still using 'bp_blogs_record_post_post_types'
+	 * to track their post types will generate new_blog_post activities
+	 * See https://buddypress.trac.wordpress.org/ticket/6306
+	 *
+	 * @param array $value Array of post types to track.
+	 */
+	$post_types = apply_filters( 'bp_blogs_record_post_post_types', array( 'post' ) );
+	$post_types_array = array_flip( $post_types );
+
+	if ( ! isset( $post_types_array[ $post_type ] ) ) {
+		return $params;
+	}
+
+	// Set specific params for the 'post' post type.
+	$params->component_id    = buddypress()->blogs->id;
+	$params->action_id       = 'new_blog_post';
+	$params->admin_filter    = __( 'New post published', 'buddypress' );
+	$params->format_callback = 'bp_blogs_format_activity_action_new_blog_post';
+	$params->front_filter    = __( 'Posts', 'buddypress' );
+	$params->contexts        = array( 'activity', 'member' );
+	$params->position        = 5;
+
+	if ( post_type_supports( $post_type, 'comments' ) ) {
+		$params->comment_action_id = 'new_blog_comment';
+
+		/**
+		 * Filters the post types to track for the Blogs component.
+		 *
+		 * @since 1.5.0
+		 * @deprecated 2.5.0
+		 *
+		 * Make sure plugins still using 'bp_blogs_record_comment_post_types'
+		 * to track comment about their post types will generate new_blog_comment activities
+		 * See https://buddypress.trac.wordpress.org/ticket/6306
+		 *
+		 * @param array $value Array of post types to track.
+		 */
+		$comment_post_types = apply_filters( 'bp_blogs_record_comment_post_types', array( 'post' ) );
+		$comment_post_types_array = array_flip( $comment_post_types );
+
+		if ( isset( $comment_post_types_array[ $post_type ] ) ) {
+			$params->comments_tracking = new stdClass();
+			$params->comments_tracking->component_id    = buddypress()->blogs->id;
+			$params->comments_tracking->action_id       = 'new_blog_comment';
+			$params->comments_tracking->admin_filter    = __( 'New post comment posted', 'buddypress' );
+			$params->comments_tracking->format_callback = 'bp_blogs_format_activity_action_new_blog_comment';
+			$params->comments_tracking->front_filter    = __( 'Comments', 'buddypress' );
+			$params->comments_tracking->contexts        = array( 'activity', 'member' );
+			$params->comments_tracking->position        = 10;
+		}
+	}
+
+	return $params;
+}
+add_filter( 'bp_activity_get_post_type_tracking_args', 'bp_blogs_register_post_tracking_args', 10, 2 );
+
+/**
  * Format 'new_blog' activity actions.
  *
  * @since 2.0.0
@@ -370,20 +438,12 @@
  * @return int|bool On success, returns the activity ID. False on failure.
  */
 function bp_blogs_record_activity( $args = '' ) {
-
-	// Bail if activity is not active.
-	if ( ! bp_is_active( 'activity' ) ) {
-		return false;
-	}
-
-	$bp = buddypress();
-
 	$defaults = array(
 		'user_id'           => bp_loggedin_user_id(),
 		'action'            => '',
 		'content'           => '',
 		'primary_link'      => '',
-		'component'         => $bp->blogs->id,
+		'component'         => buddypress()->blogs->id,
 		'type'              => false,
 		'item_id'           => false,
 		'secondary_item_id' => false,
@@ -447,12 +507,6 @@
  * @return bool True on success, false on failure.
  */
 function bp_blogs_delete_activity( $args = '' ) {
-
-	// Bail if activity is not active.
-	if ( ! bp_is_active( 'activity' ) ) {
-		return false;
-	}
-
 	$r = bp_parse_args( $args, array(
 		'item_id'           => false,
 		'component'         => buddypress()->blogs->id,
@@ -570,7 +624,7 @@
  */
 function bp_blogs_sync_add_from_activity_comment( $comment_id, $params, $parent_activity ) {
 	// if parent activity isn't a post type having the buddypress-activity support, stop now!
-	if ( ! bp_activity_action_supports_comments_tracking( $parent_activity->type ) ) {
+	if ( ! bp_activity_type_supports( $parent_activity->type, 'comment-tracking' ) ) {
 		return;
 	}
 
@@ -688,7 +742,7 @@
 	$parent_activity = new BP_Activity_Activity( $parent_activity_id );
 
 	// if parent activity isn't a post type having the buddypress-activity support, stop now!
-	if ( ! bp_activity_action_supports_comments_tracking( $parent_activity->type ) ) {
+	if ( ! bp_activity_type_supports( $parent_activity->type, 'comment-tracking' ) ) {
 		return $retval;
 	}
 
@@ -744,7 +798,7 @@
 	$parent_activity = new BP_Activity_Activity( $activity->item_id );
 
 	// if parent activity isn't a post type having the buddypress-activity support for comments, stop now!
-	if ( ! bp_activity_action_supports_comments_tracking( $parent_activity->type ) ) {
+	if ( ! bp_activity_type_supports( $parent_activity->type, 'comment-tracking' ) ) {
 		return;
 	}
 
@@ -834,11 +888,6 @@
  * powers the 'Comments' filter in the activity directory dropdown) includes
  * both old-style and new-style activity comments.
  *
- * This implementation involves filtering the activity queries directly, and
- * should be considered a stopgap. The proper solution would involve enabling
- * multiple query condition clauses, connected by an OR, in the bp_has_activities()
- * API.
- *
  * @since 2.1.0
  * @since 2.5.0 Used for any synced Post type comments, in wp-admin or front-end contexts.
  *
@@ -849,7 +898,7 @@
 	global $wpdb;
 	$bp = buddypress();
 
-	// if activity comments are disabled for blog posts, stop now!
+	// If activity comments are disabled for blog posts, stop now!
 	if ( bp_disable_blogforum_comments() ) {
 		return $args;
 	}
@@ -934,7 +983,7 @@
 	}
 
 	// parent not a post post type action ? stop now!
-	if ( ! bp_activity_action_is_post_tracking_action( $activity->type ) ) {
+	if ( ! bp_activity_type_supports( $activity->type, 'post-comments' ) ) {
 		return;
 	}
 
@@ -1016,12 +1065,12 @@
 		return $retval;
 	}
 
-	$action = bp_get_activity_action_name();
+	$type = bp_get_activity_type();
 
-	// It's a post type action supporting comment tracking
-	if ( bp_activity_action_supports_comments_tracking( $action ) ) {
+	// It's a post type supporting comment tracking.
+	if ( bp_activity_type_supports( $type, 'comment-tracking' ) ) {
 		// it's a "post" action
-		if ( bp_activity_action_is_post_tracking_action( $action ) ) {
+		if ( bp_activity_type_supports( $type, 'post-comments' ) ) {
 			global $activities_template;
 
 			// Setup some globals we'll need to reference later.
@@ -1187,10 +1236,11 @@
 		return $retval;
 	}
 
-	$bp = buddypress();
 	$blog_comment_id = bp_activity_get_meta( $activity->id, 'bp_blogs_post_comment_id' );
 
 	if ( ! empty( $blog_comment_id ) ) {
+		$bp = buddypress();
+
 		// Fetch the parent blog post activity item.
 		$parent_blog_post_activity = new BP_Activity_Activity( $activity->item_id );
 
Index: src/bp-blogs/bp-blogs-loader.php
===================================================================
--- src/bp-blogs/bp-blogs-loader.php
+++ src/bp-blogs/bp-blogs-loader.php
@@ -106,9 +106,6 @@
 				add_post_type_support( $post_type, 'buddypress-activity' );
 			}
 		}
-
-		// Filter the generic track parameters for the 'post' post type.
-		add_filter( 'bp_activity_get_post_type_tracking_args', array( $this, 'post_tracking_args' ), 10, 2 );
 	}
 
 	/**
@@ -128,10 +125,13 @@
 			'classes',
 			'template',
 			'filters',
-			'activity',
 			'functions',
 		);
 
+		if ( bp_is_active( 'activity' ) ) {
+			$includes[] = 'activity';
+		}
+
 		if ( is_multisite() ) {
 			$includes[] = 'widgets';
 		}
@@ -300,80 +300,6 @@
 
 		parent::setup_cache_groups();
 	}
-
-	/**
-	 * Set up the tracking arguments for the 'post' post type.
-	 *
-	 * @since 2.2.0
-	 *
-	 * @see bp_activity_get_post_type_tracking_args() for information on parameters.
-	 *
-	 * @param object|null $params    Tracking arguments.
-	 * @param string|int  $post_type Post type to track.
-	 * @return object
-	 */
-	public function post_tracking_args( $params = null, $post_type = 0 ) {
-
-		/**
-		 * Filters the post types to track for the Blogs component.
-		 *
-		 * @since 1.5.0
-		 * @deprecated 2.3.0
-		 *
-		 * Make sure plugins still using 'bp_blogs_record_post_post_types'
-		 * to track their post types will generate new_blog_post activities
-		 * See https://buddypress.trac.wordpress.org/ticket/6306
-		 *
-		 * @param array $value Array of post types to track.
-		 */
-		$post_types = apply_filters( 'bp_blogs_record_post_post_types', array( 'post' ) );
-		$post_types_array = array_flip( $post_types );
-
-		if ( ! isset( $post_types_array[ $post_type ] ) ) {
-			return $params;
-		}
-
-		// Set specific params for the 'post' post type.
-		$params->component_id    = $this->id;
-		$params->action_id       = 'new_blog_post';
-		$params->admin_filter    = __( 'New post published', 'buddypress' );
-		$params->format_callback = 'bp_blogs_format_activity_action_new_blog_post';
-		$params->front_filter    = __( 'Posts', 'buddypress' );
-		$params->contexts        = array( 'activity', 'member' );
-		$params->position        = 5;
-
-		if ( post_type_supports( $post_type, 'comments' ) ) {
-			$params->comment_action_id = 'new_blog_comment';
-
-			/**
-			 * Filters the post types to track for the Blogs component.
-			 *
-			 * @since 1.5.0
-			 * @deprecated 2.5.0
-			 *
-			 * Make sure plugins still using 'bp_blogs_record_comment_post_types'
-			 * to track comment about their post types will generate new_blog_comment activities
-			 * See https://buddypress.trac.wordpress.org/ticket/6306
-			 *
-			 * @param array $value Array of post types to track.
-			 */
-			$comment_post_types = apply_filters( 'bp_blogs_record_comment_post_types', array( 'post' ) );
-			$comment_post_types_array = array_flip( $comment_post_types );
-
-			if ( isset( $comment_post_types_array[ $post_type ] ) ) {
-				$params->comments_tracking = new stdClass();
-				$params->comments_tracking->component_id      = $this->id;
-				$params->comments_tracking->action_id         = 'new_blog_comment';
-				$params->comments_tracking->admin_filter      = __( 'New post comment posted', 'buddypress' );
-				$params->comments_tracking->format_callback   = 'bp_blogs_format_activity_action_new_blog_comment';
-				$params->comments_tracking->front_filter      = __( 'Comments', 'buddypress' );
-				$params->comments_tracking->contexts          = array( 'activity', 'member' );
-				$params->comments_tracking->position          = 10;
-			}
-		}
-
-		return $params;
-	}
 }
 
 /**
Index: tests/phpunit/testcases/activity/actions.php
===================================================================
--- tests/phpunit/testcases/activity/actions.php
+++ tests/phpunit/testcases/activity/actions.php
@@ -49,16 +49,6 @@
 		// 'new' => 'publish'
 		$this->assertTrue( $this->activity_exists_for_post( $post_id, 'new_foo' ), 'Published post type should have activity' );
 
-		// Delete the activity
-		bp_activity_post_type_unpublish( $post_id, $post );
-
-		$post->post_status = 'publish';
-		$post->post_content .= ' foo';
-
-		wp_update_post( $post );
-
-		$this->assertFalse( $this->activity_exists_for_post( $post_id, 'new_foo' ), 'Updating a post type should not create a new activity' );
-
 		_unregister_post_type( 'foo' );
 	}
 
@@ -123,6 +113,61 @@
 		_unregister_post_type( 'foo' );
 	}
 
+	/**
+	 * @group bp_activity_catch_transition_post_type_status
+	 * @group activity_tracking
+	 */
+	public function test_bp_activity_catch_transition_post_type_status_publish_existing_post() {
+		$u = $this->factory->user->create();
+
+		$labels = array(
+			'bp_activity_admin_filter' => 'New Foo',
+			'bp_activity_front_filter' => 'Foos',
+		        'bp_activity_new_post'    => '%1$s posted a new <a href="%2$s">foo</a>',
+		        'bp_activity_new_post_ms' => '%1$s posted a new <a href="%2$s">foo</a>, on the site %3$s',
+		);
+
+		/**
+		 * 'public' must be set to true, otherwise bp_activity_get_post_types_tracking_args() fails.
+		 */
+		register_post_type( 'foo', array(
+			'labels'      => $labels,
+			'public'      => true,
+			'supports'    => array( 'buddypress-activity' ),
+			'bp_activity' => array(
+				'action_id'    => 'new_foo',
+				'contexts'     => array( 'activity' ),
+				'position'     => 40,
+			)
+		) );
+
+		// Temporarily remove post type activity hook so activity item isn't created.
+		remove_action( 'transition_post_status', 'bp_activity_catch_transition_post_type_status', 10, 3 );
+
+		// Create the initial post.
+		$p = $this->factory->post->create( array(
+			'post_author' => $u,
+			'post_type'   => 'foo',
+		) );
+
+		$this->assertEmpty( bp_activity_get_activity_id( array( 'type' => 'new_foo' ) ) );
+
+		// Add the post type activity hook back.
+		add_action( 'transition_post_status', 'bp_activity_catch_transition_post_type_status', 10, 3 );
+
+		// Emulate updating a post; this should create an activity item.
+		wp_update_post( array(
+			'ID'     => $p,
+			'post_title' => 'This is an edit',
+		) );
+
+		// Assert!
+		$this->assertNotEmpty( bp_activity_get_activity_id( array( 'type' => 'new_foo' ) ), 'Activity item was not created during an edit of an existing WordPress post.' );
+
+		// Clean up.
+		_unregister_post_type( 'foo' );
+	}
+
 	protected function activity_exists_for_post( $post_id, $action ) {
 		$a = bp_activity_get( array(
 			'action'            => $action,
