Index: src/wp-includes/class-wp-network.php
===================================================================
--- src/wp-includes/class-wp-network.php	(revision 41550)
+++ src/wp-includes/class-wp-network.php	(working copy)
@@ -148,7 +148,6 @@
 			case 'id':
 				return (int) $this->id;
 			case 'blog_id':
-				return $this->get_main_site_id();
 			case 'site_id':
 				return (int) $this->get_main_site_id();
 		}
@@ -208,15 +207,67 @@
 	 * properties.
 	 *
 	 * @since 4.9.0
-	 * @see get_main_site_id()
 	 *
 	 * @return string Main site ID as numeric string, for compatibility reasons.
 	 */
-	private function get_main_site_id() {
-		if ( empty( $this->blog_id ) ) {
-			$this->blog_id = (string) get_main_site_id( $this->id );
+	public function get_main_site_id() {
+		/**
+		 * Filters the main site ID.
+		 *
+		 * Returning anything other than null will effectively short-circuit the function, returning
+		 * the result parsed as an integer immediately.
+		 *
+		 * @since 4.9.0
+		 *
+		 * @param int|null $main_site_id If anything other than null is returned, it is interpreted as the main site ID.
+		 * @param int $this_id The ID of the network for which the main site was detected.
+		 */
+		$main_site_id = apply_filters( 'pre_get_main_site_id', null, $this->id );
+		if ( null !== $main_site_id ) {
+			$this->blog_id = (int) $main_site_id;
+
+			return $this->blog_id;
 		}
+		if ( ! empty( $this->blog_id ) ) {
+			return $this->blog_id;
+		}
+		
 
+		if ( ( defined( 'DOMAIN_CURRENT_SITE' ) && defined( 'PATH_CURRENT_SITE' ) && $this->domain === DOMAIN_CURRENT_SITE && $this->path === PATH_CURRENT_SITE )
+		     || ( defined( 'SITE_ID_CURRENT_SITE' ) && $this->id == SITE_ID_CURRENT_SITE ) ) {
+			if ( defined( 'BLOG_ID_CURRENT_SITE' ) ) {
+				$this->blog_id = BLOG_ID_CURRENT_SITE;
+
+				return $this->blog_id;
+			} elseif ( defined( 'BLOGID_CURRENT_SITE' ) ) { // deprecated.
+				$this->blog_id = BLOGID_CURRENT_SITE;
+
+				return $this->blog_id;
+			}
+		}
+
+		$site = get_site();
+		if ( $site->domain === $this->domain && $site->path === $this->path ) {
+			$main_site_id = $site->id;
+		} else {
+			$main_site_id = wp_cache_get( 'network:' . $this->id . ':main_site', 'site-options' );
+			if ( false === $main_site_id ) {
+				$_sites       = get_sites( array(
+					'fields'     => 'ids',
+					'number'     => 1,
+					'domain'     => $this->domain,
+					'path'       => $this->path,
+					'network_id' => $this->id,
+				) );
+				$main_site_id = ! empty( $_sites ) ? array_shift( $_sites ) : 0;
+
+				wp_cache_add( 'network:' . $this->id . ':main_site', $main_site_id, 'site-options' );
+			}
+		}
+
+		$this->blog_id = (int) $main_site_id;
+
+
 		return $this->blog_id;
 	}
 
Index: src/wp-includes/functions.php
===================================================================
--- src/wp-includes/functions.php	(revision 41550)
+++ src/wp-includes/functions.php	(working copy)
@@ -4408,8 +4408,8 @@
 	}
 
 	$site_id = (int) $site_id;
-
-	return $site_id === get_main_site_id( $network_id );
+//var_dump($site_id,get_network( $network_id )->site_id, "");
+	return $site_id === get_network( $network_id )->site_id;
 }
 
 /**
@@ -4431,51 +4431,7 @@
 		return 0;
 	}
 
-	/**
-	 * Filters the main site ID.
-	 *
-	 * Returning anything other than null will effectively short-circuit the function, returning
-	 * the result parsed as an integer immediately.
-	 *
-	 * @since 4.9.0
-	 *
-	 * @param int|null $main_site_id If anything other than null is returned, it is interpreted as the main site ID.
-	 * @param int $network_id The ID of the network for which the main site was detected.
-	 */
-	$main_site_id = apply_filters( 'pre_get_main_site_id', null, $network->id );
-	if ( null !== $main_site_id ) {
-		return (int) $main_site_id;
-	}
-
-	if ( ( defined( 'DOMAIN_CURRENT_SITE' ) && defined( 'PATH_CURRENT_SITE' ) && $network->domain === DOMAIN_CURRENT_SITE && $network->path === PATH_CURRENT_SITE )
-	     || ( defined( 'SITE_ID_CURRENT_SITE' ) && $network->id == SITE_ID_CURRENT_SITE ) ) {
-		if ( defined( 'BLOG_ID_CURRENT_SITE' ) ) {
-			return BLOG_ID_CURRENT_SITE;
-		} elseif ( defined( 'BLOGID_CURRENT_SITE' ) ) { // deprecated.
-			return BLOGID_CURRENT_SITE;
-		}
-	}
-
-	$site = get_site();
-	if ( $site->domain === $network->domain && $site->path === $network->path ) {
-		$main_site_id = (int) $site->id;
-	} else {
-		$main_site_id = wp_cache_get( 'network:' . $network->id . ':main_site', 'site-options' );
-		if ( false === $main_site_id ) {
-			$_sites = get_sites( array(
-				'fields'     => 'ids',
-				'number'     => 1,
-				'domain'     => $network->domain,
-				'path'       => $network->path,
-				'network_id' => $network->id,
-			) );
-			$main_site_id = ! empty( $_sites ) ? array_shift( $_sites ) : 0;
-
-			wp_cache_add( 'network:' . $network->id . ':main_site', $main_site_id, 'site-options' );
-		}
-	}
-
-	return (int) $main_site_id;
+	return $network->site_id;
 }
 
 /**
Index: src/wp-includes/ms-load.php
===================================================================
--- src/wp-includes/ms-load.php	(revision 41550)
+++ src/wp-includes/ms-load.php	(working copy)
@@ -423,9 +423,7 @@
 	}
 
 	// Figure out the current network's main site.
-	if ( empty( $current_site->blog_id ) ) {
-		$current_site->blog_id = get_main_site_id( $current_site->id );
-	}
+	$current_site->get_main_site_id();
 
 	return true;
 }
Index: tests/phpunit/tests/multisite/site.php
===================================================================
--- tests/phpunit/tests/multisite/site.php	(revision 41550)
+++ tests/phpunit/tests/multisite/site.php	(working copy)
@@ -14,9 +14,11 @@
 	protected static $site_ids;
 
 	function setUp() {
-		global $wpdb;
+		global $wpdb, $current_site;
 		parent::setUp();
 		$this->suppress = $wpdb->suppress_errors();
+		$current_site->site_id = 0;
+		$current_site->blog_id = 0;
 	}
 
 	function tearDown() {
