diff --git a/.env.local b/.env.local
new file mode 100644
index 0000000000000000000000000000000000000000..9f83decc5ccf9dc1eb3c66814b75ebf3a2c60f56
--- /dev/null
+++ b/.env.local
@@ -0,0 +1,13 @@
+# Dependencies for grunt task (scss => css)
+GRUNT_SASS=^3.1.0
+JIT_GRUNT=^0.10.0
+NODE_SASS=^7.0.1
+
+# Dependencies for composer task (loads files for vendor): composer1 | composer2
+COMPOSER_VERSION=composer1
+
+# Version for php in PHP container: php7_2 | php8_0
+PHP_VERSION=php7_2
+
+# Version for database in db container: mariadb_10_3 | mariadb_10_11
+DB_VERSION=mariadb_10_3
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index e4470733f05d64cf9b1ef79bc6efc2d8872bba0b..41716f3023ade14790878b5d3d18136dc5d11631 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,5 +33,8 @@ themes/boss/
 themes/finc-dbis/
 themes/vufind-results-grouping/
 themes/worldcat/
+**/compiled.css.map
+**/print.css
+themes/*/css
 module/finc/tests/selenium/vendor/
 module/finc/tests/selenium/logs/
\ No newline at end of file
diff --git a/Gruntfile.js b/Gruntfile.js
index 07ed2f91640615e709111118ff8b6b2f46c0cd50..0c867c09ee2d69b27f7834bd9ceb56c3fc3015ee 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -1,3 +1,4 @@
+const sass = require('node-sass');
 module.exports = function(grunt) {
   const fs = require("fs");
 
@@ -149,7 +150,7 @@ module.exports = function(grunt) {
               order: 4
             },
             { // Inline &:extends converted
-              pattern: /&:extend\(([^\)]+)\)/gi,
+              pattern: /&:extend\(([^\)]+?)( all)?\)/gi,
               replacement: '@extend $1',
               order: 4
             },
@@ -183,7 +184,9 @@ module.exports = function(grunt) {
         tasks: ['lessdev']
       },
       scss: {
-        files: 'themes/*/scss/**/*.scss',
+        // finc-specific exclude sandal and bootprint theme, we don't use it in finc
+        files: ['themes/*/scss/**/*.scss', '!themes/sandal/scss/**/*.scss', '!themes/bootprint3/scss/**/*.scss'],
+        // finc-specific - END
         tasks: ['scss']
       }
     }
