diff --git a/module/VuFind/src/VuFind/Bootstrap.php b/module/VuFind/src/VuFind/Bootstrap.php
index 1c9da23e849a8ac314b14b38f1bf9cdef9feb9fe..883f81b1da796640f51438397b8518013eee166e 100644
--- a/module/VuFind/src/VuFind/Bootstrap.php
+++ b/module/VuFind/src/VuFind/Bootstrap.php
@@ -65,6 +65,7 @@ class Bootstrap
     public function bootstrap()
     {
         $this->initAccount();
+        $this->initContext();
         $this->initTheme();
     }
 
@@ -83,6 +84,29 @@ class Bootstrap
         $this->events->attach('dispatch', $callback);
     }
 
+    /**
+     * Set view variables representing the current context.
+     *
+     * @return void
+     */
+    protected function initContext()
+    {
+        $callback = function($event) {
+            $serviceManager = $event->getApplication()->getServiceManager();
+            $viewModel = $serviceManager->get('viewmanager')->getViewModel();
+
+            // Grab the template name from the first child -- we can use this to
+            // figure out the current template context.
+            $children = $viewModel->getChildren();
+            $parts = explode('/', $children[0]->getTemplate());
+            $viewModel->setVariable('templateDir', $parts[0]);
+            $viewModel->setVariable(
+                'templateName', isset($parts[1]) ? $parts[1] : null
+            );
+        };
+        $this->events->attach('dispatch', $callback);
+    }
+
     /**
      * Set up theme handling.
      *
diff --git a/themes/vufind/jquerymobile/templates/footer.phtml b/themes/vufind/jquerymobile/templates/footer.phtml
index 6421d8e00465cc22b2d785e5966fc84168406f1b..0dc231d6a2d411de20e941c2bd1b24c56959e889 100644
--- a/themes/vufind/jquerymobile/templates/footer.phtml
+++ b/themes/vufind/jquerymobile/templates/footer.phtml
@@ -4,7 +4,7 @@
   <?
     // if a module has footer-navbar.tpl, then use it, otherwise use default
     try {
-        echo $this->render("{$this->controller}/footer-navbar.phtml");
+        echo $this->render("{$this->layout()->templateDir}/footer-navbar.phtml");
     } catch (\Zend\View\Exception\RuntimeException $e) {
         // no module-specific footer navbar found -- use default.
         echo $this->render('default-footer-navbar.phtml');
diff --git a/themes/vufind/jquerymobile/templates/header.phtml b/themes/vufind/jquerymobile/templates/header.phtml
index 820b6f70d2c0c4658cd0a82357d3b04107e46a4a..f7d66d28f038c9f8dbd1594ef5ed4691572a65b0 100644
--- a/themes/vufind/jquerymobile/templates/header.phtml
+++ b/themes/vufind/jquerymobile/templates/header.phtml
@@ -20,10 +20,10 @@
   <?
     // if a module has header-navbar.tpl, then use it
     try {
-        echo $this->render("{$this->controller}/header-navbar.phtml");
+        echo $this->render("{$this->layout()->templateDir}/header-navbar.phtml");
     } catch (\Zend\View\Exception\RuntimeException $e) {
         // if this is a record view, load the record header; otherwise, do nothing:
-        if (substr($this->controller, -6) == 'record') {
+        if (substr($this->layout()->templateDir, -6) == 'record') {
             echo $this->render('record/header-navbar.phtml');
         }
     }
diff --git a/themes/vufind/jquerymobile/templates/myresearch/footer-navbar.phtml b/themes/vufind/jquerymobile/templates/myresearch/footer-navbar.phtml
index 5de39491f9e0bd49679bb376dd4b4928f4ca86c4..2343dc6de810f68e9b1a305a1fc43dcf1aa2e1cb 100644
--- a/themes/vufind/jquerymobile/templates/myresearch/footer-navbar.phtml
+++ b/themes/vufind/jquerymobile/templates/myresearch/footer-navbar.phtml
@@ -1,8 +1,8 @@
 <? if ($this->layout()->account->isLoggedIn()): ?>
   <div data-role="navbar">
     <ul>
-      <li><a rel="external" <?=$this->action=="mylist" ? ' class="ui-btn-active"' : ''?> href="<?=$this->url('myresearch-favorites')?>"><?=$this->transEsc('Favorites')?></a></li>
-      <li><a rel="external" <?=$this->action=="history" ? ' class="ui-btn-active"' : ''?> href="<?=$this->url('search-history')?>?require_login"><?=$this->transEsc('History')?></a></li>
+      <li><a rel="external" <?=$this->layout()->templateName=="mylist" ? ' class="ui-btn-active"' : ''?> href="<?=$this->url('myresearch-favorites')?>"><?=$this->transEsc('Favorites')?></a></li>
+      <li><a rel="external" <?=$this->layout()->templateName=="history" ? ' class="ui-btn-active"' : ''?> href="<?=$this->url('search-history')?>?require_login"><?=$this->transEsc('History')?></a></li>
       <li><a rel="external" href="<?=$this->url('myresearch-logout')?>"><?=$this->transEsc("Log Out")?></a></li>
     </ul>
   </div>
diff --git a/themes/vufind/jquerymobile/templates/myresearch/header-navbar.phtml b/themes/vufind/jquerymobile/templates/myresearch/header-navbar.phtml
index 63edad2a5e74e2461b6e3f819743e4939076f0e2..a82b6b422fabd8580bcfa0ec12f1e0d3c9e35d4d 100644
--- a/themes/vufind/jquerymobile/templates/myresearch/header-navbar.phtml
+++ b/themes/vufind/jquerymobile/templates/myresearch/header-navbar.phtml
@@ -1,9 +1,9 @@
 <? if (VF_Account_Manager::getInstance()->isLoggedIn()): ?>
   <div data-role="navbar">
     <ul>
-      <li><a rel="external" <?=$this->action=="checkedout" ? ' class="ui-btn-active"' : ''?> href="<?=$this->url('myresearch-checkedout')?>"><?=$this->transEsc('Checked Out')?></a></li>
-      <li><a rel="external" <?=$this->action=="holds" ? ' class="ui-btn-active"' : ''?> href="<?=$this->url('myresearch-holds')?>"><?=$this->transEsc('Holds')?></a></li>
-      <li><a rel="external" <?=$this->action=="fines" ? ' class="ui-btn-active"' : ''?> href="<?=$this->url('myresearch-fines')?>"><?=$this->transEsc('Fines')?></a></li>
+      <li><a rel="external" <?=$this->layout()->templateName=="checkedout" ? ' class="ui-btn-active"' : ''?> href="<?=$this->url('myresearch-checkedout')?>"><?=$this->transEsc('Checked Out')?></a></li>
+      <li><a rel="external" <?=$this->layout()->templateName=="holds" ? ' class="ui-btn-active"' : ''?> href="<?=$this->url('myresearch-holds')?>"><?=$this->transEsc('Holds')?></a></li>
+      <li><a rel="external" <?=$this->layout()->templateName=="fines" ? ' class="ui-btn-active"' : ''?> href="<?=$this->url('myresearch-fines')?>"><?=$this->transEsc('Fines')?></a></li>
     </ul>
   </div>
 <? endif; ?>
\ No newline at end of file
diff --git a/themes/vufind/jquerymobile/templates/search/footer-navbar.phtml b/themes/vufind/jquerymobile/templates/search/footer-navbar.phtml
index 2501d59e6c0f576ce4509cbb1f685fcd2c113f4e..3a8366aa1bab4f48e1abb3360f0b2ace9f4b830e 100644
--- a/themes/vufind/jquerymobile/templates/search/footer-navbar.phtml
+++ b/themes/vufind/jquerymobile/templates/search/footer-navbar.phtml
@@ -1,4 +1,4 @@
-<? if ($this->action == 'history'): // use myresearch navbar for Search/history ?>
+<? if ($this->layout()->templateName == 'history'): // use myresearch navbar for Search/history ?>
   <?=$this->render('myresearch/footer-navbar.phtml')?>
 <? else:                            // use default navbar for everything else ?>
   <?=$this->render('default-footer-navbar.phtml');?>
diff --git a/themes/vufind/jquerymobile/templates/search/header-navbar.phtml b/themes/vufind/jquerymobile/templates/search/header-navbar.phtml
index 4a181480510cf14e6de900f7e7d017a41c81ceff..58cf4d71d8ac6dd6811dce42ba637088228c1965 100644
--- a/themes/vufind/jquerymobile/templates/search/header-navbar.phtml
+++ b/themes/vufind/jquerymobile/templates/search/header-navbar.phtml
@@ -1,6 +1,6 @@
-<? if ($this->action == 'history'): // use myresearch navbar for Search/history ?>
+<? if ($this->layout()->templateName == 'history'): // use myresearch navbar for Search/history ?>
   <?=$this->render('myresearch/header-navbar.phtml')?>
-<? elseif (isset($this->results) && $this->results->getResultTotal() > 0): ?>
+<? elseif (isset($this->results) && is_object($this->results) && $this->results->getResultTotal() > 0): ?>
   <div data-role="navbar">
     <ul>
       <li><a href="#Search-narrow" data-rel="dialog" data-transition="flip"><?=$this->transEsc('Narrow Search')?></a></li>