See: http://drupal.org/node/650008

diff -Nurp ../conditional_fields.orig/conditional_fields.module ./conditional_fields.module
--- ../conditional_fields.orig/conditional_fields.module	2010-04-20 09:03:46.000000000 -0500
+++ ./conditional_fields.module	2010-04-20 09:05:38.000000000 -0500
@@ -535,6 +535,27 @@ function conditional_fields_forms_submit
 }
 
 /**
+ * Return a single-depth array of all fieldsets within the $form
+ * Due to recursive, the results are stored in the $fieldsets parameter
+ * This will produce a smaller array that can be searched through with less overhead
+ */
+function conditional_fields_node_editing_form_get_fieldgroups(&$form, &$fieldsets){
+  foreach ($form as $form_key => $form_field){
+    if (is_array($form[$form_key])){
+      if (array_key_exists('#type', $form[$form_key])){
+        if (strcasecmp($form[$form_key]['#type'], "fieldset") == 0){
+          // The fieldset fields must map to the original form fields
+          // This allows for modifying the values without having to do a recursive search again
+          $fieldsets[$form_key] = & $form[$form_key];
+
+          conditional_fields_node_editing_form_get_fieldgroups($form[$form_key], $fieldsets);
+        }
+      }
+    }
+  }
+}
+
+/**
  * Alteration of the node editing form
  */
 function conditional_fields_node_editing_form(&$form, $form_state) {
@@ -548,13 +569,37 @@ function conditional_fields_node_editing
   // Remove from data fields that user can't edit
   // and apply orphaned fields settings
   $orphaned_settings = variable_get('c_fields_edit_' . $type_name, C_FIELDS_ORPHANED_SHOW_TRIGGERED);
+
+  // Find all fieldsets in the form array via a recursive function
+  // Doing this is better than recursively walking the $form array foreach field in the $data array
+  $fieldsets = array();
+  conditional_fields_node_editing_form_get_fieldgroups($form, $fieldsets);
+
   foreach ($data as $key => $field) {
     // Store group name or FALSE if no group
     $field['in_group'] = conditional_fields_get_group($type_name, $field['field_name']);
 
     // First check access
-    if ((!$field['in_group'] && $form[$field['field_name']]['#access'] === FALSE) ||
-        ($field['in_group'] && $form[$field['in_group']][$field['field_name']]['#access'] == FALSE)) {
+    if (!empty($field['in_group'])){
+      // To support nested fieldgroups, iterate into each fieldgroup until no fieldgroup children exists
+      $found_group = NULL;
+
+      foreach ($fieldsets as $fieldsets_key => $fieldsets_field){
+        if (array_key_exists($field['field_name'], $fieldsets[$fieldsets_key])){
+          $found_group = $fieldsets[$fieldsets_key];
+        }
+      }
+
+      if (isset($found_group) && array_key_exists($field['field_name'], $found_group)){
+        if ($found_group[$field['field_name']]['#access'] == FALSE){
+          unset($data[$key]);
+          continue;
+        }
+      } else {
+        unset($data[$key]);
+        continue;
+      }
+    } else if ($form[$field['field_name']]['#access'] === FALSE){
       unset($data[$key]);
       continue;
     }
@@ -573,22 +618,21 @@ function conditional_fields_node_editing
         // Check if the controlling field is in form
         // If not, unset controlled field
         if ($field['control_field_in_group']) {
-          if (!$form[$field['control_field_in_group']][$field['control_field_name']]  ||
-            $form[$field['control_field_in_group']][$field['control_field_name']]['#type'] == 'markup' ||
-            $form[$field['control_field_in_group']][$field['control_field_name']]['#access'] == FALSE) {
-            if (!$show_triggered || 
+          if (!$found_group[$field['control_field_name']] ||
+            $found_group[$field['control_field_name']]['#type'] == 'markup' ||
+            $found_group[$field['control_field_name']]['#access'] == FALSE) {
+            if (!$show_triggered ||
                 !conditional_fields_is_triggered($form[$field['control_field_name']]['#value'], $field['trigger_values'])) {
-              unset($form[$field['control_field_in_group']][$field['field_name']]);
+              unset($found_group [$field['field_name']]);
               unset($data[$key]);
             }
-            
           }
         }
         else {
           if (!$form[$field['control_field_name']] ||
             $form[$field['control_field_name']]['#type'] == 'markup' ||
             $form[$field['control_field_name']]['#access'] == FALSE) {
-            if (!$show_triggered || 
+            if (!$show_triggered ||
                 !conditional_fields_is_triggered($form[$field['control_field_name']]['#value'], $field['trigger_values'])) {
               unset($form[$field['field_name']]);
               unset($data[$key]);
@@ -607,6 +651,8 @@ function conditional_fields_node_editing
     return;
   }
 
+  watchdog('debug', "DATA? " . print_r($data, TRUE));
+
   // We build a javascript variable:
   // - 'controlling_fields' -> An object contaninig all ids of controlling fields, with their controlled fields and groups
   // To do: look if we should make this themeable
@@ -626,57 +672,57 @@ function conditional_fields_node_editing
   // Here we also add enclosing divs for easier javascript handling to controlling fields and to controlled fields and groups
   $required_fields = array();
 
-  foreach (element_children($form) as $element) {
+  foreach (element_children($fieldsets) as $element) {
     // Fields
     if (strpos($element , 'field_') === 0) {
-      if ($form[$element]['#theme'] == 'content_multiple_values') {
-        $form[$element]['#conditional_fields_multiple'] = TRUE;
+      if ($fieldsets[$element]['#theme'] == 'content_multiple_values') {
+        $fieldsets[$element]['#conditional_fields_multiple'] = TRUE;
       }
       if ($controlling_fields[$element]) {
-        $form[$element]['#controlling_field'] = $element;
-        $form[$element]['#theme'] = array('conditional_fields_form_item');
+        $fieldsets[$element]['#controlling_field'] = $element;
+        $fieldsets[$element]['#theme'] = array('conditional_fields_form_item');
       }
       elseif ($controlled_fields[$element]) {
-        if ($form[$element]['#required']) {
+        if ($fieldsets[$element]['#required']) {
           conditional_fields_unset_required_field($form[$element]);
           $required_fields[$element] = array('field' => $element);
         }
-        $form[$element]['#controlled_field'] = $element;
-        $form[$element]['#theme'] = array('conditional_fields_form_item');
+        $fieldsets[$element]['#controlled_field'] = $element;
+        $fieldsets[$element]['#theme'] = array('conditional_fields_form_item');
       }
     }
     elseif (strpos($element , 'group_') === 0) {
       // Groups
       if ($controlled_fields[$element]) {
         // Group markup is still hardcoded.
-        $form[$element]['#prefix'] = '<div id="conditional-' . conditional_fields_form_clean_id($element) . '" class="conditional-field controlled-field">' . $form[$element]['#prefix'];
-        $form[$element]['#suffix'] = $form[$element]['#suffix'] . '</div>';
+        $fieldsets[$element]['#prefix'] = '<div id="conditional-' . conditional_fields_form_clean_id($element) . '" class="conditional-field controlled-field">' . $fieldsets[$element]['#prefix'];
+        $fieldsets[$element]['#suffix'] = $fieldsets[$element]['#suffix'] . '</div>';
       }
       // Fields in groups
-      foreach (element_children($form[$element]) as $group_element) {
+      foreach (element_children($fieldsets[$element]) as $group_element) {
         // All required fields inside a conditional group must be handled by conditional fields
-        if ($controlled_fields[$element] && $form[$element][$group_element]['#required']) {
-          conditional_fields_unset_required_field($form[$element][$group_element]);
+        if ($controlled_fields[$element] && $fieldsets[$element][$group_element]['#required']) {
+          conditional_fields_unset_required_field($fieldsets[$element][$group_element]);
           $required_fields[$group_element] = array('field' => $group_element, 'in_group' => $element);
-          $form[$element][$group_element]['#theme'] = array('conditional_fields_form_item');
+          $fieldsets[$element][$group_element]['#theme'] = array('conditional_fields_form_item');
         }
         // Manage also conditional fields inside normal groups
         if ($controlling_fields[$group_element]) {
-          $form[$element][$group_element]['#controlling_field'] = $group_element;
-          $form[$element][$group_element]['#theme'] = array('conditional_fields_form_item');
+          $fieldsets[$element][$group_element]['#controlling_field'] = $group_element;
+          $fieldsets[$element][$group_element]['#theme'] = array('conditional_fields_form_item');
         }
         elseif ($controlled_fields[$group_element]) {
           // Manage multiple ahah fields
-          if ($form[$element][$group_element]['#theme'] == 'content_multiple_values') {
-            $form[$element][$group_element]['#conditional_fields_multiple'] = TRUE;
+          if ($fieldsets[$element][$group_element]['#theme'] == 'content_multiple_values') {
+            $fieldsets[$element][$group_element]['#conditional_fields_multiple'] = TRUE;
           }
-          
-          if ($form[$element][$group_element]['#required']) {
-            conditional_fields_unset_required_field($form[$element][$group_element]);
+
+          if ($fieldsets[$element][$group_element]['#required']) {
+            conditional_fields_unset_required_field($fieldsets[$element][$group_element]);
             $required_fields[$group_element] = array('field' => $group_element, 'in_group' => $element);
           }
-          $form[$element][$group_element]['#controlled_field'] = $group_element;
-          $form[$element][$group_element]['#theme'] = array('conditional_fields_form_item');
+          $fieldsets[$element][$group_element]['#controlled_field'] = $group_element;
+          $fieldsets[$element][$group_element]['#theme'] = array('conditional_fields_form_item');
         }
       }
     }
