diff --git a/spaces_og/spaces_og.module b/spaces_og/spaces_og.module
index 38c8146..c49eeeb 100644
--- a/spaces_og/spaces_og.module
+++ b/spaces_og/spaces_og.module
@@ -225,6 +225,66 @@ function spaces_og_perm() {
 }
 
 /**
+ * Directly gets a variable from the database for a group.
+ *
+ * DO NOT USE. This is only for operations where spaces_load can't be used.
+ *
+ * @param $id
+ *   Id of a group
+ * @param $name
+ *   Name of the variable to get.
+ * @param $unserialize
+ *   Whether to unserialize the variable.
+ *
+ * @return
+ *   The current value for given group else null. 
+ */
+function _spaces_og_variable_get($id, $name, $unserialize = TRUE) {
+  $value = db_result(db_query('SELECT value FROM {spaces_overrides} WHERE type = "og" AND id = "%s" AND  object_type = "variable" AND object_id = "%s"', $id, $name));
+  return $value ? ($unserialize ? unserialize($value) : $value) : NULL;
+}
+
+/**
+ * Directly sets a variable to the database for a group.
+ *
+ * DO NOT USE. This is only for operations where spaces_load can't be used.
+ *
+ * @param $id
+ *   Id of a group
+ * @param $name
+ *   Name of the variable to set.
+ * @param $value
+ *   The value to set variable to.
+ * @param $skip_exists_check
+ *   Skip the check if variable exists; optomization for use during inserts.
+ */
+function _spaces_og_variable_set($id, $name, $value, $skip_exist_check = FALSE) {
+  $value = serialize($value);
+  if (!$skip_exist_check && ($current_value = _spaces_og_variable_get($id, $name, FALSE))) {
+    if ($current_value != $value) {
+      db_query('UPDATE {spaces_overrides} SET value = "%s" WHERE type = "og" AND id = "%s" AND object_type = "variable" AND object_id = "%s"', $value, $id, $name);
+    }
+  }
+  else {
+    db_query('INSERT into {spaces_overrides} VALUES ("og", "%s", "variable", "%s", "%s")', $id, $name, $value);
+  }
+}
+
+/**
+ * Gets the value for preset.
+ *
+ * @param $preset
+ *   A fully loaded preset object
+ * @param $name
+ *   Name of a variable to get.
+ * @param $default
+ *   Value to return if not set.
+ */
+function _spaces_og_get_preset_variable($preset, $name, $default) {
+  return isset($preset->value['variable'][$name]) ? $preset->value['variable'][$name] : (variable_get($name, 'not set') !== 'not set' ? variable_get($name, NULL) : $default);
+}
+
+/**
  * Implementation of hook_nodeapi().
  */
 function spaces_og_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
@@ -235,42 +295,54 @@ function spaces_og_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
         $modifier = purl_load(array('id' => isset($node->nid) ? $node->nid : NULL, 'provider' => 'spaces_og'));
         $node->purl = $modifier['value'];
         break;
