 includes/menu.inc                         |   13 ++++++++++++-
 includes/path.inc                         |    2 +-
 modules/simpletest/tests/menu.test        |   17 +++++++++++++++++
 modules/simpletest/tests/menu_test.module |   15 ++++++++++++++-
 4 files changed, 44 insertions(+), 3 deletions(-)

diff --git includes/menu.inc includes/menu.inc
index 8e2fb1f..79f34bc 100644
--- includes/menu.inc
+++ includes/menu.inc
@@ -633,6 +633,11 @@ function _menu_item_localize(&$item, $map, $link_translate = FALSE) {
   // If we are translating a router item (tabs, page, breadcrumb), then we
   // can always use the information from the router item.
   if (!$link_translate || ($item['title'] == $item['link_title'])) {
+    // PASS_THROUGH is encoded by adding a - prefix.
+    if ($callback && $callback[0] == '-') {
+      $callback = substr($callback, 1);
+      $item[PASS_THROUGH] = TRUE;
+    }
     // t() is a special case. Since it is used very close to all the time,
     // we handle it directly instead of using indirect, slower methods.
     if ($callback == 't') {
@@ -2181,7 +2186,7 @@ function menu_get_active_title() {
 
   foreach (array_reverse($active_trail) as $item) {
     if (!(bool)($item['type'] & MENU_IS_LOCAL_TASK)) {
-      return $item['title'];
+      return !empty($item[PASS_THROUGH]) ? $item['title'] : check_plain($item['title']);
     }
   }
 }
@@ -3218,6 +3223,12 @@ function _menu_router_build($callbacks) {
       'include file' => '',
       'module' => '',
     );
+    if (!empty($item[PASS_THROUGH])) {
+      // Make a note of PASS_THROUGH by storing an otherwise invalid title
+      // callback.
+      $item['title callback'] = '-' . $item['title callback'];
+    }
+    
 
     // Calculate out the file to be included for each callback, if any.
     if ($item['file']) {
diff --git includes/path.inc includes/path.inc
index 68a92a7..2411551 100644
--- includes/path.inc
+++ includes/path.inc
@@ -293,7 +293,7 @@ function drupal_get_title() {
 
   // During a bootstrap, menu.inc is not included and thus we cannot provide a title.
   if (!isset($title) && function_exists('menu_get_active_title')) {
-    $title = check_plain(menu_get_active_title());
+    $title = menu_get_active_title();
   }
 
   return $title;
diff --git modules/simpletest/tests/menu.test modules/simpletest/tests/menu.test
index 53ee3b7..ae02934 100644
--- modules/simpletest/tests/menu.test
+++ modules/simpletest/tests/menu.test
@@ -403,6 +403,13 @@ class MenuRebuildTestCase extends DrupalWebTestCase {
   }
 
   /**
+   * Enable menu_test.module.
+   */
+  public function setUp() {
+    parent::setUp('menu_test');
+  }
+
+  /**
    * Test if the 'menu_rebuild_needed' variable triggers a menu_rebuild() call.
    */
   function testMenuRebuildByVariable() {
@@ -426,6 +433,16 @@ class MenuRebuildTestCase extends DrupalWebTestCase {
     $this->assertEqual($admin_exists, 'admin', t("The menu has been rebuilt, the path 'admin' now exists again."));
   }
 
+  /**
+   * Test title pass through.
+   */
+  function testMenuTitlePassThrough() {
+    $this->drupalGet('menu-test/passthrough');
+    $title = '<span>test</span>';
+    $this->assertRaw($title);
+    $this->assertNoRaw(check_plain($title));
+  }
+
 }
 
 /**
diff --git modules/simpletest/tests/menu_test.module modules/simpletest/tests/menu_test.module
index a51d9fc..f2cb5d5 100644
--- modules/simpletest/tests/menu_test.module
+++ modules/simpletest/tests/menu_test.module
@@ -172,7 +172,13 @@ function menu_test_menu() {
     'type' => MENU_LOCAL_TASK,
     'context' => MENU_CONTEXT_NONE,
   );
-
+  $items['menu-test/passthrough'] = array(
+    'title' => '<span>test</span>',
+    PASS_THROUGH => TRUE,
+    'page callback' => 'menu_test_passthrough',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
   return $items;
 }
 
@@ -313,3 +319,10 @@ function menu_test_static_variable($value = NULL) {
   }
   return $variable;
 }
+
+/**
+ * Empty menu callback.
+ */
+function menu_test_passthrough() {
+  return '&nbsp;';
+}
