Index: src/wp-includes/class-wp-site.php
===================================================================
--- src/wp-includes/class-wp-site.php	(revision 37701)
+++ src/wp-includes/class-wp-site.php	(working copy)
@@ -15,8 +15,12 @@
  *
  * @since 4.5.0
  *
- * @property int $id
- * @property int $network_id
+ * @property      int    $id
+ * @property      int    $network_id
+ * @property-read string $blogname
+ * @property-read string $siteurl
+ * @property-read string $post_count
+ * @property-read string $home
  */
 final class WP_Site {
 
@@ -218,6 +222,7 @@
 	 * Getter.
 	 *
 	 * Allows current multisite naming conventions when getting properties.
+	 * Also allows to access extended properties from blog details.
 	 *
 	 * @since 4.6.0
 	 * @access public
@@ -235,6 +240,12 @@
 				return $this->site_id;
 			case 'network_id':
 				return (int) $this->site_id;
+			case 'blogname':
+			case 'siteurl':
+			case 'post_count':
+			case 'home':
+				$details = $this->get_details();
+				return $details->$key;
 		}
 
 		return null;
@@ -244,6 +255,7 @@
 	 * Isset-er.
 	 *
 	 * Allows current multisite naming conventions when checking for properties.
+	 * Also successfully checks for extended properties from blog details.
 	 *
 	 * @since 4.6.0
 	 * @access public
@@ -257,6 +269,10 @@
 			case 'blog_id':
 			case 'site_id':
 			case 'network_id':
+			case 'blogname':
+			case 'siteurl':
+			case 'post_count':
+			case 'home':
 				return true;
 		}
 
@@ -288,4 +304,48 @@
 				$this->$key = $value;
 		}
 	}
+
+	/**
+	 * Retrieve the details for this site.
+	 *
+	 * This method is used internally to lazy-load the extended properties of a site.
+	 *
+	 * @since 4.6.0
+	 * @access private
+	 *
+	 * @see WP_Site::__get()
+	 *
+	 * @return object A raw site object with all details included.
+	 */
+	private function get_details() {
+		$details = wp_cache_get( $this->blog_id, 'site-details' );
+
+		if ( false === $details ) {
+
+			switch_to_blog( $this->blog_id );
+			// Create a raw copy of the object for backwards compatibility with the filter below.
+			$details = new stdClass();
+			foreach ( get_object_vars( $this ) as $key => $value ) {
+				$details->$key = $value;
+			}
+			$details->blogname   = get_option( 'blogname' );
+			$details->siteurl    = get_option( 'siteurl' );
+			$details->post_count = get_option( 'post_count' );
+			$details->home       = get_option( 'home' );
+			restore_current_blog();
+
+			wp_cache_set( $this->blog_id, $details, 'site-details' );
+		}
+
+		/**
+		 * Filters a blog's details.
+		 *
+		 * @since MU
+		 *
+		 * @param object $details The blog details.
+		 */
+		$details = apply_filters( 'blog_details', $details );
+
+		return $details;
+	}
 }
Index: src/wp-includes/load.php
===================================================================
--- src/wp-includes/load.php	(revision 37701)
+++ src/wp-includes/load.php	(working copy)
@@ -509,7 +509,7 @@
 		wp_cache_init();
 
 	if ( function_exists( 'wp_cache_add_global_groups' ) ) {
-		wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites' ) );
+		wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'site-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites' ) );
 		wp_cache_add_non_persistent_groups( array( 'counts', 'plugins' ) );
 	}
 }
Index: src/wp-includes/ms-blogs.php
===================================================================
--- src/wp-includes/ms-blogs.php	(revision 37701)
+++ src/wp-includes/ms-blogs.php	(working copy)
@@ -108,6 +108,8 @@
  * Retrieve the details for a blog from the blogs table and blog options.
  *
  * @since MU
+ * @since 4.6.0 Extended blog details are lazy-loaded through `WP_Site` and are available as object properties
+ *              regardless of the `$get_all` parameter.
  *
  * @global wpdb $wpdb WordPress database abstraction object.
  *
