Index: src/bp-blogs/bp-blogs-activity.php
===================================================================
--- src/bp-blogs/bp-blogs-activity.php
+++ src/bp-blogs/bp-blogs-activity.php
@@ -1148,6 +1148,7 @@
 
 	$allow_comments = bp_blogs_comments_open( $activity );
 	$thread_depth   = bp_blogs_get_blogmeta( $activity->item_id, 'thread_comments_depth' );
+	$moderation     = bp_blogs_get_blogmeta( $activity->item_id, 'comment_moderation' );
 
 	// Initialize a local object so we won't have to query this again in the
 	// comment loop.
@@ -1157,16 +1158,23 @@
 	if ( empty( buddypress()->blogs->thread_depth ) ) {
 		buddypress()->blogs->thread_depth   = array();
 	}
+	if ( empty( buddypress()->blogs->comment_moderation ) ) {
+		buddypress()->blogs->comment_moderation = 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[ $activity->id ] = $allow_comments;
-	buddypress()->blogs->thread_depth[ $activity->id ]   = $thread_depth;
+	/*
+	 * Cache comment settings in the buddypress() singleton for later reference.
+	 *
+	 * See bp_blogs_disable_activity_commenting() / bp_blogs_can_comment_reply().
+	 *
+	 * thread_depth is keyed by activity ID instead of blog ID because when we're
+	 * in an actvity comment loop, we don't have access to the blog ID...
+	 *
+	 * Should probably object cache these values instead...
+	 */
+	buddypress()->blogs->allow_comments[ $activity->id ]     = $allow_comments;
+	buddypress()->blogs->thread_depth[ $activity->id ]       = $thread_depth;
+	buddypress()->blogs->comment_moderation[ $activity->id ] = $moderation;
 }
 
 /**
@@ -1231,6 +1239,11 @@
 			if ( empty( buddypress()->blogs->allow_comments[ bp_get_activity_id() ] ) ) {
 				$retval = false;
 			}
+
+			// If comments need moderation, disable activity commenting.
+			if ( ! empty( buddypress()->blogs->comment_moderation[ bp_get_activity_id() ] ) ) {
+				$retval = false;
+			}
 		// The activity type does not support comments or replies
 		} else {
 			$retval = false;
@@ -1314,6 +1327,11 @@
 		}
 	}
 
+	// If comments need moderation, disable activity commenting.
+	if ( ! empty( buddypress()->blogs->comment_moderation[$comment->item_id] ) ) {
+		$retval = false;
+	}
+
 	return $retval;
 }
 add_filter( 'bp_activity_can_comment_reply', 'bp_blogs_can_comment_reply', 10, 2 );
Index: src/bp-blogs/bp-blogs-functions.php
===================================================================
--- src/bp-blogs/bp-blogs-functions.php
+++ src/bp-blogs/bp-blogs-functions.php
@@ -362,6 +362,7 @@
 	$description     = get_blog_option( $blog_id, 'blogdescription' );
 	$close_old_posts = get_blog_option( $blog_id, 'close_comments_for_old_posts' );
 	$close_days_old  = get_blog_option( $blog_id, 'close_comments_days_old' );
+	$moderation      = get_blog_option( $blog_id, 'comment_moderation' );
 
 	$thread_depth = get_blog_option( $blog_id, 'thread_comments' );
 	if ( ! empty( $thread_depth ) ) {
@@ -384,6 +385,7 @@
 	bp_blogs_update_blogmeta( $recorded_blog->blog_id, 'close_comments_for_old_posts', $close_old_posts );
 	bp_blogs_update_blogmeta( $recorded_blog->blog_id, 'close_comments_days_old', $close_days_old );
 	bp_blogs_update_blogmeta( $recorded_blog->blog_id, 'thread_comments_depth', $thread_depth );
+	bp_blogs_update_blogmeta( $recorded_blog->blog_id, 'comment_moderation', $moderation );
 
 	$is_private = !empty( $_POST['blog_public'] ) && (int) $_POST['blog_public'] ? false : true;
 
@@ -525,6 +527,19 @@
 }
 add_action( 'update_option_thread_comments_depth', 'bp_blogs_update_option_thread_comments_depth', 10, 2 );
 
+/**
+ * When updating comment moderation, mirror value in blogmeta table.
+ *
+ * @since 3.0.0
+ *
+ * @param string $oldvalue Value before save. Passed by do_action() but unused here.
+ * @param string $newvalue Value to change meta to.
+ */
+function bp_blogs_update_option_comment_moderation( $oldvalue, $newvalue ) {
+	bp_blogs_update_blogmeta( $GLOBALS['wpdb']->blogid, 'comment_moderation', $newvalue );
+}
+add_action( 'update_option_comment_moderation', 'bp_blogs_update_option_comment_moderation', 10, 2 );
+
 /**
  * Syncs site icon URLs to blogmeta.
  *
