diff --git a/includes/bootstrap.inc b/includes/bootstrap.inc
index fd0ae33..1dffa7e 100644
--- a/includes/bootstrap.inc
+++ b/includes/bootstrap.inc
@@ -2448,7 +2448,7 @@ function request_path() {
  * In menu callback functions, attempt to use named arguments. See the explanation
  * in menu.inc for how to construct callbacks that take arguments. When attempting
  * to use this function to load an element from the current path, e.g. loading the
- * node on a node page, please use menu_get_object() instead.
+ * node on a node page, please use $context['menu:object:node'] instead.
  *
  * @param $index
  *   The index of the component, where each component is separated by a '/'
diff --git a/includes/menu.inc b/includes/menu.inc
index 3e775db..a29bd6e 100644
--- a/includes/menu.inc
+++ b/includes/menu.inc
@@ -943,15 +943,15 @@ function _menu_link_translate(&$item, $translate = FALSE) {
  *   Type of the object. These appear in hook_menu definitions as %type. Core
  *   provides aggregator_feed, aggregator_category, contact, filter_format,
  *   forum_term, menu, menu_link, node, taxonomy_vocabulary, user. See the
- *   relevant {$type}_load function for more on each. Defaults to node.
+ *   relevant {$type}_load function for more on each. Defaults to taxonomy_term.
  * @param $position
  *   The position of the object in the path, where the first path segment is 0.
- *   For node/%node, the position of %node is 1, but for comment/reply/%node,
- *   it's 2. Defaults to 1.
+ *   For taxonomy/term/%taxonomy_term, the position of %taxonomy_term is 2.
+ *   Defaults to 1.
  * @param $path
  *   See menu_get_item() for more on this. Defaults to the current path.
  */
-function menu_get_object($type = 'node', $position = 1, $path = NULL) {
+function menu_get_object($type = 'taxonomy_term', $position = 2, $path = NULL) {
   $router_item = menu_get_item($path);
   if (isset($router_item['load_functions'][$position]) && !empty($router_item['map'][$position]) && $router_item['load_functions'][$position] == $type . '_load') {
     return $router_item['map'][$position];
diff --git a/includes/theme.inc b/includes/theme.inc
index 6c2b640..0726605 100644
--- a/includes/theme.inc
+++ b/includes/theme.inc
@@ -2185,7 +2185,8 @@ function template_preprocess_html(&$variables) {
   }
 
   // If on an individual node page, add the node type to body classes.
-  if ($node = menu_get_object()) {
+  $context = drupal_get_context();
+  if ($node = $context['menu:object:node']) {
     $variables['classes_array'][] = drupal_html_class('node-type-' . $node->type);
   }
 
@@ -2275,7 +2276,8 @@ function template_preprocess_page(&$variables) {
   $variables['site_slogan']       = (theme_get_setting('toggle_slogan') ? filter_xss_admin(variable_get('site_slogan', '')) : '');
   $variables['tabs']              = menu_local_tabs();
 
-  if ($node = menu_get_object()) {
+  $context = drupal_get_context();
+  if ($node = $context['menu:object:node']) {
     $variables['node'] = $node;
   }
 
diff --git a/modules/book/book.module b/modules/book/book.module
index beb1721..3179076 100644
--- a/modules/book/book.module
+++ b/modules/book/book.module
@@ -249,7 +249,8 @@ function book_block_info() {
 function book_block_view($delta = '') {
   $block = array();
   $current_bid = 0;
-  if ($node = menu_get_object()) {
+  $context = drupal_get_context();
+  if ($node = $context['menu:object:node']) {
     $current_bid = empty($node->book['bid']) ? 0 : $node->book['bid'];
   }
 
@@ -824,7 +825,8 @@ function book_node_view($node, $view_mode) {
  * viewing a book page.
  */
 function book_page_alter(&$page) {
-  if (($node = menu_get_object()) && !empty($node->book['bid'])) {
+  $context = drupal_get_context();
+  if (($node = $context['menu:object:node']) && !empty($node->book['bid'])) {
     $active_menus = menu_get_active_menu_names();
     $active_menus[] = $node->book['menu_name'];
     menu_set_active_menu_names($active_menus);
diff --git a/modules/node/node.module b/modules/node/node.module
index 1ecc093..f7712dd 100644
--- a/modules/node/node.module
+++ b/modules/node/node.module
@@ -1419,7 +1419,8 @@ function node_show($node, $message = FALSE) {
  *   A node object.
  */
 function node_is_page($node) {
-  $page_node = menu_get_object();
+  $context = drupal_get_context();
+  $page_node = $context['menu:object:node'];
   return (!empty($page_node) ? $page_node->nid == $node->nid : FALSE);
 }
 
@@ -2389,7 +2390,8 @@ function node_block_list_alter(&$blocks) {
     $block_node_types[$record->module][$record->delta][$record->type] = TRUE;
   }
 
-  $node = menu_get_object();
+  $context = drupal_get_context();
+  $node = $context['menu:object:node'];
   $node_types = node_type_get_types();
   if (arg(0) == 'node' && arg(1) == 'add' && arg(2)) {
     $node_add_arg = strtr(arg(2), '-', '_');
diff --git a/modules/system/system.api.php b/modules/system/system.api.php
index ab3e0fc..9f6ac39 100644
--- a/modules/system/system.api.php
+++ b/modules/system/system.api.php
@@ -860,7 +860,8 @@ function hook_ajax_render_alter($commands) {
  * @see drupal_render_page()
  */
 function hook_page_build(&$page) {
-  if (menu_get_object('node', 1)) {
+  $context = drupal_get_context();
+  if ($context['menu:object:node']) {
     // We are on a node detail page. Append a standard disclaimer to the
     // content region.
     $page['content']['disclaimer'] = array(
diff --git a/modules/system/system.context.inc b/modules/system/system.context.inc
new file mode 100644
index 0000000..3bce3e9
--- /dev/null
+++ b/modules/system/system.context.inc
@@ -0,0 +1,46 @@
+<?php
+/**
+ * @file
+ * Get a loaded node from the current path.
+ *
+ * $contex['menu:object:node'] provides access to nodes loaded by the current 
+ * router item from position 1. For example, on the page node/%node, the router 
+ * loads the %node object, and accessing $context['menu:object:node'] will 
+ * return that. Normally, it is necessary to specify the type of object 
+ * referenced, however node is the default.
+ * The following example tests to see whether the node being displayed is of the
+ * "story" content type:
+ * @code
+ * $context = drupal_get_context();
+ * $node = $context['menu:object:node'];
+ * $story = $node->type == 'story';
+ * @endcode
+ */
+
+/**
+ * Context handler class for the menu_get_item('node').
+ */
+class ContextHandlerMenuObjectNode extends ContextHandlerAbstract {
+
+  public $params;
+  
+  /**
+   * Implements ContextHandlerInterface:getValue().
+   */
+  public function getValue(array $args = array()) {
+    $path = implode('/', $this->params['path']);
+    $router_item = menu_get_item($path);
+    $position = 1;
+    $type = 'node';
+    
+    if (isset($router_item['load_functions'][$position]) 
+      && !empty($router_item['map'][$position]) 
+      && $router_item['load_functions'][$position] == $type . '_load') {
+      $result = $router_item['map'][$position];
+    }
+    else {
+      $result = NULL;
+    }
+    return $result;
+  }
+}
\ No newline at end of file
diff --git a/modules/system/system.info b/modules/system/system.info
index c394849..d9adcf3 100644
--- a/modules/system/system.info
+++ b/modules/system/system.info
@@ -4,6 +4,7 @@ package = Core
 version = VERSION
 core = 8.x
 files[] = system.archiver.inc
+files[] = system.context.inc
 files[] = system.mail.inc
 files[] = system.queue.inc
 files[] = system.tar.inc
diff --git a/modules/system/system.module b/modules/system/system.module
index d754555..f2be5a9 100644
--- a/modules/system/system.module
+++ b/modules/system/system.module
@@ -1925,6 +1925,7 @@ function system_context_init(DrupalContextInterface $butler) {
   $butler->registerHandler('http:get', 'ContextHandlerHttp', array('query' => 'GET'));
   $butler->registerHandler('http:post', 'ContextHandlerHttp', array('query' => 'POST'));
   $butler->registerHandler('http:header', 'ContextHandlerHeader');
+  $butler->registerHandler('menu:object:node', 'ContextHandlerMenuObjectNode', array('path' => arg()));
 }
 
 
