Index: bp-activity/bp-activity-functions.php
===================================================================
--- bp-activity/bp-activity-functions.php
+++ bp-activity/bp-activity-functions.php
@@ -1507,8 +1507,9 @@
 	 * You may want to hook into this filter if you want to override this function and
 	 * handle the deletion of child comments differently. Make sure you return false.
 	 */
-	if ( !apply_filters( 'bp_activity_delete_comment_pre', true, $activity_id, $comment_id ) )
-		return false;
+	if ( ! apply_filters( 'bp_activity_delete_comment_pre', true, $activity_id, $comment_id ) ) {
+		return true;
+	}
 
 	// Delete any children of this comment.
 	bp_activity_delete_children( $activity_id, $comment_id );
Index: bp-activity/bp-activity-template.php
===================================================================
--- bp-activity/bp-activity-template.php
+++ bp-activity/bp-activity-template.php
@@ -2972,6 +2972,32 @@
 	}
 
 /**
+ * Recurse through all activity comments and return the activity comment IDs.
+ *
+ * @since BuddyPress (2.0.0)
+ *
+ * @param array $activity Array of activities generated from {@link bp_activity_get()}.
+ * @return array
+ */
+function bp_activity_recurse_comments_activity_ids( $activity = array(), $activity_ids = array() ) {
+	if ( is_array( $activity ) && ! empty( $activity['activities'] ) ) {
+		$activity = $activity['activities'][0];	
+	}
+
+	if ( ! empty( $activity->children ) ) {
+		foreach ($activity->children as $child ) {
+			$activity_ids[] = $child->id;
+
+			if( ! empty( $child->children ) ) {
+				$activity_ids = bp_activity_recurse_comments_activity_ids( $child, $activity_ids );
+			}
+		}
+	}
+
+	return $activity_ids;
+}
+
+/**
  * Output the mentionname for the displayed user.
  *
  * @since BuddyPress (1.9.0)
Index: bp-blogs/bp-blogs-activity.php
===================================================================
--- bp-blogs/bp-blogs-activity.php
+++ bp-blogs/bp-blogs-activity.php
@@ -345,3 +345,361 @@
 		'secondary_item_id' => $secondary_item_id
 	) );
 }
+
+/**
+ * Syncs activity comments and posts them back as blog comments.
+ *
+ * Note: This is only a one-way sync - activity comments -> blog comment.
+ *
+ * For blog post -> activity comment, see {@link bp_blogs_record_comment()}.
+ *
+ * @since BuddyPress (2.0.0)
+ *
+ * @param int $comment_id The activity ID for the posted activity comment.
+ * @param array $params Parameters for the activity comment.
+ * @param object Parameters of the parent activity item (in this case, the blog post).
+ */
+function bp_blogs_sync_add_from_activity_comment( $comment_id, $params, $parent_activity ) {
+	// if parent activity isn't a blog post, stop now!
+	if ( $parent_activity->type != 'new_blog_post' ) {
+		return;
+	}
+
+	// if activity comments are disabled for blog posts, stop now!
+	if ( bp_disable_blogforum_comments() ) {
+		return;
+	}
+
+	// get userdata
+	if ( $params['user_id'] == bp_loggedin_user_id() ) {
+		$user = buddypress()->loggedin_user->userdata;
+	} else {
+		$user = bp_core_get_core_userdata( $params['user_id'] );
+	}
+
+	// see if a parent WP comment ID exists
+	if ( ! empty( $params['parent_id'] ) ) {
+		$comment_parent = bp_activity_get_meta( $params['parent_id'], 'bp_blogs_post_comment_id' );
+	} else {
+		$comment_parent = 0;
+	}
+
+	// comment args
+	$args = array(
+		'comment_post_ID'      => $parent_activity->secondary_item_id,
+		'comment_author'       => bp_core_get_user_displayname( $params['user_id'] ),
+		'comment_author_email' => $user->user_email,
+		'comment_author_url'   => bp_core_get_user_domain( $params['user_id'], $user->user_nicename, $user->user_login ),
+		'comment_content'      => $params['content'],
+		'comment_type'         => '', // could be interesting to add 'buddypress' here...
+		'comment_parent'       => (int) $comment_parent,
+		'user_id'              => $params['user_id'],
+
+		// commenting these out for now
+		//'comment_author_IP'    => '127.0.0.1',
+		//'comment_agent'        => '',
+
+		'comment_approved'     => 1
+	);
+
+	// prevent separate activity entry being made
+	remove_action( 'comment_post', 'bp_blogs_record_comment', 10, 2 );
+
+	// handle multisite
+	switch_to_blog( $parent_activity->item_id );
+
+	// handle timestamps for the WP comment after we've switched to the blog
+	$args['comment_date']     = current_time( 'mysql' );
+	$args['comment_date_gmt'] = current_time( 'mysql', 1 );
+
+	// post the comment
+	$post_comment_id = wp_insert_comment( $args );
+
+	// add meta to comment
+	add_comment_meta( $post_comment_id, 'bp_activity_comment_id', $comment_id );
+
+	// add meta to activity comment
+	bp_activity_update_meta( $comment_id, 'bp_blogs_post_comment_id', $post_comment_id );
+
+	// resave activity comment with WP comment permalink
+	//
+	// in bp_blogs_activity_comment_permalink(), we change activity comment
+	// permalinks to use the post comment link
+	//
+	// @todo since this is done after AJAX posting, the activity comment permalink
+	//       doesn't change on the frontend until the next page refresh.
+	$resave_activity = new BP_Activity_Activity( $comment_id );
+	$resave_activity->primary_link = get_comment_link( $post_comment_id );
+	$resave_activity->save();
+
+	// multisite again!
+	restore_current_blog();
+
+	// add the comment hook back
+	add_action( 'comment_post', 'bp_blogs_record_comment', 10, 2 );
+
+	do_action( 'bp_blogs_sync_add_from_activity_comment', $comment_id, $args, $parent_activity, $user );
+}
+
+/**
+ * Deletes the blog comment when the associated activity comment is deleted.
+ *
+ * Note: This is hooked on the 'bp_activity_delete_comment_pre' filter instead
+ * of the 'bp_activity_delete_comment' action because we need to fetch the
+ * activity comment children before they are deleted.
+ *
+ * @since BuddyPress (2.0.0)
+ *
+ * @param bool $retval
+ * @param int $parent_activity_id The parent activity ID for the activity comment.
+ * @param int $activity_id The activity ID for the pending deleted activity comment.
+ */
+function bp_blogs_sync_delete_from_activity_comment( $retval, $parent_activity_id, $activity_id ) {
+	// check if parent activity is a blog post
+	$parent_activity = new BP_Activity_Activity( $parent_activity_id );
+	if ( 'new_blog_post' != $parent_activity->type ) {
+		return $retval;
+	}
+
+	// fetch the activity comments for the activity item
+	$activity = bp_activity_get( array(
+		'in'               => $activity_id,
+		'display_comments' => 'stream',
+	) );
+
+	// get all activity comment IDs for the pending deleted item
+	$activity_ids   = bp_activity_recurse_comments_activity_ids( $activity );
+	$activity_ids[] = $activity_id;
+
+	// handle multisite
+	// switch to the blog where the comment was made
+	switch_to_blog( $parent_activity->item_id );
+
+	// remove associated blog comments
+	bp_blogs_remove_associated_blog_comments( $activity_ids );
+
+	// multisite again!
+	restore_current_blog();
+
+	// rebuild activity comment tree
+	// emulate bp_activity_delete_comment()
+	BP_Activity_Activity::rebuild_activity_comment_tree( $parent_activity_id );
+
+	// we're overriding the default bp_activity_delete_comment() functionality
+	// so we need to return false
+	return false;
+}
+
+/**
+ * Utility function to set up some variables for use in the activity loop.
+ *
+ * Grabs the blog's comment depth and the post's open comment status options
+ * for later use in the activity and activity comment loops.
+ *
+ * This is to prevent having to requery these items later on.
+ *
+ * @since BuddyPress (2.0.0)
+ *
+ * @see bp_blogs_disable_activity_commenting()
+ * @see bp_blogs_setup_comment_loop_globals_on_ajax()
+ *
+ * @param array $r {
+ *     @type int $blog_id The blog ID to check.
+ *     @type int $post_id The post ID to check.
+ *     @type string $type The activity type to check.
+ * }
+ */
+function bp_blogs_setup_activity_loop_globals( $r = array() ) {
+	if ( empty( $r['blog_id'] ) || empty( $r['post_id'] ) || empty( $r['type'] ) ) {
+		return;
+	}
+
+	// parent not a blog post? stop now!
+	if ( 'new_blog_post' !== $r['type'] ) {
+		return;
+	}
+
+	// BP's 'comments_open' filter trumps all!
+	// so we have to remove it temporarily
+	remove_filter( 'comments_open', 'bp_comments_open', 10, 2 );
+
+	// handle multisite
+	switch_to_blog( $r['blog_id'] );
+
+	// check if the WP post allows comments
+	// this also checks if comments should be closed based on age if enabled
+	$allow_comments = comments_open( $r['post_id'] );
+
+	// check the comment thread depth for the blog
+	$thread_depth = (int) get_option( 'thread_comments' );
+	if ( ! empty( $thread_depth ) ) {
+		$thread_depth = get_option( 'thread_comments_depth' );
+	} else {
+		$thread_depth = 1;
+	}
+
+	restore_current_blog();
+
+	// reinstate BP's comment filter
+	add_filter( 'comments_open', 'bp_comments_open', 10, 2 );
+
+	// initialize a local object so we won't have to query this again in the
+	// comment loop
+	if ( empty( buddypress()->blogs->allow_comments ) ) {
+		buddypress()->blogs->allow_comments = array();
+	}
+	if ( empty( buddypress()->blogs->thread_depth ) ) {
+		buddypress()->blogs->thread_depth   = array();
+	}
+
+	// cache comment settings in the buddypress() singleton to reference later in
+	// the activity comment loop
+	// @see bp_blogs_disable_activity_replies()
+	//
+	// thread_depth is keyed by activity ID instead of blog ID because when we're
+	// in a comment loop, we don't have access to the blog ID...
+	// should probably object cache these values instead...
+	buddypress()->blogs->allow_comments[bp_get_activity_id()] = $allow_comments;
+	buddypress()->blogs->thread_depth[bp_get_activity_id()]   = $thread_depth;
+}
+
+/**
+ * Set up some globals used in the activity comment loop when AJAX is used.
+ *
+ * @since BuddyPress (2.0.0)
+ *
+ * @see bp_blogs_setup_activity_loop_globals()
+ */
+function bp_blogs_setup_comment_loop_globals_on_ajax() {
+	// not AJAX? stop now!
+	if ( ! defined( 'DOING_AJAX' ) ) {
+		return;
+	}
+	if ( false === (bool) constant( 'DOING_AJAX' ) ) {
+		return;
+	}
+
+	// get the parent activity item
+	$comment         = bp_activity_current_comment();
+	$parent_activity = new BP_Activity_Activity( $comment->item_id );
+
+	// setup the globals
+	bp_blogs_setup_activity_loop_globals( array(
+		'blog_id' => $parent_activity->item_id,
+		'post_id' => $parent_activity->secondary_item_id,
+		'type'    => $parent_activity->type,
+	) );
+}
+add_action( 'bp_before_activity_comment', 'bp_blogs_setup_comment_loop_globals_on_ajax' );
+
+/**
+ * Disable activity commenting for blog posts based on certain criteria.
+ *
+ * If activity commenting is enabled for blog posts, we still need to disable
+ * commenting if:
+ *  - comments are disabled for the WP blog post from the admin dashboard
+ *  - the WP blog post is supposed to be automatically closed from comments
+ *    based on a certain age
+ *  - the activity entry is a 'new_blog_comment' type
+ *
+ * @since BuddyPress (2.0.0)
+ *
+ * @param bool $retval Is activity commenting enabled for this activity entry?
+ * @return bool
+ */
+function bp_blogs_disable_activity_commenting( $retval ) {
+	// if activity commenting is disabled, return current value
+	if ( bp_disable_blogforum_comments() ) {
+		return $retval;
+	}
+
+	// activity commenting is enabled for blog posts
+	switch ( bp_get_activity_action_name() ) {
+
+		// we still have to disable activity commenting for 'new_blog_comment' items
+		// commenting should only be done on the parent 'new_blog_post' item
+		case 'new_blog_comment' :
+			$retval = false;
+
+			break;
+
+		// check if commenting is disabled for the WP blog post
+		// we should extrapolate this and automate this for plugins... or not
+		case 'new_blog_post' :
+
+			// setup some globals we'll need to reference later
+			bp_blogs_setup_activity_loop_globals( array(
+				'blog_id' => bp_get_activity_item_id(),
+				'post_id' => bp_get_activity_secondary_item_id(),
+				'type'    => bp_get_activity_action_name(),
+			) );
+
+			// if comments are closed for the WP blog post, we should disable
+			// activity comments for this activity entry
+			if ( empty( buddypress()->blogs->allow_comments[bp_get_activity_id()] ) ) {
+				$retval = false;
+			}
+
+			break;
+	}
+
+	return $retval;
+}
+add_filter( 'bp_activity_can_comment', 'bp_blogs_disable_activity_commenting' );
+
+/**
+ * Disables replying to activity comments if the corresponding WP blog post no
+ * longer accepts comments.
+ *
+ * This check uses a locally-cached value set in {@link bp_blogs_disable_activity_commenting()}
+ * via {@link bp_blogs_setup_activity_loop_globals()}.
+ *
+ * @since BuddyPress (2.0.0)
+ *
+ * @param bool $retval Are replies allowed for this activity reply?
+ * @param object $comment The activity comment object
+ * @return bool
+ */
+function bp_blogs_disable_activity_replies( $retval, $comment ) {
+	// check comment depth and disable if depth is too large
+	if ( isset( buddypress()->blogs->thread_depth[$comment->item_id] ) ){
+		if ( $comment->mptt_left > buddypress()->blogs->thread_depth[$comment->item_id] ) {
+			$retval = false;
+		}
+	}
+
+	// check if we should disable activity replies based on the parent activity
+	if ( isset( buddypress()->blogs->allow_comments[$comment->item_id] ) ){
+		// the blog post has closed off commenting, so we should disable all activity
+		// comments under the parent 'new_blog_post' activity entry
+		if ( empty( buddypress()->blogs->allow_comments[$comment->item_id] ) ) {
+			$retval = false;
+		}
+	}
+
+	return $retval;
+}
+add_filter( 'bp_activity_can_comment_reply', 'bp_blogs_disable_activity_replies', 10, 2 );
+
+/**
+ * Changes activity comment permalinks to use the blog comment permalink
+ * instead of the activity permalink.
+ *
+ * This is only done if activity commenting is allowed and whether the parent
+ * activity item is a 'new_blog_post' entry.
+ *
+ * @since BuddyPress (2.0.0)
+ *
+ * @param string $retval The activity comment permalink
+ * @return string
+ */
+function bp_blogs_activity_comment_permalink( $retval ) {
+	global $activities_template;
+
+	if ( isset( buddypress()->blogs->allow_comments[$activities_template->activity->current_comment->item_id] ) ){
+		$retval = $activities_template->activity->current_comment->primary_link;
+	}
+
+	return $retval;
+}
+add_filter( 'bp_get_activity_comment_permalink', 'bp_blogs_activity_comment_permalink' );
Index: bp-blogs/bp-blogs-functions.php
===================================================================
--- bp-blogs/bp-blogs-functions.php
+++ bp-blogs/bp-blogs-functions.php
@@ -441,24 +441,90 @@
 		$post_permalink = get_permalink( $recorded_comment->comment_post_ID );
 		$comment_link   = get_comment_link( $recorded_comment->comment_ID );
 
