diff --git a/local/alpha/config/vufind/searches.ini b/local/alpha/config/vufind/searches.ini
index c259bc11f28286b2a81579ecd8e5f050c11f314c..6ac686dcbd2734ad5274d3ec21a7b7ebcb50118c 100644
--- a/local/alpha/config/vufind/searches.ini
+++ b/local/alpha/config/vufind/searches.ini
@@ -26,4 +26,7 @@ highlighting = true
 
 [IndexShards]
 ai = ai.ub.uni-leipzig.de/solr/biblio
-main = index.ub.uni-leipzig.de/solr/biblio
\ No newline at end of file
+main = index.ub.uni-leipzig.de/solr/biblio
+
+[NewItem]
+method = ils
\ No newline at end of file
diff --git a/local/config/vufind/config.ini b/local/config/vufind/config.ini
index 336c633977e56d3869521d78678d4a0b6cff5afd..7a05100d552814eac475fabed2bb29b81175a52d 100644
--- a/local/config/vufind/config.ini
+++ b/local/config/vufind/config.ini
@@ -1552,9 +1552,13 @@ remove[] = "gndmusic"
 ; identifier[replace] is the replacing phrase
 ; identifier[method] calls an alternative method with the link as parameter.
 ;    The method is expected in View\Helper\Root\Record.php
+; identifier[function] calls a function if available with the link as parameter.
+;    The function performed on the url *before* replacing with the replacement. It is 
+;    intended to perform url-encoding links so they can be used as parameter value.
 ; Examples:
 ; url[pattern] = url.pattern.to.resolve.link
 ; url[method]  = resolveLink
