diff --git a/languages/en.ini b/languages/en.ini
index a0efcc79c4a9bc62e06ae0b27532bbaf95dffc96..3859e1f8d513766b8cefc68cfa726a39d90a25cf 100644
--- a/languages/en.ini
+++ b/languages/en.ini
@@ -123,6 +123,7 @@ Bookmark = "Bookmark"
 Books = "Books"
 Borrowing Location = "Borrowing Location"
 Braille = "Braille"
+Breadcrumbs = "Breadcrumbs"
 Brief View = "Brief View"
 Browse = "Browse"
 Browse Alphabetically = "Browse Alphabetically"
@@ -403,6 +404,7 @@ fine_limit_patron = "You have reached your fines limit and cannot renew items"
 Fines = "Fines"
 First = "First"
 First Name = "First Name"
+First Search Result = "First Search Result"
 fix_metadata = "Yes, fix the metadata; I'll wait"
 for search = "for search"
 Forgot Password = "Forgot Password"
@@ -573,6 +575,7 @@ large = "Large"
 Last = "Last"
 Last Modified = "Last Modified"
 Last Name = "Last Name"
+Last Search Result = "Last Search Result"
 less = "less"
 libphonenumber_invalid = "Phone number invalid"
 libphonenumber_invalidcountry = "Invalid country calling code"
@@ -667,6 +670,7 @@ new_user_welcome_subject = "Your new account at %%library%%"
 new_user_welcome_text = "Welcome to %%library%%. A new account has been opened for %%firstname%% %%lastname%%. Your username is %%username%%. Please set a password on this page: %%url%%"
 Newspaper = "Newspaper"
 Next = "Next"
+Next Search Result = "Next Search Result"
 No citations are available for this record = "No citations are available for this record"
 No Cover Image = "No Cover Image"
 No dependency problems found = "No dependency problems found"
@@ -748,6 +752,12 @@ Other Editions = "Other Editions"
 Other Libraries = "Other Libraries"
 Other Sources = "Other Sources"
 Page not found. = "Page not found."
+page_first = "Go to First Page"
+page_last = "Go to Last Page"
+page_next = "Go to Next Page"
+page_num = "Page %%page%%"
+page_prev = "Go to Previous Page"
+pagination_label = "Pagination"
 Password = "Password"
 Password Again = "Password Again"
 Password cannot be blank = "Password cannot be blank"
@@ -782,6 +792,7 @@ Preferred Library = "Preferred Library"
 Prev = "Prev"
 Preview = "Preview"
 Preview from = "Preview from"
+Previous Search Result = "Previous Search Result"
 Previous Title = "Previous Title"
 Print = "Print"
 print_selected = "Print Selected"
diff --git a/module/VuFind/src/VuFind/View/Helper/Bootstrap3/Search.php b/module/VuFind/src/VuFind/View/Helper/Bootstrap3/Search.php
index 10cb856cce386a9d4edd33a1b58f1fabb649f7e7..f4db00b72d013b099d678adc8ca3f54ebd3bdaef 100644
--- a/module/VuFind/src/VuFind/View/Helper/Bootstrap3/Search.php
+++ b/module/VuFind/src/VuFind/View/Helper/Bootstrap3/Search.php
@@ -58,7 +58,8 @@ class Search extends \VuFind\View\Helper\AbstractSearch
      */
     protected function renderExpandLink($url, $view)
     {
-        return '<a href="' . $url . '" title="' . $view->transEsc('spell_expand_alt')
-            . '"><i class="icon-circle-arrow-right"></i></a>';
+        return ' <a href="' . $url
+            . '" title="' . $view->transEsc('spell_expand_alt')
+            . '">(' . $view->transEsc('spell_expand_alt') . ')</a>';
     }
 }
diff --git a/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/SearchFacetsTest.php b/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/SearchFacetsTest.php
index c6d5283f969e8e762797201316732c1631484e0f..a07d27613063f39765334dc22327c4a24b92d4fe 100644
--- a/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/SearchFacetsTest.php
+++ b/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/SearchFacetsTest.php
@@ -85,15 +85,16 @@ class SearchFacetsTest extends \VuFindTest\Unit\MinkTestCase
         $this->snooze();
         $items = $page->findAll('css', '#modal #facet-list-count .js-facet-item');
         $this->assertEquals($limit * 2, count($items));
+        $excludeControl = $exclusionActive ? 'Exclude matching results ' : '';
         $this->assertEquals(
-            'Weird IDs 9 '
-            . 'Fiction 7 '
-            . 'The Study Of P|pes 1 '
-            . 'The Study and Scor_ng of Dots.and-Dashes:Colons 1 '
-            . 'The Study of "Important" Things 1 '
-            . 'The Study of %\'s? 1 '
-            . 'The Study of +\'s? 1 '
-            . 'The Study of @Twitter #test 1 '
+            'Weird IDs 9 ' . $excludeControl
+            . 'Fiction 7 ' . $excludeControl
+            . 'The Study Of P|pes 1 ' . $excludeControl
+            . 'The Study and Scor_ng of Dots.and-Dashes:Colons 1 ' . $excludeControl
+            . 'The Study of "Important" Things 1 ' . $excludeControl
+            . 'The Study of %\'s? 1 ' . $excludeControl
+            . 'The Study of +\'s? 1 ' . $excludeControl
+            . 'The Study of @Twitter #test 1 ' . $excludeControl
             . 'more ...',
             $this->findCss($page, '#modal #facet-list-count')->getText()
         );
@@ -107,10 +108,10 @@ class SearchFacetsTest extends \VuFindTest\Unit\MinkTestCase
         $items = $page->findAll('css', '#modal #facet-list-index .js-facet-item');
         $this->assertEquals($limit, count($items)); // reset number of items
         $this->assertEquals(
-            'Fiction 7 '
-            . 'The Study Of P|pes 1 '
-            . 'The Study and Scor_ng of Dots.and-Dashes:Colons 1 '
-            . 'The Study of "Important" Things 1 '
+            'Fiction 7 ' . $excludeControl
+            . 'The Study Of P|pes 1 ' . $excludeControl
+            . 'The Study and Scor_ng of Dots.and-Dashes:Colons 1 ' . $excludeControl
+            . 'The Study of "Important" Things 1 ' . $excludeControl
             . 'more ...',
             $this->findCss($page, '#modal #facet-list-index')->getText()
         );
@@ -219,7 +220,7 @@ class SearchFacetsTest extends \VuFindTest\Unit\MinkTestCase
         $genreMore = $this->findCss($page, '#more-narrowGroupHidden-genre_facet');
         $genreMore->click();
         $this->facetListProcedure($page, $limit, true);
-        $this->assertEquals(1, count($page->find('css', '.active-filters')));
+        $this->assertEquals(1, count($page->findAll('css', '.active-filters')));
     }
 
     /**
diff --git a/themes/bootstrap3/js/account_ajax.js b/themes/bootstrap3/js/account_ajax.js
index 5c91feb3ef86c5113783b0ef4b389c57eddfefca..20d54942ea42780e0ce324edb27f108760e80073 100644
--- a/themes/bootstrap3/js/account_ajax.js
+++ b/themes/bootstrap3/js/account_ajax.js
@@ -33,7 +33,7 @@ VuFind.register('account', function Account() {
   var clearCache = function clearCache(name) {
     if (typeof name === "undefined") {
       for (var sub in _submodules) {
-        if (_submodules.hasOwnProperty(sub)) {
+        if (Object.prototype.hasOwnProperty.call(_submodules, sub)) {
           clearCache(sub);
         }
       }
@@ -49,7 +49,7 @@ VuFind.register('account', function Account() {
   var _render = function _render() {
     var accountStatus = ICON_LEVELS.NONE;
     for (var sub in _submodules) {
-      if (_submodules.hasOwnProperty(sub)) {
+      if (Object.prototype.hasOwnProperty.call(_submodules, sub)) {
         var $element = $(_submodules[sub].selector);
         if (!$element) {
           _statuses[sub] = INACTIVE;
diff --git a/themes/bootstrap3/js/advanced_search.js b/themes/bootstrap3/js/advanced_search.js
index 379df9584533652257f37cb1d82f52af0e880cca..443b6758d871fdfeff0e1d165f2a7223d24ab56d 100644
--- a/themes/bootstrap3/js/advanced_search.js
+++ b/themes/bootstrap3/js/advanced_search.js
@@ -76,6 +76,8 @@ function addGroup(_firstTerm, _firstField, _join) {
   var join = _join || '';
 
   var $newGroup = $($('#new_group_template').html());
+  $newGroup.find('.adv-group-label') // update label
+    .attr('for', 'search_lookfor' + nextGroup + '_0');
   $newGroup.attr('id', 'group' + nextGroup);
   $newGroup.find('.search_place_holder')
     .attr('id', 'group' + nextGroup + 'Holder')
diff --git a/themes/bootstrap3/js/cart.js b/themes/bootstrap3/js/cart.js
index 5f087025c8db8de2ae9078dbefbbf63a5513995e..656ba06f6756d8931d91ae795aa539fe1e93ac24 100644
--- a/themes/bootstrap3/js/cart.js
+++ b/themes/bootstrap3/js/cart.js
@@ -261,7 +261,7 @@ VuFind.register('cart', function Cart() {
 function cartFormHandler(event, data) {
   var keys = [];
   for (var i in data) {
-    if (data.hasOwnProperty(i)) {
+    if (Object.prototype.hasOwnProperty.call(data, i)) {
       keys.push(data[i].name);
     }
   }
diff --git a/themes/bootstrap3/js/common.js b/themes/bootstrap3/js/common.js
index e2c29a85b79418717dd159d750b7c07af2bdfa9c..3d7d75276c35c88891f690bb4422989c1abf3e0c 100644
--- a/themes/bootstrap3/js/common.js
+++ b/themes/bootstrap3/js/common.js
@@ -1,4 +1,4 @@
-/*global Event, grecaptcha, isPhoneNumberValid */
+/*global grecaptcha, isPhoneNumberValid */
 /*exported VuFind, htmlEncode, deparam, moreFacets, lessFacets, getUrlRoot, phoneNumberFormHandler, recaptchaOnLoad, resetCaptcha, bulkFormHandler */
 
 // IE 9< console polyfill
