diff --git a/includes/base.inc b/includes/base.inc
index 7522d9f..f728dc2 100644
--- a/includes/base.inc
+++ b/includes/base.inc
@@ -75,11 +75,26 @@ class views_object {
    * Unpack options over our existing defaults, drilling down into arrays
    * so that defaults don't get totally blown away.
    */
-  function unpack_options(&$storage, $options, $definition = NULL, $check = TRUE) {
+  function unpack_options(&$storage, $options, $definition = NULL, $check = TRUE, $level = 0) {
     if ($check && !is_array($options)) {
       return;
     }
 
+    if ($level == 0) {
+      $cid = 'unpack_options:' . $this->view->name;
+      $id = md5(serialize(array($this->options, $options)));
+      if (empty($cache[$cid])) {
+        $cache[$cid] = views_cache_get($cid, TRUE);
+      }
+      if (isset($cache[$cid]->data[$id])) {
+        $storage = $cache[$cid]->data[$id];
+        return;
+      }
+      if (!is_object($cache[$cid])) {
+        $cache[$cid] = new stdClass();
+      }
+    }
+
     if (!isset($definition)) {
       $definition = $this->option_definition();
     }
@@ -90,7 +105,7 @@ class views_object {
           $storage[$key] = array();
         }
 
-        $this->unpack_options($storage[$key], $value, isset($definition[$key]['contains']) ? $definition[$key]['contains'] : array(), FALSE);
+        $this->unpack_options($storage[$key], $value, isset($definition[$key]['contains']) ? $definition[$key]['contains'] : array(), FALSE), $level+1;
       }
       else if (!empty($definition[$key]['translatable']) && !empty($value)) {
         $storage[$key] = t($value);
@@ -99,6 +114,10 @@ class views_object {
         $storage[$key] = $value;
       }
     }
+    if ($level == 0) {
+      views_late_cache_set_merge_locked($cid, $id, $storage);
+      $cache[$cid]->data[$id] = $storage;
+    }
   }
 
   /**
@@ -125,3 +144,30 @@ class views_object {
     }
   }
 }
+
+function views_late_cache_set_merge_locked($cid = NULL, $key = NULL, $data = NULL) {
+  static $values;
+  static $registered;
+
+  if (!empty($cid)) {
+    $values[$cid][$key] = $data;
+    if (empty($registered)) {
+      $registered = TRUE;
+      register_shutdown_function('views_late_cache_set_merge_locked');
+    }
+    return;
+  }
+
+  foreach ($values as $cid => $set) {
+    $lock_name = 'views_late_cache_set_merge_locked:' . $cid;
+    if (!lock_acquire($lock_name)) {
+      return;
+    }
+    $cached_data = views_cache_get($cid, TRUE);
+    if (!empty($cached_data->data)) {
+      $set = array_merge($cached_data->data, $set);
+    }
+    views_cache_set($cid, $set, TRUE);
+    lock_release($lock_name);
+  }
+}
