diff --git a/core/includes/session.inc b/core/includes/session.inc
index b07997c..e759f66 100644
--- a/core/includes/session.inc
+++ b/core/includes/session.inc
@@ -68,6 +68,7 @@ function _drupal_session_close() {
  *   The user's session, or an empty string if no session exists.
  */
 function _drupal_session_read($sid) {
+  // @todo Rename $user into $session.
   global $user, $is_https;
 
   // Write and Close handlers are called after destructing objects
@@ -81,48 +82,51 @@ function _drupal_session_read($sid) {
   $insecure_session_name = substr(session_name(), 1);
   if (!isset($_COOKIE[session_name()]) && !isset($_COOKIE[$insecure_session_name])) {
     $user = drupal_anonymous_user();
+    $user->session = '';
     return '';
   }
 
+  // Additional user properties to attach to $user.
+  $user_fields = 'u.name, u.pass, u.mail, u.theme, u.access, u.login, u.status, u.timezone, u.language';
+  // @todo Remove these.
+  $user_fields .= ', u.created, u.init';
+
   // Otherwise, if the session is still active, we have a record of the
   // client's session in the database. If it's HTTPS then we are either have
   // a HTTPS session or we are about to log in so we check the sessions table
   // for an anonymous session with the non-HTTPS-only cookie.
   if ($is_https) {
-    $user = db_query("SELECT u.*, s.* FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.ssid = :ssid", array(':ssid' => $sid))->fetchObject();
+    $user = db_query("SELECT s.*, $user_fields FROM {sessions} s INNER JOIN {users} u ON u.uid = s.uid WHERE s.ssid = :ssid", array(':ssid' => $sid))->fetchObject();
     if (!$user) {
       if (isset($_COOKIE[$insecure_session_name])) {
-        $user = db_query("SELECT u.*, s.* FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.sid = :sid AND s.uid = 0", array(
+        $user = db_query("SELECT s.*, $user_fields FROM {sessions} s INNER JOIN {users} u ON u.uid = s.uid WHERE s.sid = :sid AND s.uid = 0", array(
         ':sid' => $_COOKIE[$insecure_session_name]))
         ->fetchObject();
       }
     }
   }
   else {
-    $user = db_query("SELECT u.*, s.* FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.sid = :sid", array(':sid' => $sid))->fetchObject();
+    $user = db_query("SELECT s.*, $user_fields FROM {sessions} s INNER JOIN {users} u ON u.uid = s.uid WHERE s.sid = :sid", array(':sid' => $sid))->fetchObject();
   }
 
   // We found the client's session record and they are an authenticated,
   // active user.
   if ($user && $user->uid > 0 && $user->status == 1) {
-    // This is done to unserialize the data member of $user.
-    $user->data = unserialize($user->data);
-
     // Add roles element to $user.
     $user->roles = array();
     $user->roles[DRUPAL_AUTHENTICATED_RID] = 'authenticated user';
     $user->roles += db_query("SELECT r.rid, r.name FROM {role} r INNER JOIN {users_roles} ur ON ur.rid = r.rid WHERE ur.uid = :uid", array(':uid' => $user->uid))->fetchAllKeyed(0, 1);
   }
+  // The user is anonymous or blocked. Only preserve two fields from the
+  // {sessions} table.
   elseif ($user) {
-    // The user is anonymous or blocked. Only preserve two fields from the
-    // {sessions} table.
     $account = drupal_anonymous_user();
     $account->session = $user->session;
     $account->timestamp = $user->timestamp;
     $user = $account;
   }
+  // The session has expired.
   else {
-    // The session has expired.
     $user = drupal_anonymous_user();
     $user->session = '';
   }