+      case 'presave':
+        // New group is being added, so no variables exist
+        $preset = !empty($node->spaces_preset_og) ? $node->spaces_preset_og : (!empty($node->nid) ? _spaces_og_variable_get($node->nid, 'spaces_preset_og') : NULL);
+        if (!$preset) {
+          return;
+        }
+        $preset =  spaces_preset_load($preset);
+        if (empty($node->nid)) {
+          // Og settings are directly from preset, fallback to sitewide variable
+          // then fallback to default
+          $node->og_selective = _spaces_og_get_preset_variable($preset, 'spaces_og_selective', OG_OPEN);
+          $node->og_register = _spaces_og_get_preset_variable($preset, 'spaces_og_register', TRUE);
+          $node->og_directory = _spaces_og_get_preset_variable($preset, 'spaces_og_directory', TRUE);
+          $node->og_private = _spaces_og_get_preset_variable($preset, 'spaces_og_private', FALSE);
+          $node->spaces_og_update_privacy = FALSE;
+        }
+        // Node is being updated, setting may have been overriden.
+        else {
+          $node->og_selective = _spaces_og_variable_get($node->nid, 'spaces_og_selective');
+          $node->og_selective = isset($node->og_selective) ? $node->og_selective : _spaces_og_get_preset_variable($preset, 'spaces_og_selective', OG_OPEN);
+          $node->og_register = _spaces_og_variable_get($node->nid, 'spaces_og_register');
+          $node->og_register = isset($node->og_register) ? $node->og_register : _spaces_og_get_preset_variable($preset, 'spaces_og_register', TRUE);
+          $node->og_directory = _spaces_og_variable_get($node->nid, 'spaces_og_directory');
+          $node->og_directory =  isset($node->og_directory) ? $node->og_directory : _spaces_og_get_preset_variable($preset, 'spaces_og_directory', TRUE);
+          $node->og_private = _spaces_og_variable_get($node->nid, 'spaces_og_private');
+          $node->og_private = isset($node->og_private) ? $node->og_private : _spaces_og_get_preset_variable($preset, 'spaces_og_private', FALSE);
+          $old_node = node_load($node->nid);
+          $node->spaces_og_update_privacy = $node->og_private != $old_node->og_private;
+        }
+        break;
       case 'insert':
       case 'update':
-        $space = spaces_load('og', $node->nid, TRUE);
-        if ($space) {
-          // Save preset values.
-          if (!empty($node->spaces_preset_og)) {
-            $space->controllers->variable->set('spaces_preset_og', $node->spaces_preset_og);
-          }
-          // Configure OG directly from space object as node_save() may be
-          // called from outside of actual group space.
-          $selective = $space->controllers->variable->get('spaces_og_selective');
-          $node->og_selective = $selective === NULL ? OG_OPEN : $selective;
-          $register = $space->controllers->variable->get('spaces_og_register');
-          $node->og_register = $register === NULL ? TRUE : $register;
-          $directory = $space->controllers->variable->get('spaces_og_directory');
-          $node->og_directory = $directory === NULL ? TRUE : $directory;
-          $private = $space->controllers->variable->get('spaces_og_private');
-          if ($private === NULL) {
-            $private = FALSE;
+        if (!empty($node->spaces_preset_og)) {
+          _spaces_og_variable_set($node->nid, 'spaces_preset_og', $node->spaces_preset_og, $op == 'insert');
+        }
+        if ($op == 'update' && !empty($node->privacy_changed)) {
+          // Privacy has changed, update og_public flags, and queue a rebuid.
+          db_query("UPDATE {og_access_post} og_p 
+                    INNER JOIN {og_ancestry} og_a ON og_p.nid = og_a.nid
+                    INNER JOIN {node} n ON og_p.nid = n.nid
+                    SET og_public = %d WHERE og_a.group_nid = %d",
+                    !$private, $node->nid);
+          if (!empty($node->spaces_og_update_privacy) && module_exists('og_node_access')) {
+            og_node_access_needs_rebuild($node->nid);
           }
-          if ($op == 'update' && $private != $node->og_private) {
-            // Privacy has changed, update og_public flags, and queue a rebuid.
-            db_query("UPDATE {og_access_post} og_p 
-                      INNER JOIN {og_ancestry} og_a ON og_p.nid = og_a.nid
-                      INNER JOIN {node} n ON og_p.nid = n.nid
-                      SET og_public = %d WHERE og_a.group_nid = %d",
-                      !$private, $node->nid);
-            if (module_exists('og_node_access')) {
-              og_node_access_needs_rebuild($node->nid);
-            }
-            else {
-              node_access_needs_rebuild(TRUE);
-            }
+          else {
+            node_access_needs_rebuild(TRUE);
           }
-          $node->og_private = $private;
-          og_update_group($node);
         }
 
         // Save PURL modifier.