@@ -49,7 +49,7 @@ var VuFind = (function VuFind() {
 
   var addTranslations = function addTranslations(s) {
     for (var i in s) {
-      if (s.hasOwnProperty(i)) {
+      if (Object.prototype.hasOwnProperty.call(s, i)) {
         _translations[i] = s[i];
       }
     }
@@ -59,7 +59,7 @@ var VuFind = (function VuFind() {
     var translation = _translations[op] || op;
     if (replacements) {
       for (var key in replacements) {
-        if (replacements.hasOwnProperty(key)) {
+        if (Object.prototype.hasOwnProperty.call(replacements, key)) {
           translation = translation.replace(key, replacements[key]);
         }
       }
@@ -73,7 +73,7 @@ var VuFind = (function VuFind() {
   var refreshPage = function refreshPage() {
     var parts = window.location.href.split('#');
     if (typeof parts[1] === 'undefined') {
-      window.location.href = window.location.href;
+      window.location.reload();
     } else {
       var href = parts[0];
       // Force reload with a timestamp
diff --git a/themes/bootstrap3/js/hierarchyTree.js b/themes/bootstrap3/js/hierarchyTree.js
index e49222f232cc90db20a5a9ebbc834d1045401263..bf0b82668c322c427f87b9c16a48026b780b9713 100644
--- a/themes/bootstrap3/js/hierarchyTree.js
+++ b/themes/bootstrap3/js/hierarchyTree.js
@@ -15,7 +15,7 @@ function html_entity_decode(string) {
   var tmp_str = string.toString();
 
   for (var symbol in hash_map) {
-    if (hash_map.hasOwnProperty(symbol)) {
+    if (Object.prototype.hasOwnProperty.call(hash_map, symbol)) {
       var entity = hash_map[symbol];
       tmp_str = tmp_str.split(entity).join(symbol);
     }
diff --git a/themes/bootstrap3/js/lightbox.js b/themes/bootstrap3/js/lightbox.js
index 07b5e4ad592e9ada619d3b0390acc19c6541cf64..ed69c3af3c4339f017d2e2837b96ec3a259dcc53 100644
--- a/themes/bootstrap3/js/lightbox.js
+++ b/themes/bootstrap3/js/lightbox.js
@@ -3,11 +3,11 @@ VuFind.register('lightbox', function Lightbox() {
   // State
   var _originalUrl = false;
   var _currentUrl = false;
-  var _lightboxTitle = '';
+  var _lightboxTitle = false;
   var refreshOnClose = false;
   var _modalParams = {};
   // Elements
-  var _modal, _modalBody, _clickedButton = null;
+  var _modal, _modalBody, _modalTitle, _clickedButton = null;
   // Utilities
   function _storeClickedStatus() {
     _clickedButton = this;
@@ -15,13 +15,9 @@ VuFind.register('lightbox', function Lightbox() {
   function _html(content) {
     _modalBody.html(content);
     // Set or update title if we have one
-    if (_lightboxTitle !== '') {
-      var h2 = _modalBody.find('h2:first-child');
-      if (h2.length === 0) {
-        h2 = $('<h2/>').prependTo(_modalBody);
-      }
-      h2.text(_lightboxTitle);
-      _lightboxTitle = '';
+    if (_lightboxTitle) {
+      _modalTitle.text(_lightboxTitle);
+      _lightboxTitle = false;
     }
     _modal.modal('handleUpdate');
   }
@@ -242,12 +238,12 @@ VuFind.register('lightbox', function Lightbox() {
     }
     if (this.href.length > 1) {
       event.preventDefault();
-      var obj = {url: $(this).data('lightboxHref') || this.href};
-      if ("string" === typeof $(this).data('lightboxPost')) {
+      var obj = {url: $(this).data('lightbox-href') || this.href};
+      if ("string" === typeof $(this).data('lightbox-post')) {
         obj.type = 'POST';
-        obj.data = $(this).data('lightboxPost');
+        obj.data = $(this).data('lightbox-post');
       }
-      _lightboxTitle = $(this).data('lightboxTitle') || '';
+      _lightboxTitle = $(this).data('lightbox-title') || '';
       _modalParams = $(this).data();
       VuFind.modal('show');
       ajax(obj);
@@ -322,7 +318,7 @@ VuFind.register('lightbox', function Lightbox() {
       submit.attr('disabled', 'disabled');
     }
     // Store custom title
-    _lightboxTitle = submit.data('lightboxTitle') || $(form).data('lightboxTitle') || '';
+    _lightboxTitle = submit.data('lightbox-title') || $(form).data('lightbox-title') || '';
     // Get Lightbox content
     ajax({
       url: $(form).attr('action') || _currentUrl,
@@ -366,7 +362,7 @@ VuFind.register('lightbox', function Lightbox() {
         });
         imageCheck.done(function lightboxImageCheckDone(content, status, jq_xhr) {
           if (
-            jq_xhr.status === 200 && 
+            jq_xhr.status === 200 &&
             jq_xhr.getResponseHeader("content-type").substr(0, 5) === "image"
           ) {
             render('<div class="lightbox-image"><img src="' + url + '"/></div>');
@@ -388,6 +384,7 @@ VuFind.register('lightbox', function Lightbox() {
   function init() {
     _modal = $('#modal');
     _modalBody = _modal.find('.modal-body');
+    _modalTitle = _modal.find('#modal-title');
     _modal.on('hide.bs.modal', function lightboxHide() {
       if (VuFind.lightbox.refreshOnClose) {
         VuFind.refreshPage();
diff --git a/themes/bootstrap3/js/preview.js b/themes/bootstrap3/js/preview.js
index 49b1f927f3a7e0620cfb1fb3490838219a6e3756..354368dcd4fd5ca29044c7ee24465f8848c50875 100644
--- a/themes/bootstrap3/js/preview.js
+++ b/themes/bootstrap3/js/preview.js
@@ -8,7 +8,7 @@ function getGoogleOptions() {
   var opts_temp = $('[class*="googlePreviewSpan"]').attr("class").split('__')[1].split(';');
   var options = {};
   for (var key in opts_temp) {
-    if (opts_temp.hasOwnProperty(key)) {
+    if (Object.prototype.hasOwnProperty.call(opts_temp, key)) {
       var arr = opts_temp[key].split(':');
       options[arr[0]] = arr[1].split(',');
     }
@@ -85,7 +85,7 @@ function processOLBookInfo(booksInfo) {
 
 function processHTBookInfo(booksInfo) {
   for (var b in booksInfo) {
-    if (booksInfo.hasOwnProperty(b)) {
+    if (Object.prototype.hasOwnProperty.call(booksInfo, b)) {
       var bibkey = b.replace(/:/, '').toUpperCase();
       var $link = $('.previewHT.' + bibkey);
       var items = booksInfo[b].items;
diff --git a/themes/bootstrap3/less/bootstrap.less b/themes/bootstrap3/less/bootstrap.less
index a6bebeca40be727660b9eb23e3db9df179848e10..b4c17ec5915f27b57acc151e765d3ad9d50f101c 100644
--- a/themes/bootstrap3/less/bootstrap.less
+++ b/themes/bootstrap3/less/bootstrap.less
@@ -8,9 +8,7 @@ $fa-font-path: "../../bootstrap3/css/fonts";
 @import "vendor/font-awesome/font-awesome";
 <#SCSS */
 
-@import "vendor/bootstrap-accessibility/bootstrap-accessibility";
-@import "vendor/a11y";
-
+@import "components/accessibility";
 @import "components/variables";
 
 @import "components/advanced-search";
diff --git a/themes/bootstrap3/less/components/accessibility.less b/themes/bootstrap3/less/components/accessibility.less
new file mode 100644
index 0000000000000000000000000000000000000000..bf8301521e138e7724e76cd3c426063cd8030156
--- /dev/null
+++ b/themes/bootstrap3/less/components/accessibility.less
@@ -0,0 +1,53 @@
+@import "../vendor/bootstrap-accessibility/bootstrap-accessibility";
+@import "../vendor/a11y";
+
+/* ACCESSIBILITY IMPROVEMENTS */
+
+a {
+  text-decoration: underline;
+}
+
+/* AAA Color Contrasts */
+@badge-bg: #595959;
+
+@breadcrumb-color: #535353;
+@breadcrumb-active-color: #444;
+
+@state-danger-text: #8a211e;
+.alert-danger,
+.alert-danger a {
+  color: @state-danger-text;
+}
+
+/**
+ * OVERRIDE BS3 COLLAPSE MENU HIDDEN
+ *
+ * instead of display: none, keep things sr accessible
+ * https://tailwindcss.com/docs/screen-readers/
+ */
+.collapse.collapse:not(.in) {
+  position: absolute;
+  display: block;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  color: #000;
+  background-color: #fff;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  white-space: nowrap;
+  border-width: 0;
+}
+@media (min-width: 768px) {
+  .navbar-collapse.collapse:not(.in) {
+    position: static;
+    width: auto;
+    height: auto;
+    padding: 0;
+    margin: 0;
+    overflow: visible;
+    clip: auto;
+    white-space: normal;
+  }
+}
diff --git a/themes/bootstrap3/less/components/lightbox.less b/themes/bootstrap3/less/components/lightbox.less
index d7adf7a0bfd9a6bc76819e5e0af496c9ebb7130f..b1af70eb615c7d225ff774bfd69525af9c104d0c 100644
--- a/themes/bootstrap3/less/components/lightbox.less
+++ b/themes/bootstrap3/less/components/lightbox.less
@@ -6,7 +6,7 @@
   right: 0;
   z-index: 2;
   padding: .5rem 1rem;
-  opacity: .7;
+  opacity: 1;
 
   body.rtl & {
     left: 0;
@@ -15,17 +15,19 @@
 }
 @media (min-width: 768px) {
   #modal .modal-content > .close { // Fancy side X button
-    right: -50px;
+    right: -60px;
     font-size: 32pt;
     color: #fff;
+    background-color: rgba(0,0,0,0);
+    border-radius: 6px;
     body.rtl & {
-      left: -50px;
+      left: -60px;
       right: auto;
     }
   }
 }
 
-#modal .modal-content > .close:hover { opacity: 1; }
+#modal .modal-content > .close:hover { background-color: #000; }
 #modal .modal-body h1,
 #modal .modal-body h2 {
   margin-top: 0.3rem;
diff --git a/themes/bootstrap3/templates/Recommend/SideFacets.phtml b/themes/bootstrap3/templates/Recommend/SideFacets.phtml
index 0b0821e039cd29dc2e5186558f001e92bc3ecea9..9e3e5fdad05eac7c9d44f0953b5ff902c5a95822 100644
--- a/themes/bootstrap3/templates/Recommend/SideFacets.phtml
+++ b/themes/bootstrap3/templates/Recommend/SideFacets.phtml
@@ -14,7 +14,7 @@
 ?>
 <button class="close-offcanvas btn btn-link" data-toggle="offcanvas"><?=$this->transEsc('navigate_back') ?></button>
 <?php if ($results->getResultTotal() > 0): ?>
-  <h4><?=$this->transEsc(isset($this->overrideSideFacetCaption) ? $this->overrideSideFacetCaption : 'Narrow Search')?></h4>
+  <h2><?=$this->transEsc(isset($this->overrideSideFacetCaption) ? $this->overrideSideFacetCaption : 'Narrow Search')?></h2>
 <?php endif; ?>
 <?php $checkboxFilters = $results->getParams()->getCheckboxFacets(); ?>
 <?php $checkboxesShown = false; ?>
diff --git a/themes/bootstrap3/templates/Recommend/SideFacets/single-facet.phtml b/themes/bootstrap3/templates/Recommend/SideFacets/single-facet.phtml
index 719347269a11f340f3dd3df007afba9335f5e5e8..39707d78bd200a65ded034b97ad6003d7f1a8fa7 100644
--- a/themes/bootstrap3/templates/Recommend/SideFacets/single-facet.phtml
+++ b/themes/bootstrap3/templates/Recommend/SideFacets/single-facet.phtml
@@ -50,7 +50,10 @@
 
   <?php if ($this->exclude && !$this->facet['isApplied']): ?>
     <?php $excludeURL = $this->urlBase . $this->url->addFacet($this->group, $this->facet['value'], 'NOT'); ?>
-    <a href="<?=$excludeURL ?>" data-lightbox-ignore title="<?=$this->transEsc('exclude_facet') ?>" class="exclude"><i class="fa fa-times" aria-hidden="true"></i></a>
+    <a href="<?=$excludeURL ?>" data-lightbox-ignore class="exclude">
+      <i class="fa fa-times" aria-hidden="true"></i>
+      <span class="sr-only"><?=$this->transEsc('exclude_facet') ?></span>
+    </a>
   <?php endif; ?>
 
 <?=$hasSubLinks ? '</li>' : '</a>'; ?>
diff --git a/themes/bootstrap3/templates/Recommend/SideFacetsDeferred.phtml b/themes/bootstrap3/templates/Recommend/SideFacetsDeferred.phtml
index f155fc42d2c0827f1d4ecafa3c4c54737c120010..4e82bd5a93c28686230b5d556e4b19dcdac88335 100644
--- a/themes/bootstrap3/templates/Recommend/SideFacetsDeferred.phtml
+++ b/themes/bootstrap3/templates/Recommend/SideFacetsDeferred.phtml
@@ -15,7 +15,7 @@
   }
 ?>
 <?php if ($results->getResultTotal() > 0): ?>
-  <h4><?=$this->transEsc(isset($this->overrideSideFacetCaption) ? $this->overrideSideFacetCaption : 'Narrow Search')?></h4>
+  <h2><?=$this->transEsc(isset($this->overrideSideFacetCaption) ? $this->overrideSideFacetCaption : 'Narrow Search')?></h2>
   <div class="side-facets-container-ajax" data-search-class-id="<?=$this->escapeHtmlAttr($this->searchClassId) ?>" data-location="<?=$this->escapeHtmlAttr($this->location) ?>" data-config-index="<?=$this->escapeHtmlAttr($this->configIndex) ?>">
 <?php endif; ?>
 <?php $checkboxFilters = $results->getParams()->getCheckboxFacets(); ?>
diff --git a/themes/bootstrap3/templates/Recommend/TopFacets.phtml b/themes/bootstrap3/templates/Recommend/TopFacets.phtml
index 4c9325c4f2d191b88db81b4398584c272b18bb71..88c635863200a11e2cc4bcc6eb6df7be4a8a3a62 100644
--- a/themes/bootstrap3/templates/Recommend/TopFacets.phtml
+++ b/themes/bootstrap3/templates/Recommend/TopFacets.phtml
@@ -33,7 +33,10 @@
            --></a>
               <span class="badge"><?=$this->localizedNumber($thisFacet['count']) ?></span>
               <?php if ($allowExclude): ?>
-                <a href="<?=$this->currentPath() . $results->getUrlQuery()->addFacet($title, $thisFacet['value'], 'NOT')?>" title="<?=$this->transEsc('exclude_facet')?>"><i class="fa fa-times" aria-hidden="true"></i></a>
+                <a href="<?=$this->currentPath() . $results->getUrlQuery()->addFacet($title, $thisFacet['value'], 'NOT')?>">
+                  <i class="fa fa-times" aria-hidden="true"></i>
+                  <span class="sr-only"><?=$this->transEsc('exclude_facet') ?></span>
+                </a>
               <?php endif; ?>
             <?php endif; ?>
           </span>
diff --git a/themes/bootstrap3/templates/RecordDriver/DefaultRecord/toolbar.phtml b/themes/bootstrap3/templates/RecordDriver/DefaultRecord/toolbar.phtml
index daaea74f87e7b8fe35f387557f2bd84428e1ebb3..b22a16307a98746349297601cfda4df0d218a51f 100644
--- a/themes/bootstrap3/templates/RecordDriver/DefaultRecord/toolbar.phtml
+++ b/themes/bootstrap3/templates/RecordDriver/DefaultRecord/toolbar.phtml
@@ -4,38 +4,44 @@
     $this->headScript()->appendFile('https://s7.addthis.com/js/250/addthis_widget.js?pub=' . urlencode($addThis));
   }
 ?>
-<ul class="record-nav nav nav-pills hidden-print">
-  <?php if (count($this->driver->getCitationFormats()) > 0): ?>
-    <li><a class="cite-record" data-lightbox href="<?=$this->recordLink()->getActionUrl($this->driver, 'Cite')?>" rel="nofollow"><i class="fa fa-asterisk" aria-hidden="true"></i> <?=$this->transEsc('Cite this')?></a></li>
-  <?php endif; ?>
-  <?php if ($this->accountCapabilities()->getSmsSetting() !== 'disabled'): ?>
-    <li><a class="sms-record" data-lightbox href="<?=$this->recordLink()->getActionUrl($this->driver, 'SMS')?>" rel="nofollow"><i class="fa fa-mobile" aria-hidden="true"></i> <?=$this->transEsc('Text this')?></a></li>
-  <?php endif; ?>
-  <li><a class="mail-record" data-lightbox href="<?=$this->recordLink()->getActionUrl($this->driver, 'Email')?>" rel="nofollow"><i class="fa fa-envelope" aria-hidden="true"></i> <?=$this->transEsc('Email this')?></a></li>
+<nav class="record-nav hidden-print">
+  <ul class="nav nav-pills" aria-label="<?=$this->transEsc('ajaxview_label_tools'); ?>">
+    <?php if (count($this->driver->getCitationFormats()) > 0): ?>
+      <li role="none"><a class="cite-record" data-lightbox href="<?=$this->recordLink()->getActionUrl($this->driver, 'Cite')?>" rel="nofollow"><i class="fa fa-asterisk" aria-hidden="true"></i> <?=$this->transEsc('Cite this')?></a></li>
+    <?php endif; ?>
+    <?php if ($this->accountCapabilities()->getSmsSetting() !== 'disabled'): ?>
+      <li role="none"><a class="sms-record" data-lightbox href="<?=$this->recordLink()->getActionUrl($this->driver, 'SMS')?>" rel="nofollow"><i class="fa fa-mobile" aria-hidden="true"></i> <?=$this->transEsc('Text this')?></a></li>
+    <?php endif; ?>
+    <li role="none"><a class="mail-record" data-lightbox href="<?=$this->recordLink()->getActionUrl($this->driver, 'Email')?>" rel="nofollow"><i class="fa fa-envelope" aria-hidden="true"></i> <?=$this->transEsc('Email this')?></a></li>
 
-  <?php $exportFormats = $this->export()->getFormatsForRecord($this->driver); ?>
-  <?php if(count($exportFormats) > 0): ?>
-    <li class="dropdown">
-      <a class="export-toggle dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" href="<?=$this->recordLink()->getActionUrl($this->driver, 'Export')?>" rel="nofollow"><i class="fa fa-list-alt" aria-hidden="true"></i> <?=$this->transEsc('Export Record') ?></a>
-      <ul class="dropdown-menu" role="menu">
-        <?php foreach ($exportFormats as $exportFormat): ?>
-          <li role="none"><a <?php if ($this->export()->needsRedirect($exportFormat)): ?>target="<?=$this->escapeHtmlAttr($exportFormat)?>Main" <?php endif; ?>href="<?=$this->recordLink()->getActionUrl($this->driver, 'Export')?>?style=<?=$this->escapeHtmlAttr($exportFormat)?>" rel="nofollow" role="menuitem"><?=$this->transEsc('Export to')?> <?=$this->transEsc($this->export()->getLabelForFormat($exportFormat))?></a></li>
-        <?php endforeach; ?>
-      </ul>
-    </li>
-  <?php endif; ?>
+    <?php $exportFormats = $this->export()->getFormatsForRecord($this->driver); ?>
+    <?php if(count($exportFormats) > 0): ?>
+      <li role="none" class="dropdown">
+        <a class="export-toggle dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" href="<?=$this->recordLink()->getActionUrl($this->driver, 'Export')?>" rel="nofollow" aria-expanded="false" aria-controls="export-options"><i class="fa fa-list-alt" aria-hidden="true"></i> <?=$this->transEsc('Export Record') ?></a>
+        <ul class="dropdown-menu" id="export-options" role="menu">
+          <?php foreach ($exportFormats as $exportFormat): ?>
+            <li role="none">
+              <a <?php if ($this->export()->needsRedirect($exportFormat)): ?>target="<?=$this->escapeHtmlAttr($exportFormat)?>Main" <?php endif; ?>href="<?=$this->recordLink()->getActionUrl($this->driver, 'Export')?>?style=<?=$this->escapeHtmlAttr($exportFormat)?>" rel="nofollow" role="menuitem">
+                <?=$this->transEsc('Export to')?> <?=$this->transEsc($this->export()->getLabelForFormat($exportFormat))?>
+              </a>
+            </li>
+          <?php endforeach; ?>
+        </ul>
+      </li>
+    <?php endif; ?>
 
-  <?php if ($this->userlist()->getMode() !== 'disabled'): ?>
-    <li>
-      <?php if ($this->permission()->allowDisplay('feature.Favorites')): ?>
-        <a class="save-record" data-lightbox href="<?=$this->recordLink()->getActionUrl($this->driver, 'Save')?>" rel="nofollow"><i class="fa fa-star" aria-hidden="true"></i> <?=$this->transEsc('Add to favorites')?></a>
-      <?php elseif ($block = $this->permission()->getAlternateContent('feature.Favorites')): ?>
-        <?=$block?>
-      <?php endif; ?>
-    </li>
-  <?php endif; ?>
-  <?php if (!empty($addThis)): ?>
-    <li><a class="addThis addthis_button" href="https://www.addthis.com/bookmark.php?v=250&amp;pub=<?=urlencode($addThis)?>"><i class="fa fa-bookmark" aria-hidden="true"></i> <?=$this->transEsc('Bookmark')?></a></li>
-  <?php endif; ?>
-  <?=$this->render('record/cart-buttons.phtml', ['id' => $this->driver->getUniqueId(), 'source' => $this->driver->getSourceIdentifier()]); ?>
-</ul>
+    <?php if ($this->userlist()->getMode() !== 'disabled'): ?>
+      <li role="none">
+        <?php if ($this->permission()->allowDisplay('feature.Favorites')): ?>
+          <a class="save-record" data-lightbox href="<?=$this->recordLink()->getActionUrl($this->driver, 'Save')?>" rel="nofollow"><i class="fa fa-star" aria-hidden="true"></i> <?=$this->transEsc('Add to favorites')?></a>
+        <?php elseif ($block = $this->permission()->getAlternateContent('feature.Favorites')): ?>
+          <?=$block?>
+        <?php endif; ?>
+      </li>
+    <?php endif; ?>
+    <?php if (!empty($addThis)): ?>
+      <li role="none"><a class="addThis addthis_button" href="https://www.addthis.com/bookmark.php?v=250&amp;pub=<?=urlencode($addThis)?>"><i class="fa fa-bookmark" aria-hidden="true"></i> <?=$this->transEsc('Bookmark')?></a></li>
+    <?php endif; ?>
+    <?=$this->render('record/cart-buttons.phtml', ['id' => $this->driver->getUniqueId(), 'source' => $this->driver->getSourceIdentifier()]); ?>
+  </ul>
+</nav>
diff --git a/themes/bootstrap3/templates/RecordTab/similaritemscarousel.phtml b/themes/bootstrap3/templates/RecordTab/similaritemscarousel.phtml
index 17c2652ffddfb9fb761d87a468b221e425bf6880..282c490720e7094d0c98143069aef78379ef08d8 100644
--- a/themes/bootstrap3/templates/RecordTab/similaritemscarousel.phtml
+++ b/themes/bootstrap3/templates/RecordTab/similaritemscarousel.phtml
@@ -1,4 +1,4 @@
-<h4><?=$this->transEsc('Similar Items')?></h4>
+<h2><?=$this->transEsc('Similar Items')?></h2>
 <?php $similarRecords = $this->tab->getResults(); ?>
 <?php if (!empty($similarRecords)): ?>
   <?php $perPage = 4 ?>
diff --git a/themes/bootstrap3/templates/Related/Similar.phtml b/themes/bootstrap3/templates/Related/Similar.phtml
index feeab41e8e84fd4acd4a94b41e46fdcecb68d545..6a009dc27afef792c406f92b243f4524b75323b5 100644
--- a/themes/bootstrap3/templates/Related/Similar.phtml
+++ b/themes/bootstrap3/templates/Related/Similar.phtml
@@ -1,4 +1,4 @@
-<h4><?=$this->transEsc('Similar Items')?></h4>
+<h2><?=$this->transEsc('Similar Items')?></h2>
 <?php $similarRecords = $this->related->getResults(); ?>
 <?php if (!empty($similarRecords)): ?>
   <ul class="list-group">
diff --git a/themes/bootstrap3/templates/alphabrowse/home.phtml b/themes/bootstrap3/templates/alphabrowse/home.phtml
index 372cc8cb61c67f40826fdeeb968a2aa1d6c88380..9773cb8ec1770347171933da1c1b45492088f8b5 100644
--- a/themes/bootstrap3/templates/alphabrowse/home.phtml
+++ b/themes/bootstrap3/templates/alphabrowse/home.phtml
@@ -19,15 +19,25 @@
 <?php ob_start(); ?>
   <ul class="pager">
     <?php if (isset($this->prevpage)): ?>
-      <li><a href="<?=$this->escapeHtmlAttr($this->url('alphabrowse-home', [], ['query' => $baseQuery + ['page' => $this->prevpage]]))?>"><span aria-hidden="true">&laquo;</span> <?=$this->transEsc('Prev')?></a></li>
+      <li>
+        <a href="<?=$this->escapeHtmlAttr($this->url('alphabrowse-home', [], ['query' => $baseQuery + ['page' => $this->prevpage]]))?>" aria-label="<?=$this->transEsc('page_prev')?>">
+          <i class="fa fa-angle-left" aria-hidden="true"></i>
+          <?=$this->transEsc('Prev')?>
+        </a>
+      </li>
     <?php else: ?>
-      <li class="disabled"><a href="#"><span aria-hidden="true">&laquo;</span> <?=$this->transEsc('Prev')?></a></li>
+      <li class="disabled" aria-hidden="true"><i class="fa fa-angle-left"></i> <?=$this->transEsc('Prev')?></li>
     <?php endif; ?>
 
     <?php if (isset($this->nextpage)): ?>
-      <li><a href="<?=$this->escapeHtmlAttr($this->url('alphabrowse-home', [], ['query' => $baseQuery + ['page' => $this->nextpage]]))?>"><?=$this->transEsc('Next')?> <span aria-hidden="true">&raquo;</span></a></li>
+      <li>
+        <a href="<?=$this->escapeHtmlAttr($this->url('alphabrowse-home', [], ['query' => $baseQuery + ['page' => $this->nextpage]]))?>" aria-label="<?=$this->transEsc('page_next')?>">
+          <?=$this->transEsc('Next')?>
+          <i class="fa fa-angle-right" aria-hidden="true"></i>
+        </a>
+      </li>
     <?php else: ?>
-      <li class="disabled"><a href="#"><?=$this->transEsc('Next')?> <span aria-hidden="true">&raquo;</span></a></li>
+      <li class="disabled" aria-hidden="true"><?=$this->transEsc('Next')?> <i class="fa fa-angle-right"></i></li>
     <?php endif; ?>
   </ul>
 <?php $pageLinks = ob_get_contents(); ?>
diff --git a/themes/bootstrap3/templates/breadcrumbs/default.phtml b/themes/bootstrap3/templates/breadcrumbs/default.phtml
index 715f23a1b158f65de1894ac38e949d8068444682..baf8e259b68cf6635d11efbab8571d99af3137b9 100644
--- a/themes/bootstrap3/templates/breadcrumbs/default.phtml
+++ b/themes/bootstrap3/templates/breadcrumbs/default.phtml
@@ -5,7 +5,7 @@
 <?php endforeach; ?>
 <?php if(isset($this->layout()->end)): ?>
   <li title="<?=$this->layout()->title ?>"><?=$this->truncate($this->layout()->title, 100) ?></li>
-  <li class="active"><?=$this->layout()->end ?></li>
+  <li class="active" aria-current="page"><?=$this->layout()->end ?></li>
 <?php else: ?>
-  <li class="active" title="<?=$this->layout()->title ?>"><?=$this->truncate($this->layout()->title, 100) ?></li>
+  <li class="active" aria-current="page" title="<?=$this->layout()->title ?>"><?=$this->truncate($this->layout()->title, 100) ?></li>
 <?php endif; ?>
diff --git a/themes/bootstrap3/templates/collection/view.phtml b/themes/bootstrap3/templates/collection/view.phtml
index c457658ed8211da3a391a004027b720adc7847bc..d4f9c63195a7aed7ba49cf9a44317b2759d4c366 100644
--- a/themes/bootstrap3/templates/collection/view.phtml
+++ b/themes/bootstrap3/templates/collection/view.phtml
@@ -25,42 +25,7 @@
 ?>
 
 <?php if (isset($this->scrollData) && ($this->scrollData['previousRecord'] || $this->scrollData['nextRecord'])): ?>
-  <ul class="pager">
-    <?php if ($this->scrollData['previousRecord']): ?>
-      <?php if ($this->scrollData['firstRecord']): ?>
-        <li>
-          <a href="<?=$this->recordLink()->getUrl($this->scrollData['firstRecord'])?>" title="<?=$this->transEsc('First Search Result')?>" rel="nofollow"><span aria-hidden="true">&laquo;</span> <?=$this->transEsc('First')?></a>
-        </li>
-      <?php endif; ?>
-      <li>
-        <a href="<?=$this->recordLink()->getUrl($this->scrollData['previousRecord'])?>" title="<?=$this->transEsc('Previous Search Result')?>" rel="nofollow"><span aria-hidden="true">&laquo;</span> <?=$this->transEsc('Prev')?></a>
-      </li>
-    <?php else: ?>
-      <?php if ($this->scrollData['firstRecord']): ?>
-        <li class="disabled"><a href="#"><span aria-hidden="true">&laquo;</span> <?=$this->transEsc('First')?></a></li>
-      <?php endif; ?>
-      <li class="disabled"><a href="#"><span aria-hidden="true">&laquo;</span> <?=$this->transEsc('Prev')?></a></li>
-    <?php endif; ?>
-    <?=$this->transEsc('of_num_results', [
-      '%%position%%' => $this->localizedNumber($this->scrollData['currentPosition']),
-      '%%total%%' => $this->localizedNumber($this->scrollData['resultTotal'])
-    ]) ?>
-    <?php if ($this->scrollData['nextRecord']): ?>
-      <li>
-        <a href="<?=$this->recordLink()->getUrl($this->scrollData['nextRecord'])?>" title="<?=$this->transEsc('Next Search Result')?>" rel="nofollow"><?=$this->transEsc('Next')?> <span aria-hidden="true">&raquo;</span></a>
-      </li>
-      <?php if ($this->scrollData['lastRecord']): ?>
-        <li>
-          <a href="<?=$this->recordLink()->getUrl($this->scrollData['lastRecord'])?>" title="<?=$this->transEsc('Last Search Result')?>" rel="nofollow"><?=$this->transEsc('Last')?> <span aria-hidden="true">&raquo;</span></a>
-        </li>
-      <?php endif; ?>
-     <?php else: ?>
-      <li class="disabled"><a href="#"><?=$this->transEsc('Next')?> <span aria-hidden="true">&raquo;</span></a></li>
-      <?php if ($this->scrollData['lastRecord']): ?>
-        <li class="disabled"><a href="#"><?=$this->transEsc('Last')?> <span aria-hidden="true">&raquo;</span></a></li>
-      <?php endif; ?>
-    <?php endif; ?>
-  </ul>
+  <?=$this->render('record/prev-next.phtml'); ?>
 <?php endif; ?>
 
 <?=$this->record($this->driver)->getToolbar()?>
diff --git a/themes/bootstrap3/templates/collections/home.phtml b/themes/bootstrap3/templates/collections/home.phtml
index f220b1e66a99612d5f952086d963951bee8b38f3..928ef481ee871ad8c5c5080d8f03006b74e62c67 100644
--- a/themes/bootstrap3/templates/collections/home.phtml
+++ b/themes/bootstrap3/templates/collections/home.phtml
@@ -15,14 +15,14 @@
   <form class="form-inline" method="GET" action="<?=$this->url('collections-home')?>">
     <ul class="pager">
       <?php if (isset($prevpage)): ?>
-        <li><a href="<?=$this->url('collections-home')?>?from=<?=urlencode($from)?>&amp;page=<?=urlencode($prevpage)?><?=$this->escapeHtmlAttr($filterString)?>"><span aria-hidden="true">&laquo;</span> <?=$this->transEsc('Prev')?></a></li>
+        <li><a href="<?=$this->url('collections-home')?>?from=<?=urlencode($from)?>&amp;page=<?=urlencode($prevpage)?><?=$this->escapeHtmlAttr($filterString)?>" aria-label="<?=$this->transEsc('page_prev')?>"><i class="fa fa-angle-left" aria-hidden="true"></i> <?=$this->transEsc('Prev')?></a></li>
       <?php else: ?>
-        <li class="disabled"><a href="#"><span aria-hidden="true">&laquo;</span> <?=$this->transEsc('Prev')?></a></li>
+        <li class="disabled" aria-hidden="true"><a href="#"><i class="fa fa-angle-left"></i> <?=$this->transEsc('Prev')?></a></li>
       <?php endif; ?>
       <?php if (isset($nextpage)): ?>
-        <li><a href="<?=$this->url('collections-home')?>?from=<?=urlencode($from)?>&amp;page=<?=urlencode($nextpage)?><?=$this->escapeHtmlAttr($filterString)?>"><?=$this->transEsc('Next')?> <span aria-hidden="true">&raquo;</span></a></li>
+        <li><a href="<?=$this->url('collections-home')?>?from=<?=urlencode($from)?>&amp;page=<?=urlencode($nextpage)?><?=$this->escapeHtmlAttr($filterString)?>" aria-label="<?=$this->transEsc('page_next')?>"><?=$this->transEsc('Next')?> <i class="fa fa-angle-right" aria-hidden="true"></i></a></li>
       <?php else: ?>
-        <li class="disabled"><a href="#"><?=$this->transEsc('Next')?> <span aria-hidden="true">&raquo;</span></a></li>
+        <li class="disabled"><a href="#"><?=$this->transEsc('Next')?> <i class="fa fa-angle-right"></i></a></li>
       <?php endif; ?>
       <input type="submit" class="btn btn-default" value="<?=$this->transEsc('Jump to')?>" />
       <input type="text" name="from" value="<?=$this->escapeHtmlAttr($from)?>" class="form-control" />
@@ -46,8 +46,10 @@
           }
         }
       ?>
-      <a href="<?=$this->escapeHtmlAttr($removalUrl)?>"><img src="<?=$this->imageLink('silk/delete.png')?>" alt="Delete"/></a>
-      <a href="<?=$this->escapeHtmlAttr($removalUrl)?>"><?=$this->escapeHtml($filter['displayText'])?></a>
+      <a href="<?=$this->escapeHtmlAttr($removalUrl)?>">
+        <i class="fa fa-trash" title="<?=$this->transEsc('Delete') ?>"></i>
+        <?=$this->escapeHtml($filter['displayText'])?>
+      </a>
     </li>
   <?php endforeach; ?>
   </ul>
@@ -55,7 +57,12 @@
 
 <ul class="pagination">
   <?php foreach ($letters as $letter): ?>
-    <li<?php if (strcasecmp($letter, $from) == 0): ?> class="active"<?php endif; ?>><a href="<?=$this->url('collections-home')?>?from=<?=urlencode($letter)?><?=$this->escapeHtmlAttr($filterString)?>"><?=$this->escapeHtml($letter)?></a></li>
+    <li<?php if (strcasecmp($letter, $from) == 0): ?> class="active" aria-current="page"<?php endif; ?>>
+      <a href="<?=$this->url('collections-home')?>?from=<?=urlencode($letter)?><?=$this->escapeHtmlAttr($filterString)?>"
+         aria-label="<?=$this->transEsc('page_num', ['%%page%%' => $letter]); ?>">
+        <?=$this->escapeHtml($letter)?>
+      </a>
+    </li>
   <?php endforeach; ?>
 </ul>
 <?=$pageLinks ?>
diff --git a/themes/bootstrap3/templates/footer.phtml b/themes/bootstrap3/templates/footer.phtml
index dcd04d06b06b1a393ed54657989101021b9437a0..2604172f5de2cc093284cc3ec24ae11fbe5b9999 100644
--- a/themes/bootstrap3/templates/footer.phtml
+++ b/themes/bootstrap3/templates/footer.phtml
@@ -1,14 +1,14 @@
 <footer class="hidden-print">
   <div class="footer-container">
     <div class="footer-column">
-      <p><strong><?=$this->transEsc('Search Options')?></strong></p>
+      <h2><?=$this->transEsc('Search Options')?></h2>
       <ul>
         <li><a href="<?=$this->url('search-history')?>"><?=$this->transEsc('Search History')?></a></li>
         <li><a href="<?=$this->url('search-advanced')?>"><?=$this->transEsc('Advanced Search')?></a></li>
       </ul>
     </div>
     <div class="footer-column">
-      <p><strong><?=$this->transEsc('Find More')?></strong></p>
+      <h2><?=$this->transEsc('Find More')?></h2>
       <ul>
         <li><a href="<?=$this->url('browse-home')?>"><?=$this->transEsc('Browse the Catalog')?></a></li>
         <li><a href="<?=$this->url('alphabrowse-home')?>"><?=$this->transEsc('Browse Alphabetically')?></a></li>
@@ -18,7 +18,7 @@
       </ul>
     </div>
     <div class="footer-column">
-      <p><strong><?=$this->transEsc('Need Help?')?></strong></p>
+      <h2><?=$this->transEsc('Need Help?')?></h2>
       <ul>
         <li><a href="<?=$this->url('help-home')?>?topic=search&amp;_=<?=time() ?>" data-lightbox class="help-link"><?=$this->transEsc('Search Tips')?></a></li>
         <li><a href="<?=$this->url('content-page', ['page' => 'asklibrary']) ?>"><?=$this->transEsc('Ask a Librarian')?></a></li>
diff --git a/themes/bootstrap3/templates/header.phtml b/themes/bootstrap3/templates/header.phtml
index f20e24f0a390b3af48d90d83c3140fe9c483197e..838b40a33ac1560523f26e281e54d2bf1aeb52ca 100644
--- a/themes/bootstrap3/templates/header.phtml
+++ b/themes/bootstrap3/templates/header.phtml
@@ -1,16 +1,15 @@
 <?php $account = $this->auth()->getManager(); ?>
 <div class="banner container navbar">
   <div class="navbar-header">
-    <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#header-collapse">
-      <span class="sr-only">Toggle navigation</span>
-      <i class="fa fa-bars" aria-hidden="true"></i>
+    <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#header-collapse" aria-hidden="true">
+      <i class="fa fa-bars"></i>
     </button>
     <a class="navbar-brand lang-<?=$this->layout()->userLang ?>" href="<?=$this->url('home')?>">VuFind</a>
   </div>
   <?php if (!isset($this->layout()->renderingError)): ?>
     <div class="collapse navbar-collapse" id="header-collapse">
       <nav>
-        <ul role="navigation" class="nav navbar-nav navbar-right flip">
+        <ul class="nav navbar-nav navbar-right flip">
           <?php if ($this->feedback()->tabEnabled()): ?>
             <li>
               <a id="feedbackLink" data-lightbox href="<?=$this->url('feedback-home') ?>"><i class="fa fa-envelope" aria-hidden="true"></i> <?=$this->transEsc("Feedback")?></a>
@@ -82,8 +81,8 @@
 </div>
 <?php if ($this->layout()->searchbox !== false): ?>
   <div class="search container navbar">
-    <nav class="nav searchbox hidden-print">
+    <div class="nav searchbox hidden-print" role="search">
       <?=$this->layout()->searchbox ?>
-    </nav>
+    </div>
   </div>
 <?php endif; ?>
diff --git a/themes/bootstrap3/templates/layout/layout.phtml b/themes/bootstrap3/templates/layout/layout.phtml
index ee079054fae527d073f349a4ee1bf386c99c99a6..f7fb42299a7fb39e000da2cd921c7c849e10926d 100644
--- a/themes/bootstrap3/templates/layout/layout.phtml
+++ b/themes/bootstrap3/templates/layout/layout.phtml
@@ -156,7 +156,7 @@ JS;
       <a class="sr-only" href="#content"><?=$this->transEsc('Skip to content') ?></a>
       <?=$this->render('header.phtml')?>
     </header>
-    <nav class="breadcrumbs">
+    <nav class="breadcrumbs" aria-label="<?=$this->transEsc('Breadcrumbs') ?>">
       <div class="container">
         <?php if((!isset($this->layout()->showBreadcrumbs) || $this->layout()->showBreadcrumbs == true)
           && !empty($this->layout()->breadcrumbs)
@@ -190,11 +190,13 @@ JS;
     </div>
     <?=$this->render('footer.phtml')?>
     <!-- MODAL IN CASE WE NEED ONE -->
-    <div id="modal" class="modal fade hidden-print" tabindex="-1" role="dialog" aria-labelledby="modalTitle" aria-hidden="true">
+    <div id="modal" class="modal fade hidden-print" tabindex="-1" role="dialog" aria-labelledby="modal-title" aria-hidden="true">
       <div class="modal-dialog">
         <div class="modal-content">
           <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
-          <div class="modal-body"><?=$this->transEsc('Loading') ?>...</div>
+          <div class="modal-body">
+            <span id="modal-title"><?=$this->transEsc('Loading') ?>...</span>
+          </div>
         </div>
       </div>
     </div>
diff --git a/themes/bootstrap3/templates/layout/lightbox.phtml b/themes/bootstrap3/templates/layout/lightbox.phtml
index dbde8d57ff6f31fed0d44eb4995f0f334f921ac6..d54f7effce886e93ffcde3b562e71d29737df419 100644
--- a/themes/bootstrap3/templates/layout/lightbox.phtml
+++ b/themes/bootstrap3/templates/layout/lightbox.phtml
@@ -1,3 +1,4 @@
+<span id="modal-title" hidden><?=$this->headTitle()->renderTitle() ?></span>
 <?=$this->layout()->content?>
 <?=$this->piwik(['lightbox' => true])?>
 <?=$this->googleanalytics($this->serverUrl(true))?>
diff --git a/themes/bootstrap3/templates/myresearch/menu.phtml b/themes/bootstrap3/templates/myresearch/menu.phtml
index 8237e4e615b4d4713152afead1dc045c60efb40a..9f84f744c334accfc6809a0362ca76c46ffae465 100644
--- a/themes/bootstrap3/templates/myresearch/menu.phtml
+++ b/themes/bootstrap3/templates/myresearch/menu.phtml
@@ -4,7 +4,7 @@
   $capabilityParams = $patron ? ['patron' => $patron] : [];
 ?>
 <button class="close-offcanvas btn btn-link" data-toggle="offcanvas"><?=$this->transEsc('navigate_back') ?></button>
-<h4><?=$this->transEsc('Your Account')?></h4>
+<h3><?=$this->transEsc('Your Account')?></h3>
 <div class="myresearch-menu account-menu">
   <?php if ($this->userlist()->getMode() !== 'disabled'): ?>
     <a href="<?=$this->url('myresearch-favorites')?>"<?=$this->active == 'favorites' ? ' class="active"' : ''?>>
@@ -67,8 +67,9 @@
     </a>
   <?php endif; ?>
 </div>
+
 <?php if ($user && $this->userlist()->getMode() !== 'disabled'): ?>
-  <h4><?=$this->transEsc('Your Lists')?></h4>
+  <h3><?=$this->transEsc('Your Lists')?></h3>
   <div class="myresearch-menu">
     <a href="<?=$this->url('myresearch-favorites')?>"<?=$this->active == 'favorites' ? ' class="active"' : ''?>>
       <i class="fa fa-fw fa-star" aria-hidden="true"></i> <?=$this->transEsc('Your Favorites')?>
diff --git a/themes/bootstrap3/templates/record/cover.phtml b/themes/bootstrap3/templates/record/cover.phtml
index 96666e065e3f201efc8201d0e00a20c2d7884f6f..7a0b37c5d560ff41b434e7420025dc5a212298ff 100644
--- a/themes/bootstrap3/templates/record/cover.phtml
+++ b/themes/bootstrap3/templates/record/cover.phtml
@@ -1,8 +1,9 @@
 <?php /* Display thumbnail if appropriate: */ ?>
 <?php if ($cover): ?>
-  <?php if ($this->link): ?><a href="<?=$this->escapeHtmlAttr($this->link)?>" data-lightbox-image><?php endif; ?>
-  <img alt="<?=$this->transEsc('Cover Image')?>" <?php if ($linkPreview): ?>data-linkpreview="true" <?php endif; ?>class="recordcover" src="<?=$this->escapeHtmlAttr($cover); ?>"/>
-  <?php if ($this->link): ?></a><?php endif; ?>
+  <?php $alt = $this->link ? trim($this->driver->tryMethod('getTitle') ?? '') : ''; ?>
+  <?php if ($this->link && !empty($alt)): ?><a href="<?=$this->escapeHtmlAttr($this->link)?>"><?php endif; ?>
+  <img src="<?=$this->escapeHtmlAttr($cover); ?>" <?php if ($linkPreview): ?>data-linkpreview="true" <?php endif; ?>class="recordcover" alt="<?=$alt; ?>" />
+  <?php if ($this->link && !empty($alt)): ?></a><?php endif; ?>
 <?php else: ?>
-  <img src="<?=$this->url('cover-unavailable')?>" <?php if ($linkPreview): ?>data-linkpreview="true" <?php endif; ?>class="recordcover" alt="<?=$this->transEsc('No Cover Image')?>"/>
+  <img src="<?=$this->url('cover-unavailable')?>" <?php if ($linkPreview): ?>data-linkpreview="true" <?php endif; ?>class="recordcover" alt="" />
 <?php endif; ?>
diff --git a/themes/bootstrap3/templates/record/prev-next.phtml b/themes/bootstrap3/templates/record/prev-next.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..f683bb6c76ac65e53283e3b5d98028dfe3245e0e
--- /dev/null
+++ b/themes/bootstrap3/templates/record/prev-next.phtml
@@ -0,0 +1,52 @@
+<nav aria-label="<?=$this->transEsc('Search Results')?>">
+  <ul class="pager hidden-print">
+    <?php if ($this->scrollData['previousRecord']): ?>
+      <?php if ($this->scrollData['firstRecord']): ?>
+        <li role="none">
+          <a href="<?=$this->recordLink()->getUrl($this->scrollData['firstRecord'])?>" aria-label="<?=$this->transEsc('First Search Result')?>" rel="nofollow">
+            <i class="fa fa-angle-double-left" aria-hidden="true"></i>
+            <?=$this->transEsc('First')?>
+          </a>
+        </li>
+      <?php endif; ?>
+      <li role="none">
+        <a href="<?=$this->recordLink()->getUrl($this->scrollData['previousRecord'])?>" aria-label="<?=$this->transEsc('Previous Search Result')?>" rel="nofollow">
+          <i class="fa fa-angle-left" aria-hidden="true"></i>
+          <?=$this->transEsc('Prev')?>
+        </a>
+      </li>
+    <?php else: ?>
+      <?php if ($this->scrollData['firstRecord']): ?>
+        <li class="disabled" aria-hidden="true" role="none"><a href="#"><i class="fa fa-angle-double-left"></i> <?=$this->transEsc('First')?></a></li>
+      <?php endif; ?>
+      <li class="disabled" aria-hidden="true" role="none"><a href="#"><i class="fa fa-angle-left"></i> <?=$this->transEsc('Prev')?></a></li>
+    <?php endif; ?>
+
+    <?=$this->transEsc('of_num_results', [
+      '%%position%%' => $this->localizedNumber($this->scrollData['currentPosition']),
+      '%%total%%' => $this->localizedNumber($this->scrollData['resultTotal'])
+    ]) ?>
+
+    <?php if ($this->scrollData['nextRecord']): ?>
+      <li role="none">
+        <a href="<?=$this->recordLink()->getUrl($this->scrollData['nextRecord'])?>" aria-label="<?=$this->transEsc('Next Search Result')?>" rel="nofollow">
+          <?=$this->transEsc('Next')?>
+          <i class="fa fa-angle-right" aria-hidden="true"></i>
+        </a>
+      </li>
+      <?php if ($this->scrollData['lastRecord']): ?>
+        <li role="none">
+          <a href="<?=$this->recordLink()->getUrl($this->scrollData['lastRecord'])?>" aria-label="<?=$this->transEsc('Last Search Result')?>" rel="nofollow">
+            <?=$this->transEsc('Last')?>
+            <i class="fa fa-angle-double-right" aria-hidden="true"></i>
+          </a>
+        </li>
+      <?php endif; ?>
+    <?php else: ?>
+      <li class="disabled" aria-hidden="true" role="none"><a href="#"><?=$this->transEsc('Next')?> <i class="fa fa-angle-right"></i></a></li>
+      <?php if ($this->scrollData['lastRecord']): ?>
+        <li class="disabled" aria-hidden="true" role="none"><a href="#"><?=$this->transEsc('Last')?> <i class="fa fa-angle-double-right"></i></a></li>
+      <?php endif; ?>
+    <?php endif; ?>
+  </ul>
+</nav>
diff --git a/themes/bootstrap3/templates/record/view.phtml b/themes/bootstrap3/templates/record/view.phtml
index a35ff7909c6f12742e615c04c0c308ad42c3e008..9d23d1a282f2dc2f763049040931b9fd14bbb264 100644
--- a/themes/bootstrap3/templates/record/view.phtml
+++ b/themes/bootstrap3/templates/record/view.phtml
@@ -14,47 +14,12 @@
 
   // Set up breadcrumbs:
   $this->layout()->breadcrumbs = '<li>' . $this->searchMemory()->getLastSearchLink($this->transEsc('Search'), '', '</li> ') .
-    '<li class="active">' . $this->recordLink()->getBreadcrumb($this->driver) . '</li> ';
+    '<li class="active" aria-current="page">' . $this->recordLink()->getBreadcrumb($this->driver) . '</li> ';
   $this->layout()->title = $this->driver->getShortTitle();
 ?>
 
 <?php if (isset($this->scrollData) && ($this->scrollData['previousRecord'] || $this->scrollData['nextRecord'])): ?>
-  <ul class="pager hidden-print">
-    <?php if ($this->scrollData['previousRecord']): ?>
-      <?php if ($this->scrollData['firstRecord']): ?>
-        <li>
-          <a href="<?=$this->recordLink()->getUrl($this->scrollData['firstRecord'])?>" title="<?=$this->transEsc('First Search Result')?>" rel="nofollow"><span aria-hidden="true">&laquo;</span> <?=$this->transEsc('First')?></a>
-        </li>
-      <?php endif; ?>
-      <li>
-        <a href="<?=$this->recordLink()->getUrl($this->scrollData['previousRecord'])?>" title="<?=$this->transEsc('Previous Search Result')?>" rel="nofollow"><span aria-hidden="true">&laquo;</span> <?=$this->transEsc('Prev')?></a>
-      </li>
-    <?php else: ?>
-      <?php if ($this->scrollData['firstRecord']): ?>
-        <li class="disabled"><a href="#"><span aria-hidden="true">&laquo;</span> <?=$this->transEsc('First')?></a></li>
-      <?php endif; ?>
-      <li class="disabled"><a href="#"><span aria-hidden="true">&laquo;</span> <?=$this->transEsc('Prev')?></a></li>
-    <?php endif; ?>
-    <?=$this->transEsc('of_num_results', [
-      '%%position%%' => $this->localizedNumber($this->scrollData['currentPosition']),
-      '%%total%%' => $this->localizedNumber($this->scrollData['resultTotal'])
-    ]) ?>
-    <?php if ($this->scrollData['nextRecord']): ?>
-      <li>
-        <a href="<?=$this->recordLink()->getUrl($this->scrollData['nextRecord'])?>" title="<?=$this->transEsc('Next Search Result')?>" rel="nofollow"><?=$this->transEsc('Next')?> <span aria-hidden="true">&raquo;</span></a>
-      </li>
-      <?php if ($this->scrollData['lastRecord']): ?>
-        <li>
-          <a href="<?=$this->recordLink()->getUrl($this->scrollData['lastRecord'])?>" title="<?=$this->transEsc('Last Search Result')?>" rel="nofollow"><?=$this->transEsc('Last')?> <span aria-hidden="true">&raquo;</span></a>
-        </li>
-      <?php endif; ?>
-     <?php else: ?>
-      <li class="disabled"><a href="#"><?=$this->transEsc('Next')?> <span aria-hidden="true">&raquo;</span></a></li>
-      <?php if ($this->scrollData['lastRecord']): ?>
-        <li class="disabled"><a href="#"><?=$this->transEsc('Last')?> <span aria-hidden="true">&raquo;</span></a></li>
-      <?php endif; ?>
-    <?php endif; ?>
-  </ul>
+  <?=$this->render('record/prev-next.phtml'); ?>
 <?php endif; ?>
 
 <?=$this->record($this->driver)->getToolbar()?>
diff --git a/themes/bootstrap3/templates/search/advanced/layout.phtml b/themes/bootstrap3/templates/search/advanced/layout.phtml
index 06cd9f477ba4fe86895cfea4e4b6ba6fcaca4f43..19df9960891ea79aa72c90963d24707b78096cfa 100644
--- a/themes/bootstrap3/templates/search/advanced/layout.phtml
+++ b/themes/bootstrap3/templates/search/advanced/layout.phtml
@@ -86,7 +86,7 @@
       </div>
       <span id="groupPlaceHolder" class="hidden">
         <i class="fa fa-plus-circle" aria-hidden="true"></i>
-        <a href="#" onClick="addGroup();return false"><?= $this->transEsc('add_search_group') ?></a>
+        <a href="#" onClick="addGroup();return false" role="button"><?= $this->transEsc('add_search_group') ?></a>
       </span>
       <?php /* fallback to a fixed set of search groups/fields if JavaScript is turned off */ ?>
       <div class="no-js">
@@ -99,7 +99,7 @@
             <?php endif; ?>
             <div id="group<?=$group ?>" class="adv-group">
               <div class="adv-group-terms">
-                <label class="adv-group-label"><?=$this->transEsc("adv_search_label")?>:</label>
+                <label class="adv-group-label" for="search_lookfor<?=$group ?>_0"><?=$this->transEsc("adv_search_label")?>:</label>
                 <?php for($search = 0; $search < 3 || (isset($setQueries[$group]) && $search < count($setQueries[$group])); $search++): ?>
                   <?php if($group == 0 && $search == 0): ?>
                     <div id="new_search_template">
@@ -111,13 +111,16 @@
                         <option value="<?=$this->escapeHtml($searchVal)?>"<?php if (isset($setQueries[$group][$search]) && $searchVal == $setQueries[$group][$search]->getHandler()): ?> selected<?php endif; ?>><?=$this->transEsc($searchDesc)?></option>
                       <?php endforeach; ?>
                     </select>
-                    <a href="#" class="adv-term-remove hidden">&times;</a>
+                    <a href="#" class="adv-term-remove hidden">
+                      <i class="fa fa-times" aria-hidden="true"></i>
+                      <span class="sr-only"><?=$this->transEsc('remove') ?></span>
+                    </a>
                   </div>
                   <?php if($group == 0 && $search == 0): ?>
                       </div>
                     <span class="float-left">
                       <i class="fa fa-plus-circle search_place_holder hidden" aria-hidden="true"></i>
-                      <a href="#" class="add_search_link hidden"><?=$this->transEsc("add_search")?></a>
+                      <a href="#" class="add_search_link hidden" role="button"><?=$this->transEsc("add_search")?></a>
                     </span>
                   <?php endif; ?>
                 <?php endfor; ?>
@@ -130,7 +133,7 @@
                   <option value="NOT"<?php if(isset($setSearchGroups[$group]) && 'NOT' == $setSearchGroups[$group]):?> selected<?php endif; ?>><?=$this->transEsc("search_NOT")?></option>
                 </select>
               </div>
-              <a href="#" class="adv-group-close hidden"><i class="fa fa-close"></i> <?=$this->transEsc("del_search")?></a>
+              <a href="#" class="adv-group-close hidden" role="button"><i class="fa fa-close"></i> <?=$this->transEsc("del_search")?></a>
             </div>
             <?php if($group == 0): ?>
               </div>
@@ -158,7 +161,7 @@
         <input type="hidden" name="dfApplied" value="1" />
       <?php endif ?>
       <?php if (!empty($searchFilters)): ?>
-        <h4><?=$this->transEsc("adv_search_filters")?></h4>
+        <h2><?=$this->transEsc("adv_search_filters")?></h2>
         <div class="facet-group">
           <label class="checkbox">
             <input type="checkbox" checked="checked" class="checkbox-select-all"/>
@@ -174,7 +177,7 @@
           </div>
         <?php endforeach; ?>
       <?php endif; ?>
-      <h4><?=$this->transEsc("Search Tips")?></h4>
+      <h2><?=$this->transEsc("Search Tips")?></h2>
       <div class="facet-group">
         <a class="facet help-link" data-lightbox href="<?=$this->url('help-home')?>?topic=advsearch&amp;_=<?=time() ?>"><?=$this->transEsc("Help with Advanced Search")?></a>
         <a class="facet help-link" data-lightbox href="<?=$this->url('help-home')?>?topic=search&amp;_=<?=time() ?>"><?=$this->transEsc("Help with Search Operators")?></a>
diff --git a/themes/bootstrap3/templates/search/pagination.phtml b/themes/bootstrap3/templates/search/pagination.phtml
index 168bd1484e5e4a2bbe4d39f7b544653672c11829..210bcb9b43e0b933988a3f07b68b62510067d41c 100644
--- a/themes/bootstrap3/templates/search/pagination.phtml
+++ b/themes/bootstrap3/templates/search/pagination.phtml
@@ -1,26 +1,42 @@
 <?php if ($this->pageCount): ?>
-  <ul class="pagination">
+  <ul class="pagination" aria-label="<?=$this->transEsc('pagination_label')?>">
     <?php if (isset($this->previous)): ?>
       <?php if (!isset($this->options['disableFirst']) || !$this->options['disableFirst']): ?>
-        <li><a href="<?=$this->currentPath() . $this->results->getUrlQuery()->setPage(1)?>">[1]</a></li>
+        <li role="none">
+          <a href="<?=$this->currentPath() . $this->results->getUrlQuery()->setPage(1)?>" aria-label="<?=$this->transEsc('page_first')?>">[1]</a>
+        </li>
       <?php endif; ?>
-      <li><a class="page-prev" href="<?=$this->currentPath() . $this->results->getUrlQuery()->setPage($this->previous)?>"><span aria-hidden="true">&laquo;</span> <?=$this->transEsc('Prev')?></a></li>
+      <li role="none">
+        <a class="page-prev" href="<?=$this->currentPath() . $this->results->getUrlQuery()->setPage($this->previous)?>" aria-label="<?=$this->transEsc('page_prev')?>">
+          <i class="fa fa-angle-left" aria-hidden="true"></i>
+          <?=$this->transEsc('Prev')?>
+        </a>
+      </li>
     <?php endif; ?>
 
     <?php if (count($this->pagesInRange) > 1): ?>
       <?php foreach ($this->pagesInRange as $page): ?>
         <?php if ($page != $this->current): ?>
-          <li><a href="<?=$this->currentPath() . $this->results->getUrlQuery()->setPage($page)?>"><?=$page?></a></li>
+          <li role="none">
+            <a href="<?=$this->currentPath() . $this->results->getUrlQuery()->setPage($page)?>" aria-label="<?=$this->transEsc('page_no', ['%%page%%' => $page])?>"><?=$page?></a>
+          </li>
         <?php else: ?>
-          <li class="active"><span><?=$page?></span></li>
+          <li role="none" class="active" aria-current="page"><span><?=$page?></span></li>
         <?php endif; ?>
       <?php endforeach; ?>
     <?php endif; ?>
 
     <?php if (isset($this->next)): ?>
-      <li><a class="page-next" href="<?=$this->currentPath() . $this->results->getUrlQuery()->setPage($this->next)?>"><?=$this->transEsc('Next');?> <span aria-hidden="true">&raquo;</span></a></li>
+      <li role="none">
+        <a class="page-next" href="<?=$this->currentPath() . $this->results->getUrlQuery()->setPage($this->next)?>" aria-label="<?=$this->transEsc('page_next')?>">
+          <?=$this->transEsc('Next');?>
+          <i class="fa fa-angle-right" aria-hidden="true"></i>
+        </a>
+      </li>
       <?php if (!isset($this->options['disableLast']) || !$this->options['disableLast']): ?>
-        <li><a href="<?=$this->currentPath() . $this->results->getUrlQuery()->setPage($this->pageCount)?>">[<?=$this->pageCount?>]</a></li>
+        <li role="none">
+          <a href="<?=$this->currentPath() . $this->results->getUrlQuery()->setPage($this->pageCount)?>" aria-label="<?=$this->transEsc('page_last')?>">[<?=$this->pageCount?>]</a>
+        </li>
       <?php endif; ?>
     <?php endif; ?>
   </ul>
diff --git a/themes/bootstrap3/templates/search/results.phtml b/themes/bootstrap3/templates/search/results.phtml
index 46e1b8e21a2e83149748999edc89e8d80784f4c5..5f6f4be0df1e59b0a4d3fd7181d2ed4a580c9244 100644
--- a/themes/bootstrap3/templates/search/results.phtml
+++ b/themes/bootstrap3/templates/search/results.phtml
@@ -59,7 +59,7 @@
     <?php endforeach; ?>
   <?php endif; ?>
   <?=$this->flashmessages()?>
-  <nav class="search-header hidden-print">
+  <div class="search-header hidden-print">
     <div class="search-stats">
       <?php if ($recordTotal > 0): ?>
         <?=$this->context()->renderInContext('search/controls/showing.phtml', ['lookfor' => $lookfor, 'recordTotal' => $recordTotal]) ?>
@@ -78,7 +78,7 @@
         <?=$this->render('search/controls/view.phtml')?>
       </div>
     <?php endif; ?>
-  </nav>
+  </div>
   <?php /* End Listing Options */ ?>
 
   <?php if ($recordTotal < 1): ?>