diff --git a/.gitignore b/.gitignore
index bdecbe9fd6421a2590cf9e840620548b7e69efda..cb540b07dce57e8cc81f6ea136d55e5157f8f980 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,6 +17,8 @@ import/solrmarc.log*
 /solr
 /auth.json
 /core
-/.env
 /lessphp_*.list
-/docker-compose.override.yml
\ No newline at end of file
+/data/docker
+/docker-compose.override.yml
+/docker-env.override.yml
+/.env
diff --git a/composer.local.0.finc.json b/composer.local.0.finc.json
index bba74ca4bd2c335ff92d1a673c59efe74b464260..87f48624f598df40c8c23365e728c7e1970d3b7c 100644
--- a/composer.local.0.finc.json
+++ b/composer.local.0.finc.json
@@ -1,13 +1,23 @@
 {
+    "autoload": {
+        "classmap": ["devops/composer/modules.php"]
+    },
     "require": {
         "finc/rules-evaluator": "0.0.3",
         "sabre/vobject": "3.5.3",
         "symfony/filesystem": "^3.4"
     },
     "scripts": {
-        "post-install-cmd": "@copy-themes-force",
-        "post-update-cmd": "@copy-themes-force",
-        "phpcs-finc": "vendor/bin/phpcs --standard=tests/finc/phpcs.xml",
-        "copy-themes-force": "php devops/composer/themes.php --force"
+        "post-install-cmd": ["@copy-themes-force", "@dump-modules"],
+        "post-update-cmd": ["@copy-themes-force", "@dump-modules"],
+        "copy-themes-force": "php devops/composer/themes.php --force",
+        "dump-modules": "ComposerEventHandlers\\Modules::dump"
+    },
+    "extra": {
+        "vufind": {
+            "modules": [
+                "finc"
+            ]
+        }
     }
 }
\ No newline at end of file
diff --git a/composer.local.1.fid.json b/composer.local.1.fid.json
index d63184786c36369a069123d0509bf8ba4dbaa299..89dfbb7d724a115b5982b8616557a9f845544e49 100644
--- a/composer.local.1.fid.json
+++ b/composer.local.1.fid.json
@@ -10,5 +10,19 @@
         "phpdocumentor/reflection-docblock": "^4.3",
         "symfony/http-foundation": "^3.4",
         "zendframework/zend-i18n-resources": "^2.6"
+    },
+    "extra": {
+        "vufind": {
+            "modules": [
+                "Zend\\Filter",
+                "Zend\\Hydrator",
+                "Zend\\Validator",
+                "Zend\\Serializer",
+                "Zend\\InputFilter",
+                "finc\\VuFindHttpPsrCompat",
+                "finc\\SymfonySerializerZendBridge",
+                "fid"
+            ]
+        }
     }
 }
\ No newline at end of file
diff --git a/config/application.config.php b/config/application.config.php
index 284d2fd803c85bea83f0203354b9fd06a5c6bed3..204091ce3d179a988235592bc255132f1b698621 100644
--- a/config/application.config.php
+++ b/config/application.config.php
@@ -1,10 +1,14 @@
 <?php
 
+use ComposerEventHandlers\Modules;
+
 // Set up modules:
