Index: wp-includes/l10n.php
===================================================================
--- wp-includes/l10n.php	(revision 18887)
+++ wp-includes/l10n.php	(working copy)
@@ -382,7 +382,7 @@
 
 	load_textdomain( 'default', WP_LANG_DIR . "/$locale.mo" );
 
-	if ( is_multisite() || ( defined( 'WP_NETWORK_ADMIN_PAGE' ) && WP_NETWORK_ADMIN_PAGE ) ) {
+	if ( is_multisite() || ( defined( 'WP_INSTALLING_NETWORK' ) && WP_INSTALLING_NETWORK ) ) {
 		load_textdomain( 'default', WP_LANG_DIR . "/ms-$locale.mo" );
 	}
 }
Index: wp-includes/ms-functions.php
===================================================================
--- wp-includes/ms-functions.php	(revision 18887)
+++ wp-includes/ms-functions.php	(working copy)
@@ -1172,7 +1172,7 @@
 	$url = get_blogaddress_by_id($blog_id);
 
 	// Set everything up
-	make_db_current_silent();
+	make_db_current_silent( 'blog' );
 	populate_options();
 	populate_roles();
 	$wp_roles->_init();
Index: wp-admin/network.php
===================================================================
--- wp-admin/network.php	(revision 18887)
+++ wp-admin/network.php	(working copy)
@@ -10,7 +10,7 @@
  * @subpackage Administration
  */
 
-define( 'WP_NETWORK_ADMIN_PAGE', true );
+define( 'WP_INSTALLING_NETWORK', true );
 
 /** WordPress Administration Bootstrap */
 require_once( './admin.php' );
Index: wp-admin/includes/upgrade.php
===================================================================
--- wp-admin/includes/upgrade.php	(revision 18887)
+++ wp-admin/includes/upgrade.php	(working copy)
@@ -1424,9 +1424,20 @@
  * @param unknown_type $execute
  * @return unknown
  */
