diff --git a/token.module b/token.module
index 65f952d..6be76f4 100644
--- a/token.module
+++ b/token.module
@@ -1084,3 +1084,42 @@ function token_render_cache_set(&$markup, $elements) {
   drupal_render_cache_set($markup, $elements);
   $_SERVER['REQUEST_METHOD'] = $original_method;
 }
+
+function token_menu_link_load_all_parents($mlid) {
+  $cache = &drupal_static(__FUNCTION__, array());
+
+  if (!is_numeric($mlid)) {
+    return array();
+  }
+
+  if (!isset($cache[$mlid])) {
+    $cache[$mlid] = array();
+    $plid = db_query("SELECT plid FROM {menu_links} WHERE mlid = :mlid", array(':mlid' => $mlid))->fetchField();
+    while ($plid && $parent = token_menu_link_load($plid)) {
+      $cache[$mlid] = array($plid => $parent['title']) + $cache[$mlid];
+      $plid = $parent['plid'];
+    }
+  }
+
+  return $cache[$mlid];
+}
+
+function token_taxonomy_term_load_all_parents($tid) {
+  $cache = &drupal_static(__FUNCTION__, array());
+
+  if (!is_numeric($tid)) {
+    return array();
+  }
+
+  if (!isset($cache[$tid])) {
+    $cache[$tid] = array();
+    $parents = taxonomy_get_parents_all($tid);
+    array_shift($parents); // Remove this term from the array.
+    $parents = array_reverse($parents);
+    foreach ($parents as $term) {
+      $cache[$tid][$term->tid] = entity_label('taxonomy_term', $term);
+    }
+  }
+
+  return $cache[$tid];
+}
diff --git a/token.test b/token.test
index 59ecb92..fd1c42c 100644
--- a/token.test
+++ b/token.test
@@ -397,6 +397,9 @@ class TokenMenuTestCase extends TokenTestHelper {
       'parent:title' => 'Root link',
       'parent:menu' => 'Main menu',
       'parent:parent' => NULL,
+      'parents' => 'Root link',
+      'parents:count' => 1,
+      'parents:keys' => $root_link['mlid'],
       'root' => 'Root link',
       'root:mlid' => $root_link['mlid'],
       'root:parent' => NULL,
@@ -426,6 +429,9 @@ class TokenMenuTestCase extends TokenTestHelper {
       'menu-link:parent' => 'Parent link',
       'menu-link:parent:mlid' => $node->menu['plid'],
       'menu-link:parent:mlid' => $parent_link['mlid'],
+      'menu-link:parents' => 'Root link, Parent link',
+      'menu-link:parents:count' => 2,
+      'menu-link:parents:keys' => $root_link['mlid'] . ', ' . $parent_link['mlid'],
       'menu-link:root' => 'Root link',
       'menu-link:root:mlid' => $root_link['mlid'],
     );
@@ -463,34 +469,48 @@ class TokenTaxonomyTestCase extends TokenTestHelper {
    * Test the additional taxonomy term tokens.
    */
   function testTaxonomyTokens() {
-    $parent_term = $this->addTerm($this->vocab, array('path' => array('alias' => 'parent-term')));
-    $parent_term_tokens = array(
+    $root_term = $this->addTerm($this->vocab, array('name' => 'Root term', 'path' => array('alias' => 'root-term')));
+    $tokens = array(
+      'url' => url("taxonomy/term/{$root_term->tid}", array('absolute' => TRUE)),
+      'url:absolute' => url("taxonomy/term/{$root_term->tid}", array('absolute' => TRUE)),
+      'url:relative' => url("taxonomy/term/{$root_term->tid}", array('absolute' => FALSE)),
+      'url:path' => 'root-term',
+      'url:unaliased:path' => "taxonomy/term/{$root_term->tid}",
+      'edit-url' => url("taxonomy/term/{$root_term->tid}/edit", array('absolute' => TRUE)),
+      'parents' => NULL,
+      'parents:count' => NULL,
+      'parents:keys' => NULL,
+      'root' => NULL,
+      // Deprecated tokens
+      'url:alias' => 'root-term',
+    );
+    $this->assertTokens('term', array('term' => $root_term), $tokens);
+
+    $parent_term = $this->addTerm($this->vocab, array('name' => 'Parent term', 'parent' => $root_term->tid));
+    $tokens = array(
       'url' => url("taxonomy/term/{$parent_term->tid}", array('absolute' => TRUE)),
       'url:absolute' => url("taxonomy/term/{$parent_term->tid}", array('absolute' => TRUE)),
       'url:relative' => url("taxonomy/term/{$parent_term->tid}", array('absolute' => FALSE)),
-      'url:path' => 'parent-term',
+      'url:path' => "taxonomy/term/{$parent_term->tid}",
       'url:unaliased:path' => "taxonomy/term/{$parent_term->tid}",
       'edit-url' => url("taxonomy/term/{$parent_term->tid}/edit", array('absolute' => TRUE)),
-      'root' => NULL,
-      // Deprecated tokens
-      'url:alias' => 'parent-term',
-    );
-    $this->assertTokens('term', array('term' => $parent_term), $parent_term_tokens);
-
-    $child_term = $this->addTerm($this->vocab, array('parent' => $parent_term->tid));
-    $child_term_tokens = array(
-      'url' => url("taxonomy/term/{$child_term->tid}", array('absolute' => TRUE)),
-      'url:absolute' => url("taxonomy/term/{$child_term->tid}", array('absolute' => TRUE)),
-      'url:relative' => url("taxonomy/term/{$child_term->tid}", array('absolute' => FALSE)),
-      'url:path' => "taxonomy/term/{$child_term->tid}",
-      'url:unaliased:path' => "taxonomy/term/{$child_term->tid}",
-      'edit-url' => url("taxonomy/term/{$child_term->tid}/edit", array('absolute' => TRUE)),
-      'root' => check_plain($parent_term->name),
-      'root:tid' => $parent_term->tid,
+      'parents' => 'Root term',
+      'parents:count' => 1,
+      'parents:keys' => $root_term->tid,
+      'root' => check_plain($root_term->name),
+      'root:tid' => $root_term->tid,
       // Deprecated tokens
-      'url:alias' => "taxonomy/term/{$child_term->tid}",
+      'url:alias' => "taxonomy/term/{$parent_term->tid}",
+    );
+    $this->assertTokens('term', array('term' => $parent_term), $tokens);
+
+    $term = $this->addTerm($this->vocab, array('name' => 'Test term', 'parent' => $parent_term->tid));
+    $tokens = array(
+      'parents' => 'Root term, Parent term',
+      'parents:count' => 2,
+      'parents:keys' => implode(', ', array($root_term->tid, $parent_term->tid)),
     );
-    $this->assertTokens('term', array('term' => $child_term), $child_term_tokens);
+    $this->assertTokens('term', array('term' => $term), $tokens);
   }
 
   /**
diff --git a/token.tokens.inc b/token.tokens.inc
index a80a4e9..fb3bee8 100644
--- a/token.tokens.inc
+++ b/token.tokens.inc
@@ -133,6 +133,11 @@ function token_token_info() {
       'description' => t("The URL of the taxonomy term's edit page."),
       //'type' => 'url',
     );
+    $info['tokens']['term']['parents'] = array(
+      'name' => t('Parents'),
+      'description' => t("An array of all the term's parents, starting with the root."),
+      'type' => 'array',
+    );
     $info['tokens']['term']['root'] = array(
       'name' => t('Root term'),
       'description' => t("The root term of the taxonomy term."),
@@ -217,6 +222,11 @@ function token_token_info() {
     'description' => t("The menu link's parent."),
     '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',
+  );
   $info['tokens']['menu-link']['root'] = array(
     'name' => t('Root'),
     'description' => t("The menu link's root."),
@@ -457,6 +467,12 @@ function token_tokens($type, $tokens, array $data = array(), array $options = ar
           $replacements[$original] = url("taxonomy/term/{$term->tid}/edit", $url_options);
           break;
 
+        case 'parents':
+          if ($parents = token_taxonomy_term_load_all_parents($term->tid)) {
+            $replacements[$original] = token_render_array($parents, $options);
+          }
+          break;
+
         case 'root':
           $parents = taxonomy_get_parents_all($term->tid);
           $root_term = end($parents);
@@ -471,6 +487,12 @@ function token_tokens($type, $tokens, array $data = array(), array $options = ar
     if (($url_tokens = token_find_with_prefix($tokens, 'url'))) {
       $replacements += token_generate('url', $url_tokens, entity_uri('taxonomy_term', $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);
+      }
+    }
     if ($root_tokens = token_find_with_prefix($tokens, 'root')) {
       $parents = taxonomy_get_parents_all($term->tid);
       $root_term = end($parents);
@@ -588,6 +610,11 @@ function token_tokens($type, $tokens, array $data = array(), array $options = ar
             $replacements[$original] = $sanitize ? check_plain($parent['title']) : $parent['title'];
           }
           break;
+        case 'parents':
+          if ($parents = token_menu_link_load_all_parents($link['mlid'])) {
+            $replacements[$original] = token_render_array($parents, $options);
+          }
+          break;
         case 'root';
           if (!empty($link['p1']) && $link['p1'] != $link['mlid'] && $root = token_menu_link_load($link['p1'])) {
             $replacements[$original] = $sanitize ? check_plain($root['title']) : $root['title'];
@@ -600,6 +627,12 @@ function token_tokens($type, $tokens, array $data = array(), array $options = ar
     if (!empty($link['plid']) && ($source_tokens = token_find_with_prefix($tokens, 'parent')) && $parent = token_menu_link_load($link['plid'])) {
       $replacements += token_generate('menu-link', $source_tokens, array('menu-link' => $parent), $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);
+      }
+    }
     if (!empty($link['p1']) && $link['p1'] != $link['mlid'] && ($root_tokens = token_find_with_prefix($tokens, 'root')) && $root = token_menu_link_load($link['p1'])) {
       $replacements += token_generate('menu-link', $root_tokens, array('menu-link' => $root), $options);
     }
