diff -rupN cck/content.module cck_new/content.module
--- cck/content.module	2009-08-31 00:16:55.000000000 +1000
+++ content.module	2010-02-26 15:01:19.942935614 +1100
@@ -206,6 +206,9 @@ function content_theme() {
     'content_multiple_values' => array(
       'arguments' => array('element' => NULL),
     ),
+    'content_multiple_value_token' => array(
+      'arguments' => array('items' => array(), 'type' => 'field'),
+    ),
   );
 }
 
@@ -2667,3 +2670,21 @@ function content_inactive_fields($type_n
   }
   return $inactive;
 }
+
+/**
+ * Theme a multiple value token.
+ *
+ * @param $items
+ *   An array of items that make up the token.
+ * @param $type
+ *   The type of multiple value it is.  Either a field or a group.
+ *
+ * @return
+ *   The output of the token.
+ *
+ * @ingroup themable
+ */
+function theme_content_multiple_value_token($items = array(), $type = 'field') {
+  $token = implode("\n", $items);
+  return $token;
+}
\ No newline at end of file
diff -rupN cck/includes/content.token.inc cck_new/includes/content.token.inc
--- cck/includes/content.token.inc	2008-12-06 01:59:22.000000000 +1100
+++ includes/content.token.inc	2010-02-26 15:02:48.019936268 +1100
@@ -46,6 +46,28 @@ function content_token_values($type, $ob
           }
         }
       }
+
+      // If the fieldgroup module is enabled create tokens that properly group values
+      if (module_exists('fieldgroup')) {
+        $groups = fieldgroup_groups($node->type, TRUE, TRUE);
+        foreach ($groups as $group) {
+          $fields = array();
+          $function = $group['group_type'] . '_token_values';
+          foreach ($group['fields'] as $fid => $field) {
+            if ($node->$fid) {
+              $fields[$fid] = $node->$fid;
+              // Add the title so we can use it later
+              $fields[$fid]['#title'] = $node->content[$fid]['field']['#title'];
+            }
+          }
+          if (!empty($fields) && function_exists($function)) {
+            $token_values = $function('group', $fields);
+            foreach ($token_values as $token => $value) {
+              $tokens[$group['group_name'] . '-' . $token] = $value;
+            }
+          }
+        }
+      }
     }
   }
   return $tokens;
@@ -69,6 +91,24 @@ function content_token_list($type = 'all
       }
     }
 
+    // If fieldgroups are enabled do tokens for groups
+    if (module_exists('fieldgroup')) {
+      $group_types = fieldgroup_groups('', TRUE, TRUE);
+      foreach ($group_types as $type) {
+        foreach ($type as $group) {
+          $function = $group['group_type'] . '_token_list';
+          if (function_exists($function)) {
+            $sub_list = $function('group');
+            foreach ($sub_list as $category => $token_list) {
+              foreach ($token_list as $token => $description) {
+                $list['CCK ' . $category][$group['group_name'] . '-' . $token] = $description;
+              }
+            }
+          }
+        }
+      }
+    }
+
     return $list;
   }
 }
