diff --git a/spaces_og/plugins/space_og.inc b/spaces_og/plugins/space_og.inc
index 1b1e473..3318cc0 100644
--- a/spaces_og/plugins/space_og.inc
+++ b/spaces_og/plugins/space_og.inc
@@ -125,7 +125,7 @@ class space_og extends space_type_purl {
         $form = !isset($node->nid) || isset($node->date) ? TRUE : FALSE;
 
         // Group node
-        if (og_is_group_type($node->type)) {
+        if (og_is_group_type('node', $node->type)) {
           // Don't make new groups from within a group space.
           if (!isset($node->nid) && $this->active) {
             $this->deactivate();
@@ -138,7 +138,8 @@ class space_og extends space_type_purl {
           }
         }
         // Group enabled node, route to correct group context.
-        else if (!og_is_omitted_type($node->type) && !empty($node->og_groups)) {
+        // TODO verify that this sufficiently replaces the og_is_omitted_type() function.
+        else if ((variable_get('og_group_type_' . $node->type) != 'omitted') && !empty($node->og_groups)) {
           // If the node belongs to the current active group space, or we're in an allowable other space type, pass thru
           if ($this->active && in_array($this->id, $node->og_groups)) {
             return;
@@ -171,7 +172,7 @@ class space_og extends space_type_purl {
    * Check that the current menu node object is also a group node.
    */
   function group_node_admin_access($node) {
-    if ($node && og_is_group_type($node->type)) {
+    if ($node && og_is_group_type('node', $node->type)) {
       return $this->admin_access();
     }
     return FALSE;
diff --git a/spaces_og/spaces_og.module b/spaces_og/spaces_og.module
index 6330a39..04b806a 100644
--- a/spaces_og/spaces_og.module
+++ b/spaces_og/spaces_og.module
@@ -203,7 +203,7 @@ function spaces_og_menu_alter(&$items) {
  * Prevents items from showing up under node types that are not groups.
  */
 function spaces_og_access_admin($node) {
-  return og_is_group_type($node->type) ? spaces_access_admin() : FALSE;
+  return og_is_group_type('node', $node->type) ? spaces_access_admin() : FALSE;
 }
 
 /**
@@ -232,101 +232,133 @@ function spaces_og_permission() {
 }
 
 /**
- * Implements hook_nodeapi().
+ * Implements hook_node_load().
  */
-function spaces_og_nodeapi_OLD(&$node, $op, $teaser = NULL, $page = NULL) {
-  // TODO Remaining code in this function needs to be moved to the appropriate new hook function.
-  // Groups
-  if (og_is_group_type($node->type)) {
-    switch ($op) {
-      case 'load':
-        $modifier = purl_load(array('id' => isset($node->nid) ? $node->nid : NULL, 'provider' => 'spaces_og'));
-        $node->purl = $modifier['value'];
-        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 ($op == 'update' && $private != $node->og_private) {
-            // Privacy has changed, update og_public flags, and queue a rebuid.
-            // TODO Please convert this statement to the D7 database API syntax.
-            /* 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) */
-            NULL;
-            node_access_needs_rebuild(TRUE);
-          }
-          $node->og_private = $private === NULL ? FALSE : $private;
-          og_update_group($node);
+function spaces_og_node_load($nodes, $types) {
+  foreach ($types as $type) {
+    if (og_is_group_type('node', $type)) {
+      foreach ($nodes as $node) {
+        if (og_is_group_type('node', $node->type)) {
+          $modifier = purl_load(array('id' => isset($node->nid) ? $node->nid : NULL, 'provider' => 'spaces_og'));
+          $node->purl = $modifier['value'];
         }
+      }
+    }
+  }
+}
 
-        // Save PURL modifier.
-        $modifier = array(
-          'provider' => 'spaces_og',
-          'id' => $node->nid,
-        );
-        if (is_array($node->purl) && !empty($node->purl['value'])) {
-          $modifier['value'] = $node->purl['value'];
-          purl_save($modifier);
-        }
-        else if (empty($node->purl)) {
-          $modifier['value'] = "{$node->type}-{$node->nid}";
-          purl_save($modifier);
-        }
-        break;
-      case 'delete':
-        spaces_delete('og', $node->nid);
-        purl_delete(array('provider' => 'spaces_og', 'id' => $node->nid));
-        break;
+/**
+ * Implements hook_node_insert().
+ */
+function spaces_og_node_insert($node) {
+  spaces_og_node_update($node, 'insert');
+}
+
+/**
+ * Implements hook_node_update().
+ */
+function spaces_og_node_update($node, $op = 'update') {
+  if (og_is_group_type('node', $node->type)) {
+    $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 ($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);
+        node_access_needs_rebuild(TRUE);
+      }
+      $node->og_private = $private === NULL ? FALSE : $private;
+      og_update_group($node);
+    }
+
+    // Save PURL modifier.
+    $modifier = array(
+      'provider' => 'spaces_og',
+      'id' => $node->nid,
+    );
+    if (is_array($node->purl) && !empty($node->purl['value'])) {
+      $modifier['value'] = $node->purl['value'];
+      purl_save($modifier);
+    }
+    else if (empty($node->purl)) {
+      $modifier['value'] = "{$node->type}-{$node->nid}";
+      purl_save($modifier);
     }
   }
-  // Nodes in groups
-  else if (!og_is_omitted_type($node->type)) {
-    switch ($op) {
-      case 'validate':
-        // Enforce groups for OG. OG enforces audiences via required form
-        // elements that Spaces removes.
-        // @see og_form_add_og_audience()
-        // @see _spaces_og_form_alter_node()
-        if (variable_get('og_audience_required', FALSE) && empty($node->og_groups)) {
-          if (isset($node->spaces_og_audience) && ((int) $node->spaces_og_audience !== 0)) {
-            $node->og_groups[$node->spaces_og_audience] = $node->spaces_og_audience;
-          }
-          else {
-            // @todo This error will leave none 'administer nodes' users in a
-            // dead end. Ideally, access should be restricted on the menu
-            // level.
-            form_set_error('spaces_og_audience', t('This content type must be posted in a group.'));
-          }
-        }
-        break;
-      case 'prepare':
-      case 'presave':
-        $space = spaces_get_space();
-        if ($space && $space->type == 'og') {
-          _spaces_og_enforce_privacy($space->id, $node);
-        }
-        else if (!empty($node->og_groups)) {
-          _spaces_og_enforce_privacy(current($node->og_groups), $node);
-        }
-        if (isset($node->spaces_og_audience) && ((int) $node->spaces_og_audience !== 0)) {
-          $node->og_groups[$node->spaces_og_audience] = $node->spaces_og_audience;
-        }
-        break;
+}
+
+/**
+ * Implements hook_node_delete().
+ */
+function spaces_og_node_delete($node) {
+  if (og_is_group_type('node', $node->type)) {
+    spaces_delete('og', $node->nid);
+    purl_delete(array('provider' => 'spaces_og', 'id' => $node->nid));
+  }
+}
+
+/**
+ * Implements hook_node_validate().
+ *
+ * Enforce groups for OG. OG enforces audiences via required form
+ * elements that Spaces removes.
+ * @see og_form_add_og_audience()
+ * @see _spaces_og_form_alter_node()
+ */
+function spaces_og_node_validate($node, $form, &$form_state) {
+  if (variable_get('og_group_type_' . $node->type, 'omitted') != 'omitted') {
+    // TODO verify that this sufficiently replaces the og_is_omitted_type() function.
+    if (variable_get('og_audience_required', FALSE) && empty($node->og_groups)) {
+      if (isset($node->spaces_og_audience) && ((int) $node->spaces_og_audience !== 0)) {
+        $node->og_groups[$node->spaces_og_audience] = $node->spaces_og_audience;
+      }
+      else {
+        // @todo This error will leave none 'administer nodes' users in a
+        // dead end. Ideally, access should be restricted on the menu
+        // level.
+        form_set_error('spaces_og_audience', t('This content type must be posted in a group.'));
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_node_prepare().
+ */
+function spaces_og_node_prepare($node) {
+  spaces_og_node_presave($node);
+}
+
+/**
+ * Implements hook_node_presave().
+ */
+function spaces_og_node_presave($node) {
+  if (variable_get('og_group_type_' . $node->type, 'omitted') != 'omitted') {
+    // TODO verify that this sufficiently replaces the og_is_omitted_type() function.
+    $space = spaces_get_space();
+    if ($space && $space->type == 'og') {
+      _spaces_og_enforce_privacy($space->id, $node);
+    }
+    else if (!empty($node->og_groups)) {
+      _spaces_og_enforce_privacy(current($node->og_groups), $node);
+    }
+    if (isset($node->spaces_og_audience) && ((int) $node->spaces_og_audience !== 0)) {
+      $node->og_groups[$node->spaces_og_audience] = $node->spaces_og_audience;
     }
   }
 }
@@ -347,7 +379,7 @@ function spaces_og_form_ctools_export_ui_edit_item_form_alter(&$form, $form_stat
 function spaces_og_form_node_delete_confirm_alter(&$form, $form_state) {
   module_load_include('inc', 'spaces_og', 'spaces_og.pages');
   $node = node_load($form['nid']['#value']);
-  if (og_is_group_type($node->type)) {
+  if (og_is_group_type('node', $node->type)) {
     $form['#submit'][] = '_spaces_og_node_delete_confirm_submit';
   }
   elseif (og_is_group_post_type($node->type)) {
@@ -366,14 +398,14 @@ function spaces_og_form_node_delete_confirm_alter(&$form, $form_state) {
  * Implements hook_form_alter().
  */
 function spaces_og_form_alter(&$form, $form_state, $form_id) {
-  if ($form['#id'] == 'node-form' && (arg(0) . '/' . arg(1) != 'admin/content')) {
+  if (!empty($form['#node_edit_form']) && (arg(0) . '/' . arg(1) != 'admin/content')) {
     // Group nodes
-    if (og_is_group_type($form['#node']->type)) {
+    if (og_is_group_type('node', $form['type']['#value'])) {
       module_load_include('inc', 'spaces_og', 'spaces_og.pages');
       _spaces_og_form_alter_group($form, $form_state);
     }
     // Group enabled content types
-    else if (!og_is_omitted_type($form['#node']->type)) {
+    elseif (variable_get('og_group_type_' . $form['type']['#value'], 'omitted') != 'omitted') {
       module_load_include('inc', 'spaces_og', 'spaces_og.pages');
       _spaces_og_form_alter_node($form, $form_state);
     }
