diff --git a/mongodb_field_storage/mongodb_field_storage.install b/mongodb_field_storage/mongodb_field_storage.install
index 6537737..254cf7f 100644
--- a/mongodb_field_storage/mongodb_field_storage.install
+++ b/mongodb_field_storage/mongodb_field_storage.install
@@ -14,3 +14,48 @@ function mongodb_field_storage_install() {
 function mongodb_field_storage_disable() {
   variable_del('field_storage_default');
 }
+
+/**
+ * Update users to ensure their roles are saved to the user collection.
+ *
+ * Changes made to the session ensure that roles are saved to user accounts.
+ * However, user accounts may not have been stored with roles prior to this
+ * change and therefore those users will encounter access denied messages.
+ * This update will resave accounts with roles to ensure users have proper
+ * access.
+ */
+function mongodb_field_storage_update_7100(&$sandbox) {
+  // Initialize the batch process.
+  if (!isset($sandbox['progress'])) {
+    $sandbox['progress'] = 0;
+    $sandbox['query']['_id']['$gt'] = 0;
+  }
+
+  // Get a user account to update.
+  $uids = mongodb_collection('fields_current', 'user')
+    ->find($sandbox['query'], array('_id' => 1))
+    ->sort(array('_id' => 1))
+    ->limit(1);
+
+  // Break point if we run out of users to work on.
+  $continue = $uids->hasNext();
+
+  // Perform the user update.
+  foreach ($uids as $uid) {
+    if (isset($uid['_id'])) {
+      $user = user_load($uid['_id']);
+      if ($user) {
+        user_save($user);
+      }
+      $sandbox['query']['_id']['$gt'] = $uid['_id'];
+    }
+    $sandbox['progress']++;
+  }
+
+  $sandbox['#finished'] = 0;
+  // If we hit the count or run out of users, then stop.
+  if (!$continue) {
+    $sandbox['#finished'] = 1;
+    return t('%num user accounts were updated.', array('%num' => $sandbox['progress']));
+  }
+}
\ No newline at end of file
diff --git a/mongodb_field_storage/mongodb_field_storage.module b/mongodb_field_storage/mongodb_field_storage.module
index 4a405d0..cfb0c80 100644
--- a/mongodb_field_storage/mongodb_field_storage.module
+++ b/mongodb_field_storage/mongodb_field_storage.module
@@ -192,6 +192,19 @@ function mongodb_field_storage_field_storage_write($entity_type, $entity, $op, $
     }
     $new_entity->$field_name = empty($field_values) ? NULL : $field_values;
   }
+  
+  // Preserve user roles.
+  if ($entity_type == 'user') {
+    $roles = user_roles(TRUE);
+    foreach ($entity->roles as $rid => $name) {
+      if (is_numeric($name)) {
+        $new_entity->roles[$rid] = $roles[$name];
+      }
+      else {
+        $new_entity->roles[$rid] = $name;
+      }
+    }
+  }
 
   // Save the object.
   $collection = mongodb_collection('fields_current', $entity_type);
diff --git a/mongodb_session/mongodb_session.inc b/mongodb_session/mongodb_session.inc
index 5abefae..610180f 100644
--- a/mongodb_session/mongodb_session.inc
+++ b/mongodb_session/mongodb_session.inc
@@ -104,14 +104,6 @@ function _drupal_session_read($sid) {
   $collection = mongodb_collection('fields_current', 'user');
   $user = (object) $collection->findOne(array('_id' => $session['uid']));
 
-  if (!isset($user->uid)) {
-    $user = db_query("SELECT * FROM {users} u WHERE uid = :uid", array(':uid' => $session['uid']))->fetchObject();
-    // Add roles element to $user and insert an entry into fields_current.user
-    // so next time we get it from Mongo.
-    include_once dirname(__FILE__) . '/mongodb_session.module';
-    $user->roles = array();
-    $user->roles = mongodb_session_user_insert(array(), $user);
-  }
   // We found the client's session record and they are an authenticated,
   // active user.
   if ($session && !empty($session['uid']) && $user->status == 1) {