-		// Prepare to record in activity streams
-		if ( is_multisite() )
-			$activity_action = sprintf( __( '%1$s commented on the post, %2$s, on the site %3$s', 'buddypress' ), bp_core_get_userlink( $user_id ), '<a href="' . $post_permalink . '">' . apply_filters( 'the_title', $recorded_comment->post->post_title ) . '</a>', '<a href="' . get_blog_option( $blog_id, 'home' ) . '">' . get_blog_option( $blog_id, 'blogname' ) . '</a>' );
-		else
-			$activity_action = sprintf( __( '%1$s commented on the post, %2$s', 'buddypress' ), bp_core_get_userlink( $user_id ), '<a href="' . $post_permalink . '">' . apply_filters( 'the_title', $recorded_comment->post->post_title ) . '</a>' );
+		// Setup activity args
+		$args = array();
+
+		$args['user_id']       = $user_id;
+		$args['content']       = apply_filters_ref_array( 'bp_blogs_activity_new_comment_content', array( $recorded_comment->comment_content, &$recorded_comment, $comment_link ) );
+		$args['primary_link']  = apply_filters_ref_array( 'bp_blogs_activity_new_comment_primary_link', array( $comment_link,     &$recorded_comment ) );
+		$args['recorded_time'] = $recorded_comment->comment_date_gmt;
+
+		if ( is_multisite() ) {
+			$args['action'] = sprintf( __( '%1$s commented on the post, %2$s, on the site %3$s', 'buddypress' ), bp_core_get_userlink( $user_id ), '<a href="' . $post_permalink . '">' . apply_filters( 'the_title', $recorded_comment->post->post_title ) . '</a>', '<a href="' . get_blog_option( $blog_id, 'home' ) . '">' . get_blog_option( $blog_id, 'blogname' ) . '</a>' );
+		} else {
+			$args['action'] = sprintf( __( '%1$s commented on the post, %2$s', 'buddypress' ), bp_core_get_userlink( $user_id ), '<a href="' . $post_permalink . '">' . apply_filters( 'the_title', $recorded_comment->post->post_title ) . '</a>' );
+		}
+
+		// Setup some different activity args depending if activity commenting is
+		// enabled or not
+
+		// if cannot comment, record separate activity entry
+		// this is the old way of doing things
+		if ( bp_disable_blogforum_comments() ) {
+			$args['type']              = 'new_blog_comment';
+			$args['item_id']           = $blog_id;
+			$args['secondary_item_id'] = $comment_id;
+
+			// record the activity entry
+			bp_blogs_record_activity( $args );
+
+		// record comment as BP activity comment under the parent 'new_blog_post'
+		// activity item
+		} else {
+			// find the parent 'new_blog_post' activity entry
+			$parent_activity_id = bp_activity_get_activity_id( array(
+				'user_id'           => $user_id,
+				'component'         => 'blogs',
+				'type'              => 'new_blog_post',
+				'item_id'           => $blog_id,
+				'secondary_item_id' => $recorded_comment->comment_post_ID
+			) );
+
+			// we found the parent activity entry
+			// so let's go ahead and reconfigure some activity args
+			if ( ! empty( $parent_activity_id ) ) {
+				// set the 'item_id' with the parent activity entry ID
+				$args['item_id'] = $parent_activity_id;
+
+				// now see if the WP parent comment has a BP activity ID
+				$comment_parent = 0;
+				if ( ! empty( $recorded_comment->comment_parent ) ) {
+					$comment_parent = get_comment_meta( $recorded_comment->comment_parent, 'bp_activity_comment_id', true );
+				}
 
-		$activity_content	= $recorded_comment->comment_content;
+				// WP parent comment does not have a BP activity ID
+				// so set to 'new_blog_post' activity ID
+				if ( empty( $comment_parent ) ) {
+					$comment_parent = $parent_activity_id;
+				}
 
-		// Record in activity streams
-		bp_blogs_record_activity( array(
-			'user_id'           => $user_id,
-			'content'           => apply_filters_ref_array( 'bp_blogs_activity_new_comment_content',      array( $activity_content, &$recorded_comment, $comment_link ) ),
-			'primary_link'      => apply_filters_ref_array( 'bp_blogs_activity_new_comment_primary_link', array( $comment_link,     &$recorded_comment                ) ),
-			'type'              => 'new_blog_comment',
-			'item_id'           => $blog_id,
-			'secondary_item_id' => $comment_id,
-			'recorded_time'     => $recorded_comment->comment_date_gmt
-		) );
+				$args['secondary_item_id'] = $comment_parent;
+				$args['component']         = 'activity';
+				$args['type']              = 'activity_comment';
+
+			// could not find corresponding parent activity entry
+			// so wipe out $args array
+			} else {
+				$args = array();
+			}
+
+			// Record in activity streams
+			if ( ! empty( $args ) ) {
+				// @todo should we use bp_activity_new_comment()? that function will also send
+				// an email to people in the activity comment thread
+				//
+				// what if a site already has some comment email notification plugin setup?
+				// this is why I decided to go with bp_activity_add() to avoid any conflict
+				// with existing comment email notification plugins
+				$comment_activity_id = bp_activity_add( $args );
+
+				// add meta to activity comment
+				bp_activity_update_meta( $comment_activity_id, 'bp_blogs_post_comment_id', $comment_id );
+
+				// add meta to comment
+				add_comment_meta( $comment_id, 'bp_activity_comment_id', $comment_activity_id );
+			}
+		}
 
 		// Update the blogs last active date
 		bp_blogs_update_blogmeta( $blog_id, 'last_activity', bp_core_current_time() );