@@ -78,12 +118,26 @@ if (module_exists('nodereference')) {
     if ($type == 'field' || $type == 'all') {
       $tokens = array();
 
-      $tokens['node reference']['nid']   = t('Referenced node ID');
-      $tokens['node reference']['title'] = t('Referenced node title');
-      $tokens['node reference']['title-raw'] = t('Referenced node unfiltered title. WARNING - raw user input.');
-      $tokens['node reference']['link']  = t("Formatted html link to the referenced node.");
-      $tokens['node reference']['path']  = t("Relative path alias to the referenced node.");
-      $tokens['node reference']['url']  = t("Absolute path alias to the referenced node.");
+      $tokens['node reference']['nid']           = t('Referenced node ID');
+      $tokens['node reference']['title']         = t('Referenced node title');
+      $tokens['node reference']['title-raw']     = t('Referenced node unfiltered title. WARNING - raw user input.');
+      $tokens['node reference']['link']          = t("Formatted html link to the referenced node.");
+      $tokens['node reference']['path']          = t("Relative path alias to the referenced node.");
+      $tokens['node reference']['url']           = t("Absolute path alias to the referenced node.");
+
+      $tokens['node reference']['nid-#']         = t('Referenced node ID (replace # with the value delta)');
+      $tokens['node reference']['title-#']       = t('Referenced node title (replace # with the value delta)');
+      $tokens['node reference']['title-raw-#']   = t('Referenced node unfiltered title. WARNING - raw user input. (replace # with the value delta)');
+      $tokens['node reference']['link-#']        = t("Formatted html link to the referenced node. (replace # with the value delta)");
+      $tokens['node reference']['path-#']        = t("Relative path alias to the referenced node. (replace # with the value delta)");
+      $tokens['node reference']['url-#']         = t("Absolute path alias to the referenced node. (replace # with the value delta)");
+
+      $tokens['node reference']['nid-all']       = t('Referenced node ID (all values)');
+      $tokens['node reference']['title-all']     = t('Referenced node title (all values)');
+      $tokens['node reference']['title-raw-all'] = t('Referenced node unfiltered title. WARNING - raw user input. (all values)');
+      $tokens['node reference']['link-all']      = t("Formatted html link to the referenced node. (all values)");
+      $tokens['node reference']['path-all']      = t("Relative path alias to the referenced node. (all values)");
+      $tokens['node reference']['url-all']       = t("Absolute path alias to the referenced node. (all values)");
 
       return $tokens;
     }
@@ -94,12 +148,33 @@ if (module_exists('nodereference')) {
       $item = $object[0];
 
       $title = is_numeric($item['nid']) ? _nodereference_titles($item['nid']) : '';
-      $tokens['nid']   = $item['nid'];
-      $tokens['title'] = $title ? check_plain($title) : '';
-      $tokens['title-raw'] = $title;
-      $tokens['link']  = isset($item['view']) ? $item['view'] : '';
-      $tokens['path'] = is_numeric($item['nid']) ? url('node/' . $item['nid']) : '';
-      $tokens['url'] = is_numeric($item['nid']) ? url('node/' . $item['nid'], array('absolute' => TRUE)) : '';
+      $tokens['nid']               = $item['nid'];
+      $tokens['title']             = $title ? check_plain($title) : '';
+      $tokens['title-raw']         = $title;
+      $tokens['link']              = isset($item['view']) ? $item['view'] : '';
+      $tokens['path']              = is_numeric($item['nid']) ? url('node/' . $item['nid']) : '';
+      $tokens['url']               = is_numeric($item['nid']) ? url('node/' . $item['nid'], array('absolute' => TRUE)) : '';
+
+      $all = array();
+      $all['nid'] = $all['title'] = $all['title-raw'] = $all['link'] = $all['path'] = $all['url'] = array();
+      $i = 0;
+      foreach ($object as $item) {
+        $title = is_numeric($item['nid']) ? _nodereference_titles($item['nid']) : '';
+        $tokens['nid-' . $i]       = $all['nid'][]  = $item['nid'];
+        $tokens['title-' . $i]     = $all['title'][] = $title ? check_plain($title) : '';
+        $tokens['title-raw-' . $i] = $all['title-raw'][] = $title;
+        $tokens['link-' . $i]      = $all['link'][] = isset($item['view']) ? $item['view'] : '';
+        $tokens['path-' . $i]      = $all['path'][] = is_numeric($item['nid']) ? url('node/' . $item['nid']) : '';
+        $tokens['url-' . $i]       = $all['url'][]  = is_numeric($item['nid']) ? url('node/' . $item['nid'], array('absolute' => TRUE)) : '';
+        $i++;
+      }
+
+      $tokens['nid-all']           = theme('content_multiple_value_token', $all['nid']);
+      $tokens['title-all']         = theme('content_multiple_value_token', $all['title']);
+      $tokens['title-raw-all']     = theme('content_multiple_value_token', $all['title-raw']);
+      $tokens['link-all']          = theme('content_multiple_value_token', $all['link']);
+      $tokens['path-all']          = theme('content_multiple_value_token', $all['path']);
+      $tokens['url-all']           = theme('content_multiple_value_token', $all['url']);
 
       return $tokens;
     }
@@ -111,8 +186,14 @@ if (module_exists('number')) {
     if ($type == 'field' || $type == 'all') {
       $tokens = array();
 
-      $tokens['number']['raw']       = t('Raw number value');
-      $tokens['number']['formatted'] = t('Formatted number value');
+      $tokens['number']['raw']           = t('Raw number value');
+      $tokens['number']['formatted']     = t('Formatted number value');
+
+      $tokens['number']['raw-#']         = t('Raw, number value (replace # with the value delta)');
+      $tokens['number']['formatted-#']   = t('Formatted number value (replace # with the value delta)');
+
+      $tokens['number']['raw-all']       = t('Raw, number value (all values)');
+      $tokens['number']['formatted-all'] = t('Formatted number value (all values)');
 
       return $tokens;
     }
@@ -122,8 +203,20 @@ if (module_exists('number')) {
     if ($type == 'field') {
       $item = $object[0];
 
-      $tokens['raw']       = $item['value'];
-      $tokens['formatted'] = isset($item['view']) ? $item['view'] : '';
+      $tokens['raw']               = $item['value'];
+      $tokens['formatted']         = isset($item['view']) ? $item['view'] : '';
+
+      $all = array();
+      $all['raw'] = $all['formatted'] = array();
+      $i = 0;
+      foreach ($object as $item) {
+        $tokens['raw-' . $i]       = $all['raw'][]       = $item['value'];
+        $tokens['formatted-' . $i] = $all['formatted'][] = isset($item['view']) ? $item['view'] : '';
+        $i++;
+      }
+
+      $tokens['raw-all']           = theme('content_multiple_value_token', $all['raw']);
+      $tokens['formatted-all']     = theme('content_multiple_value_token', $all['formatted']);
 
       return $tokens;
     }
@@ -135,8 +228,14 @@ if (module_exists('text')) {
     if ($type == 'field' || $type == 'all') {
       $tokens = array();
 
-      $tokens['text']['raw']       = t('Raw, unfiltered text');
-      $tokens['text']['formatted'] = t('Formatted and filtered text');
+      $tokens['text']['raw']           = t('Raw, unfiltered text');
+      $tokens['text']['formatted']     = t('Formatted and filtered text');
+
+      $tokens['text']['raw-#']         = t('Raw, unfiltered text (replace # with the value delta)');
+      $tokens['text']['formatted-#']   = t('Formatted and filtered text (replace # with the value delta)');
+
+      $tokens['text']['raw-all']       = t('Raw, unfiltered text (all values)');
+      $tokens['text']['formatted-all'] = t('Formatted and filtered text (all values)');
 
       return $tokens;
     }
@@ -146,8 +245,21 @@ if (module_exists('text')) {
     if ($type == 'field') {
       $item = $object[0];
 
-      $tokens['raw']  = $item['value'];
-      $tokens['formatted'] = isset($item['view']) ? $item['view'] : '';
+      $tokens['raw']               = $item['value'];
+      $tokens['formatted']         = isset($item['view']) ? $item['view'] : '';
+
+      $all = array();
+      $all['raw'] = $all['formatted'] = array();
+      $i = 0;
+      foreach ($object as $item) {
+        $tokens['raw-' . $i]       = $all['raw'][]       = $item['value'];
+        $tokens['formatted-' . $i] = $all['formatted'][] = isset($item['view']) ? $item['view'] : '';
+        $i++;
+      }
+
+      $tokens['raw-all']           = theme('content_multiple_value_token', $all['raw']);
+      $tokens['formatted-all']     = theme('content_multiple_value_token', $all['formatted']);
+
       return $tokens;
     }
   }
@@ -158,11 +270,23 @@ if (module_exists('userreference')) {
     if ($type == 'field' || $type == 'all') {
       $tokens = array();
 
-      $tokens['user reference']['uid']   = t('Referenced user ID');
-      $tokens['user reference']['name']  = t('Referenced user name');
-      $tokens['user reference']['link']  = t('Formatted HTML link to referenced user');
-      $tokens['user reference']['path']  = t("Relative path alias to the referenced user.");
-      $tokens['user reference']['url']  = t("Absolute path alias to the referenced user.");
+      $tokens['user reference']['uid']      = t('Referenced user ID');
+      $tokens['user reference']['name']     = t('Referenced user name');
+      $tokens['user reference']['link']     = t('Formatted HTML link to referenced user');
+      $tokens['user reference']['path']     = t("Relative path alias to the referenced user.");
+      $tokens['user reference']['url']      = t("Absolute path alias to the referenced user.");
+
+      $tokens['user reference']['uid-#']    = t('Referenced user ID (replace # with the value delta)');
+      $tokens['user reference']['name-#']   = t('Referenced user name (replace # with the value delta)');
+      $tokens['user reference']['link-#']   = t('Formatted HTML link to referenced user (replace # with the value delta)');
+      $tokens['user reference']['path-#']   = t("Relative path alias to the referenced user (replace # with the value delta).");
+      $tokens['user reference']['url-#']    = t("Absolute path alias to the referenced user (replace # with the value delta).");
+
+      $tokens['user reference']['uid-all']  = t('Referenced user ID (all values)');
+      $tokens['user reference']['name-all'] = t('Referenced user name (all values)');
+      $tokens['user reference']['link-all'] = t('Formatted HTML link to referenced user (all values)');
+      $tokens['user reference']['path-all'] = t("Relative path alias to the referenced user (all values).");
+      $tokens['user reference']['url-all']  = t("Absolute path alias to the referenced user (all values).");
 
       return $tokens;
     }
@@ -172,11 +296,87 @@ if (module_exists('userreference')) {
     if ($type == 'field') {
       $item = $object[0];
 
-      $tokens['uid']   = $item['uid'];
-      $tokens['name']  = isset($item['view']) ? strip_tags($item['view']) : '';
-      $tokens['link']  = isset($item['view']) ? $item['view'] : '';
-      $tokens['path'] = is_numeric($item['uid']) ? url('user/' . $item['uid']) : '';
-      $tokens['url'] = is_numeric($item['uid']) ? url('user/' . $item['uid'], array('absolute' => TRUE)) : '';
+      $tokens['uid']          = $item['uid'];
+      $tokens['name']         = isset($item['view']) ? strip_tags($item['view']) : '';
+      $tokens['link']         = isset($item['view']) ? $item['view'] : '';
+      $tokens['path']         = is_numeric($item['uid']) ? url('user/' . $item['uid']) : '';
+      $tokens['url']          = is_numeric($item['uid']) ? url('user/' . $item['uid'], array('absolute' => TRUE)) : '';
+
+      $all = array();
+      $all['uid'] = $all['name'] = $all['link'] = $all['path'] = $all['url'] = array();
+      $i = 0;
+      foreach ($object as $item) {
+        $tokens['uid-' . $i]  = $all['uid'][]  = $item['uid'];
+        $tokens['name-' . $i] = $all['name'][] = isset($item['view']) ? strip_tags($item['view']) : '';
+        $tokens['link-' . $i] = $all['link'][] = isset($item['view']) ? $item['view'] : '';
+        $tokens['path-' . $i] = $all['path'][] = is_numeric($item['uid']) ? url('user/' . $item['uid']) : '';
+        $tokens['url-' . $i]  = $all['url'][]  = is_numeric($item['uid']) ? url('user/' . $item['uid'], array('absolute' => TRUE)) : '';
+        $i++;
+      }
+
+      $tokens['uid-all']      = theme('content_multiple_value_token', $all['uid']);
+      $tokens['name-all']     = theme('content_multiple_value_token', $all['name']);
+      $tokens['link-all']     = theme('content_multiple_value_token', $all['link']);
+      $tokens['path-all']     = theme('content_multiple_value_token', $all['path']);
+      $tokens['url-all']      = theme('content_multiple_value_token', $all['url']);
+
+      return $tokens;
+    }
+  }
+}
+
+if (module_exists('fieldgroup')) {
+  function standard_token_list($type = 'all') {
+    if ($type == 'group' || $type == 'all') {
+      $tokens = array();
+
+      $tokens['fieldgroup']['raw']              = t('Raw, unfiltered text');
+      $tokens['fieldgroup']['formatted']        = t('Formatted and filtered text');
+      $tokens['fieldgroup']['raw-titles']       = t('Raw, unfiltered text with field titles');
+      $tokens['fieldgroup']['formatted-titles'] = t('Formatted and filtered text with field titles');
+
+      return $tokens;
+    }
+  }
+
+  function standard_token_values($type, $object = NULL) {
+    if ($type == 'group') {;
+      $all = array();
+      $all['raw'] = $all['formatted'] = $all['raw-titles'] = $all['formatted-titles'] = array();
+      foreach ($object as $fid => $field) {
+        foreach (element_children($field) as $i) {
+          $item = $field[$i];
+          $field_def = content_fields($fid);
+          switch ($field_def['module']) {
+            case 'number':
+            case 'text':
+            default:
+              $all['raw'][]              = $field[$i]['value'];
+              $all['formatted'][]        = isset($field[$i]['view']) ? $field[$i]['view'] : '';
+              $all['raw-titles'][]       = $field_def['widget']['label'] . ': ' . $field[$i]['value'];
+              $all['formatted-titles'][] = $field_def['widget']['label'] . ': ' . isset($field[$i]['view']) ? $field[$i]['view'] : '';
+              break;
+            case 'nodereference':
+              $title = is_numeric($field[$i]['nid']) ? _nodereference_titles($field[$i]['nid']) : '';
+              $all['raw'][]              = $title;
+              $all['formatted'][]        = $title ? check_plain($title) : '';
+              $all['raw-titles'][]       = $field_def['widget']['label'] . ': ' . $title;
+              $all['formatted-titles'][] = $field_def['widget']['label'] . ': ' . $title ? check_plain($title) : '';
+              break;
+            case 'userreference':
+              $all['raw'][]              = isset($field[$i]['view']) ? strip_tags($field[$i]['view']) : '';
+              $all['formatted'][]        = isset($field[$i]['view']) ? strip_tags($field[$i]['view']) : '';
+              $all['raw-titles'][]       = $field_def['widget']['label'] . ': ' . isset($field[$i]['view']) ? strip_tags($field[$i]['view']) : '';
+              $all['formatted-titles'][] = $field_def['widget']['label'] . ': ' . isset($field[$i]['view']) ? strip_tags($field[$i]['view']) : '';
+              break;
+          }
+        }
+      }
+
+      $tokens['raw']              = theme('content_multiple_value_token', $all['raw'], 'group');
+      $tokens['formatted']        = theme('content_multiple_value_token', $all['formatted'], 'group');
+      $tokens['raw-titles']       = theme('content_multiple_value_token', $all['raw-titles'], 'group');
+      $tokens['formatted-titles'] = theme('content_multiple_value_token', $all['formatted-titles'], 'group');
 
       return $tokens;
     }
