Index: token.tokens.inc
--- token.tokens.inc Base (BASE)
+++ token.tokens.inc Locally Modified (Based On LOCAL)
@@ -138,6 +138,12 @@
       'description' => t("The root term of the taxonomy term."),
       'type' => 'term',
     );
+    $info['tokens']['term']['parents'] = array(
+      'name' => t('Parents'),
+      'description' => t("An array of all the term's parents, starting with the root."),
+      'type' => 'array',
+      'sub-type' => 'term',
+    );
 
     $info['tokens']['vocabulary']['machine-name'] = array(
       'name' => t('Machine-readable name'),
@@ -222,6 +228,12 @@
     'description' => t("The menu link's root."),
     'type' => 'menu-link',
   );
+  $info['tokens']['menu-link']['parents'] = array(
+    'name' => t('Parents'),
+    'description' => t("An array of all the menu link's parents, starting with the root."),
+    'type' => 'array',
+    'sub-type' => 'menu-link',
+  );
 
   // Current page tokens.
   $info['types']['current-page'] = array(
@@ -402,8 +414,14 @@
           $type_name = node_type_get_name($node);
           $replacements[$original] = $sanitize ? check_plain($type_name) : $type_name;
           break;
+        
+        case 'parents':
+          if ($parents = token_taxonomy_term_load_all_parents($term->tid)) {
+            $replacements[$original] = token_render_array($parents, $options);
       }
+          break;
     }
+    }
 
     // Chained token relationships.
     if (!empty($node->tnid) && ($source_tokens = token_find_with_prefix($tokens, 'source')) && $source_node = node_load($node->tnid)) {
@@ -477,8 +495,15 @@
       if ($root_term->tid != $term->tid) {
         $replacements += token_generate('term', $root_tokens, array('term' => $root_term), $options);
       }
+      
+      // [term:parents:*] chained tokens.
+      if ($parents_tokens = token_find_with_prefix($tokens, 'parents')) {
+        if ($parents = token_taxonomy_term_load_all_parents($term->tid)) {
+          $replacements += token_generate('array', $parents_tokens, array('array' => $parents), $options);
     }
   }
+    }
+  }
 
   // Vocabulary tokens.
   if ($type == 'vocabulary' && !empty($data['vocabulary'])) {
@@ -587,8 +612,13 @@
             $replacements[$original] = $sanitize ? check_plain($root['title']) : $root['title'];
           }
           break;
+        case 'parents':
+          if ($parents = token_menu_link_load_all_parents($link['mlid'])) {
+            $replacements[$original] = token_render_array($parents, $options);
       }
+          break;
     }
+    }
 
     // Chained token relationships.
     if (!empty($link['plid']) && ($source_tokens = token_find_with_prefix($tokens, 'parent')) && $parent = token_menu_link_load($link['plid'])) {
@@ -600,7 +630,14 @@
     if ($url_tokens = token_find_with_prefix($tokens, 'url')) {
       $replacements += token_generate('url', $url_tokens, array('path' => $link['href']), $options);
     }
+    
+    // [menu-link:parents:*] chained tokens.
+    if ($parents_tokens = token_find_with_prefix($tokens, 'parents')) {
+      if ($parents = token_menu_link_load_all_parents($link['mlid'])) {
+        $replacements += token_generate('array', $parents_tokens, array('array' => $parents), $options);
   }
+    }
+  }
 
   // Current page tokens.
   if ($type == 'current-page') {