@@ -632,14 +698,93 @@
 function bp_blogs_remove_comment( $comment_id ) {
 	global $wpdb;
 
-	// Delete activity stream item
-	bp_blogs_delete_activity( array( 'item_id' => $wpdb->blogid, 'secondary_item_id' => $comment_id, 'type' => 'new_blog_comment' ) );
+	// activity comments are disabled for blog posts
+	// which means that individual activity items exist for blog comments
+	if ( bp_disable_blogforum_comments() ) {
+		// Delete the individual activity stream item
+		bp_blogs_delete_activity( array(
+			'item_id'           => $wpdb->blogid,
+			'secondary_item_id' => $comment_id,
+			'type'              => 'new_blog_comment'
+		) );
+
+	// activity comments are enabled for blog posts
+	// remove the associated activity item
+	} else {
+		// get associated activity ID from comment meta
+		$activity_id = get_comment_meta( $comment_id, 'bp_activity_comment_id', true );
+
+		// delete the associated activity comment
+		//
+		// also removes child post comments and associated activity comments
+		if ( ! empty( $activity_id ) && bp_is_active( 'activity' ) ) {
+			// fetch the activity comments for the activity item
+			$activity = bp_activity_get( array(
+				'in'               => $activity_id,
+				'display_comments' => 'stream',
+			) );
+		
+			// get all activity comment IDs for the pending deleted item
+			if ( ! empty( $activity['activities'] ) ) {
+				$activity_ids   = bp_activity_recurse_comments_activity_ids( $activity );
+				$activity_ids[] = $activity_id;
+
+				// delete activity items
+				foreach ( $activity_ids as $activity_id ) {
+					bp_activity_delete( array(
+						'id' => $activity_id
+					) );
+				}
+
+				// remove associated blog comments
+				bp_blogs_remove_associated_blog_comments( $activity_ids );
+
+				// rebuild activity comment tree
+				BP_Activity_Activity::rebuild_activity_comment_tree( $activity['activities'][0]->item_id );
+			}
+		}
+	}
 
 	do_action( 'bp_blogs_remove_comment', $wpdb->blogid, $comment_id, bp_loggedin_user_id() );
 }
 add_action( 'delete_comment', 'bp_blogs_remove_comment' );
 
 /**
+ * Removes blog comments that are associated with activity comments.
+ *
+ * @since BuddyPress (2.0.0)
+ *
+ * @see bp_blogs_remove_comment()
+ * @see bp_blogs_sync_delete_from_activity_comment()
+ *
+ * @param array $activity_ids The activity IDs to check association with blog
+ *              comments.
+ */
+function bp_blogs_remove_associated_blog_comments( $activity_ids = array() ) {
+	// query args
+	$query_args = array(
+		'meta_query' => array(
+			array(
+				'key'     => 'bp_activity_comment_id',
+				'value'   => implode( ',', (array) $activity_ids ),
+				'compare' => 'IN',
+			)
+		)
+	);
+
+	// get comment
+	$comment_query = new WP_Comment_Query;
+	$comments = $comment_query->query( $query_args );
+
+	// found the corresponding comments
+	// let's delete them!
+	foreach ( $comments as $comment ) {
+		// we force delete the comment, since activity items are deleted immediately
+		wp_delete_comment( $comment->comment_ID, true );
+	}
+}
+
+/**
  * When a blog comment status transition occurs, update the relevant activity's status.
  *
  * @since BuddyPress (1.6.0)
Index: bp-blogs/bp-blogs-loader.php
===================================================================
--- bp-blogs/bp-blogs-loader.php
+++ bp-blogs/bp-blogs-loader.php
@@ -73,6 +73,12 @@
 
 		// Setup the globals
 		parent::setup_globals( $args );
+
+		// Activity comment post callback
+		$this->activity_comment_post_callback = apply_filters( 'bp_blogs_activity_comment_post_callback', array(
+			'add'    => 'bp_blogs_sync_add_from_activity_comment',
+			'delete' => 'bp_blogs_sync_delete_from_activity_comment'
+		) );
 	}
 
 	/**
Index: bp-core/bp-core-component.php
===================================================================
--- bp-core/bp-core-component.php
+++ bp-core/bp-core-component.php
@@ -85,6 +85,15 @@
 	public $notification_callback = '';
 
 	/**
+	 * Callback to do something whenever an activity comment is saved or deleted.
+	 *
+	 * @since BuddyPress (2.0.0)
+	 *
+	 * @var array
+	 */
+	public $activity_comment_post_callback = '';
+
+	/**
 	 * WordPress Toolbar links.
 	 *
 	 * @var array $admin_menu
@@ -336,44 +345,47 @@
 	public function setup_actions() {
 
 		// Setup globals
-		add_action( 'bp_setup_globals',          array( $this, 'setup_globals'          ), 10 );
+		add_action( 'bp_setup_globals',          array( $this, 'setup_globals'          ),         10 );
 
 		// Include required files. Called early to ensure that BP core
 		// components are loaded before plugins that hook their loader functions
 		// to bp_include with the default priority of 10. This is for backwards
 		// compatibility; henceforth, plugins should register themselves by
 		// extending this base class.
-		add_action( 'bp_include',                array( $this, 'includes'               ), 8 );
+		add_action( 'bp_include',                array( $this, 'includes'               ),         8 );
 
 		// Setup navigation
-		add_action( 'bp_setup_nav',              array( $this, 'setup_nav'              ), 10 );
+		add_action( 'bp_setup_nav',              array( $this, 'setup_nav'              ),         10 );
 
 		// Setup WP Toolbar menus
-		add_action( 'bp_setup_admin_bar',        array( $this, 'setup_admin_bar'        ), $this->adminbar_myaccount_order );
+		add_action( 'bp_setup_admin_bar',        array( $this, 'setup_admin_bar'        ),         $this->adminbar_myaccount_order );
 
 		// Setup component title
-		add_action( 'bp_setup_title',            array( $this, 'setup_title'            ), 10 );
+		add_action( 'bp_setup_title',            array( $this, 'setup_title'            ),         10 );
 
 		// Register post types
-		add_action( 'bp_register_post_types',    array( $this, 'register_post_types'    ), 10 );
+		add_action( 'bp_register_post_types',    array( $this, 'register_post_types'    ),         10 );
 
 		// Register taxonomies
-		add_action( 'bp_register_taxonomies',    array( $this, 'register_taxonomies'    ), 10 );
+		add_action( 'bp_register_taxonomies',    array( $this, 'register_taxonomies'    ),         10 );
 
 		// Add the rewrite tags
-		add_action( 'bp_add_rewrite_tags',       array( $this, 'add_rewrite_tags'       ), 10 );
+		add_action( 'bp_add_rewrite_tags',       array( $this, 'add_rewrite_tags'       ),         10 );
 
 		// Add the rewrite rules
-		add_action( 'bp_add_rewrite_rules',      array( $this, 'add_rewrite_rules'      ), 10 );
+		add_action( 'bp_add_rewrite_rules',      array( $this, 'add_rewrite_rules'      ),         10 );
 
 		// Add the permalink structure
-		add_action( 'bp_add_permastructs',       array( $this, 'add_permastructs'       ), 10 );
+		add_action( 'bp_add_permastructs',       array( $this, 'add_permastructs'       ),         10 );
 
 		// Allow components to parse the main query
-		add_action( 'bp_parse_query',            array( $this, 'parse_query'            ), 10 );
+		add_action( 'bp_parse_query',            array( $this, 'parse_query'            ),         10 );
 
 		// Generate rewrite rules
-		add_action( 'bp_generate_rewrite_rules', array( $this, 'generate_rewrite_rules' ), 10 );
+		add_action( 'bp_generate_rewrite_rules', array( $this, 'generate_rewrite_rules' ),         10 );
+
+		// Activity comment callback setup
+		add_action( 'bp_setup_globals',          array( $this, 'activity_comment_post_callback' ), 10 );
 
 		// Additional actions can be attached here
 		do_action( 'bp_' . $this->id . '_setup_actions' );
@@ -602,5 +614,33 @@
 	public function generate_rewrite_rules() {
 		do_action( 'bp_' . $this->id . '_generate_rewrite_rules' );
 	}
+
+	/**
+	 * Setup activity comment post callback.
+	 *
+	 * If a component has the 'activity_comment_post_callback' property set,
+	 * automatically setup the hooks to be used.
+	 *
+	 * @since BuddyPress (2.0.0
+	 */
+	public function activity_comment_post_callback() {
+		// if activity component is not active or callback is not an array, stop now!
+		if ( ! bp_is_active( 'activity' ) || ! is_array( $this->activity_comment_post_callback ) ) {
+			return;
+		}
+
+		$callback = $this->activity_comment_post_callback;
+
+		// Activity comment addition callback
+		if ( ! empty( $callback['add'] ) && is_callable( $callback['add'] ) ) {
+			add_action( 'bp_activity_comment_posted', $callback['add'],    10, 3 );
+		}
+
+		// Activity comment deletion callback
+		if ( ! empty( $callback['delete'] ) && is_callable( $callback['delete'] ) ) {
+			add_filter( 'bp_activity_delete_comment_pre', $callback['delete'], 10, 3 );
+		}
+
+	}
 }
 endif; // BP_Component
Index: bp-core/bp-core-options.php
===================================================================
--- bp-core/bp-core-options.php
+++ bp-core/bp-core-options.php
@@ -226,7 +226,14 @@
  * @return mixed The value for the option.
  */
 function bp_get_option( $option_name, $default = '' ) {
-	$value = get_blog_option( bp_get_root_blog_id(), $option_name, $default );
+	// check buddypress()->site_options array first
+	if ( isset( buddypress()->site_options[$option_name] ) ) {
+		$value = buddypress()->site_options[$option_name];
+
+	// query for the option if not available
+	} else {
+		$value = get_blog_option( bp_get_root_blog_id(), $option_name, $default );
+	}
 
 	return apply_filters( 'bp_get_option', $value );
 }