+; url[method]  = urlencode (https://www.php.net/manual/de/function.urlencode.php)
 nbn[pattern] = "^urn:nbn:"
 nbn[search]  = "urn:nbn:"
 nbn[replace] = "http://nbn-resolving.de/urn:nbn:"
diff --git a/local/config/vufind/searches.ini b/local/config/vufind/searches.ini
index 64ab99beb2ddc6f028d4c2c8a8e4196590d2f9a6..1dbec8eddd33723afa4ba2786ee92204f0ada6a1 100644
--- a/local/config/vufind/searches.ini
+++ b/local/config/vufind/searches.ini
@@ -435,7 +435,7 @@ side[] = "ExpandFacets:Author"
 ; (see https://vufind.org/wiki/indexing:tracking_record_changes). If using the ILS,
 ; your driver must support the getNewItems() method.
 ; Valid options: ils, solr; default: ils
-method = ils
+method = solr
 ; Comma-separated list of date ranges to offer to the user (i.e. 1,5,30 = one day
 ; old, or five days old, or thirty days old). If using the "ils" method, be careful
 ; about raising the maximum age too high -- searching very long date ranges may put
diff --git a/local/languages/de.ini b/local/languages/de.ini
index 29ae8c90af51aed7880a7919bebfb4fabd72158d..b257ab271cbbbf0aba982fd9af093519c8487ff9 100644
--- a/local/languages/de.ini
+++ b/local/languages/de.ini
@@ -217,6 +217,7 @@ Change Profile Data = "Benutzerdaten ändern"
 Change User PIN of Self-Checkout = "Benutzer-PIN für Selbstverbuchung ändern"
 Checkedout = "Ausgeliehene Medien"
 Checkedoutpermanent = "Längerfristige Ausleihen"
+Choose Period = Zeitraum auswählen
 Cite this = Zitieren
 Click here to view book = Volltext
 Clock = "Uhr"
@@ -2050,3 +2051,6 @@ select_item = "Titel auswählen"
 Email = "Mailen"
 Print = "Drucken"
 bookbag_email_selected = "Links zu ausgewählten Medien per E-Mail versenden"
+
+; #18441
+Skip_navigation_links = "Sprunglinks zur Suche und zum Inhalt"
diff --git a/local/languages/en.ini b/local/languages/en.ini
index 962d249c742cb4d301349c47973d00dd95cf1a62..a4cb46bf4b95a77e2b4f17edcbcb02e68f6345b7 100644
--- a/local/languages/en.ini
+++ b/local/languages/en.ini
@@ -355,6 +355,7 @@ By Alphabetical = "In Alphabetic Order"
 Cannot find similar records = "Cannot find similar records."
 Cassette = Cassette
 Checkedoutpermanent = "Checked Out Permanent Items"
+Choose Period = Choose Date Range
 # Chinese = "中文(繁體)"
 Chinese = Chinese
 Clock = ""
@@ -2131,4 +2132,7 @@ form-button-submit = "Submit the completed form"
 offcanvas-toggler-search-tips = "Show search help"
 
 ; #18019 remove if using VuFind 7.0
-select_item = "Select item"
\ No newline at end of file
+select_item = "Select item"
+
+; #18441
+Skip_navigation_links = "Skip navigation links"
diff --git a/module/fid/src/Controller/UserController.php b/module/fid/src/Controller/UserController.php
index 63f3a72afa7cbd2a6d99a7432a5f305f4df3347e..95947c51392cc49649f61ac159a4e5ca0c06b565 100644
--- a/module/fid/src/Controller/UserController.php
+++ b/module/fid/src/Controller/UserController.php
@@ -305,7 +305,7 @@ class UserController extends AbstractBase
         $messenger = $this->getMessenger();
 
         try {
-            $user = $this->client->requestUserDetails($data['id']);
+            $user = clone($this->client->requestUserDetails($data['id']));
             $form->getHydrator()->hydrate($data, $user);
             $this->client->requestUserUpdate($user);
             $message = $this->translate('fid::user_update_success');
@@ -411,7 +411,7 @@ class UserController extends AbstractBase
         }
 
         try {
-            $user = $this->client->requestUserDetails();
+            $user = clone($this->client->requestUserDetails());
             $user->setUsername($query->get('username'));
             $this->client->requestUserUsernameUpdate($user);
             $message = $this->translate('fid::username_update_success');
@@ -563,7 +563,7 @@ class UserController extends AbstractBase
             $form->getData(), new PasswordChangeModel());
 
         try {
-            $user = $this->client->requestUserDetails();
+            $user = clone($this->client->requestUserDetails());
             $user->setPassword($password = $model->getPassword());
             $this->client->requestUserPasswordUpdate($user);
             $message = $this->translate('fid::password_change_success');
diff --git a/module/fid/src/View/Helper/Root/GetIt.php b/module/fid/src/View/Helper/Root/GetIt.php
index df1436e69ded0e9c350fc006fe11975766a39225..780c6dc60be01d1f94e75d43d939598066f14b6a 100644
--- a/module/fid/src/View/Helper/Root/GetIt.php
+++ b/module/fid/src/View/Helper/Root/GetIt.php
@@ -701,13 +701,17 @@ class GetIt extends AbstractHelper
             //&& (!empty($this->isbn) || !empty($this->issn))
             && !preg_grep($this->_getNonSourceIds('source_idsV8_8'), $this->collection)
         ) {
-            if (preg_grep($this->_getNonSourceIds('source_idsV8_1'), $this->format)
+            if (!in_array('Online', $this->facetAvail)
+                && preg_grep($this->_getNonSourceIds('source_idsV8_1'), $this->format)
             ) {
-                $bossData = true;
                 if (!$this->isCollection) {
                     $showPartCopyButton = isset($this->config->Permission->allowSubitoPartialCopy) ?
                         $this->config->Permission->allowSubitoPartialCopy : true;
                 }
+            }
+            if (preg_grep($this->_getNonSourceIds('source_idsV8_1'), $this->format)
+            ) {
+                $bossData = true;
             } elseif (in_array('Local', $this->facetAvail)
                 && preg_grep($this->_getNonSourceIds('source_idsV8_3'), $this->format)
             ) {
@@ -786,7 +790,8 @@ class GetIt extends AbstractHelper
         }
         //END showLinks
         //orderButton
-        if (preg_grep($this->_getNonSourceIds('source_idsV8_1'), $this->format)
+        if (in_array('Local', $this->facetAvail)
+            && preg_grep($this->_getNonSourceIds('source_idsV8_1'), $this->format)
             && !preg_grep($this->_getNonSourceIds('source_idsV8_9'), $this->institution)
             && !$this->isCollection
             && !preg_grep($this->_getNonSourceIds('source_idsV8_8'), $this->collection)
diff --git a/module/finc/config/module.config.php b/module/finc/config/module.config.php
index f2631035d077e3e888772a4c53bf14cebc96ab53..515cee83dffde153dc95b8c1f5e2ee32ed7a3658 100644
--- a/module/finc/config/module.config.php
+++ b/module/finc/config/module.config.php
@@ -51,9 +51,11 @@ $config = [
     'controller_plugins' => [
         'factories' => [
             'finc\Controller\Plugin\EmailHold' => 'finc\Controller\Plugin\EmailHoldFactory',
+            'finc\Controller\Plugin\NewItems' => 'finc\Controller\Plugin\NewItemsFactory'
         ],
         'aliases' => [
-            'emailHold' => 'finc\Controller\Plugin\EmailHold'
+            'emailHold' => 'finc\Controller\Plugin\EmailHold',
+            'newItems' => 'finc\Controller\Plugin\NewItems'
         ]
     ],
     'vufind' => [
diff --git a/module/finc/src/finc/Controller/Plugin/NewItems.php b/module/finc/src/finc/Controller/Plugin/NewItems.php
new file mode 100644
index 0000000000000000000000000000000000000000..25998371eac9064e2bbef24bea316f6bd7dfb29e
--- /dev/null
+++ b/module/finc/src/finc/Controller/Plugin/NewItems.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ * VuFind Action Helper - New Items Support Methods
+ *
+ * PHP version 7
+ *
+ * Copyright (C) Leipzig University Library 2020.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * @category VuFind
+ * @package  Controller_Plugins
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @author   Robert Lange <lange@ub.uni-leipzig.de>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     https://vufind.org Main Page
+ */
+namespace finc\Controller\Plugin;
+
+use Zend\Config\Config;
+use Zend\Mvc\Controller\Plugin\AbstractPlugin;
+
+/**
+ * Zend action helper to perform new items-related actions
+ *
+ * @category VuFind
+ * @package  Controller_Plugins
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @author   Robert Lange <lange@ub.uni-leipzig.de>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     https://vufind.org Main Page
+ */
+class NewItems extends \VuFind\Controller\Plugin\NewItems
+{
+    /**
+     * Main Configuration
+     *
+     * @var null|Config
+     */
+    protected $mainConfig;
+
+    /**
+     * Constructor
+     *
+     * @param Config $searchConfig Configuration
+     * @param Config $mainConfig Configuration
+     */
+    public function __construct(Config $searchConfig, Config $mainConfig)
+    {
+        $this->config = $searchConfig;
+        $this->mainConfig = $mainConfig;
+    }
+
+    /**
+     * Get a Solr filter to limit to the specified number of days.
+     *
+     * @param int $range Days to search
+     *
+     * @return string
+     */
+    public function getSolrFilter($range)
+    {
+        $field = 'first_indexed';
+        if (!empty($isilPrefix = $this->mainConfig->CustomIndex->indexExtension)) {
+            $field = "{$isilPrefix}_date";
+        }
+        return "$field:[NOW-{$range}DAY TO NOW]";
+    }
+}
diff --git a/module/finc/src/finc/Controller/Plugin/NewItemsFactory.php b/module/finc/src/finc/Controller/Plugin/NewItemsFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..42fe4cf4689f3f013792ef9137a65f4ad74affbb
--- /dev/null
+++ b/module/finc/src/finc/Controller/Plugin/NewItemsFactory.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Factory for controller plugins.
+ *
+ * PHP version 7
+ *
+ * Copyright (C) Leipzig University Library 2020.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * @category VuFind
+ * @package  View_Helpers
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @author   Robert Lange <lange@ub.uni-leipzig.de>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     https://vufind.org/wiki/development Wiki
+ */
+namespace finc\Controller\Plugin;
+
+use Psr\Container\ContainerInterface;
+use finc\Controller\Plugin\NewItems;
+use Zend\ServiceManager\ServiceManager;
+
+/**
+ * Factory for controller plugins.
+ *
+ * @category VuFind
+ * @package  View_Helpers
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @author   André Lahmann <lahmann@ub.uni-leipzig.de>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     https://vufind.org/wiki/development Wiki
+ *
+ * @codeCoverageIgnore
+ */
+class NewItemsFactory
+{
+    /**
+     * Construct the NewItems plugin.
+     *
+     * @param ServiceManager $sm Service manager.
+     *
+     * @return NewItems
+     */
+    public function __invoke(ContainerInterface $sm)
+    {
+        $search = $sm->get('VuFind\Config\PluginManager')->get('searches');
+        $config = isset($search->NewItem)
+            ? $search->NewItem : new \Zend\Config\Config([]);
+        return new NewItems($config, $sm->get('VuFind\Config\PluginManager')->get('config'));
+    }
+}
diff --git a/module/finc/src/finc/Cover/Loader.php b/module/finc/src/finc/Cover/Loader.php
index 672c93a651b7fbe559f76997257c65330d295b72..fe853e9f2e70b56c78ce7c19e6c80b9da8f3e06b 100644
--- a/module/finc/src/finc/Cover/Loader.php
+++ b/module/finc/src/finc/Cover/Loader.php
@@ -59,7 +59,9 @@ class Loader extends \VuFind\Cover\Loader
     public function loadUnavailable()
     {
         $this->hasLoadedUnavailable = true;
-        file_put_contents($this->localFile,self::EMPTY_IMAGE_CONTENT);
+        if ($this->config->Content->useCoverFallbacksOnFail) {
+            file_put_contents($this->localFile, self::EMPTY_IMAGE_CONTENT);
+        }
         return parent::loadUnavailable();
     }
 
diff --git a/module/finc/src/finc/RecordDriver/SolrDefaultFincTrait.php b/module/finc/src/finc/RecordDriver/SolrDefaultFincTrait.php
index f5fb36b670842cb7f3d977259c2943941603bdbf..3c158d6bd04234f03516967bdb7472c37d4ad34b 100644
--- a/module/finc/src/finc/RecordDriver/SolrDefaultFincTrait.php
+++ b/module/finc/src/finc/RecordDriver/SolrDefaultFincTrait.php
@@ -895,93 +895,6 @@ trait SolrDefaultFincTrait
             $this->fields['title_new'] : [];
     }
 
-    /**
-     * After giving a record ids as e.g. ppn of the context check (KXP|BSZ) if a
-     * foreign record exists. This method can be used to indicate a direct link
-     * than to form a general look for query.
-     *
-     * Please note: 1) This method can be simplified if it is necessary only to
-     * map record_id to id but you need the solr to check if the item really
-     * exists in the Solr infrastructure to maybe no displaying a false link later
-     * on. 2) There's legacy component to rewrite back real Solr record_id in
-     * return container. Can be useful if there are still any successive methods
-     * in action.
-     *
-     * @param array  $array Array of record ids to test.
-     * @param string $context Context where to search related items.
-     *
-     * @return null|mixed  If success return at least one finc id otherwise null.
-     */
-    protected function addFincIDToRecord($array, $context = 'kxp_id_str')
-    {
-        // record ids
-        $rids = [];
-        // return array
-        $retval = [];
-
-        // check if array contain record_ids and collect it as an array to
-        // use only one solr request for all
-        if (isset($array) && is_array($array)) {
-            foreach ($array as $line) {
-                if (isset($line['record_id']) && isset($line['source_id'])) {
-                    $rids[] = [
-                        'rid' => $line['record_id'],
-                        'sid' => $line['source_id']
-                    ];
-                }
-            }
-        }
-
-        // Solr query remains necessary if it is desired to check if solr
-        // infrastructure contains really the foreign items
-
-        // build the query:
-        if (count($rids) == 1) {
-            // single query:
-            $value = $context . ':' . $rids[0]['rid']
-                     . ' AND source_id:' . $rids[0]['sid'];
-        } elseif (count($rids) > 1) {
-            // multi query:
-            foreach ($rids as $rid) {
-                $parts[] = '('. $context .':' . $rid['rid']
-                           . ' AND source_id:' . $rid['sid'] . ')';
-            }
-            $value = '(' . implode(' OR ', $parts) . ')';
-        } else {
-            return $array;
-        }
-        $query = new \VuFindSearch\Query\Query($value);
-        $bag = new ParamBag();
-        $bag->set('fl', 'id, record_id,' . $context);
-        $records =  $this->searchService
-            ->search('Solr', $query, 0, count($rids), $bag);
-
-        $records = $records->getRecords();
-        if (isset($records)
-            && !empty($records)
-        ) {
-            foreach ($records as $record) {
-                $retval[$record->getField($context)]['id'] =
-                    $record->getUniqueID();
-                $retval[$record->getField($context)]['record_id'] =
-                    $record->getRID();
-            }
-        }
-
-        // write back in array
-        foreach ($array as &$val) {
-            if (isset($val['record_id'])) {
-                if (isset($retval[($val['record_id'])])) {
-                    $val['id'] = $retval[($val['record_id'])]['id'];
-                    $val['record_id'] = $retval[($val['record_id'])]['record_id'];
-                }
-            }
-        }
-        unset($val);
-
-        return $array;
-    }
-
     /**
      * Get the recordtype of the current Record
      *
diff --git a/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php b/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php
index aaed7e69ea8d14b22fee441e0c217fe7fb5160aa..ae53d4e3012e8f0c6a13288b51f37492e9ca1100 100644
--- a/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php
+++ b/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php
@@ -300,24 +300,14 @@ trait SolrMarcFincTrait
             $array[$key]['text'] = ($line->getSubfield('t'))
                 ? $line->getSubfield('t')->getData() : '';
             // get ppns of bsz
-            $linkFields = $line->getSubfields('w');
-            foreach ($linkFields as $current) {
-                $text = $current->getData();
-                // Extract parenthetical prefixes:
-                if (preg_match(self::KXP_PATTERN, $text, $matches)) {
-                    //$id = $this->checkIfRecordExists($matches[2]);
-                    //if ($id != null) {
-                    $array[$key]['record_id'] = $matches[2].$matches[3];
-                    if (null != ($sid = $this->getSourceID())) {
-                        $array[$key]['source_id'] = $sid;
-                    }
-                    //}
-                    //break;
-                }
-            } // end foreach
+            $linkedRecords = $this->getRelatedKxpRecord($line);
+
+            if (!empty($linkedRecords)) {
+                $array[$key]['id'] = current($linkedRecords['first_results'])->getUniqueId();
+            }
         } // end foreach
 
-        return $this->addFincIDToRecord($array);
+        return $array;
     }
 
     /**
@@ -1047,20 +1037,14 @@ trait SolrMarcFincTrait
                     ? $line->getSubfield('t')->getData() : '';
             }
             // get ppns of bsz
-            $linkFields = $line->getSubfields('w');
-            foreach ($linkFields as $current) {
-                $text = $current->getData();
-                // Extract parenthetical prefixes:
-                if (preg_match(self::KXP_PATTERN, $text, $matches)) {
-                    $array[$key]['record_id'] = $matches[2] . $matches[3];
-                    if (null != ($sid = $this->getSourceID())) {
-                        $array[$key]['source_id'] = $sid;
-                    }
-                }
-            } // end foreach
+            $linkedRecords = $this->getRelatedKxpRecord($line);
+
+            if (!empty($linkedRecords)) {
+                $array[$key]['id'] = current($linkedRecords['first_results'])->getUniqueId();
+            }
         } // end foreach
 
-        return $this->addFincIDToRecord($array);
+        return $array;
     }
 
 
@@ -1104,27 +1088,13 @@ trait SolrMarcFincTrait
                 $retval[$key]['text'] = ($t = $line->getSubfield('t'))
                     ? $a->getData() . ': ' . $t->getData()
                     : $a->getData();
-                $linkFields = $line->getSubfields('w');
-                foreach ($linkFields as $current) {
-                    $ids = $current->getData();
-
-                    // Extract parenthetical prefixes:
-                    if (preg_match(self::KXP_PATTERN, $ids, $matches)) {
-                        // use the same key to set the record_id into the
-                        // $retval array like it is used for the other
-                        // content below
-                        $retval[$key]['record_id']
-                            = $matches[2] . $matches[3];
-                        if (null != ($sid = $this->getSourceID())) {
-                            $retval[$key]['source_id'] = $sid;
-                        }
-                    }
+                $linkedRecords = $this->getRelatedKxpRecord($line);
+
+                if (!empty($linkedRecords)) {
+                    $retval[$key]['id'] = current($linkedRecords['first_results'])->getUniqueId();
                 }
             }
         }
-        // add ids already here to the temporary array
-        // instead of the end of the function with the return value
-        $retval = $this->addFincIDToRecord($retval);
         // rearrange return array to collect same subjects below on unique key
         $array = [];
         foreach ($retval as $item) {
@@ -1172,25 +1142,17 @@ trait SolrMarcFincTrait
                         $array[$i]['text'] = ($line->getSubfield('t'))
                             ? $line->getSubfield('t')->getData() : '';
                         // get ppns of bsz
-                        $linkFields = $line->getSubfields('w');
-                        if (is_array($linkFields) && count($linkFields) > 0) {
-                            foreach ($linkFields as $current) {
-                                $text = $current->getData();
-                                // Extract parenthetical prefixes:
-                                if (preg_match(self::KXP_PATTERN, $text, $matches)) {
-                                    $array[$key]['record_id'] = $matches[2].$matches[3];
-                                    if (null != ($sid = $this->getSourceID())) {
-                                        $array[$key]['source_id'] = $sid;
-                                    }
-                                }
-                            } // end foreach
-                        } // end if
+                        $linkedRecords = $this->getRelatedKxpRecord($line);
+
+                        if (!empty($linkedRecords)) {
+                            $array[$key]['id'] = current($linkedRecords['first_results'])->getUniqueId();
+                        }
                         $i++;
                     } // end if
                 } // end foreach
             }
         }
-        return $this->addFincIDToRecord($array);
+        return $array;
     }
 
     /**
@@ -1219,20 +1181,14 @@ trait SolrMarcFincTrait
                     ? $line->getSubfield('t')->getData() : '';
             }
             // get ppns of bsz
-            $linkFields = $line->getSubfields('w');
-            foreach ($linkFields as $current) {
-                $text = $current->getData();
-                // Extract parenthetical prefixes:
-                if (preg_match(self::KXP_PATTERN, $text, $matches)) {
-                    $array[$key]['record_id'] = $matches[2].$matches[3];
-                    if (null != ($sid = $this->getSourceID())) {
-                        $array[$key]['source_id'] = $sid;
-                    }
-                }
-            } // end foreach
+            $linkedRecords = $this->getRelatedKxpRecord($line);
+
+            if (!empty($linkedRecords)) {
+                $array[$key]['id'] = current($linkedRecords['first_results'])->getUniqueId();
+            }
         } // end foreach
         
-        return $this->addFincIDToRecord($array);
+        return $array;
     }
 
     /**
@@ -1407,7 +1363,7 @@ trait SolrMarcFincTrait
     {
         $array = [];
         $fields = ['770','775','776'];
-        $subfields = ['a', 'l', 't', 'b', 'd', 'e', 'f', 'h', 'o', '7','z'];
+        $subfields = ['a', 'l', 't', 'b', 'd', 'e', 'f', 'h', 'o', '7'];
         $i = 0;
 
         foreach ($fields as $field) {
@@ -1436,33 +1392,51 @@ trait SolrMarcFincTrait
                             $array[$i] = [
                                 'text'       => implode(', ', $text),
                                 'identifier' => ($line->getSubfield('i'))
-                                    ? $line->getSubfield('i')->getData() : ''
+                                    ? $line->getSubfield('i')->getData() : '',
+                                'note' => ($line->getSubfield('n'))
+                                    ? $line->getSubfield('n')->getData() : null,
                             ];
 
                             // finally we can try to use given PPNs (from the BSZ) to
                             // link the record
-                            if ($linkFields = $line->getSubfields('w')) {
+                            $linkedRecords = $this->getRelatedKxpRecord($line);
+
+                            if (!empty($linkedRecords['first_results'])) {
+                                $array[$i]['id'] = current($linkedRecords['first_results'])->getUniqueId();
+                            }
+
+                            if (empty($linkedRecords) && $linkFields = $line->getSubfields('z')) {
                                 foreach ($linkFields as $current) {
-                                    $text = $current->getData();
-                                    // Extract parenthetical prefixes:
-                                    if (preg_match(self::KXP_PATTERN, $text, $matches)) {
-                                        $array[$i]['record_id']
-                                            = $matches[2] . $matches[3];
-                                        if (null != ($sid = $this->getSourceID())) {
-                                            $array[$i]['source_id'] = $sid;
-                                        }
-                                    }
+                                    $linked[] = $current->getData();
+                                }
+                                $linkedRecords = $this->searchRelatedRecords('isbn',$linked, 1);
+                                if (!empty($linkedRecords['first_results'])) {
+                                    $array[$i]['related_records'] = $linkedRecords;
                                 }
                             }
 
                             // at least we found some identifier and text so increment
                             $i++;
                         }
+                    } elseif ($linkFields = $line->getSubfields('z')) {
+                        $linked = [];
+                        foreach ($linkFields as $current) {
+                            $linked[] = $current->getData();
+                        }
+                        $linkedRecords = $this->searchRelatedRecords('isbn',$linked, 1);
+                        if (!empty($linkedRecords['first_results'])) {
+                            $array[$i] = [
+                                'related_records' => $linkedRecords,
+                                'identifier' => 'Other Editions',
+                                'text' => '',
+                            ];
+                            $i++;
+                        }
                     }
                 }
             }
         }
-        return $this->addFincIDToRecord($array);
+        return $array;
     }
 
     /**
@@ -1555,26 +1529,21 @@ trait SolrMarcFincTrait
 
                         // finally we can try to use given PPNs (from the BSZ) to
                         // link the record
-                        if ($linkFields = $line->getSubfields('w')) {
-                            foreach ($linkFields as $current) {
-                                $text = $current->getData();
-                                // Extract parenthetical prefixes:
-                                if (preg_match(self::KXP_PATTERN, $text, $matches)) {
-                                    $array[$i]['record_id']
-                                        = $matches[2] . $matches[3];
-                                    if (null != ($sid = $this->getSourceID())) {
-                                        $array[$i]['source_id'] = $sid;
-                                    }
-                                }
-                            }
+                        // finally we can try to use given PPNs (from the BSZ) to
+                        // link the record
+                        $linkedRecords = $this->getRelatedKxpRecord($line);
+
+                        if (!empty($linkedRecords)) {
+                            $array[$i]['id'] = current($linkedRecords['first_results'])->getUniqueId();
                         }
+
                         // at least we found some identifier and text so increment
                         $i++;
                     }
                 }
             }
         }
-        return $this->addFincIDToRecord($array);
+        return $array;
     }
 
     /**
@@ -1639,33 +1608,6 @@ trait SolrMarcFincTrait
             ['830']
         ];
 
-        $idRetrieval = function ($value) {
-            // use preg_match to get rid of the isil
-            preg_match(self::KXP_PATTERN, $value, $matches);
-            if (!empty($matches[2])) {
-                $query = 'kxp_id_str:' . $matches[2].$matches[3];
-                if ($sid = $this->fields['source_id']) {
-                    $query .= ' AND source_id:'.$sid;
-                }
-                $result = $this->searchService->search(
-                    'Solr',
-                    new Query($query)
-                );
-                if (count($result) === 0) {
-                    $this->debug(
-                        'Could not retrieve id for record with ' . $query
-                    );
-                    return null;
-                }
-                return current($result->getRecords())->getUniqueId();
-            }
-            $this->debug(
-                'Pregmatch pattern in getHierarchyParentID failed for '
-                . $value
-            );
-            return $value;
-        };
-
         // loop through all field lists in their particular order (as in
         // getHierchyParentTitle) and build the $parentID array
         foreach ($fieldList as $fieldNumbers) {
@@ -1673,9 +1615,11 @@ trait SolrMarcFincTrait
                 $fields = $this->getMarcRecord()->getFields($fieldNumber);
                 foreach ($fields as $field) {
                     if ($field->getSubfield('w')) {
-                        $parentID[] = $idRetrieval(
-                            $field->getSubfield('w')->getData()
-                        );
+                        // refactored with #18333
+                        $related = $this->getRelatedKxpRecord($field);
+                        if (!empty( $related['first_results'] ?? [])) {
+                            $parentID[] = current($related['first_results'])->getUniqueId();
+                        }
                     } elseif ($fieldNumber == '490') {
                         // https://intern.finc.info/issues/8704
                         if ($field->getIndicator(1) == 0
@@ -2082,34 +2026,52 @@ trait SolrMarcFincTrait
         }
     }
 
-    /**
-     * Get related records via search index
-     *
-     * @param int      $limit
-     * @param string   $backend_id     Search engine
-     *
-     * @return array
-     * @access protected
-     */
-    protected function getRelatedRecords($limit, $backend_id = 'Solr')
-    {
-        $related = $this->getRelatedItems(true);
+    public function searchRelatedRecords($field, $values, $limit = 20,
+        $filters=[], $backend_id = 'Solr'
+    ) {
 
-        if (empty($related)) {
-            return [];
+        if (!empty($filters)) {
+            $fq = '';
+            foreach ($filters as $filterField => $value) {
+                $fq = (empty($fq) ? '' : ' AND ')
+                    . "$filterField:$value";
+            }
         }
 
         $query = new Query(
-            'isbn' . ':' . implode(' OR ', $related)
-            . ' AND NOT id:' . $this->getUniqueID()
+            $field . ':(' . implode(' OR ', $values)
+            . ') AND NOT id:' . $this->getUniqueID()
+            . (isset($fq) ? " AND $fq" : '')
         );
 
         $result = $this->searchService->search($backend_id, $query, 0, $limit);
         $return['first_results'] = $result->getRecords();
-        if ($result->getTotal() > $limit) {
+
+        if (isset($limit) && $result->getTotal() > $limit) {
             $return['more_query'] = $query->getString();
         }
         return $return;
+
+    }
+
+    public function getRelatedKxpRecord($line, $limit = 1, $linkSubField = 'w') {
+
+        if ($linkFields = $line->getSubfields('w')) {
+            $linked = [];
+            foreach ($linkFields as $current) {
+                $text = $current->getData();
+                // Extract parenthetical prefixes:
+                if (preg_match(self::KXP_PATTERN, $text, $matches)) {
+                    $linked[]
+                        = $matches[2] . $matches[3];
+                }
+            }
+            $linkedRecords = $this->searchRelatedRecords('kxp_id_str', $linked, $limit, ['source_id' => $this->getSourceID()]);
+            if (!empty($linkedRecords['first_results'])) {
+                return $linkedRecords;
+            }
+        }
+        return null;
     }
 
     /**
diff --git a/module/finc/src/finc/View/Helper/Root/Factory.php b/module/finc/src/finc/View/Helper/Root/Factory.php
index b9f0bcca3d5acf8b1c4591c5d25be7ae903380f4..e4109ef4a2a8d6de1cde6956221ed5be15b0e8f9 100644
--- a/module/finc/src/finc/View/Helper/Root/Factory.php
+++ b/module/finc/src/finc/View/Helper/Root/Factory.php
@@ -208,4 +208,10 @@ class Factory
             empty($externalAccessLinks) ? [] : $externalAccessLinks
         );
     }
+
+    public static function getHeadTitle(ContainerInterface $container)
+    {
+        $config = $container->get('VuFind\Config')->get('config')->Site;
+        return new HeadTitle($config->title ?? '');
+    }
 }
diff --git a/module/finc/src/finc/View/Helper/Root/HeadTitle.php b/module/finc/src/finc/View/Helper/Root/HeadTitle.php
new file mode 100644
index 0000000000000000000000000000000000000000..c4036a17429c5da292fb5e574bf9f40d53de3588
--- /dev/null
+++ b/module/finc/src/finc/View/Helper/Root/HeadTitle.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Head Title view helper
+ *
+ * PHP version 7
+ *
+ * Copyright (C) Leipzig University Library 2020.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * @category VuFind
+ * @package  View_Helpers
+ * @author   Dorian Merz <merz@ub.uni-leipzig.de>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     https://vufind.org/wiki/development Wiki
+ */
+namespace finc\View\Helper\Root;
+
+use Zend\View\Helper\HeadTitle as BaseHelper;
+
+/**
+ * Head Title view helper
+ *
+ * @category VuFind
+ * @package  View_Helpers
+ * @author   Dorian Merz <merz@ub.uni-leipzig.de>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     https://vufind.org/wiki/development Wiki
+ */
+class HeadTitle extends BaseHelper
+{
+    protected $headerSuffix;
+
+    public function __construct($headerSuffix = '')
+    {
+        parent::__construct();
+        if (!empty($headerSuffix)) {
+            $this->headerSuffix = ' - '.$headerSuffix;
+        }
+    }
+
+    public function __invoke($title = null, $setType = null)
+    {
+        $title = $title ? : $this->headerSuffix;
+        return parent::__invoke($title, $setType);
+    }
+}
diff --git a/module/finc/src/finc/View/Helper/Root/MultiDataFieldsTrait.php b/module/finc/src/finc/View/Helper/Root/MultiDataFieldsTrait.php
index b9536ccab15bf7871c05c89ade86a935039feb04..0f137ca2a6525f0f3072aa4fa5a872cba0576234 100644
--- a/module/finc/src/finc/View/Helper/Root/MultiDataFieldsTrait.php
+++ b/module/finc/src/finc/View/Helper/Root/MultiDataFieldsTrait.php
@@ -82,6 +82,30 @@ trait MultiDataFieldsTrait
         return $final;
     }
 
+    public function relatedRecords($data,$options,$driver) {
+
+        $formats = $driver->tryMethod('getFormat');
+        $reject = array('Microfilm', 'Microform', 'Microfiche');
+        if (empty(array_intersect($reject, $formats))) {
+            $data = $driver->tryMethod(
+                'getRelatedRecords',
+                [$options['limit'] ?? 3]
+            );
+        }
+        if (!empty($data['first_results'])) {
+            return [[
+                'label' => 'Other Editions',
+                'values' => $data,
+                'options' => [
+                    'pos' => $options['pos'],
+                    'renderType' => 'RecordDriverTemplate',
+                    'template' => 'data-relatedRecords.phtml',
+                ],
+            ]];
+        }
+        return null;
+    }
+
     /**
      * return render details for events data set
      * @return callback
diff --git a/module/finc/src/finc/View/Helper/Root/Record.php b/module/finc/src/finc/View/Helper/Root/Record.php
index 7c1968e2b53841e34abaa6262774a7ca4cea5c9a..c12efed09377fb0e62cd7f4866275eee5c228702 100644
--- a/module/finc/src/finc/View/Helper/Root/Record.php
+++ b/module/finc/src/finc/View/Helper/Root/Record.php
@@ -326,55 +326,46 @@ class Record extends \VuFind\View\Helper\Root\Record
     {
         $rewrite = $this->config->LinksRewrite->toArray();
         foreach ($rewrite as $r) {
-            // is pattern set so try rewrite url
-            if (isset($r['pattern']) || $r['remove']) {
-                // is remove pattern than suppress link refs #10834
-                if (isset($r['remove'])) {
-                    if (0 != preg_match(
-                        '/' . addcslashes($r['remove'], '/') . '/i',
-                        trim($link['url'])
-                    )) {
-                        unset($link);
-                        return;
-                    }
+            // is remove pattern than suppress link refs #10834
+            if (isset($r['remove'])) {
+                if (0 != preg_match(
+                    '/' . addcslashes($r['remove'], '/') . '/i',
+                    trim($link['url'])
+                )) {
+                    unset($link);
+                    return;
+                }
+            }
+            // is pattern set and matches so try rewrite url
+            if (isset($r['pattern']) && 0 != preg_match('/' . $r['pattern'] . '/i', trim($link['url']))) {
+                // if function is set and available then perform on url 
+                if (isset($r['function']) && is_callable($r['function'])) {
+                    $link['url'] = $r['function']($link['url']);
                 }
 
                 // is search and replace set so try to rewrite url
                 if (isset($r['search']) && isset($r['replace'])) {
-                    // check if pattern exists. if at least one match than continue
-                    if (0 != preg_match(
-                        '/' . $r['pattern'] . '/i',
-                        trim($link['url'])
-                    )) {
-                        // prepare search pattern
-                        // should be free of conflicting meta characters
-                        $pattern
-                            = str_replace(['.'], ['\.'], $r['search']);
-                        $pattern = '/(' . $pattern . ')/i';
-                        // replace it only one time
-                        $link['url'] = preg_replace(
-                            $pattern,
-                            trim($r['replace']),
-                            trim($link['url']),
-                            1,
-                            $count
-                        );
-                        // add http if needed
-                        // @to-do make it https compatible
-                        if (!preg_match('/^(https?:\/\/)/', $link['url'])) {
-                            $link['url'] = 'http://' . $link['url'];
-                        }
+                    // prepare search pattern
+                    // should be free of conflicting meta characters
+                    $pattern = str_replace(['.'], ['\.'], $r['search']);
+                    $pattern = '/(' . $pattern . ')/i';
+                    // replace it only one time
+                    $link['url'] = preg_replace(
+                        $pattern,
+                        trim($r['replace']),
+                        trim($link['url']),
+                        1,
+                        $count
+                    );
+                    // add http if needed
+                    // @to-do make it https compatible
+                    if (!preg_match('/^(https?:\/\/)/', $link['url'])) {
+                        $link['url'] = 'http://' . $link['url'];
                     }
                 }
                 // is method set so call alternatively method proceed link
                 if (isset($r['method']) && method_exists($this, $r['method'])) {
-                    /* && $count > 0) { @todo fix */
-                    if (0 != preg_match(
-                        '/' . $r['pattern'] . '/i',
-                        trim($link['url'])
-                    )) {
-                        $link['url'] = $this->$r['method']($link['url']);
-                    }
+                    $link['url'] = $this->$r['method']($link['url']);
                 } // end if isset method
             } // end if isset pattern
         } // end foreach
@@ -476,6 +467,7 @@ class Record extends \VuFind\View\Helper\Root\Record
         $online_keys = [
             "Online-Ausg.",
             "Online-Ausg.:",
+            "Online-Ausgabe",
             "Digital. Ausg.",
             "Online-Ausg. u.d.T.",
             "Elektronische Reproduktion"
@@ -483,14 +475,34 @@ class Record extends \VuFind\View\Helper\Root\Record
         $onlineEditions = [];
         $recordLinkHelper = $this->getView()->plugin('recordLink');
         foreach ($this->driver->tryMethod('getAdditionals') as $add) {
-            if (isset($add['identifier'])
-                && in_array($add['identifier'], $online_keys)) {
+            if (
+                isset($add['identifier'])
+                &&
+                (
+                    in_array($add['identifier'], $online_keys)
+                    ||
+                    (
+                        isset($add['note'])
+                        &&
+                        in_array($add['note'], $online_keys)
+                    )
+                )
+            ) {
                 if (isset($add['id'])) {
                     $link = $recordLinkHelper->getTabUrl($add['id'], 'Holdings');
                     if (!empty($link)) {
                         $add['link'] = $link;
                         $onlineEditions[] = $add;
                     }
+                } elseif (isset($add['related_records'])) {
+                    foreach ($add['related_records']['first_results'] as $linkedRecord) {
+                        $link = $recordLinkHelper->getTabUrl($linkedRecord);
+                        if (!empty($link)) {
+                            //overwrite link in entry and add to result array
+                            $add['link'] = $link;
+                            $onlineEditions[] = $add;
+                        }
+                    }
                 }
             }
         }
diff --git a/themes/fid/languages/fid/de.ini b/themes/fid/languages/fid/de.ini
index 2459aaded65f50cd1745fc33023f01d53b6aff3c..f3ff9f4784d0945919f4986b8a9ae5fedb5c7d9c 100644
--- a/themes/fid/languages/fid/de.ini
+++ b/themes/fid/languages/fid/de.ini
@@ -4,7 +4,7 @@ auth_error_account_blocked = Ihr Konto wurde aus Sicherheitsgründen gesperrt. B
 
 user_init_form_title = "Registrierung"
 user_create_form_title = "Registrierung abschließen"
-user_update_form_title = "Profildaten editieren."
+user_update_form_title = "Profildaten editieren"
 password_reset_form_title = "Passwort zurücksetzen"
 password_reset_form_information = "Bitte geben Sie die E-Mail-Adresse ein, mit der Sie sich registriert haben. Wir senden Ihnen einen Link per E-Mail, über den Sie Ihr Passwort ändern können."
 password_change_form_title = "Neues Passwort speichern"
diff --git a/themes/finc-accessibility/js/account_ajax.js b/themes/finc-accessibility/js/account_ajax.js
new file mode 100644
index 0000000000000000000000000000000000000000..9d657d9f5d95421a30dd8782a76fa4205947137f
--- /dev/null
+++ b/themes/finc-accessibility/js/account_ajax.js
@@ -0,0 +1,256 @@
+/*global userIsLoggedIn, VuFind */
+VuFind.register('account', function Account() {
+  // Retrieved statuses
+  var LOADING = -1 * Math.PI; // waiting for request
+  var MISSING = -2 * Math.PI; // no data available
+  var INACTIVE = -3 * Math.PI; // status element missing
+  var _statuses = {};
+
+  // Account Icons
+  var ICON_LEVELS = {
+    "NONE": 0,
+    "GOOD": 1,
+    "WARNING": 2,
+    "DANGER": 3
+  };
+  var _accountIcons = {};
+  _accountIcons[ICON_LEVELS.NONE] = "fa fa-user-circle";
+  _accountIcons[ICON_LEVELS.GOOD] = "fa fa-bell text-success";
+  _accountIcons[ICON_LEVELS.WARNING] = "fa fa-bell text-warning";
+  _accountIcons[ICON_LEVELS.DANGER] = "fa fa-exclamation-triangle text-danger";
+
+  var _submodules = [];
+
+  var _sessionDataPrefix = "vf-account-status-";
+  var _save = function _save(module) {
+    sessionStorage.setItem(
+      _sessionDataPrefix + module,
+      JSON.stringify(_statuses[module])
+    );
+  };
+
+  // Clearing save forces AJAX update next page load
+  var clearCache = function clearCache(name) {
+    if (typeof name === "undefined") {
+      for (var sub in _submodules) {
+        if (Object.prototype.hasOwnProperty.call(_submodules, sub)) {
+          clearCache(sub);
+        }
+      }
+    } else {
+      sessionStorage.removeItem(_sessionDataPrefix + name);
+    }
+  };
+
+  var _getStatus = function _getStatus(module) {
+    return (typeof _statuses[module] === "undefined") ? LOADING : _statuses[module];
+  };
+
+  var _render = function _render() {
+    var accountStatus = ICON_LEVELS.NONE;
+    for (var sub in _submodules) {
+      if (Object.prototype.hasOwnProperty.call(_submodules, sub)) {
+        var $element = $(_submodules[sub].selector);
+        if (!$element) {
+          _statuses[sub] = INACTIVE;
+          continue;
+        }
+        var status = _getStatus(sub);
+        if (status === MISSING) {
+          $element.addClass('hidden');
+        } else {
+          $element.removeClass('hidden');
+          if (status === LOADING) {
+            $element.html('<i class="fa fa-spin fa-spinner"></i>');
+          } else {
+            var moduleStatus = _submodules[sub].render($element, _statuses[sub], ICON_LEVELS);
+            if (moduleStatus > accountStatus) {
+              accountStatus = moduleStatus;
+            }
+          }
+        }
+      }
+    }
+    $("#account-icon").attr("class", _accountIcons[accountStatus]);
+    if (accountStatus > ICON_LEVELS.NONE) {
+      $("#account-icon")
+        .attr("data-toggle", "tooltip")
+        .attr("data-placement", "bottom")
+        .attr("title", VuFind.translate("account_has_alerts"))
+        ;
+    } else {
+      $("#account-icon").tooltip("destroy");
+    }
+  };
+  var _ajaxLookup = function _ajaxLookup(module) {
+    $.ajax({
+      url: VuFind.path + '/AJAX/JSON?method=' + _submodules[module].ajaxMethod,
+      dataType: 'json'
+    })
+      .done(function ajaxLookupDone(response) {
+        _statuses[module] = response.data;
+      })
+      .fail(function ajaxLookupFail() {
+        _statuses[module] = MISSING;
+      })
+      .always(function ajaxLookupAlways() {
+        _save(module);
+        _render();
+      });
+  };
+
+  var _load = function _load(module) {
+    var $element = $(_submodules[module].selector);
+    if (!$element) {
+      _statuses[module] = INACTIVE;
+    } else {
+      var json = sessionStorage.getItem(_sessionDataPrefix + module);
+      var session = typeof json === "undefined" ? null : JSON.parse(json);
+      if (
+        session === null ||
+        session === LOADING ||
+        session === MISSING
+      ) {
+        _statuses[module] = LOADING;
+        _ajaxLookup(module);
+      } else {
+        _statuses[module] = session;
+      }
+      _render();
+    }
+  };
+
+  var init = function init() {
+    // Update information when certain actions are performed
+    $("#renewals").submit(function clearCheckedOut() {
+      clearCache("checkedOut");
+    });
+    $('#cancelHold, [name="placeHold"]').submit(function clearHolds() {
+      clearCache("holds");
+    });
+    $('#ILLRequestForm, #cancelILLRequest').submit(function clearHolds() {
+      clearCache("illRequests");
+    });
+    $('[name="placeStorageRetrievalRequest"], #cancelStorageRetrievalRequest').submit(function clearStorageRetrievals() {
+      clearCache("storageRetrievalRequests");
+    });
+    $("#library_card").change(function clearChangeLibraryCard() {
+      clearCache(/* all */);
+    });
+  };
+
+  var register = function register(name, module) {
+    if (typeof _submodules[name] === "undefined") {
+      _submodules[name] = typeof module == 'function' ? module() : module;
+    }
+    var $el = $(_submodules[name].selector);
+    if ($el.length > 0) {
+      $el.removeClass("hidden");
+      _statuses[name] = LOADING;
+      _load(name);
+    } else {
+      _statuses[name] = INACTIVE;
+    }
+  };
+
+  return {
+    init: init,
+    clearCache: clearCache,
+    // if user is logged out, clear cache instead of register
+    register: userIsLoggedIn ? register : clearCache
+  };
+});
+
+$(document).ready(function registerAccountAjax() {
+
+  VuFind.account.register("fines", {
+    selector: ".fines-status",
+    ajaxMethod: "getUserFines",
+    render: function render($element, status, ICON_LEVELS) {
+      if (status.value === 0) {
+        $element.addClass("hidden");
+        return ICON_LEVELS.NONE;
+      }
+      $element.html('<span class="badge overdue">' + status.display + '</span>');
+      return ICON_LEVELS.DANGER;
+    }
+  });
+
+  VuFind.account.register("checkedOut", {
+    selector: ".checkedout-status",
+    ajaxMethod: "getUserTransactions",
+    render: function render($element, status, ICON_LEVELS) {
+      var html = '';
+      var level = ICON_LEVELS.NONE;
+      if (status.ok > 0) {
+        html += '<span class="badge ok" data-toggle="tooltip" title="' + VuFind.translate('Checked Out Items') + '">' + status.ok + '</span>';
+      }
+      if (status.warn > 0) {
+        html += '<span class="badge warn" data-toggle="tooltip" title="' + VuFind.translate('renew_item_due_tooltip') + '">' + status.warn + '</span>';
+        level = ICON_LEVELS.WARNING;
+      }
+      if (status.overdue > 0) {
+        html += '<span class="badge overdue" data-toggle="tooltip" title="' + VuFind.translate('renew_item_overdue_tooltip') + '">' + status.overdue + '</span>';
+        level = ICON_LEVELS.DANGER;
+      }
+      $element.html(html);
+      $('[data-toggle="tooltip"]', $element).tooltip();
+      return level;
+    }
+  });
+
+  VuFind.account.register("holds", {
+    selector: ".holds-status",
+    ajaxMethod: "getUserHolds",
+    render: function render($element, status, ICON_LEVELS) {
+      var level = ICON_LEVELS.NONE;
+      if (status.available > 0) {
+        $element.html('<i class="fa fa-bell text-success" data-toggle="tooltip" title="' + VuFind.translate('hold_available') + '"></i>');
+        level = ICON_LEVELS.GOOD;
+      } else if (status.in_transit > 0) {
+        $element.html('<i class="fa fa-clock-o text-warning" data-toggle="tooltip" title="' + VuFind.translate('request_in_transit') + '"></i>');
+      } else {
+        $element.addClass("holds-status hidden");
+      }
+      $('[data-toggle="tooltip"]', $element).tooltip();
+      return level;
+    }
+  });
+
+  VuFind.account.register("illRequests", {
+    selector: ".illrequests-status",
+    ajaxMethod: "getUserILLRequests",
+    render: function render($element, status, ICON_LEVELS) {
+      var level = ICON_LEVELS.NONE;
+      if (status.available > 0) {
+        $element.html('<i class="fa fa-bell text-success" data-toggle="tooltip" title="' + VuFind.translate('ill_request_available') + '"></i>');
+        level = ICON_LEVELS.GOOD;
+      } else if (status.in_transit > 0) {
+        $element.html('<i class="fa fa-clock-o text-warning" data-toggle="tooltip" title="' + VuFind.translate('request_in_transit') + '"></i>');
+      } else {
+        $element.addClass("holds-status hidden");
+      }
+      $('[data-toggle="tooltip"]', $element).tooltip();
+      return level;
+    }
+  });
+
+  VuFind.account.register("storageRetrievalRequests", {
+    selector: ".storageretrievalrequests-status",
+    ajaxMethod: "getUserStorageRetrievalRequests",
+    render: function render($element, status, ICON_LEVELS) {
+      var level = ICON_LEVELS.NONE;
+      if (status.available > 0) {
+        $element.html('<i class="fa fa-bell text-success" data-toggle="tooltip" title="' + VuFind.translate('storage_retrieval_request_available') + '"></i>');
+        level = ICON_LEVELS.GOOD;
+      } else if (status.in_transit > 0) {
+        $element.html('<i class="fa fa-clock-o text-warning" data-toggle="tooltip" title="' + VuFind.translate('request_in_transit') + '"></i>');
+      } else {
+        $element.addClass("holds-status hidden");
+      }
+      $('[data-toggle="tooltip"]', $element).tooltip();
+      return level;
+    }
+  });
+
+});
diff --git a/themes/finc/js/covers.js b/themes/finc/js/covers.js
index c251aefba80b034997452c4b1b7103e13847df78..1f150538799ab5778d7129604d192603de5761a5 100644
--- a/themes/finc/js/covers.js
+++ b/themes/finc/js/covers.js
@@ -1,5 +1,5 @@
 /* this is a backport from VF 7 core, remove on upgrade */
-/*global VuFind */
+/* global VuFind */
 function loadCoverByElement(data, element) {
   var url = VuFind.path + '/AJAX/JSON?method=' + 'getRecordCover';
   var img = element.find('img');
@@ -10,10 +10,11 @@ function loadCoverByElement(data, element) {
     spinner.hide();
     container.show();
     if (typeof response.data.url !== 'undefined' && response.data.url !== false) {
-      img.attr("src", response.data.url);
-      container.children().not("img").hide();
+      img.attr('src', response.data.url);
+      container.children().not('img').hide();
       anchor.show();
-      anchor.attr("href", response.data.url);
+      anchor.attr('href', response.data.url);
+      anchor.removeClass('hidden'); // finc specific
     } else {
       img.remove();
       if (typeof response.data.html !== 'undefined') {
@@ -24,9 +25,9 @@ function loadCoverByElement(data, element) {
     }
   }
   $.ajax({
-    dataType: "json",
+    dataType: 'json',
     url: url,
-    method: "GET",
+    method: 'GET',
     data: data,
     element: element,
     success: coverCallback
@@ -44,4 +45,5 @@ function loadCovers() {
     loadCoverByElement(data, $(this));
   });
 }
-$(document).ready(loadCovers);
+// deactivated for finc - we load every single cover directly by itself in cover.phtml
+// $(document).ready(loadCovers);
diff --git a/themes/finc/js/hierarchyTree.js b/themes/finc/js/hierarchyTree.js
index d3db7ac718c594542dc9ee4c75afa837c372bc56..a0afca2660ebf68789605be36946e3f171791a0a 100644
--- a/themes/finc/js/hierarchyTree.js
+++ b/themes/finc/js/hierarchyTree.js
@@ -212,6 +212,11 @@ $(document).ready(function hierarchyTreeReady() {
 
       scrollToClicked();
     })
+    
+    .on('after_open.jstree', function (e, data) {
+      $(".jstree-anchor").removeAttr("title");
+    })
+    
     .jstree({
       plugins: ['search', 'types'],
       core: {
diff --git a/themes/finc/scss/compiled.scss b/themes/finc/scss/compiled.scss
index 693a8217d1776965d6f32473e600ec1e756f6daa..91c61145434bd4598a9d808516cd808adde03d9e 100644
--- a/themes/finc/scss/compiled.scss
+++ b/themes/finc/scss/compiled.scss
@@ -362,6 +362,11 @@ legend {
   padding-left: ($grid-gutter-width / 2);
   padding-right: ($grid-gutter-width / 2);
   width: auto;
+
+  // Recent acquisitions search form (search/NewItem)
+  .form-search-newitem & {
+    padding-left: 0;
+  }
 }
 
 //// label {}
@@ -521,7 +526,8 @@ select {
 }
 
 // remove icons in limiter select boxes in adv. search
-#advSearchForm .limiter-boxes select.form-control {
+#advSearchForm .limiter-boxes select.form-control,
+#newitem_department {
   background-image: none;
   height: auto;
 }
@@ -853,6 +859,17 @@ table.collapse.in {
       margin-top: 15px;
     }
   }
+
+  // cover
+  .ajaxcover .spinner {
+    height: 0;
+    position: absolute;
+  }
+
+  .cover-container {
+    min-width: 6em;
+  }
+  // cover - END
 }
 
 //// Sprites for Mediaicons
@@ -1540,7 +1557,7 @@ header,
 .search.container {
   padding-right: 0;
 
-  // Make wider to fit searchbox and right-hand nav-elements in
+  // Make wider to fit searchbox and right-hand nav-elements
   @media (min-width: $screen-sm-min) {
     flex: 0 1 auto;
     padding-top: $button-top-padding;
@@ -1550,14 +1567,26 @@ header,
   // Float "Find" button next to searchbox on XS and SM
   @media (max-width: $screen-sm-max) {
     padding-left: 0;
+  }
+
+  @media only screen and (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
+    flex: content;
+  }
+
+  .searchForm_lookfor {
+    @media (max-width: $screen-xs-max) {
+      //max-width: 80%;
+    }
+  }
 
-    .searchForm {
+  .searchForm {
+    @media only screen and (max-width: $screen-sm-max) {
       display: flex;
 
       input {
         flex-grow: 2;
         flex-shrink: 2;
-        max-width: 43%;
+        // max-width: 43%;
       }
 
       .navbar {
@@ -1571,23 +1600,8 @@ header,
         top: 40px;
       }
     }
-  }
-
-  @media only screen and (max-width: $screen-xs-max) {
-    .searchForm_lookfor {
-      max-width: 80%;
-    }
-  }
-
-  @media only screen and (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
-    flex: content;
 
-    .btn,
-    .form-control {
-      float: left;
-    }
-
-    .searchForm {
+    @media only screen and (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
       display: block;
 
       .checkbox {
@@ -1595,6 +1609,13 @@ header,
       }
     }
   }
+
+  .btn,
+  .form-control {
+    @media only screen and (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
+      float: left;
+    }
+  }
 }
 
 //// this will get search box and buttons in line
@@ -1825,19 +1846,72 @@ footer {
 
 .limit {
   margin-right: ($grid-gutter-width / 2);
+}
 
-  @media only screen and (max-width: $screen-xs-max) {
-    float: right;
-    margin-bottom: 7px;
-    margin-right: 0;
+.limit,
+.sort {
+  margin-bottom: 5px;
+
+  label {
+    line-height: normal;
+    margin-bottom: 0;
+  }
+
+  select {
+    margin-bottom: 5px;
   }
 }
 
+.search-controls-div {
+  display: inline-block;
+}
+
+.search-sort {
+  display: block;
+}
+
 // limit the width of the select field if necessary - for more select details, see FORMS section above
 .sort select {
   max-width: 12em;
 }
 
+@media only screen and (max-width: $screen-xs-max) {
+  .limit,
+  .sort {
+    float: left;
+
+    button,
+    label,
+    select {
+      display: block;
+    }
+    
+    select {
+      margin-bottom: 0;
+      margin-right: .2rem;
+    }
+  }
+  
+  .limit {
+    margin-right: 1rem;
+  }
+  
+  // Place the refresh button near to the select box
+  .search-controls-div {
+    display: flex;
+  }
+  
+  // Force the label for floating the text left
+  .search-sort.text-right {
+    text-align: left;
+  }
+  
+  // Force the search-sort content to being floated left. Otherwise the refresh button is not visible during user zoom 200%.
+  .sort.right {
+    float: left !important;
+  }
+}
+
 //// Off-Canvas
 @media only screen and (max-width: $screen-sm-max) {
   .close-offcanvas {
@@ -1987,8 +2061,8 @@ footer {
 //// access-icon in resultlist
 .result {
   .media-left {
-    min-width: 16%;
     text-align: center;
+    width: 17%;
 
     //// remove left padding for print
     @media print {
diff --git a/themes/finc/templates/RecordDriver/DefaultRecord/data-additionals.phtml b/themes/finc/templates/RecordDriver/DefaultRecord/data-additionals.phtml
index 7ee1dc4a8e260244adb97a318820e7075cf26164..25db346933b87109240b3531290d510c94295262 100644
--- a/themes/finc/templates/RecordDriver/DefaultRecord/data-additionals.phtml
+++ b/themes/finc/templates/RecordDriver/DefaultRecord/data-additionals.phtml
@@ -9,6 +9,15 @@
                 <a href="<?=$url?>"><?=$this->escapeHtml($additional['text'])?></a>
             <?php endif; ?>
             <?php unset($url) ?>
+        <?php elseif (isset($additional['related_records'])): ?>
+            <?=$this->render(
+                    'RecordDriver/DefaultRecord/data-relatedRecords',
+                    [
+                        'data' => $additional['related_records'],
+                        'driver' => $this->driver,
+                        'label' => $additional['text'],
+                    ]
+                ) ?>
         <?php else: ?>
             <?=$this->escapeHtml($additional['text'])?>
         <?php endif; ?>
diff --git a/themes/finc/templates/RecordDriver/DefaultRecord/data-relatedRecords.phtml b/themes/finc/templates/RecordDriver/DefaultRecord/data-relatedRecords.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..ae4992a21951a38c840dc8aff2800fda90db014a
--- /dev/null
+++ b/themes/finc/templates/RecordDriver/DefaultRecord/data-relatedRecords.phtml
@@ -0,0 +1,17 @@
+<?php $first_other = TRUE;
+foreach ($data['first_results'] as $other): ?>
+    <?php if ($first_other): ?>
+        <?php $first_other = FALSE;
+            if (!isset($label) || empty($label)) {
+                $label = $other->getTitle();
+            }
+        ?>
+    <?php else: ?>
+        <?php $label = $other->getTitle() ?>
+        <br/>
+    <?php endif; ?>
+    <a href="<?= $this->recordLink()->getUrl($other->getUniqueId()) ?>"><?= $this->escapeHtml($label) ?></a>
+<?php endforeach; ?>
+<?php if (isset($data['more_query'])): ?>
+    <br/><a href="<?= $this->record($this->driver)->getLink('related', $data['more_query']) ?>"><?= $this->translate('More') ?>&nbsp;...</a>
+<?php endif; ?>
\ No newline at end of file
diff --git a/themes/finc/templates/RecordDriver/DefaultRecord/result-list.phtml b/themes/finc/templates/RecordDriver/DefaultRecord/result-list.phtml
index 6baef95748b7f8840d8e78a07a38a48c5a700c41..36660cc5e396252fc74e6434b0e0fd971fcc63e4 100644
--- a/themes/finc/templates/RecordDriver/DefaultRecord/result-list.phtml
+++ b/themes/finc/templates/RecordDriver/DefaultRecord/result-list.phtml
@@ -5,6 +5,7 @@ $coverDetails = $this->record($this->driver)->getCoverDetails('result-list', 'me
 $cover = $coverDetails['html'];
 $thumbnail = false;
 $thumbnailAlignment = $this->record($this->driver)->getThumbnailAlignment('result');
+$describedById = $driver->getSourceIdentifier() . '|' . $driver->getUniqueId();
 if ($cover):
   ob_start(); ?>
   <div class="media-<?=$thumbnailAlignment?> <?=$this->escapeHtmlAttr($coverDetails['size'])?>">
@@ -32,7 +33,7 @@ if ($cover):
   <div class="media-body">
     <div class="result-body">
       <div>
-        <a href="<?=$this->recordLink()->getUrl($this->driver)?>" class="title getFull" data-view="<?=$this->params->getOptions()->getListViewOption()?>">
+        <a id="<?=$describedById?>" href="<?=$this->recordLink()->getUrl($this->driver)?>" class="title getFull" data-view="<?=$this->params->getOptions()->getListViewOption()?>">
           <?=$this->record($this->driver)->getTitleHtml()?>
         </a>
       </div>
diff --git a/themes/finc/templates/RecordDriver/SolrAI/result-list.phtml b/themes/finc/templates/RecordDriver/SolrAI/result-list.phtml
index 37b59c796055be28f670027ccd96cb3bf20a8d86..25c28d3b4118de527446d7216f83a413a90ea57c 100644
--- a/themes/finc/templates/RecordDriver/SolrAI/result-list.phtml
+++ b/themes/finc/templates/RecordDriver/SolrAI/result-list.phtml
@@ -208,11 +208,11 @@ if ($cover):
         ?>
         <span class="hidden-xs">
             <i class="fa fa-fw fa-qrcode" aria-hidden="true"></i> <a href="<?=$this->escapeHtmlAttr($QRCode);?>" class="qrcodeLink"><?=$this->transEsc('qrcode_show')?></a>
-          <div class="qrcode hidden">
+          <span class="qrcode hidden">
             <script type="text/template" class="qrCodeImgTag">
               <img alt="<?=$this->transEsc('QR Code')?>" src="<?=$this->escapeHtmlAttr($QRCode);?>"/>
             </script>
-          </div>
+          </span>
           <br/>
         </span>
       <?php endif; ?>
@@ -224,8 +224,7 @@ if ($cover):
       <?php if ($this->userlist()->getMode() !== 'disabled'): ?>
         <?php /* if ($this->permission()->allowDisplay('feature.Favorites')): */ ?>
         <?php /* Add to favorites; finc: keep Icon inside link - CK */ ?>
-        <a href="<?=$this->recordLink()->getActionUrl($this->driver, 'Save')?>" data-lightbox class="save-record result-link-label" data-id="<?=$this->escapeHtmlAttr($this->driver->getUniqueId())?>"
-           title="<?=$this->transEsc('Add to favorites')?>">
+        <a href="<?=$this->recordLink()->getActionUrl($this->driver, 'Save')?>" data-lightbox class="save-record result-link-label" data-id="<?=$this->escapeHtmlAttr($this->driver->getUniqueId())?>">
           <i class="result-link-icon fa fa-fw fa-star" aria-hidden="true"></i> <?=$this->transEsc('Add to favorites')?>
         </a><br/>
       <?php elseif ($block = $this->permission()->getAlternateContent('feature.Favorites')): ?>
diff --git a/themes/finc/templates/RecordTab/holdingsils/standard.phtml b/themes/finc/templates/RecordTab/holdingsils/standard.phtml
index 561d2f01b1e944b7cbb1223556f6624f76eaedb6..5c1c993c792ce7817738e48ab2ff6f808a0f5156 100644
--- a/themes/finc/templates/RecordTab/holdingsils/standard.phtml
+++ b/themes/finc/templates/RecordTab/holdingsils/standard.phtml
@@ -47,7 +47,7 @@
         <?php endif; ?>
         <?php /* finc-specific additional insert, newspaper orders via mail - #6096 - CK */ ?>
         <?php if (isset($holding['emailHoldLink']) && $holding['emailHoldLink']): ?>
-          <a class="<?= $checkEmailHold ? 'checkEmailHold ' : '' ?>placeEmailHold " data-lightbox href="<?= $this->recordLink()->getRequestUrl($holding['emailHoldLink']) ?>" title="<?= $this->transEsc($checkEmailHold ? "EmailHold::email_hold_check_text" : "EmailHold::email_hold_place_text") ?>">
+          <a class="<?= $checkEmailHold ? 'checkEmailHold ' : '' ?>placeEmailHold " data-lightbox href="<?= $this->recordLink()->getRequestUrl($holding['emailHoldLink']) ?>">
             <i class="fa fa-flag"></i>&nbsp;<?= $this->transEsc($checkEmailHold ? "EmailHold::email_hold_check_text" : "EmailHold::email_hold_place_text") ?>
           </a>
         <?php endif; ?>
diff --git a/themes/finc/templates/header.phtml b/themes/finc/templates/header.phtml
index b2019c53f1fe2c15e6e4d3b2e757cce73be8f037..fc370fe70a5bb8367eab7727d972fb0dd3969b42 100644
--- a/themes/finc/templates/header.phtml
+++ b/themes/finc/templates/header.phtml
@@ -102,21 +102,19 @@
             <li class="language dropdown">
               <form method="post" name="langForm" id="langForm">
                 <input type="hidden" name="mylang"/>
-              </form>
-
 								<a href="#" class="btn dropdown-toggle <?=(count($this->layout()->allLangs) == 2) ? ' hidden' : ''?>" data-toggle="dropdown" aria-controls="langmenu" aria-expanded="false">
 									<?=$this->transEsc("Language")?> <strong class="caret"></strong>
 								</a>
-
-              <ul id="langmenu" class="dropdown-menu <?=(count($this->layout()->allLangs) == 2) ? ' oneLanguage' : ''?>">
-                <?php foreach ($this->layout()->allLangs as $langCode => $langName): ?>
-		              <?php if ($langCode !== $this->layout()->userLang) : ?>
-    	              <li>
-      	              <a class="btn <?=(count($this->layout()->allLangs) == 2) ? ' btn-secondary' : ''?>" href="#" onClick="document.langForm.mylang.value='<?=$langCode?>';document.langForm.submit()"><?=$this->displayLanguageOption($langName)?></a>
-        	          </li>
-                  <?php endif; ?>
-                <?php endforeach; ?>
-              </ul>
+                <ul id="langmenu" class="dropdown-menu <?=(count($this->layout()->allLangs) == 2) ? ' oneLanguage' : ''?>">
+                  <?php foreach ($this->layout()->allLangs as $langCode => $langName): ?>
+                    <?php if ($langCode !== $this->layout()->userLang) : ?>
+                      <li>
+                        <button type="submit" class="btn <?=(count($this->layout()->allLangs) == 2) ? ' btn-secondary' : ''?>" href="#" onClick="document.langForm.mylang.value='<?=$langCode?>';document.langForm.submit()"><?=$this->displayLanguageOption($langName)?></button>
+                      </li>
+                    <?php endif; ?>
+                  <?php endforeach; ?>
+                </ul>
+              </form>
 						</li>
           <?php endif; ?>
         </ul>
diff --git a/themes/finc/templates/layout/layout.phtml b/themes/finc/templates/layout/layout.phtml
index 2993ffd55b4da7907a2a64ae0fc8096f3329df2d..de31a198ebb34751939531dd2df5d536f8046c64 100644
--- a/themes/finc/templates/layout/layout.phtml
+++ b/themes/finc/templates/layout/layout.phtml
@@ -153,28 +153,30 @@ if (!isset($this->layout()->searchbox)) {
   $this->layout()->searchbox = $this->render('search/searchbox.phtml');
 }
 ?>
-<?php if (isset($this->layout()->srmessage)): // message for benefit of screen-reader users ?>
-  <span class="sr-only" role="heading" aria-level="1"><?=$this->layout()->srmessage?></span>
-<?php endif; ?>
 
-<?php /* Add landmark role to avoid 'all content must be inside landmarks error', CK */ ?>
-<div role="navigation" aria-label="Skip_navigation_links">
-  <?php /* Show skip to search link only when page is not "advanced" search, CK */ ?>
-  <?php if (strtolower($this->layout()->templateName) !== 'advanced'): ?>
-    <a class="sr-only" href="#searchForm_lookfor"><?=$this->transEsc('Skip to search')?></a>
+<?php /* Move skip links inside header landmark;
+         Start header here, not above, custom finc, CK */ ?>
+<header class="hidden-print">
+  <?php if (isset($this->layout()->srmessage)): // message for benefit of screen-reader users ?>
+    <span class="sr-only" role="heading" aria-level="1"><?=$this->layout()->srmessage?></span>
   <?php endif; ?>
-  <a class="sr-only" href="#content"><?=$this->transEsc('Skip to content')?></a>
-  <?php if (substr_count(strtolower($this->layout()->templateName), 'results') > 0): ?>
-    <?php if (strcmp($this->layout()->userLang, 'de') == 0): ?>
-      <a class="sr-only hidden-xs" href="#myresearch-sidebar"><?=$this->transEsc(isset($this->overrideSideFacetCaption) ? $this->overrideSideFacetCaption : 'Narrow Search')?></a>
-    <?php else: ?>
-      <a class="sr-only hidden-xs" href="#myresearch-sidebar"><?=$this->transEsc('skip-to')?><?=strtolower($this->transEsc(isset($this->overrideSideFacetCaption) ? $this->overrideSideFacetCaption : 'Narrow Search'))?></a>
+  
+  <?php /* Add landmark role to avoid 'all content must be inside landmarks error', CK */ ?>
+  <div role="navigation" aria-label="<?=$this->transEsc('Skip_navigation_links')?>">
+    <?php /* Show skip to search link only when page is not "advanced" search, CK */ ?>
+    <?php if (strtolower($this->layout()->templateName) !== 'advanced'): ?>
+      <a class="sr-only" href="#searchForm_lookfor"><?=$this->transEsc('Skip to search')?></a>
     <?php endif; ?>
-  <?php endif; ?>
-</div>
-
-<?php /* Start header here, not above, custom finc, CK */ ?>
-<header class="hidden-print">
+    <a class="sr-only" href="#content"><?=$this->transEsc('Skip to content')?></a>
+    <?php if (substr_count(strtolower($this->layout()->templateName), 'results') > 0): ?>
+      <?php if (strcmp($this->layout()->userLang, 'de') == 0): ?>
+        <a class="sr-only hidden-xs" href="#myresearch-sidebar"><?=$this->transEsc(isset($this->overrideSideFacetCaption) ? $this->overrideSideFacetCaption : 'Narrow Search')?></a>
+      <?php else: ?>
+        <a class="sr-only hidden-xs" href="#myresearch-sidebar"><?=$this->transEsc('skip-to')?><?=strtolower($this->transEsc(isset($this->overrideSideFacetCaption) ? $this->overrideSideFacetCaption : 'Narrow Search'))?></a>
+      <?php endif; ?>
+    <?php endif; ?>
+  </div>
+  
   <?=$this->render('header.phtml')?>
 </header>
 <nav class="breadcrumbs" aria-label="<?=$this->transEsc('Breadcrumbs')?>">
diff --git a/themes/finc/templates/record/cart-buttons.phtml b/themes/finc/templates/record/cart-buttons.phtml
index 1e8ba70357f029b5abb411755a070380dec49d3e..edb7d83ea32988fbf3970619cf617a6174abcc5b 100644
--- a/themes/finc/templates/record/cart-buttons.phtml
+++ b/themes/finc/templates/record/cart-buttons.phtml
@@ -6,10 +6,10 @@
     <span class="btn-bookbag-toggle" data-cart-id="<?=$this->escapeHtmlAttr($this->id)?>" data-cart-source="<?=$this->escapeHtmlAttr($this->source)?>">
       <?php /* Make add-to/remove-from bookbag accessible for keyboard navigation - CK */ ?>
     <a class="cart-add hidden<?php if (!$cart->contains($cartId)): ?> correct<?php endif ?>" href="javascript:" tabindex="0">
-      <i class="cart-link-icon fa fa-plus" aria-hidden="true" title="<?=$this->transEsc('Add to Book Bag')?>"></i><span class="cart-link-label"><?=$this->transEsc('Add to Book Bag')?></span>
+      <i class="cart-link-icon fa fa-plus" aria-hidden="true"></i><span class="cart-link-label"><?=$this->transEsc('Add to Book Bag')?></span>
     </a>
     <a class="cart-remove hidden<?php if ($cart->contains($cartId)): ?> correct<?php endif ?>" href="javascript:" tabindex="0">
-      <i class="cart-link-icon fa fa-minus-circle" aria-hidden="true" title="<?=$this->transEsc('Remove from Book Bag')?>"></i> <span class="cart-link-label"><?=$this->transEsc('Remove from Book Bag')?></span>
+      <i class="cart-link-icon fa fa-minus-circle" aria-hidden="true"></i> <span class="cart-link-label"><?=$this->transEsc('Remove from Book Bag')?></span>
     </a>
     <noscript>
       <form method="post" name="addForm" action="<?=$this->url('cart-processor')?>">
diff --git a/themes/finc/templates/record/cover.phtml b/themes/finc/templates/record/cover.phtml
index af93f5da6ee32dd07521c4c5006ff8eda9fa2dbc..f8d179eb3f3b9d1e6c246f092509450557a16f84 100644
--- a/themes/finc/templates/record/cover.phtml
+++ b/themes/finc/templates/record/cover.phtml
@@ -10,12 +10,14 @@
 <?php elseif ($cover === false): ?>
   <img src="<?=$this->url('cover-unavailable')?>" <?php if ($linkPreview): ?>data-linkpreview="true" <?php endif; ?>class="nocover" alt="<?=$this->transEsc('No Cover Image')?>" aria-hidden="true" />
 <?php else: ?>
-    <div class="ajaxcover">
-        <div class="spinner"><i class="fa fa-spinner fa-spin"></i> <?=$this->translate('Loading')?>...</div>
+    <div id="cover-<?=$driver->getUniqueID()?>" class="ajaxcover">
+        <div class="spinner"><i class="fa fa-spinner fa-spin"></i></div>
         <div class="cover-container">
-            <a class="coverlink">
-            <img <?php if ($linkPreview): ?>data-linkpreview="true" <?php endif; ?>data-recordsource="<?=$this->escapeHtmlAttr($driver->getSourceIdentifier())?>" data-recordid="<?=$this->escapeHtmlAttr($driver->getUniqueID())?>" data-coversize="<?=$this->escapeHtmlAttr($size)?>" class="recordcover ajax" alt="<?=$this->escapeHtmlAttr($alt); ?>" />
-            </a>
+          <?=$this->render('record/coverReplacement')?>
+          <a class="coverlink hidden">
+            <img src onerror="loadCoverByElement({source:'<?=$this->escapeHtmlAttr($driver->getSourceIdentifier())?>', recordId:'<?=$this->escapeHtmlAttr($driver->getUniqueID())?>', size:'<?=$this->escapeHtmlAttr($size)?>'}, $('#cover-<?=$driver->getUniqueID()?>'))"
+              <?php if ($linkPreview): ?>data-linkpreview="true" <?php endif; ?> class="recordcover ajax" alt="<?=$this->escapeHtmlAttr($alt); ?>" />
+          </a>
         </div>
     </div>
 <?php endif; ?>
diff --git a/themes/finc/templates/search/controls/limit.phtml b/themes/finc/templates/search/controls/limit.phtml
index 9284b184791a9838154e3c8a3e277b6c4af9a76e..8c34fc5bc7c59e9b45cfec87ffa22e854c485ad9 100644
--- a/themes/finc/templates/search/controls/limit.phtml
+++ b/themes/finc/templates/search/controls/limit.phtml
@@ -1,16 +1,21 @@
 <!-- finc: search - controls - limit -->
+<?php /* Add div #18016 - HR */ ?>
 <?php $limitList = $this->params->getLimitList(); ?>
 <?php if (count($limitList) > 1): ?>
   <?php /* finc: DO NOT use class 'form-inline' as it messes up the select box */ ?>
   <form class="limit" action="<?=$this->currentPath() . $this->results->getUrlQuery()->setLimit(null)?>" method="post">
     <label for="limit"><?=$this->transEsc('Results per page')?></label>
-    <?php /* finc: DO NOT use class 'form-control' as it messes up the select box */ ?>
-    <select id="limit" name="limit" class="jumpMenu">
-      <?php foreach ($limitList as $limitVal => $limitData): ?>
-        <option value="<?=$this->escapeHtmlAttr($limitVal)?>" <?=$limitData['selected']? ' selected="selected" ':'' ?>><?=$this->escapeHtml($limitData['desc'])?></option>
-      <?php endforeach; ?>
-    </select>
-    <noscript><input type="submit" value="<?=$this->transEsc("Set")?>" /></noscript>
+    <div class="search-controls-div">
+      <?php /* finc: DO NOT use class 'form-control' as it messes up the select box */ ?>
+      <select id="limit" name="limit">
+        <?php foreach ($limitList as $limitVal => $limitData): ?>
+          <option value="<?=$this->escapeHtmlAttr($limitVal)?>" <?=$limitData['selected']? ' selected="selected" ':'' ?>><?=$this->escapeHtml($limitData['desc'])?></option>
+        <?php endforeach; ?>
+      </select>
+      <button type="submit" class="btn btn-primary" aria-label="<?=$this->transEsc("Set")?>">
+        <i class="fa fa-refresh" aria-hidden="true"></i>
+      </button>
+    </div>
   </form>
 <?php endif; ?>
 <!-- finc: search - controls - limit - END -->
diff --git a/themes/finc/templates/search/controls/sort.phtml b/themes/finc/templates/search/controls/sort.phtml
index c8a8186475864d0fe27206dd387136eb5a82ea4f..557a995a4dc38021cd6812228a1263145acd9e0b 100644
--- a/themes/finc/templates/search/controls/sort.phtml
+++ b/themes/finc/templates/search/controls/sort.phtml
@@ -1,16 +1,21 @@
 <!-- finc: search - controls - sort -->
+<?php /* Add div #18016 - HR */ ?>
 <?php $list = $this->params->getSortList(); if (!empty($list)): ?>
   <?php /* finc: we use class 'text-right' */ ?>
   <form class="search-sort text-right" action="<?=$this->currentPath()?>" method="get" name="sort">
     <?=$this->results->getUrlQuery()->asHiddenFields(['sort' => '/.*/']);?>
     <label for="sort_options_1"><?=$this->transEsc('Sort')?></label>
-    <?php /* finc: DO NOT use class 'form-control' as it messes up the select box */ ?>
-    <select id="sort_options_1" name="sort" class="jumpMenu">
-      <?php foreach ($list as $sortType => $sortData): ?>
-        <option value="<?=$this->escapeHtmlAttr($sortType)?>" <?=$sortData['selected']?' selected="selected"':''?>><?=$this->transEsc($sortData['desc'])?></option>
-      <?php endforeach; ?>
-    </select>
-    <noscript><input type="submit" class="btn btn-primary" value="<?=$this->transEsc("Set")?>" /></noscript>
+    <div class="search-controls-div">
+      <?php /* finc: DO NOT use class 'form-control' as it messes up the select box */ ?>
+      <select id="sort_options_1" name="sort">
+        <?php foreach ($list as $sortType => $sortData): ?>
+          <option value="<?=$this->escapeHtmlAttr($sortType)?>" <?=$sortData['selected']?' selected="selected"':''?>><?=$this->transEsc($sortData['desc'])?></option>
+        <?php endforeach; ?>
+      </select>
+      <button type="submit" class="btn btn-primary" aria-label="<?=$this->transEsc("Set")?>">
+        <i class="fa fa-refresh" aria-hidden="true"></i>
+      </button>
+    </div>
   </form>
 <?php endif; ?>
 <!-- finc: search - controls - sort - END -->
diff --git a/themes/finc/templates/search/newitem.phtml b/themes/finc/templates/search/newitem.phtml
index 90b2a2077bfc8393592372667e03c42bf49b7f02..75049b76728d99909875fd5c5c842176e1c25d1c 100644
--- a/themes/finc/templates/search/newitem.phtml
+++ b/themes/finc/templates/search/newitem.phtml
@@ -1,41 +1,40 @@
 <!-- finc - templates - search - newitem -->
 <?php
-    // Set up page title:
-    $this->headTitle($this->translate('New Item Search'));
-
-    // Set up breadcrumbs:
-    $this->layout()->breadcrumbs = '<li class="active">' . $this->transEsc('New Items') . '</li>';
-
-    // Convenience variable:
-    $offlineMode = $this->ils()->getOfflineMode();
+  // Set up page title:
+  $this->headTitle($this->translate('New Item Search'));
+  
+  // Set up breadcrumbs:
+  $this->layout()->breadcrumbs = '<li class="active">' . $this->transEsc('New Items') . '</li>';
+  
+  // Convenience variable:
+  $offlineMode = $this->ils()->getOfflineMode();
 ?>
-
-<h1><?=$this->transEsc('Find New Items')?></h1>
-<?php if ($offlineMode == "ils-offline"): ?>
-  <?=$this->render('Helpers/ils-offline.phtml', ['offlineModeMsg' => 'ils_offline_holdings_message'])?>
-<?php endif; ?>
-<form method="get" class="form-search-newitem">
-  <div class="form-group">
-    <label class="control-label"><?=$this->transEsc('Range')?>:</label>
-    <div class="btn-group" data-toggle="buttons">
+<div class="mainbody">
+  <h1><?= $this->transEsc('Find New Items') ?></h1>
+  <?php if ($offlineMode == "ils-offline"): ?>
+    <?= $this->render('Helpers/ils-offline.phtml', ['offlineModeMsg' => 'ils_offline_holdings_message']) ?>
+  <?php endif; ?>
+  <form method="get" class="form-search-newitem">
+    <div class="form-group">
+      <legend><?= $this->transEsc("Choose Period") ?>:</legend>
       <?php foreach ($this->ranges as $key => $range): ?>
-        <label class="btn btn-primary<?php if($key == 0): ?> active<?php endif ?>">
-          <input type="radio" name="range" id="newitem_range_<?=$this->escapeHtmlAttr($key)?>" value="<?=$this->escapeHtmlAttr($range)?>"<?=($key == 0) ? ' checked="checked"' : ''?>/>
-          <?=($range == 1) ? $this->transEsc('Yesterday') : $this->transEsc('past_days', ['%%range%%' => $this->escapeHtml($range)])?>
+        <input type="radio" name="range" id="newitem_range_<?= $this->escapeHtmlAttr($key) ?>" value="<?= $this->escapeHtmlAttr($range) ?>"<?= ($key == 0) ? ' checked="checked"' : '' ?>/>
+        <label for="newitem_range_<?= $this->escapeHtmlAttr($key) ?>">
+          <?= ($range == 1) ? $this->transEsc('From') . " " . $this->transEsc('Yesterday') : $this->transEsc('past_days', ['%%range%%' => $this->escapeHtml($range)]) ?>
         </label>
       <?php endforeach; ?>
     </div>
-  </div>
-  <?php if (is_array($this->fundList) && !empty($this->fundList)): ?>
-    <div class="form-group">
-      <label class="control-label" for="newitem_department"><?=$this->transEsc('Department')?>:</label>
-      <select id="newitem_department" name="department" size="10" class="form-control">
-      <?php foreach ($this->fundList as $fundId => $fund): ?>
-        <option value="<?=$this->escapeHtmlAttr($fundId)?>"><?=$this->transEsc($fund)?></option>
-      <?php endforeach; ?>
-      </select>
-    </div>
-  <?php endif; ?>
-  <input class="btn btn-primary" type="submit" name="submit" value="<?=$this->transEsc('Find')?>"/>
-</form>
+    <?php if (is_array($this->fundList) && !empty($this->fundList)): ?>
+      <div class="form-group">
+        <label class="control-label" for="newitem_department"><?= $this->transEsc('Department') ?>:</label>
+        <select id="newitem_department" name="department" size="10" class="form-control">
+          <?php foreach ($this->fundList as $fundId => $fund): ?>
+            <option value="<?= $this->escapeHtmlAttr($fundId) ?>"><?= $this->transEsc($fund) ?></option>
+          <?php endforeach; ?>
+        </select>
+      </div>
+    <?php endif; ?>
+    <input class="btn btn-primary" type="submit" name="submit" value="<?= $this->transEsc('Find') ?>"/>
+  </form>
+</div>
 <!-- finc - templates - search - newitem - END -->
diff --git a/themes/finc/templates/search/searchbox.phtml b/themes/finc/templates/search/searchbox.phtml
index 65f67b3019798d98b1547c5a727e735da9afb250..3e8963def57269b1389a5f9cf8727fabd3a67044 100644
--- a/themes/finc/templates/search/searchbox.phtml
+++ b/themes/finc/templates/search/searchbox.phtml
@@ -44,7 +44,7 @@ $hiddenFilterParams = $this->searchTabs()->getCurrentHiddenFilterParams($this->s
       <?php if (!empty($tabs)): ?></div><?php endif; ?>
   </div>
 <?php else: ?>
-  <form id="searchForm" class="searchForm navbar-form navbar-left flip" method="get" action="<?=$this->url($basicSearch)?>" name="searchForm" autocomplete="off">
+  <form id="searchForm" class="searchForm navbar-form navbar-left flip" method="get" action="<?=$this->url($basicSearch)?>" name="searchForm" autocomplete="off" role="search">
     <?= $this->context($this)->renderInContext('search/searchTabs', ['searchTabs' => $tabConfig['tabs']]); ?>
     <?php $placeholder = $this->searchbox()->getPlaceholderText($tabConfig['selected']['id'] ?? null); ?>
     <?php /* finc: keep "required" */ ?>
@@ -60,7 +60,7 @@ $hiddenFilterParams = $this->searchTabs()->getCurrentHiddenFilterParams($this->s
     <?php endif; ?>
     <button type="submit" class="btn btn-primary"><i class="fa fa-search" aria-hidden="true"></i> <span class="find-label sr-only"><?=$this->transEsc("Find")?></span></button>
     <?php if ($advSearch): ?>
-      <a href="<?=$this->url($advSearch) . ((isset($this->searchId) && $this->searchId) ? '?edit=' . $this->escapeHtmlAttr($this->searchId) : $hiddenFilterParams)?>" class="btn btn-transparent" role="button" rel="nofollow"><i class="fa fa-cog"></i> <span class="hidden-xs hidden-sm hidden-md"><?=$this->transEsc("Advanced")?></span></a>
+      <a href="<?=$this->url($advSearch) . ((isset($this->searchId) && $this->searchId) ? '?edit=' . $this->escapeHtmlAttr($this->searchId) : $hiddenFilterParams)?>" class="btn btn-transparent" role="button" rel="nofollow" aria-label="<?=$this->transEsc("Advanced")?>"><i class="fa fa-cog"></i> <span class="hidden-xs hidden-sm hidden-md"><?=$this->transEsc("Advanced")?></span></a>
     <?php endif; ?>
     <?php if ($geoUrl = $this->geocoords()->getSearchUrl($options)) : ?>
       <a href="<?=$geoUrl?>" class="btn btn-link"><?=$this->transEsc('Geographic Search')?></a>
diff --git a/themes/finc/theme.config.php b/themes/finc/theme.config.php
index d8ccfb67f974a065e14c9f4d74a4d34155223633..51037a227bb81a1179f169b376ce8b91026d8014 100644
--- a/themes/finc/theme.config.php
+++ b/themes/finc/theme.config.php
@@ -17,6 +17,7 @@ return [
             'recordLink' => 'finc\View\Helper\Root\RecordLink',
             'record' => 'finc\View\Helper\Root\Record',
             'flashmessages' => 'finc\View\Helper\Root\Flashmessages',
+            'headTitle' => 'finc\View\Helper\Root\HeadTitle',
         ],
         'factories' => [
             'finc\View\Helper\Root\BranchInfo' =>
@@ -41,6 +42,8 @@ return [
                 'VuFind\View\Helper\Root\ResultFeedFactory',
             'finc\View\Helper\Root\Flashmessages' =>
                 'VuFind\View\Helper\Root\FlashmessagesFactory',
+            'finc\View\Helper\Root\HeadTitle' =>
+                'finc\View\Helper\Root\Factory::getHeadTitle',
         ]
     ]
 ];