-$modules = array(
-    'Zend\Form', 'Zend\Router', 'ZfcRbac', 'VuFindTheme', 'VuFindSearch', 'VuFind', 'VuFindAdmin', 'VuFindApi'
-);
-if (PHP_SAPI == 'cli' && !defined('VUFIND_PHPUNIT_RUNNING')) {
+$modules = [
+    'Zend\Form', 'Zend\Router', 'ZfcRbac',
+    'VuFindTheme', 'VuFindSearch', 'VuFind', 'VuFindAdmin', 'VuFindApi'
+];
+if (PHP_SAPI == 'cli' && APPLICATION_ENV !== 'testing') {
+    $modules[] = 'Zend\Mvc\Console';
     $modules[] = 'VuFindConsole';
 }
 if (APPLICATION_ENV == 'development') {
@@ -20,22 +24,7 @@ if ($localModules = getenv('VUFIND_LOCAL_MODULES')) {
     }
 }
 
-/** Begin of temporarily necessary adjustments. */
-// Append custom modules.
-array_push($modules, ...[
-    'Zend\Filter',
-    'Zend\Hydrator',
-    'Zend\Validator',
-    'Zend\Serializer',
-    'Zend\InputFilter',
-    'finc\VuFindHttpPsrCompat',
-    'finc\SymfonySerializerZendBridge',
-    'finc',
-    'fid',
-    'fid_bbi',
-    'finc\WorldCat',
-]);
-/** End of temporarily necessary adjustments. */
+array_push($modules, ...Modules::get());
 
 // Set up cache directory (be sure to keep separate cache for CLI vs. web and
 // to account for potentially variant environment settings):
diff --git a/devops/composer/modules.php b/devops/composer/modules.php
new file mode 100644
index 0000000000000000000000000000000000000000..2d2f99618c3e7a5dd30b9ec5a186cac51d21530c
--- /dev/null
+++ b/devops/composer/modules.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Copyright (C) 2019  Leipzig University Library
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ *
+ * @author  Sebastian Kehr <kehr@ub.uni-leipzig.de>
+ * @license https://opensource.org/licenses/GPL-3.0 GNU GPLv3
+ */
+
+namespace ComposerEventHandlers;
+
+use Composer\Script\Event;
+
+class Modules
+{
+    private const PATH = __DIR__ . '/../../data/cache/modules.php';
+
+    public static function dump(Event $event)
+    {
+        /** @noinspection PhpUndefinedMethodInspection */
+        $extra = $event->getComposer()->getPackage()->getExtra();
+        $modules = var_export($extra['vufind']['modules'] ?? [], true);
+        file_put_contents(self::PATH, "<?php\nreturn $modules;\n");
+    }
+
+    public static function get(): array
+    {
+        /** @noinspection PhpIncludeInspection */
+        return require self::PATH;
+    }
+}
+
diff --git a/devops/docker/autoconfig/entrypoint.sh b/devops/docker/autoconfig/entrypoint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..16a30377f02fd61b10750fc96121600719aa045d
--- /dev/null
+++ b/devops/docker/autoconfig/entrypoint.sh
@@ -0,0 +1,33 @@
+#!/usr/bin/env sh
+# Copyright (C) 2020  Leipzig University Library
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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, see <http://www.gnu.org/licenses/>.
+#
+# @author  Sebastian Kehr <kehr@ub.uni-leipzig.de>
+# @license https://opensource.org/licenses/GPL-3.0 GNU GPLv3
+
+until ! ping -c1 env >/dev/null 2>&1; do :; done
+set -a; [ -f ./data/docker/env/autoconfig ] && . ./data/docker/env/autoconfig; set +a
+
+if [ "$(whoami)" = "node" ]; then
+  [ -d "$HOME" ] || PREFIX=$HOME npm install -g @ubleipzig/autoconfig@2.3.2
+  exec "$HOME/bin/autoconfig" "$@"
+  exit
+fi
+
+: "${UIDGID:=$(stat -c '%u' .):$(stat -c '%g' .)}"
+sed -i "s/$(id -u node):$(id -g node)/$UIDGID/" /etc/passwd
+sh -c "exit 1"; while [ $? -eq 1 ]; do sleep 1; nc -zv "db:3306" >/dev/null 2>&1; done;
+su -p -c "exec $0 $*" node
+
diff --git a/devops/docker/composer/Dockerfile b/devops/docker/composer/Dockerfile
index d6a3132a668046f76bb51a4698ad32c85c33630b..88483ea7d1b600dd05990993d1eae951ffe764e6 100644
--- a/devops/docker/composer/Dockerfile
+++ b/devops/docker/composer/Dockerfile
@@ -1,3 +1,22 @@
-FROM composer:1.8.4
-COPY entrypoint.sh /entrypoint.sh
-ENTRYPOINT ["/bin/sh", "/entrypoint.sh"]
\ No newline at end of file
+# Copyright (C) 2020  Leipzig University Library
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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, see <http://www.gnu.org/licenses/>.
+#
+# @author  Sebastian Kehr <kehr@ub.uni-leipzig.de>
+# @license https://opensource.org/licenses/GPL-3.0 GNU GPLv3
+
+FROM composer:1.9.3
+RUN apk add --no-cache freetype-dev libxml2-dev \
+    && docker-php-ext-install gd \
+    && docker-php-ext-install soap
\ No newline at end of file
diff --git a/devops/docker/composer/entrypoint.sh b/devops/docker/composer/entrypoint.sh
old mode 100644
new mode 100755
index 5befd666f5ee3f3f656cfca57ee747c397a40a64..7d7261c6dda9088a4b080d35ecdbb688421c0395
--- a/devops/docker/composer/entrypoint.sh
+++ b/devops/docker/composer/entrypoint.sh
@@ -1,7 +1,31 @@
 #!/usr/bin/env sh
+# Copyright (C) 2020  Leipzig University Library
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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, see <http://www.gnu.org/licenses/>.
+#
+# @author  Sebastian Kehr <kehr@ub.uni-leipzig.de>
+# @license https://opensource.org/licenses/GPL-3.0 GNU GPLv3
 
-mkdir -p ${COMPOSER_HOME:=/tmp};
-chown -R "${OWNER:=$(stat -c "%u:%g" .)}" $COMPOSER_HOME
-echo "composer:x:$OWNER:composer,,,:$COMPOSER_HOME:/bin/sh" >> /etc/passwd
-COMMAND="cd $(pwd) && COMPOSER_HOME=$COMPOSER_HOME TINI_SUBREAPER= /docker-entrypoint.sh $@"
-su composer -c "$COMMAND"
\ No newline at end of file
+if [ "$(whoami)" = "php" ]; then
+  mkdir -p "$HOME"
+  exec /docker-entrypoint.sh "$@"
+  exit
+fi
+
+until ! ping -c1 env >/dev/null 2>&1; do :; done
+set -a; [ -f ./data/docker/env/composer ] && . ./data/docker/env/composer; set +a
+
+: "${UIDGID:=$(stat -c '%u' .):$(stat -c '%g' .)}"
+echo "php:x:$UIDGID:php::/bin/sh" >> /etc/passwd
+su -p -c "exec $0 $*" php
\ No newline at end of file
diff --git a/devops/docker/db/entrypoint.sh b/devops/docker/db/entrypoint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..8d4496520ab0e57c786020b179f402fa151a0b67
--- /dev/null
+++ b/devops/docker/db/entrypoint.sh
@@ -0,0 +1,23 @@
+#!/usr/bin/env sh
+# Copyright (C) 2020  Leipzig University Library
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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, see <http://www.gnu.org/licenses/>.
+#
+# @author  Sebastian Kehr <kehr@ub.uni-leipzig.de>
+# @license https://opensource.org/licenses/GPL-3.0 GNU GPLv3
+
+until ! ping -c1 env >/dev/null 2>&1; do :; done
+set -a; [ -f ./data/docker/env/db ] && . ./data/docker/env/db; set +a
+
+exec docker-entrypoint.sh "$@"
\ No newline at end of file
diff --git a/devops/docker/env/entrypoint.sh b/devops/docker/env/entrypoint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..720b6540b5f68b2c7b5194437e113e0e101928c8
--- /dev/null
+++ b/devops/docker/env/entrypoint.sh
@@ -0,0 +1,37 @@
+#!/usr/bin/env sh
+# Copyright (C) 2020  Leipzig University Library
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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, see <http://www.gnu.org/licenses/>.
+#
+# @author  Sebastian Kehr <kehr@ub.uni-leipzig.de>
+# @license https://opensource.org/licenses/GPL-3.0 GNU GPLv3
+
+# Taken from http://www.etalabs.net/sh_tricks.html
+quote () { printf %s\\n "$1" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/'/" ; }
+
+: "${UIDGID:=$(stat -c '%u' .):$(stat -c '%g' .)}"
+
+DIR=data/docker/env; [ -d "$DIR" ] && rm -rf $DIR
+mkdir -p "$DIR"; chown "$UIDGID" $DIR/.. $DIR
+
+# shellcheck disable=SC2046
+JSON=$(spruce merge $(find docker-env.*.yml) | spruce json)
+for KEY in $(echo "$JSON" | jq -r 'keys | join(" ")'); do
+  FILE="$DIR/$KEY"; [ -f "$FILE" ] && rm "$FILE"
+  for VAR in $(echo "$JSON" | jq -r ".$KEY | keys | join(\" \")"); do
+    VAL=$(echo "$JSON" | jq -r ".$KEY.$VAR")
+    echo "$VAR=$(quote "$VAL")" >> "$FILE"
+  done
+  chown "$UIDGID" $FILE
+done
\ No newline at end of file
diff --git a/devops/docker/grunt/entrypoint.sh b/devops/docker/grunt/entrypoint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..ba4fc1f8a05038afa15805ac76bf4162771d9b29
--- /dev/null
+++ b/devops/docker/grunt/entrypoint.sh
@@ -0,0 +1,45 @@
+#!/usr/bin/env sh
+# Copyright (C) 2020  Leipzig University Library
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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, see <http://www.gnu.org/licenses/>.
+#
+# @author  Sebastian Kehr <kehr@ub.uni-leipzig.de>
+# @license https://opensource.org/licenses/GPL-3.0 GNU GPLv3
+
+term_grunt () {
+  echo "Terminating grunt ..."
+  while true; do
+    PID=$(pgrep -o grunt)
+    if [ -z "$PID" ]; then break; fi
+    (sleep 1; kill -TERM "$PID") &
+    tail --pid="$PID" -f /dev/null
+  done
+  exit 0
+}
+
+if [ "$(whoami)" = "node" ]; then
+  mkdir -p "$HOME"
+  PREFIX="$HOME" npm install
+  node_modules/.bin/grunt "$@"
+  exit
+fi
+
+until ! ping -c1 env >/dev/null 2>&1; do :; done
+set -a; [ -f ./data/docker/env/grunt ] && . ./data/docker/env/grunt; set +a
+
+trap term_grunt TERM
+: "${UIDGID:=$(stat -c '%u' .):$(stat -c '%g' .)}"
+sed -i "s/$(id -u node):$(id -g node)/$UIDGID/" /etc/passwd
+su -p -c "exec $0 $*" node &
+while true; do :; done
\ No newline at end of file
diff --git a/devops/docker/mail/entrypoint.sh b/devops/docker/mail/entrypoint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..caf4219c3fe8bf667063aa3a03cb272d66118b63
--- /dev/null
+++ b/devops/docker/mail/entrypoint.sh
@@ -0,0 +1,25 @@
+#!/usr/bin/env sh
+# Copyright (C) 2020  Leipzig University Library
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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, see <http://www.gnu.org/licenses/>.
+#
+# @author  Sebastian Kehr <kehr@ub.uni-leipzig.de>
+# @license https://opensource.org/licenses/GPL-3.0 GNU GPLv3
+
+until ! ping -c1 env >/dev/null 2>&1; do :; done
+set -a; [ -f ./data/docker/env/mail ] && . ./data/docker/env/mail; set +a
+
+trap 'supervisorctl stop dovecot && supervisorctl stop postfix && exit 0' TERM
+/docker/init "$@" &
+while true; do :; done
\ No newline at end of file
diff --git a/devops/docker/php/Dockerfile b/devops/docker/php/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..cb900d0d3693de568ca0be85e90fe8b614d937b1
--- /dev/null
+++ b/devops/docker/php/Dockerfile
@@ -0,0 +1,28 @@
+# Copyright (C) 2020  Leipzig University Library
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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, see <http://www.gnu.org/licenses/>.
+#
+# @author  Sebastian Kehr <kehr@ub.uni-leipzig.de>
+# @license https://opensource.org/licenses/GPL-3.0 GNU GPLv3
+
+FROM php:7.2.11-fpm-alpine3.8
+RUN apk add --no-cache $PHPIZE_DEPS freetype-dev libxml2-dev icu-dev \
+    && pecl install xdebug \
+    && docker-php-ext-enable xdebug \
+    && docker-php-ext-install mysqli \
+    && docker-php-ext-install pdo_mysql \
+    && docker-php-ext-install gd \
+    && docker-php-ext-install soap \
+    && docker-php-ext-install intl
+COPY php.ini /usr/local/etc/php/conf.d/php.ini
\ No newline at end of file
diff --git a/devops/docker/php/entrypoint.sh b/devops/docker/php/entrypoint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..17f535933d41213cee73c1494df68f25c2077735
--- /dev/null
+++ b/devops/docker/php/entrypoint.sh
@@ -0,0 +1,25 @@
+#!/usr/bin/env sh
+# Copyright (C) 2020  Leipzig University Library
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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, see <http://www.gnu.org/licenses/>.
+#
+# @author  Sebastian Kehr <kehr@ub.uni-leipzig.de>
+# @license https://opensource.org/licenses/GPL-3.0 GNU GPLv3
+
+until ! ping -c1 env >/dev/null 2>&1; do :; done
+set -a; [ -f ./data/docker/env/php ] && . ./data/docker/env/php; set +a
+
+: "${UIDGID:=$(stat -c '%u' .):$(stat -c '%g' .)}"
+sed -i "s/$(id -u www-data):$(id -g www-data)/$UIDGID/" /etc/passwd
+exec docker-php-entrypoint "$@"
diff --git a/devops/docker/php/php.ini b/devops/docker/php/php.ini
new file mode 100644
index 0000000000000000000000000000000000000000..799a0b5897fa3f0d36c20276b5cf00b56e281e6b
--- /dev/null
+++ b/devops/docker/php/php.ini
@@ -0,0 +1,28 @@
+;  Copyright (C) 2020  Leipzig University Library
+; 
+;  This program is free software: you can redistribute it and/or modify
+;  it under the terms of the GNU General Public License as published by
+;  the Free Software Foundation, either version 3 of the License, or
+;  (at your option) any later version.
+; 
+;  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, see <http://www.gnu.org/licenses/>.
+; 
+;  @author  Sebastian Kehr <kehr@ub.uni-leipzig.de>
+;  @license https://opensource.org/licenses/GPL-3.0 GNU GPLv3
+
+; See https://www.php.net/manual/en/function.error-reporting.php for more details.
+error_reporting = E_ALL
+
+; See https://xdebug.org/docs/all_settings for more details.
+xdebug.remote_autostart=0
+xdebug.remote_mode=req
+xdebug.remote_handler=dbgp
+xdebug.remote_connect_back=1
+xdebug.remote_port=9000
+xdebug.remote_enable=1
\ No newline at end of file
diff --git a/docker-compose.override.yml.dist b/docker-compose.override.yml.dist
index be8f7b7eed7bd29eb81999dd975d874fea0a6ff6..59386e17c6570455f160623d9a83bce0ceab6005 100644
--- a/docker-compose.override.yml.dist
+++ b/docker-compose.override.yml.dist
@@ -1,10 +1,2 @@
 version: '2.4'
-# Use this file for local overrides and extensions to docker-compose.yml.
-services:
-  php:
-    <<: &volumes
-      volumes: []
-  httpd:
-    <<: *volumes
-  grunt:
-    <<: *volumes
\ No newline at end of file
+# Copy this file to docker-compose.override.yml and use for local non-commited overrides.
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
index a782e9574a3cf5f94faef80b20d95b4be487f15d..7096c7eed6425832d005df8b281ff08f271ec5fd 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,107 +1,103 @@
 version: '2.4'
 
 services:
+  env:
+    image: linkyard/yaml:1.1.1
+    volumes:
+      - .:/usr/local/vufind:rw
+    working_dir: /usr/local/vufind
+    entrypoint: ["devops/docker/env/entrypoint.sh"]
+
   composer:
     build: devops/docker/composer
     working_dir: /usr/local/vufind
     volumes:
-      - .:/usr/local/vufind:z
-      - composer-data:/tmp
+      - .:/usr/local/vufind:rw
       - ${SSH_AUTH_SOCK}:/ssh-agent
       - $HOME/.ssh/known_hosts:/etc/ssh/ssh_known_hosts
-    environment:
-      SSH_AUTH_SOCK: /ssh-agent
-    command: echo "Skipping composer."
+    depends_on:
+      - env
+    entrypoint: ["devops/docker/composer/entrypoint.sh"]
+    command: ["install"]
 
   php:
-    image: ubleipzig/vufind-php:7.2-8-debug
+    build: devops/docker/php
+    working_dir: /usr/local/vufind
     volumes:
       - ./:/usr/local/vufind
-    environment:
-      VUFIND_LOCAL_DIR: /usr/local/vufind/fid_bbi/dev
-      VUFIND_CACHE_DIR: /usr/local/vufind/data/cache
-      VUFIND_ENV: development
-      PHP_IDE_CONFIG: serverName=fid
-      XDEBUG_CONFIG: >-
-        remote_autostart=1
-        remote_mode=req
-        remote_handler=dbgp
-        remote_connect_back=0
-        remote_port=9000
-        remote_enable=1
-        remote_host=10.111.0.1
-        idekey=fid
+    depends_on:
+      - env
+      - db
+    entrypoint: ["devops/docker/php/entrypoint.sh"]
+    command: ["php-fpm"]
 
   httpd:
     image: ubleipzig/vufind-httpd:2.4-2
     ports:
-      - 127.0.0.1:11100:80
+      - 127.0.0.1:${HTTPD_PORT:-11100}:80
     volumes:
       - ./:/usr/local/vufind:ro
       - ./data/cache:/var/cache/vufind:ro
     depends_on:
+      - env
       - php
-    command: httpd -D FOREGROUND -c "ProxyTimeout 3600"
+    command: ["httpd", "-D", "FOREGROUND", "-c", "ProxyTimeout 3600"]
 
   db:
-    image: mariadb:10.2
+    image: mariadb:10.3.17
     ports:
-      - 127.0.0.1:11101:3306
+      - 127.0.0.1:${DB_PORT:-11101}:3306
+    working_dir: /usr/local/vufind
     volumes:
-      - mariadb-data:/var/lib/mysql:z
-    environment:
-      MYSQL_ROOT_PASSWORD: adminpw
-    command:
-      - --character-set-server=utf8mb4
-      - --collation-server=utf8mb4_unicode_ci
+      - ./:/usr/local/vufind:rw
+      - db-data:/var/lib/mysql
+    depends_on:
+      - env
+    entrypoint: ["devops/docker/db/entrypoint.sh"]
+    command: [
+      "mysqld",
+      "--character-set-server=utf8mb4",
+      "--collation-server=utf8mb4_unicode_ci"
+    ]
 
-  smtp:
+  mail:
     image: useltmann/mailcollect:8-1
+    working_dir: /usr/local/vufind
     ports:
-      - 25:25
-      - 143:143
+      - 127.0.0.1:${SMTP_PORT:-11102}:25
+      - 127.0.0.1:${IMAP_PORT:-11103}:143
     volumes:
       - mail-data:/home/dev/Maildir:z
+      - ./:/usr/local/vufind:rw
+    depends_on:
+      - env
+    entrypoint: ["devops/docker/mail/entrypoint.sh"]
+    command: ["run"]
 
   grunt:
-    image: ubleipzig/vufind-php:7.2-8-debug
+    image: node:7.10.1-slim
+    working_dir: /usr/local/vufind
     volumes:
-      - ./:/usr/local/vufind:z
-      - npm-data:/home/www-data/.npm
-    environment:
-      NODE_ENV: development
-    command: npm install && node_modules/.bin/grunt watch
+      - ./:/usr/local/vufind:rw
+    depends_on:
+      - env
+    entrypoint: ["devops/docker/grunt/entrypoint.sh"]
+    command: ["watch"]
 
   autoconfig:
-    image: ubleipzig/vufind-php:7.2-8-debug
+    image: node:7.10.1-alpine
+    working_dir: /usr/local/vufind
     volumes:
-      - ./:/usr/local/vufind:z
-    environment:
-      VUFIND_SITE: fid_bbi
-      VUFIND_INSTANCE: dev
-      VUFIND_DB_CLIENT: "%"
-      VUFIND_DB_ADMIN_PASSWORD: adminpw
-      VF_config_ini__Authentication__hash_passwords: "true"
-      VF_config_ini__Authentication__encrypt_ils_password: "true"
-      VF_config_ini__Database__database: mysql://vufind:vufindpw@db/vufind
-      VF_config_ini__Index__url: https://index.ub.uni-leipzig.de/solr
-      VF_config_ini__Mail__host: smtp
-      VF_config_ini__Mail__port: 25
-      VF_config_ini__Mail__username: dev
-      VF_config_ini__Mail__pasword: dev
-    entrypoint: >
-      sh -c 'sh -c "exit 1";
-      while [ $$? -eq 1 ]; do nc -zv db:3306 &> /dev/null; done;
-      /docker-entrypoint $$0 $$@'
-    command: autoconfig vufind deploy
+      - ./:/usr/local/vufind:rw
     depends_on:
+      - env
       - db
+    entrypoint: ["devops/docker/autoconfig/entrypoint.sh"]
+    command: ["vufind", "deploy"]
 
 volumes:
-  npm-data: {}
+  db-data: {}
   mail-data: {}
-  mariadb-data: {}
-  composer-data: {}
 
 networks:
   default:
@@ -109,5 +105,5 @@ networks:
     ipam:
       driver: default
       config:
-        - subnet: 10.111.0.0/24
-          gateway: 10.111.0.1
+        - subnet: ${NET_MASK:-10.111}.0.0/24
+          gateway: ${NET_MASK:-10.111}.0.1
diff --git a/docker-env.0.finc.yml b/docker-env.0.finc.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b6df023b7b73792ee6ed830d6caa8d063d5a80fb
--- /dev/null
+++ b/docker-env.0.finc.yml
@@ -0,0 +1,48 @@
+# Copyright (C) 2020  Leipzig University Library
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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, see <http://www.gnu.org/licenses/>.
+#
+# @author  Sebastian Kehr <kehr@ub.uni-leipzig.de>
+# @license https://opensource.org/licenses/GPL-3.0 GNU GPLv3
+composer:
+  TINI_SUBREAPER: ''
+  COMPOSER_HOME: /usr/local/vufind/data/docker/composer
+
+php:
+  VUFIND_ENV: development
+  VUFIND_LOCAL_DIR: /usr/local/vufind/local/dev
+  VUFIND_CACHE_DIR: /usr/local/vufind/data/cache
+  XDEBUG_CONFIG: idekey=vufind
+
+db:
+  MYSQL_ROOT_PASSWORD: root
+
+grunt:
+  NODE_ENV: development
+  HOME: /usr/local/vufind/data/docker/grunt
+
+autoconfig:
+  HOME: /usr/local/vufind/data/docker/autoconfig
+  VUFIND_SITE: local
+  VUFIND_INSTANCE: dev
+  VUFIND_DB_CLIENT: '%'
+  VUFIND_DB_ADMIN_PASSWORD: root
+  VF_config_ini__Authentication__hash_passwords: true
+  VF_config_ini__Authentication__encrypt_ils_password: true
+  VF_config_ini__Database__database: mysql://vufind:vufind@db/vufind
+  VF_config_ini__Index__url: https://index.ub.uni-leipzig.de/kxp
+  VF_config_ini__Mail__host: mail
+  VF_config_ini__Mail__port: 25
+  VF_config_ini__Mail__username: dev
+  VF_config_ini__Mail__pasword: dev
diff --git a/docker-env.1.fid.yml b/docker-env.1.fid.yml
new file mode 100644
index 0000000000000000000000000000000000000000..fec82f30c267059b53155d3b84be11cd94b9c08f
--- /dev/null
+++ b/docker-env.1.fid.yml
@@ -0,0 +1,23 @@
+# Copyright (C) 2020  Leipzig University Library
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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, see <http://www.gnu.org/licenses/>.
+#
+# @author  Sebastian Kehr <kehr@ub.uni-leipzig.de>
+# @license https://opensource.org/licenses/GPL-3.0 GNU GPLv3
+
+php:
+  VUFIND_LOCAL_DIR: /usr/local/vufind/fid/dev
+
+autoconfig:
+  VUFIND_SITE: fid
diff --git a/local/languages/de.ini b/local/languages/de.ini
index 0bb569160a7e6c1a88da8718ed0f2f3006f2927e..95a328b8e6c3253ab05e02552729f28fcd2785e5 100644
--- a/local/languages/de.ini
+++ b/local/languages/de.ini
@@ -215,6 +215,7 @@ Bookmark = Lesezeichen
 Book Suggestion = "Anschaffungsvorschlag"
 Branch = Zweigstelle
 Branch to go = "Abzuholen in"
+Breadcrumbs = "Brotkrumennavigation:"
 Browse the Collection  = "Sammlung durchstöbern"
 Browse the Collection Alphabetically = "Sammlung alphabetisch durchstöbern"
 By = von
@@ -229,6 +230,7 @@ Cite this = Zitieren
 Click here to view book = Volltext
 Clock = "Uhr"
 Close = "Schließen"
+CloseModal = "Dialogfenster schließen"
 Code = Fehlercode
 Comment = "Kommentar"
 combined search (OR) = "Kombinierte Suche (OR)"
@@ -782,6 +784,7 @@ found = gefundenen
 fulltext_limit = "Eingrenzen auf Artikel mit Volltextzugriff"
 full text = "Volltextzugang prüfen"
 google_map_cluster = "Cluster"
+go_to_list = "Zur Liste"
 group_AND  = "Mit ALLEN Suchgruppen"
 group_OR   = "Mit IRGENDEINER Suchgruppe"
 history_search = Suchverlauf
@@ -837,6 +840,7 @@ lock_account_already_blocked = "Das Benutzerkonto wurde bereits gesperrt. Wenden
 lock_account_notice = "Bitte beachten Sie, dass die Sperrung des Benutzerkontos nur durch das Bibliothekspersonal aufgehoben werden kann."
 lock_account_button = "Benutzerkonto jetzt sperren"
 lock_account_error = "Es ist ein Fehler aufgetreten. Benutzerkonto konnte nicht gesperrt werden."
+mobile_toggle_navigation_text = "Menü aufklappen"
 map_results_label = "An diesem Standort:"
 maps = "Karten"
 medium_ordered_successful = "Medium erfolgreich bestellt"
@@ -1814,6 +1818,12 @@ footer_kvk = "Karlsruher Virtueller Katalog (KVK)"
 footer_dbis = "Datenbankinformationssystem (DBIS)"
 footer_nwb = "nwb-Datenbank"
 
+; Powered by alt and title tags
+vufind-logo_alt = "VuFind"
+vufind-logo_title = "Weitere Informationen in englischer Sprache finden Sie auf VuFind.org"
+finc-logo_alt = "finc"
+finc-logo_title = "Weitere Informationen zu 'finc' finden Sie in unserem finc-Blog"
+
 ; source providers
 sid_3 = "Nielsen"
 sid_51 = "VuB"
@@ -1950,4 +1960,7 @@ offcanvas-toggler-myresearch = "Seitenleiste einblenden"
 DigitalCollection  = "Digitale Kollektion"
 Digital Collection = "Digitale Kollektion"
 Visual Media = "Bildmaterial"
-ReliefPrint = Druckgraphik
\ No newline at end of file
+ReliefPrint = Druckgraphik
+
+; Accessibility
+Modal_description = "Sie befinden sich in einem Dialogfenster, das über dem Hauptinhalt der Seiten liegt. Drücken Sie die Escape-Taste oder die Schaltfläche 'Dialogfenster schließen', um das Fenster zu schließen und auf der Hauptseite weiterzuarbeiten."
\ No newline at end of file
diff --git a/local/languages/en.ini b/local/languages/en.ini
index d4dc4d5a51c424cb8e020122594fa16ccc8359e0..f5e86bf9d0352f26b4bdf387ccf2309a3e226beb 100644
--- a/local/languages/en.ini
+++ b/local/languages/en.ini
@@ -356,6 +356,7 @@ Books = Books
 Braille = Braille
 # Brazilian Portuguese = "Português (Brasil)"
 Brazilian Portuguese = "Portuguese (Brazil)"
+Breadcrumbs = "Breadcrumbs navigation:"
 Browse = Browse
 Browse the Collection  = "Browse the Collection"
 By = By
@@ -366,6 +367,7 @@ Checkedoutpermanent = "Checked Out Permanent Items"
 # Chinese = "中文(繁體)"
 Chinese = Chinese
 Clock = ""
+CloseModal = "Close dialog window"
 Code = Code
 Comments = Comments
 Contents = Contents
@@ -754,6 +756,7 @@ for search = "for Search"
 found = found
 fulltext_limit = "Limit to articles with full text available"
 google_map_cluster = "Cluster"
+go_to_list = "Open list"
 group_AND  = "ALL Groups"
 group_OR   = "ANY Groups"
 history = "Search History"
@@ -805,6 +808,7 @@ lock_account_already_blocked = "User account is already blocked. Please contact
 lock_account_notice = "Please note that the blocking of a user account can only be removed by staff."
 lock_account_button = "Block my account now"
 lock_account_error = "Error occurred. System cannot block user account."
+mobile_toggle_navigation_text = "Toggle navigation"
 map_results_label = "At this Location:"
 msg_renew_prev = "The item"
 msg_renew_middle = "has been successfully renewed till:"
@@ -1926,6 +1930,12 @@ footer_kvk = "Karlsruhe Virtual Catalog (KVK)"
 footer_dbis = "Database Information System (DBIS)"
 footer_nwb = "Database nwb"
 
+; Powered by alt and title tags
+vufind-logo_alt = "VuFind"
+vufind-logo_title = "For further informationen please visit VuFind.org"
+finc-logo_alt = "finc"
+finc-logo_title = "For further informationen in German on 'finc' please visit our finc-Blog"
+
 ; Tab to Close-text for closing FNDTN ToolTips
 Tap to close = "Tap to close"
 
@@ -2049,4 +2059,7 @@ offcanvas-toggler-myresearch = "Show sidebar"
 # format_finc
 DigitalCollection  = "Digital Collection"
 Digital Collection = "Digital Collection"
-ReliefPrint = "Printmaking"
\ No newline at end of file
+ReliefPrint = "Printmaking"
+
+; Accessibility
+Modal_description = "This is a dialog window which overlays the main content of the page. Pressing the Escape key or the Close Dialog Window button will close the modal and bring you back to where you were on the page."
\ No newline at end of file
diff --git a/module/finc/config/module.config.php b/module/finc/config/module.config.php
index ff01db2d2da08a4a6eebccb212e4f114aaa58c3f..50143c8030a678d083135b6c12c4dcea31e86b6d 100644
--- a/module/finc/config/module.config.php
+++ b/module/finc/config/module.config.php
@@ -1,44 +1,47 @@
 <?php
 namespace finc\Module\Configuration;
 
-use finc\Controller\MyResearchController;
-use finc\Controller\RecordController;
-use VuFind\Controller\AbstractBaseFactory;
-use VuFind\Controller\AbstractBaseWithConfigFactory;
-
 $config = [
     'service_manager' => [
         'factories' => [
-            'VuFind\Cache\Manager' => 'finc\Service\Factory::getCacheManager',
-            'VuFind\BranchesReader' => 'finc\Service\Factory::getBranchesReader',
-            'VuFind\ILS\Connection' => 'finc\Service\Factory::getILSConnection',
-            'VuFind\ILS\Logic\Holds' => 'finc\Service\Factory::getILSHoldLogic',
-            'finc\Rewrite' => 'finc\Rewrite\Factory',
-            'VuFind\SessionManager' => 'finc\Session\ManagerFactory',
+            'finc\Cache\Manager' => 'VuFind\Cache\ManagerFactory',
+            'finc\Config\BranchesReader' => 'VuFind\Config\YamlReaderFactory',
+            'finc\ILS\Connection' => 'VuFind\ILS\ConnectionFactory',
+            'finc\ILS\Logic\Holds' => 'VuFind\ILS\Logic\LogicFactory',
+            'finc\Rewrite\EblRewrite' => 'finc\Rewrite\EblRewriteFactory',
         ],
         'delegators' => [
             'VuFindSearch\Service' => [
                 'finc\Service\MungerInjectionDelegatorFactory'
             ],
         ],
+        'aliases' => [
+            'VuFind\Cache\Manager' => 'finc\Cache\Manager',
+            'VuFind\ILS\Connection' => 'finc\ILS\Connection',
+            'VuFind\ILS\Logic\Holds' => 'finc\ILS\Logic\Holds',
+        ]
     ],
     'controllers' => [
         'factories' => [
-            MyResearchController::class => AbstractBaseFactory::class,
-            RecordController::class => AbstractBaseWithConfigFactory::class,
-            'finc\Controller\AjaxController' => 'VuFind\Controller\AjaxControllerFactory',
-            'dds' => 'finc\Controller\Factory::getDocumentDeliveryServiceController',
-            'resources' => 'finc\Controller\Factory::getAmslResourceController'
+            'finc\Controller\MyResearchController' => 'VuFind\Controller\AbstractBaseFactory',
+            'finc\Controller\RecordController' => 'VuFind\Controller\AbstractBaseWithConfigFactory',
+            'finc\Controller\AmslResourceController' => 'finc\Controller\AmslResourceControllerFactory',
+            'finc\Controller\DocumentDeliveryServiceController' => 'finc\Controller\DocumentDeliveryServiceControllerFactory',
         ],
         'aliases' => [
-            \VuFind\Controller\MyResearchController::class => MyResearchController::class,
-            \VuFind\Controller\RecordController::class => RecordController::class,
-            'VuFind\Controller\AjaxController' => 'finc\Controller\AjaxController'
-        ]
+            'resources' => 'Resources',
+            'Resources' => 'finc\Controller\AmslResourceController',
+            'dds' => 'finc\Controller\DocumentDeliveryServiceController',
+            'VuFind\Controller\MyResearchController' => 'finc\Controller\MyResearchController',
+            'VuFind\Controller\RecordController' => 'finc\Controller\RecordController',
+        ],
     ],
     'controller_plugins' => [
         'factories' => [
-            'emailhold' => 'finc\Controller\Plugin\Factory::getEmailHold',
+            'finc\Controller\Plugin\EmailHold' => 'finc\Controller\Plugin\EmailHoldFactory',
+        ],
+        'aliases' => [
+            'emailHold' => 'finc\Controller\Plugin\EmailHold'
         ]
     ],
     'vufind' => [
@@ -67,46 +70,67 @@ $config = [
             ],
             'ils_driver' => [
                 'factories' => [
-                    'fincils' => 'finc\ILS\Driver\Factory::getFincILS',
-                    'paia' => 'finc\ILS\Driver\Factory::getPAIA',
+                    'finc\ILS\Driver\FincILS' => 'finc\ILS\Driver\Factory::getFincILS',
+                    'finc\ILS\Driver\PAIA' => 'finc\ILS\Driver\Factory::getPAIA',
                     //finctheca is deprecated: Remove when Bibliotheca support ends
-                    'finctheca' => 'finc\ILS\Driver\Factory::GetFincTheca'
+                    'finc\ILS\Driver\FincTheca' => 'finc\ILS\Driver\Factory::GetFincTheca'
+                ],
+                'aliases' => [
+                    'fincils' => 'finc\ILS\Driver\FincILS',
+                    'paia' => 'finc\ILS\Driver\PAIA',
+                    'finctheca' => 'finc\ILS\Driver\FincTheca',
                 ],
             ],
             'recommend' => [
                 'factories' => [
-                    'ebscoresults' => 'finc\Recommend\Factory::getEbscoResults'
+                    'finc\Recommend\EbscoResults' => 'finc\Recommend\Factory::getEbscoResults',
+                ],
+                'aliases' => [
+                    'ebscoresults' => 'finc\Recommend\EbscoResults',
                 ]
             ],
             'recorddriver' => [
                 'factories' => [
-                    'solrdefault' => 'finc\RecordDriver\Factory::getSolrDefault',
-                    'solrmarc' => 'finc\RecordDriver\Factory::getSolrMarc',
-                    'solrmarcfinc' => 'finc\RecordDriver\Factory::getSolrMarcFinc',
-                    'solrmarcfincpda' => 'finc\RecordDriver\Factory::getSolrMarcFincPDA',
-                    'solrmarcremote' => 'finc\RecordDriver\Factory::getSolrMarcRemote',
-                    'solrmarcremotefinc' => 'finc\RecordDriver\Factory::getSolrMarcRemoteFinc',
-                    'solrai' => 'finc\RecordDriver\Factory::getSolrAI',
-                    'solris' => 'finc\RecordDriver\Factory::getSolrIS',
-                    'solrlido' => 'finc\RecordDriver\Factory::getSolrLido',
-                    'solrlidondl' => 'finc\RecordDriver\Factory::getSolrLidoNdl',
-                    'solrdico' => 'finc\RecordDriver\Factory::getSolrDico',
-                    'solrdefaultfinc' => 'finc\RecordDriver\Factory::getSolrDefault',
+                    'finc\RecordDriver\SolrDefault' => 'finc\RecordDriver\Factory::getSolrDefault',
+                    'finc\RecordDriver\SolrMarc' => 'finc\RecordDriver\Factory::getSolrMarc',
+                    'finc\RecordDriver\SolrMarcFinc' => 'finc\RecordDriver\Factory::getSolrMarcFinc',
+                    'finc\RecordDriver\SolrMarcFincPDA' => 'finc\RecordDriver\Factory::getSolrMarcFincPDA',
+                    'finc\RecordDriver\SolrMarcRemote' => 'finc\RecordDriver\Factory::getSolrMarcRemote',
+                    'finc\RecordDriver\SolrMarcRemoteFinc' => 'finc\RecordDriver\Factory::getSolrMarcRemoteFinc',
+                    'finc\RecordDriver\SolrAI' => 'finc\RecordDriver\Factory::getSolrAI',
+                    'finc\RecordDriver\SolrIS' => 'finc\RecordDriver\Factory::getSolrIS',
+                    'finc\RecordDriver\SolrLido' => 'finc\RecordDriver\Factory::getSolrLido',
+                    'finc\RecordDriver\SolrLidoNdl' => 'finc\RecordDriver\Factory::getSolrLidoNdl',
+                    'finc\RecordDriver\SolrDico' => 'finc\RecordDriver\Factory::getSolrDico',
                 ],
                 'aliases' => [
-                    'solrdefault' => 'solrdefaultfinc',
+                    'VuFind\RecordDriver\SolrDefault' => 'finc\RecordDriver\SolrDefault',
+                    'VuFind\RecordDriver\SolrMarc' => 'finc\RecordDriver\SolrMarc',
+                    'solrmarcfinc' => 'finc\RecordDriver\SolrMarcFinc',
+                    'solrmarcfincpda' => 'finc\RecordDriver\SolrMarcFincPDA',
+                    'VuFind\RecordDriver\SolrMarcRemote' => 'finc\RecordDriver\SolrMarcRemote',
+                    'solrmarcremotefinc' => 'finc\RecordDriver\SolrMarcRemoteFinc',
+                    'solrai' => 'finc\RecordDriver\SolrAI',
+                    'solris' => 'finc\RecordDriver\SolrIS',
+                    'solrlido' => 'finc\RecordDriver\SolrLido',
+                    'solrlidondl' => 'finc\RecordDriver\SolrLidoNdl',
+                    'solrdico' => 'finc\RecordDriver\SolrDico',
                 ],
             ],
             'recordtab' => [
                 'factories' => [
-                    'VuFind\RecordTab\HierarchyTree' =>
-                        'finc\RecordTab\Factory::getHierarchyTree',
+                    'finc\RecordTab\StaffViewAI' => 'Zend\ServiceManager\Factory\InvokableFactory',
+                    'finc\RecordTab\AcquisitionPDA' => 'Zend\ServiceManager\Factory\InvokableFactory',
+                    'finc\RecordTab\Topics' => 'Zend\ServiceManager\Factory\InvokableFactory',
+                    'finc\RecordTab\DescriptionLido' => 'Zend\ServiceManager\Factory\InvokableFactory',
+                    'finc\RecordTab\HierarchyTree' => 'VuFind\RecordTab\Factory::getHierarchyTree',
                 ],
-                'invokables' => [
+                'aliases' => [
+                    'VuFind\RecordTab\HierarchyTree' => 'finc\RecordTab\HierarchyTree',
                     'staffviewai' => 'finc\RecordTab\StaffViewAI',
                     'acquisitionpda' => 'finc\RecordTab\AcquisitionPDA',
                     'topics' => 'finc\RecordTab\Topics',
-                    'descriptionlido' => 'finc\RecordTab\DescriptionLido'
+                    'descriptionlido' => 'finc\RecordTab\DescriptionLido',
                 ],
             ],
             'resolver_driver' => [
diff --git a/module/finc/src/finc/Controller/AjaxController.php b/module/finc/src/finc/Controller/AjaxController.php
deleted file mode 100644
index 476d93ef302170a910fefe09208be76509d79e7a..0000000000000000000000000000000000000000
--- a/module/finc/src/finc/Controller/AjaxController.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-/**
- * Ajax Controller Module
- *
- * PHP version 7
- *
- * Copyright (C) Villanova University 2010.
- * Copyright (C) Leipzig University Library 2019.
- *
- * 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
- * @author   Chris Hallberg <challber@villanova.edu>
- * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
- * @link     https://vufind.org/wiki/development:plugins:controllers Wiki
- */
-namespace finc\Controller;
-
-/**
- * This controller handles global AJAX functionality
- *
- * @category VuFind
- * @package  Controller
- * @author   Chris Hallberg <challber@villanova.edu>
- * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
- * @link     https://vufind.org/wiki/development:plugins:controllers Wiki
- */
-class AjaxController extends \VuFind\Controller\AjaxController
-{
-}
diff --git a/module/finc/src/finc/Controller/AmslResourceController.php b/module/finc/src/finc/Controller/AmslResourceController.php
index b0afc216c7d41368968458554f64b918a0da57f4..7d36b314fba7bd15369d33ecd536c50df30b1c3b 100644
--- a/module/finc/src/finc/Controller/AmslResourceController.php
+++ b/module/finc/src/finc/Controller/AmslResourceController.php
@@ -29,6 +29,7 @@
 namespace finc\Controller;
 
 use VuFind\Controller\AbstractBase;
+use Zend\ServiceManager\ServiceLocatorInterface;
 
 /**
  * Controller for the user account area.
@@ -62,15 +63,18 @@ class AmslResourceController extends AbstractBase
     /**
      * Constructor
      *
-     * @param \Zend\Config\Config   $config     VuFind configuration
-     * @param \VuFindHttp\HttpService   $httpClient HttpClient
+     * @param ServiceLocatorInterface $sm
+     * @param \Zend\Config\Config     $config     VuFind configuration
+     * @param \VuFindHttp\HttpService $httpClient HttpClient
      *
      * @access public
      */
     public function __construct(
+        ServiceLocatorInterface $sm,
         \Zend\Config\Config $config,
         \VuFindHttp\HttpService $httpClient
     ) {
+        parent::__construct($sm);
         $this->config = $config;
         $this->httpClient = $httpClient;
     }
diff --git a/module/finc/src/finc/Controller/AmslResourceControllerFactory.php b/module/finc/src/finc/Controller/AmslResourceControllerFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..da63025c1626e3f6c41421a7a6622356ba3f709b
--- /dev/null
+++ b/module/finc/src/finc/Controller/AmslResourceControllerFactory.php
@@ -0,0 +1,22 @@
+<?php
+namespace finc\Controller;
+
+use Psr\Container\ContainerInterface;
+use Zend\ServiceManager\ServiceLocatorInterface;
+
+class AmslResourceControllerFactory
+{
+    /**
+     * @param ContainerInterface|ServiceLocatorInterface $container
+     *
+     * @return AmslResourceController
+     */
+    public function __invoke(ContainerInterface $container)
+    {
+        return new AmslResourceController(
+            $container,
+            $container->get('VuFind\Config\PluginManager')->get('Amsl'),
+            $container->get('VuFindHttp\HttpService')
+        );
+    }
+}
\ No newline at end of file
diff --git a/module/finc/src/finc/Controller/DocumentDeliveryServiceController.php b/module/finc/src/finc/Controller/DocumentDeliveryServiceController.php
index bfb3038b6cadd30166589c3e8d4ae8440288d798..5393de813a48a1bea286c161a2db546d1390a008 100644
--- a/module/finc/src/finc/Controller/DocumentDeliveryServiceController.php
+++ b/module/finc/src/finc/Controller/DocumentDeliveryServiceController.php
@@ -32,6 +32,7 @@ use VuFind\Exception\Mail as MailException;
 use finc\Exception\DDS as DDSException;
 use finc\Mailer\Mailer as Mailer;
 use Zend\Mail\Address as Address;
+use Zend\ServiceManager\ServiceLocatorInterface;
 use Zend\Validator as Validator;
 
 /**
@@ -91,15 +92,18 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
     /**
      * Constructor
      *
-     * @param \Zend\Config\Config $config VuFind configuration
-     * @param \Zend\Config\Config $dds Document Delivery Service configuration
+     * @param ServiceLocatorInterface $sm
+     * @param \Zend\Config\Config     $config  VuFind configuration
+     * @param \Zend\Config\Config     $dds     Document Delivery Service configuration
      * @param \Zend\Session\Container $session Session container
      */
     public function __construct(
+        ServiceLocatorInterface $sm,
         \Zend\Config\Config $config,
         \Zend\Config\Config $dds,
         \Zend\Session\Container $session
     ) {
+        parent::__construct($sm);
         $this->config = array_merge($dds->toArray(), $config->toArray());
         $this->session = $session;
     }
diff --git a/module/finc/src/finc/Controller/DocumentDeliveryServiceControllerFactory.php b/module/finc/src/finc/Controller/DocumentDeliveryServiceControllerFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..a2109d1a379a853668066580f9788c1a741fca1e
--- /dev/null
+++ b/module/finc/src/finc/Controller/DocumentDeliveryServiceControllerFactory.php
@@ -0,0 +1,28 @@
+<?php
+namespace finc\Controller;
+
+use Psr\Container\ContainerInterface;
+use Zend\ServiceManager\ServiceLocatorInterface;
+use Zend\Session\Container;
+
+class DocumentDeliveryServiceControllerFactory
+{
+    /**
+     * @param ContainerInterface|ServiceLocatorInterface $container
+     *
+     * @return DocumentDeliveryServiceController
+     */
+    public function __invoke(ContainerInterface $container)
+    {
+        $session = new Container(
+            'DDS',
+            $container->get('Zend\Session\SessionManager')
+        );
+        return new DocumentDeliveryServiceController(
+            $container,
+            $container->get('VuFind\Config\PluginManager')->get('config'),
+            $container->get('VuFind\Config\PluginManager')->get('DDS'),
+            $session
+        );
+    }
+}
\ No newline at end of file
diff --git a/module/finc/src/finc/Controller/Factory.php b/module/finc/src/finc/Controller/Factory.php
deleted file mode 100644
index d245734006dba524d42e36414e542a1d3737a02a..0000000000000000000000000000000000000000
--- a/module/finc/src/finc/Controller/Factory.php
+++ /dev/null
@@ -1,137 +0,0 @@
-<?php
-/**
- * Service Factory
- *
- * PHP version 5.3
- *
- * Copyright (C) Leipzig University Library 2016.
- *
- * 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
- * @author   Demian Katz <demian.katz@villanova.edu>
- * @author   Frank Morgner <morgnerf@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;
-
-use Zend\ServiceManager\ServiceManager;
-use VuFind\Controller\Factory as FactoryBase;
-
-/**
- * Factory for various top-level VuFind services.
- *
- * @category VuFind
- * @package  Controller
- * @author   Demian Katz <demian.katz@villanova.edu>
- * @author   Frank Morgner <morgnerf@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 Factory extends FactoryBase
-{
-    /**
-     * Construct a generic controller.
-     *
-     * @param string         $name Name of table to construct (fully qualified
-     * class name, or else a class name within the current namespace)
-     * @param ServiceManager $sm   Service manager
-     *
-     * @return object
-     * @throws \Exception Cannot construct __CLASS__
-     */
-    public static function getGenericController($name, ServiceManager $sm)
-    {
-        // Prepend the current namespace unless we receive a FQCN:
-        $class = (strpos($name, '\\') === false)
-            ? static::getNamespace() . '\\' . $name : $name;
-        if (!class_exists($class)) {
-            throw new \Exception('Cannot construct ' . $class);
-        }
-        return new $class($sm->getServiceLocator());
-    }
-
-    /**
-     * Get namespace of class
-     *
-     * @return string Namespace
-     * @access private
-     */
-    private static function getNamespace()
-    {
-        return substr(
-            static::class,
-            0,
-            strrpos(static::class, '\\')
-        );
-    }
-
-
-    /**
-     * Construct the AmslResourceController.
-     *
-     * @param ServiceManager $sm Service manager.
-     *
-     * @return AmslResourceController
-     */
-    public function getAmslResourceController(ServiceManager $sm)
-    {
-        return new AmslResourceController(
-            $sm->getServiceLocator()->get('VuFind/Config')->get('Amsl'),
-            $sm->getServiceLocator()->get('VuFind/Http')
-        );
-    }
-
-
-    /**
-     * Construct the DocumentDeliveryServiceController.
-     *
-     * @param ServiceManager $sm Service manager.
-     *
-     * @return DocumentDeliveryServiceController
-     */
-    public static function getDocumentDeliveryServiceController(
-        ServiceManager $sm
-    ) {
-        $container = new \Zend\Session\Container(
-            'DDS',
-            $sm->getServiceLocator()->get('VuFind\SessionManager')
-        );
-        return new DocumentDeliveryServiceController(
-            $sm->getServiceLocator()->get('VuFind\Config')->get('config'),
-            $sm->getServiceLocator()->get('VuFind\Config')->get('DDS'),
-            $container
-        );
-    }
-
-    /**
-     * Construct the RecordController.
-     *
-     * @param ServiceManager $sm Service manager.
-     *
-     * @return RecordController
-     */
-    public static function getRecordController(ServiceManager $sm)
-    {
-        return new RecordController(
-            $sm->getServiceLocator(),
-            $sm->getServiceLocator()->get('VuFind\Config')->get('config')
-        );
-    }
-}
diff --git a/module/finc/src/finc/Controller/Plugin/Factory.php b/module/finc/src/finc/Controller/Plugin/EmailHoldFactory.php
similarity index 84%
rename from module/finc/src/finc/Controller/Plugin/Factory.php
rename to module/finc/src/finc/Controller/Plugin/EmailHoldFactory.php
index 6b0b26c33f11208d5d3e775b1e38bfd4c9caabe2..6c2401bc52a932519b79dc22be24b5365fae99ef 100644
--- a/module/finc/src/finc/Controller/Plugin/Factory.php
+++ b/module/finc/src/finc/Controller/Plugin/EmailHoldFactory.php
@@ -28,7 +28,8 @@
  */
 namespace finc\Controller\Plugin;
 
-use Zend\ServiceManager\ServiceManager;
+use Psr\Container\ContainerInterface;
+use Zend\Session\SessionManager;
 
 /**
  * Factory for controller plugins.
@@ -42,20 +43,20 @@ use Zend\ServiceManager\ServiceManager;
  *
  * @codeCoverageIgnore
  */
-class Factory
+class EmailHoldFactory
 {
     /**
      * Construct the EmailHold plugin.
      *
-     * @param ServiceManager $sm Service manager.
+     * @param ContainerInterface $container Container.
      *
      * @return EmailHold
      */
-    public static function getEmailHold(ServiceManager $sm)
+    public function __invoke(ContainerInterface $container)
     {
         return new EmailHold(
-            $sm->getServiceLocator()->get('VuFind\HMAC'),
-            $sm->getServiceLocator()->get('VuFind\SessionManager')
+            $container->get('VuFind\HMAC'),
+            $container->get(SessionManager::class)
         );
     }
 }
diff --git a/module/finc/src/finc/Controller/RecordController.php b/module/finc/src/finc/Controller/RecordController.php
index fcf7ca493e054b6f001c20053792702b334a6e8b..5e29ba1c9e7a31a61da5f519dba7a5651dd87f51 100644
--- a/module/finc/src/finc/Controller/RecordController.php
+++ b/module/finc/src/finc/Controller/RecordController.php
@@ -29,6 +29,7 @@
  */
 namespace finc\Controller;
 
+use finc\Rewrite\EblRewrite;
 use Zend\Log\LoggerAwareInterface as LoggerAwareInterface;
 
 /**
@@ -58,6 +59,6 @@ class RecordController extends \VuFind\Controller\RecordController implements
      */
     protected function getRewrite()
     {
-        return $this->serviceLocator->get('finc\Rewrite');
+        return $this->serviceLocator->get(EblRewrite::class);
     }
 }
diff --git a/module/finc/src/finc/RecordTab/Factory.php b/module/finc/src/finc/RecordTab/Factory.php
deleted file mode 100644
index 6f10997f1ec34338def12820377757aa3e62e71e..0000000000000000000000000000000000000000
--- a/module/finc/src/finc/RecordTab/Factory.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-/**
- * Record Tab Factory Class
- *
- * PHP version 5
- *
- * Copyright (C) Villanova University 2014.
- *
- * 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  RecordDrivers
- * @author   Demian Katz <demian.katz@villanova.edu>
- * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
- * @link     https://vufind.org/wiki/development:plugins:hierarchy_components Wiki
- */
-namespace finc\RecordTab;
-
-use Interop\Container\ContainerInterface;
-
-/**
- * Record Tab Factory Class
- *
- * @category VuFind
- * @package  RecordDrivers
- * @author   Demian Katz <demian.katz@villanova.edu>
- * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
- * @link     https://vufind.org/wiki/development:plugins:hierarchy_components Wiki
- *
- * @codeCoverageIgnore
- */
-class Factory
-{
-    /**
-     * Factory for HierarchyTree tab plugin.
-     *
-     * @param ContainerInterface $container Service manager.
-     *
-     * @return HierarchyTree
-     */
-    public static function getHierarchyTree(ContainerInterface $container)
-    {
-        return new HierarchyTree(
-            $container->get('VuFind\Config')->get('config')
-        );
-    }
-}
diff --git a/module/finc/src/finc/Rewrite/Factory.php b/module/finc/src/finc/Rewrite/EblRewriteFactory.php
similarity index 90%
rename from module/finc/src/finc/Rewrite/Factory.php
rename to module/finc/src/finc/Rewrite/EblRewriteFactory.php
index 3b18136411ade74c18899346becdf6c3dcb0e9c8..bd3718f87f5d7a1de689b181943257c73dfe6808 100644
--- a/module/finc/src/finc/Rewrite/Factory.php
+++ b/module/finc/src/finc/Rewrite/EblRewriteFactory.php
@@ -46,7 +46,7 @@ use Zend\ServiceManager\Factory\FactoryInterface;
  *
  * @codeCoverageIgnore
  */
-class Factory implements FactoryInterface
+class EblRewriteFactory implements FactoryInterface
 {
     /**
      * Create service
@@ -63,11 +63,11 @@ class Factory implements FactoryInterface
         array $options = null
     ) {
         // Load configurations:
-        $config = $container->get('VuFind\Config')->get('config');
-        $eblHandler = new EblRewrite($config);
-        $eblHandler->setAuthorizationService(
+        $config = $container->get('VuFind\Config\PluginManager')->get('config');
+        $rewrite = new EblRewrite($config);
+        $rewrite->setAuthorizationService(
             $container->get('ZfcRbac\Service\AuthorizationService')
         );
-        return $eblHandler;
+        return $rewrite;
     }
 }
diff --git a/module/finc/src/finc/Rewrite/PluginFactory.php b/module/finc/src/finc/Rewrite/PluginFactory.php
deleted file mode 100644
index 385cb1a66282d1d95726c94ef1d63a4d42891314..0000000000000000000000000000000000000000
--- a/module/finc/src/finc/Rewrite/PluginFactory.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-/**
- * Rewrite plugin factory
- *
- * PHP version 5
- *
- * Copyright (C) Leipzig University Library 2016.
- *
- * 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  Rewrite
- * @author   Frank Morgner <morgnerf@ub.uni-leipzig.de>
- * @author   Demian Katz <demian.katz@villanova.edu>
- * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
- * @link     https://vufind.org/wiki/development:plugins:related_records_modules Wiki
- */
-namespace finc\Rewrite;
-
-/**
- * Rewrite plugin factory
- *
- * @category VuFind
- * @package  Rewrite
- * @author   Frank Morgner <morgnerf@ub.uni-leipzig.de>
- * @author   Demian Katz <demian.katz@villanova.edu>
- * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
- * @link     https://vufind.org/wiki/development:plugins:related_records_modules Wiki
- */
-class PluginFactory extends \VuFind\ServiceManager\AbstractPluginFactory
-{
-    /**
-     * Constructor
-     */
-    public function __construct()
-    {
-        $this->defaultNamespace = 'finc\Rewrite';
-    }
-}
diff --git a/module/finc/src/finc/Service/Factory.php b/module/finc/src/finc/Service/Factory.php
deleted file mode 100644
index 08cf0434e66b791ba648250bc5aa40f5c2e46c7a..0000000000000000000000000000000000000000
--- a/module/finc/src/finc/Service/Factory.php
+++ /dev/null
@@ -1,122 +0,0 @@
-<?php
-/**
- * Factory for various top-level VuFind services.
- *
- * PHP version 5
- *
- * Copyright (C) Villanova University 2014.
- *
- * 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  Service
- * @author   Demian Katz <demian.katz@villanova.edu>
- * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
- * @link     https://vufind.org/wiki/development Wiki
- */
-namespace finc\Service;
-
-use Zend\ServiceManager\ServiceManager;
-
-/**
- * Factory for various top-level VuFind services.
- *
- * @category VuFind
- * @package  Service
- * @author   Demian Katz <demian.katz@villanova.edu>
- * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
- * @link     https://vufind.org/wiki/development Wiki
- *
- * @codeCoverageIgnore
- */
-class Factory
-{
-    /**
-     * Construct the cache manager.
-     *
-     * @param ServiceManager $sm Service manager.
-     *
-     * @return \finc\Cache\Manager
-     */
-    public static function getCacheManager(ServiceManager $sm)
-    {
-        return new \finc\Cache\Manager(
-            $sm->get('VuFind\Config')->get('config'),
-            $sm->get('VuFind\Config')->get('searches')
-        );
-    }
-
-    /**
-     * Construct the branches reader.
-     *
-     * @param ServiceManager $sm Service manager.
-     *
-     * @return \finc\Config\BranchesReader
-     */
-    public static function getBranchesReader(ServiceManager $sm)
-    {
-        return new \finc\Config\BranchesReader(
-            $sm->get('VuFind\CacheManager')
-        );
-    }
-
-    /**
-     * Construct the ILS connection.
-     *
-     * @param ServiceManager $sm Service manager.
-     *
-     * @return \VuFind\ILS\Connection
-     */
-    public static function getILSConnection(ServiceManager $sm)
-    {
-        $catalog = new \finc\ILS\Connection(
-            $sm->get('VuFind\Config')->get('config')->Catalog,
-            $sm->get('VuFind\ILSDriverPluginManager'),
-            $sm->get('VuFind\Config')
-        );
-        return $catalog->setHoldConfig($sm->get('VuFind\ILSHoldSettings'));
-    }
-
-    /**
-     * Construct the ILS hold logic.
-     *
-     * @param ServiceManager $sm Service manager.
-     *
-     * @return \VuFind\ILS\Logic\Holds
-     */
-    public static function getILSHoldLogic(ServiceManager $sm)
-    {
-        return new \finc\ILS\Logic\Holds(
-            $sm->get('VuFind\ILSAuthenticator'),
-            $sm->get('VuFind\ILSConnection'),
-            $sm->get('VuFind\HMAC'),
-            $sm->get('VuFind\Config')->get('config')
-        );
-    }
-
-    /**
-     * Construct the export helper.
-     *
-     * @param ServiceManager $sm Service manager.
-     *
-     * @return \VuFind\Export
-     */
-    public static function getExport(ServiceManager $sm)
-    {
-        return new \finc\Export(
-            $sm->get('VuFind\Config')->get('config'),
-            $sm->get('VuFind\Config')->get('export')
-        );
-    }
-}
diff --git a/module/finc/src/finc/Session/ManagerFactory.php b/module/finc/src/finc/Session/ManagerFactory.php
deleted file mode 100644
index 6828c43252ae19c04d2a17d618fc7bc3f621cec2..0000000000000000000000000000000000000000
--- a/module/finc/src/finc/Session/ManagerFactory.php
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-/**
- * Factory for instantiating Session Manager
- *
- * PHP version 5
- *
- * Copyright (C) Villanova University 2016.
- *
- * 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  Session_Handlers
- * @author   Demian Katz <demian.katz@villanova.edu>
- * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
- * @link     https://vufind.org/wiki/development Wiki
- */
-namespace finc\Session;
-
-use Zend\ServiceManager\ServiceLocatorInterface;
-
-/**
- * Factory for instantiating Session Manager
- *
- * @category VuFind
- * @package  Session_Handlers
- * @author   Demian Katz <demian.katz@villanova.edu>
- * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
- * @link     https://vufind.org/wiki/development Wiki
- *
- * @codeCoverageIgnore
- */
-class ManagerFactory extends \VuFind\Session\ManagerFactory
-{
-    /**
-     * Build the options array.
-     *
-     * @param ServiceLocatorInterface $sm Service manager
-     *
-     * @return array
-     */
-    protected function getOptions(ServiceLocatorInterface $sm)
-    {
-        $cookieManager = $sm->get('VuFind\CookieManager');
-        $options = [
-            'cookie_path' => $cookieManager->getPath(),
-            'cookie_secure' => $cookieManager->isSecure()
-        ];
-
-        $domain = $cookieManager->getDomain();
-        if (!empty($domain)) {
-            $options['cookie_domain'] = $domain;
-        }
-
-        $name = $cookieManager->getSessionName();
-        if (!empty($name)) {
-            $options['name'] = $name;
-        }
-
-        return $options;
-    }
-}
diff --git a/module/finc/src/finc/View/Helper/Root/BranchInfo.php b/module/finc/src/finc/View/Helper/Root/BranchInfo.php
index 433c1d729a660b8023068b8b21ff31be6c00ff2f..ef3da92196c75fd54236bfd69d905843da403da2 100644
--- a/module/finc/src/finc/View/Helper/Root/BranchInfo.php
+++ b/module/finc/src/finc/View/Helper/Root/BranchInfo.php
@@ -27,6 +27,7 @@
  */
 namespace finc\View\Helper\Root;
 
+use finc\Config\BranchesReader;
 use Zend\View\Helper\AbstractHelper;
 use Zend\ServiceManager\ServiceLocatorInterface;
 
@@ -72,7 +73,7 @@ class BranchInfo extends AbstractHelper
      */
     protected function loadBranches()
     {
-        return $this->serviceLocator->get('VuFind\BranchesReader')
+        return $this->serviceLocator->get(BranchesReader::class)
           ->get('branches.yaml');
     }
 
diff --git a/module/finc/src/finc/View/Helper/Root/Factory.php b/module/finc/src/finc/View/Helper/Root/Factory.php
index 81d0c40a62f41c908d441dcedf78dc08a8df9b90..b9f0bcca3d5acf8b1c4591c5d25be7ae903380f4 100644
--- a/module/finc/src/finc/View/Helper/Root/Factory.php
+++ b/module/finc/src/finc/View/Helper/Root/Factory.php
@@ -27,6 +27,7 @@
  */
 namespace finc\View\Helper\Root;
 
+use finc\Rewrite\EblRewrite;
 use Interop\Container\ContainerInterface;
 
 /**
@@ -70,7 +71,7 @@ class Factory
             $container->get('VuFind\Config')->get('config'),
             $container->get('ViewHelperManager')->get('url'),
             $container->get('VuFind\AuthManager'),
-            $container->get('finc\Rewrite'),
+            $container->get(EblRewrite::class),
             $container->get('VuFind\Config')->get('Resolver')
         );
 
diff --git a/module/finc/src/finc/View/Helper/Root/Record.php b/module/finc/src/finc/View/Helper/Root/Record.php
index 0a1befaef0915df16df1b185eafe757a933f6e3a..8a17f4c951f38ba8fcdcf30feef9d9ca3c31ebb0 100644
--- a/module/finc/src/finc/View/Helper/Root/Record.php
+++ b/module/finc/src/finc/View/Helper/Root/Record.php
@@ -27,7 +27,7 @@
  */
 namespace finc\View\Helper\Root;
 
-use finc\Rewrite;
+use finc\Rewrite\EblRewrite;
 use Symfony\Component\Config\Definition\Exception\Exception;
 
 /**
@@ -65,7 +65,7 @@ class Record extends \VuFind\View\Helper\Root\Record
     /**
      * Rewriter
      *
-     * @var \finc\Rewrite $rewrite
+     * @var EblRewrite $rewrite
      */
     protected $rewrite;
 
diff --git a/tests/finc/.php_cs b/tests/finc/.php_cs
deleted file mode 100644
index 2c82e17e1cf92a14c716999c5a501ec5eba06f19..0000000000000000000000000000000000000000
--- a/tests/finc/.php_cs
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-$baseDir = realpath(__DIR__ . '/../../');
-$finder = PhpCsFixer\Finder::create()->in("$baseDir/module/finc/src");
-$cacheDir = "$baseDir/data/cache/.php_cs_cache";
-
-if (!is_dir($cacheDir)) {
-    mkdir($cacheDir);
-}
-
-return PhpCsFixer\Config::create()
-    ->setCacheFile("$cacheDir/.code.cache")
-    ->setRiskyAllowed(true)
-    ->setRules(['@PSR2' => true])
-    ->setFinder($finder);
diff --git a/tests/finc/phpcs.xml b/tests/finc/phpcs.xml
deleted file mode 100644
index 59d7e42200f68f59613d2ed58c30bb4772bfbed0..0000000000000000000000000000000000000000
--- a/tests/finc/phpcs.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0"?>
-<ruleset name="finc cs ruleset" namespace="finc\PHPCS">
-    <description>finc coding standards.</description>
-    <file>../../module/finc/src/</file>
-    <arg name="extensions" value="php"/>
-    <rule ref="PSR2" />
-    <rule ref="PEAR.Commenting.ClassComment" />
-    <rule ref="PEAR.Commenting.FileComment" />
-    <rule ref="Squiz.Commenting.FunctionComment.Missing"/>
-    <rule ref="Squiz.Commenting.FunctionComment.MissingParamTag"/>
-    <rule ref="Squiz.Commenting.FunctionComment.MissingParamName"/>
-    <rule ref="Squiz.Commenting.FunctionComment.ParamNameNoMatch"/>
-    <rule ref="Squiz.Commenting.FunctionComment.IncorrectTypeHint"/>
-    <rule ref="Squiz.Commenting.FunctionComment.MissingReturn"/>
-</ruleset>
diff --git a/themes/finc/js/advanced_search.js b/themes/finc/js/advanced_search.js
new file mode 100644
index 0000000000000000000000000000000000000000..680f784c37c8ebd3fbcf6d74ac013c18114ed969
--- /dev/null
+++ b/themes/finc/js/advanced_search.js
@@ -0,0 +1,132 @@
+/*exported addGroup, addSearch, deleteGroup, deleteSearch, TEMPORARY BARF CK */
+var nextGroup = 0;
+var groupLength = [];
+
+function addSearch(group, _fieldValues) {
+  var fieldValues = _fieldValues || {};
+  // Build the new search
+  var inputID = group + '_' + groupLength[group];
+  var $newSearch = $($('#new_search_template').html());
+
+  $newSearch.attr('id', 'search' + inputID);
+  $newSearch.find('input.form-control')
+    .attr('id', 'search_lookfor' + inputID)
+    .attr('name', 'lookfor' + group + '[]')
+    .val('');
+  $newSearch.find('select.adv-term-type option:first-child').attr('selected', 1);
+  $newSearch.find('select.adv-term-type')
+    .attr('id', 'search_type' + inputID)
+    .attr('name', 'type' + group + '[]');
+  $newSearch.find('.adv-term-remove')
+    .attr('onClick', 'return deleteSearch(' + group + ',' + groupLength[group] + ')');
+  // Preset Values
+  if (typeof fieldValues.term !== "undefined") {
+    $newSearch.find('input.form-control').val(fieldValues.term);
+  }
+  if (typeof fieldValues.field !== "undefined") {
+    $newSearch.find('select.adv-term-type option[value="' + fieldValues.field + '"]').attr('selected', 1);
+  }
+  if (typeof fieldValues.op !== "undefined") {
+    $newSearch.find('select.adv-term-op option[value="' + fieldValues.op + '"]').attr('selected', 1);
+  }
+  // Insert it
+  $("#group" + group + "Holder").before($newSearch);
+  // Individual search ops (for searches like EDS)
+  if (groupLength[group] === 0) {
+    $newSearch.find('.first-op')
+      .attr('name', 'op' + group + '[]')
+      .removeClass('hidden');
+    $newSearch.find('select.adv-term-op').remove();
+  } else {
+    $newSearch.find('select.adv-term-op')
+      .attr('id', 'search_op' + group + '_' + groupLength[group])
+      .attr('name', 'op' + group + '[]')
+      .removeClass('hidden');
+    $newSearch.find('.first-op').remove();
+    $newSearch.find('label').remove();
+    // Show x if we have more than one search inputs
+    $('#group' + group + ' .adv-term-remove').removeClass('hidden');
+  }
+  groupLength[group]++;
+  return false;
+}
+
+function deleteSearch(group, sindex) {
+  for (var i = sindex; i < groupLength[group] - 1; i++) {
+    var $search0 = $('#search' + group + '_' + i);
+    var $search1 = $('#search' + group + '_' + (i + 1));
+    $search0.find('input').val($search1.find('input').val());
+    var select0 = $search0.find('select')[0];
+    var select1 = $search1.find('select')[0];
+    select0.selectedIndex = select1.selectedIndex;
+  }
+  if (groupLength[group] > 1) {
+    groupLength[group]--;
+    $('#search' + group + '_' + groupLength[group]).remove();
+    if (groupLength[group] === 1) {
+      $('#group' + group + ' .adv-term-remove').addClass('hidden'); // Hide x
+    }
+  }
+  return false;
+}
+
+function addGroup(_firstTerm, _firstField, _join) {
+  var firstTerm = _firstTerm || '';
+  var firstField = _firstField || '';
+  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')
+    .removeClass('hidden');
+  $newGroup.find('.add_search_link')
+    .attr('id', 'add_search_link_' + nextGroup)
+    .attr('onClick', 'return addSearch(' + nextGroup + ')')
+    .removeClass('hidden');
+  $newGroup.find('.adv-group-close')
+    .attr('onClick', 'return deleteGroup(' + nextGroup + ')');
+  $newGroup.find('select.form-control')
+    .attr('id', 'search_bool' + nextGroup)
+    .attr('name', 'bool' + nextGroup + '[]');
+  $newGroup.find('.search_bool')
+    .attr('for', 'search_bool' + nextGroup);
+  if (join.length > 0) {
+    $newGroup.find('option[value="' + join + '"]').attr('selected', 1);
+  }
+  // Insert
+  $('#groupPlaceHolder').before($newGroup);
+  // Populate
+  groupLength[nextGroup] = 0;
+  addSearch(nextGroup, {term: firstTerm, field: firstField});
+  // Show join menu
+  if (nextGroup > 0) {
+    $('#groupJoin').removeClass('hidden');
+    // Show x
+    $('.adv-group-close').removeClass('hidden');
+  }
+  return nextGroup++;
+}
+
+function deleteGroup(group) {
+  // Find the group and remove it
+  $("#group" + group).remove();
+  // If the last group was removed, add an empty group
+  if ($('.adv-group').length === 0) {
+    addGroup();
+  } else if ($('#advSearchForm .adv-group').length === 1) {
+    $('#groupJoin').addClass('hidden'); // Hide join menu
+    $('.adv-group .adv-group-close').addClass('hidden'); // Hide x
+  }
+  return false;
+}
+
+$(document).ready(function advSearchReady() {
+  $('.clear-btn').click(function clearBtnClick() {
+    $('input[type="text"]').val('');
+    $("option:selected").removeAttr("selected");
+    $("#illustrated_-1").click();
+  });
+});
diff --git a/themes/finc/js/lightbox.js b/themes/finc/js/lightbox.js
new file mode 100644
index 0000000000000000000000000000000000000000..6f537a5445e5074be61ad0a0fd16a85171e93084
--- /dev/null
+++ b/themes/finc/js/lightbox.js
@@ -0,0 +1,433 @@
+/*global recaptchaOnLoad, resetCaptcha, VuFind, TEMPORARY BARF CK*/
+VuFind.register('lightbox', function Lightbox() {
+  // State
+  var _originalUrl = false;
+  var _currentUrl = false;
+  var _lightboxTitle = false;
+  var refreshOnClose = false;
+  var _modalParams = {};
+  // Elements
+  var _modal, _modalBody, _modalTitle, _clickedButton = null;
+  // Utilities
+  function _storeClickedStatus() {
+    _clickedButton = this;
+  }
+  function _html(content) {
+    _modalBody.html(content);
+    // Set or update title if we have one
+    if (_lightboxTitle) {
+      _modalTitle.text(_lightboxTitle);
+      _lightboxTitle = false;
+    }
+    _modal.modal('handleUpdate');
+  }
+  function _emit(msg, _details) {
+    var details = _details || {};
+    var event;
+    try {
+      event = new CustomEvent(msg, {
+        detail: details,
+        bubbles: true,
+        cancelable: true
+      });
+    } catch (e) {
+      // Fallback to document.createEvent() if creating a new CustomEvent fails (e.g. IE 11)
+      event = document.createEvent('CustomEvent');
+      event.initCustomEvent(msg, true, true, details);
+    }
+    return document.dispatchEvent(event);
+  }
+
+  // Public: Present an alert
+  function showAlert(message, _type) {
+    var type = _type || 'info';
+    _html('<div class="flash-message alert alert-' + type + '">' + message + '</div>'
+        + '<button class="btn btn-default" data-dismiss="modal">' + VuFind.translate('close') + '</button>');
+    _modal.modal('show');
+  }
+  function flashMessage(message, _type) {
+    var type = _type || 'info';
+    _modalBody.find('.flash-message,.fa.fa-spinner').remove();
+    _modalBody.find('h2:first-of-type')
+      .after('<div class="flash-message alert alert-' + type + '">' + message + '</div>');
+  }
+  function close() {
+    _modal.modal('hide');
+  }
+
+  /**
+   * Update content
+   *
+   * Form data options:
+   *
+   * data-lightbox-ignore = do not submit this form in lightbox
+   */
+  // function declarations to avoid style warnings about circular references
+  var _constrainLink;
+  var _formSubmit;
+  function render(content) {
+    if (typeof content !== "string") {
+      return;
+    }
+    // Isolate successes
+    var htmlDiv = $('<div/>').html(content);
+    var alerts = htmlDiv.find('.flash-message.alert-success:not([data-lightbox-ignore])');
+    if (alerts.length > 0) {
+      var msgs = alerts.toArray().map(function getSuccessHtml(el) {
+        return el.innerHTML;
+      }).join('<br/>');
+      var href = alerts.find('.download').attr('href');
+      if (typeof href !== 'undefined') {
+        location.href = href;
+        close();
+      } else {
+        showAlert(msgs, 'success');
+      }
+      return;
+    }
+    // Deframe HTML
+    var finalHTML = content;
+    if (content.match('<!DOCTYPE html>')) {
+      finalHTML = htmlDiv.find('.main > .container').html();
+    }
+    // Fill HTML
+    _html(finalHTML);
+    VuFind.modal('show');
+    // Attach capturing events
+    _modalBody.find('a').click(_constrainLink);
+    // Handle submit buttons attached to a form as well as those in a form. Store
+    // information about which button was clicked here as checking focused button
+    // doesn't work on all browsers and platforms.
+    _modalBody.find('[type=submit]').click(_storeClickedStatus);
+
+    var forms = _modalBody.find('form:not([data-lightbox-ignore])');
+    for (var i = 0; i < forms.length; i++) {
+      $(forms[i]).on('submit', _formSubmit);
+    }
+    // Select all checkboxes
+    $('#modal').find('.checkbox-select-all').change(function lbSelectAllCheckboxes() {
+      $(this).closest('.modal-body').find('.checkbox-select-item').prop('checked', this.checked);
+    });
+    $('#modal').find('.checkbox-select-item').change(function lbSelectAllDisable() {
+      $(this).closest('.modal-body').find('.checkbox-select-all').prop('checked', false);
+    });
+    // Recaptcha
+    recaptchaOnLoad();
+  }
+
+  var _xhr = false;
+  // Public: Handle AJAX in the Lightbox
+  function ajax(obj) {
+    if (_xhr !== false) {
+      return;
+    }
+    if (_originalUrl === false) {
+      _originalUrl = obj.url;
+    }
+    // Add lightbox GET parameter
+    if (!obj.url.match(/layout=lightbox/)) {
+      var parts = obj.url.split('#');
+      obj.url = parts[0].indexOf('?') < 0
+        ? parts[0] + '?'
+        : parts[0] + '&';
+      obj.url += 'layout=lightbox';
+      if (_currentUrl) {
+        obj.url += '&lbreferer=' + encodeURIComponent(_currentUrl);
+      }
+      obj.url += parts.length < 2 ? '' : '#' + parts[1];
+    }
+    _xhr = $.ajax(obj);
+    _xhr.always(function lbAjaxAlways() { _xhr = false; })
+      .done(function lbAjaxDone(content, status, jq_xhr) {
+        var errorMsgs = [];
+        var flashMessages = [];
+        if (jq_xhr.status === 204) {
+          // No content, close lightbox
+          close();
+          return;
+        } else if (jq_xhr.status !== 205) {
+          var testDiv = $('<div/>').html(content);
+          errorMsgs = testDiv.find('.flash-message.alert-danger:not([data-lightbox-ignore])');
+          flashMessages = testDiv.find('.flash-message:not([data-lightbox-ignore])');
+          // Place Hold error isolation
+          if (obj.url.match(/\/Record\/.*(Hold|Request)\?/)) {
+            if (errorMsgs.length && testDiv.find('.record').length) {
+              var msgs = errorMsgs.toArray().map(function getAlertHtml(el) {
+                return el.innerHTML;
+              }).join('<br/>');
+              showAlert(msgs, 'danger');
+              return false;
+            }
+          }
+        }
+        // Close the lightbox after deliberate login provided that:
+        // - is a form
+        // - catalog login for holds
+        // - or that matches login/create account
+        // - not a failed login
+        if (
+          obj.method && (
+            obj.url.match(/catalogLogin/)
+            || obj.url.match(/MyResearch\/(?!Bulk|Delete|Recover)/)
+          ) && flashMessages.length === 0
+        ) {
+
+          var eventResult = _emit('VuFind.lightbox.login', {
+            originalUrl: _originalUrl,
+            formUrl: obj.url
+          });
+          if (_originalUrl.match(/UserLogin/) || obj.url.match(/catalogLogin/)) {
+            if (eventResult) {
+              VuFind.refreshPage();
+            }
+            return false;
+          } else {
+            VuFind.lightbox.refreshOnClose = true;
+          }
+          _currentUrl = _originalUrl; // Now that we're logged in, where were we?
+        }
+        if (jq_xhr.status === 205) {
+          VuFind.refreshPage();
+          return;
+        }
+        render(content);
+      })
+      .fail(function lbAjaxFail(deferred, errorType, msg) {
+        showAlert(VuFind.translate('error_occurred') + '<br/>' + msg, 'danger');
+      });
+    return _xhr;
+  }
+  function reload() {
+    ajax({ url: _currentUrl || _originalUrl });
+  }
+
+  /**
+   * Evaluate a callback
+   */
+  function _evalCallback(callback, event, data) {
+    if ('function' === typeof window[callback]) {
+      return window[callback](event, data);
+    }
+    var parts = callback.split('.');
+    if (typeof window[parts[0]] === 'object') {
+      var obj = window[parts[0]];
+      for (var i = 1; i < parts.length; i++) {
+        if (typeof obj[parts[i]] === 'undefined') {
+          obj = false;
+          break;
+        }
+        obj = obj[parts[i]];
+      }
+      if ('function' === typeof obj) {
+        return obj(event, data);
+      }
+    }
+    console.error('Lightbox callback function not found.');
+    return null;
+  }
+
+  /**
+   * Modal link data options
+   *
+   * data-lightbox-href = go to this url instead
+   * data-lightbox-ignore = do not open this link in lightbox
+   * data-lightbox-post = post data
+   * data-lightbox-title = Lightbox title (overrides any title the page provides)
+   */
+  _constrainLink = function constrainLink(event) {
+    var $link = $(this);
+    if (typeof $link.data("lightboxIgnore") != "undefined"
+      || typeof $link.attr("href") === "undefined"
+      || $link.attr("href").charAt(0) === "#"
+      || $link.attr("href").match(/^[a-zA-Z]+:[^/]/) // ignore resource identifiers (mailto:, tel:, etc.)
+      || (typeof $link.attr("target") !== "undefined"
+        && (
+          $link.attr("target").toLowerCase() === "_new"
+          || $link.attr("target").toLowerCase() === "new"
+        ))
+    ) {
+      return true;
+    }
+    if (this.href.length > 1) {
+      event.preventDefault();
+      var obj = {url: $(this).data('lightboxHref') || this.href};
+      if ("string" === typeof $(this).data('lightboxPost')) {
+        obj.type = 'POST';
+        obj.data = $(this).data('lightboxPost');
+      }
+      _lightboxTitle = $(this).data('lightbox-title');
+      _modalParams = $(this).data();
+      VuFind.modal('show');
+      ajax(obj);
+      _currentUrl = this.href;
+      return false;
+    }
+  };
+
+  /**
+   * Handle form submission.
+   *
+   * Form data options:
+   *
+   * data-lightbox-onsubmit = on submit, run named function
+   * data-lightbox-onclose  = on close, run named function
+   * data-lightbox-title = Lightbox title (overrides any title the page provides)
+   *
+   * Submit button data options:
+   *
+   * data-lightbox-ignore = do not handle clicking this button in lightbox
+   */
+  _formSubmit = function formSubmit(event) {
+    // Gather data
+    var form = event.target;
+    var data = $(form).serializeArray();
+    // Force layout
+    data.push({ name: 'layout', value: 'lightbox' }); // Return in lightbox, please
+    // Add submit button information
+    var submit = $(_clickedButton);
+    _clickedButton = null;
+    var buttonData = { name: 'submit', value: 1 };
+    if (submit.length > 0) {
+      if (typeof submit.data('lightbox-close') !== 'undefined') {
+        close();
+        return false;
+      }
+      if (typeof submit.data('lightbox-ignore') !== 'undefined') {
+        return true;
+      }
+      buttonData.name = submit.attr('name') || 'submit';
+      buttonData.value = submit.attr('value') || 1;
+    }
+    data.push(buttonData);
+    // Special handlers
+    // On submit behavior
+    if ('string' === typeof $(form).data('lightboxOnsubmit')) {
+      var ret = _evalCallback($(form).data('lightboxOnsubmit'), event, data);
+      // return true or false to send that to the form
+      // return null or anything else to continue to the ajax
+      if (ret === false || ret === true) {
+        return ret;
+      }
+    }
+    // onclose behavior
+    if ('string' === typeof $(form).data('lightboxOnclose')) {
+      document.addEventListener('VuFind.lightbox.closed', function lightboxClosed(e) {
+        this.removeEventListener('VuFind.lightbox.closed', arguments.callee);
+        _evalCallback($(form).data('lightboxOnclose'), e, form);
+      }, false);
+    }
+    // Loading
+    _modalBody.prepend('<i class="modal-loading fa fa-spinner fa-spin" title="' + VuFind.translate('loading') + '"></i>');
+    // Prevent multiple submission of submit button in lightbox
+    if (submit.closest(_modal).length > 0) {
+      submit.attr('disabled', 'disabled');
+    }
+    // Store custom title
+    _lightboxTitle = submit.data('lightboxTitle') || $(form).data('lightboxTitle') || '';
+    // Get Lightbox content
+    ajax({
+      url: $(form).attr('action') || _currentUrl,
+      method: $(form).attr('method') || 'GET',
+      data: data
+    }).done(function recaptchaReset() {
+      resetCaptcha($(form));
+    });
+
+    VuFind.modal('show');
+    return false;
+  };
+
+  // Public: Attach listeners to the page
+  function bind(el) {
+    var target = el || document;
+    $(target).find('a[data-lightbox]')
+      .unbind('click', _constrainLink)
+      .on('click', _constrainLink);
+    $(target).find('form[data-lightbox]')
+      .unbind('submit', _formSubmit)
+      .on('submit', _formSubmit);
+
+    // Handle submit buttons attached to a form as well as those in a form. Store
+    // information about which button was clicked here as checking focused button
+    // doesn't work on all browsers and platforms.
+    $('form[data-lightbox]').each(function bindFormSubmitsLightbox(i, form) {
+      $(form).find('[type=submit]').click(_storeClickedStatus);
+      $('[type="submit"][form="' + form.id + '"]').click(_storeClickedStatus);
+    });
+
+    // Display images in the lightbox
+    $('[data-lightbox-image]', el).each(function lightboxOpenImage(i, link) {
+      $(link).unbind("click", _constrainLink);
+      $(link).bind("click", function lightboxImageRender(event) {
+        event.preventDefault();
+        var url = link.dataset.lightboxHref || link.href || link.src;
+        var imageCheck = $.ajax({
+          url: url,
+          method: "HEAD"
+        });
+        imageCheck.done(function lightboxImageCheckDone(content, status, jq_xhr) {
+          if (
+            jq_xhr.status === 200 && 
+            jq_xhr.getResponseHeader("content-type").substr(0, 5) === "image"
+          ) {
+            render('<div class="lightbox-image"><img src="' + url + '"/></div>');
+          } else {
+            location.href = url;
+          }
+        });
+      });
+    });
+  }
+
+  function reset() {
+    _html(VuFind.translate('loading') + '...');
+    _originalUrl = false;
+    _currentUrl = false;
+    _lightboxTitle = '';
+    _modalParams = {};
+  }
+  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();
+      }
+      this.setAttribute('aria-hidden', true);
+      _emit('VuFind.lightbox.closing');
+    });
+    _modal.on('hidden.bs.modal', function lightboxHidden() {
+      VuFind.lightbox.reset();
+      _emit('VuFind.lightbox.closed');
+    });
+
+    VuFind.modal = function modalShortcut(cmd) {
+      if (cmd === 'show') {
+        _modal.modal($.extend({ show: true }, _modalParams)).attr('aria-hidden', false);
+      } else {
+        _modal.modal(cmd);
+      }
+    };
+    bind();
+  }
+
+  // Reveal
+  return {
+    // Properties
+    refreshOnClose: refreshOnClose,
+
+    // Methods
+    ajax: ajax,
+    alert: showAlert,
+    bind: bind,
+    close: close,
+    flashMessage: flashMessage,
+    reload: reload,
+    render: render,
+    // Reset
+    reset: reset,
+    // Init
+    init: init
+  };
+});
diff --git a/themes/finc/scss/_customMixins.scss b/themes/finc/scss/_customMixins.scss
index f37f52d777ae99c993725905f58226dfd0b5e6d5..7c63e37e128d240d51a29b0a7d8e115c8f2962ec 100644
--- a/themes/finc/scss/_customMixins.scss
+++ b/themes/finc/scss/_customMixins.scss
@@ -1,3 +1,5 @@
+// For Default border style see Variables: $border-default-styles
+
 // Right-hand border on Sidebar? Only activate when border butts right border, leave commented out for standard border
 @mixin right-border-on-sidebar($border-right-width) {
   border-right-width: $border-right-width;
@@ -19,3 +21,15 @@
   display: table;
   margin: 1.5em auto;
 }