@@ -126,19 +128,22 @@
 		} elseif ( isset($fields['domain']) && isset($fields['path']) ) {
 			$key = md5( $fields['domain'] . $fields['path'] );
 			$blog = wp_cache_get($key, 'blog-lookup');
-			if ( false !== $blog )
-				return $blog;
-			if ( substr( $fields['domain'], 0, 4 ) == 'www.' ) {
-				$nowww = substr( $fields['domain'], 4 );
-				$blog = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain IN (%s,%s) AND path = %s ORDER BY CHAR_LENGTH(domain) DESC", $nowww, $fields['domain'], $fields['path'] ) );
-			} else {
-				$blog = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain = %s AND path = %s", $fields['domain'], $fields['path'] ) );
-			}
 			if ( $blog ) {
-				wp_cache_set($blog->blog_id . 'short', $blog, 'blog-details');
 				$blog_id = $blog->blog_id;
 			} else {
-				return false;
+				if ( substr( $fields['domain'], 0, 4 ) == 'www.' ) {
+					$nowww = substr( $fields['domain'], 4 );
+					$blog = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain IN (%s,%s) AND path = %s ORDER BY CHAR_LENGTH(domain) DESC", $nowww, $fields['domain'], $fields['path'] ) );
+				} else {
+					$blog = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain = %s AND path = %s", $fields['domain'], $fields['path'] ) );
+				}
+				if ( $blog ) {
+					$key = md5( $blog->domain . $blog->path );
+					wp_cache_set( $key, $blog, 'blog-lookup' );
+					$blog_id = $blog->blog_id;
+				} else {
+					return false;
+				}
 			}
 		} elseif ( isset($fields['domain']) && is_subdomain_install() ) {
 			$key = md5( $fields['domain'] );
@@ -152,7 +157,8 @@
 				$blog = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain = %s", $fields['domain'] ) );
 			}
 			if ( $blog ) {
-				wp_cache_set($blog->blog_id . 'short', $blog, 'blog-details');
+				$key = md5( $blog->domain );
+				wp_cache_set( $key, $blog, 'blog-lookup' );
 				$blog_id = $blog->blog_id;
 			} else {
 				return false;
@@ -171,84 +177,13 @@
 
 	$blog_id = (int) $blog_id;
 
-	$all = $get_all == true ? '' : 'short';
-	$details = wp_cache_get( $blog_id . $all, 'blog-details' );
-
-	if ( $details ) {
-		if ( ! is_object( $details ) ) {
-			if ( $details == -1 ) {
-				return false;
-			} else {
-				// Clear old pre-serialized objects. Cache clients do better with that.
-				wp_cache_delete( $blog_id . $all, 'blog-details' );
-				unset($details);
-			}
-		} else {
-			return $details;
-		}
-	}
-
-	// Try the other cache.
-	if ( $get_all ) {
-		$details = wp_cache_get( $blog_id . 'short', 'blog-details' );
+	if ( isset( $blog ) ) {
+		$blog = new WP_Site( $blog );
 	} else {
-		$details = wp_cache_get( $blog_id, 'blog-details' );
-		// If short was requested and full cache is set, we can return.
-		if ( $details ) {
-			if ( ! is_object( $details ) ) {
-				if ( $details == -1 ) {
-					return false;
-				} else {
-					// Clear old pre-serialized objects. Cache clients do better with that.
-					wp_cache_delete( $blog_id, 'blog-details' );
-					unset($details);
-				}
-			} else {
-				return $details;
-			}
-		}
+		$blog = WP_Site::get_instance( $blog_id );
 	}
 
-	if ( empty($details) ) {
-		$details = WP_Site::get_instance( $blog_id );
-		if ( ! $details ) {
-			// Set the full cache.
-			wp_cache_set( $blog_id, -1, 'blog-details' );
-			return false;
-		}
-	}
-
-	if ( ! $details instanceof WP_Site ) {
-		$details = new WP_Site( $details );
-	}
-
-	if ( ! $get_all ) {
-		wp_cache_set( $blog_id . $all, $details, 'blog-details' );
-		return $details;
-	}
-
-	switch_to_blog( $blog_id );
-	$details->blogname   = get_option( 'blogname' );
-	$details->siteurl    = get_option( 'siteurl' );
-	$details->post_count = get_option( 'post_count' );
-	$details->home       = get_option( 'home' );
-	restore_current_blog();
-
-	/**
-	 * Filters a blog's details.
-	 *
-	 * @since MU
-	 *
-	 * @param object $details The blog details.
-	 */
-	$details = apply_filters( 'blog_details', $details );
-
-	wp_cache_set( $blog_id . $all, $details, 'blog-details' );
-
-	$key = md5( $details->domain . $details->path );
-	wp_cache_set( $key, $details, 'blog-lookup' );
-
-	return $details;
+	return $blog;
 }
 
 /**
@@ -312,7 +247,7 @@
 	if ( empty($current_details) )
 		return false;
 
-	$current_details = get_object_vars($current_details);
+	$current_details = $current_details->to_array();
 
 	$details = array_merge($current_details, $details);
 	$details['last_updated'] = current_time('mysql', true);
@@ -447,9 +382,8 @@
 	$domain_path_key = md5( $blog->domain . $blog->path );
 
 	wp_cache_delete( $blog_id, 'sites' );
-	wp_cache_delete( $blog_id , 'blog-details' );
-	wp_cache_delete( $blog_id . 'short' , 'blog-details' );
-	wp_cache_delete(  $domain_path_key, 'blog-lookup' );
+	wp_cache_delete( $blog_id, 'site-details' );
+	wp_cache_delete( $domain_path_key, 'blog-lookup' );
 	wp_cache_delete( 'current_blog_' . $blog->domain, 'site-options' );
 	wp_cache_delete( 'current_blog_' . $blog->domain . $blog->path, 'site-options' );
 	wp_cache_delete( 'get_id_from_blogname_' . trim( $blog->path, '/' ), 'blog-details' );
@@ -549,7 +483,6 @@
 
 	foreach ( $sites as $site ) {
 		wp_cache_add( $site->blog_id, $site, 'sites' );
-		wp_cache_add( $site->blog_id . 'short', $site, 'blog-details' );
 	}
 }
 
@@ -814,7 +747,7 @@
 			if ( is_array( $global_groups ) ) {
 				wp_cache_add_global_groups( $global_groups );
 			} else {
-				wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites' ) );
+				wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details' ) );
 			}
 			wp_cache_add_non_persistent_groups( array( 'counts', 'plugins' ) );
 		}
@@ -885,7 +818,7 @@
 			if ( is_array( $global_groups ) ) {
 				wp_cache_add_global_groups( $global_groups );
 			} else {
-				wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites' ) );
+				wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details' ) );
 			}
 			wp_cache_add_non_persistent_groups( array( 'counts', 'plugins' ) );
 		}
