diff --git src/wp-admin/includes/schema.php src/wp-admin/includes/schema.php
index ebbd917..3f2ac5d 100644
--- src/wp-admin/includes/schema.php
+++ src/wp-admin/includes/schema.php
@@ -482,6 +482,7 @@ function populate_options() {
 	'close_comments_days_old' => 14,
 	'thread_comments' => 1,
 	'thread_comments_depth' => 5,
+	'page_comments' => 1,
 	'comments_per_page' => 50,
 	'default_comments_page' => 'newest',
 	'comment_order' => 'asc',
@@ -566,7 +567,7 @@ function populate_options() {
 		'can_compress_scripts', 'page_uris', 'update_core', 'update_plugins', 'update_themes', 'doing_cron',
 		'random_seed', 'rss_excerpt_length', 'secret', 'use_linksupdate', 'default_comment_status_page',
 		'wporg_popular_tags', 'what_to_show', 'rss_language', 'language', 'enable_xmlrpc', 'enable_app',
-		'embed_autourls', 'default_post_edit_rows', 'page_comments',
+		'embed_autourls', 'default_post_edit_rows',
 	);
 	foreach ( $unusedoptions as $option )
 		delete_option($option);
diff --git src/wp-admin/options-discussion.php src/wp-admin/options-discussion.php
index 02b4379..3d59195 100644
--- src/wp-admin/options-discussion.php
+++ src/wp-admin/options-discussion.php
@@ -98,6 +98,8 @@ printf( __('Enable threaded (nested) comments %s levels deep'), $thread_comments
 
 ?></label>
 <br />
+<label for="page_comments">
+<input name="page_comments" type="checkbox" id="page_comments" value="1" <?php checked( '1', get_option( 'page_comments' ) ); ?> />
 <?php
 $default_comments_page = '</label><label for="default_comments_page"><select name="default_comments_page" id="default_comments_page"><option value="newest"';
 if ( 'newest' == get_option('default_comments_page') ) $default_comments_page .= ' selected="selected"';
@@ -105,7 +107,7 @@ $default_comments_page .= '>' . __('last') . '</option><option value="oldest"';
 if ( 'oldest' == get_option('default_comments_page') ) $default_comments_page .= ' selected="selected"';
 $default_comments_page .= '>' . __('first') . '</option></select>';
 
-printf( __('Break comments into pages with %1$s top level comments per page and the %2$s page displayed by default'), '<label for="comments_per_page"><input name="comments_per_page" type="number" step="1" min="0" id="comments_per_page" value="' . esc_attr(get_option('comments_per_page')) . '" class="small-text" />', $default_comments_page );
+printf( __('Break comments into pages with %1$s top level comments per page and the %2$s page displayed by default'), '</label><label for="comments_per_page"><input name="comments_per_page" type="number" step="1" min="0" id="comments_per_page" value="' . esc_attr(get_option('comments_per_page')) . '" class="small-text" />', $default_comments_page );
 
 ?></label>
 <br />
diff --git src/wp-admin/options.php src/wp-admin/options.php
index 017725d..6bad0fd 100644
--- src/wp-admin/options.php
+++ src/wp-admin/options.php
@@ -83,7 +83,7 @@ if ( is_multisite() && ! is_super_admin() && 'update' != $action ) {
 
 $whitelist_options = array(
 	'general' => array( 'blogname', 'blogdescription', 'gmt_offset', 'date_format', 'time_format', 'start_of_week', 'timezone_string', 'WPLANG' ),
-	'discussion' => array( 'default_pingback_flag', 'default_ping_status', 'default_comment_status', 'comments_notify', 'moderation_notify', 'comment_moderation', 'require_name_email', 'comment_whitelist', 'comment_max_links', 'moderation_keys', 'blacklist_keys', 'show_avatars', 'avatar_rating', 'avatar_default', 'close_comments_for_old_posts', 'close_comments_days_old', 'thread_comments', 'thread_comments_depth', 'comments_per_page', 'default_comments_page', 'comment_order', 'comment_registration' ),
+	'discussion' => array( 'default_pingback_flag', 'default_ping_status', 'default_comment_status', 'comments_notify', 'moderation_notify', 'comment_moderation', 'require_name_email', 'comment_whitelist', 'comment_max_links', 'moderation_keys', 'blacklist_keys', 'show_avatars', 'avatar_rating', 'avatar_default', 'close_comments_for_old_posts', 'close_comments_days_old', 'thread_comments', 'thread_comments_depth', 'page_comments', 'comments_per_page', 'default_comments_page', 'comment_order', 'comment_registration' ),
 	'media' => array( 'thumbnail_size_w', 'thumbnail_size_h', 'thumbnail_crop', 'medium_size_w', 'medium_size_h', 'large_size_w', 'large_size_h', 'image_default_size', 'image_default_align', 'image_default_link_type' ),
 	'reading' => array( 'posts_per_page', 'posts_per_rss', 'rss_use_excerpt', 'show_on_front', 'page_on_front', 'page_for_posts', 'blog_public' ),
 	'writing' => array( 'default_category', 'default_email_category', 'default_link_category', 'default_post_format' )
diff --git src/wp-includes/canonical.php src/wp-includes/canonical.php
index b658797..cb7d7ac 100644
--- src/wp-includes/canonical.php
+++ src/wp-includes/canonical.php
@@ -318,7 +318,7 @@ function redirect_canonical( $requested_url = null, $do_redirect = true ) {
 				}
 			}
 
-			if ( ( 'newest' == get_option('default_comments_page') && get_query_var('cpage') > 0 ) || ( 'newest' != get_option('default_comments_page') && get_query_var('cpage') > 1 ) ) {
+			if ( get_option( 'page_comments' ) && ( ( 'newest' == get_option('default_comments_page') && get_query_var( 'cpage' ) > 0 ) || ( 'newest' != get_option( 'default_comments_page' ) && get_query_var( 'cpage' ) > 1 ) ) ) {
 				$addl_path = ( !empty( $addl_path ) ? trailingslashit($addl_path) : '' ) . user_trailingslashit( $wp_rewrite->comments_pagination_base . '-' . get_query_var('cpage'), 'commentpaged' );
 				$redirect['query'] = remove_query_arg( 'cpage', $redirect['query'] );
 			}
diff --git src/wp-includes/comment-functions.php src/wp-includes/comment-functions.php
index 7f7cbb6..f12a825 100644
--- src/wp-includes/comment-functions.php
+++ src/wp-includes/comment-functions.php
@@ -807,6 +807,10 @@ function get_comment_pages_count( $comments = null, $per_page = null, $threaded
 	if ( empty($comments) )
 		return 0;
 
+	if ( ! get_option( 'page_comments' ) ) {
+		return 1;
+	}
+
 	if ( !isset($per_page) )
 		$per_page = (int) get_query_var('comments_per_page');
 	if ( 0 === $per_page )
@@ -828,6 +832,69 @@ function get_comment_pages_count( $comments = null, $per_page = null, $threaded
 }
 
 /**
+ * Get the number of approved top-level comments a post has.
+ *
+ * @since 4.4.0
+ *
+ * @param int $post_id ID of the post.
+ */
+function wp_get_top_level_comments_count( $post_id ) {
+	$top_level_query = new WP_Comment_Query();
+	$top_level_count = $top_level_query->query( array(
+		'count'   => true,
+		'orderby' => false,
+		'post_id' => $post_id,
+		'parent'  => 0,
+		'status'  => 'approve',
+	) );
+
+	return intval( $top_level_count );
+}
+
+/**
+ * Get comment pages count from the post ID.
+ *
+ * @since 4.4.0
+ *
+ * @param int $post_id ID of the post.
+ * @return int
+ */
+function wp_get_comment_pages_count( $post_id ) {
+	$per_page = get_option( 'comments_per_page' );
+
+	$per_page = (int) $per_page;
+	if ( ! $per_page ) {
+		return 1;
+	}
+
+	$top_level_comment_count = wp_get_top_level_comments_count( $post_id );
+
+	if ( 0 === $top_level_comment_count ) {
+		return 1;
+	}
+
+	/**
+	 * Filter the threshold at which comment pagination is forced.
+	 *
+	 * Large numbers of comments cause severe performance problems when loaded on a single page, so we force comments
+	 * to be paginated beyond a certain threshold. The default threshold is 250 top-level comments.
+	 *
+	 * If your 'comments_per_page' value is higher than our threshold, we respect your value.
+	 *
+	 * @since 4.4.0
+	 *
+	 * @param int $threshold Number of comments a post must have before pagination is forced.
+	 */
+	$paging_threshold = (int) apply_filters( 'comment_paging_threshold', 250 );
+	if ( $top_level_comment_count > $paging_threshold && ! get_option( 'page_comments' ) ) {
+		$per_page = $paging_threshold;
+	}
+
+
+	return (int) ceil( $top_level_comment_count / $per_page );
+}
+
+/**
  * Calculate what page number a comment will appear on for comment paging.
  *
  * @since 2.7.0
@@ -860,12 +927,14 @@ function get_page_of_comment( $comment_ID, $args = array() ) {
 	$original_args = $args;
 
 	// Order of precedence: 1. `$args['per_page']`, 2. 'comments_per_page' query_var, 3. 'comments_per_page' option.
-	if ( '' === $args['per_page'] ) {
-		$args['per_page'] = get_query_var( 'comments_per_page' );
-	}
+	if ( get_option( 'page_comments' ) ) {
+		if ( '' === $args['per_page'] ) {
+			$args['per_page'] = get_query_var( 'comments_per_page' );
+		}
 
-	if ( '' === $args['per_page'] ) {
-		$args['per_page'] = get_option( 'comments_per_page' );
+		if ( '' === $args['per_page'] ) {
+			$args['per_page'] = get_option( 'comments_per_page' );
+		}
 	}
 
 	if ( empty($args['per_page']) ) {
diff --git src/wp-includes/comment-template.php src/wp-includes/comment-template.php
index 6174c0c..feceb50 100644
--- src/wp-includes/comment-template.php
+++ src/wp-includes/comment-template.php
@@ -706,7 +706,7 @@ function get_comment_link( $comment = null, $args = array() ) {
 
 	// No 'cpage' is provided, so we calculate one.
 	} else {
-		if ( '' === $args['per_page'] ) {
+		if ( '' === $args['per_page'] && get_option( 'page_comments' ) ) {
 			$args['per_page'] = get_option('comments_per_page');
 		}
 
@@ -1295,16 +1295,7 @@ function comments_template( $file = '/comments.php', $separate_comments = false
 	} elseif ( 'oldest' === get_option( 'default_comments_page' ) ) {
 		$comment_args['offset'] = 0;
 	} else {
-		// If fetching the first page of 'newest', we need a top-level comment count.
-		$top_level_query = new WP_Comment_Query();
-		$top_level_count = $top_level_query->query( array(
-			'count'   => true,
-			'orderby' => false,
-			'post_id' => $post->ID,
-			'parent'  => 0,
-		) );
-
-		$comment_args['offset'] = ( ceil( $top_level_count / $per_page ) - 1 ) * $per_page;
+		$comment_args['offset'] = ( wp_get_comment_pages_count( $post->ID ) - 1 ) * $per_page;
 	}
 
 	$comment_query = new WP_Comment_Query( $comment_args );
@@ -1345,7 +1336,7 @@ function comments_template( $file = '/comments.php', $separate_comments = false
 	}
 
 	$overridden_cpage = false;
-	if ( '' == get_query_var('cpage') ) {
+	if ( '' == get_query_var( 'cpage' ) && $wp_query->max_num_comment_pages > 1 ) {
 		set_query_var( 'cpage', 'newest' == get_option('default_comments_page') ? get_comment_pages_count() : 1 );
 		$overridden_cpage = true;
 	}
diff --git src/wp-includes/default-filters.php src/wp-includes/default-filters.php
index 75dadfc..7e80379 100644
--- src/wp-includes/default-filters.php
+++ src/wp-includes/default-filters.php
@@ -329,9 +329,6 @@ add_filter( 'default_option_link_manager_enabled', '__return_true' );
 // This option no longer exists; tell plugins we always support auto-embedding.
 add_filter( 'default_option_embed_autourls', '__return_true' );
 
-// This option no longer exists; tell plugins we want comment pagination.
-add_filter( 'pre_option_page_comments', '__return_true' );
-
 // Default settings for heartbeat
 add_filter( 'heartbeat_settings', 'wp_heartbeat_settings' );
 
diff --git tests/phpunit/tests/comment/getCommentsPagesCount.php tests/phpunit/tests/comment/getCommentsPagesCount.php
index 6e742a8..4490cd8 100644
--- tests/phpunit/tests/comment/getCommentsPagesCount.php
+++ tests/phpunit/tests/comment/getCommentsPagesCount.php
@@ -1,148 +1,168 @@
-<?php
-/**
- * Validate the logic of get_comments_pages_count
- * @group comment
- */
-class Tests_Comment_GetCommentsPagesCount extends WP_UnitTestCase {
-	protected $option_page_comments;
-	protected $option_comments_per_page;
-	protected $option_thread_comments;
-	protected $option_posts_per_rss;
-
-	/**
-	 * setUp options
-	 */
-	function setUp() {
-		parent::setUp();
-		$this->option_page_comments = get_option( 'page_comments' );
-		$this->option_page_comments = get_option( 'comments_per_page' );
-		$this->option_page_comments = get_option( 'thread_comments' );
-		$this->option_posts_per_rss = get_option( 'posts_per_rss' );
-
-		update_option( 'page_comments', true );
-	}
-
-	/**
-	 * tearDown options
-	 */
-	function tearDown() {
-		update_option( 'page_comments', $this->option_page_comments );
-		update_option( 'comments_per_page', $this->option_page_comments );
-		update_option( 'thread_comments', $this->option_page_comments );
-		update_option( 'posts_per_rss', $this->option_posts_per_rss );
-		parent::tearDown();
-	}
-
-	/**
-	 * Validate get_comments_pages_count for empty comments
-	 */
-	function test_empty() {
-		//setup post and comments
-		$post_id = $this->factory->post->create( array( 'post_title' => 'comment--post', 'post_type' => 'post' ) );
-		$this->go_to( '/?p=' . $post_id );
-
-		global $wp_query;
-		unset( $wp_query->comments );
-
-		$comments = get_comments( array( 'post_id' => $post_id ) );
-
-		$this->assertEquals( 0, get_comment_pages_count( $comments, 10, false ) );
-		$this->assertEquals( 0, get_comment_pages_count( $comments, 1, false ) );
-		$this->assertEquals( 0, get_comment_pages_count( $comments, 0, false ) );
-		$this->assertEquals( 0, get_comment_pages_count( $comments, 10, true ) );
-		$this->assertEquals( 0, get_comment_pages_count( $comments, 5 ) );
-		$this->assertEquals( 0, get_comment_pages_count( $comments ) );
-		$this->assertequals( 0, get_comment_pages_count( null, 1 ) );
-	}
-
-	/**
-	 * Validate get_comments_pages_count for treaded comments
-	 */
-	function test_threaded_comments( ) {
-		//setup post and comments
-		$post = $this->factory->post->create_and_get( array( 'post_title' => 'comment--post', 'post_type' => 'post' ) );
-		$comments = $this->factory->comment->create_post_comments( $post->ID, 15 );
-		$this->factory->comment->create_post_comments( $post->ID, 6, array( 'comment_parent' => $comments[0] ) );
-		$comments = get_comments( array( 'post_id' => $post->ID ) );
-
-		$this->assertEquals( 3, get_comment_pages_count( $comments, 10, false ) );
-		$this->assertEquals( 2, get_comment_pages_count( $comments, 10, true ) );
-		$this->assertEquals( 4, get_comment_pages_count( $comments, 4, true ) );
-	}
-
-	/**
-	 * Validate get_comments_pages_count for option tread_comments
-	 */
-	function test_option_thread_comments() {
-
-		//setup post and comments
-		$post = $this->factory->post->create_and_get( array( 'post_title' => 'comment--post', 'post_type' => 'post' ) );
-		$comments = $this->factory->comment->create_post_comments( $post->ID, 15 );
-		$this->factory->comment->create_post_comments( $post->ID, 6, array('comment_parent' => $comments[0] ) );
-		$comments = get_comments( array( 'post_id' => $post->ID ) );
-
-		update_option( 'thread_comments', false );
-
-		$this->assertEquals( 3, get_comment_pages_count( $comments, 10, false ) );
-		$this->assertEquals( 2, get_comment_pages_count( $comments, 10, true ) );
-		$this->assertEquals( 3, get_comment_pages_count( $comments, 10, null ) );
-		$this->assertEquals( 3, get_comment_pages_count( $comments, 10 ) );
-
-		update_option( 'thread_comments', true );
-
-		$this->assertEquals( 3, get_comment_pages_count( $comments, 10, false ) );
-		$this->assertEquals( 2, get_comment_pages_count( $comments, 10, true ) );
-		$this->assertEquals( 2, get_comment_pages_count( $comments, 10, null ) );
-		$this->assertEquals( 2, get_comment_pages_count( $comments, 10 ) );
-	}
-
-	/**
-	 * Validate $wp_query logic of get_comment_pages_count
-	 */
-	function test_wp_query_comments_per_page() {
-		global $wp_query;
-
-		update_option( 'posts_per_rss', 100 );
-
-		$post = $this->factory->post->create_and_get( array( 'post_title' => 'comment-post', 'post_type' => 'post' ) );
-		$comments = $this->factory->comment->create_post_comments( $post->ID, 25 );
-
-		$wp_query = new WP_Query( array( 'p' => $post->ID, 'comments_per_page' => 10, 'feed' =>'comments-' ) );
-
-		update_option( 'comments_per_page', 25 );
-
-		$this->assertEquals( 3, get_comment_pages_count() );
-		$this->assertEquals( 2, get_comment_pages_count( null, 20 ) );
-
-		$wp_query = new WP_Query( array( 'p' => $post->ID,'comments_per_page' => null, 'feed' =>'comments-' ) );
-
-		$this->assertEquals( 1, get_comment_pages_count() );
-		$this->assertEquals( 5, get_comment_pages_count( null, 5 ) );
-
-		$wp_query->query_vars['comments_per_page'] = null;
-
-		update_option( 'comments_per_page', 5 );
-
-		$this->assertEquals( 5, get_comment_pages_count() );
-		$this->assertEquals( 3, get_comment_pages_count( null, 11 ) );
-		$this->assertEquals( 5, get_comment_pages_count( null, 0 ) );
-	}
-
-	/**
-	 * Validate max_num_comment_pages logic of get_comment_pages_count
-	 */
-	 function test_max_num_comment_pages() {
-		global $wp_query;
-		$wp_query = new WP_Query();
-
-		$org_max_num_comment_pages = $wp_query->max_num_comment_pages;
-
-		$wp_query->max_num_comment_pages = 7;
-
-		$this->assertEquals( 7, get_comment_pages_count() );
-		$this->assertEquals( 7, get_comment_pages_count( null, null, null ) );
-		$this->assertEquals( 0, get_comment_pages_count( array(), null, null ) );
-
-		$wp_query->max_num_comment_pages = $org_max_num_comment_pages;
-	 }
-}
+<?php
+/**
+ * Validate the logic of get_comments_pages_count
+ * @group comment
+ */
+class Tests_Comment_GetCommentsPagesCount extends WP_UnitTestCase {
+	protected $option_page_comments;
+	protected $option_comments_per_page;
+	protected $option_thread_comments;
+	protected $option_posts_per_rss;
+
+	/**
+	 * setUp options
+	 */
+	function setUp() {
+		parent::setUp();
+		$this->option_page_comments = get_option( 'page_comments' );
+		$this->option_page_comments = get_option( 'comments_per_page' );
+		$this->option_page_comments = get_option( 'thread_comments' );
+		$this->option_posts_per_rss = get_option( 'posts_per_rss' );
+
+		update_option( 'page_comments', true );
+	}
+
+	/**
+	 * tearDown options
+	 */
+	function tearDown() {
+		update_option( 'page_comments', $this->option_page_comments );
+		update_option( 'comments_per_page', $this->option_page_comments );
+		update_option( 'thread_comments', $this->option_page_comments );
+		update_option( 'posts_per_rss', $this->option_posts_per_rss );
+		parent::tearDown();
+	}
+
+	/**
+	 * Validate get_comments_pages_count for empty comments
+	 */
+	function test_empty() {
+		//setup post and comments
+		$post_id = $this->factory->post->create( array( 'post_title' => 'comment--post', 'post_type' => 'post' ) );
+		$this->go_to( '/?p=' . $post_id );
+
+		global $wp_query;
+		unset( $wp_query->comments );
+
+		$comments = get_comments( array( 'post_id' => $post_id ) );
+
+		$this->assertEquals( 0, get_comment_pages_count( $comments, 10, false ) );
+		$this->assertEquals( 0, get_comment_pages_count( $comments, 1, false ) );
+		$this->assertEquals( 0, get_comment_pages_count( $comments, 0, false ) );
+		$this->assertEquals( 0, get_comment_pages_count( $comments, 10, true ) );
+		$this->assertEquals( 0, get_comment_pages_count( $comments, 5 ) );
+		$this->assertEquals( 0, get_comment_pages_count( $comments ) );
+		$this->assertequals( 0, get_comment_pages_count( null, 1 ) );
+	}
+
+	/**
+	 * Validate get_comments_pages_count for treaded comments
+	 */
+	function test_threaded_comments( ) {
+		//setup post and comments
+		$post = $this->factory->post->create_and_get( array( 'post_title' => 'comment--post', 'post_type' => 'post' ) );
+		$comments = $this->factory->comment->create_post_comments( $post->ID, 15 );
+		$this->factory->comment->create_post_comments( $post->ID, 6, array( 'comment_parent' => $comments[0] ) );
+		$comments = get_comments( array( 'post_id' => $post->ID ) );
+
+		$this->assertEquals( 3, get_comment_pages_count( $comments, 10, false ) );
+		$this->assertEquals( 2, get_comment_pages_count( $comments, 10, true ) );
+		$this->assertEquals( 4, get_comment_pages_count( $comments, 4, true ) );
+	}
+
+	/*
+	 * Validate get_comments_pages_count for option page_comments
+	 */
+	function test_option_page_comments() {
+		//setup post and comments
+		$post = $this->factory->post->create_and_get( array( 'post_title' => 'comment--post', 'post_type' => 'post' ) );
+		$comments = $this->factory->comment->create_post_comments( $post->ID, 15 );
+
+		// comment paging disabled
+		update_option( 'page_comments', false );
+
+		$this->assertEquals( 1, get_comment_pages_count( $comments, 10, false ) );
+		$this->assertEquals( 1, get_comment_pages_count( $comments, 0, true ) );
+		$this->assertEquals( 1, get_comment_pages_count( $comments, 2, true ) );
+		// comment paging enabled
+		update_option( 'page_comments', true );
+		$this->assertEquals( 2, get_comment_pages_count( $comments, 10, false ) );
+		$this->assertEquals( 3, get_comment_pages_count( $comments, 5, false ) );
+	}
+
+	/**
+	 * Validate get_comments_pages_count for option tread_comments
+	 */
+	function test_option_thread_comments() {
+
+		//setup post and comments
+		$post = $this->factory->post->create_and_get( array( 'post_title' => 'comment--post', 'post_type' => 'post' ) );
+		$comments = $this->factory->comment->create_post_comments( $post->ID, 15 );
+		$this->factory->comment->create_post_comments( $post->ID, 6, array('comment_parent' => $comments[0] ) );
+		$comments = get_comments( array( 'post_id' => $post->ID ) );
+
+		update_option( 'thread_comments', false );
+
+		$this->assertEquals( 3, get_comment_pages_count( $comments, 10, false ) );
+		$this->assertEquals( 2, get_comment_pages_count( $comments, 10, true ) );
+		$this->assertEquals( 3, get_comment_pages_count( $comments, 10, null ) );
+		$this->assertEquals( 3, get_comment_pages_count( $comments, 10 ) );
+
+		update_option( 'thread_comments', true );
+
+		$this->assertEquals( 3, get_comment_pages_count( $comments, 10, false ) );
+		$this->assertEquals( 2, get_comment_pages_count( $comments, 10, true ) );
+		$this->assertEquals( 2, get_comment_pages_count( $comments, 10, null ) );
+		$this->assertEquals( 2, get_comment_pages_count( $comments, 10 ) );
+	}
+
+	/**
+	 * Validate $wp_query logic of get_comment_pages_count
+	 */
+	function test_wp_query_comments_per_page() {
+		global $wp_query;
+
+		update_option( 'posts_per_rss', 100 );
+
+		$post = $this->factory->post->create_and_get( array( 'post_title' => 'comment-post', 'post_type' => 'post' ) );
+		$comments = $this->factory->comment->create_post_comments( $post->ID, 25 );
+
+		$wp_query = new WP_Query( array( 'p' => $post->ID, 'comments_per_page' => 10, 'feed' =>'comments-' ) );
+
+		update_option( 'comments_per_page', 25 );
+
+		$this->assertEquals( 3, get_comment_pages_count() );
+		$this->assertEquals( 2, get_comment_pages_count( null, 20 ) );
+
+		$wp_query = new WP_Query( array( 'p' => $post->ID,'comments_per_page' => null, 'feed' =>'comments-' ) );
+
+		$this->assertEquals( 1, get_comment_pages_count() );
+		$this->assertEquals( 5, get_comment_pages_count( null, 5 ) );
+
+		$wp_query->query_vars['comments_per_page'] = null;
+
+		update_option( 'comments_per_page', 5 );
+
+		$this->assertEquals( 5, get_comment_pages_count() );
+		$this->assertEquals( 3, get_comment_pages_count( null, 11 ) );
+		$this->assertEquals( 5, get_comment_pages_count( null, 0 ) );
+	}
+
+	/**
+	 * Validate max_num_comment_pages logic of get_comment_pages_count
+	 */
+	 function test_max_num_comment_pages() {
+		global $wp_query;
+		$wp_query = new WP_Query();
+
+		$org_max_num_comment_pages = $wp_query->max_num_comment_pages;
+
+		$wp_query->max_num_comment_pages = 7;
+
+		$this->assertEquals( 7, get_comment_pages_count() );
+		$this->assertEquals( 7, get_comment_pages_count( null, null, null ) );
+		$this->assertEquals( 0, get_comment_pages_count( array(), null, null ) );
+
+		$wp_query->max_num_comment_pages = $org_max_num_comment_pages;
+	 }
+}
diff --git tests/phpunit/tests/comment/wpGetCommentPagesCount.php tests/phpunit/tests/comment/wpGetCommentPagesCount.php
new file mode 100644
index 0000000..30ebf2f
--- /dev/null
+++ tests/phpunit/tests/comment/wpGetCommentPagesCount.php
@@ -0,0 +1,94 @@
+<?php
+
+/**
+ * @group comment
+ * @ticket 8071
+ */
+class Tests_Comment_WpGetCommentPagesCount extends WP_UnitTestCase {
+	protected static $post_id;
+
+	public static function wpSetUpBeforeClass( $factory ) {
+		self::$post_id = $factory->post->create();
+	}
+
+	public static function wpTearDownAfterClass() {
+		wp_delete_post( self::$post_id, true );
+	}
+
+	public function test_nonexistent_post_should_have_1_page() {
+		$this->assertSame( 1, wp_get_comment_pages_count( 12345 ) );
+	}
+
+	public function test_post_with_no_comments_should_have_1_page_when_page_comments_is_enabled() {
+		update_option( 'page_comments', 1 );
+		$this->assertSame( 1, wp_get_comment_pages_count( self::$post_id, 20 ) );
+	}
+
+	public function test_post_with_no_comments_should_have_1_page_when_page_comments_is_disabled() {
+		update_option( 'page_comments', 0 );
+		$this->assertSame( 1, wp_get_comment_pages_count( self::$post_id, 20 ) );
+	}
+
+	public function test_comments_per_page_should_be_used_as_fallback_for_per_page() {
+		update_option( 'comments_per_page', 2 );
+
+		$comments = $this->factory->comment->create_many( 3, array(
+			'comment_post_ID' => self::$post_id,
+		) );
+
+		$this->assertSame( 2, wp_get_comment_pages_count( self::$post_id ) );
+	}
+
+	public function test_comments_per_page_should_be_respected_even_when_over_paging_threshold_when_page_comments_is_enabled() {
+		update_option( 'page_comments', 1 );
+		update_option( 'comments_per_page', 3 );
+
+		$comments = $this->factory->comment->create_many( 3, array(
+			'comment_post_ID' => self::$post_id,
+		) );
+
+		add_filter( 'comment_paging_threshold', array( $this, 'set_threshold_to_2' ) );
+		$found = wp_get_comment_pages_count( self::$post_id, 20 );
+		remove_filter( 'comment_paging_threshold', array( $this, 'set_threshold_to_2' ) );
+
+		$this->assertSame( 1, $found );
+	}
+
+	public function test_comments_per_page_should_be_overridden_by_paging_threshold_when_page_comments_is_disabled() {
+		update_option( 'page_comments', 0 );
+		update_option( 'comments_per_page', 3 );
+
+		$comments = $this->factory->comment->create_many( 3, array(
+			'comment_post_ID' => self::$post_id,
+		) );
+
+		add_filter( 'comment_paging_threshold', array( $this, 'set_threshold_to_2' ) );
+		$found = wp_get_comment_pages_count( self::$post_id, 20 );
+		remove_filter( 'comment_paging_threshold', array( $this, 'set_threshold_to_2' ) );
+
+		$this->assertSame( 2, $found );
+	}
+
+	public function test_comments_per_page_should_be_respected_when_page_comments_is_disabled_but_comment_count_is_below_threshold() {
+		update_option( 'page_comments', 0 );
+		update_option( 'comments_per_page', 2 );
+
+		$comments = $this->factory->comment->create_many( 3, array(
+			'comment_post_ID' => self::$post_id,
+		) );
+
+		add_filter( 'comment_paging_threshold', array( $this, 'set_threshold_to_20' ) );
+		$found = wp_get_comment_pages_count( self::$post_id, 20 );
+		remove_filter( 'comment_paging_threshold', array( $this, 'set_threshold_to_20' ) );
+
+		$this->assertSame( 2, $found );
+	}
+
+	public static function set_threshold_to_2( $threshold ) {
+		return 2;
+	}
+
+	public static function set_threshold_to_20( $threshold ) {
+		return 20;
+	}
+}
diff --git tests/phpunit/tests/comment/wpGetTopLevelCommentsCount.php tests/phpunit/tests/comment/wpGetTopLevelCommentsCount.php
new file mode 100644
index 0000000..62c5f58
--- /dev/null
+++ tests/phpunit/tests/comment/wpGetTopLevelCommentsCount.php
@@ -0,0 +1,70 @@
+<?php
+
+/**
+ * @group comment
+ * @ticket 8071
+ */
+class Tests_Comment_WpGetTopLevelCommentsCount extends WP_UnitTestCase {
+	public function test_should_return_0_for_nonexistent_post() {
+		$this->assertSame( 0, wp_get_top_level_comments_count( 12345 ) );
+	}
+
+	public function test_should_return_0_for_post_with_no_comments() {
+		$p = $this->factory->post->create();
+		$this->assertSame( 0, wp_get_top_level_comments_count( $p ) );
+	}
+
+	public function test_with_post_that_has_no_child_comments() {
+		$p = $this->factory->post->create();
+		$comments = $this->factory->comment->create_many( 2, array(
+			'comment_post_ID' => $p,
+		) );
+
+		$this->assertSame( 2, wp_get_top_level_comments_count( $p ) );
+	}
+
+	public function test_non_approved_comments_should_be_excluded_from_count() {
+		$p = $this->factory->post->create();
+
+		$this->factory->comment->create( array(
+			'comment_post_ID' => $p,
+			'comment_approved' => '1',
+		) );
+
+		$this->factory->comment->create( array(
+			'comment_post_ID' => $p,
+			'comment_approved' => '0',
+		) );
+
+		$this->factory->comment->create( array(
+			'comment_post_ID' => $p,
+			'comment_approved' => 'spam',
+		) );
+
+		$this->assertSame( 1, wp_get_top_level_comments_count( $p ) );
+	}
+
+	public function test_child_comments_should_not_be_counted() {
+		$p = $this->factory->post->create();
+
+		$c1 = $this->factory->comment->create( array(
+			'comment_post_ID' => $p,
+		) );
+
+		$c2 = $this->factory->comment->create( array(
+			'comment_post_ID' => $p,
+			'comment_parent' => $c1,
+		) );
+
+		$c3 = $this->factory->comment->create( array(
+			'comment_post_ID' => $p,
+			'comment_parent' => $c2,
+		) );
+
+		$c4 = $this->factory->comment->create( array(
+			'comment_post_ID' => $p,
+		) );
+
+		$this->assertSame( 2, wp_get_top_level_comments_count( $p ) );
+	}
+}
diff --git tests/phpunit/tests/link/getNextCommentsLink.php tests/phpunit/tests/link/getNextCommentsLink.php
index 4459fa6..03851b3 100644
--- tests/phpunit/tests/link/getNextCommentsLink.php
+++ tests/phpunit/tests/link/getNextCommentsLink.php
@@ -8,6 +8,7 @@
 class Tests_Link_GetNextCommentsLink extends WP_UnitTestCase {
 
 	public function test_page_should_respect_value_of_cpage_query_var() {
+		update_option( 'page_comments', '1' );
 		$p = $this->factory->post->create();
 		$this->go_to( get_permalink( $p ) );
 
@@ -25,6 +26,7 @@ class Tests_Link_GetNextCommentsLink extends WP_UnitTestCase {
 	 * @ticket 20319
 	 */
 	public function test_page_should_default_to_1_when_no_cpage_query_var_is_found() {
+		update_option( 'page_comments', '1' );
 		$p = $this->factory->post->create();
 		$this->go_to( get_permalink( $p ) );
 
diff --git tests/phpunit/tests/link/getPreviousCommentsLink.php tests/phpunit/tests/link/getPreviousCommentsLink.php
index 4aa336d..187b874 100644
--- tests/phpunit/tests/link/getPreviousCommentsLink.php
+++ tests/phpunit/tests/link/getPreviousCommentsLink.php
@@ -8,6 +8,7 @@
 class Tests_Link_GetPreviousCommentsLink extends WP_UnitTestCase {
 
 	public function test_page_should_respect_value_of_cpage_query_var() {
+		update_option( 'page_comments', '1' );
 		$p = $this->factory->post->create();
 		$this->go_to( get_permalink( $p ) );
 
@@ -22,6 +23,7 @@ class Tests_Link_GetPreviousCommentsLink extends WP_UnitTestCase {
 	}
 
 	public function test_page_should_default_to_1_when_no_cpage_query_var_is_found() {
+		update_option( 'page_comments', '1' );
 		$p = $this->factory->post->create();
 		$this->go_to( get_permalink( $p ) );
 
