--- token/token_node.inc	2008-06-07 20:57:40.000000000 +0200
+++ token/fixed_token_node.inc	2008-06-17 10:58:21.000000000 +0200
@@ -52,25 +52,35 @@ function node_token_values($type, $objec
       }
 
       // Now get the menu related information.
-      if (!empty($node->menu['mlid'])) {
-        $menus = menu_get_menus();
-        $menu_name = $node->menu['menu_name'];
-        $menu_title = $menus[$menu_name];
-        $trail_raw = _menu_titles($menu_name, $node->nid);
-        $trail = array();
-        foreach ($trail_raw as $title) {
-          $trail[] = check_plain($title);
-        }
-        $values['menupath']     = implode('/', $trail);
-        $values['menupath-raw'] = implode('/', $trail_raw);
-        $values['menu']         = check_plain($menu_title);
-        $values['menu-raw']     = $menu_title;
-      }
-      else {
-        $values['menu']         = '';
-        $values['menu-raw']     = '';
-        $values['menupath']     = '';
-        $values['menupath-raw'] = '';
+      $menus = menu_get_menus();
+      
+      if (isset($node->menu['menu_name']) && !empty($node->menu['menu_name'])) {
+          $menu_name = $node->menu['menu_name'];
+      } else {
+          $menu_name = extract_menu_name($node);
+      }
+      
+      $menu_title = $menus[$menu_name];
+      $trail_raw = _menu_titles($menu_name, $node->nid);
+      $trail = array();
+      
+      if (!empty($trail_raw)) {
+          foreach ($trail_raw as $title) {
+              $trail[] = check_plain($title);
+          }
+
+          $link_title = array_pop($trail);
+          $link_title_raw = array_pop($trail_raw);
+      
+          $values['menupath']     = implode('/', $trail);
+          $values['menupath-raw'] = implode('/', $trail_raw);
+          $values['menu']         = check_plain($menu_title);
+          $values['menu-raw']     = $menu_title;
+      } else {
+          $values['menu']         = '';
+          $values['menu-raw']     = '';
+          $values['menupath']     = '';
+          $values['menupath-raw'] = '';
       }
 
       // And now taxonomy, which is a bit more work. This code is adapted from
@@ -199,22 +209,37 @@ function node_token_list($type = 'all') 
  *   An array of titles through the specified node
  */
 function _menu_titles($menu_name, $nid) {
-  // Get the menu hierarchy for the specified page.
-  $item = array_shift(menu_tree_all_data($menu_name));
+  // get the plid of our target node
+  $item = db_fetch_array(db_query("SELECT mlid, plid, link_title, menu_name FROM {menu_links} WHERE menu_name = '%s' AND link_path = '%s'", $menu_name, 'node/' . $nid));
+  
+  if(!(bool)$item['mlid']){
+    // not in this menu, or the item was just dissasociated
+    return array();
+  }
+  
   $titles = array();
-  // Go down the active trail until the right level is reached.
-  while ($item) {
-    $titles[] = $item['link']['title'];
-    // Break AFTER getting the desired node's title
-    if ($item['link']['href'] == "node/$nid" || !$item['below']) {
-      break;
-    }
-    $item = array_shift($item['below']);
+  $titles[] = $item['link_title']; // include the node link title as well
+  while($item['plid']){
+    $item = db_fetch_array(db_query("SELECT mlid, plid, link_title FROM {menu_links} WHERE mlid = %d", $item['plid']));
+    $titles[] = $item['link_title'];
   }
-
+  
+  // invert the array to return it to path order
+  $titles = array_reverse($titles);
+  
   return $titles;
 }
 
+function extract_menu_name($node) {
+
+  $item = db_fetch_array(db_query("SELECT menu_name FROM {menu_links} WHERE link_path = '%s'", 'node/' . $node->nid));
+  
+  if ($item && isset($item['menu_name'])) {
+    return $item['menu_name'];
+  }
+  return false; 
+}
+
 /**
  * Implementation of hook_token_values() for book nodes
  */