-function dbDelta($queries, $execute = true) {
+function dbDelta( $queries = '', $execute = true ) {
 	global $wpdb;
 
+	if ( empty( $queries ) )
+		$queries = wp_get_db_schema( 'all' );
+	elseif ( 'all' == $queries )
+		$queries = wp_get_db_schema( 'all' );
+	elseif ( 'blog' == $queries )
+		$queries = wp_get_db_schema( 'blog' );
+	elseif ( 'global' == $queries )
+		$queries = wp_get_db_schema( 'global' );
+	elseif ( 'ms' == $queries )
+		$queries = wp_get_db_schema( 'ms' );
+
 	// Separate individual queries into an array
 	if ( !is_array($queries) ) {
 		$queries = explode( ';', $queries );
@@ -1631,10 +1642,8 @@
  *
  * @since 1.5.0
  */
-function make_db_current() {
-	global $wp_queries;
-
-	$alterations = dbDelta($wp_queries);
+function make_db_current( $tables = 'all' ) {
+	$alterations = dbDelta( $tables );
 	echo "<ol>\n";
 	foreach($alterations as $alteration) echo "<li>$alteration</li>\n";
 	echo "</ol>\n";
@@ -1647,10 +1656,8 @@
  *
  * @since 1.5.0
  */
-function make_db_current_silent() {
-	global $wp_queries;
-
-	$alterations = dbDelta($wp_queries);
+function make_db_current_silent(  $tables = 'all' ) {
+	$alterations = dbDelta( $tables );
 }
 
 /**
@@ -1933,102 +1940,6 @@
 }
 
 /**
- * Install Network.
- *
- * @since 3.0.0
- *
- */
-if ( !function_exists( 'install_network' ) ) :
-function install_network() {
-	global $wpdb, $charset_collate;
-	$ms_queries = "
-CREATE TABLE $wpdb->users (
-  ID bigint(20) unsigned NOT NULL auto_increment,
-  user_login varchar(60) NOT NULL default '',
-  user_pass varchar(64) NOT NULL default '',
-  user_nicename varchar(50) NOT NULL default '',
-  user_email varchar(100) NOT NULL default '',
-  user_url varchar(100) NOT NULL default '',
-  user_registered datetime NOT NULL default '0000-00-00 00:00:00',
-  user_activation_key varchar(60) NOT NULL default '',
-  user_status int(11) NOT NULL default '0',
-  display_name varchar(250) NOT NULL default '',
-  spam tinyint(2) NOT NULL default '0',
-  deleted tinyint(2) NOT NULL default '0',
-  PRIMARY KEY  (ID),
-  KEY user_login_key (user_login),
-  KEY user_nicename (user_nicename)
-) $charset_collate;
-CREATE TABLE $wpdb->blogs (
-  blog_id bigint(20) NOT NULL auto_increment,
-  site_id bigint(20) NOT NULL default '0',
-  domain varchar(200) NOT NULL default '',
-  path varchar(100) NOT NULL default '',
-  registered datetime NOT NULL default '0000-00-00 00:00:00',
-  last_updated datetime NOT NULL default '0000-00-00 00:00:00',
-  public tinyint(2) NOT NULL default '1',
-  archived enum('0','1') NOT NULL default '0',
-  mature tinyint(2) NOT NULL default '0',
-  spam tinyint(2) NOT NULL default '0',
-  deleted tinyint(2) NOT NULL default '0',
-  lang_id int(11) NOT NULL default '0',
-  PRIMARY KEY  (blog_id),
-  KEY domain (domain(50),path(5)),
-  KEY lang_id (lang_id)
-) $charset_collate;
-CREATE TABLE $wpdb->blog_versions (
-  blog_id bigint(20) NOT NULL default '0',
-  db_version varchar(20) NOT NULL default '',
-  last_updated datetime NOT NULL default '0000-00-00 00:00:00',
-  PRIMARY KEY  (blog_id),
-  KEY db_version (db_version)
-) $charset_collate;
-CREATE TABLE $wpdb->registration_log (
-  ID bigint(20) NOT NULL auto_increment,
-  email varchar(255) NOT NULL default '',
-  IP varchar(30) NOT NULL default '',
-  blog_id bigint(20) NOT NULL default '0',
-  date_registered datetime NOT NULL default '0000-00-00 00:00:00',
-  PRIMARY KEY  (ID),
-  KEY IP (IP)
-) $charset_collate;
-CREATE TABLE $wpdb->site (
-  id bigint(20) NOT NULL auto_increment,
-  domain varchar(200) NOT NULL default '',
-  path varchar(100) NOT NULL default '',
-  PRIMARY KEY  (id),
-  KEY domain (domain,path)
-) $charset_collate;
-CREATE TABLE $wpdb->sitemeta (
-  meta_id bigint(20) NOT NULL auto_increment,
-  site_id bigint(20) NOT NULL default '0',
-  meta_key varchar(255) default NULL,
-  meta_value longtext,
-  PRIMARY KEY  (meta_id),
-  KEY meta_key (meta_key),
-  KEY site_id (site_id)
-) $charset_collate;
-CREATE TABLE $wpdb->signups (
-  domain varchar(200) NOT NULL default '',
-  path varchar(100) NOT NULL default '',
-  title longtext NOT NULL,
-  user_login varchar(60) NOT NULL default '',
-  user_email varchar(100) NOT NULL default '',
-  registered datetime NOT NULL default '0000-00-00 00:00:00',
-  activated datetime NOT NULL default '0000-00-00 00:00:00',
-  active tinyint(1) NOT NULL default '0',
-  activation_key varchar(50) NOT NULL default '',
-  meta longtext,
-  KEY activation_key (activation_key),
-  KEY domain (domain)
-) $charset_collate;
-";
-// now create tables
-	dbDelta( $ms_queries );
-}
-endif;
-
-/**
  * Install global terms.
  *
  * @since 3.0.0
Index: wp-admin/includes/schema.php
===================================================================
--- wp-admin/includes/schema.php	(revision 18887)
+++ wp-admin/includes/schema.php	(working copy)
@@ -8,24 +8,34 @@
  * @subpackage Administration
  */
 
+// Declare these as global in case schema.php is included from a function.
+global $wpdb, $wp_queries;
+
 /**
- * The database character collate.
- * @var string
- * @global string
- * @name $charset_collate
+ * Retrieve the SQL for creating database tables.
+ *
+ * @since 3.3.0
+ *
+ * @param string $scope Optional. The tables for which to retrieve SQL. Can be all, global, ms_global, or blog tables. Defaults to all.
+ * @param int $blog_id Optional. The blog ID for which to retrieve SQL.  Default is the current blog ID.
+ * @return string The SQL needed to create the requested tables.
  */
-$charset_collate = '';
+function wp_get_db_schema( $scope = 'all', $blog_id = null ) {
+	global $wpdb;
 
-// Declare these as global in case schema.php is included from a function.
-global $wpdb, $wp_queries;
+	if ( ! empty($wpdb->charset) )
+		$charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
+	if ( ! empty($wpdb->collate) )
+		$charset_collate .= " COLLATE $wpdb->collate";
 
-if ( ! empty($wpdb->charset) )
-	$charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
-if ( ! empty($wpdb->collate) )
-	$charset_collate .= " COLLATE $wpdb->collate";
+	if ( $blog_id && $blog_id != $wpdb->blogid )
+		$old_blog_id = $wpdb->set_blog_id( $blog_id );
 
-/** Create WordPress database tables SQL */
-$wp_queries = "CREATE TABLE $wpdb->terms (
+	// Engage multisite if in the middle of turning it on from network.php.
+	$is_multisite = is_multisite() || ( defined( 'WP_INSTALLING_NETWORK' ) && WP_INSTALLING_NETWORK );
+
+	// Blog specific tables.
+	$blog_tables = "CREATE TABLE $wpdb->terms (
  term_id bigint(20) unsigned NOT NULL auto_increment,
  name varchar(200) NOT NULL default '',
  slug varchar(200) NOT NULL default '',
@@ -148,8 +158,10 @@
   KEY type_status_date (post_type,post_status,post_date,ID),
   KEY post_parent (post_parent),
   KEY post_author (post_author)
-) $charset_collate;
-CREATE TABLE $wpdb->users (
+) $charset_collate;\n";
+
+	// Single site users table. The multisite flavor of the users table is handled below.
+	$users_single_table = "CREATE TABLE $wpdb->users (
   ID bigint(20) unsigned NOT NULL auto_increment,
   user_login varchar(60) NOT NULL default '',
   user_pass varchar(64) NOT NULL default '',
@@ -163,8 +175,29 @@
   PRIMARY KEY  (ID),
   KEY user_login_key (user_login),
   KEY user_nicename (user_nicename)
-) $charset_collate;
-CREATE TABLE $wpdb->usermeta (
+) $charset_collate;\n";
+
+	// Multisite users table
+	$users_multi_table = "CREATE TABLE $wpdb->users (
+  ID bigint(20) unsigned NOT NULL auto_increment,
+  user_login varchar(60) NOT NULL default '',
+  user_pass varchar(64) NOT NULL default '',
+  user_nicename varchar(50) NOT NULL default '',
+  user_email varchar(100) NOT NULL default '',
+  user_url varchar(100) NOT NULL default '',
+  user_registered datetime NOT NULL default '0000-00-00 00:00:00',
+  user_activation_key varchar(60) NOT NULL default '',
+  user_status int(11) NOT NULL default '0',
+  display_name varchar(250) NOT NULL default '',
+  spam tinyint(2) NOT NULL default '0',
+  deleted tinyint(2) NOT NULL default '0',
+  PRIMARY KEY  (ID),
+  KEY user_login_key (user_login),
+  KEY user_nicename (user_nicename)
+) $charset_collate;\n";
+
+	// usermeta
+	$usermeta_table = "CREATE TABLE $wpdb->usermeta (
   umeta_id bigint(20) unsigned NOT NULL auto_increment,
   user_id bigint(20) unsigned NOT NULL default '0',
   meta_key varchar(255) default NULL,
@@ -172,8 +205,108 @@
   PRIMARY KEY  (umeta_id),
   KEY user_id (user_id),
   KEY meta_key (meta_key)
+) $charset_collate;\n";
+
+	// Global tables
+	if ( $is_multisite )
+		$global_tables = $users_multi_table . $usermeta_table;
+	else
+		$global_tables = $users_single_table . $usermeta_table;
+
+	// Multisite global tables.
+	$ms_global_tables = "CREATE TABLE $wpdb->blogs (
+  blog_id bigint(20) NOT NULL auto_increment,
+  site_id bigint(20) NOT NULL default '0',
+  domain varchar(200) NOT NULL default '',
+  path varchar(100) NOT NULL default '',
+  registered datetime NOT NULL default '0000-00-00 00:00:00',
+  last_updated datetime NOT NULL default '0000-00-00 00:00:00',
+  public tinyint(2) NOT NULL default '1',
+  archived enum('0','1') NOT NULL default '0',
+  mature tinyint(2) NOT NULL default '0',
+  spam tinyint(2) NOT NULL default '0',
+  deleted tinyint(2) NOT NULL default '0',
+  lang_id int(11) NOT NULL default '0',
+  PRIMARY KEY  (blog_id),
+  KEY domain (domain(50),path(5)),
+  KEY lang_id (lang_id)
+) $charset_collate;
+CREATE TABLE $wpdb->blog_versions (
+  blog_id bigint(20) NOT NULL default '0',
+  db_version varchar(20) NOT NULL default '',
+  last_updated datetime NOT NULL default '0000-00-00 00:00:00',
+  PRIMARY KEY  (blog_id),
+  KEY db_version (db_version)
+) $charset_collate;
+CREATE TABLE $wpdb->registration_log (
+  ID bigint(20) NOT NULL auto_increment,
+  email varchar(255) NOT NULL default '',
+  IP varchar(30) NOT NULL default '',
+  blog_id bigint(20) NOT NULL default '0',
+  date_registered datetime NOT NULL default '0000-00-00 00:00:00',
+  PRIMARY KEY  (ID),
+  KEY IP (IP)
+) $charset_collate;
+CREATE TABLE $wpdb->site (
+  id bigint(20) NOT NULL auto_increment,
+  domain varchar(200) NOT NULL default '',
+  path varchar(100) NOT NULL default '',
+  PRIMARY KEY  (id),
+  KEY domain (domain,path)
+) $charset_collate;
+CREATE TABLE $wpdb->sitemeta (
+  meta_id bigint(20) NOT NULL auto_increment,
+  site_id bigint(20) NOT NULL default '0',
+  meta_key varchar(255) default NULL,
+  meta_value longtext,
+  PRIMARY KEY  (meta_id),
+  KEY meta_key (meta_key),
+  KEY site_id (site_id)
+) $charset_collate;
+CREATE TABLE $wpdb->signups (
+  domain varchar(200) NOT NULL default '',
+  path varchar(100) NOT NULL default '',
+  title longtext NOT NULL,
+  user_login varchar(60) NOT NULL default '',
+  user_email varchar(100) NOT NULL default '',
+  registered datetime NOT NULL default '0000-00-00 00:00:00',
+  activated datetime NOT NULL default '0000-00-00 00:00:00',
+  active tinyint(1) NOT NULL default '0',
+  activation_key varchar(50) NOT NULL default '',
+  meta longtext,
+  KEY activation_key (activation_key),
+  KEY domain (domain)
 ) $charset_collate;";
 
+	switch ( $scope ) {
+		case 'blog' :
+			$queries = $blog_tables;
+			break;
+		case 'global' :
+			$queries = $global_tables;
+			if ( $is_multisite )
+				$queries .= $ms_global_tables;
+			break;
+		case 'ms_global' :
+			$queries = $ms_global_tables;
+			break;
+		default:
+		case 'all' :
+			$queries = $global_tables . $blog_tables;
+			if ( $is_multisite )
+				$queries .= $ms_global_tables;
+			break;
+	}
+
+	if ( isset( $old_blog_id ) )
+		$wpdb->set_blog_id( $old_blog_id );
+
+	return $queries;
+}
+
+// Populate for back compat.
+$wp_queries = wp_get_db_schema( 'all' );
+
 /**
  * Create WordPress options and set the default values.
  *
@@ -624,6 +757,21 @@
 }
 
 /**
+ * Install Network.
+ *
+ * @since 3.0.0
+ *
+ */
+if ( !function_exists( 'install_network' ) ) :
+function install_network() {
+	if ( ! defined( 'WP_INSTALLING_NETWORK' ) )
+		define( 'WP_INSTALLING_NETWORK', true );
+
+	dbDelta( wp_get_db_schema( 'global' ) );
+}
+endif;
+
+/**
  * populate network settings
  *
  * @since 3.0.0
