diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc
index da39097..5844eac 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -331,10 +331,8 @@ function install_begin_request(&$install_state) {
   require_once DRUPAL_ROOT . '/core/includes/ajax.inc';
   // Override the module list with a minimal set of modules.
   $module_list['system']['filename'] = 'core/modules/system/system.module';
-  $module_list['user']['filename']   = 'core/modules/user/user.module';
   module_list(NULL, $module_list);
   drupal_load('module', 'system');
-  drupal_load('module', 'user');
 
   // Load the cache infrastructure using a "fake" cache implementation that
   // does not attempt to write to the database. We need this during the initial
diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index 3c4576a..8f6d1e2 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -2395,10 +2395,7 @@ function template_preprocess(&$variables, $hook) {
     $drupal_static_fast['default_variables'] = &drupal_static(__FUNCTION__);
   }
   $default_variables = &$drupal_static_fast['default_variables'];
-  // Global $user object shouldn't change during a page request once rendering
-  // has started, but if there's an edge case where it does, re-fetch the
-  // variables appropriate for the new user.
-  if (!isset($default_variables) || ($user !== $default_variables['user'])) {
+  if (!isset($default_variables)) {
     $default_variables = _template_preprocess_default_variables();
   }
   if (!isset($default_attributes)) {
@@ -2418,26 +2415,17 @@ function template_preprocess(&$variables, $hook) {
  * Returns hook-independent variables to template_preprocess().
  */
 function _template_preprocess_default_variables() {
-  global $user;
-
   // Variables that don't depend on a database connection.
   $variables = array(
     'title_prefix' => array(),
     'title_suffix' => array(),
-    'user' => $user,
     'db_is_active' => !defined('MAINTENANCE_MODE'),
+    // User module overrides these when it is loaded.
+    'user' => drupal_anonymous_user(),
     'is_admin' => FALSE,
     'logged_in' => FALSE,
   );
 
-  // The user object has no uid property when the database does not exist during
-  // install. The user_access() check deals with issues when in maintenance mode
-  // as uid is set but the user.module has not been included.
-  if (isset($user->uid) && function_exists('user_access')) {
-    $variables['is_admin'] = user_access('access administration pages');
-    $variables['logged_in'] = ($user->uid > 0);
-  }
-
   // drupal_is_front_page() might throw an exception.
   try {
     $variables['is_front'] = drupal_is_front_page();
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index fae45ad..dcec1375 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -937,6 +937,19 @@ function user_format_name($account) {
 }
 
 /**
+ * Preprocesses template variables for all templates.
+ *
+ * @see template_preprocess()
+ */
+function user_preprocess(&$variables) {
+  global $user;
+
+  $variables['user'] = $user;
+  $variables['is_admin'] = user_access('access administration pages');
+  $variables['logged_in'] = ($user->uid > 0);
+}
+
+/**
  * Process variables for user-picture.tpl.php.
  *
  * The $variables array contains the following arguments:
