diff --git a/includes/menu.inc b/includes/menu.inc
index 2a8c80c..ec6bbdc 100644
--- a/includes/menu.inc
+++ b/includes/menu.inc
@@ -1250,6 +1250,11 @@ function menu_tree_page_data($menu_name, $max_depth = NULL, $only_active_trail =
           $tree_parameters['expanded'] = $active_trail;
           $tree_parameters['active_trail'] = $active_trail;
         }
+        // Make the cache entry for the front page unique.
+        // Neccessary if the tree contains an item that links to the front page.
+        if (drupal_is_front_page()) {
+          $tree_parameters['is_front_page'] = TRUE;
+      	}
         // Cache the tree building parameters using the page-specific cid.
         cache_set($cid, $tree_parameters, 'cache_menu');
       }
@@ -1486,10 +1491,12 @@ function menu_tree_data(array $links, array $parents = array(), $depth = 1) {
  */
 function _menu_tree_data(&$links, $parents, $depth) {
   $tree = array();
+  $is_front = drupal_is_front_page();
   while ($item = array_pop($links)) {
     // We need to determine if we're on the path to root so we can later build
     // the correct active trail and breadcrumb.
-    $item['in_active_trail'] = in_array($item['mlid'], $parents);
+    $item['in_active_trail'] = in_array($item['mlid'], $parents)
+      || ($is_front && isset($item['link_path']) && $item['link_path'] == '<front>');
     // Add the current link to the tree.
     $tree[$item['mlid']] = array(
       'link' => $item,
@@ -2313,7 +2320,8 @@ function menu_set_active_trail($new_trail = NULL) {
           if (strpos($link['href'], '%') !== FALSE) {
             _menu_link_translate($link, TRUE);
           }
-          if ($link['access']) {
+          // Check access and skip items that link to <front>.
+          if ($link['access'] && $link['href'] != '<front>') {
             $trail[] = $link;
           }
         }