@@ -218,9 +221,16 @@ module.exports = function(grunt) {
      * Define mapping of input (scss) to output files (css) for following sass task
      */
     for (var i in themeList) {
+      // finc-specific exclude sandal and bootprint theme, we don't use it in finc
+      if (themeList[i] === 'sandal' || themeList[i] === 'bootprint3') {
+        continue;
+      }
+      // finc-specific - END
       var config = {
         options: {
-          outputStyle: 'compressed'
+          outputStyle: 'compressed',
+          implementation: sass,
+          sourceMap: true
         },
         files: [{
           expand: true,
diff --git a/composer.json b/composer.json
index 501b78036c118becc67533614b9ffef14e69a4f9..db42315cf38decd4af085c072b21261fba4f98a1 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,11 @@
         "platform": {
             "php": "7.2"
         },
-        "process-timeout": 0
+        "process-timeout": 0,
+        "allow-plugins": {
+            "laminas/laminas-dependency-plugin": true,
+            "wikimedia/composer-merge-plugin": true
+        }
     },
     "require": {
         "php": ">=7.2",
diff --git a/composer.lock b/composer.lock
index b3e8b3f15843df2921fabf06a33c1127700d7333..515c3b0e78785225bd59bec3d378522f4e9862fe 100644
--- a/composer.lock
+++ b/composer.lock
@@ -3075,6 +3075,14 @@
                 "resources",
                 "translations"
             ],
+            "support": {
+                "chat": "https://laminas.dev/chat",
+                "docs": "https://docs.laminas.dev/laminas-i18n-resources/",
+                "forum": "https://discourse.laminas.dev",
+                "issues": "https://github.com/laminas/laminas-i18n-resources/issues",
+                "rss": "https://github.com/laminas/laminas-i18n-resources/releases.atom",
+                "source": "https://github.com/laminas/laminas-i18n-resources"
+            },
             "time": "2019-12-31T17:11:35+00:00"
         },
         {
@@ -6455,6 +6463,11 @@
                 "jCard",
                 "vCard"
             ],
+            "support": {
+                "forum": "https://groups.google.com/group/sabredav-discuss",
+                "issues": "https://github.com/sabre-io/vobject/issues",
+                "source": "https://github.com/fruux/sabre-vobject"
+            },
             "time": "2016-10-07T03:20:40+00:00"
         },
         {
@@ -6836,6 +6849,9 @@
             ],
             "description": "Symfony Filesystem Component",
             "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/filesystem/tree/v3.4.47"
+            },
             "time": "2020-10-24T10:57:07+00:00"
         },
         {
diff --git a/devops/docker/composer/Dockerfile b/devops/docker/composer1/Dockerfile
similarity index 100%
rename from devops/docker/composer/Dockerfile
rename to devops/docker/composer1/Dockerfile
diff --git a/devops/docker/composer/entrypoint.sh b/devops/docker/composer1/entrypoint.sh
similarity index 100%
rename from devops/docker/composer/entrypoint.sh
rename to devops/docker/composer1/entrypoint.sh
diff --git a/devops/docker/composer2/Dockerfile b/devops/docker/composer2/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..f17777c477a159266f5f047d470584416e90e474
--- /dev/null
+++ b/devops/docker/composer2/Dockerfile
@@ -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
+
+FROM composer:2.5.8
+RUN apk add --no-cache freetype-dev libxml2-dev icu-dev \
+    && docker-php-ext-install gd \
+    && docker-php-ext-install soap \
+    && docker-php-ext-install intl
\ No newline at end of file
diff --git a/devops/docker/composer2/entrypoint.sh b/devops/docker/composer2/entrypoint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..041fc1a907e5feb803525fbf0ec759506f6c143c
--- /dev/null
+++ b/devops/docker/composer2/entrypoint.sh
@@ -0,0 +1,34 @@
+#!/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
+
+if [ "$(whoami)" = "php" ]; then
+  mkdir -p "$COMPOSER_HOME"
+  exec /docker-entrypoint.sh "$@"
+  exit
+fi
+
+until ! (ping -c1 env >/dev/null 2>&1) && [ -f ./data/docker/env/composer ]; do :; done
+set -a; . ./data/docker/env/composer; set +a
+
+composer --version
+
+: "${UIDGID:=$(stat -c '%u' .):$(stat -c '%g' .)}"
+echo "php:x:$UIDGID:php:$(pwd):/bin/sh" >> /etc/passwd
+chown "$UIDGID" "$(command -v composer)"
+su -p -c "exec $0 $*" php
\ No newline at end of file
diff --git a/devops/docker/db/mariadb_10_11/Dockerfile b/devops/docker/db/mariadb_10_11/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..8a4b1e5ecf7d3aad0a9a6ee19427d666da88a7d5
--- /dev/null
+++ b/devops/docker/db/mariadb_10_11/Dockerfile
@@ -0,0 +1,19 @@
+# Copyright (C) 2023 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 mariadb:10.11.5
\ No newline at end of file
diff --git a/devops/docker/db/entrypoint.sh b/devops/docker/db/mariadb_10_11/entrypoint.sh
similarity index 87%
rename from devops/docker/db/entrypoint.sh
rename to devops/docker/db/mariadb_10_11/entrypoint.sh
index 168bb590f52fe4830dbfef5134481a9fe9c68e25..8be1f15524b89bf8d6a9b6638a28e322142a24b3 100755
--- a/devops/docker/db/entrypoint.sh
+++ b/devops/docker/db/mariadb_10_11/entrypoint.sh
@@ -18,6 +18,12 @@
 # @license https://opensource.org/licenses/GPL-3.0 GNU GPLv3
 
 until ! (ping -c1 env >/dev/null 2>&1) && [ -f ./data/docker/env/db ]; do :; done
+while ! grep -q MYSQL_ROOT_PASSWORD ./data/docker/env/db
+do
+    echo "wait for MYSQL_ROOT_PASSWORD"
+    sleep 1
+done
 set -a; . ./data/docker/env/db; set +a
 
+echo "set up db"
 exec docker-entrypoint.sh "$@"
\ No newline at end of file
diff --git a/devops/docker/db/mariadb_10_3/Dockerfile b/devops/docker/db/mariadb_10_3/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..ac070a85ff23d2f500ba5880575a1f5a9833ab9d
--- /dev/null
+++ b/devops/docker/db/mariadb_10_3/Dockerfile
@@ -0,0 +1,19 @@
+# Copyright (C) 2023 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 mariadb:10.3.17
\ No newline at end of file
diff --git a/devops/docker/db/mariadb_10_3/entrypoint.sh b/devops/docker/db/mariadb_10_3/entrypoint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..8be1f15524b89bf8d6a9b6638a28e322142a24b3
--- /dev/null
+++ b/devops/docker/db/mariadb_10_3/entrypoint.sh
@@ -0,0 +1,29 @@
+#!/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) && [ -f ./data/docker/env/db ]; do :; done
+while ! grep -q MYSQL_ROOT_PASSWORD ./data/docker/env/db
+do
+    echo "wait for MYSQL_ROOT_PASSWORD"
+    sleep 1
+done
+set -a; . ./data/docker/env/db; set +a
+
+echo "set up db"
+exec docker-entrypoint.sh "$@"
\ No newline at end of file
diff --git a/devops/docker/env/entrypoint.sh b/devops/docker/env/entrypoint.sh
index d623d231f24177d753340bc6d484c817144d338c..f0d0a9bbce2653f09e992fe158fd7161e92b72d6 100755
--- a/devops/docker/env/entrypoint.sh
+++ b/devops/docker/env/entrypoint.sh
@@ -15,20 +15,16 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 # @author  Sebastian Kehr <kehr@ub.uni-leipzig.de>
+# @author  Robert Lange <lange@ub.uni-leipzig.de>
 # @license https://opensource.org/licenses/GPL-3.0 GNU GPLv3
 
+apk update && apk add jq
+
 # Taken from http://www.etalabs.net/sh_tricks.html
 quote () { printf %s\\n "$1" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/'/" ; }
-
-if ! [ "$(whoami)" = "dev" ]; then
-  : "${UIDGID:=$(stat -c '%u' .):$(stat -c '%g' .)}"
-  echo "dev:x:$UIDGID:dev:$(pwd):/bin/sh" >> /etc/passwd
-  su -p -c "exec $0 $*" dev
-  exit
-fi
-
 mkdir -p "${DIR=data/docker/env}"
 
+# create files from docker-env.*.yml in data/docker/env
 # shellcheck disable=SC2046
 JSON=$(spruce merge $(find docker-env.*.yml) | spruce json)
 for KEY in $(echo "$JSON" | jq -r 'keys | join(" ")'); do
@@ -37,4 +33,16 @@ for KEY in $(echo "$JSON" | jq -r 'keys | join(" ")'); do
     VAL=$(echo "$JSON" | jq -r ".\"$KEY\".\"$VAR\"")
     echo "$VAR=$(quote "$VAL")" >> "$FILE"
   done
-done
\ No newline at end of file
+done
+
+# change owner to user dev if not already
+# to write files not as root
+if ! [ "$(whoami)" = "dev" ]; then
+  : "${UIDGID:=$(stat -c '%u' .):$(stat -c '%g' .)}"
+  echo "dev:x:$UIDGID:dev:$(pwd):/bin/sh" >> /etc/passwd
+  #su -p -c "exec $0 $*" dev
+  chown "$UIDGID" data
+  chown "$UIDGID" data/docker
+  chown -R "$UIDGID" "${DIR}"
+fi
+exit
\ No newline at end of file
diff --git a/devops/docker/grunt/Dockerfile b/devops/docker/grunt/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..03490f4c8ba11ef51b417d283f733e04ea09befb
--- /dev/null
+++ b/devops/docker/grunt/Dockerfile
@@ -0,0 +1,20 @@
+# 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  Robert Lange <lange@ub.uni-leipzig.de>
+# @license https://opensource.org/licenses/GPL-3.0 GNU GPLv3
+
+FROM node:19.9.0-alpine
+RUN apk --no-cache --update add git python3 openssh alpine-sdk
diff --git a/devops/docker/grunt/entrypoint.sh b/devops/docker/grunt/entrypoint.sh
index b2ca391b650a42c36fbf0e3417bd28e143843a99..eb69e0e55a1dda49dd6dae23cdc00b43ed6dbcd0 100755
--- a/devops/docker/grunt/entrypoint.sh
+++ b/devops/docker/grunt/entrypoint.sh
@@ -30,7 +30,7 @@ term_grunt () {
 
 if [ "$(whoami)" = "node" ]; then
   mkdir -p "$HOME"
-  PREFIX="$HOME" npm install
+  PREFIX="$HOME" npm install grunt-sass@${GRUNT_SASS:-3.1.0} jit-grunt@${JIT_GRUNT:-0.10.0} node-sass@${NODE_SASS:-7.0.3} grunt-contrib-watch@1.1.0 --no-shrinkwrap --no-save
   node_modules/.bin/grunt "$@"
   exit
 fi
diff --git a/devops/docker/httpd/Dockerfile b/devops/docker/httpd/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..400eb4270e093026e2aeff1b815a14cc288b2660
--- /dev/null
+++ b/devops/docker/httpd/Dockerfile
@@ -0,0 +1,40 @@
+FROM httpd:2.4
+#ENTRYPOINT [ "/docker-entrypoint" ]
+CMD ["apache2ctl", "-D", "FOREGROUND"]
+
+ENV SHIB_HANDLER_URL=/Shibboleth.sso \
+	APACHE_RUN_DIR=/var/run/apache2 \
+	APACHE_RUN_USER=www-data \
+	APACHE_RUN_GROUP=www-data \
+	APACHE_DOC_ROOT=/var/www/html
+
+ADD assets/*.conf /etc/apache2/conf-available/
+
+#RUN chmod a+x /docker-entrypoint \
+RUN apt-get update \
+	&& apt-get install -y --no-install-recommends openssl apache2 \
+	&& openssl genrsa -out /etc/ssl/private/ssl-cert-snakeoil.key 2048 \
+  #https://stackoverflow.com/questions/63195304/difference-between-pem-crt-key-files#:~:text=According%20to%20this%20answer%2C.crt%20keeps%20a%20signed%20certificate%2C,a%20key%2C%20certificate%2C...%29%20is%20Base64%20encoded.%20%E2%80%93%20Wolfson
+	&& openssl req -nodes -new -x509 -newkey rsa:2048 -subj "/CN=localhost" -keyout /etc/ssl/certs/ssl-vufind.key -out /etc/ssl/certs/ssl-vufind.crt -days 3650 \
+	&& apt-get purge -y openssl \
+	&& apt-get autoremove -y --purge \
+	&& sed -e 's!^\(ErrorLog\).*$!\1 /proc/self/fd/2!' -i /etc/apache2/apache2.conf \
+	&& sed -e 's!^\(PidFile.*\)$!#\1!' -i /etc/apache2/apache2.conf \
+	&& sed -e 's!/var/www/html!${APACHE_DOC_ROOT}!g' -i /etc/apache2/sites-available/000-default.conf \
+	&& sed -e 's!^\(\s*ErrorLog\).*$!\1 /proc/self/fd/2!' -i /etc/apache2/sites-available/000-default.conf \
+	&& sed -e 's!^\(\s*CustomLog\).*$!\1 /proc/self/fd/1 combined!' -i /etc/apache2/sites-available/000-default.conf \
+	&& sed -e 's!/var/www/html!${APACHE_DOC_ROOT}!g' -i /etc/apache2/sites-available/default-ssl.conf \
+	&& sed -e 's!^\(\s*ErrorLog\).*$!\1 /proc/self/fd/2!' -i /etc/apache2/sites-available/default-ssl.conf \
+	&& sed -e 's!^\(\s*CustomLog\).*$!\1 /proc/self/fd/1 combined!' -i /etc/apache2/sites-available/default-ssl.conf \
+  && a2disconf serve-cgi-bin other-vhosts-access-log \
+	&& a2enmod rewrite proxy_fcgi \
+  && a2enmod ssl \
+	&& a2enconf debug ssl \
+	&& rm -r /var/lib/apt/lists/*
+
+ENV BASE_PATH="" \
+	FCGI_TARGET="php:9000"
+
+ADD vufind.conf /etc/apache2/sites-available/vufind.conf
+
+RUN a2ensite vufind
\ No newline at end of file
diff --git a/devops/docker/httpd/assets/debug.conf b/devops/docker/httpd/assets/debug.conf
new file mode 100644
index 0000000000000000000000000000000000000000..a0425c0ce818a5b9a3670555c506b2d43ee98a0c
--- /dev/null
+++ b/devops/docker/httpd/assets/debug.conf
@@ -0,0 +1,3 @@
+<IfDefine debug>
+  ProxyTimeout 3600
+</IfDefine>
diff --git a/devops/docker/httpd/assets/ssl.conf b/devops/docker/httpd/assets/ssl.conf
new file mode 100644
index 0000000000000000000000000000000000000000..4118c8c591ee847ba3c2552f47d39723968c22c3
--- /dev/null
+++ b/devops/docker/httpd/assets/ssl.conf
@@ -0,0 +1,6 @@
+<IfDefine ssl>
+  LoadModule socache_shmcb_module /usr/lib/apache2/modules/mod_socache_shmcb.so
+  LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so
+  IncludeOptional mods-available/ssl.conf
+  Listen 443
+</IfDefine>
diff --git a/devops/docker/httpd/vufind.conf b/devops/docker/httpd/vufind.conf
new file mode 100644
index 0000000000000000000000000000000000000000..5f112bfa61e520d1e9dcdaa806a6c3871ae4d132
--- /dev/null
+++ b/devops/docker/httpd/vufind.conf
@@ -0,0 +1,79 @@
+# vufind.conf for finc development
+<FilesMatch \.php$>
+  SetHandler "proxy:fcgi://${FCGI_TARGET}"
+</FilesMatch>
+
+# Configuration for theme-specific resources:
+AliasMatch ^${BASE_PATH}/themes/([0-9a-zA-Z-_]*)/css/(.*)$ /usr/local/vufind/themes/$1/css/$2
+AliasMatch ^${BASE_PATH}/themes/([0-9a-zA-Z-_]*)/images/(.*)$ /usr/local/vufind/themes/$1/images/$2
+AliasMatch ^${BASE_PATH}/themes/([0-9a-zA-Z-_]*)/js/(.*)$ /usr/local/vufind/themes/$1/js/$2
+<Directory ~ "^/usr/local/vufind/themes/([0-9a-zA-Z-_]*)/(css|images|js)/">
+  <IfModule !mod_authz_core.c>
+    Order allow,deny
+    Allow from all
+  </IfModule>
+  <IfModule mod_authz_core.c>
+    Require all granted
+  </IfModule>
+  AllowOverride All
+</Directory>
+
+# Configuration for public cache (used for asset pipeline minification)
+AliasMatch ^${BASE_PATH}/cache/(.*)$ /var/cache/vufind/public/$1
+<Directory /var/cache/vufind/public/>
+  <IfModule !mod_authz_core.c>
+    Order allow,deny
+    Allow from all
+  </IfModule>
+  <IfModule mod_authz_core.c>
+    Require all granted
+  </IfModule>
+  AllowOverride All
+</Directory>
+
+# Configuration for general VuFind base:
+Alias ${BASE_PATH}/ /usr/local/vufind/public/
+<Directory /usr/local/vufind/public/>
+  <IfModule !mod_authz_core.c>
+    Order allow,deny
+    Allow from all
+  </IfModule>
+  <IfModule mod_authz_core.c>
+    Require all granted
+  </IfModule>
+  AllowOverride All
+
+  # If you wish to use the Shibboleth authentication, uncomment the following lines
+  # AND comment out the "Require all granted" line above. There must not be any other
+  # "Require" lines in this configuration section for the "Require shibboleth"
+  # directive to be effective.
+  #AuthType shibboleth
+  #Require shibboleth
+</Directory>
+
+<Location ${BASE_PATH}/>
+  RewriteEngine On
+#  RewriteBase ${BASE_PATH}/
+
+  RewriteCond %{REQUEST_FILENAME} -s [OR]
+  RewriteCond %{REQUEST_FILENAME} -l [OR]
+  RewriteCond %{REQUEST_FILENAME} -d
+  RewriteRule ^.*$ - [NC,L]
+  RewriteRule ^.*$ index.php [NC,L]
+
+</Location>
+
+# Having a configured shibboleth-handler
+<Location ${SHIB_HANDLER_URL}>
+  RewriteEngine On
+  RewriteRule .* - [L]
+</Location>
+
+<VirtualHost *:443>
+   ServerName localhost
+   DocumentRoot /usr/local/vufind/public/
+
+   SSLEngine on
+   SSLCertificateFile /etc/ssl/certs/ssl-vufind.crt
+   SSLCertificateKeyFile /etc/ssl/certs/ssl-vufind.key
+</VirtualHost>
\ No newline at end of file
diff --git a/devops/docker/php/Dockerfile b/devops/docker/php7_2/Dockerfile
similarity index 100%
rename from devops/docker/php/Dockerfile
rename to devops/docker/php7_2/Dockerfile
diff --git a/devops/docker/php/entrypoint.sh b/devops/docker/php7_2/entrypoint.sh
similarity index 100%
rename from devops/docker/php/entrypoint.sh
rename to devops/docker/php7_2/entrypoint.sh
diff --git a/devops/docker/php/php.ini b/devops/docker/php7_2/php.ini
similarity index 100%
rename from devops/docker/php/php.ini
rename to devops/docker/php7_2/php.ini
diff --git a/devops/docker/php8_0/Dockerfile b/devops/docker/php8_0/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..361d18e935ce8c245e201288e6e05807cba27be3
--- /dev/null
+++ b/devops/docker/php8_0/Dockerfile
@@ -0,0 +1,39 @@
+# Copyright (C) 2023  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:8.0-fpm-alpine
+RUN apk add --no-cache $PHPIZE_DEPS freetype-dev libxml2-dev icu-dev libxslt-dev \
+    && pecl install xdebug-3.0.0 \
+    && docker-php-ext-enable xdebug \
+    && docker-php-ext-install mysqli \
+    && docker-php-ext-install pdo_mysql \
+    && docker-php-ext-install soap \
+    && docker-php-ext-install intl \
+    && docker-php-ext-install dom \
+    && docker-php-ext-install xsl
+
+RUN apk add --no-cache \
+        libjpeg-turbo-dev \
+        libpng-dev \
+        libwebp-dev \
+        freetype-dev
+
+RUN docker-php-ext-configure gd --with-jpeg --with-webp --with-freetype
+RUN docker-php-ext-install gd
+
+COPY php.ini /usr/local/etc/php/conf.d/php.ini
\ No newline at end of file
diff --git a/devops/docker/php8_0/entrypoint.sh b/devops/docker/php8_0/entrypoint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..927b845f7d11d2f22a194b0751fbeb40957722d7
--- /dev/null
+++ b/devops/docker/php8_0/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) && [ -f ./data/docker/env/php ]; do :; done
+set -a; . ./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/php8_0/php.ini b/devops/docker/php8_0/php.ini
new file mode 100644
index 0000000000000000000000000000000000000000..36c1f7030eb4e49c4c15bf9c1582926ca3d81579
--- /dev/null
+++ b/devops/docker/php8_0/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.mode=debug
+xdebug.start_with_request=yes
+xdebug.remote_handler=dbgp
+xdebug.discover_client_host=1
+xdebug.client_port=9000
+short_open_tag=Off;
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
index 1e244e2e990973150e01e4285d8a08590ca324d8..b7ac4f464b3130889c1942eef6d4cda8a8912d23 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -2,14 +2,14 @@ version: '2.4'
 
 services:
   env:
-    image: linkyard/yaml:1.1.1
+    image: governmentpaas/spruce:826b547c6411b0fd22ac0b07bde11eed5523879c
     volumes:
       - .:/usr/local/vufind:rw
     working_dir: /usr/local/vufind
     entrypoint: ["devops/docker/env/entrypoint.sh"]
 
   composer:
-    build: devops/docker/composer
+    build: devops/docker/${COMPOSER_VERSION:-composer1}
     working_dir: /usr/local/vufind
     volumes:
       - .:/usr/local/vufind:rw
@@ -17,31 +17,33 @@ services:
       - $HOME/.ssh/known_hosts:/etc/ssh/ssh_known_hosts
     depends_on:
       - env
-    entrypoint: ["devops/docker/composer/entrypoint.sh"]
+    entrypoint: devops/docker/${COMPOSER_VERSION:-composer1}/entrypoint.sh
     command: ["install"]
 
   php:
-    build: devops/docker/php
+    build: devops/docker/${PHP_VERSION:-php7_2}
     working_dir: /usr/local/vufind
     volumes:
       - ./:/usr/local/vufind
     depends_on:
       - env
       - db
-    entrypoint: ["devops/docker/php/entrypoint.sh"]
+    entrypoint: devops/docker/${PHP_VERSION:-php7_2}/entrypoint.sh
     command: ["php-fpm"]
 
   httpd:
-    image: ubleipzig/vufind-httpd:2.4-5
+    build: devops/docker/httpd
     ports:
       - 127.0.0.1:${HTTPD_PORT:-11100}:80
+      - 127.0.0.1:${HTTPD_PORT:-11105}:443
     volumes:
       - ./:/usr/local/vufind:ro
     depends_on:
       - php
+    tty: true
 
   db:
-    image: mariadb:10.3.17
+    build: devops/docker/db/${DB_VERSION:-mariadb_10_3}
     ports:
       - 127.0.0.1:${DB_PORT:-11101}:3306
     working_dir: /usr/local/vufind
@@ -50,7 +52,8 @@ services:
       - db-data:/var/lib/mysql
     depends_on:
       - env
-    entrypoint: ["devops/docker/db/entrypoint.sh"]
+      - autoconfig
+    entrypoint: devops/docker/db/${DB_VERSION:-mariadb_10_3}/entrypoint.sh
     command: [
       "mysqld",
       "--character-set-server=utf8mb4",
@@ -72,14 +75,16 @@ services:
     command: ["run"]
 
   grunt:
-    image: node:7.10.1-slim
+    build: devops/docker/grunt
     working_dir: /usr/local/vufind
     volumes:
       - ./:/usr/local/vufind:rw
     depends_on:
       - env
+      - composer
+    env_file: .env
     entrypoint: ["devops/docker/grunt/entrypoint.sh"]
-    command: ["watch"]
+    command: ["watch:scss"]
 
   autoconfig:
     image: node:7.10.1-alpine
@@ -88,7 +93,6 @@ services:
       - ./:/usr/local/vufind:rw
     depends_on:
       - env
-      - db
     entrypoint: ["devops/docker/autoconfig/entrypoint.sh"]
     command: ["vufind", "deploy"]
 
diff --git a/fid/languages/de.ini b/fid/languages/de.ini
index 4815f041c6afcd2bc6b8f2c12489dc36b969514c..ed4424a97a0d8691b735f64bf189665fc732293c 100644
--- a/fid/languages/de.ini
+++ b/fid/languages/de.ini
@@ -139,7 +139,7 @@ Antiquarian Booksellers Association of America = "<span lang="en">Antiquarian Bo
 UNESCO Atlas of the Worlds Languages in Danger = "<span lang="en">UNESCO Atlas of the Worlds Languages in Danger</span>"
 Cyberabstracts = "<span lang="en">Cyberabstracts</span>"
 TextGrid Repository = "<span lang="en">TextGrid Repository</span>"
-Basel Register of Thesauri, Ontologies & Classifications = "<span lang=""en>Basel Register of Thesauri, Ontologies & Classifications</span>"
+Basel Register of Thesauri, Ontologies & Classifications = "<span lang="en">Basel Register of Thesauri, Ontologies & Classifications</span>"
 Statcounter GlobalStats = "<span lang="en">Statcounter GlobalStats</span>"
 Oxyrhynchus Online = "<span lang="en">Oxyrhynchus Online</span>"
 Norske Bøker 1519–1850 : Bibliografi = "<span lang="no">Norske Bøker 1519-1850 : Bibliografi</span>"
@@ -161,150 +161,150 @@ FactGrid : a Database for Historians = "<span lang="en">FactGrid : a Database fo
 E-LIS : E-Prints in Library and Information Science = "<span lang="en">E-LIS : E-Prints in Library and Information Science</span>"
 
 # 'Translated' Sources
-British Library Catalogue (Profil FID BBI) = "<span lang="en">British Library Catalogue (Profil FID BBI)</span>"
-Australian and New Zealand Student Services Association Inc. (CrossRef) = "<span lang="en">Australian and New Zealand Student Services Association Inc. (CrossRef)</span>"
-Open Grey (OG) = "<span lang="en">Open Grey (OG)</span>"
-University of Michigan Press (CrossRef) = "<span lang="en">University of Michigan Press (CrossRef)</span>"
-IGI Global (CrossRef) = "<span lang="en">IGI Global (CrossRef)</span>"
-Journal of Critical Library and Information Studies = "<span lang="en">Journal of Critical Library and Information Studies</span>"
-Springer Publishing Company (CrossRef) = "<span lang="en">Springer Publishing Company (CrossRef)</span>"
-University of Pennsylvania Press (CrossRef) = "<span lang="en">University of Pennsylvania Press (CrossRef)</span>"
-Brill Academic Publishers (CrossRef) = "<span lang="en">Brill Academic Publishers (CrossRef)</span>"
-Stuttgart Media University: HdM ePub = "<span lang="en">Stuttgart Media University: HdM ePub</span>"
-John Benjamins Publishing Company (CrossRef) = "<span lang="en">John Benjamins Publishing Company (CrossRef)</span>"
-IOS Press (CrossRef) = "<span lang="en">IOS Press (CrossRef)</span>"
-Institutional Repository of Leibniz Universität Hannover = "<span lang="en">Institutional Repository of Leibniz Universität Hannover</span>"
-Practical Academic Librarianship: The International Journal of the SLA Academic Division (Texas Digital Library - TDL E-Journals) = "<span lang="en">Practical Academic Librarianship: The International Journal of the SLA Academic Division (Texas Digital Library - TDL E-Journals)</span>"
-Stellenbosch University (CrossRef) = "<span lang="en">Stellenbosch University (CrossRef)</span>"
-Dokumentenrepositorium der RUB / RUB-Repository (Ruhr-Universität Bochum) = "Dokumentenrepositorium der RUB / <span lang="en">RUB-Repository (Ruhr-Universität Bochum)</span>"
-American Library Association (CrossRef) = "<span lang="en">American Library Association (CrossRef)</span>"
-University of Toronto Press (CrossRef) = "<span lang="en">University of Toronto Press (CrossRef)</span>"
-Universidad Complutense de Madrid (UCM) (CrossRef) = "<span lang="es">Universidad Complutense de Madrid (UCM)/span> (CrossRef)<"
-World Scientific Pub Co Pte Lt (CrossRef) = "<span lang="en">World Scientific Pub Co Pte Lt (CrossRef)</span>"
-Center for Open Science - Open Science Framework (Preprints) = "<span lang="en">Center for Open Science - Open Science Framework (Preprints)</span>"
-Association for Information Systems (CrossRef) = "<span lang="en">Association for Information Systems (CrossRef)</span>"
-CAIRN (CrossRef) = "<span lang="en">CAIRN (CrossRef)</span>"
-University of Malaya Press (CrossRef) = "<span lang="en">University of Malaya Press (CrossRef)</span>"
-Springer Lecture Notes Archiv 1964-1996 = "<span lang="en">Springer Lecture Notes Archiv 1964-1996</span>"
-JSTOR (CrossRef) = "<span lang="en">JSTOR (CrossRef)</span>"
-Imprensa da Universidade de Coimbra (CrossRef) = "<span lang="es">Imprensa da Universidade de Coimbra</span> (CrossRef)"
-Croatian Library Association (CrossRef) = "<span lang="en">Croatian Library Association (CrossRef)</span>"
-TH Köln: ePublications = "<span lang="en">TH Köln: ePublications</span>"
-University Library System, University of Pittsburgh (CrossRef) = "<span lang="en">University Library System, University of Pittsburgh (CrossRef)</span>"
-British Library Catalogue = "<span lang="en">British Library Catalogue</span>"
-Hamburg University of Applied Sciences (HAW): Publications = "<span lang="en">Hamburg University of Applied Sciences (HAW): Publications</span>"
-Crossref = "<span lang="en">Crossref</span>"
-Informa UK Limited (CrossRef) = "<span lang="en">Informa UK Limited (CrossRef)</span>"
-Cambridge University Press (CrossRef) = "<span lang="en">Cambridge University Press (CrossRef)</span>"
-University of Guelph (CrossRef) = "<span lang="en">University of Guelph (CrossRef)</span>"
-perspectivia.net - The publication platform of the Max Weber Foundation = "<span lang="en">perspectivia.net - The publication platform of the Max Weber Foundation</span>"
-International Journal of Librarianship = "<span lang="en">International Journal of Librarianship</span>"
-Institute of Electrical & Electronics Engineers (IEEE) (CrossRef) = "<span lang="en">Institute of Electrical & Electronics Engineers (IEEE) (CrossRef)</span>"
-Nature Publishing Group (CrossRef) = "<span lang="en">Nature Publishing Group (CrossRef)</span>"
-TH Köln: Cologne Open Science = "<span lang="en">TH Köln: Cologne Open Science</span>"
-Canadian Health Libraries Association (CrossRef) = "<span lang="en">Canadian Health Libraries Association (CrossRef)</span>"
-San José State University: SJSU ScholarWorks = "<span lang="en">San José State University: SJSU ScholarWorks</span>"
-Editorial Universidad de Sevilla (CrossRef) = "<span lang="es">Editorial Universidad de Sevilla</span> (CrossRef)"
-EPI SCP (El Profesional de la Informacion) (CrossRef) = "<span lang="es">EPI SCP (El Profesional de la Informacion)</span> (CrossRef)"
-Johns Hopkins University Press (CrossRef) = "<span lang="en">Johns Hopkins University Press (CrossRef)</span>"
-E-LIS: Eprints in Library and Information Science = "<span lang="en">E-LIS: Eprints in Library and Information Science</span>"
-Directory of Open Access Journals: DOAJ Articles = "<span lang="en">Directory of Open Access Journals: DOAJ Articles</span>"
-Journal of Data and Information Science (CrossRef) = "<span lang="en">Journal of Data and Information Science (CrossRef)</span>"
-Bibliothèque nationale de France (BnF): Gallica = "<span lang="fr">Bibliothèque nationale de France (BnF): Gallica</span>"
-University and Research Librarians' Association (CrossRef) = "<span lang="en">University and Research Librarians' Association (CrossRef)</span>"
-Informing Science Institute (CrossRef) = "<span lang="en">Informing Science Institute (CrossRef)</span>"
-The Pennsylvania State University Press (CrossRef) = "<span lang="en">The Pennsylvania State University Press (CrossRef)</span>"
-Levy Library Press (CrossRef) = "<span lang="en">Levy Library Press (CrossRef)</span>"
-Inderscience Publishers (CrossRef) = "<span lang="en">Inderscience Publishers (CrossRef)</span>"
-The Haworth Press (CrossRef) = "<span lang="en">The Haworth Press (CrossRef)</span>"
-University of Potsdam: publish.UP = "<span lang="en">University of Potsdam: publish.UP</span>"
-Pontificia Universidad Catolica de Chile (CrossRef) = "<span lang="es">Pontificia Universidad Catolica de Chile</span> (CrossRef)"
-Springer Nature (CrossRef) = "<span lang="en">Springer Nature (CrossRef)</span>"
-Enssib: Bibliothèque Numérique (École Nationale Supérieure des Sciences de l'Information et des Bibliothèques) = "<span lang="fr">Enssib: Bibliothèque Numérique (École Nationale Supérieure des Sciences de l'Information et des Bibliothèques)</span>"
-John Rylands University Library (CrossRef) = "<span lang="en">John Rylands University Library (CrossRef)</span>"
-Harrassowitz Publishing House (CrossRef) = "<span lang="en">Harrassowitz Publishing House (CrossRef)</span>"
-Hathi Trust = "<span lang="en">Hathi Trust</span>"
-IGI Global InfoSci Journals Archive 2000 - 2015 = "<span lang="en">IGI Global InfoSci Journals Archive 2000 - 2015</span>"
-BASE Bielefeld Academic Search Engine = "<span lang="en">BASE Bielefeld Academic Search Engine</span>"
-University of Konstanz: Konstanz Online Publication Server (KOPS) = "<span lang="en">University of Konstanz: Konstanz Online Publication Server (KOPS)</span>"
-Directory of Open Access Books (DOAB) = "<span lang="en">Directory of Open Access Books (DOAB)</span>"
-NeuroQuantology Journal (CrossRef) = "<span lang="en">NeuroQuantology Journal (CrossRef)</span>"
-University of Chicago Press (CrossRef) = "<span lang="en">University of Chicago Press (CrossRef)</span>"
-Travesía - recursos digitales para la cooperación bibliotecaria (Ministerio del Cultura) = "<span lang="es">Travesía - recursos digitales para la cooperación bibliotecaria (Ministerio del Cultura)</span>"
-Eighteenth Century Collections Online / ECCO = "<span lang="en">Eighteenth Century Collections Online / ECCO</span>"
-Institute of Information Science, IZUM (CrossRef) = "<span lang="en">Institute of Information Science, IZUM (CrossRef)</span>"
-Universidad Nacional Autónoma de México (CrossRef) = "<span lang="es">Universidad Nacional Autónoma de México</span> (CrossRef)"
-Association of Austrian Librarians (CrossRef) = "<span lang="en">Association of Austrian Librarians (CrossRef)</span>"
-Addleton Academic Publishers (CrossRef) = "<span lang="en">Addleton Academic Publishers (CrossRef)</span>"
-McFarland and Company, Inc., Publishers (CrossRef) = "<span lang="en">McFarland and Company, Inc., Publishers (CrossRef)</span>"
-American Library Association Institutional Repository (ALAIR) = "<span lang="en">American Library Association Institutional Repository (ALAIR)</span>"
-Hildesheim University: HilDok = "<span lang="en">Hildesheim University: HilDok</span>"
-Cologne University: KUPS = "<span lang="en">Cologne University: KUPS</span>"
-Eberhard Karls University Tübingen: Publication System = "<span lang="en">Eberhard Karls University Tübingen: Publication System</span>"
-PubPub (CrossRef) = "<span lang="en">PubPub (CrossRef)</span>"
-The International Academic Forum (IAFOR) (CrossRef) = "<span lang="en">The International Academic Forum (IAFOR) (CrossRef)</span>"
-Academic Publishing House Researcher (CrossRef) = "<span lang="en">Academic Publishing House Researcher (CrossRef)</span>"
-Universidad de Antioquia (CrossRef) = "<span lang="es">Universidad de Antioquia</span> (CrossRef)"
-Figshare = "<span lang="en">Figshare</span>"
-British National Bibliography (Profil FID BBI) = "<span lang="en">British National Bibliography</span> (Profil FID BBI)"
-PubMed Central (PMC) = "<span lang="en">PubMed Central (PMC)</span>"
-Universidade Federal de Santa Catarina (UFSC) (CrossRef) = "<span lang="es">Universidade Federal de Santa Catarina (UFSC)</span> (CrossRef)"
-CILIP Information Literacy Group (CrossRef) = "<span lang="en">CILIP Information Literacy Group (CrossRef)</span>"
-University of Edinburgh: Edinburgh Research Archive (ERA) = "<span lang="en">University of Edinburgh: Edinburgh Research Archive (ERA)</span>"
-Journal of Radical Librarianship = "<span lang="en">Journal of Radical Librarianship</span>"
-Institute for Operations Research and the Management Sciences (INFORMS) (CrossRef) = "<span lang="en">Institute for Operations Research and the Management Sciences (INFORMS) (CrossRef)</span>"
-Institute of Information and Book Studies, University of Warsaw: Digital Library of Book Studies / Instytut Informacji Naukowej i Studiów Bibliologicznych UW, Bibliologiczna Biblioteka Cyfrowa = "<span lang="en">Institute of Information and Book Studies, University of Warsaw: Digital Library of Book Studies</span> / <span lang="pl">Instytut Informacji Naukowej i Studiów Bibliologicznych UW, Bibliologiczna Biblioteka Cyfrowa</span>"
-JLIS.it (Italian Journal of Library, Archives, and Information Science / Rivista italiana di biblioteconomia, archivistica e scienza dell'informazione) = "<span lang="en">JLIS.it (Italian Journal of Library, Archives, and Information Science</span> / <span lang="it">Rivista italiana di biblioteconomia, archivistica e scienza dell'informazione)</span>"
-Nanyang Technological Univ (CrossRef) = "<span lang="en">Nanyang Technological Univ (CrossRef)</span>"
-Tomsk State University (CrossRef) = "<span lang="en">Tomsk State University (CrossRef)</span>"
-British National Bibliography = "<span lang=""en>British National Bibliography</span>"
-EManuscript Services (CrossRef) = "<span lang="en">EManuscript Services (CrossRef)</span>"
-Türk Kütüphaneciliği / Turkish Librarianship (Turkish Librarians’ Association) = "<span lang="tr">Türk Kütüphaneciliği</span> / <span lang="en">TTurkish Librarianship (Turkish Librarians’ Association)</span>"
-Coimbra University Press (CrossRef) = "<span lang="en">Coimbra University Press (CrossRef)</span>"
-Edinburgh University (CrossRef) = "<span lang="en">Edinburgh University (CrossRef)</span>"
-Ubiquity Press, Ltd. (CrossRef) = "<span lang="en">Ubiquity Press, Ltd. (CrossRef)</span>"
-Bilgi Dünyası / Information World (E-Journal, University and Research Librarians Association, UNAK) = "<span lang="tr">Bilgi Dünyası</span> / <span lang="en">Information World (E-Journal, University and Research Librarians Association, UNAK)</span>"
-Defence Scientific Information and Documentation Centre (CrossRef) = "<span lang="en">Defence Scientific Information and Documentation Centre (CrossRef)</span>"
-OpenEdition (CrossRef) = "<span lang="en">OpenEdition (CrossRef)</span>"
-MDPI AG (CrossRef) = "<span lang="en">MDPI AG (CrossRef)</span>"
-Vilnius University Press (CrossRef) = "<span lang="en">Vilnius University Press (CrossRef)</span>"
-Wiley-Blackwell (CrossRef) = "<span lang="en">Wiley-Blackwell (CrossRef)</span>"
-Brepols Publishers NV (CrossRef) = "<span lang="en">Brepols Publishers NV (CrossRef)</span>"
-Publicações BAD (Bibliotecários, Arquivistas e Documentalistas - E-Journals) = "<span lang="pt">Publicações BAD (Bibliotecários, Arquivistas e Documentalistas - E-Journals)</span>"
-Ruhr-Universität Bochum (RUB): Dissertations and Theses = "Ruhr-Universität Bochum (RUB): <span lang="en">Dissertations and Theses</span>"
-Manchester University Press (CrossRef) = "<span lang="en">Manchester University Press (CrossRef)</span>"
-DataCite Metadata Store (German National Library of Science and Technology) = "<span lang="en">DataCite Metadata Store (German National Library of Science and Technology)</span>"
-Medical Library Association (CrossRef) = "<span lang="en">Medical Library Association (CrossRef)</span>"
-National Taiwan University (CrossRef) = "<span lang=en"">National Taiwan University (CrossRef)</span>"
-Common Ground Research Networks (CrossRef) = "<span lang="en">Common Ground Research Networks (CrossRef)</span>"
-Ediciones Profesionales de la Informacion SL (CrossRef) = "<span lang="es">Ediciones Profesionales de la Informacion SL (CrossRef)</span>"
-027.7 Zeitschrift für Bibliothekskultur / Journal for Library Culture = "027.7 Zeitschrift für Bibliothekskultur / <span lang="en">Journal for Library Culture</span>"
-African Journals Online (AJOL) (CrossRef) = "<span lang="en">African Journals Online (AJOL) (CrossRef)</span>"
-Portland State University Library (CrossRef) = "<span lang="en">Portland State University Library (CrossRef)</span>"
-Masaryk University Press (CrossRef) = "<span lang="en">Masaryk University Press (CrossRef)</span>"
-Universidade Estadual de Campinas (CrossRef) = "<span lang="es">Universidade Estadual de Campinas</span> (CrossRef)"
-Directory of Open Access Journals: DOAJ Journals = "<span lang="en">Directory of Open Access Journals: DOAJ Journals</span>"
-Journal of Digital Information (Texas Digital Library - TDL E-Journals) = "<span lang="en">Journal of Digital Information (Texas Digital Library - TDL E-Journals)</span>"
-Emerald (CrossRef) = "<span lang="en">Emerald (CrossRef)</span>"
-Penn State Press c/o Project Muse (CrossRef) = "<span lang="en">Penn State Press c/o Project Muse (CrossRef)</span>"
-University of Regensburg Publication Server = "<span lang="en">University of Regensburg Publication Server</span>"
-International Journal of Information Science and Management (IJISM) = "<span lang="en">International Journal of Information Science and Management (IJISM)</span>"
-Society of American Archivists (CrossRef) = "<span lang="en">Society of American Archivists (CrossRef)</span>"
-Library Leadership & Management (Texas Digital Library - TDL E-Journals) = "<span lang="en">Library Leadership & Management (Texas Digital Library - TDL E-Journals)</span>"
-Universidad de Alicante Servicio de Publicaciones (CrossRef) = "<span lang="es">Universidad de Alicante Servicio de Publicaciones </span>(CrossRef)"
-o-bib (E-Journal, VDB - The Association of German Librarians) = "<span lang="en">o-bib (E-Journal, VDB - The Association of German Librarians)</span>"
-Oxford University Press (OUP) (CrossRef) = "<span lang="en">Oxford University Press (OUP) (CrossRef)</span>"
-SAGE Publications (CrossRef) = "<span lang="en">SAGE Publications (CrossRef)</span>"
-Science Alert (CrossRef) = "<span lang="en">Science Alert (CrossRef)</span>"
-Open Access Repository of the TH Wildau = "<span lang="en">Open Access Repository of the TH Wildau</span>"
-University of Alberta (CrossRef) = "<span lang="en">University of Alberta (CrossRef)</span>"
-Liverpool University Press (CrossRef) = "<span lang="en">Liverpool University Press (CrossRef)</span>"
-Openings: Studies in Book Art (E-Journal) = "<span lang="en">Openings: Studies in Book Art (E-Journal)</span>"
-Taylor & Francis (CrossRef) = "<span lang="en">Taylor & Francis (CrossRef)</span>"
-University of Texas Press (CrossRef) = "<span lang="en">University of Texas Press (CrossRef)</span>"
-Bamberg University: OPUS Publication Server = "<span lang="en">Bamberg University: OPUS Publication Server</span>"
-Brill / Book Sales Catalogues Online = "<span lang="en">Brill / Book Sales Catalogues Online</span>"
-Book History Online = "<span lang="en">Book History Online</span>"
-Palgrave Macmillan (CrossRef) = "<span lang="en">Palgrave Macmillan (CrossRef)</span>"
-Natural Sciences Publishing (CrossRef) = "<span lang="en">Natural Sciences Publishing (CrossRef)</span>"
-OPUS FAU - Online publication system of Friedrich-Alexander-Universität Erlangen-Nürnberg = "<span lang="en">OPUS FAU - Online publication system of </span>Friedrich-Alexander-Universität Erlangen-Nürnberg"
+British Library Catalogue (Profil FID BBI) = <span lang="en">British Library Catalogue (Profil FID BBI)</span>
+Australian and New Zealand Student Services Association Inc. (CrossRef) = <span lang="en">Australian and New Zealand Student Services Association Inc. (CrossRef)</span>
+Open Grey (OG) = <span lang="en">Open Grey (OG)</span>
+University of Michigan Press (CrossRef) = <span lang="en">University of Michigan Press (CrossRef)</span>
+IGI Global (CrossRef) = <span lang="en">IGI Global (CrossRef)</span>
+Journal of Critical Library and Information Studies = <span lang="en">Journal of Critical Library and Information Studies</span>
+Springer Publishing Company (CrossRef) = <span lang="en">Springer Publishing Company (CrossRef)</span>
+University of Pennsylvania Press (CrossRef) = <span lang="en">University of Pennsylvania Press (CrossRef)</span>
+Brill Academic Publishers (CrossRef) = <span lang="en">Brill Academic Publishers (CrossRef)</span>
+Stuttgart Media University: HdM ePub = <span lang="en">Stuttgart Media University: HdM ePub</span>
+John Benjamins Publishing Company (CrossRef) = <span lang="en">John Benjamins Publishing Company (CrossRef)</span>
+IOS Press (CrossRef) = <span lang="en">IOS Press (CrossRef)</span>
+Institutional Repository of Leibniz Universität Hannover = <span lang="en">Institutional Repository of Leibniz Universität Hannover</span>
+Practical Academic Librarianship: The International Journal of the SLA Academic Division (Texas Digital Library - TDL E-Journals) = <span lang="en">Practical Academic Librarianship: The International Journal of the SLA Academic Division (Texas Digital Library - TDL E-Journals)</span>
+Stellenbosch University (CrossRef) = <span lang="en">Stellenbosch University (CrossRef)</span>
+Dokumentenrepositorium der RUB / RUB-Repository (Ruhr-Universität Bochum) = Dokumentenrepositorium der RUB / <span lang="en">RUB-Repository (Ruhr-Universität Bochum)</span>
+American Library Association (CrossRef) = <span lang="en">American Library Association (CrossRef)</span>
+University of Toronto Press (CrossRef) = <span lang="en">University of Toronto Press (CrossRef)</span>
+Universidad Complutense de Madrid (UCM) (CrossRef) = <span lang="es">Universidad Complutense de Madrid (UCM)</span> (CrossRef)
+World Scientific Pub Co Pte Lt (CrossRef) = <span lang="en">World Scientific Pub Co Pte Lt (CrossRef)</span>
+Center for Open Science - Open Science Framework (Preprints) = <span lang="en">Center for Open Science - Open Science Framework (Preprints)</span>
+Association for Information Systems (CrossRef) = <span lang="en">Association for Information Systems (CrossRef)</span>
+CAIRN (CrossRef) = <span lang="en">CAIRN (CrossRef)</span>
+University of Malaya Press (CrossRef) = <span lang="en">University of Malaya Press (CrossRef)</span>
+Springer Lecture Notes Archiv 1964-1996 = <span lang="en">Springer Lecture Notes Archiv 1964-1996</span>
+JSTOR (CrossRef) = <span lang="en">JSTOR (CrossRef)</span>
+Imprensa da Universidade de Coimbra (CrossRef) = <span lang="es">Imprensa da Universidade de Coimbra</span> (CrossRef)
+Croatian Library Association (CrossRef) = <span lang="en">Croatian Library Association (CrossRef)</span>
+TH Köln: ePublications = <span lang="en">TH Köln: ePublications</span>
+University Library System, University of Pittsburgh (CrossRef) = <span lang="en">University Library System, University of Pittsburgh (CrossRef)</span>
+British Library Catalogue = <span lang="en">British Library Catalogue</span>
+Hamburg University of Applied Sciences (HAW): Publications = <span lang="en">Hamburg University of Applied Sciences (HAW): Publications</span>
+Crossref = <span lang="en">Crossref</span>
+Informa UK Limited (CrossRef) = <span lang="en">Informa UK Limited (CrossRef)</span>
+Cambridge University Press (CrossRef) = <span lang="en">Cambridge University Press (CrossRef)</span>
+University of Guelph (CrossRef) = <span lang="en">University of Guelph (CrossRef)</span>
+perspectivia.net - The publication platform of the Max Weber Foundation = <span lang="en">perspectivia.net - The publication platform of the Max Weber Foundation</span>
+International Journal of Librarianship = <span lang="en">International Journal of Librarianship</span>
+Institute of Electrical & Electronics Engineers (IEEE) (CrossRef) = <span lang="en">Institute of Electrical & Electronics Engineers (IEEE) (CrossRef)</span>
+Nature Publishing Group (CrossRef) = <span lang="en">Nature Publishing Group (CrossRef)</span>
+TH Köln: Cologne Open Science = <span lang="en">TH Köln: Cologne Open Science</span>
+Canadian Health Libraries Association (CrossRef) = <span lang="en">Canadian Health Libraries Association (CrossRef)</span>
+San José State University: SJSU ScholarWorks = <span lang="en">San José State University: SJSU ScholarWorks</span>
+Editorial Universidad de Sevilla (CrossRef) = <span lang="es">Editorial Universidad de Sevilla</span> (CrossRef)
+EPI SCP (El Profesional de la Informacion) (CrossRef) = <span lang="es">EPI SCP (El Profesional de la Informacion)</span> (CrossRef)
+Johns Hopkins University Press (CrossRef) = <span lang="en">Johns Hopkins University Press (CrossRef)</span>
+E-LIS: Eprints in Library and Information Science = <span lang="en">E-LIS: Eprints in Library and Information Science</span>
+Directory of Open Access Journals: DOAJ Articles = <span lang="en">Directory of Open Access Journals: DOAJ Articles</span>
+Journal of Data and Information Science (CrossRef) = <span lang="en">Journal of Data and Information Science (CrossRef)</span>
+Bibliothèque nationale de France (BnF): Gallica = <span lang="fr">Bibliothèque nationale de France (BnF): Gallica</span>
+University and Research Librarians' Association (CrossRef) = <span lang="en">University and Research Librarians' Association (CrossRef)</span>
+Informing Science Institute (CrossRef) = <span lang="en">Informing Science Institute (CrossRef)</span>
+The Pennsylvania State University Press (CrossRef) = <span lang="en">The Pennsylvania State University Press (CrossRef)</span>
+Levy Library Press (CrossRef) = <span lang="en">Levy Library Press (CrossRef)</span>
+Inderscience Publishers (CrossRef) = <span lang="en">Inderscience Publishers (CrossRef)</span>
+The Haworth Press (CrossRef) = <span lang="en">The Haworth Press (CrossRef)</span>
+University of Potsdam: publish.UP = <span lang="en">University of Potsdam: publish.UP</span>
+Pontificia Universidad Catolica de Chile (CrossRef) = <span lang="es">Pontificia Universidad Catolica de Chile</span> (CrossRef)
+Springer Nature (CrossRef) = <span lang="en">Springer Nature (CrossRef)</span>
+Enssib: Bibliothèque Numérique (École Nationale Supérieure des Sciences de l'Information et des Bibliothèques) = <span lang="fr">Enssib: Bibliothèque Numérique (École Nationale Supérieure des Sciences de l'Information et des Bibliothèques)</span>
+John Rylands University Library (CrossRef) = <span lang="en">John Rylands University Library (CrossRef)</span>
+Harrassowitz Publishing House (CrossRef) = <span lang="en">Harrassowitz Publishing House (CrossRef)</span>
+Hathi Trust = <span lang="en">Hathi Trust</span>
+IGI Global InfoSci Journals Archive 2000 - 2015 = <span lang="en">IGI Global InfoSci Journals Archive 2000 - 2015</span>
+BASE Bielefeld Academic Search Engine = <span lang="en">BASE Bielefeld Academic Search Engine</span>
+University of Konstanz: Konstanz Online Publication Server (KOPS) = <span lang="en">University of Konstanz: Konstanz Online Publication Server (KOPS)</span>
+Directory of Open Access Books (DOAB) = <span lang="en">Directory of Open Access Books (DOAB)</span>
+NeuroQuantology Journal (CrossRef) = <span lang="en">NeuroQuantology Journal (CrossRef)</span>
+University of Chicago Press (CrossRef) = <span lang="en">University of Chicago Press (CrossRef)</span>
+Travesía - recursos digitales para la cooperación bibliotecaria (Ministerio del Cultura) = <span lang="es">Travesía - recursos digitales para la cooperación bibliotecaria (Ministerio del Cultura)</span>
+Eighteenth Century Collections Online / ECCO = <span lang="en">Eighteenth Century Collections Online / ECCO</span>
+Institute of Information Science, IZUM (CrossRef) = <span lang="en">Institute of Information Science, IZUM (CrossRef)</span>
+Universidad Nacional Autónoma de México (CrossRef) = <span lang="es">Universidad Nacional Autónoma de México</span> (CrossRef)
+Association of Austrian Librarians (CrossRef) = <span lang="en">Association of Austrian Librarians (CrossRef)</span>
+Addleton Academic Publishers (CrossRef) = <span lang="en">Addleton Academic Publishers (CrossRef)</span>
+McFarland and Company, Inc., Publishers (CrossRef) = <span lang="en">McFarland and Company, Inc., Publishers (CrossRef)</span>
+American Library Association Institutional Repository (ALAIR) = <span lang="en">American Library Association Institutional Repository (ALAIR)</span>
+Hildesheim University: HilDok = <span lang="en">Hildesheim University: HilDok</span>
+Cologne University: KUPS = <span lang="en">Cologne University: KUPS</span>
+Eberhard Karls University Tübingen: Publication System = <span lang="en">Eberhard Karls University Tübingen: Publication System</span>
+PubPub (CrossRef) = <span lang="en">PubPub (CrossRef)</span>
+The International Academic Forum (IAFOR) (CrossRef) = <span lang="en">The International Academic Forum (IAFOR) (CrossRef)</span>
+Academic Publishing House Researcher (CrossRef) = <span lang="en">Academic Publishing House Researcher (CrossRef)</span>
+Universidad de Antioquia (CrossRef) = <span lang="es">Universidad de Antioquia</span> (CrossRef)
+Figshare = <span lang="en">Figshare</span>
+British National Bibliography (Profil FID BBI) = <span lang="en">British National Bibliography</span> (Profil FID BBI)
+PubMed Central (PMC) = <span lang="en">PubMed Central (PMC)</span>
+Universidade Federal de Santa Catarina (UFSC) (CrossRef) = <span lang="es">Universidade Federal de Santa Catarina (UFSC)</span> (CrossRef)
+CILIP Information Literacy Group (CrossRef) = <span lang="en">CILIP Information Literacy Group (CrossRef)</span>
+University of Edinburgh: Edinburgh Research Archive (ERA) = <span lang="en">University of Edinburgh: Edinburgh Research Archive (ERA)</span>
+Journal of Radical Librarianship = <span lang="en">Journal of Radical Librarianship</span>
+Institute for Operations Research and the Management Sciences (INFORMS) (CrossRef) = <span lang="en">Institute for Operations Research and the Management Sciences (INFORMS) (CrossRef)</span>
+Institute of Information and Book Studies, University of Warsaw: Digital Library of Book Studies / Instytut Informacji Naukowej i Studiów Bibliologicznych UW, Bibliologiczna Biblioteka Cyfrowa = <span lang="en">Institute of Information and Book Studies, University of Warsaw: Digital Library of Book Studies</span> / <span lang="pl">Instytut Informacji Naukowej i Studiów Bibliologicznych UW, Bibliologiczna Biblioteka Cyfrowa</span>
+JLIS.it (Italian Journal of Library, Archives, and Information Science / Rivista italiana di biblioteconomia, archivistica e scienza dell'informazione) = <span lang="en">JLIS.it (Italian Journal of Library, Archives, and Information Science</span> / <span lang="it">Rivista italiana di biblioteconomia, archivistica e scienza dell'informazione)</span>
+Nanyang Technological Univ (CrossRef) = <span lang="en">Nanyang Technological Univ (CrossRef)</span>
+Tomsk State University (CrossRef) = <span lang="en">Tomsk State University (CrossRef)</span>
+British National Bibliography = <span lang="en">British National Bibliography</span>
+EManuscript Services (CrossRef) = <span lang="en">EManuscript Services (CrossRef)</span>
+Türk Kütüphaneciliği / Turkish Librarianship (Turkish Librarians’ Association) = <span lang="tr">Türk Kütüphaneciliği</span> / <span lang="en">TTurkish Librarianship (Turkish Librarians’ Association)</span>
+Coimbra University Press (CrossRef) = <span lang="en">Coimbra University Press (CrossRef)</span>
+Edinburgh University (CrossRef) = <span lang="en">Edinburgh University (CrossRef)</span>
+Ubiquity Press, Ltd. (CrossRef) = <span lang="en">Ubiquity Press, Ltd. (CrossRef)</span>
+Bilgi Dünyası / Information World (E-Journal, University and Research Librarians Association, UNAK) = <span lang="tr">Bilgi Dünyası</span> / <span lang="en">Information World (E-Journal, University and Research Librarians Association, UNAK)</span>
+Defence Scientific Information and Documentation Centre (CrossRef) = <span lang="en">Defence Scientific Information and Documentation Centre (CrossRef)</span>
+OpenEdition (CrossRef) = <span lang="en">OpenEdition (CrossRef)</span>
+MDPI AG (CrossRef) = <span lang="en">MDPI AG (CrossRef)</span>
+Vilnius University Press (CrossRef) = <span lang="en">Vilnius University Press (CrossRef)</span>
+Wiley-Blackwell (CrossRef) = <span lang="en">Wiley-Blackwell (CrossRef)</span>
+Brepols Publishers NV (CrossRef) = <span lang="en">Brepols Publishers NV (CrossRef)</span>
+Publicações BAD (Bibliotecários, Arquivistas e Documentalistas - E-Journals) = <span lang="pt">Publicações BAD (Bibliotecários, Arquivistas e Documentalistas - E-Journals)</span>
+Ruhr-Universität Bochum (RUB): Dissertations and Theses = "Ruhr-Universität Bochum (RUB): <span lang="en">Dissertations and Theses</span>
+Manchester University Press (CrossRef) = <span lang="en">Manchester University Press (CrossRef)</span>
+DataCite Metadata Store (German National Library of Science and Technology) = <span lang="en">DataCite Metadata Store (German National Library of Science and Technology)</span>
+Medical Library Association (CrossRef) = <span lang="en">Medical Library Association (CrossRef)</span>
+National Taiwan University (CrossRef) = <span lang="en">National Taiwan University (CrossRef)</span>
+Common Ground Research Networks (CrossRef) = <span lang="en">Common Ground Research Networks (CrossRef)</span>
+Ediciones Profesionales de la Informacion SL (CrossRef) = <span lang="es">Ediciones Profesionales de la Informacion SL (CrossRef)</span>
+027.7 Zeitschrift für Bibliothekskultur / Journal for Library Culture = 027.7 Zeitschrift für Bibliothekskultur / <span lang="en">Journal for Library Culture</span>
+African Journals Online (AJOL) (CrossRef) = <span lang="en">African Journals Online (AJOL) (CrossRef)</span>
+Portland State University Library (CrossRef) = <span lang="en">Portland State University Library (CrossRef)</span>
+Masaryk University Press (CrossRef) = <span lang="en">Masaryk University Press (CrossRef)</span>
+Universidade Estadual de Campinas (CrossRef) = <span lang="es">Universidade Estadual de Campinas</span> (CrossRef)
+Directory of Open Access Journals: DOAJ Journals = <span lang="en">Directory of Open Access Journals: DOAJ Journals</span>
+Journal of Digital Information (Texas Digital Library - TDL E-Journals) = <span lang="en">Journal of Digital Information (Texas Digital Library - TDL E-Journals)</span>
+Emerald (CrossRef) = <span lang="en">Emerald (CrossRef)</span>
+Penn State Press c/o Project Muse (CrossRef) = <span lang="en">Penn State Press c/o Project Muse (CrossRef)</span>
+University of Regensburg Publication Server = <span lang="en">University of Regensburg Publication Server</span>
+International Journal of Information Science and Management (IJISM) = <span lang="en">International Journal of Information Science and Management (IJISM)</span>
+Society of American Archivists (CrossRef) = <span lang="en">Society of American Archivists (CrossRef)</span>
+Library Leadership & Management (Texas Digital Library - TDL E-Journals) = <span lang="en">Library Leadership & Management (Texas Digital Library - TDL E-Journals)</span>
+Universidad de Alicante Servicio de Publicaciones (CrossRef) = <span lang="es">Universidad de Alicante Servicio de Publicaciones </span>(CrossRef)
+o-bib (E-Journal, VDB - The Association of German Librarians) = <span lang="en">o-bib (E-Journal, VDB - The Association of German Librarians)</span>
+Oxford University Press (OUP) (CrossRef) = <span lang="en">Oxford University Press (OUP) (CrossRef)</span>
+SAGE Publications (CrossRef) = <span lang="en">SAGE Publications (CrossRef)</span>
+Science Alert (CrossRef) = <span lang="en">Science Alert (CrossRef)</span>
+Open Access Repository of the TH Wildau = <span lang="en">Open Access Repository of the TH Wildau</span>
+University of Alberta (CrossRef) = <span lang="en">University of Alberta (CrossRef)</span>
+Liverpool University Press (CrossRef) = <span lang="en">Liverpool University Press (CrossRef)</span>
+Openings: Studies in Book Art (E-Journal) = <span lang="en">Openings: Studies in Book Art (E-Journal)</span>
+Taylor & Francis (CrossRef) = <span lang="en">Taylor & Francis (CrossRef)</span>
+University of Texas Press (CrossRef) = <span lang="en">University of Texas Press (CrossRef)</span>
+Bamberg University: OPUS Publication Server = <span lang="en">Bamberg University: OPUS Publication Server</span>
+Brill / Book Sales Catalogues Online = <span lang="en">Brill / Book Sales Catalogues Online</span>
+Book History Online = <span lang="en">Book History Online</span>
+Palgrave Macmillan (CrossRef) = <span lang="en">Palgrave Macmillan (CrossRef)</span>
+Natural Sciences Publishing (CrossRef) = <span lang="en">Natural Sciences Publishing (CrossRef)</span>
+OPUS FAU - Online publication system of Friedrich-Alexander-Universität Erlangen-Nürnberg = <span lang="en">OPUS FAU - Online publication system of </span>Friedrich-Alexander-Universität Erlangen-Nürnberg
diff --git a/local/config/vufind/facets.ini b/local/config/vufind/facets.ini
index ebe013d173f1e99b142856191be59598522e85cc..31a37c6a4959641e9e3a3015d3c2447c34823eed 100644
--- a/local/config/vufind/facets.ini
+++ b/local/config/vufind/facets.ini
@@ -116,6 +116,11 @@ dateRange[] = publishDateSort
 ; language files appropriately.
 ;
 ; Leave the section empty if you do not need checkbox facets.
+
+[SpecialFacetsDisplaySettings]
+; finc: dispaly always date range values, even if no preselection is made by user
+dateRangeShowAlways = false
+
 [CheckboxFacets]
 ;edition:1st* = "First Edition"     ; Contrived hypothetical example
 
diff --git a/module/fid/src/Controller/CustomTraits/FidAcquisitionTrait.php b/module/fid/src/Controller/CustomTraits/FidAcquisitionTrait.php
index 05070f93c58d6d4b071c54bd008219e032e637fc..b0b475fca03b277b03f998d7d65ddda97983f2c3 100644
--- a/module/fid/src/Controller/CustomTraits/FidAcquisitionTrait.php
+++ b/module/fid/src/Controller/CustomTraits/FidAcquisitionTrait.php
@@ -65,7 +65,7 @@ trait FidAcquisitionTrait
     protected $type;
 
     /**
-     * ZendForm form configuration assigned in module.config.php
+     * LaminasForm form configuration assigned in module.config.php
      *
      * @var string
      */
diff --git a/module/fid/src/Helper/TranslatorDelegator.php b/module/fid/src/Helper/TranslatorDelegator.php
index d63177de76504e54937da876bad70db9afc6b66a..948e2b9185675854f7280ffc95c5d3adf088ea50 100644
--- a/module/fid/src/Helper/TranslatorDelegator.php
+++ b/module/fid/src/Helper/TranslatorDelegator.php
@@ -28,7 +28,7 @@
 namespace fid\Helper;
 
 use Psr\Container\ContainerInterface;
-use Zend\I18n\Translator\Resources;
+use Laminas\I18n\Translator\Resources;
 
 /**
  * Translator Delegator
diff --git a/module/fid/src/View/Helper/Root/FormLabel.php b/module/fid/src/View/Helper/Root/FormLabel.php
index 659885ca41bcff20b0ee29e6258e5b9891294e18..80cc907a2f9b2ed47ed30c4ea815999311017a87 100644
--- a/module/fid/src/View/Helper/Root/FormLabel.php
+++ b/module/fid/src/View/Helper/Root/FormLabel.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Zend Form Label View Helper
+ * Laminas Form Label View Helper
  *
  * Copyright (C) 2019 Leipzig University Library
  *
@@ -33,7 +33,7 @@ use Laminas\Form\ElementInterface;
 use Laminas\Form\View\Helper\FormLabel as Base;
 
 /**
- * Improved Zend Form Label View Helper by adding attributes
+ * Improved Laminas Form Label View Helper by adding attributes
  *
  * @category VuFind
  * @package  View_Helpers
diff --git a/module/finc/src/finc/Controller/CustomTraits/HistoricLoansTrait.php b/module/finc/src/finc/Controller/CustomTraits/HistoricLoansTrait.php
index 36b5d90f838f78d91c97dcaa3b9e2dcc298795f5..33976f867f7ba01f4646b6da79d1688e6ceecf6c 100644
--- a/module/finc/src/finc/Controller/CustomTraits/HistoricLoansTrait.php
+++ b/module/finc/src/finc/Controller/CustomTraits/HistoricLoansTrait.php
@@ -151,7 +151,13 @@ trait HistoricLoansTrait
             return $ilsResults;
         }
         $barcodeSolrField = 'barcode_' . $config->CustomIndex->indexExtension;
-        $query_barcode_part = implode(' OR ', $barcodeIds);
+
+        $escapedBarcodeIds = [];
+        foreach ($barcodeIds as $id) {
+            $escapedBarcodeIds[] = addcslashes($id, ':');
+        }
+        
+        $query_barcode_part = implode(' OR ', $escapedBarcodeIds);
         $query = new \VuFindSearch\Query\Query(
             $barcodeSolrField . ':(' . $query_barcode_part . ')'
         );
diff --git a/package.json b/package.json
index 9acd163a3dc3de9f3f81d1cce0580563b4e8cf42..157e12049fe9b41a4cdbd8b6e8347d48f3e9425b 100644
--- a/package.json
+++ b/package.json
@@ -12,7 +12,7 @@
   "dependencies": {
     "grunt": "^1.0.4",
     "grunt-contrib-less": "^2.0.0",
-    "grunt-less-to-sass": "duvillierA/grunt-less-to-sass#0.0.11",
+    "grunt-less-to-sass": "https://registry.npmjs.org/grunt-less-to-sass/-/grunt-less-to-sass-0.0.10.tgz",
     "grunt-sass": "^2.0.0",
     "jit-grunt": "^0.9.1",
     "node-sass": "^4.11.0"
diff --git a/themes/fid/templates/fid/user/address-fieldset.phtml b/themes/fid/templates/fid/user/address-fieldset.phtml
index cead3aa0a75121029a9ea9799702c58bad484d1c..ca636bb760c43139c441fb2aa267aa61f8832ef1 100644
--- a/themes/fid/templates/fid/user/address-fieldset.phtml
+++ b/themes/fid/templates/fid/user/address-fieldset.phtml
@@ -118,4 +118,4 @@ $elemCountry->setAttributes(['class' => 'form-control']);
     <?= $this->formElement($elemCountry) ?>
     <?= $this->formElementErrors($elemCountry) ?>
 </div>
-<!-- fid: fid - user - address-fieldset -->
+<!-- fid: fid - user - address-fieldset - END -->
diff --git a/themes/fid/templates/myresearch/databases.phtml b/themes/fid/templates/myresearch/databases.phtml
index 97015daa9f0cbff53d45c97a0fc3fe0ec2f393d3..31007f98a8ac8046b50f71e20e8ea4b6e1312e1c 100644
--- a/themes/fid/templates/myresearch/databases.phtml
+++ b/themes/fid/templates/myresearch/databases.phtml
@@ -9,7 +9,7 @@
  * - database page (usage with and without login)
  * - displays:
  * - 1. fid licences
- * - 2. debis: licences by user's library (using debis module)
+ * - 2. dbis: licences by user's library (using debis module)
  * - url: /Myresearch/databases
  *
  * modified for fid:
diff --git a/themes/fid/templates/myresearch/dbis-content.phtml b/themes/fid/templates/myresearch/dbis-content.phtml
index 368e288afd4f1c17fe27de89e3531eeff4a21185..9de63df367c107696c08a1b7572ac3941ed7f3f4 100644
--- a/themes/fid/templates/myresearch/dbis-content.phtml
+++ b/themes/fid/templates/myresearch/dbis-content.phtml
@@ -1,4 +1,21 @@
 <!-- fid: myresearch - dbis-content -->
+<?php
+/**
+ * origin: self
+ *
+ * called by view helper/controller: --
+ *
+ * usage:
+ * - dbis: licences by user's library (using dbis module)
+ * - url: /Myresearch/databases
+ *
+ * modified for fid: --
+ *
+ * parent template: myresearch/databases.phtml
+ *
+ * configured in: --
+ */
+?>
 <br/>
 <h3><?= $this->translate('dbis_name') ?></h3>
 <div class="dbis_description">
diff --git a/themes/finc-accessibility/css/.gitignore b/themes/finc-accessibility/css/.gitignore
deleted file mode 100644
index ecd34d2f94d3375699b58fb65ea6fa5b0aba96d1..0000000000000000000000000000000000000000
--- a/themes/finc-accessibility/css/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-compiled.css
\ No newline at end of file
diff --git a/themes/finc/js/lightbox.js b/themes/finc/js/lightbox.js
index fb9ce55c1f81ab27c07119899e206b55761769ac..febc29b3017d0db0733651dd9b43abed756ab7a3 100644
--- a/themes/finc/js/lightbox.js
+++ b/themes/finc/js/lightbox.js
@@ -291,6 +291,8 @@ VuFind.register('lightbox', function Lightbox() {
       _lightboxTitle = $(this).data('lightbox-title') || false;
       _modalParams = $(this).data();
       VuFind.modal('show');
+      // Copied finc #17984
+      setOrigin($(this));
       ajax(obj);
       _currentUrl = this.href;
       return false;
diff --git a/themes/finc/templates/Recommend/SideFacets/range-slider.phtml b/themes/finc/templates/Recommend/SideFacets/range-slider.phtml
index 8dfd0377a5dd5e065e231cfd33dce77d3303d7d4..9c5f09756f70fe5681fe2b7cf2ed21409116ee51 100644
--- a/themes/finc/templates/Recommend/SideFacets/range-slider.phtml
+++ b/themes/finc/templates/Recommend/SideFacets/range-slider.phtml
@@ -1,7 +1,22 @@
 <!-- finc - recommend - sidefacets - rangeslider -->
 <?php
-    /** this is a copy of the bootstrap3 version and adds an aria-label to the
-     * slider-container element
+    /**
+     * origin: bootstrap3
+     *
+     * called by view helper/controller:
+     *
+     * usage: result lists facets
+     *
+     * modified for finc:
+     ** #22135, #22511 usability date range slider
+     *** calculate min/max values by results value range
+     *** use html min / max attributes
+     ** #24304 show publish date range always (default = false)
+     *
+     * configured in: facets.ini
+     ** [SpecialFacets] -> dateRange[] = publishDateSort
+     ** [Results_Settings] -> facet_limit_by_field[publishDateSort] = -1
+     ** [SpecialFacetsDisplaySettings] -> dateRangeShowAlways = false
      */
 ?>
 <?php
@@ -11,14 +26,19 @@
      * if date range filter is applied additionaly: lowest and highest record years can be within filter values
      */
     foreach ($cluster['list'] as $facet) {
-      $years[] = $facet['value'];
+      // casting year to int to prevent years like '0000'
+      $years[] = (int)$facet['value'];
     }
-    $facetmin = min($years);
-    $facetmax = max($years);
-    $low = $facetmin;
-    $min = !empty($this->facet['values'][0]) ? $this->facet['values'][0] : $facetmin;
-    $high = $facetmax;
-    $max = !empty($this->facet['values'][1]) ? $this->facet['values'][1] : $facetmax;
+    // results min
+    $low = min($years);
+    // (pre)selected min
+    $min = !empty($this->facet['values'][0]) ? $this->facet['values'][0] : $low;
+    // results max
+    $high = max($years);
+    // (pre)selected max
+    $max = !empty($this->facet['values'][1]) ? $this->facet['values'][1] : $high;
+    // finc: show date (publication year) range values always, even if no preselection is made by user #24304
+    $showAlways = $this->config()->get('facets')->SpecialFacetsDisplaySettings->dateRangeShowAlways ?? false;
 ?>
 <?php /* finc changes div into li for compatibility with facet list structure */ ?>
 <li class="facet">
@@ -42,15 +62,31 @@
         <label id="from-label" for="<?=$this->escapeHtmlAttr($this->title)?>from">
           <?=$this->transEsc('date_from')?>:
         </label>
-        <?php /* finc: usability date range slider #22135, #22511: change input type and value */ ?>
-        <input type="number" class="form-control" name="<?=$this->escapeHtmlAttr($this->title)?>from" id="<?=$this->escapeHtmlAttr($this->title)?>from" value="<?=!empty($this->facet['values'][0]) ? $this->escapeHtmlAttr($low) : ''?>" <?=$extraInputAttribs?>/>
+        <?php /* finc: usability date range slider #22135, #22511: change input type and value
+                 finc: show date (publication year) range values always, even if no preselection is made by user #24304 */ ?>
+        <input
+          type="number"
+          class="form-control"
+          name="<?=$this->escapeHtmlAttr($this->title)?>from"
+          id="<?=$this->escapeHtmlAttr($this->title)?>from"
+          value="<?=($showAlways || !empty($this->facet['values'][0])) ? $this->escapeHtmlAttr($low) : ''?>"
+          <?=$extraInputAttribs?>
+        />
       </div>
       <div class="date-to">
         <label id="to-label" for="<?=$this->escapeHtmlAttr($this->title)?>to">
           <?=$this->transEsc('date_to')?>:
         </label>
-        <?php /* finc: usability date range slider #22135, #22511: change input type and value input */ ?>
-        <input type="number" class="form-control" name="<?=$this->escapeHtmlAttr($this->title)?>to" id="<?=$this->escapeHtmlAttr($this->title)?>to" value="<?=!empty($this->facet['values'][1]) ? $this->escapeHtmlAttr($high) : ''?>" <?=$extraInputAttribs?>/>
+        <?php /* finc: usability date range slider #22135, #22511: change input type and value input
+                 finc: show date (publication year) range values always, even if no preselection is made by user #24304 */ ?>
+        <input
+          type="number"
+          class="form-control"
+          name="<?=$this->escapeHtmlAttr($this->title)?>to"
+          id="<?=$this->escapeHtmlAttr($this->title)?>to"
+          value="<?=($showAlways || !empty($this->facet['values'][1])) ? $this->escapeHtmlAttr($high) : ''?>"
+          <?=$extraInputAttribs?>
+        />
       </div>
     </div>
     <?php if ($this->facet['type'] == 'date'): ?>
diff --git a/themes/finc/templates/RecordDriver/DefaultRecord/data-hierarchyParentTitle.phtml b/themes/finc/templates/RecordDriver/DefaultRecord/data-hierarchyParentTitle.phtml
index c94fdc31745b45b890eb16dd2f62008fc663f436..419f2b1d9f5026a042c55f891e21854c8be59ac1 100644
--- a/themes/finc/templates/RecordDriver/DefaultRecord/data-hierarchyParentTitle.phtml
+++ b/themes/finc/templates/RecordDriver/DefaultRecord/data-hierarchyParentTitle.phtml
@@ -1,11 +1,30 @@
 <!-- finc: RecordDriver - DefaultRecord - data-hierarchyParentTitle -->
+<?php
+/**
+*
+* origin: self
+*
+* called by view helper/controller:
+*
+* usage:
+* - Shows parent collection title in RECORD VIEW (left-hand side) under 'Teil von:'
+* - Linking to parent title (default by parent-id, if missing by title-string itself)
+*
+* modified for finc: --
+*
+* configured in: --
+*
+**/
+?>
 <?php if (!empty($data)): ?>
   <?php $hierarchyParentId = $this->driver->tryMethod('getHierarchyParentID'); ?>
   <?php foreach ($data as $key => $title): ?>
     <?php if (isset($hierarchyParentId[$key])): ?>
       <a href="<?=$this->recordLink()->getUrl($hierarchyParentId[$key], $hierarchyParentId[$key], 'ParentID');?>"><?=$this->escapeHtml($title)?></a>
     <?php else: ?>
-      <?=$this->escapeHtml($title)?>
+      <?php /* #24409 fallback: if record has no hierarchyParentId start new Series-search on title */ ?>
+      <?php $url = $this->url('search-results', [], ['query'=>['type' => 'Series','lookfor' => $title]])?>
+      <a href="<?=$url?>"><?=$this->escapeHtml($title)?></a>
     <?php endif; ?>
     <br/>
   <?php endforeach; ?>
diff --git a/themes/finc/templates/record/checkbox.phtml b/themes/finc/templates/record/checkbox.phtml
index bf979045036f84c7d740a719723e22a63017e79f..66857ea859ac6d49712f1f5cb0b2d36052f9127c 100644
--- a/themes/finc/templates/record/checkbox.phtml
+++ b/themes/finc/templates/record/checkbox.phtml
@@ -2,13 +2,12 @@
 <?php /* finc adds php for more specific labels, #18754 */ ?>
 <?php $label = isset($this->context) ? 'select_item_' . $this->context : 'select_item'; ?>
 <label class="record-checkbox hidden-print">
-  <?php /* finc adds aria-label and -describedby */ ?>
+  <?php /* finc adds aria-label and -describedby and space in front of form attribute */ ?>
   <input
       class="checkbox-select-item"
       type="checkbox"
       name="ids[]"
-      value="<?=$this->id?>"
-      <?php if (isset($this->formAttr)): ?>form="<?=$this->formAttr ?>"<?php endif; ?>
+      value="<?=$this->id?>"<?php if (isset($this->formAttr)): ?> form="<?=$this->formAttr ?>"<?php endif; ?>
       aria-describedby="<?=$this->id?>"
       aria-label="<?=$this->transEscAttr($label)?>"
   />
diff --git a/themes/finc/templates/search/advanced/ranges.phtml b/themes/finc/templates/search/advanced/ranges.phtml
index 80bf13a087b9db0c207879368f13f0351d9fe939..7f7ab09225be17115968d3bd9adb08de8792a7c2 100644
--- a/themes/finc/templates/search/advanced/ranges.phtml
+++ b/themes/finc/templates/search/advanced/ranges.phtml
@@ -3,10 +3,14 @@
   <?php $params = $this->searchParams($this->searchClassId); ?>
   <?php foreach ($this->ranges as $current): $escField = $this->escapeHtmlAttr($current['field']); ?>
     <?php /* finc: usability date range slider #22511:: calculate variables at the beginning */
+      // (pre)selected min
       $min = !empty($current['values'][0]) ? min($current['values'][0], 1400) : 1400;
       $future = date('Y', time() + 31536000);
+      // (pre)selected max
       $max = !empty($current['values'][1]) ? max($future, $current['values'][1]) : $future;
+      // results min
       $low = !empty($current['values'][0]) ? $current['values'][0] : $min;
+      // results max
       $high = !empty($current['values'][1]) ? $current['values'][1] : $max;
       ?>
     <?php /* finc: usability date range slider #22511: use previously calculated min-/max-values to limit inputs */ ?>
diff --git a/themes/finc/templates/search/bulk-action-buttons.phtml b/themes/finc/templates/search/bulk-action-buttons.phtml
index bbdd94824c14ce4ae34b79b1d3c5b93ed3db53f4..0fb58cd2a089a0ee7a6c06d0086ed4e0ac7d9132 100644
--- a/themes/finc/templates/search/bulk-action-buttons.phtml
+++ b/themes/finc/templates/search/bulk-action-buttons.phtml
@@ -30,7 +30,7 @@
       <?php endif; ?>
       <?php if (isset($this->showCartControls) && $this->showCartControls): ?>
         <li>
-          <button id="<?=$this->idPrefix?><?=$this->idPrefix?>updateCart" type="submit" class="toolbar-btn btn-type-add" name="add" value="1"<?php if ($this->formAttr): ?> form="<?=$this->escapeHtmlAttr($this->formAttr) ?>"<?php endif; ?>><?=$this->transEsc('Add to Book Bag')?></button>
+          <button id="<?=$this->idPrefix?>updateCart" type="submit" class="toolbar-btn btn-type-add" name="add" value="1"<?php if ($this->formAttr): ?> form="<?=$this->escapeHtmlAttr($this->formAttr) ?>"<?php endif; ?>><?=$this->transEsc('Add to Book Bag')?></button>
         </li>
       <?php endif; ?>
     </ul>