+
+// sr-only mixin: use to show items to screen readers only without having to add sr-only class
+@mixin sr-only {
+  border: 0;
+  clip: rect(1px, 1px, 1px, 1px);
+  height: auto;
+  margin: 0;
+  overflow: hidden;
+  padding: 0;
+  position: absolute;
+  width: auto;
+}
\ No newline at end of file
diff --git a/themes/finc/scss/_customVariables.scss b/themes/finc/scss/_customVariables.scss
index 10b824ffaa5b9b4009d8a59ddca5eb403e22599e..11cffafb1eddb9306ba7172f0586547dc7e8f108 100644
--- a/themes/finc/scss/_customVariables.scss
+++ b/themes/finc/scss/_customVariables.scss
@@ -2,7 +2,7 @@
 
 // FONTS
 //// Base font size
-$font-size-base: 14px !default;
+$font-size-base: 16px !default;
 //// We use these to define default font stacks
 $font-family-sans-serif: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif !default;
 $font-family-serif: Georgia, Cambria, 'Times New Roman', Times, serif !default;
@@ -83,6 +83,10 @@ $state-danger-bg: $brand-danger !default;
 //// FORM ELEMENTS
 $select-bg-color: $ghost !default;
 
+////// Inputs with labels -- top margin for better alignment
+$inputs-top-margin: .2rem;
+
+
 //// BORDERS
 $border-color: $iron !default;
 ////// Note that the nav-tabs have a different border color, use the following variable in your SCSS to change it
