diff -uNr cck_fieldgroup_tabs_orig/cck_fieldgroup_tabs.module cck_fieldgroup_tabs/cck_fieldgroup_tabs.module
--- cck_fieldgroup_tabs_orig/cck_fieldgroup_tabs.module	2010-01-18 02:08:46.000000000 -0500
+++ cck_fieldgroup_tabs/cck_fieldgroup_tabs.module	2010-02-19 17:23:49.000000000 -0500
@@ -31,8 +31,8 @@
     $form['settings']['form']['style']['#options']['tabs'] = t('tabs');
   }
   elseif ($form_id == 'node_type_form' && $form['#node_type']->type && !$form['#programmed']) {
-    $form += cck_fieldgroup_tabs_node_type_form($form['#node_type']->type);
-  }  
+    cck_fieldgroup_tabs_node_type_form($form, $form['#node_type']->type);
+  }
 }
 
 /*
@@ -53,15 +53,18 @@
 /*
  * Settings for content type forms.
  */
-function cck_fieldgroup_tabs_node_type_form($node_type) {
-  $form = array();
-  $form['cck_fieldgroup_tabs'] = array(
+function cck_fieldgroup_tabs_node_type_form(&$form, $node_type) {
+  if(!isset($form['cck_fieldgroup_tabs'])) {
+    $form['cck_fieldgroup_tabs'] = array();
+  }
+  $form['cck_fieldgroup_tabs'] = array_merge(array(
     '#type' => 'fieldset',
     '#title' => t('CCK Fieldgroup Tabs'),
     '#collapsible' => TRUE,
     '#collapsed' => TRUE,
     '#description' => t('CCK Fieldgroup Tabs with residual fields not in fieldgroup tabs in a Basics Tab.'),
-  );
+  ),
+  $form['cck_fieldgroup_tabs']);
   $form['cck_fieldgroup_tabs']['cck_fieldgroup_tabs_residual_title'] = array(
     '#type' => 'textfield',
     '#title' => t('Name of default basic tab'),
@@ -74,7 +77,6 @@
     '#description' => t('Text to display above the tabset on content display.'),
     '#default_value' => variable_get('cck_fieldgroup_tabs_description_' . $node_type, ''),
   );
-  return $form;
 }
 
 /*
@@ -112,7 +114,7 @@
       // Add residual content to a tab if desired.
       $residual = array(
         '#type' => 'tabpage',
-        // Pass the value through t() if needed.
+      // Pass the value through t() if needed.
         '#title' =>  t(variable_get('cck_fieldgroup_tabs_residual_title_'. $node_type, '')),
         '#weight' => content_extra_field_weight($node_type, 'cck_fieldgroup_tabs_residual'),
       );
@@ -132,6 +134,10 @@
 
 /*
  * Implementation of hook_nodeapi().
+ *
+ * Defines two new hooks:
+ * hook_cck_fieldgroup_tabs_add_fieldgroup_tab
+ * hook_cck_fieldgroup_tabs_process_residual
  */
 function cck_fieldgroup_tabs_nodeapi(&$node, $op, $teaser, $page) {
   switch ($op) {
@@ -162,38 +168,64 @@
           else if ($group['weight'] < $node->content['fieldgroup_tabs']['#weight']) {
             $node->content['fieldgroup_tabs']['#weight'] = $group['weight'];
           }
-          $element = $node->content[$group_name]['group'];
-          $element['#type'] = 'tabpage';
-          $element['#weight'] = $group['weight'];
-          $node->content['fieldgroup_tabs'][$group_name] = $element;
-          unset($node->content[$group_name]);
+
+          // Define hook cck_fieldgroup_tabs_add_fieldgroup_tab
+          // to process the content group
+          // The hook returns a reference to the added fieldgroup_tab structure inside the node
+          $addedFieldgroupTabs = module_invoke_all('cck_fieldgroup_tabs_add_fieldgroup_tab', $node, $group_name, $group);
         }
       }
       if (isset($node->content['fieldgroup_tabs'])) {
-        // Add residual content to a tab if desired.
-        if (variable_get('cck_fieldgroup_tabs_residual_title_'. $node->type, FALSE)) {
-          $residual = array(
+        // Define hook cck_fieldgroup_tabs_process_residual
+        // to process residual content not added to tabs
+        // (add it to it's own tab, repeat it, etc.)
+        module_invoke_all('cck_fieldgroup_tabs_process_residual', $node, $addedFieldgroupTabs);
+      }
+      break;
+  }
+}
+
+/*
+ *  Implementation of hook_cck_fieldgroup_tabs_add_fieldgroup_tab().
+ */
+function cck_fieldgroup_tabs_cck_fieldgroup_tabs_add_fieldgroup_tab($node, $group_name, $group) {
+  $addedFieldgroupTabs = array();
+  if ($group['group_type'] != 'multigroup') {
+    // Process a standard fieldgroup
+    $element = $node->content[$group_name]['group'];
+    $element['#type'] = 'tabpage';
+    $element['#weight'] = $group['weight'];
+    $node->content['fieldgroup_tabs'][$group_name] = $element;
+    $addedFieldgroupTabs = &$node->content['fieldgroup_tabs'][$group_name];
+    unset($node->content[$group_name]);
+  }
+  return $addedFieldgroupTabs;
+}
+
+/*
+ *  Implementation of hook_cck_fieldgroup_tabs_process_residual().
+ */
+function cck_fieldgroup_tabs_cck_fieldgroup_tabs_process_residual($node, $addedMultigroupTabStructures) {
+  if (variable_get('cck_fieldgroup_tabs_residual_title_'. $node->type, FALSE)) {
+    $residual = array(
             '#type' => 'tabpage',
             '#title' =>  t(variable_get('cck_fieldgroup_tabs_residual_title_'. $node->type, '')),
             '#weight' => content_extra_field_weight($node->type, 'cck_fieldgroup_tabs_residual'),
-          );
-          foreach (element_children($node->content) as $key) {
-            if ($key != 'fieldgroup_tabs') {
-              $residual[$key] = $node->content[$key];
-              unset($node->content[$key]);
-            }
-          }
-          // Move all #content_extra_fields into the residual tab in order to allow tabs to render them correctly.
-          // #pre-render with alter_extra_weights in the tab is needed to correctly sort the elements.
-          $residual['#content_extra_fields'] = $node->content['#content_extra_fields'];
-          $residual['#pre_render'] = array('content_alter_extra_weights');
-          $key = array_search('content_alter_extra_weights', $node->content['#pre_render']);
-          unset($node->content['#content_extra_fields'], $node->content['#pre_render'][$key]);
-
-          $node->content['fieldgroup_tabs']['fieldgroup_tabs_basic'] = $residual;
-        }
+    );
+    foreach (element_children($node->content) as $key) {
+      if ($key != 'fieldgroup_tabs') {
+        $residual[$key] = $node->content[$key];
+        unset($node->content[$key]);
       }
-      break;
+    }
+    // Move all #content_extra_fields into the residual tab in order to allow tabs to render them correctly.
+    // #pre-render with alter_extra_weights in the tab is needed to correctly sort the elements.
+    $residual['#content_extra_fields'] = $node->content['#content_extra_fields'];
+    $residual['#pre_render'] = array('content_alter_extra_weights');
+    $key = array_search('content_alter_extra_weights', $node->content['#pre_render']);
+    unset($node->content['#content_extra_fields'], $node->content['#pre_render'][$key]);
+
+    $node->content['fieldgroup_tabs']['fieldgroup_tabs_basic'] = $residual;
   }
 }
