diff --git a/mongodb_session/mongodb_session.inc b/mongodb_session/mongodb_session.inc
index a550c2d..9450d5b 100644
--- a/mongodb_session/mongodb_session.inc
+++ b/mongodb_session/mongodb_session.inc
@@ -101,29 +101,22 @@ function _drupal_session_read($sid) {
   else {
     $session = $collection->findOne(array('sid' => $sid));
   }
-    $collection = mongodb_collection('fields_current', 'user');
-    $user = (object) $collection->findOne(array('_id' => $session['uid']));
-
-    if (!isset($user->uid)) {
-      include_once dirname(__FILE__) . '/mongodb_session.module';
-      $user = db_query("SELECT * FROM {users} u WHERE uid = :uid", array(':uid' => $session['uid']))->fetchObject();
-    }
-    // We found the client's session record and they are an authenticated,
-    // active user.
-    if ($session && !empty($session['uid']) && $user->status == 1) {
-      // Add roles element to $user, first we need to include function from
-      // module.
-      include_once dirname(__FILE__) . '/mongodb_session.module';
-      $user->roles = array();
-      $user->roles = mongodb_session_user_insert(array(), $user);
-
-      // If mongodb_fields_storage wrote this user object, we need to update it.
-      if (!isset($user->roles)) {
-        $user->roles = _mongodb_session_get_roles($user);
-        $collection->update(array('_id' => (int) $user->uid), array('$set' => array('roles' => $user->roles)));
-      }
-      $user->session = $session['session'];
-    }
+  $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) {
+    $user->session = $session['session'];
+  }
   // We didn't find the client's record (session has expired), or they are
   // blocked, or they are an anonymous user.
   else {
diff --git a/mongodb_session/mongodb_session.module b/mongodb_session/mongodb_session.module
index 9c94930..cd810cd 100644
--- a/mongodb_session/mongodb_session.module
+++ b/mongodb_session/mongodb_session.module
@@ -19,19 +19,28 @@ function mongodb_session_simpletest_alter(&$groups) {
  */
 function mongodb_session_user_update($edit, $account) {
   // Update field values for changed values of the user.
+  $roles = _mongodb_session_get_roles($account);
+  // If mongodb_field_storage is enabled it will take care of creating
+  // initial user entry just add roles to it.
   if (module_exists('mongodb_field_storage')) {
-    $roles = _mongodb_session_get_roles($account);
-    $save = (array) $account + array(
-      '_id' => (int) $account->uid,
-      '@bundle' => 'user',
-      '@fields' => array(),
-      'roles' => $roles,
+    $save = array(
+      '$set' => array('roles' => $roles)
+    );
+  }
+  else {
+    $save = array(
+      '$set' => (array) $account + array(
+        '_id' => (int) $account->uid,
+        '_bundle' => 'user',
+        'roles' => $roles,
+      ),
     );
     foreach (array('uid', 'created', 'access', 'login', 'status', 'picture') as $key) {
-      $save[$key] = (int) $save[$key];
+      $save['$set'][$key] = (int) $save['$set'][$key];
     }
-    mongodb_collection('fields_current', 'user')->save($save);
   }
+  mongodb_collection('fields_current', 'user')->update(array('_id' => (int) $account->uid), $save, array('upsert' => TRUE));
+  return $roles;
 }

 function mongodb_session_user_insert($edit, $account) {