@@ -90,6 +94,7 @@ $border-color: $iron !default;
 
 // Default border styles
 $border-default-styles: 1px solid $border-color !default;
+$border-default-white: 1px solid $white !default;
 
 // Width and position of Sidebar border (see customMixins.scss) -- change to "0" and "-15px" only for sidebar on the right, butting on right border
 $border-right-width: 1px !default;
@@ -176,6 +181,9 @@ $navbar-height-sm: $navbar-height !default;
 $navbar-height-xs: $navbar-height + 40px !default;
 $navbar-max-height-xs: $navbar-height + 40px !default;
 
+//// Navigation elements default height: This height must be adapted to the button height, which changes with default font size; apply to navigation elements such as select dropdowns
+$navigation-element-default-height: 38px;
+
 //// Top-padding for #content -> .row first-of-type (and .sidebar) - change this value to change both;
 //// sidebar gets an additional padding on half the content-top-padding for better horizontal alignment
 $content-top-padding: $grid-gutter-width / 2 !default;
diff --git a/themes/finc/scss/compiled.scss b/themes/finc/scss/compiled.scss
index 136fdd8592812218acac8984cd008723dc3d395d..85d114abe0743925933f921704fbbd70c89336c4 100644
--- a/themes/finc/scss/compiled.scss
+++ b/themes/finc/scss/compiled.scss
@@ -80,6 +80,11 @@ body {
   // for mobile
   padding-top: $navbar-height-xs;
 
+  // make xception for adv. search home
+  &.template-name-advanced {
+    padding-top: 3.25rem;
+  }
+
   // for tablet
   @media (min-width: $screen-sm-min) {
     padding-top: $navbar-height-sm;
@@ -121,9 +126,38 @@ h3 {
 }
 
 //// h1
+h1 {
+  font-size: 2rem;
+}
+
 //// h2
+h2 {
+  font-size: 1.75rem;
+
+  .sidebar & {
+    font-size: 1.5rem;
+
+    @media only screen and (max-width: $screen-xs-max) {
+      margin-left: $grid-gutter-width / 2;
+    }
+
+    @media only screen and (max-width: $screen-sm-max) {
+      font-size: 1.25rem;
+      margin-top: 1.75rem;
+    }
+  }
+}
+
 //// h3
+h3 {
+  font-size: 1.5rem;
+}
+
 //// h4
+h4 {
+  font-size: 1.25rem;
+}
+
 ////// H4 atop Sidebar - align to limit and sort
 .sidebar h4 {
   margin-top: 0;
@@ -266,6 +300,11 @@ legend {
 }
 
 //// input {}
+input[type='radio'],
+input[type='checkbox'] {
+  margin-top: $inputs-top-margin;
+}
+
 input[type='email'] {
   border: $border-default-styles;
   padding: ($grid-gutter-width / 4);
@@ -274,10 +313,14 @@ input[type='email'] {
 input[type='text'] {
   border: $border-default-styles;
   padding: ($grid-gutter-width / 4);
+
+  header,
+  #searchForm & {
+    border: $border-default-white;
+  }
 }
 
 // red-bordered input field, when empty, requires "form" for specifity, CK
-
 form {
   // create enough space for red border
   input:invalid,
@@ -301,6 +344,10 @@ form {
   }
 }
 
+.form-control {
+  box-shadow: none;
+}
+
 //// Select - for limit and sort-select widths see below
 ////// remove browser styles on select boxes and add custom styles (below)
 select,
@@ -312,17 +359,19 @@ select.form-control {
   background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgeD0iMTJweCIgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIzcHgiIHZpZXdCb3g9IjAgMCA2IDMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYgMyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBvbHlnb24gcG9pbnRzPSI1Ljk5MiwwIDIuOTkyLDMgLTAuMDA4LDAgIi8+PC9zdmc+);
   background-position: 100% center;
   background-repeat: no-repeat;
-  border-color: $gainsboro;
   border-radius: 0;
-  border-style: solid;
-  border-width: 1px;
-  height: 2.5em;
+  border: $border-default-styles;
+  height: $navigation-element-default-height;
   min-width: 5em;
   padding: .25em .75em .25em .5em;
 
   &.form-control {
     background-color: $select-bg-color;
   }
+
+  header & {
+    border: none;
+  }
 }
 
 //// Create list in add to favs dialog
@@ -985,6 +1034,16 @@ header,
 }
 
 // NAVBAR
+//// Container for Navbar
+.banner {
+  display: flex; // important for subsequent elements
+
+  // stack elements on top of each other on XS
+  @media only screen and (max-width: $screen-xs-max) {
+    flex-direction: column;
+  }
+}
+
 //// Fixed Navbar (Header) - When using a fixed header + autocomplete,
 //// increase the z-index in autocomplete-results to a value higher than the fixed navbar (1030)!
 .navbar-fixed {
@@ -1010,6 +1069,16 @@ header,
   // body -> padding-top would need to be taller than navbar minimum-height
   min-height: $navbar-height;
 
+ .template-name-advanced & {
+    min-height: 3rem;
+  }
+
+  @media only screen and (max-width: $screen-xs-max) {
+    header & {
+      min-height: 5rem;
+    }
+  }
+
   // The margin on navbar h1 PUSHes ALL NAVBAR ELEMENTS DOWN
   h1 {
     //  margin: ($grid-gutter-width / 2) 0 0; ENABLE For VF 3.x Fixme
@@ -1082,15 +1151,29 @@ header,
   }
 }
 
+.navbar-header {
+  flex: 0 1 auto;
+
+  // ensure proper margins on XS in conjunction with flex-direction: column
+  @media only screen and (max-width: $screen-xs-max) {
+    .container > & {
+      margin-left: 0;
+      margin-right: 0;
+    }
+  }
+}
+
 //// Make right-hand header parts fit with searchbox - see also .search.container above
 #header-collapse {
   @media (min-width: $grid-float-breakpoint) {
-    flex: 0 1 40%;
+    // position to the right!
+    order: 3;
     padding-top: .5em;
   }
-  // Make smaller to fit searchbox and right-hand nav-elements in
-  @media only screen and (min-width: $screen-sm-min) and (max-width: 994px) {
-    flex: 0 1 25%;
+
+  // Make smaller to fit searchbox and right-hand nav-elements
+  @media only screen and (min-width: $screen-sm-min) {
+    flex: 1 0 22%;
   }
 
   // Make right-hand header parts full width for advanced search page since it doesn't use any left-hand header parts
@@ -1127,6 +1210,7 @@ header,
 
 //// Library name in navbar - we give it the same padding as a button, so if fits in with the header
 .navbar-brand {
+  float: left;
   padding: ($grid-gutter-width / 4) ($grid-gutter-width / 2) ($grid-gutter-width / 4) 0;
 
   @media (max-width: $screen-xs-max) {
@@ -1169,13 +1253,12 @@ header,
 // Make seachbox container flexible -- values should complement those of #header-collapse (right-hand side navigation elements)
 .search.container {
   @media (min-width: $grid-float-breakpoint) {
-    flex: 0 1 60%;
     padding-top: $button-top-padding;
   }
 
   // Make wider to fit searchbox and right-hand nav-elements in
-  @media only screen and (min-width: $screen-sm-min) and (max-width: 994px) {
-    flex: 0 1 75%;
+  @media only screen and (min-width: $screen-sm-min) {
+    flex: 0 1 auto;
   }
 
   // Float "Find" button next to searchbox on XS and SM
@@ -1210,12 +1293,22 @@ header,
 .navbar-left {
   // push searchbox down on mobile
   @media only screen and (max-width: $screen-xs-max) {
-    margin-bottom: ($grid-gutter-width / 4);
+    display: contents;
+    margin-bottom: 0;
     margin-top: 0;
+
+    &.navbar-form {
+      padding-top: 0;
+    }
   }
 }
 
 .searchForm {
+  // Search slot inside the search container
+  @media only screen and (min-width: $screen-sm-min) {
+    width: 100%;
+  }
+
   .list-unstyled li {
     float: left;
 
@@ -1236,20 +1329,15 @@ header,
   // therefore use .searchForm as parent
   .checkbox {
     clear: both;
+    display: block;
     float: none;
     padding-top: ($grid-gutter-width / 4);
 
     input {
       margin-left: 0;
       margin-right: .25rem;
-      margin-top: 0;
-    }
-  }
-
-  // make search area fit on Tablets up to 994px by reducing buttons
-  .find-label {
-    @media only screen and (min-width: $screen-sm-min) and (max-width: 994px) {
-      display: none;
+      // make sure, input and label are aligned in acceptable manner between 100% and 200% zoom
+      margin-top: $inputs-top-margin;
     }
   }
 }
@@ -1381,6 +1469,7 @@ footer {
 ////// Bulk Action Toolbar
 .bulk-action-buttons,
 .bulkActionButtons {
+  clear: both;
   padding-bottom: ($grid-gutter-width / 2);
   padding-top: ($grid-gutter-width / 2);
 }
@@ -2091,6 +2180,15 @@ footer ul {
   overflow: initial;
 }
 
+// Modal close button (Needs to be as fancy to override BS styles)
+#modal .modal-content > .close,
+#modal .modal-content > .adv-term-remove {
+  border: $border-default-styles;
+  color: $btn-default-color;
+  left: auto;
+  right: 0;
+}
+
 // MODALS - END
 
 // Bookbag
@@ -2105,7 +2203,8 @@ footer ul {
 
   input[type='checkbox'],
   input[type='checkbox']:focus {
-    margin-top: 2px;
+    // make sure, input and label are aligned in acceptable manner between 100% and 200% zoom
+    margin-top: $inputs-top-margin;
   }
 }
 
diff --git a/themes/finc/templates/Auth/AbstractBase/resetpassword.phtml b/themes/finc/templates/Auth/AbstractBase/resetpassword.phtml
index 184e6745915cf88cb2a9eae328ec5838607aa931..4db59bf53694dcf7871a3bbe09e23b6b5ffc71cf 100644
--- a/themes/finc/templates/Auth/AbstractBase/resetpassword.phtml
+++ b/themes/finc/templates/Auth/AbstractBase/resetpassword.phtml
@@ -4,7 +4,7 @@
 // Set page title.
 $this->headTitle($this->translate('Reset Password'));
 ?>
-<h2><?=$this->transEsc('Reset Password')?></h2>
+<h1><?=$this->transEsc('Reset Password')?></h1>
 <form method="post" name="resetPasswordForm" action="<?=$this->url('myresearch-resetpassword')?>">
   <?=$this->flashmessages()?>
   <p>
diff --git a/themes/finc/templates/Email/acquisition-html.phtml b/themes/finc/templates/Email/acquisition-html.phtml
index 894eea1e581654b9853e9aeabc4eec822a1c5480..5e5d616db59666d67c3e1014e7d12626ce80721f 100644
--- a/themes/finc/templates/Email/acquisition-html.phtml
+++ b/themes/finc/templates/Email/acquisition-html.phtml
@@ -5,7 +5,7 @@
   <title>Erwerbungsvorschlag</title>
 </head>
 <body style="font-family: Arial, Verdana, sans-serif;">
-<h2>Erwerbungsvorschlag</h2>
+<h1>Erwerbungsvorschlag</h1>
 <table>
   <tr valign="top">
     <td>
diff --git a/themes/finc/templates/Email/acquisitionpda-html.phtml b/themes/finc/templates/Email/acquisitionpda-html.phtml
index 1042882d2133e6030fc981baa01ddc50db554f48..3486dd09357d88a983bf0c7477499b573d6ba3a6 100644
--- a/themes/finc/templates/Email/acquisitionpda-html.phtml
+++ b/themes/finc/templates/Email/acquisitionpda-html.phtml
@@ -5,7 +5,7 @@
   <title>Benutzergesteuerte Erwerbung</title>
 </head>
 <body style="font-family: Arial, Verdana, sans-serif;">
-<h2 style="padding:10px 0;">Benutzergesteuerte Erwerbung</h2>
+<h1 style="padding:10px 0;">Benutzergesteuerte Erwerbung</h1>
 <table width="800" border="0">
   <tr valign="top">
     <td width="390">
diff --git a/themes/finc/templates/Email/reporterrors-html.phtml b/themes/finc/templates/Email/reporterrors-html.phtml
index 0b828d9c9f5b440c540f4bade4d8833f7d9fccc4..9942f8d7370c2b7052a1383f1a3d162829a5375c 100644
--- a/themes/finc/templates/Email/reporterrors-html.phtml
+++ b/themes/finc/templates/Email/reporterrors-html.phtml
@@ -5,7 +5,7 @@
   <title>Fehlermeldung durch Benutzer</title>
 </head>
 <body style="font-family: Arial, Verdana, sans-serif;">
-<h2 style="padding:10px 0;">Fehlermeldung durch Benutzer</h2>
+<h1 style="padding:10px 0;">Fehlermeldung durch Benutzer</h1>
 <table width="800" border="0">
   <?php if ($reply_requested): ?>
     <?php if (isset($lastname) && isset($firstname)): ?>
diff --git a/themes/finc/templates/Email/resetpassword-html.phtml b/themes/finc/templates/Email/resetpassword-html.phtml
index 850461ff0e642ab68c69652aa949e7760c6fce0d..b2a467a650343794a8dab626a8290fc08976ceed 100644
--- a/themes/finc/templates/Email/resetpassword-html.phtml
+++ b/themes/finc/templates/Email/resetpassword-html.phtml
@@ -5,7 +5,7 @@
   <title>Zurücksetzen des Passwortes für Benutzer</title>
 </head>
 <body style="font-family: Arial, Verdana, sans-serif;">
-<h2 style="padding:10px 0;">Zurücksetzen des Passwortes für Benutzer</h2>
+<h1 style="padding:10px 0;">Zurücksetzen des Passwortes für Benutzer</h1>
 <table width="800" border="0">
   <?php if (isset($lastname) && isset($firstname)): ?>
     <tr>
diff --git a/themes/finc/templates/Recommend/SideFacets.phtml b/themes/finc/templates/Recommend/SideFacets.phtml
index 3b9a1c2cd0eb073d43241aebaa7a043ded86a9d3..13e80bbce112d75618bed5249628b335dec5b247 100644
--- a/themes/finc/templates/Recommend/SideFacets.phtml
+++ b/themes/finc/templates/Recommend/SideFacets.phtml
@@ -15,7 +15,7 @@ if ($hierarchicalFacets) {
 ?>
 <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/finc/templates/Recommend/SideFacetsDeferred.phtml b/themes/finc/templates/Recommend/SideFacetsDeferred.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..ae599aaec796bafd34ba2fbd409fdcb6be53a02b
--- /dev/null
+++ b/themes/finc/templates/Recommend/SideFacetsDeferred.phtml
@@ -0,0 +1,83 @@
+<!-- finc: recommend - TEMPORARY BARF - sidefacetsDeferred -->
+<?php
+  $this->headScript()->appendFile('vendor/jsTree/jstree.min.js');
+  $this->headScript()->appendFile('facets.js');
+
+  $results = $this->recommend->getResults();
+  $activeFacets = $this->recommend->getActiveFacets();
+  $rangeFacets = $this->recommend->getAllRangeFacets();
+
+  foreach ($activeFacets as $field => $facetName) {
+    if (isset($rangeFacets[$field]) && 'date' === $rangeFacets[$field]['type']) {
+      $this->headScript()->appendFile('vendor/bootstrap-slider.min.js');
+      $this->headLink()->appendStylesheet('vendor/bootstrap-slider.min.css');
+      break;
+    }
+  }
+?>
+<?php if ($results->getResultTotal() > 0): ?>
+  <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(); ?>
+<?php $checkboxesShown = false; ?>
+<?php if (count($checkboxFilters) > 0):
+    foreach ($checkboxFilters as $current) {
+      if ($results->getResultTotal() > 0 || $current['selected'] || $current['alwaysVisible']) {
+        $checkboxesShown = true;
+        break;
+      }
+    }
+  ?>
+  <?php if ($checkboxesShown): ?>
+    <div class="checkboxFilter">
+      <?=$this->context($this)->renderInContext('Recommend/SideFacets/checkbox-filters.phtml', ['checkboxFilters' => $checkboxFilters, 'results' => $results]); ?>
+    </div>
+  <?php endif; ?>
+<?php endif; ?>
+<?php $extraFilters = isset($this->extraSideFacetFilters) ? $this->extraSideFacetFilters : []; ?>
+<?php $collapsedFacets = $this->recommend->getCollapsedFacets() ?>
+<?php $filterList = array_merge($results->getParams()->getFilterList(true), $extraFilters); ?>
+<?php if (!empty($filterList)): ?>
+  <?=$this->context($this)->renderInContext('Recommend/SideFacets/filter-list.phtml', [
+    'collapsedFacets' => $collapsedFacets,
+    'extraFilters' => $extraFilters,
+    'filterList' => $filterList,
+  ]); ?>
+<?php endif; ?>
+<?= isset($this->sideFacetExtraControls) ? $this->sideFacetExtraControls : '' ?>
+<?php $sideFacetSet = $this->recommend->getFacetSet(); ?>
+<?php $hierarchicalFacets = $this->recommend->getHierarchicalFacets() ?>
+<?php $hierarchicalFacetSortOptions = $this->recommend->getHierarchicalFacetSortOptions() ?>
+<?php if (!empty($activeFacets) && $results->getResultTotal() > 0): ?>
+  <?php foreach ($activeFacets as $field => $facetName): ?>
+    <?php $allowExclude = $this->recommend->excludeAllowed($field); ?>
+    <div class="facet-group" id="side-panel-<?=$this->escapeHtmlAttr($field) ?>">
+      <button class="title<?php if (in_array($field, $collapsedFacets)): ?> collapsed<?php endif ?>" data-toggle="collapse" href="#side-collapse-<?=$this->escapeHtmlAttr($field) ?>" >
+        <?=$this->transEsc($facetName)?>
+      </button>
+      <div id="side-collapse-<?=$this->escapeHtmlAttr($field) ?>" class="collapse<?php if (!in_array($field, $collapsedFacets)): ?> in<?php endif ?>" data-facet="<?=$this->escapeHtmlAttr($field) ?>">
+        <span class="facet-load-indicator hidden">
+          <span class="text">
+            <i class="fa fa-spinner fa-spin"></i> <?=$this->transEsc('Loading')?>...
+          </span>
+        </span>
+        <span class="facet-load-failed hidden"> <?=$this->transEsc('ajax_load_interrupted')?></span>
+        <?php if (in_array($field, $hierarchicalFacets)): ?>
+          <div id="facet_<?=$this->escapeHtml($field)?>" class="jstree-facet"
+              data-facet="<?=$this->escapeHtmlAttr($field)?>"
+              data-path=""
+              data-exclude="<?=$allowExclude?>"
+              data-operator="<?=$this->recommend->getFacetOperator($field)?>"
+              data-exclude-title="<?=$this->transEsc('exclude_facet')?>"
+              data-sort="<?=$hierarchicalFacetSortOptions[$field] ?? ''?>">
+          </div>
+        <?php endif; ?>
+      </div>
+    </div>
+  <?php endforeach; ?>
+<?php endif; ?>
+<?php if ($results->getResultTotal() > 0): ?>
+  </div>
+<?php endif; ?>
+<!-- finc: recommend - TEMPORARY BARF - sidefacetsDeferred - END -->
diff --git a/themes/finc/templates/RecordDriver/DefaultRecord/list-entry.phtml b/themes/finc/templates/RecordDriver/DefaultRecord/list-entry.phtml
index 1be6a201320de332338b969cb3f10e60892fa7d6..e7e0547d831891190a4ae3b784d0b9b8b5c397bc 100644
--- a/themes/finc/templates/RecordDriver/DefaultRecord/list-entry.phtml
+++ b/themes/finc/templates/RecordDriver/DefaultRecord/list-entry.phtml
@@ -95,7 +95,7 @@ if ($cover):
           <?php $listTags = ($this->usertags()->getMode() !== 'disabled') ? $this->driver->getTags(
             null === $list_id ? true : $list_id, // get tags for all lists if no single list is selected
             $user_id, 'tag'
-          ) : array();
+          ) : [];
           ?>
           <?php if (count($listTags) > 0): ?>
             <strong><?=$this->transEsc('Your Tags')?>:</strong>
@@ -206,9 +206,9 @@ if ($cover):
               <?=$this->transEsc('Delete')?>
             </a>
             <ul class="dropdown-menu" role="menu" aria-labelledby="<?=$dLabel?>">
-              <li><a onClick="$.post('<?=$deleteUrl?>', {'delete':'<?=$this->escapeJs($id)?>','source':'<?=$this->escapeJs($source)?>','confirm':true},function(){location.reload(true)})"
-                     title="<?=$this->transEsc('confirm_delete_brief')?>"><?=$this->transEsc('confirm_dialog_yes')?></a></li>
-              <li><a><?=$this->transEsc('confirm_dialog_no')?></a></li>
+              <li>
+                <a href="javascript:" onClick="$.post('<?=$deleteUrl?>', {'delete':'<?=$this->escapeJs($id)?>','source':'<?=$this->escapeJs($source)?>','confirm':true},function(){location.reload(true)})" title="<?=$this->transEsc('confirm_delete_brief')?>"><?=$this->transEsc('confirm_dialog_yes')?></a></li>
+              <li><a href="javascript:document.getElementById('<?=$dLabel?>').focus();"><?=$this->transEsc('confirm_dialog_no')?></a></li>
             </ul>
           </div>
 
diff --git a/themes/finc/templates/RecordDriver/DefaultRecord/toolbar.phtml b/themes/finc/templates/RecordDriver/DefaultRecord/toolbar.phtml
index 7b3bf640bf5ac2430f54b08641421735044a958a..62feb9426816a8d8224b23f30db4bd97ec94e60c 100644
--- a/themes/finc/templates/RecordDriver/DefaultRecord/toolbar.phtml
+++ b/themes/finc/templates/RecordDriver/DefaultRecord/toolbar.phtml
@@ -11,7 +11,7 @@ $cartId = $this->driver->getSourceIdentifier() . '|' . $this->driver->getUniqueI
 ?>
 
 <?php /* finc: we use nav-stacked for display in sidebar, CK */ ?>
-<ul class="record-nav nav nav-pills nav-stacked hidden-print">
+<ul class="record-nav nav nav-pills nav-stacked hidden-print" aria-label="<?=$this->transEsc('ajaxview_label_tools'); ?>">
   <?php /* finc: we use the sr-only description, CK */ ?>
   <li class="sr-only"><?=$this->transEsc('Toolbar')?></li>
   <?php if (count($this->driver->getCitationFormats()) > 0): ?>
@@ -32,14 +32,14 @@ $cartId = $this->driver->getSourceIdentifier() . '|' . $this->driver->getUniqueI
   <?php $exportFormats = $this->export()->getFormatsForRecord($this->driver); ?>
   <?php if (count($exportFormats) > 0): ?>
     <li class="dropdown">
-      <a class="export-toggle dropdown-toggle" data-toggle="dropdown" href="<?=$this->recordLink()->getActionUrl($this->driver, 'Export')?>" rel="nofollow"><i class="fa fa-list-alt" aria-hidden="true"></i> <?=$this->transEsc('Export Record')?>
+      <a class="export-toggle dropdown-toggle" data-toggle="dropdown" href="<?=$this->recordLink()->getActionUrl($this->driver, 'Export')?>" rel="nofollow" aria-haspopup="true" aria-expanded="false" aria-controls="export-options" id="export-record"><i class="fa fa-list-alt" aria-hidden="true"></i> <?=$this->transEsc('Export Record')?>
       </a>
-      <ul class="dropdown-menu" role="menu">
+      <ul class="dropdown-menu" id="export-options" role="menu">
         <?php foreach ($exportFormats as $exportFormat): ?>
-          <li>
-            <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"><?=$this->transEsc('Export to')?><?=$this->transEsc($this->export()->getLabelForFormat($exportFormat))?></a>
+          <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>
diff --git a/themes/finc/templates/amsl/sources-list.phtml b/themes/finc/templates/amsl/sources-list.phtml
index 86a14df32c045634634cbf45add7826d2d1586d2..46f4a83d21078c7413d1442a9b4f359cbeb3b06c 100644
--- a/themes/finc/templates/amsl/sources-list.phtml
+++ b/themes/finc/templates/amsl/sources-list.phtml
@@ -7,7 +7,7 @@ $this->headTitle($this->translate('List of available Sources'));
 $this->layout()->breadcrumbs .= '</li> <li class="active">' . $this->transEsc('List of available Sources') . '</li>';
 ?>
 
-<h2><?=$this->transEsc('List of available Sources');?></h2>
+<h1><?=$this->transEsc('List of available Sources');?></h1>
 
 <?=$this->flashmessages()?>
 
diff --git a/themes/finc/templates/breadcrumbs/default.phtml b/themes/finc/templates/breadcrumbs/default.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..cbeb6f4a4faf06ffb45b0c3755c26209e9f5e9da
--- /dev/null
+++ b/themes/finc/templates/breadcrumbs/default.phtml
@@ -0,0 +1,13 @@
+<!-- finc: - breadcrumbs -- default - TEMPORARY BARF - END -->
+<li><a href="<?=$this->url('home')?>"><?=$this->transEsc('Home')?></a></li>
+<?php $current = $this->layout()->breadcrumbs; $current = current($current); ?>
+<?php foreach($current as $id => $parent): ?>
+  <li><a href="<?=$this->url('collection', ['id' => $id]) ?>"><?=$parent ?></a></li>
+<?php endforeach; ?>
+<?php if(isset($this->layout()->end)): ?>
+  <li title="<?=$this->layout()->title ?>"><?=$this->truncate($this->layout()->title, 100) ?></li>
+  <li class="active" aria-current="page"><?=$this->layout()->end ?></li>
+<?php else: ?>
+  <li class="active" title="<?=$this->layout()->title ?>" aria-current="page"><?=$this->truncate($this->layout()->title, 100) ?></li>
+<?php endif; ?>
+<!-- finc: - breadcrumbs -- default - TEMPORARY BARF - END -->
diff --git a/themes/finc/templates/documentdeliveryservice/form.phtml b/themes/finc/templates/documentdeliveryservice/form.phtml
index a1f975f2ddbe87694de02945ef708ee61d13e249..c724f5e2ef1f34f051d9680157cf0242cedf9759 100644
--- a/themes/finc/templates/documentdeliveryservice/form.phtml
+++ b/themes/finc/templates/documentdeliveryservice/form.phtml
@@ -1,6 +1,6 @@
 <!-- finc - documentdeliveryservice - form -->
 <div class="<?=$this->layoutClass('mainbody')?>">
-  <h2><?=$this->transEsc('DDS::dds_form_headline')?></h2>
+  <h1><?=$this->transEsc('DDS::dds_form_headline')?></h1>
   <?=$this->flashmessages()?>
   <form method="post" action="<?=$this->url('dds-email')?>" name="docdelisForm">
     <?php if ($this->department): ?>
diff --git a/themes/finc/templates/footer.phtml b/themes/finc/templates/footer.phtml
index 510e299722e1ed2d092515a79b5617cf8f493840..8b9a734ece3201f25ed26946b4dcaa7ee63c82a0 100644
--- a/themes/finc/templates/footer.phtml
+++ b/themes/finc/templates/footer.phtml
@@ -2,7 +2,7 @@
 <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>
@@ -10,7 +10,7 @@
     </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>
@@ -22,7 +22,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>
@@ -36,9 +36,13 @@
     <div class="footer-container powered-by">
       <div class="footer-column">
         <?=$this->layout()->poweredBy?>
-        <span>Powered by</span>
-        <a href="https://vufind.org/" title="vufind.org" target="_blank"><img src="<?=$this->imageLink('vufind_logo.png')?>" alt="powered by VuFind - VuFind Logo"/></a>
-        <a href="http://blog.finc.info" title="Blog FinC-Team" target="_blank"><img src="<?=$this->imageLink('finc_logo.png')?>" alt="powered by finc - finc Logo"/></a>
+        <span lang="en">Powered by</span>
+        <a href="https://vufind.org/" title="<?=$this->transEsc('vufind-logo_title')?>" target="_blank">
+          <img src="<?=$this->imageLink('vufind_logo.png')?>" alt="<?=$this->transEsc('vufind-logo_alt')?>"/>
+        </a>
+        <a href="http://blog.finc.info" title="<?=$this->transEsc('finc-logo_title')?>" target="_blank">
+          <img src="<?=$this->imageLink('finc_logo.png')?>" alt="<?=$this->transEsc('finc-logo_alt')?>"/>
+        </a>
       </div>
     </div>
 </footer>
diff --git a/themes/finc/templates/header.phtml b/themes/finc/templates/header.phtml
index 0fe1e26791a4053f41f65d4dece610b0ab45b1ba..250a1b6dbafe1a987b745a899c8ad8d948758841 100644
--- a/themes/finc/templates/header.phtml
+++ b/themes/finc/templates/header.phtml
@@ -11,23 +11,20 @@
   <div class="navbar-header">
     <?php /* mobile navigation toggler - CK */ ?>
     <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#header-collapse">
-      <span class="sr-only">Toggle navigation</span>
+      <span class="sr-only"><?=$this->transEsc("mobile_toggle_navigation_text")?></span>
       <i class="fa fa-bars" aria-hidden="true"></i>
     </button>
-
-    <h1>
-      <a class="navbar-brand lang-<?=$this->layout()->userLang?>" href="<?=$this->url('home')?>">
-        <?php /* Custom finc header - CK*/ ?>
-          <span class="hidden-sm hidden-md hidden-lg"><?=$this->transEsc("LibraryName")?></span>
-          <img src="<?=$this->imageLink('headerlogo.png')?>" class="hidden-xs" alt="Logo <?=$this->transEsc("LibraryName")?>" title="<?=$this->transEsc("LibraryName")?>">
-        <?php /*  Custom finc header - END */ ?>
-      </a>
-    </h1>
+    <?php /* remove h1 from header and use h1 in content area instead - CK*/ ?>
+    <a class="navbar-brand lang-<?=$this->layout()->userLang?>" href="<?=$this->url('home')?>" aria-label="<?=$this->transEsc('Home')?>">
+      <?php /* Custom finc header - make sure that one variant of Library name is readable on any device - CK*/ ?>
+      <span class="hidden-sm hidden-md hidden-lg"><?=$this->transEsc("LibraryName")?></span>
+      <img src="<?=$this->imageLink('headerlogo.png')?>" class="hidden-xs" alt="Logo <?=$this->transEsc('LibraryName')?>" aria-hidden="true">
+      <?php /*  Custom finc header - END */ ?>
+    </a>
   </div>
 
-  <div class="flex-container">
   <?php if (!isset($this->layout()->renderingError)): ?>
-    <div class="collapse navbar-collapse right" id="header-collapse">
+    <div class="collapse navbar-collapse" id="header-collapse">
       <?php /* finc: right-hand navbar section - see flex-container in SCSS:
               we need this order on XS: navbar-right searchbox
               but reverse it on anything but mobile */ ?>
@@ -35,9 +32,7 @@
         <ul class="nav navbar-nav navbar-right flip">
           <?php if ($this->feedback()->tabEnabled()): ?>
             <li>
-              <a id="feedbackLink" data-lightbox class="btn" href="<?=$this->url('feedback-home')?>"> <i class="fa fa-envelope" aria-hidden="true"></i>
-                <span class="hidden-sm"><?=$this->transEsc("Feedback")?></span>
-              </a>
+              <a id="feedbackLink" data-lightbox class="btn" href="<?=$this->url('feedback-home')?>"> <i class="fa fa-envelope" aria-hidden="true"></i><span class="sr-only"><?=$this->transEsc("Feedback")?></span></a>
             </li>
           <?php endif; ?>
           <?php $cart = $this->cart();
@@ -45,42 +40,40 @@
             <li id="cartSummary">
               <a id="cartItems" class="btn" data-lightbox title="<?=$this->transEsc('View Book Bag')?>" href="<?=$this->url('cart-home')?>">
                 <i class="fa fa-clipboard" aria-hidden="true"></i> <strong><?=count($cart->getItems())?></strong> <span class="cart-label"><?=$this->transEsc('items')?></span>
-                <span class="hidden-sm full<?=!$cart->isFull() ? ' hidden' : ''?>">(<?=$this->transEsc('bookbag_full')?>)</span>
+                <span class="sr-only full<?=!$cart->isFull() ? ' hidden' : ''?>">(<?=$this->transEsc('bookbag_full')?>)</span>
               </a>
             </li>
           <?php endif; ?>
           <?php if (is_object($account) && $account->loginEnabled()): // hide login/logout if unavailable ?>
-            <li class="logoutOptions<?php if($account->dropdownEnabled()): ?> with-dropdown<?php endif ?><?php if(!$account->isLoggedIn()): ?> hidden<?php endif ?>">
-              <a class="btn" href="<?=$this->url('myresearch-home',  [], ['query' => ['redirect' => 0]])?>">
-                <i id="account-icon" class="fa fa-home" aria-hidden="true"></i>
-                <span class="hidden-sm"><?=$this->transEsc("Your Account")?></span>
-              </a>
+            <li class="logoutOptions<?php if ($account->dropdownEnabled()): ?> with-dropdown<?php endif ?><?php if (!$account->isLoggedIn()): ?> hidden<?php endif ?>">
+              <a class="btn" href="<?=$this->url('myresearch-home', [], ['query' => ['redirect' => 0]])?>"><i id="account-icon" class="fa fa-home" aria-hidden="true"></i><span
+                  class="sr-only"><?=$this->transEsc("Your Account")?></span></a>
             </li>
-            <?php if($account->dropdownEnabled()): ?>
-              <li id="login-dropdown" class="dropdown<?php if(!$account->isLoggedIn()): ?> hidden<?php endif ?>">
+            <?php if ($account->dropdownEnabled()): ?>
+              <li id="login-dropdown" class="dropdown<?php if (!$account->isLoggedIn()): ?> hidden<?php endif ?>">
                 <a href="#" data-toggle="dropdown"><i class="fa fa-caret-down"></i></a>
                 <div class="dropdown-menu">
-                  <?=$this->render('myresearch/menu'); ?>
+                  <?=$this->render('myresearch/menu');?>
                 </div>
               </li>
             <?php endif; ?>
             <li class="logoutOptions<?php if (!$account->isLoggedIn()): ?> hidden<?php endif ?>">
-              <a href="<?=$this->url('myresearch-logout')?>" class="logout btn" title="<?=$this->transEsc("Log Out")?>">
-                <i class="fa fa-sign-out" aria-hidden="true"></i>
-                <span class="hidden-sm"><?=$this->transEsc("Log Out")?></span>
+              <a href="<?=$this->url('myresearch-logout')?>" class="logout btn">
+                <i class="fa fa-sign-out" aria-hidden="true" title="<?=$this->transEsc('Log Out')?>"></i>
+                <span class="sr-only"><?=$this->transEsc("Log Out")?></span>
               </a>
             </li>
 
             <li id="loginOptions"<?php if ($account->isLoggedIn()): ?> class="hidden"<?php endif ?>>
               <?php if ($account->getSessionInitiator($this->serverUrl($this->url('myresearch-home')))): ?>
                 <a class="btn" href="<?=$this->url('myresearch-userlogin')?>">
-                  <i class="fa fa-sign-in" aria-hidden="true"></i>
-                  <span class="hidden-sm"><?=$this->transEsc("Institutional Login")?></span>
+                  <i class="fa fa-sign-in" aria-hidden="true" title="<?=$this->transEsc('Institutional Login')?>"></i>
+                  <span class="sr-only"><?=$this->transEsc("Institutional Login")?></span>
                 </a>
               <?php else: ?>
                 <a class="btn" href="<?=$this->url('myresearch-userlogin')?>" data-lightbox>
-                  <i class="fa fa-sign-in" aria-hidden="true"></i>
-                  <span class="hidden-sm"><?=$this->transEsc("Login")?></span>
+                  <i class="fa fa-sign-in" aria-hidden="true" title="<?=$this->transEsc('Login')?>"></i>
+                  <span class="sr-only"><?=$this->transEsc("Login")?></span>
                 </a>
               <?php endif; ?>
             </li>
@@ -95,7 +88,7 @@
 
               <ul class="dropdown-menu">
                 <?php foreach ($this->layout()->themeOptions as $current): ?>
-                  <li<?=$current['selected'] ? ' class="active"' : ''?>>
+                  <li <?=$current['selected'] ? ' class="active"' : ''?>>
                     <a href="#" onClick="document.themeForm.ui.value='<?=$this->escapeHtmlAttr($current['name'])?>';document.themeForm.submit()"><?=$this->transEsc($current['desc'])?></a>
                   </li>
                 <?php endforeach; ?>
@@ -113,7 +106,7 @@
               </a>
               <ul id="langmenu" class="dropdown-menu">
                 <?php foreach ($this->layout()->allLangs as $langCode => $langName): ?>
-                  <li<?=$this->layout()->userLang == $langCode ? ' class="active"' : ''?>>
+                  <li <?=$this->layout()->userLang == $langCode ? ' class="active"' : ''?>>
                     <a class="btn" href="#" onClick="document.langForm.mylang.value='<?=$langCode?>';document.langForm.submit()"><?=$this->displayLanguageOption($langName)?></a>
                   </li>
                 <?php endforeach; ?>
@@ -124,17 +117,16 @@
       </nav>
     </div>
   <?php endif; ?>
-    <?php /* finc searchbox: we use searchbox here so it becomes part of the sticky header,
+  <?php /* finc searchbox: we use searchbox here so it becomes part of the sticky header,
         we need to place this after the navbar-right for anything but mobile  - see flex-container in SCSS:*/ ?>
-    <?php if ($this->layout()->searchbox !== false): ?>
-      <div class="search container left">
-        <nav class="nav searchbox hidden-print">
-          <?=$this->layout()->searchbox?>
-        </nav>
-      </div>
-    <?php endif; ?>
-    <?php /* finc searchbox - END */ ?>
-  </div>
+  <?php if ($this->layout()->searchbox !== false): ?>
+    <div class="search container navbar">
+      <nav class="nav searchbox hidden-print" role="search">
+        <?=$this->layout()->searchbox?>
+      </nav>
+    </div>
+  <?php endif; ?>
+  <?php /* finc searchbox - END */ ?>
 </div>
 <?php /* If you want to use searchbox in a separate row, insert it here as in bootstrap theme - CK */ ?>
 <!-- finc: header - END -->
diff --git a/themes/finc/templates/layout/layout.phtml b/themes/finc/templates/layout/layout.phtml
index b57ca8214570a9b4487a682fc05945b8343dbc8a..22c1d8c7dedd536e280c568c7f682f5c34b2d8eb 100644
--- a/themes/finc/templates/layout/layout.phtml
+++ b/themes/finc/templates/layout/layout.phtml
@@ -156,14 +156,18 @@ if (!isset($this->layout()->searchbox)) {
 <?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="#searchslots"><?=$this->transEsc('Skip to search')?></a>
+
+<?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; ?>
 <a class="sr-only" href="#content"><?=$this->transEsc('Skip to content')?></a>
 
 <?php /* Start header here, not above, custom finc, CK */ ?>
 <header class="hidden-print">
   <?=$this->render('header.phtml')?>
 </header>
-<nav class="breadcrumbs">
+<nav class="breadcrumbs" aria-label="<?=$this->transEsc('Breadcrumbs')?>">
   <?php /* finc: DON'T use .container here or the breadcrumbs will get a left+right padding - CK */ ?>
   <?php if ((!isset($this->layout()->showBreadcrumbs) || $this->layout()->showBreadcrumbs == true)
     && !empty($this->layout()->breadcrumbs)
@@ -200,14 +204,17 @@ if (!isset($this->layout()->searchbox)) {
 
 <!-- MODAL IN CASE WE NEED ONE -->
 <?php /* move X button to logical pos. in structure + make accessible via tab - CK */ ?>
-<div id="modal" class="modal fade hidden-print" tabindex="-1" role="dialog" aria-modal="true" aria-labelledby="modalTitle" aria-hidden="true">
+<div id="modal" class="modal fade hidden-print" tabindex="-1" role="dialog" aria-modal="true" aria-labelledby="modal-title" aria-hidden="true" aria-describedby="modal-description">
   <div class="modal-dialog">
     <div class="modal-content">
+      <div class="sr-only" id="modal-description">
+        <?=$this->transEsc('Modal_description')?>
+      </div>
       <div class="modal-body"><?=$this->transEsc('Loading')?>&nbsp;...</div>
-      <button type="button" class="close" data-dismiss="modal" tabindex="0">
-        <span class="sr-only"><?=$this->transEsc('Close')?></span>
-        <i class="fa fa-times" aria-hidden="true"></i>
-      </button>
+        <button type="button" class="close" data-dismiss="modal" tabindex="0">
+          <span class="sr-only"><?=$this->transEsc('CloseModal')?></span>
+          <i class="fa fa-times" aria-hidden="true"></i>
+        </button>
     </div>
   </div>
 </div>
diff --git a/themes/finc/templates/layout/lightbox.phtml b/themes/finc/templates/layout/lightbox.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..d9ba015de5a932dee20a103aecffd7c4aaa53096
--- /dev/null
+++ b/themes/finc/templates/layout/lightbox.phtml
@@ -0,0 +1,6 @@
+<!-- finc: recommend - TEMPORARY BARF - layout -- lightbox -->
+<span id="modal-title" hidden><?=$this->headTitle()->renderTitle() ?></span>
+<?=$this->layout()->content?>
+<?=$this->piwik(['lightbox' => true])?>
+<?=$this->googleanalytics($this->serverUrl(true))?>
+<!-- finc: recommend - TEMPORARY BARF - layout -- lightbox - END -->
diff --git a/themes/finc/templates/librarycards/home.phtml b/themes/finc/templates/librarycards/home.phtml
index 2222c350f3208df6d2a77cc98fefc88ee86bb355..c4fab442f3de93de098e903ed6c95711e1d5904f 100644
--- a/themes/finc/templates/librarycards/home.phtml
+++ b/themes/finc/templates/librarycards/home.phtml
@@ -10,7 +10,7 @@
 
     <?=$this->flashmessages()?>
 
-    <h2><?=$this->transEsc('Library Cards')?></h2>
+    <h1><?=$this->transEsc('Library Cards')?></h1>
     <?php if ($this->libraryCards->count() == 0): ?>
       <div><?=$this->transEsc('You do not have any library cards')?></div>
     <?php else: ?>
diff --git a/themes/finc/templates/myresearch/acquisition.phtml b/themes/finc/templates/myresearch/acquisition.phtml
index 12bae3a4324b506437da43754096d90d44233b4f..d75b4c1f66695e9d6438afa076280cbd3dc80d19 100644
--- a/themes/finc/templates/myresearch/acquisition.phtml
+++ b/themes/finc/templates/myresearch/acquisition.phtml
@@ -11,7 +11,7 @@ $this->layout()->breadcrumbs = '<li><a href="' . $this->url('myresearch-home') .
   <?php /* finc V5: toggler was missing, remove entire template (!) when fixed in BS3 theme - CK */ ?>
   <?=$this->render('RecordDriver/DefaultRecord/offcanvas-toggler-myresearch'); ?>
 
-  <h2><?=$this->transEsc('PDA::pda_form_subtitle')?></h2>
+  <h1><?=$this->transEsc('PDA::pda_form_subtitle')?></h1>
   <?=$this->flashmessages()?>
   <form method="post" action="" name="acquisitionForm">
     <h3><?=$this->transEsc('PDA::pda_form_suggestions_limit')?></h3>
diff --git a/themes/finc/templates/myresearch/bulk-action-buttons.phtml b/themes/finc/templates/myresearch/bulk-action-buttons.phtml
deleted file mode 100644
index 2fbc71203667d4549ef23e775b7f9cd8fcf04794..0000000000000000000000000000000000000000
--- a/themes/finc/templates/myresearch/bulk-action-buttons.phtml
+++ /dev/null
@@ -1,29 +0,0 @@
-<!-- finc: myresearch - bulkactionbuttons -->
-<?php if (isset($list)): ?>
-  <input type="hidden" name="listID" value="<?=$this->escapeHtmlAttr($list->id)?>"/>
-  <input type="hidden" name="listName" value="<?=$this->escapeHtmlAttr($list->title)?>"/>
-<?php endif; ?>
-<?php $user = $this->auth()->isLoggedIn(); ?>
-<div class="bulkActionButtons hidden-print">
-  <div class="bulk-checkbox">
-    <input type="checkbox" name="selectAll" class="checkbox-select-all" id="myresearchCheckAll"/>
-    <label for="myresearchCheckAll"><?=$this->transEsc('select_page')?> | <?=$this->transEsc('with_selected')?>:</label>
-  </div>
-
-  <?php /* Keep bulk-action-buttons class, finc-specific SCSS, CK */ ?>
-  <div class="btn-group bulk-action-buttons hidden-print">
-    <input class="btn btn-transparent" type="submit" name="email" value="<?=$this->transEsc('Email')?>" title="<?=$this->transEsc('email_selected')?>"/>
-    <?php if ((null !== $this->list && $this->list->editAllowed($user)) || null === $this->list && $user): ?>
-      <input class="btn btn-transparent" id="<?=$this->idPrefix?>delete_list_items_<?=!is_null($this->list) ? $this->escapeHtmlAttr($this->list->id) : ''?>" type="submit" name="delete" value="<?=$this->transEsc('Delete')?>" title="<?=$this->transEsc('delete_selected')?>"/>
-    <?php endif; ?>
-    <?php $exportOptions = $this->export()->getActiveFormats('bulk');
-    if (count($exportOptions) > 0): ?>
-      <input class="btn btn-transparent" type="submit" name="export" value="<?=$this->transEsc('Export')?>" title="<?=$this->transEsc('export_selected')?>"/>
-    <?php endif; ?>
-    <input class="btn btn-transparent" type="submit" name="print" value="<?=$this->transEsc('Print')?>" title="<?=$this->transEsc('print_selected')?>" data-lightbox-ignore/>
-    <?php if ($this->cart()->isActive()): ?>
-      <input class="btn btn-transparent" id="<?=$this->idPrefix?>updateCart" type="submit" name="add" value="<?=$this->transEsc('Add to Book Bag')?>"/>
-    <?php endif; ?>
-  </div>
-</div>
-<!-- finc: myresearch - bulkactionbuttons - END -->
diff --git a/themes/finc/templates/myresearch/checkedout.phtml b/themes/finc/templates/myresearch/checkedout.phtml
index bc99ff9602cee8e7e36d6f40cec8d5a8aeeac449..0c2a23e6f051b8ec67bf8f47ae189382c0288f72 100644
--- a/themes/finc/templates/myresearch/checkedout.phtml
+++ b/themes/finc/templates/myresearch/checkedout.phtml
@@ -14,7 +14,7 @@
   <?php /* finc V5: toggler was missing, remove entire template (!) when fixed in BS3 theme - CK */ ?>
   <?=$this->render('RecordDriver/DefaultRecord/offcanvas-toggler-myresearch'); ?>
 
-  <h2><?=$this->transEsc('Your Checked Out Items')?></h2>
+  <h1><?=$this->transEsc('Your Checked Out Items')?></h1>
   <?=$this->flashmessages()?>
 
   <?=$this->context($this)->renderInContext('librarycards/selectcard.phtml', ['user' => $this->auth()->isLoggedIn()]); ?>
diff --git a/themes/finc/templates/myresearch/fines.phtml b/themes/finc/templates/myresearch/fines.phtml
index 61a03b84cbad2bee52d7842d5f4cc231d67b0715..e158fe5e7fb0c92efd0bb1474c34dc3cc144af4e 100644
--- a/themes/finc/templates/myresearch/fines.phtml
+++ b/themes/finc/templates/myresearch/fines.phtml
@@ -10,7 +10,7 @@
   <?php /* finc V5: toggler was missing, remove entire template (!) when fixed in BS3 theme - CK */ ?>
   <?=$this->render('RecordDriver/DefaultRecord/offcanvas-toggler-myresearch'); ?>
 
-  <h2><?=$this->transEsc('Your Fines')?></h2>
+  <h1><?=$this->transEsc('Your Fines')?></h1>
   <?=$this->flashmessages()?>
 
   <?=$this->context($this)->renderInContext('librarycards/selectcard.phtml', ['user' => $this->auth()->isLoggedIn()]); ?>
diff --git a/themes/finc/templates/myresearch/historicloans.phtml b/themes/finc/templates/myresearch/historicloans.phtml
index b7b7458f9f0c35d62d317a652e287967b9eced44..47460e73b443c6e2c84187d9b561ee6bc2580dc1 100644
--- a/themes/finc/templates/myresearch/historicloans.phtml
+++ b/themes/finc/templates/myresearch/historicloans.phtml
@@ -11,7 +11,7 @@
   <?php /* finc V5: toggler was missing, remove entire template (!) when fixed in BS3 theme - CK */ ?>
   <?=$this->render('RecordDriver/DefaultRecord/offcanvas-toggler-myresearch'); ?>
 
-  <h2><?=$this->transEsc('Loan History')?></h2>
+  <h1><?=$this->transEsc('Loan History')?></h1>
   <?=$this->flashmessages()?>
 
   <?=$this->context($this)->renderInContext('librarycards/selectcard.phtml', ['user' => $this->auth()->isLoggedIn()]); ?>
diff --git a/themes/finc/templates/myresearch/holds.phtml b/themes/finc/templates/myresearch/holds.phtml
index 107d964055f43490adb0074407b00010be4d7f4a..f77aa2c25fed7cd4db5536e2e54a7bf8090a1ad3 100644
--- a/themes/finc/templates/myresearch/holds.phtml
+++ b/themes/finc/templates/myresearch/holds.phtml
@@ -11,7 +11,7 @@
   <?php /* finc V5: toggler was missing, remove entire template (!) when fixed in BS3 theme - CK */ ?>
   <?=$this->render('RecordDriver/DefaultRecord/offcanvas-toggler-myresearch'); ?>
 
-  <h2><?=$this->transEsc('Your Holds and Recalls') ?></h2>
+  <h1><?=$this->transEsc('Your Holds and Recalls') ?></h1>
 
   <?=$this->flashmessages()?>
 
diff --git a/themes/finc/templates/myresearch/illrequests.phtml b/themes/finc/templates/myresearch/illrequests.phtml
index 80c771161d09985ac53693b3697f5a37d7fab434..120e6e614e46f4f6dfdbd00b47c5863548c24d93 100644
--- a/themes/finc/templates/myresearch/illrequests.phtml
+++ b/themes/finc/templates/myresearch/illrequests.phtml
@@ -11,7 +11,7 @@
   <?php /* finc V5: toggler was missing, remove entire template (!) when fixed in BS3 theme - CK */ ?>
   <?=$this->render('RecordDriver/DefaultRecord/offcanvas-toggler-myresearch'); ?>
 
-  <h2><?=$this->transEsc('Interlibrary Loan Requests') ?></h2>
+  <h1><?=$this->transEsc('Interlibrary Loan Requests') ?></h1>
 
   <?=$this->flashmessages()?>
 
diff --git a/themes/finc/templates/myresearch/menu.phtml b/themes/finc/templates/myresearch/menu.phtml
index 1e62d72f79ff02f51fde3bfa1df03db64bf22529..025b8fa7c2bcf4c37499af6f6a04911b15e909af 100644
--- a/themes/finc/templates/myresearch/menu.phtml
+++ b/themes/finc/templates/myresearch/menu.phtml
@@ -7,7 +7,7 @@ $capabilityParams = $patron ? ['patron' => $patron] : [];
 <?php /* Offcanvas closing button missing in BS3! CK*/ ?>
 <button class="close-offcanvas btn btn-link" data-toggle="offcanvas"><?=$this->transEsc('navigate_back') ?></button>
 
-<h4><?=$this->transEsc('Your Account')?></h4>
+<h1><?=$this->transEsc('Your Account')?></h1>
 <?php /* finc needs to add .facet-group class and classes on sub items for borders - CK */ ?>
 <div class="myresearch-menu account-menu facet-group">
   <?php if ($this->userlist()->getMode() !== 'disabled'): ?>
diff --git a/themes/finc/templates/myresearch/mylist.phtml b/themes/finc/templates/myresearch/mylist.phtml
index 129b59cef2b9d8201da14d92c31fea6faad0bc40..c7ab5ac2b19d9f464742d54d3298ea867c2ffe70 100644
--- a/themes/finc/templates/myresearch/mylist.phtml
+++ b/themes/finc/templates/myresearch/mylist.phtml
@@ -32,7 +32,7 @@ $user = $this->auth()->isLoggedIn();
   <?php /* finc V5: toggler was missing, remove entire template (!) when fixed in BS3 theme - CK */ ?>
   <?=$this->render('RecordDriver/DefaultRecord/offcanvas-toggler-myresearch'); ?>
 
-  <h2><?=$list ? $this->escapeHtml($list->title) : $this->transEsc("Your Favorites")?></h2>
+  <h1><?=$list ? $this->escapeHtml($list->title) : $this->transEsc("Your Favorites")?></h1>
   <nav class="search-header hidden-print">
     <div class="search-stats">
       <?php if ($recordTotal > 0): ?>
diff --git a/themes/finc/templates/myresearch/profile.phtml b/themes/finc/templates/myresearch/profile.phtml
index 239d504c955bd4813252cf67a6ecad44964cc90c..990e46259ab7aa06d3b41d82eeb01816a16919cb 100644
--- a/themes/finc/templates/myresearch/profile.phtml
+++ b/themes/finc/templates/myresearch/profile.phtml
@@ -14,7 +14,7 @@ $arrTemplate = '<tr><th>%%LABEL%%:</th><td> %%VALUE%%</td></tr>';
   <?php /* finc V5: toggler was missing, remove entire template (!) when fixed in BS3 theme - CK */ ?>
   <?=$this->render('RecordDriver/DefaultRecord/offcanvas-toggler-myresearch'); ?>
 
-  <h2><?=$this->transEsc('Your Profile')?></h2>
+  <h1><?=$this->transEsc('Your Profile')?></h1>
   <?=$this->flashmessages();?>
 
   <table class="table table-striped">
diff --git a/themes/finc/templates/myresearch/storageretrievalrequests.phtml b/themes/finc/templates/myresearch/storageretrievalrequests.phtml
index 845eb7726bcddadc227b069ba04a581a5e1e74cc..11588df49a62990842f180eb6ec70de3379e2c14 100644
--- a/themes/finc/templates/myresearch/storageretrievalrequests.phtml
+++ b/themes/finc/templates/myresearch/storageretrievalrequests.phtml
@@ -11,7 +11,7 @@
   <?php /* finc V5: toggler was missing, remove entire template (!) when fixed in BS3 theme - CK */ ?>
   <?=$this->render('RecordDriver/DefaultRecord/offcanvas-toggler-myresearch'); ?>
 
-  <h2><?=$this->transEsc('Storage Retrieval Requests') ?></h2>
+  <h1><?=$this->transEsc('Storage Retrieval Requests') ?></h1>
 
   <?=$this->flashmessages()?>
 
diff --git a/themes/finc/templates/record/cart-buttons.phtml b/themes/finc/templates/record/cart-buttons.phtml
index 02c225d8ec57e3515b55551c2e3bd9df57d94568..1e8ba70357f029b5abb411755a070380dec49d3e 100644
--- a/themes/finc/templates/record/cart-buttons.phtml
+++ b/themes/finc/templates/record/cart-buttons.phtml
@@ -4,12 +4,12 @@
 
     <?php $cartId = $this->source . '|' . $this->id; ?>
     <span class="btn-bookbag-toggle" data-cart-id="<?=$this->escapeHtmlAttr($this->id)?>" data-cart-source="<?=$this->escapeHtmlAttr($this->source)?>">
-    <a class="cart-add hidden<?php if (!$cart->contains($cartId)): ?> correct<?php endif ?>">
+      <?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>
     </a>
-    <a class="cart-remove hidden<?php if ($cart->contains($cartId)): ?> correct<?php endif ?>">
-      <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>
+    <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>
     </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 db8796d6d737ccb540f2e6992dbbe5a008a163dd..35c7793efa121f56820a1141bfe88680dc4cc235 100644
--- a/themes/finc/templates/record/cover.phtml
+++ b/themes/finc/templates/record/cover.phtml
@@ -3,10 +3,10 @@
 <?php /* If you want to load covers in lightbox use .recordcover;
   the class .nocover prevents nocover images from loading in lightbox or can be used to hide the images */ ?>
 <?php if ($cover): ?>
-  <?php if ($this->link): ?><a href="<?=$this->escapeHtmlAttr($this->link)?>" data-lightbox-image><?php endif; ?>
+  <?php if ($this->link): ?><a href="<?=$this->escapeHtmlAttr($this->link)?>" data-lightbox-image aria-hidden="true"><?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 else: ?>
-  <img src="<?=$this->url('cover-unavailable')?>" <?php if ($linkPreview): ?>data-linkpreview="true" <?php endif; ?>class="nocover" alt="<?=$this->transEsc('No Cover Image')?>"/>
+  <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 endif; ?>
 <!-- finc: record - cover - END -->
diff --git a/themes/finc/templates/record/emailhold.phtml b/themes/finc/templates/record/emailhold.phtml
index c036a4a88af99110a148f8f832b61e6653e41a51..055704bd267bac7fd6c0c709bb8b3ace456785e6 100644
--- a/themes/finc/templates/record/emailhold.phtml
+++ b/themes/finc/templates/record/emailhold.phtml
@@ -8,7 +8,7 @@ $this->layout()->breadcrumbs = '<li>' . $this->searchMemory()->getLastSearchLink
   . '<li>' . $this->recordLink()->getBreadcrumb($this->driver) . '</li>'
   . '<li class="active">' . $this->transEsc('EmailHold::email_hold_place_text') . '</li>';
 ?>
-<h2><?=$this->transEsc('EmailHold::email_hold_place_text')?></h2>
+<h1><?=$this->transEsc('EmailHold::email_hold_place_text')?></h1>
 <?php if ($this->helpText): ?>
   <p class="helptext"><?=$this->helpText?></p>
 <?php endif; ?>
diff --git a/themes/finc/templates/record/pdaform.phtml b/themes/finc/templates/record/pdaform.phtml
index 440c1c275f57ea893e832e569c6fcc3de893b237..a7faa1f04c5d4fdb60d1075833acab13f2d9eb4f 100644
--- a/themes/finc/templates/record/pdaform.phtml
+++ b/themes/finc/templates/record/pdaform.phtml
@@ -8,7 +8,7 @@ $this->layout()->breadcrumbs = '<li>' . $this->searchMemory()->getLastSearchLink
   . '<li>' . $this->recordLink()->getBreadcrumb($this->driver) . '</li>'
   . '<li class="active">' . $this->transEsc('PDA::Acquisition') . '</li>';
 ?>
-<h2><?=$this->transEsc('PDA::Acquisition')?>: <span class="title-in-heading"><?=$this->escapeHtml($this->driver->getBreadcrumb())?></span></h2>
+<h1><?=$this->transEsc('PDA::Acquisition')?>: <span class="title-in-heading"><?=$this->escapeHtml($this->driver->getBreadcrumb())?></span></h1>
 <form method="post" name="acquisitionPDAForm" action="<?=$this->recordLink()->getActionUrl($this->driver, 'PDA')?>">
   <?=$this->flashmessages()?>
   <p>
diff --git a/themes/finc/templates/record/reporterrorsform.phtml b/themes/finc/templates/record/reporterrorsform.phtml
index 396ecd138f251ac17bc1eaeb8d3aa99382694d52..0a95d954819f47abef5a280749844c63d4525c2a 100644
--- a/themes/finc/templates/record/reporterrorsform.phtml
+++ b/themes/finc/templates/record/reporterrorsform.phtml
@@ -8,7 +8,7 @@ $this->layout()->breadcrumbs = '<li>' . $this->searchMemory()->getLastSearchLink
     . '<li>' . $this->recordLink()->getBreadcrumb($this->driver) . '</li>'
     . '<li class="active">' . $this->transEsc('ReportErrors') . '</li>';
 ?>
-<h2><?=$this->transEsc('ReportErrors') ?>: <?=$this->escapeHtml($this->truncate($this->driver->getShortTitle() . ' ' . $this->driver->getSubTitle(), 90))?></h2>
+<h1><?=$this->transEsc('ReportErrors') ?>: <?=$this->escapeHtml($this->truncate($this->driver->getShortTitle() . ' ' . $this->driver->getSubTitle(), 90))?></h1>
 <form name="reporterrors" method="post" action="<?=$this->recordLink()->getActionUrl($this->driver, 'ReportErrors')?>">
   <?=$this->flashmessages()?>
   <div class="form-group">
diff --git a/themes/finc/templates/search/advanced/layout.phtml b/themes/finc/templates/search/advanced/layout.phtml
index 56bb3e5dd32481331cb7a32f51253bd5614878d4..3e133f9d664b256ed67b61d27e2199c0fddbbbdd 100644
--- a/themes/finc/templates/search/advanced/layout.phtml
+++ b/themes/finc/templates/search/advanced/layout.phtml
@@ -76,7 +76,7 @@ if (isset($searchDetails) && is_object($searchDetails)) {
         <input type="hidden" name="sort" value="<?=$this->escapeHtmlAttr($lastSort)?>" />
       <?php endif; ?>
       <div class="clearfix">
-        <h2 class="pull-left flip"><?=$this->transEsc('Advanced Search')?></h2>
+        <h1 class="pull-left flip"><?=$this->transEsc('Advanced Search')?></h1>
         <div id="groupJoin" class="form-inline pull-right flip">
           <label for="groupJoinOptions"><?=$this->transEsc("search_match")?>:</label>
           <select id="groupJoinOptions" name="join" class="form-control">
@@ -87,7 +87,7 @@ if (isset($searchDetails) && is_object($searchDetails)) {
       </div>
       <?php /* finc: keep icon inside link for consistent functionality */ ?>
       <span id="groupPlaceHolder" class="hidden">
-        <a href="javascript:void(0);" onClick="addGroup();return false"><i class="fa fa-plus" aria-hidden="true"> </i> <?= $this->transEsc('add_search_group') ?></a>
+        <a href="javascript:void(0);" onClick="addGroup();return false" role="button"><i class="fa fa-plus" aria-hidden="true"> </i> <?= $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">
@@ -100,7 +100,7 @@ if (isset($searchDetails) && is_object($searchDetails)) {
             <?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">
@@ -112,7 +112,7 @@ if (isset($searchDetails) && is_object($searchDetails)) {
                         <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="javascript:void(0);" class="adv-term-remove hidden">&times;</a>
+                    <a href="javascript:void(0);" class="adv-term-remove hidden"><span class="sr-only"><?=$this->transEsc("remove")?></span><i class="fa fa-times" aria-hidden="true"></i></a>
                   </div>
                   <?php if($group == 0 && $search == 0): ?>
                     </div>
@@ -121,7 +121,7 @@ if (isset($searchDetails) && is_object($searchDetails)) {
                     */ ?>
                     <span class="float-left">
                       <span class="search_place_holder hidden" aria-hidden="true"></span>
-                      <a href="javascript:void(0);" class="add_search_link hidden">
+                      <a href="javascript:void(0);" class="add_search_link hidden" role="button">
                         <i class="fa fa-plus" aria-hidden="true"></i> <?=$this->transEsc("add_search")?></a>
                     </span>
                   <?php endif; ?>
@@ -135,7 +135,7 @@ if (isset($searchDetails) && is_object($searchDetails)) {
                   <option value="NOT"<?php if(isset($setSearchGroups[$group]) && 'NOT' == $setSearchGroups[$group]):?> selected<?php endif;?>><?=$this->transEsc("search_NOT")?></option>
                 </select>
               </div>
-              <a href="javascript:void(0);" class="adv-group-close hidden"><i class="fa fa-close"></i> <?=$this->transEsc("del_search")?></a>
+              <a href="javascript:void(0);" class="adv-group-close hidden" role="button"><i class="fa fa-close"></i> <?=$this->transEsc("del_search")?></a>
             </div>
             <?php if($group == 0): ?>
               </div>
@@ -164,7 +164,7 @@ if (isset($searchDetails) && is_object($searchDetails)) {
         <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"/>
@@ -180,7 +180,7 @@ if (isset($searchDetails) && is_object($searchDetails)) {
           </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/finc/templates/search/history.phtml b/themes/finc/templates/search/history.phtml
index c7b90af1e981305550957d4e3c7d711accf436d5..121c1c7262aba9f052de0b4ab3d474029da0dafa 100644
--- a/themes/finc/templates/search/history.phtml
+++ b/themes/finc/templates/search/history.phtml
@@ -16,7 +16,7 @@
 
   <?=$this->flashmessages()?>
   <?php if ($saveSupported && !empty($this->saved)): ?>
-    <h2><?=$this->transEsc("history_saved_searches")?></h2>
+    <h1><?=$this->transEsc("history_saved_searches")?></h1>
     <?=$this->context()->renderInContext('search/history-table.phtml', ['showSaved' => true]);?>
   <?php endif; ?>
 
diff --git a/themes/finc/templates/search/home.phtml b/themes/finc/templates/search/home.phtml
index 6177b1ce73ee389e2e59b8236f0279a6d8d576ea..50b8751fe6f6a5b8f40b07a68235f96b0879eb06 100644
--- a/themes/finc/templates/search/home.phtml
+++ b/themes/finc/templates/search/home.phtml
@@ -15,6 +15,7 @@ $this->layout()->breadcrumbs = false;
 ?>
 
 <div class="searchHomeContent">
+  <h1><?=$this->transEsc("LibraryName")?></h1>
 <?php /* finc: Activate search box below if you want the old look -- otherwise we keep the consistent look with searchbox in header */ ?>
   <?php /*
   <?=$this->context($this)->renderInContext("search/searchbox.phtml", ['ignoreHiddenFilterMemory' => true])?>
diff --git a/themes/finc/templates/search/results.phtml b/themes/finc/templates/search/results.phtml
index 49db910d2280c332c90a02ef4ade30869253827f..3b68185ad5b07a1849e618f4a83b37e5de818597 100644
--- a/themes/finc/templates/search/results.phtml
+++ b/themes/finc/templates/search/results.phtml
@@ -62,7 +62,7 @@ $this->headScript()->appendFile("check_save_statuses.js");
     <?php endif; ?>
     <?=$this->flashmessages()?>
     <?php /* finc: remove 'hidden' below to show search-stats; we also hide the entire bar on xs + sm - CK */ ?>
-    <nav class="search-header hidden-print">
+    <div class="search-header hidden-print">
       <div class="search-stats">
         <?php /* finc: use spans for easier to show/hide choices - CK */ ?>
         <?php if ($recordTotal > 0): ?>
@@ -93,7 +93,7 @@ $this->headScript()->appendFile("check_save_statuses.js");
         </span>
       </div>
     <?php endif; ?>
-  </nav>
+  </div>
   <?php /* End Listing Options */ ?>
 
   <?php if ($recordTotal < 1): ?>
diff --git a/themes/finc/templates/search/searchbox.phtml b/themes/finc/templates/search/searchbox.phtml
index de089ef016d20764bce9ea2c8fd54a0bb7b6a986..e578f0ea4c45c1e55ecccf3d89861255a341dd68 100644
--- a/themes/finc/templates/search/searchbox.phtml
+++ b/themes/finc/templates/search/searchbox.phtml
@@ -65,10 +65,10 @@ $hiddenFilterParams = $this->searchTabs()->getCurrentHiddenFilterParams($this->s
         <input type="hidden" name="type" value="<?=$this->escapeHtmlAttr($handlers[0]['value'])?>"/>
       <?php endif; ?>
       <li>
-        <button type="submit" class="btn btn-primary"><i class="fa fa-search" aria-hidden="true"></i> <span class="find-label"><?=$this->transEsc("Find")?></span></button>
+        <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>
       </li>
       <?php if ($advSearch): ?>
-        <li class="hidden-xs">
+        <li>
           <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>
         </li>
       <?php endif; ?>