diff --git a/local/config/vufind/FincLibero.ini b/local/config/vufind/FincLibero.ini
index 3b73011fd7f88f3a4f2e1cf71a1d30fe1aea2eac..2fa52f5332f105e26eef5dccb07903de05db2ba0 100644
--- a/local/config/vufind/FincLibero.ini
+++ b/local/config/vufind/FincLibero.ini
@@ -45,6 +45,9 @@ relative_path=FincILS.ini
 ; Limitations that will identify the item for being bound to another item.
 ;awlLimitations[] = DE-15:OrderViaBoundItem
 
+; Limitations that will be ignored by VuFind (cf. #9359#note-7)
+;ignoriedLimitations[] = DE-15:ContactStaff
+
 ; URIs that will be used for stack views
 ;stackURIs[] = "http://data.ub.uni-leipzig.de/resource/DE-15/pickup/zw01thek"
 
diff --git a/local/languages/DDS/de.ini b/local/languages/DDS/de.ini
index fc735434269263d722f16de3da3a8790f14fda6b..cdb304cca5ec0d69c473ab7501ce0e2a2a2d26f0 100644
--- a/local/languages/DDS/de.ini
+++ b/local/languages/DDS/de.ini
@@ -25,6 +25,7 @@ dds_restriction_text = "Dieser Dienst steht nur Mitarbeiterinnen und Mitarbeiter
 dds_issn = "Bitte eine korrekte ISSN-10 oder ISSN-13 angeben."
 dds_error_publishdate_too_short = "Mindestens ein zweistelliges Erscheinungsjahr angeben."
 dds_error_publishdate_too_long = "Maximal ein vierstelliges Erscheinungsjahr angeben."
+dds_error_general_message = "Die Bestellung konnte nicht abgesendet werden. Bitte korrigieren Sie die unten angegebenen Fehler."
 acquisition_error_publishdate_pattern = "Bitte ein korrektes Jahr eingeben."
 dds_error_pages_too_short = "Mindestens einstellige Seitenzahlen angeben."
-acquisition_error_pages_pattern = "Bitte einen Seitenzahl (z.B. 20 oder 20-29) angeben."
\ No newline at end of file
+acquisition_error_pages_pattern = "Bitte eine Seitenzahl (z.B. 20 oder 20-29) angeben."
\ No newline at end of file
diff --git a/local/languages/DDS/en.ini b/local/languages/DDS/en.ini
index f5f96b23225173a5ee4773c3d2eec5d6c5122cfe..d99b2c9527d07f48c9f1423e83cc9a0ac768e595 100644
--- a/local/languages/DDS/en.ini
+++ b/local/languages/DDS/en.ini
@@ -25,6 +25,7 @@ dds_restriction_text = "This service is only available for members of Leipzig Un
 dds_issn = "Only correct ISSN-10 or ISSN-13"
 dds_error_publishdate_too_short = "min. a two digit publishdate"
 dds_error_publishdate_too_long = "max. a four digit publishdate"
+dds_error_general_message = "The order could not be sent. Please correct the errors given below."
 acquisition_error_publishdate_pattern = "Please enter a correct year."
 dds_error_pages_too_short = "min. page 1"
 acquisition_error_pages_pattern = "Please specify a number of pages (e.g. 20 or 20-29). "
\ No newline at end of file
diff --git a/module/finc/config/dds-form.php b/module/finc/config/dds-form.php
index 3d081ae7e0a56aed9ab83d2dfb1ebbc9c5867e98..20a0adfeb6320390d07099e40aca695e291d12c3 100644
--- a/module/finc/config/dds-form.php
+++ b/module/finc/config/dds-form.php
@@ -19,19 +19,14 @@
  * @license http://opensource.org/licenses/gpl-2.0.php GNU GPLv2
  */
 
-use fid\Hydrator\UserHydrator;
-use Zend\Filter\Boolean;
 use Zend\Filter\PregReplace;
 use Zend\Filter\StringTrim;
-use Zend\Form\Element\Checkbox;
 use Zend\Form\Element\Email;
 use Zend\Form\Element\Select;
 use Zend\Form\Element\Submit;
 use Zend\Form\Element\Text;
 use Zend\Form\Element\Textarea;
 use Zend\Validator\EmailAddress;
-use Zend\Validator\Identical;
-use Zend\Validator\Isbn;
 use Zend\Validator\NotEmpty;
 use Zend\Validator\Regex;
 use Zend\Validator\StringLength;
@@ -119,11 +114,12 @@ return [
                     'disable_inarray_validator' => true,
                 ],
                 'attributes' => [
-                    'required' => true,
+                    'required' => false,
                     'id' => 'department',
                 ],
             ],
         ],
+        /* used for division 15 (medical) only */
         'inputdepartment'             => [
             'spec' => [
                 'name'       => 'inputdepartment',
@@ -400,4 +396,4 @@ return [
             ],
         ],
     ],
-];
\ No newline at end of file
+];
diff --git a/module/finc/config/module.config.php b/module/finc/config/module.config.php
index a5dfdc532872e3cdaab10332afa88f79cfe23231..d126c48273506f933fe89a8c7656250c81d336f8 100644
--- a/module/finc/config/module.config.php
+++ b/module/finc/config/module.config.php
@@ -10,6 +10,7 @@ $config = [
     ],
     'service_manager' => [
         'factories' => [
+            'finc\Auth\ILSAuthenticator' => 'finc\Auth\ILSAuthenticatorFactory',
             'finc\Cache\Manager' => 'VuFind\Cache\ManagerFactory',
             'finc\Config\BranchesReader' => 'VuFind\Config\YamlReaderFactory',
             'finc\ILS\Connection' => 'VuFind\ILS\ConnectionFactory',
@@ -29,6 +30,7 @@ $config = [
         ],
         'aliases' => [
             'MvcTranslator' => 'Zend\Mvc\I18n\Translator',
+            'VuFind\Auth\ILSAuthenticator' => 'finc\Auth\ILSAuthenticator',
             'VuFind\Cache\Manager' => 'finc\Cache\Manager',
             'VuFind\ILS\Connection' => 'finc\ILS\Connection',
             'VuFind\ILS\Logic\Holds' => 'finc\ILS\Logic\Holds',
@@ -104,6 +106,14 @@ $config = [
                         'finc\AjaxHandler\GetRecordCover',
                 ]
             ],
+            'auth' => [
+                'factories' => [
+                    'finc\Auth\ILS' => 'finc\Auth\Factory::getILS'
+                ],
+                'aliases' => [
+                    'VuFind\Auth\ILS' => 'finc\Auth\ILS',
+                ]
+            ],
             'ils_driver' => [
                 'factories' => [
                     'finc\ILS\Driver\FincILS' => 'finc\ILS\Driver\Factory::getFincILS',
@@ -378,7 +388,6 @@ $staticRoutes = [
     'MyResearch/Acquisition',
     'MyResearch/ResetPassword',
     'dds/Home',
-    'dds/Email',
     'Record/EblLink'
 ];
 
diff --git a/module/finc/src/finc/Auth/Factory.php b/module/finc/src/finc/Auth/Factory.php
new file mode 100644
index 0000000000000000000000000000000000000000..dead0c9064c4fd7fd672c668bfc56762d8fb9b24
--- /dev/null
+++ b/module/finc/src/finc/Auth/Factory.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Factory for authentication 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * @category VuFind
+ * @package  Authentication
+ * @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\Auth;
+use Zend\ServiceManager\ServiceManager;
+
+/**
+ * Factory for authentication services.
+ *
+ * @category VuFind
+ * @package  Authentication
+ * @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 ILS plugin.
+     *
+     * @param ServiceManager $sm Service manager.
+     *
+     * @return ILS
+     */
+    public static function getILS(ServiceManager $sm)
+    {
+        return new ILS(
+            $sm->get('VuFind\ILS\Connection'),
+            $sm->get('VuFind\Auth\ILSAuthenticator')
+        );
+    }
+}
diff --git a/module/finc/src/finc/Auth/ILS.php b/module/finc/src/finc/Auth/ILS.php
new file mode 100644
index 0000000000000000000000000000000000000000..b76f6e95cbf2e0549ff6af32030ac49109cf4b00
--- /dev/null
+++ b/module/finc/src/finc/Auth/ILS.php
@@ -0,0 +1,136 @@
+<?php
+/**
+ * ILS authentication module.
+ *
+ * PHP version 7
+ *
+ * Copyright (C) Villanova University 2010.
+ *
+ * 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  Authentication
+ * @author   Franck Borel <franck.borel@gbv.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:authentication_handlers Wiki
+ */
+namespace finc\Auth;
+
+use VuFind\Exception\Auth as AuthException;
+use VuFind\Exception\ILS as ILSException;
+
+/**
+ * ILS authentication module.
+ *
+ * @category VuFind
+ * @package  Authentication
+ * @author   Franck Borel <franck.borel@gbv.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:authentication_handlers Wiki
+ */
+class ILS extends \VuFind\Auth\ILS
+{
+    /**
+     * Update a user's password from the request.
+     *
+     * @param \Zend\Http\PhpEnvironment\Request $request Request object containing
+     * new account details.
+     *
+     * @throws AuthException
+     * @return \VuFind\Db\Row\User New user row.
+     */
+    public function updatePassword($request)
+    {
+        // Ensure that all expected parameters are populated to avoid notices
+        // in the code below.
+        $params = [];
+        foreach (['oldpwd', 'password', 'password2'] as $param) {
+            $params[$param] = $request->getPost()->get($param, '');
+        }
+
+        // Connect to catalog:
+        if (!($patron = $this->authenticator->storedCatalogLogin())) {
+            throw new AuthException('authentication_error_technical');
+        }
+
+        // Validate Input
+        $this->validatePasswordUpdate($params);
+
+        $result = $this->getCatalog()->changePassword(
+            [
+                'patron' => $patron,
+                'oldPassword' => $params['oldpwd'],
+                'newPassword' => $params['password']
+            ]
+        );
+        if (!$result['success']) {
+            throw new AuthException($result['status']);
+        }
+
+        // Update the user and send it back to the caller:
+        $username = $patron[$this->getUsernameField()];
+        $user = $this->getUserTable()->getByUsername($username);
+        $user->saveCredentials($patron['cat_username'], null);
+        return $user;
+    }
+
+    /**
+     * Update the database using details from the ILS, then return the User object.
+     *
+     * @param array $info User details returned by ILS driver.
+     *
+     * @throws AuthException
+     * @return \VuFind\Db\Row\User Processed User object.
+     */
+    protected function processILSUser($info)
+    {
+        // Figure out which field of the response to use as an identifier; fail
+        // if the expected field is missing or empty:
+        $usernameField = $this->getUsernameField();
+        if (!isset($info[$usernameField]) || empty($info[$usernameField])) {
+            throw new AuthException('authentication_error_technical');
+        }
+
+        // Check to see if we already have an account for this user:
+        $userTable = $this->getUserTable();
+        if (!empty($info['id'])) {
+            $user = $userTable->getByCatalogId($info['id']);
+            if (empty($user)) {
+                $user = $userTable->getByUsername($info[$usernameField]);
+                $user->saveCatalogId($info['id']);
+            }
+        } else {
+            $user = $userTable->getByUsername($info[$usernameField]);
+        }
+
+        // No need to store the ILS password in VuFind's main password field:
+        $user->password = '';
+
+        // Update user information based on ILS data:
+        $fields = ['firstname', 'lastname', 'email', 'major', 'college'];
+        foreach ($fields as $field) {
+            $user->$field = $info[$field] ?? ' ';
+        }
+
+        // Update the user in the database, then return it to the caller:
+        $user->saveCredentials(
+            $info['cat_username'] ?? ' ',
+            null
+        );
+
+        return $user;
+    }
+}
diff --git a/module/finc/src/finc/Auth/ILSAuthenticator.php b/module/finc/src/finc/Auth/ILSAuthenticator.php
new file mode 100644
index 0000000000000000000000000000000000000000..ec46cc0e969143197fac749ad078256f865fa46b
--- /dev/null
+++ b/module/finc/src/finc/Auth/ILSAuthenticator.php
@@ -0,0 +1,162 @@
+<?php
+/**
+ * Class for managing ILS-specific authentication.
+ *
+ * PHP version 5
+ *
+ * Copyright (C) Villanova University 2007.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * @category VuFind
+ * @package  Authentication
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     https://vufind.org Main Page
+ */
+namespace finc\Auth;
+
+use VuFind\Auth\Manager as Manager;
+use VuFind\ILS\Connection as ILSConnection;
+
+/**
+ * Class for managing ILS-specific authentication.
+ *
+ * @category VuFind
+ * @package  Authentication
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     https://vufind.org Main Page
+ */
+class ILSAuthenticator extends \VuFind\Auth\ILSAuthenticator
+{
+    /**
+     * Session containing PAIA login information
+     *
+     * @var Zend\Session\Container
+     */
+    protected $session;
+
+    /**
+     * SessionManager
+     *
+     * @var \VuFind\SessionManager
+     */
+    protected $sessionManager;
+
+    /**
+     * Constructor
+     *
+     * @param Manager                      $auth           Auth manager
+     * @param ILSConnection                $catalog        ILS connection
+     * @param \Zend\Session\SessionManager $sessionManager Session manager
+     */
+    public function __construct(
+        Manager $auth,
+        ILSConnection $catalog,
+        \Zend\Session\SessionManager $sessionManager
+    ) {
+        $this->auth = $auth;
+        $this->catalog = $catalog;
+        $this->sessionManager = $sessionManager;
+    }
+
+    /**
+     * Get the session container (constructing it on demand if not already present)
+     *
+     * @return SessionContainer
+     */
+    protected function getSession()
+    {
+        // SessionContainer not defined yet? Build it now:
+        if (null === $this->session) {
+            $this->session = new \Zend\Session\Container('PAIA', $this->sessionManager);
+        }
+        return $this->session;
+    }
+
+    /**
+     * Log the current user into the catalog using stored credentials; if this
+     * fails, clear the user's stored credentials so they can enter new, corrected
+     * ones.
+     *
+     * Returns associative array of patron data on success, false on failure.
+     *
+     * @return array|bool
+     */
+    public function storedCatalogLogin()
+    {
+        // Fail if no username is found, but allow a missing password (not every ILS
+        // requires a password to connect).
+        if (($user = $this->auth->isLoggedIn()) && !empty($user->cat_username)) {
+            // Do we have a previously cached ILS account?
+            if (isset($this->ilsAccount[$user->cat_username])) {
+                return $this->ilsAccount[$user->cat_username];
+            }
+
+            $session = $this->getSession();
+            if (isset($session->cat_password)) {
+                $patron = $this->catalog->patronLogin(
+                    $user->cat_username,
+                    $session->cat_password
+                );
+            } else {
+                $patron = $this->catalog->patronLogin(
+                    $user->cat_username,
+                    $user->getCatPassword()
+                );
+            }
+
+            if (empty($patron)) {
+                // Problem logging in -- clear user credentials so they can be
+                // prompted again; perhaps their password has changed in the
+                // system!
+                $user->clearCredentials();
+            } else {
+                // cache for future use
+                $this->ilsAccount[$user->cat_username] = $patron;
+                return $patron;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Attempt to log in the user to the ILS, and save credentials if it works.
+     *
+     * @param string $username Catalog username
+     * @param string $password Catalog password
+     *
+     * Returns associative array of patron data on success, false on failure.
+     *
+     * @return array|bool
+     * @throws ILSException
+     */
+    public function newCatalogLogin($username, $password)
+    {
+        $result = $this->catalog->patronLogin($username, $password);
+        if ($result) {
+            $user = $this->auth->isLoggedIn();
+            if ($user) {
+                $user->saveCredentials($username, null);
+                $this->auth->updateSession($user);
+                // cache for future use
+                $this->ilsAccount[$username] = $result;
+            }
+            return $result;
+        }
+        return false;
+    }
+}
diff --git a/module/finc/src/finc/Auth/ILSAuthenticatorFactory.php b/module/finc/src/finc/Auth/ILSAuthenticatorFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..1ec9154aa8cb72006ef1a4f6ca3ae9deaa69dec1
--- /dev/null
+++ b/module/finc/src/finc/Auth/ILSAuthenticatorFactory.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * ILS Authenticator factory.
+ *
+ * PHP version 7
+ *
+ * Copyright (C) Villanova University 2018.
+ *
+ * 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  Authentication
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @author   Dorian Merz <merz@ub.uni-leipzig.de>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     https://vufind.org/wiki/development Wiki
+ */
+namespace finc\Auth;
+
+use Interop\Container\ContainerInterface;
+use Zend\ServiceManager\Factory\FactoryInterface;
+
+/**
+ * ILS Authenticator factory.
+ *
+ * @category VuFind
+ * @package  Authentication
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @author   Dorian Merz <merz@ub.uni-leipzig.de>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     https://vufind.org/wiki/development Wiki
+ */
+class ILSAuthenticatorFactory implements FactoryInterface
+{
+    /**
+     * Create an object
+     *
+     * @param ContainerInterface $container     Service manager
+     * @param string             $requestedName Service being created
+     * @param null|array         $options       Extra options (optional)
+     *
+     * @return object
+     *
+     * @throws ServiceNotFoundException if unable to resolve the service.
+     * @throws ServiceNotCreatedException if an exception is raised when
+     * creating a service.
+     * @throws ContainerException if any other error occurs
+     */
+    public function __invoke(
+        ContainerInterface $container,
+        $requestedName,
+        array $options = null
+    ) {
+        if (!empty($options)) {
+            throw new \Exception('Unexpected options sent to factory.');
+        }
+        // Construct the ILS authenticator as a lazy loading value holder so that
+        // the object is not instantiated until it is called. This helps break a
+        // potential circular dependency with the MultiBackend driver as well as
+        // saving on initialization costs in cases where the authenticator is not
+        // actually utilized.
+        $callback = function (& $wrapped, $proxy) use ($container, $requestedName) {
+            // Generate wrapped object:
+            $auth = $container->get('VuFind\Auth\Manager');
+            $catalog = $container->get('VuFind\ILS\Connection');
+            $sessionManager = $container->get('VuFind\SessionManager');
+            $wrapped = new ILSAuthenticator($auth, $catalog, $sessionManager);
+
+            // Indicate that initialization is complete to avoid reinitialization:
+            $proxy->setProxyInitializer(null);
+        };
+        $cfg = $container->get('ProxyManager\Configuration');
+        $factory = new \ProxyManager\Factory\LazyLoadingValueHolderFactory($cfg);
+        return $factory->createProxy($requestedName, $callback);
+    }
+}
diff --git a/module/finc/src/finc/Controller/DocumentDeliveryServiceController.php b/module/finc/src/finc/Controller/DocumentDeliveryServiceController.php
index 23d91a76fd2b71f3d99fd9731d5a900dabd6f4cf..805fe9abc2ca4d28c2528512f11d40821057180a 100644
--- a/module/finc/src/finc/Controller/DocumentDeliveryServiceController.php
+++ b/module/finc/src/finc/Controller/DocumentDeliveryServiceController.php
@@ -28,15 +28,14 @@
  */
 namespace finc\Controller;
 
-use VuFind\Exception\Mail as MailException;
 use finc\Exception\DDS as DDSException;
 use finc\Mailer\Mailer as Mailer;
+use VuFind\Exception\Mail as MailException;
 use Zend\Form\Element\Select;
 use Zend\Form\Form;
 use Zend\Http\PhpEnvironment\Request;
 use Zend\Mail\Address as Address;
 use Zend\ServiceManager\ServiceLocatorInterface;
-use Zend\Validator as Validator;
 
 /**
  * Controller for Document Delivery Service
@@ -52,12 +51,10 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
 {
     use \VuFind\Log\LoggerAwareTrait;
 
-
     /**
      * VuFind configuration extended with Document Delivery Service configuration.
      *
      * @var $config
-     * @access protected
      */
     protected $config = [];
 
@@ -65,7 +62,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      * Departments
      *
      * @var $department
-     * @access protected
      */
     protected $department = [];
 
@@ -73,7 +69,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      * Divisions
      *
      * @var $division
-     * @access protected
      */
     protected $division = [];
 
@@ -81,7 +76,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      * HTTP client
      *
      * @var \Zend\Http\Client
-     * @access protected
      */
     protected $httpClient;
 
@@ -113,7 +107,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
 
     /**
      * @var $content
-     * @access protected
      */
     protected $content = [];
 
@@ -121,26 +114,22 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      * Build department taxonomy for options of select box.
      *
      * @return json $department
-     * @access protected
      */
     protected function getDepartments()
     {
         return json_encode($this->department);
     }
 
-
     /**
      * Build department taxonomy for options of select box.
      *
      * @return array $division
-     * @access protected
      */
     protected function getDivisions()
     {
         return $this->division;
     }
 
-
     /**
      * Display Feedback home form.
      *
@@ -169,33 +158,32 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
             return $view;
         }
 
+        if ($this->formWasSubmitted()) {
+            $content = $this->getContent();
+            /* @var Form $form */
+            $form = $this->serviceLocator->get('dds-form');
+            $form->setData($content);
+            if ($form->isValid()) {
+                return $this->email($content);
+            }
+            $this->flashMessenger()->addMessage('DDS::dds_error_general_message', 'error');
+        }
+
         return $this->createDDSViewModel($this->getContent());
     }
 
     /**
-     * Display Feedback home form.
+     * Send order mail if valid
+     *
+     * @param array $content form values
      *
-     * @return mixed
-     * @access public
      * @throws MailException
      * @throws DDSException
+     *
+     * @return mixed
      */
-    public function emailAction()
+    public function email($content)
     {
-        $content = $this->getContent();
-
-        /** @var Form $form */
-        /** @var Request $request */
-
-        //$request = $this->getRequest();
-        $form = $this->serviceLocator->get('dds-form');
-        if ($this->formWasSubmitted()) {
-            $form->setData($content);
-            if (!$form->isValid()) {
-                return $this->createDDSViewModel($content);
-            }
-        }
-
         // Prepare Email Template
         $body = $this->buildEmailTemplates($content);
 
@@ -212,7 +200,7 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
             ? new Address(
                 $content['email'],
                 $content['name']
-            ) : new Address($content['email']) ;
+            ) : new Address($content['email']);
 
         try {
             // Send Email
@@ -238,10 +226,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
             $this->flashMessenger()->addMessage($e->getMessage(), 'error');
             return $this->createDDSViewModel($content);
         }
-        // Save to database
-        /*if (false === $this->sendOrderToApi($content)) {
-            throw new DDSException('Cannot send successful order to api.');
-        }*/
 
         return $this->redirect()->toRoute(
             'dds-home'
@@ -256,18 +240,14 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      * @return mixed                True if authentication successful, null if
      *                              not successful, PEAR_Error on error.
      * @throws DDSException
-     * @access protected
      */
     protected function authenticateDDSService($auth_path = '/authorize')
     {
         $method = 'POST';
-        $auth_data['email'] = isset($this->config['DDS']['username'])
-            ? $this->config['DDS']['username'] : '';
-        $auth_data['password'] = isset($this->config['DDS']['password'])
-            ? $this->config['DDS']['password'] : '';
+        $auth_data['email'] = $this->config['DDS']['username'] ?? '';
+        $auth_data['password'] = $this->config['DDS']['password'] ?? '';
 
-        $api_url = isset($this->config['DDS']['url'])
-            ? $this->config['DDS']['url'] : '';
+        $api_url = $this->config['DDS']['url'] ?? '';
 
         $params = http_build_query($auth_data);
 
@@ -316,13 +296,12 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      * @param array $details   Details to build template
      *
      * @return array [order|customer] Body texts for email
-     * @access protected
      */
     protected function buildEmailTemplates($details)
     {
         // Get subito url
         $details['subito_url'] = $this->buildSubitoUrl($details);
-        // Get department name instead of identifier
+        // !!! Use department name instead of identifier !!!
         $details['department'] = ($details['division'] == '15')
             ? $details['inputdepartment'] : $this->getDepartmentName(
                 $details['department'],
@@ -354,7 +333,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      *
      * @param array $fields     List of parameters to build Subito url.
      *
-     * @access private
      * @return mixed            Return Subito $url otherwise false.
      * @throws DDSException     Exceptions for no sufficient delivered parameters.
      */
@@ -377,9 +355,7 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
             // Get config
             $serviceconfig = ['broker_id', 'url'];
 
-            $auth_data['email'] = isset($this->config['DDS']['username'])
-                ? $this->config['DDS']['username'] : '';
-
+            $auth_data['email'] = $this->config['DDS']['username'] ?? '';
 
             foreach ($serviceconfig as $var) {
                 if (!isset($this->config['SubitoService'][$var]) ||
@@ -393,20 +369,21 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
             }
             // user ci cp
             // Define obligated fields
-            // obligated at least one of ss or jt
+            /* obligated at least one of ss or jt
             if (empty($fields['issn']) && empty($fields['journal'])) {
                 $this->flashMessenger()->addMessage(
                     'DDS::dds_issn_journal', 'error'
                 );
-            }
+            }*/
             // all fields of vol, apy, pg
             if (empty($fields['number']) ||
                 empty($fields['publishdate']) ||
                 empty($fields['pages'])
             ) {
+                /*
                 $this->flashMessenger()->addMessage(
-                    'DDS::dds_binding_statements', 'error'
-                );
+                    'DDS::dds_binding_statements', 'info'
+                );*/
             }
             // build subito url
             $subito_url = $url . "?BI=" . urlencode($broker_id);
@@ -439,7 +416,7 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
             $elem->setValue($value);
         }
 
-        $action = $this->url()->fromRoute('dds-email');
+        $action = $this->url()->fromRoute('dds-home');
         $form->setAttribute('action', $action);
         $form->prepare();
 
@@ -449,6 +426,14 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
         $elemSdivision = $form->get('division');
         $elemSdivision->setValueOptions($this->getDivisions());
         $view->departments = $this->getDepartments();
+        if ($division = $elemSdivision->getValue()) {
+            $elemSdepartment = $form->get('department');
+            $options = json_decode($this->getDepartments(), true)[$division];
+            foreach ($options as &$option) {
+                $option = html_entity_decode($option);
+            }
+            $elemSdepartment->setValueOptions($options);
+        }
         $view->loadForm = true;
         $view->setTemplate('documentdeliveryservice/home');
         return $view;
@@ -458,7 +443,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      * Create http client if it is not already exists.
      *
      * @return \Zend\Http\Client
-     * @access protected
      */
     protected function createHttpClient()
     {
@@ -469,7 +453,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      * Get comprehensive data and transfer it to an adaptable format for further
      * proceedings.
      *
-     * @access private
      * @return array $content
      * @throws DDSException     Cannot load taxonomy of departments and divisions
      */
@@ -504,45 +487,45 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
                         (isset($post[$attribute]) && strlen($post[$attribute]) > 0)
                             ? $post[$attribute]
                             : (
-                        (isset($user['department_id']) && strlen($user['department_id']) > 0)
+                                (isset($user['department_id']) && strlen($user['department_id']) > 0)
                             ? $user['department_id'] : ''
-                        );
+                            );
                     break;
                 case 'division':
                     $this->content[$attribute] =
                         (isset($post[$attribute]) && strlen($post[$attribute]) > 0)
                             ? $post[$attribute]
                             : (
-                        (isset($user['division_id']) && strlen($user['division_id']) > 0)
+                                (isset($user['division_id']) && strlen($user['division_id']) > 0)
                             ? $user['division_id'] : ''
-                        );
+                            );
                     break;
                 case 'email':
                     $this->content[$attribute] =
                         (isset($user['email']) && strlen($user['email']) > 0)
                             ? $user['email']
-                            : (isset($post[$attribute]) ? $post[$attribute] : '');
+                            : ($post[$attribute] ?? '');
                     break;
                 case 'inputdepartment':
                     $this->content[$attribute] =
                         (isset($post[$attribute]) && strlen($post[$attribute]) > 0)
                             ? $post[$attribute]
                             : (
-                        (isset($user['department']) && strlen($user['department']) > 0)
+                                (isset($user['department']) && strlen($user['department']) > 0)
                             ? $user['department'] : ''
-                        );
+                            );
                     break;
                 case 'username':
                     $this->content[$attribute] =
                         (isset($user['username']) && strlen($user['username']) > 0)
                             ? trim($user['username'])
-                            : trim(isset($post[$attribute]) ? $post[$attribute] : '');
+                            : trim($post[$attribute] ?? '');
                     break;
                 case 'userid':
                     $this->content[$attribute] =
                         (isset($user['libraryCard']) && strlen($user['libraryCard']) > 0)
                             ? $user['libraryCard']
-                            : (isset($post[$attribute]) ? $post[$attribute] : '');
+                            : ($post[$attribute] ?? '');
                     break;
                 default:
                     if (!isset($this->content[$attribute])) {
@@ -553,17 +536,9 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
                     break;
             }
         }
-        // clean up department_id if division == 15
-        if (isset($this->content['division']) && $this->content['division'] == '15') {
-            $this->content['department'] = '';
-        } else {
-            $this->content['inputdepartment'] = '';
-        }
         return $this->content;
     }
 
-
-
     /**
      * Get config setting before checking if value exists at config file.
      *
@@ -571,7 +546,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      * @param string $var Variable of ini-file
      *
      * @return string
-     * @access protected
      * @throws DDSException  No variable set at DDS.ini.
      */
     protected function getConfigVar($identifier, $var)
@@ -615,14 +589,12 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      * Get access token
      *
      * @return mixed        If isset hashed token as string otherwise false.
-     * @access protected
      */
     protected function getDDSToken()
     {
         return (isset($this->session->ddsToken)) ? $this->session->ddsToken : false;
     }
 
-
     /**
      * Get all necessary user data for document delivery service
      *
@@ -634,8 +606,8 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
         $patron = $this->getILSAuthenticator()->storedCatalogLogin();
 
         $ddsUserData['username']    = $patron['firstname'] . ' ' . $patron['lastname'];
-        $ddsUserData['phone']       = isset($patron['phone']) ? $patron['phone'] : '';
-        $ddsUserData['email']       = isset($patron['email']) ? $patron['email'] : '';
+        $ddsUserData['phone']       = $patron['phone'] ?? '';
+        $ddsUserData['email']       = $patron['email'] ?? '';
         $ddsUserData['libraryCard'] = $patron['cat_username'];
 
         return array_merge(
@@ -649,7 +621,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      *
      * @param string $user_id Identifier of user.
      *
-     * @access private
      * @return array $session
      */
     private function getDDSUserDetail($user_id)
@@ -668,7 +639,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      * @param int $division Faculty / division id
      *
      * @return string              Name of department
-     * @access protected
      */
     protected function getDepartmentName($department, $division)
     {
@@ -688,7 +658,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      * Build department taxonomy for options of select box.
      *
      * @return boolean true
-     * @access protected
      */
     protected function getDepartmentTaxonomy()
     {
@@ -712,7 +681,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      * @param int $division Division / faculty id
      *
      * @return array $details         Details of departement
-     * @access protected
      */
     protected function getDetailsOfDepartment($department, $division)
     {
@@ -735,7 +703,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      * @param string $field Form element name
      * @param string $index Field parameter to evaluate
      *
-     * @access protected
      * @return string $retval   Return string for form field
      */
     protected function getOpenUrlField($getvars, $field, $index)
@@ -777,7 +744,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
     /**
      * Get OpenUrl parameters
      *
-     * @access private
      * @return mixed       False if no get vars exist, otherwise
      *                     array with vars for OpenUrl and not.
      *
@@ -822,7 +788,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      *
      * @param object $getvars GET variables.
      *
-     * @access private
      * @return mixed Return array with parameters by success, false by none.
      */
     private function getOpenUrlParametersMapping($getvars)
@@ -858,7 +823,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      *
      * @param array $getvars GET variables.
      *
-     * @access private
      * @return string   Return version number of openurl v1_0 or v0_1. By default
      *                  assume standard v0_1
      */
@@ -890,7 +854,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      * @param array $context Context of error response message
      *
      * @return boolean          True if token expired.
-     * @access protected
      */
     protected function isDDSTokenExpired($context)
     {
@@ -953,14 +916,13 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
             if (!$response->isSuccess()) {
                 if ($response->getContent()) {
                     // If token expired create new one.
-                    if (true === $this->isDDSTokenExpired($response->getContent())) {
+                    if (true === $this->isDDSTokenExpired($response->getBody())) {
                         $this->authenticateDDSService();
                         $this->httpServiceRequest(
                             $request_path,
                             $request_type,
                             $data
                         );
-                        exit;
                     }
 
                     $responseArray = $this->parseJsonAsArray($response->getContent());
@@ -996,7 +958,7 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
         if (isset($responseArray['error'])) {
             throw new DDSException(
                 $responseArray['error'],
-                isset($responseArray['code']) ? $responseArray['code'] : 400
+                $responseArray['code'] ?? 400
             );
         }
         return $responseArray;
@@ -1008,14 +970,12 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      * @param string $path Substitute of path for refresh token.
      *
      * @return mixed    True if token refreshed.
-     * @access protected
      * @throws DDSException
      */
     protected function refreshDDSToken($path = '/token')
     {
         $method = "GET";
-        $api_url = isset($this->config['DDS']['url'])
-            ? $this->config['DDS']['url'] : '';
+        $api_url = $this->config['DDS']['url'] ?? '';
 
         $client = $this->createHttpClient();
         try {
@@ -1056,7 +1016,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      *
      * @param array $content Content
      *
-     * @access private
      * @return boolean true
      * @throws DDSException
      */
@@ -1078,7 +1037,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      * @param array $content Container of field variables
      *
      * @return array $content
-     * @access private
      * @deprecated
      */
     private function setInputDepartmentToDepartment($content)
@@ -1098,7 +1056,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      * @param array $departmentdetails  Details of department
      *
      * @return string
-     * @access private
      * @throws DDSException             No or false variable is set.
      */
     private function setRecipientEmail($departmentdetails)
@@ -1108,8 +1065,9 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
                 if (isset($departmentdetails['branchEmail'])) {
                     return $departmentdetails['branchEmail'];
                 }
-                throw new DDSException('No email recipient address is set at '.
-                    ' at database.');
+                throw new DDSException(
+                    'No email recipient address is set at database.'
+                );
             }
             if (isset($this->config['DDS']['to'])) {
                 return $this->config['DDS']['to'];
@@ -1127,7 +1085,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      * @param array $departmentdetails     Details of department.
      *
      * @return string
-     * @access private
      * @throws DDSException                 No or false variables set at DDS.ini.
      */
     private function setSubjectEmail($departmentdetails)
@@ -1154,7 +1111,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      *
      * @param array $data     data to insert
      *
-     * @access public
      * @return mixed $notice  True if insert worked, error message if failed
      */
     public function storeOrderOfItem($data)
@@ -1184,7 +1140,6 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
      * @param array $data Data to insert
      *
      * @return mixed $notice   True if insert worked, error message if failed
-     * @access public
      */
     public function storeUserDetail($data)
     {
@@ -1206,13 +1161,10 @@ class DocumentDeliveryServiceController extends \VuFind\Controller\AbstractBase
         );
     }
 
-
-
     /**
      * Check if config data should be defined in database or DDS.ini.
      *
      * @return boolean      True if recipient data should taken from database.
-     * @access private
      */
     private function useConfigFromDatabase()
     {
diff --git a/module/finc/src/finc/ILS/Driver/FincLibero.php b/module/finc/src/finc/ILS/Driver/FincLibero.php
index 5aa9a5825be8626c5223f09887b1cf7736ce4b3d..d64a33334fd2dd811ef8bf85b0093e7c1af824cf 100644
--- a/module/finc/src/finc/ILS/Driver/FincLibero.php
+++ b/module/finc/src/finc/ILS/Driver/FincLibero.php
@@ -193,6 +193,15 @@ class FincLibero extends FincILS implements TranslatorAwareInterface
             'awlLimitations'
         );
 
+        // get URIs of limitations that will be ignored by VuFind
+        $this->setMemberFromConfig(
+            'ignoriedLimitations',
+            'General',
+            'ignoriedLimitations',
+            "No ignoriedLimitations defined.",
+            'ignoriedLimitations'
+        );
+
         // get the URIs identifying records for stack views
         $this->setMemberFromConfig(
             'stackURIs',
diff --git a/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php b/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php
index fb499209ebb4c3333a6ea0eede93fa1f250363a0..5c5d72a314308e03a1965c734e377179387067cc 100644
--- a/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php
+++ b/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php
@@ -643,9 +643,50 @@ trait SolrMarcFincTrait
                 // modified due to #13670
                 // > Titel: 245$a $n $p $h $b $c
                 $title = $subfield->getData();
-                foreach (['n', 'p', 'h', 'b', 'c'] as $subkey) {
-                    if ($subfield = $field->getSubfield($subkey)) {
-                        $title .= ' ' . $subfield->getData();
+                // if no punctuation set, set now: 245a: 245b (245n); 245p/ 245c
+                $setPuctuation = !$this->hasPunctuation();
+                // #19467, #20357 for title without punctuation: change order and ignore 245h
+                $orderedFields = $setPuctuation ? ['b', 'n', 'p', 'c'] : ['n', 'p', 'h', 'b', 'c'];
+                foreach ($orderedFields as $subkey) {
+                    if ($subfields = $field->getSubfields($subkey)) {
+                        if ($setPuctuation && !empty($title)) {
+                            if ($subkey == 'b') {
+                                // leading colon for 245b
+                                $title .= ':';
+                            }
+
+                            if ($subkey === 'p') {
+                                // leading semicolon for 245p
+                                $title .= ';';
+                            }
+
+                            if ($subkey === 'c') {
+                                // leading slash for 245c
+                                $title .= '/';
+                            }
+                        }
+
+                        $title .= ' ';
+
+                        if ($subkey === 'n' && $setPuctuation) {
+                            // leading bracket for 245n
+                            $title .= '(';
+                        }
+
+                        $title .= implode(
+                            ', ',
+                            array_map(
+                                function ($subfield) {
+                                    return $subfield->getData();
+                                },
+                                $subfields
+                            )
+                        );
+
+                        if ($subkey === 'n' && $setPuctuation) {
+                            // closing bracket and semicolon for 245n
+                            $title .= ')';
+                        }
                     }
                 }
             }
diff --git a/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1070158569_fullrecord.txt b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1070158569_fullrecord.txt
new file mode 100644
index 0000000000000000000000000000000000000000..957d768b8b08be9876a6a4c1e32b7c489f7e8446
--- /dev/null
+++ b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1070158569_fullrecord.txt
@@ -0,0 +1 @@
+03652cam a2201117  c45000010013000000030007000130050017000200070003000370080041000400350023000810350022001040350025001260350021001510400031001720410008002030840012002110840041002231000097002642450078003612640027004393000014004663360026004803370046005063380025005524900068005775910068006457510074007137730048007878300142008359350009009779360296009869510007012829830019012899690006013088520044013149830018013589840006013768520044013829840013014269840015014399000028014549000016014829000010014989000028015089000010015369000031015469000028015779000028016059000025016339000019016589000016016779000028016939000028017219000028017499000027017779000012018049000011018169000013018279000011018409000021018519000022018729000013018949000030019079000025019379000026019629000010019889000013019989000010020119000014020219000019020359000017020549000021020719000013020929000019021059000025021249000025021499000025021749000025021999000011022249000015022359000013022509000015022639000010022789000027022889000023023159000023023389000028023619000028023899000011024179000020024289000012024489000012024609000014024729510007024869800041024930-1070158569DE-62720140604111040.0tu850101s1897    xx |||||      00| ||lat c  a(DE-627)1070158569  a(DE-576)000158569  a(DE-599)BSZ000158569  a(OCoLC)309931629  aDE-627bgercDE-627erakwb  alat  a12ssgn  aNH 42452rvk0(DE-625)rvk/125639:2381 aPlinius Secundus, Gaiusd23-790(DE-588)1185950830(DE-627)1337540140(DE-576)1625750764aut10aC. Plini Secundi Naturalis Historiae libri XXXVIIn5pLibri XXXI - XXXVII 1aLipsiaebTeubnerc1897  aX, 512 S.  aTextbtxt2rdacontent  aohne Hilfsmittel zu benutzenbn2rdamedia  aBandbnc2rdacarrier1 aBibliotheca scriptorvm Graecorvm et Romanorvm Tevbnerianav1654  a5090: DDSU/sred ; IMD-Felder und 1131 maschinell ergänzt (SWB)  aLeipzig0(DE-588)4035206-70(DE-627)1047989980(DE-576)2090112464pup18w(DE-627)1070158518w(DE-576)000158518g5q5 0aBibliotheca scriptorum Graecorum et Romanorum Teubnerianav165491654w(DE-627)601129466w(DE-576)308216407w(DE-600)2498325-1x1864-399X  amteorvaNH 4245bGesamtausgabenkGeschichtekGriechisch-römische GeschichtekGriechische und lateinische Schriftsteller (Inschriften bei ND 4200 ff)kLateinische SchriftstellerkSchriftsteller PkPlinius Secundus, GaiuskGesamtausgaben0(DE-627)12714553660(DE-625)rvk/125639:2380(DE-576)201455366  aMV  a(DE-15)3300909  cB  aDE-15z2014-04-03T10:00:26Zx2019-10-02  a(DE-14)323681  cB  aDE-14z2009-02-06T20:01:10Zx2015-10-21  zLSTO: 02  s94 8 56577  aPlinius Secundus, Gaius  ader Ältere  aMaior  aPlinius Secundus, Caius  aMajor  aPlinius Secundus Maior, C.  aPlinius Secundus, Gajus  aPlinius Secundus, Cajus  aPlinius Secundus, C.  aPlinius, Caius  aPlinius, C.  aPlinius, Caius Secundus  aPlynius Secundus, Gaius  aPlynius Secundus, Caius  aPlynius Secundus Gaius  aPlinius  ad. Ä.  astarší  aSenior  aPlinius Secundus  aPlinius Secundius  aSenioris  aRerum Naturalium Scriptor  aFlorentino-Pragensis  aFlorentinus-Pragensis  aPline  al'Ancien  aPliny  athe Elder  ale Naturaliste  aPline, Caius  aPline Second, C.  alÁncien  aPline l'Ancien  aPlinio, Gaio Secondo  aPlinio Secundo, Caio  aPlinio Secondo, Gaio  aPlinio Segundo, Cayo  aPlinio  ail Vecchio  ael Viejo  aNapoletano  aGaius  aCaius Plinius Secundus  aSecundus, Gaius P.  aSecundus, Caius P.  aSecundus, Gaius Plinius  aSecundus, Caius Plinius  aPlinij  aPlinije Stariji  aPlinije  aStariji  aThe elder  bXT  a1070158569b0k1070158569o000158569
\ No newline at end of file
diff --git a/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1070158569_result.txt b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1070158569_result.txt
new file mode 100644
index 0000000000000000000000000000000000000000..decf887d57072f6b6b9bdc1bf0e0ffd610ba5a3a
--- /dev/null
+++ b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1070158569_result.txt
@@ -0,0 +1 @@
+C. Plini Secundi Naturalis Historiae libri XXXVII (5); Libri XXXI - XXXVII
\ No newline at end of file
diff --git a/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1072033011_fullrecord.txt b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1072033011_fullrecord.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5e8565cf17be8b961ef18bb07277ff5386ab84f2
--- /dev/null
+++ b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1072033011_fullrecord.txt
@@ -0,0 +1 @@
+01723cam a2200445  c45000010013000000030007000130050017000200070003000370080041000400350023000810350022001040350025001260350021001510400031001720410008002031000093002112450103003042460014004072640041004213000037004623360026004993370046005253380025005714900101005965910050006977730048007478100225007959510007010209830020010279840006010478520044010539830019010979690006011168520044011228520034011669000016012009510010012169510010012269800041012360-1072033011DE-62720140604111806.0tu850101s1966    xx |||||      00| ||ger c  a(DE-627)1072033011  a(DE-576)002033011  a(DE-599)BSZ002033011  a(OCoLC)310647965  aDE-627bgercDE-627erakwb  ager1 aPreidel, Helmutd1900-19800(DE-588)13629846X0(DE-627)5784835210(DE-576)1626093454aut10aSlawische Altertumskunde des östlichen Mitteleuropas im 9. und 10. Jahrhundertn3cHelmut Preidel30aslavische 1aGräfelfing bei MünchenbGansc1966  a196 S.bIll., graph. Darst., Kt.  aTextbtxt2rdacontent  aohne Hilfsmittel zu benutzenbn2rdamedia  aBandbnc2rdacarrier1 aVeröffentlichungen der Wissenschaftlichen Abteilung / Adalbert-Stifter-Verein e.V. Münchenv13  aIMD-Felder und 1131 maschinell ergänzt (SWB)18w(DE-627)1072032988w(DE-576)002032988g3q32 aAdalbert-Stifter-VereinbWissenschaftliche AbteilungtVeröffentlichungen der Wissenschaftlichen Abteilung des Adalbert-Stifter-Vereins, Münchenv13913w(DE-627)130107972w(DE-576)001045415w(DE-600)503408-5x0567-9044  aMV  a(DE-14)14701762  cB  aDE-14z2010-08-25T13:36:05Zx2015-10-21  a(DE-15)2764485  cB  aDE-15z2011-11-04T09:01:58Zx2018-11-06  aDE-L327z2015-10-06T11:43:57Z  aPreidel, H.  bXA-DE  bXA-CZ  a1072033011b0k1072033011o002033011
\ No newline at end of file
diff --git a/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1072033011_result.txt b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1072033011_result.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2a46cde888c4be9fc8c950b4aeb171ae1c9ce91e
--- /dev/null
+++ b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1072033011_result.txt
@@ -0,0 +1 @@
+Slawische Altertumskunde des östlichen Mitteleuropas im 9. und 10. Jahrhundert (3)/ Helmut Preidel
\ No newline at end of file
diff --git a/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1144749735_fullrecord.txt b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1144749735_fullrecord.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c5b9e4207f7e72cb20bf6c5d86e091f8393ef74c
--- /dev/null
+++ b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1144749735_fullrecord.txt
@@ -0,0 +1 @@
+02348cam a2200601   45000010013000000030007000130050017000200070003000370080041000400350023000810350022001040350025001260350020001510400031001710410008002020840037002101000105002472450066003522500019004182640033004373000010004703360026004803370046005063380025005524900025005775830054006025830097006567000097007538500007008508500007008579360384008649510007012489830019012559690006012748520044012809000033013249000033013579000033013909000028014239000018014519000008014699000009014779000032014869000032015189000008015509000025015589000023015839000025016069000032016319000032016639510010016959800041017050-1144749735DE-62720211026144345.0tu990310s1954    xx |||||      00| ||ger c  a(DE-627)1144749735  a(DE-576)074749730  a(DE-599)BSZ074749730  a(OCoLC)73411127  aDE-627bgercDE-627erakwb  ager  aGK 40352rvk0(DE-625)rvk/41002:1 aGoethe, Katharina Elisabethd1731-18080(DE-588)1185402460(DE-627)1370657440(DE-576)1611428184aut10aBriefe der Frau Rat Goethecausgew. und hrsg. von Rudolf Bach  a61. - 67. Tsd. 1aWiesbadenbInsel-Verl.c1954  a90 S.  aTextbtxt2rdacontent  aohne Hilfsmittel zu benutzenbn2rdamedia  aBandbnc2rdacarrier0 aInsel-Büchereiv5441 aArchivierung prüfenc20200919fDE-640z12pdager1 aArchivierung/Langzeitarchivierung gewährleistetc20211026fSLGzBuchnachlass2pdager5DE-251 aBach, Rudolfd1901-1957eHrsg.0(DE-588)1160252710(DE-627)0775576380(DE-576)2861622454edt  aeb  aaarvaGK 4035bGoethes Familie (Texte und Sekundärliteratur)kGermanistik. Niederlandistik. SkandinavistikkDeutsche LiteraturkRomantikkLiteraturgeschichtekEinzelne Autoren der GoethezeitkAutoren GkGoethe, Johann Wolfgang vonkSekundärliteraturkLeben und PersönlichkeitkGoethes Familie (Texte und Sekundärliteratur)0(DE-627)12706988850(DE-625)rvk/41002:0(DE-576)200698885  aBO  a(DE-15)3330141  cB  aDE-15z2014-08-01T17:16:54Zx2019-11-26  aTextor, Catharina Elisabetha  aGoethe, Katharina Elisabetha  aGoethe, Catharina Elisabetha  aGoethe, Catharina Elis.  aGoethe, C. E.  aAja  aFrau  aTextor, Katharina Elisabeth  aTextor, Catharina Elisabeth  aRat  aGoethe, Katharina E.  aGoethe, Elisabetha  aGoethe, Catharina E.  aGoethe, Catharina Elisabeth  aGoethe, Katharina Elisabeth  bXA-DE  a1144749735b0k1144749735o074749730
\ No newline at end of file
diff --git a/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1144749735_result.txt b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1144749735_result.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7135d003de281ee8acef3f37df7b14e773923d2a
--- /dev/null
+++ b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1144749735_result.txt
@@ -0,0 +1 @@
+Briefe der Frau Rat Goethe/ ausgew. und hrsg. von Rudolf Bach
\ No newline at end of file
diff --git a/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1172722633_fullrecord.txt b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1172722633_fullrecord.txt
new file mode 100644
index 0000000000000000000000000000000000000000..32e8079b93b1afef51555261641bf7c684575c25
--- /dev/null
+++ b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1172722633_fullrecord.txt
@@ -0,0 +1 @@
+10560cam a22032412 c45000010013000000030007000130050017000200070003000370080041000400350023000810350022001040350025001260350021001510400031001720410008002030840038002111000105002492450092003542640033004463000024004793360026005033370046005293380025005755910086006006550087006866890118007736890082008916890093009736890079010666890013011456890081011586890013012397000090012527730048013429360183013909510007015739830019015809690006015998520044016059830019016499840006016688520044016748520034017189790118017529790119018709790041019899000031020309000030020619000025020919000024021169000016021409000012021569000028021689000031021969000028022279000025022559000027022809000024023079000021023319000018023529000025023709000030023959000030024259000026024559000020024819000031025019000028025329000028025609000023025889000018026119000022026299000021026519000019026729000022026919000021027139000021027349000018027559000011027739000032027849000013028169000032028299000030028619000025028919000024029169000022029409000027029629000011029899000021030009000010030219000025030319000028030569000011030849000011030959000014031069000027031209000025031479000017031729000010031899000016031999000009032159000016032249000013032409000012032539000011032659000030032769000028033069000028033349000031033629000026033939000031034199000035034509000027034859000016035129000016035289000020035449000016035649000025035809000028036059000027036339000016036609000016036769000025036929000033037179000027037509000026037779000028038039000016038319000018038479000021038659000013038869000025038999000009039249000010039339000013039439000014039569000026039709000009039969000010040059000032040159000033040479000034040809000037041149000010041519000011041619000012041729000012041849000012041969000027042089000017042359000028042529000017042809000034042979000035043319000038043669000035044049000031044399000030044709000027045009000027045279000044045549000037045989000041046359000028046769000030047049000011047349000035047459000011047809000024047919000014048159000026048299000027048559000016048829000013048989000027049119000027049389000031049659000027049969000035050239000031050589000029050899000025051189000026051439000031051699000026052009000022052269000022052489000025052709000021052959000025053169000028053419000015053699000019053849000033054039000039054369000011054759000021054869000017055079000044055249000011055689000041055799000041056209000061056619000043057229000072057659000042058379000033058799000035059129000047059479500031059949500030060259500025060559500024060809500016061049500012061209500010061329500013061429500016061559500018061719500014061899500021062039500009062249500017062339500016062509500017062669500035062839500019063189500023063379500014063609500023063749500018063979500011064159500011064269500011064379500011064489500027064599500032064869500013065189500019065319500024065509500020065749500054065949500013066489500043066619500020067049500021067249500034067459500047067799500056068269500020068829500042069029500021069449500012069659500018069779500017069959500011070129500013070239500011070369500011070479500019070589500017070779500015070949500015071099500020071249500014071449500020071589500020071789500014071989500020072129500025072329510010072579510010072679800041072770-1172722633DE-62720140604142934.0tu030114s2002    xx |||||      00| ||ger c  a(DE-627)1172722633  a(DE-576)102722633  a(DE-599)BSZ102722633  a(OCoLC)314185903  aDE-627bgercDE-627erakwb  ager  aLI 842502rvk0(DE-625)rvk/97143:1 aGoethe, Johann Wolfgang vond1749-18320(DE-588)1185402380(DE-627)1334167200(DE-576)1611428424aut10aFaustn2pDer Tragödie zweiter Teil / mit Ill. von Max SlevogtcJohann Wolfgang Goethe 1aLeipzigbFaber & Faberc2002  a337 S.bzahlr. Ill.  aTextbtxt2rdacontent  aohne Hilfsmittel zu benutzenbn2rdamedia  aBandbnc2rdacarrier  a580,720 ddsu/shk; 5551: S1LB/sred ; IMD-Felder und 1131 maschinell ergänzt (SWB) 7aPressendruck0(DE-588)4159043-00(DE-627)1054884020(DE-576)2098470852gnd-content00Du0(DE-588)4099198-20(DE-627)10466522X0(DE-576)209350024aGoethe, Johann Wolfgang vond1749-1832tFaustn22gnd01Ds0(DE-588)4123412-10(DE-627)1045164880(DE-576)209559519aIllustration2gnd02Dp0(DE-588)1186149400(DE-627)1334383170(DE-576)163100527aSlevogt, Maxd1868-19322gnd03Ds0(DE-588)4127900-10(DE-627)1047250440(DE-576)209597518aZeichnung2gnd0 5(DE-627)10Ds0(DE-588)4036042-80(DE-627)1044008380(DE-576)209016124aLithografie2gnd1 5(DE-627)1 aSlevogt, Maxd1868-19320(DE-588)1186149400(DE-627)1334383170(DE-576)1631005274oth18w(DE-627)1172720975w(DE-576)102720975g2q2rvaLI 84250bSlevogt, MaxkKunstgeschichtekKünstler-MonografienkAlphabetische KünstlerlistekKünstler SkSlevogt, Max0(DE-627)12708836660(DE-625)rvk/97143:0(DE-576)200883666  aMV  a(DE-15)1293003  cB  aDE-15z2004-08-03T00:00:00Zx2018-05-25  a(DE-14)3529931  cB  aDE-14z2003-05-27T00:00:00Zx2015-10-21  aDE-L242z2019-10-15T11:01:37Z  f4.5.6.4.1.9Kunst9Buchgestaltung9Illustration9Anwendungsgebiete der Illustration9belletristische Illustration  f4.5.6.3.1.9Kunst9Buchgestaltung9Illustration9Techniken der Illustration9Techniken der Illustration: Zeichnung  f5.5.9Literatur9Literatur: Dramatik  aSlevogt, Franz Theodor Max  aSlevogt, Franz Theodor M.  aSlevogt, Franz T. M.  aSlevogt, Franz T.M.  aSlevogt, M.  aSlevogt  aGoethe, Johann Wolfgang  aGoethe, Johan Wolfgang von  aGoethe, Johan Wolphgang  aGoethe, Johan W. von  aGoethe, Joh. Wolfg. v.  aGoethe, J. Wolfgang  aGoethe, J. W. v.  aGoethe, J. W.  aGoethe, Jan Wolfgang  aGoethe, Jean Wolfgang von  aGoethe, Juan Wolfgang von  aGoethe, Juan Wolfgang  aGoethe, Juan W.  aGoethe, João Wolfgang von  aGoethe, Iohann Wolfgang  aGoethe, Iohan Wolphgang  aGoethe, Ioannes W.  aGoethe, I. W.  aGoethe, Wolfgango  aGoethe, Wolfango  aGoethe, W. von  aGoethe, Volfgango  aGoethe, Volfango  aGoethe, Giov. L.  aGoethe, G. L.  aGoethe  aVon Goethe, Johann Wolfgang  aGoethius  aGöthe, Johann Wolfgang von  aGöthe, Johann W. êvonë  aGöthe, Jan Wolfgang  aGöthe, Jan Wolfang  aGöthe, J. W. von  aGöthe, Giov. Volfango  aGöthe  aGöte, Iogann V.  aGöte  aGoete, Iohan V. p'on  aGoet'e, Iohan Volp'gang  aGoet'e  aGoe te  aGêôt'ê  aG'ote, Jochan Volfgang  aGete, Yohan Volfgang  aG'ote, V. f.  aG'ote  aGót, J. V.  aGót  aGo't, I. V.  aGoithios  aGotenin  aGejteh  aGete, Jōhan Wolfgang fon  aGete, Johann Volʹfgang  aGéte, Johans Volfgangs  aGėtė, Johanas Volfgangas  aGete, Jochan Volfgang  aGete, Jogann Vol'fgang fon  aGete, Jogann Vol'fgang êfonë  aGete, Jogann-Vol'fgang  aGete, J. V.  aGete, J.-V.  aGete, Iogann W.  aGete, I. W.  aGete, Iohan Volfgang  aGëte, Iogann Vol'fgang  aGëte, Johann Volfgang  aGete, I. V.  aGete, I.-V.  aGete, Yohan Wolfgang  aGete, Yôhân Wôlfgang fôn  aGête, Yôhan Wolfgang  aGete, Yohann Volfqanq  aGete, Yogann Volʹfgang  aGete, Y. W.  aGêtê, Y. W.  aGete, Volʹfgang  aGete, V.  aGete, Egan Vol'fgang  aGete  aGēte  aGě'ṭe  aGette, G.  aGede, Yuehan Wofugang  aGede  aGe de  aGeteh, Yohan Ṿolfgang fon  aGūta, Yūhān Wulfgāng fun  aGūta, Yūhān Wulfgāng fūn  aǦūta, Yūhān Wulfǧānǧ fūn  aGūta  aǦīta  aǦītā  aǦītah  aǦītih  aGiote, Johan Wolphgang  aGiote, J. W.  aGǐote, Jochan Volfgang  aGiote, J. V.  aĠūta, Yūhān Fūlfġānḡ  aĠūtah, Yūhān Fūlfġānḡ  aĠūtih, Yūhān Vūlfġanġ fūn  aĠūtih, Yūhān Fūlfġānḡ  aGoytä, Yohan Welfgang fon  aGyote, Johān Bholphgãā  aGyot'e, Yohan Wolfgang  aGyot'e, Yohan Volfgang  aGŚutih, YŚuhŚan VŚulf·gan·g fŚun  aGkaite, Giochan Bolphnkannk phon  aGkaite, Giochan Bolphnkannk êphonë  aGkaite, Giochan B. phon  aGkaite, Iōann Mpolphgang  aGkaite  aKoet'e, Yohan Polp'ŭgang p'on  aKoet'e  aKêôt'ê, Volfkank  aKēōthē  aKote, Johann Volfgang  aKote, Jochann Volfgang  aKote, J. V.  aKote, V.  aHete, Johann-Vol'fhanh  aHëte, Ëhan Vol'fhanh  aHëte, &Euml;han Vol'fhanh  aHöte, Iohann Volfqanq  aYo han Bol peu gang pon Goe te  aYohan-Bolpeugang-pon-Goete  aYue han Wo fu gang Ge de  aYuehan-Wofugang-Gede  aGyote, Yohan Wolfgang  aGoethe, Johann Wolfgang v.  aGoethe, Johann W. von  aGoethe, Johann W.  aGoethe, J. W. von  aGoethe, Wolfgang von  aGoethe, Wolfgang  aGete, Johan Volfgang  aGete, Iogann Volʹfgang  aGete, J.V.  aGoithios, I.V.  aGēte, Yohan Vorufugangu Fon  aĠūtih, Yūhān Fūlfġānġ fūn  aGoythe  aGoethe, J.W. von  aGoethe, J.W.  aГёте, Йоҳанн Волфганг  a歌德  a約翰・沃爾夫岡・馮・歌德  a约翰・沃尔夫冈・冯・歌德  aゲーテ, ヨハン・ヴォルフガング・フォン  aגתה, יוהן וולפגנג פון  aგოეთე, იოჰან ვოლფგანგ ფონ  aگيوتې, يوھان ۋولڧگاڭ  a괴테, 요한 볼프강 폰  a歌德, 约翰·沃尔夫冈·  aگوته, یوهان ولفگانگ فون  aSlevogt, Franz Theodor Max  aSlevogt, Franz Theodor M.  aSlevogt, Franz T. M.  aSlevogt, Franz T.M.  aSlevogt, M.  aSlevogt  aMaler  aRadierer  aIllustrator  aImpressionist  aAbbildung  aBuchillustration  aBuch  aIllustration  aBebilderung  aBildmaterial  aWissenschaftliche Illustration  aIllustrationen  aBuchillustrationen  aBuchkunst  aIllustriertes Buch  aKünstlerbuch  a插图  a插画  a插圖  a插畫  aИллюстрация  aGoethe, Johann Wolfgang von  aFaust II  aFaust. 2. Teil  aFaust. Zweiter Teil  aFaust : Teil II  aFaust : der Tragödie zweiter Teil in fünf Akten  aP̕austi  aFaust : The Second Part of the Tragedy  aLe second Faust  aIl secondo Faust  aFaust : Druhý díl tragédie  aFaust : tragedii część pierwsza i druga  aFaust : partea întîi si partea a doua a tragediei  aFaust drugi deo  aFaust : tragedianın ikinci bölümü  aPhaust : meros 2  aKlassik  aHandzeichnung  aZeichenkunst  aGrafik  aZeichnen  a图画  a圖畫  aРисунок  aLithographie  aSteindruck  aFlachdruck  a石版印刷术  a石印术  a平版印刷术  a石版印刷術  a石印術  a平版印刷術  aЛитография  aXA-DE  bXA-DE  a1172722633b0k1172722633o102722633
\ No newline at end of file
diff --git a/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1172722633_result.txt b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1172722633_result.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5e240339cd742a6e8b69ddde9ae836eaa9ff11d1
--- /dev/null
+++ b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-1172722633_result.txt
@@ -0,0 +1 @@
+Faust (2); Der Tragödie zweiter Teil / mit Ill. von Max Slevogt/ Johann Wolfgang Goethe
\ No newline at end of file
diff --git a/module/finc/tests/fixtures/getTitleDetails/DE-15/0-130143812_fullrecord.txt b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-130143812_fullrecord.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0ba5f4540c5ed3ba138ea0a51b3b0a522d2540c2
--- /dev/null
+++ b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-130143812_fullrecord.txt
@@ -0,0 +1 @@
+02625cas a2200721   45000010012000000030007000120050017000190070003000360080041000390160022000800160021001020220014001230350022001370350022001590350024001810350021002050350021002260400031002470410008002780440012002860820016002980840013003140840015003272450197003422460016005392640037005553360026005923370046006183380025006643620058006893630015007473630015007625010058007775910059008356550086008946890083009806890013010637700109010767850120011859350009013059360065013149510007013799830018013869690007014048520044014119830018014559840007014738520044014809830018015249840007015428520044015498520034015939840013016279840036016409840015016769840058016919500020017499500019017699500017017889500017018059500042018229800039018640-130143812DE-62720190608210910.0tu931116d18951897xx m| p|     |0   |0ger c7 a0127056912DE-1017 a513447-X2DE-600  a0176-1390  a(DE-627)130143812  a(DE-576)015683788  a(DE-599)ZDB513447-X  a(OCoLC)183368343  a(OCoLC)183368343  aDE-627bgercDE-627erakwb  ager  cXA-DXDE04a370qDE-600  a242ssgn  a81.012bkl10aAcademische RevuebZeitschrift für das internationale Hochschulwesencin Verbindung mit den Hochschulnachrichten hrsg. von der Centralstelle für das Internationale Hochschulwesen in München30aakademische31aMünchenbAkad.-Verl.c1895-1897  aTextbtxt2rdacontent  aohne Hilfsmittel zu benutzenbn2rdamedia  aBandbnc2rdacarrier0 a1.1894/95(1895),Okt. - 3.1896/97(1897),Okt. = H. 1-3600a1i1894/9510i1896/97a3  aDarin: Amtl. Bekanntmachungen, Verlags-Ankündigungen  aSortierzählung bei Bänden maschinell geändert (GBV) 7aZeitschrift0(DE-588)4067488-50(DE-627)10454466X0(DE-576)20917000X2gnd-content00Ds0(DE-588)4006681-20(DE-627)10637673X0(DE-576)208866574aBildungswesen2gnd0 5(DE-627)08iBeil.tDer StudentdMünchen : Acad.-Verl., 1896w(DE-627)129912921w(DE-600)340621-0w(DE-576)01530845600iAufgeg. intHochschulnachrichtendMünchen, 1890w(DE-627)130143855w(DE-600)513455-9w(DE-576)015683834x0176-1404  aSAXBbka81.01jGeschichte des BildungswesensqARK0(DE-627)106414518  aJT  a(DE-15)636667  cZS  aDE-15z2003-11-12T00:00:00Zx2015-10-16  a(DE-14)946026  cZS  aDE-14z2019-07-31T12:33:28Zx2018-11-05  a(DE-14)946026  cZS  aDE-14z2019-07-31T12:33:28Zx2018-11-05  aDE-2620z2019-01-14T00:00:00Z  s35.4.964  v1.1894/95,Okt. - 3.1896/97,Okt.  s19 4 15519  v1.1894/95(1895),Okt. - 3.1896/97(1897),Okt. = H. 1-36  aErziehungswesen  aBildungssystem  a教育系统  a教育系統  aСистема образования  a130143812b0k130143812o015683788
\ No newline at end of file
diff --git a/module/finc/tests/fixtures/getTitleDetails/DE-15/0-130143812_result.txt b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-130143812_result.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1e8ccd8ab61899c40d362af226c2288d992265e6
--- /dev/null
+++ b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-130143812_result.txt
@@ -0,0 +1 @@
+Academische Revue: Zeitschrift für das internationale Hochschulwesen/ in Verbindung mit den Hochschulnachrichten hrsg. von der Centralstelle für das Internationale Hochschulwesen in München
\ No newline at end of file
diff --git a/module/finc/tests/fixtures/getTitleDetails/DE-15/0-130271578_fullrecord.txt b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-130271578_fullrecord.txt
new file mode 100644
index 0000000000000000000000000000000000000000..734f93220525093e89f7a1ad88428a10d70be709
--- /dev/null
+++ b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-130271578_fullrecord.txt
@@ -0,0 +1 @@
+02025cas a2200541   45000010012000000030007000120050017000190070003000360080041000390160022000800160021001020350022001230350022001450350024001670350021001910350021002120400031002330410008002640440010002720820016002820820016002981100169003142450131004832460122006142640024007363360026007603370046007863380025008323620013008573630012008705910019008826550094009019510007009959830020010029840007010228520044010299830019010739690007010928520044010999100047011439100009011909100022011999100047012219100077012689100047013459100052013929800039014440-130271578DE-62720190706095836.0tu931116c19779999xx z| m|     |0   |0ger c7 a0131500062DE-1017 a563681-42DE-600  a(DE-627)130271578  a(DE-576)037122983  a(DE-599)ZDB563681-4  a(OCoLC)612527932  a(OCoLC)311920205  aDE-627bgercDE-627erakwb  ager  cXA-DE04a050qDE-10104a890qDE-6002 aRheinische Friedrich-Wilhelms-Universität BonnbSeminar für Orientalische KunstgeschichteeVerfasser0(DE-588)2043059-00(DE-627)1027992100(DE-576)1919264344aut10aVeröffentlichungen des Seminars für Orientalische Kunstgeschichte an der Universität BonnnReihe BpAntiquitates orientales1 iAnsetzungssachtitelaVeröffentlichungen des Seminars für Orientalische Kunstgeschichte an der Universität Bonn / B31aBonnbHabeltc1977-  aTextbtxt2rdacontent  aohne Hilfsmittel zu benutzenbn2rdamedia  aBandbnc2rdacarrier0 a1.1977 -00a1i1977  aC*180687 (GBV) 7aMonografische Reihe0(DE-588)4179998-70(DE-627)1046286690(DE-576)2099951062gnd-content  aST  a(DE-14)13837808  cMB  aDE-14z2006-03-20T09:30:29Zx2019-08-16  a(DE-15)3194642  cSE  aDE-15z2013-01-29T10:59:26Zx2019-08-19  aSeminar für Orientalische Kunstgeschichte  aBonn  aUniversität Bonn  aSeminar für orientalische Kunstgeschichte  aRheinische Friedrich-Wilhelms-Seminar für orientalische Kunstgeschichte  aRheinische Friedrich-Wilhelms-Universität  aRheinische Friedrich-Wilhelms-Universität Bonn  a130271578b0k130271578o037122983
\ No newline at end of file
diff --git a/module/finc/tests/fixtures/getTitleDetails/DE-15/0-130271578_result.txt b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-130271578_result.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5b89dd48cb593267e686658b00fbbad01e296012
--- /dev/null
+++ b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-130271578_result.txt
@@ -0,0 +1 @@
+Veröffentlichungen des Seminars für Orientalische Kunstgeschichte an der Universität Bonn (Reihe B); Antiquitates orientales
\ No newline at end of file
diff --git a/module/finc/tests/fixtures/getTitleDetails/DE-15/0-229443699_fullrecord.txt b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-229443699_fullrecord.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a5495740f0e93bafcfac5a6bd7c97a51b63fc2a0
--- /dev/null
+++ b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-229443699_fullrecord.txt
@@ -0,0 +1 @@
+01461cam a2200385  c45000010012000000030007000120050017000190070003000360080041000390350022000800350023001020350025001250350021001500400031001710410008002020440010002101000097002202450187003172640041005043000025005453360026005703370046005963380025006427100124006677730057007919510007008489830019008559690006008748520044008809000027009249100037009519100037009889510010010259800040010350-229443699DE-62720190826095828.0tu970613s1882    xx |||||      00| ||ger c  a(DE-627)229443699  a(DE-576)9229443697  a(DE-599)GBV229443699  a(OCoLC)258481121  aDE-627bgercDE-627erakwb  ager  cXA-AT1 aEngerth, Eduard vond1818-18970(DE-588)1191987970(DE-627)1454106840(DE-576)21160061X4aut10aKunsthistorische Sammlungen des allerhöchsten KaiserhausesbGemälde; beschreibendes VerzeichnisnBd. 1pItalienische, Spanische und Französische Schulencvon Eduard R. von Engerth 1aWienbSelbstverl. d. Directionc1882  aLXXXIX, 480 S.bIll.  aTextbtxt2rdacontent  aohne Hilfsmittel zu benutzenbn2rdamedia  aBandbnc2rdacarrier2 aKunsthistorische Sammlungen des Allerhöchsten Kaiserhauses0(DE-588)43012-20(DE-627)1009871840(DE-576)1903870844oth18w(DE-627)146328043w(DE-576)9146328041gBd. 1q1.1882  aMV  a(DE-15)3737738  cB  aDE-15z2019-08-26T09:42:53Zx2019-08-27  aEngerth, Eduard R. von  aKunsthistorische Sammlungen Wien  aKunsthistorisches Hofmuseum Wien  bXA-AT  a229443699b0k229443699o9229443697
\ No newline at end of file
diff --git a/module/finc/tests/fixtures/getTitleDetails/DE-15/0-229443699_result.txt b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-229443699_result.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bb1b6ed4085140d3fc61defe0ddefb30f8bf8da1
--- /dev/null
+++ b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-229443699_result.txt
@@ -0,0 +1 @@
+Kunsthistorische Sammlungen des allerhöchsten Kaiserhauses: Gemälde; beschreibendes Verzeichnis (Bd. 1); Italienische, Spanische und Französische Schulen/ von Eduard R. von Engerth
\ No newline at end of file
diff --git a/module/finc/tests/fixtures/getTitleDetails/DE-15/0-647227738_fullrecord.txt b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-647227738_fullrecord.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0789178a6d5ae9317b795e36300422f079d3b3fe
--- /dev/null
+++ b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-647227738_fullrecord.txt
@@ -0,0 +1 @@
+03475cam a2200829  c45000010012000000030007000120050017000190070015000360080041000510350022000920350023001140350025001370350021001620400031001830410008002140440012002220840012002340840015002460840015002612450420002762640034006963000015007303360040007453370032007853380037008175330114008545350031009686890088009996890086010876890085011736890078012586890075013366890013014117000079014247730073015037760130015768560097017069360080018039360054018839510007019378560073019448520031020179700007020489710010020559720010020659730007020759350009020828520018020918520017021098520016021268520017021428520016021599500023021759500032021989500040022309500054022709500011023249500011023359500015023469500025023619500025023869500024024119500023024359500026024589500035024849500022025199500024025419500012025659510012025779510010025899800046025990-647227738DE-62720190310045822.0cr uuu---uuuuu110223s1882    xx |||||o     00| ||ger c  a(DE-627)647227738  a(DE-576)9647227736  a(DE-599)GBV647227738  a(OCoLC)837931834  aDE-627bgercDE-627erakwb  ager  cXA-DXDE  a22ssgn  a86.102bkl  a86.132bkl14aDie Verwaltung bei den Justizbehörden in PreußenbHandbuch zum praktischen Gebrauch in zwei AbtheilungennAbtheilung 2pBestimmungen über die Verwaltung im allgemeinen insbesondere über die persönichen Verhältnisse der Beamten nach den Gesetzen, Verordnungen, Erlassen, Ministerial-Verfügungen etc. mit Berücksichtigung der Verwaltungsgrundsätze, systematisch bearbeitet und erläutertnBd. 2cvon Hertting 1aBerlinbHeymanns Verlagc1882  aXI, 588 S.  anicht spezifiziertbzzz2rdacontent  aComputermedienbc2rdamedia  aOnline-Ressourcebcr2rdacarrier  aOnline-Ausg.d20117|2011||||||||||eOnline-Ressource (Text)fDeutsches Territorialrecht des 19. Jahrhunderts1 aSBB-PK Berlin3Gs 6905-2,200Ds0(DE-588)4117364-80(DE-627)1057998740(DE-576)209509309aVerwaltungshandeln2gnd01Ds0(DE-588)4029081-50(DE-627)1062758440(DE-576)208980903aJustizverwaltung2gnd02Ds0(DE-588)4738572-80(DE-627)3664448910(DE-576)215907574aGerichtsordnung2gnd03Dg0(DE-588)4047194-90(DE-627)1045168280(DE-576)209072652aPreußen2gnd04Ds0(DE-588)4048737-40(DE-627)1061897190(DE-576)20907907XaRecht2gnd0 5(DE-627)1 aHertting, A.0(DE-588)1727882930(DE-627)6977190060(DE-576)1336448204oth18w(DE-627)647226901w(DE-576)964722690XgAbtheilung 2, Bd. 2q2,2.188208iDruckausg.tDie Verwaltung bei den Justizbehörden in PreußendBerlin : Heymanns Verlag, 1882hXI, 588 S.w(DE-627)14133835040uhttp://resolver.staatsbibliothek-berlin.de/SBB0000444900030000xVerlagzKostenfrei3Volltextbka86.10jRecht einzelner Länder, Gebiete und VölkerqARK0(DE-627)106422499bka86.13jGerichtsverfassungqARK0(DE-627)106411411  aMV40uhttp://resolver.staatsbibliothek-berlin.de/SBB00004449000300009LFER  aLFERz2019-11-13T00:00:00Z  cOD  cEBOOK  cEBOOK  cEB  alfer  2lferaDE-Zwi2  2lferaDE-Ch1  2lferaDE-15  2lferaDE-105  2lferaDE-14  aGerichtsverwaltung  aOrdentliche Gerichtsbarkeit  aУправление юстиции  aАдминистративное действие  a法制  a法律  aПраво  aBrandenburg-Preußen  aKönigreich Preußen  aPreußische Staaten  aPreußischer Staat  aDer Preußische Staat  aKöniglich Preußische Staaten  aPrusy Królewskie  aKöniglich Preußen  aPrussia  aXA-DXDE  aXA-DE  a647227738b0k647227738o9647227736clfer
\ No newline at end of file
diff --git a/module/finc/tests/fixtures/getTitleDetails/DE-15/0-647227738_result.txt b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-647227738_result.txt
new file mode 100644
index 0000000000000000000000000000000000000000..fdc0055c1f8fb900a78bbea694d044c647a1597f
--- /dev/null
+++ b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-647227738_result.txt
@@ -0,0 +1 @@
+Die Verwaltung bei den Justizbehörden in Preußen: Handbuch zum praktischen Gebrauch in zwei Abtheilungen (Abtheilung 2, Bd. 2); Bestimmungen über die Verwaltung im allgemeinen insbesondere über die persönichen Verhältnisse der Beamten nach den Gesetzen, Verordnungen, Erlassen, Ministerial-Verfügungen etc. mit Berücksichtigung der Verwaltungsgrundsätze, systematisch bearbeitet und erläutert/ von Hertting
\ No newline at end of file
diff --git a/module/finc/tests/fixtures/getTitleDetails/DE-15/0-682748102_fullrecord.txt b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-682748102_fullrecord.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3abe46b4889ee8112ec4eaf62b64afce04391889
--- /dev/null
+++ b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-682748102_fullrecord.txt
@@ -0,0 +1 @@
+07111cam a2202317  a45000010012000000030007000120050017000190070015000360080041000510350022000920350023001140350025001370400031001620410008001930440012002011000105002132450034003182560065003522640033004173000009004503360040004593370032004993380037005314900021005685330163005899510007007528520031007599700007007909710010007979720010008079730007008179350009008248520016008338520017008498520016008668520017008828520018008999000028009179000031009459000028009769000025010049000027010299000024010569000021010809000018011019000025011199000030011449000030011749000026012049000020012309000031012509000028012819000028013099000023013379000018013609000022013789000021014009000019014219000022014409000021014629000021014839000018015049000011015229000032015339000013015659000032015789000030016109000025016409000024016659000022016899000027017119000011017389000021017499000010017709000025017809000028018059000011018339000011018449000014018559000027018699000025018969000017019219000010019389000016019489000009019649000016019739000013019899000012020029000011020149000030020259000028020559000028020839000031021119000026021429000031021689000035021999000027022349000016022619000016022779000020022939000016023139000025023299000028023549000027023829000016024099000016024259000025024419000033024669000027024999000026025269000028025529000016025809000018025969000021026149000013026359000025026489000009026739000010026829000013026929000014027059000026027199000009027459000010027549000032027649000033027969000034028299000037028639000010029009000011029109000012029219000012029339000012029459000027029579000017029849000028030019000017030299000034030469000035030809000038031159000035031539000031031889000030032199000027032499000027032769000044033039000037033479000041033849000028034259000030034539000011034839000035034949000011035299000024035409000014035649000026035789000027036049000016036319000013036479000027036609000027036879000031037149000027037459000035037729000031038079000029038389000025038679000026038929000031039189000026039499000022039759000022039979000025040199000021040449000025040659000028040909000015041189000019041339000033041529000039041859000011042249000021042359000017042569000044042739000011043179000041043289000041043699000061044109000043044719000072045149000042045869000033046289000035046619000047046969510010047439800040047530-682748102DE-62720170914001141.0cr g| 008aabda120111m19449999xx |||||o     00| ||ger c  a(DE-627)682748102  a(DE-576)9682748100  a(DE-599)GBV682748102  aDE-627bgercDE-627erakwb  ager  cXA-DXDE1 aGoethe, Johann Wolfgang vond1749-18320(DE-588)1185402380(DE-627)1334167200(DE-576)1611428424aut10aFaustbeine TragödiecGoethe  aJPEG, 8 bit (Graustufen); Digitalisierungsvorlage: Mikrofilm 1aBerlinbSuhrkampc[um 1944-]  c12°  anicht spezifiziertbzzz2rdacontent  aComputermedienbc2rdamedia  aOnline-Ressourcebcr2rdacarrier0 aPantheon-Ausgabe  aOnline-Ausg.bDresdencAlpha Com Sachsend20097|2009||||||||||eOnline-RessourcefFaustsammlung der HAAB WeimarfProjekt Sicherungsverfilmung der HAAB Weimar  aMC  aLFERz2019-11-13T00:00:00Z  cOD  cEBOOK  cEBOOK  cEB  alfer  2lferaDE-14  2lferaDE-105  2lferaDE-15  2lferaDE-Ch1  2lferaDE-Zwi2  aGoethe, Johann Wolfgang  aGoethe, Johan Wolfgang von  aGoethe, Johan Wolphgang  aGoethe, Johan W. von  aGoethe, Joh. Wolfg. v.  aGoethe, J. Wolfgang  aGoethe, J. W. v.  aGoethe, J. W.  aGoethe, Jan Wolfgang  aGoethe, Jean Wolfgang von  aGoethe, Juan Wolfgang von  aGoethe, Juan Wolfgang  aGoethe, Juan W.  aGoethe, João Wolfgang von  aGoethe, Iohann Wolfgang  aGoethe, Iohan Wolphgang  aGoethe, Ioannes W.  aGoethe, I. W.  aGoethe, Wolfgango  aGoethe, Wolfango  aGoethe, W. von  aGoethe, Volfgango  aGoethe, Volfango  aGoethe, Giov. L.  aGoethe, G. L.  aGoethe  aVon Goethe, Johann Wolfgang  aGoethius  aGöthe, Johann Wolfgang von  aGöthe, Johann W. êvonë  aGöthe, Jan Wolfgang  aGöthe, Jan Wolfang  aGöthe, J. W. von  aGöthe, Giov. Volfango  aGöthe  aGöte, Iogann V.  aGöte  aGoete, Iohan V. p'on  aGoet'e, Iohan Volp'gang  aGoet'e  aGoe te  aGêôt'ê  aG'ote, Jochan Volfgang  aGete, Yohan Volfgang  aG'ote, V. f.  aG'ote  aGót, J. V.  aGót  aGo't, I. V.  aGoithios  aGotenin  aGejteh  aGete, Jōhan Wolfgang fon  aGete, Johann Volʹfgang  aGéte, Johans Volfgangs  aGėtė, Johanas Volfgangas  aGete, Jochan Volfgang  aGete, Jogann Vol'fgang fon  aGete, Jogann Vol'fgang êfonë  aGete, Jogann-Vol'fgang  aGete, J. V.  aGete, J.-V.  aGete, Iogann W.  aGete, I. W.  aGete, Iohan Volfgang  aGëte, Iogann Vol'fgang  aGëte, Johann Volfgang  aGete, I. V.  aGete, I.-V.  aGete, Yohan Wolfgang  aGete, Yôhân Wôlfgang fôn  aGête, Yôhan Wolfgang  aGete, Yohann Volfqanq  aGete, Yogann Volʹfgang  aGete, Y. W.  aGêtê, Y. W.  aGete, Volʹfgang  aGete, V.  aGete, Egan Vol'fgang  aGete  aGēte  aGě'ṭe  aGette, G.  aGede, Yuehan Wofugang  aGede  aGe de  aGeteh, Yohan Ṿolfgang fon  aGūta, Yūhān Wulfgāng fun  aGūta, Yūhān Wulfgāng fūn  aǦūta, Yūhān Wulfǧānǧ fūn  aGūta  aǦīta  aǦītā  aǦītah  aǦītih  aGiote, Johan Wolphgang  aGiote, J. W.  aGǐote, Jochan Volfgang  aGiote, J. V.  aĠūta, Yūhān Fūlfġānḡ  aĠūtah, Yūhān Fūlfġānḡ  aĠūtih, Yūhān Vūlfġanġ fūn  aĠūtih, Yūhān Fūlfġānḡ  aGoytä, Yohan Welfgang fon  aGyote, Johān Bholphgãā  aGyot'e, Yohan Wolfgang  aGyot'e, Yohan Volfgang  aGŚutih, YŚuhŚan VŚulf·gan·g fŚun  aGkaite, Giochan Bolphnkannk phon  aGkaite, Giochan Bolphnkannk êphonë  aGkaite, Giochan B. phon  aGkaite, Iōann Mpolphgang  aGkaite  aKoet'e, Yohan Polp'ŭgang p'on  aKoet'e  aKêôt'ê, Volfkank  aKēōthē  aKote, Johann Volfgang  aKote, Jochann Volfgang  aKote, J. V.  aKote, V.  aHete, Johann-Vol'fhanh  aHëte, Ëhan Vol'fhanh  aHëte, &Euml;han Vol'fhanh  aHöte, Iohann Volfqanq  aYo han Bol peu gang pon Goe te  aYohan-Bolpeugang-pon-Goete  aYue han Wo fu gang Ge de  aYuehan-Wofugang-Gede  aGyote, Yohan Wolfgang  aGoethe, Johann Wolfgang v.  aGoethe, Johann W. von  aGoethe, Johann W.  aGoethe, J. W. von  aGoethe, Wolfgang von  aGoethe, Wolfgang  aGete, Johan Volfgang  aGete, Iogann Volʹfgang  aGete, J.V.  aGoithios, I.V.  aGēte, Yohan Vorufugangu Fon  aĠūtih, Yūhān Fūlfġānġ fūn  aGoythe  aGoethe, J.W. von  aGoethe, J.W.  aГёте, Йоҳанн Волфганг  a歌德  a約翰・沃爾夫岡・馮・歌德  a约翰・沃尔夫冈・冯・歌德  aゲーテ, ヨハン・ヴォルフガング・フォン  aגתה, יוהן וולפגנג פון  aგოეთე, იოჰან ვოლფგანგ ფონ  aگيوتې, يوھان ۋولڧگاڭ  a괴테, 요한 볼프강 폰  a歌德, 约翰·沃尔夫冈·  aگوته, یوهان ولفگانگ فون  bXA-DE  a682748102b0k682748102o9682748100
\ No newline at end of file
diff --git a/module/finc/tests/fixtures/getTitleDetails/DE-15/0-682748102_result.txt b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-682748102_result.txt
new file mode 100644
index 0000000000000000000000000000000000000000..fcd1ae307e47fa19ec3446b0de68879dc3f7c579
--- /dev/null
+++ b/module/finc/tests/fixtures/getTitleDetails/DE-15/0-682748102_result.txt
@@ -0,0 +1 @@
+Faust: eine Tragödie/ Goethe
\ No newline at end of file
diff --git a/module/finc/tests/fixtures/getTitleDetails/DE-15/106-IDC14405_fullrecord.txt b/module/finc/tests/fixtures/getTitleDetails/DE-15/106-IDC14405_fullrecord.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4f8a00d492905a92247b5ff5b57c983edc9b3f50
--- /dev/null
+++ b/module/finc/tests/fixtures/getTitleDetails/DE-15/106-IDC14405_fullrecord.txt
@@ -0,0 +1 @@
+01555cam a22003974a 4500001001300000003000700013005001700020006001900037007001500056008004100071035002900112035002000141040003400161090001200195095001600207099002100223100003800244245007700282246004900359260003400408300002100442500003600463506003800499530003100537533019300568752002100761773003800782773004500820773003000865776001500895830004200910830004600952830003300998856008101031980004501112106-IDC14405nllekb20100217120344.0m        d        cr bn----anbun040416s19uu    gw      b     ||0|1 rus d  a(CStRLIN)NYPGR31279884-B  a(OCoLC)31279884  aRPBcRPBdNNdNeLeIDCdnllekb  a0521.33  aPS-0521-001  aR-1077c26.50dh1 aMariengof, Anatoliĭ,d1897-1962.10aBrityĭ chelovekh[electronic resource] :broman /cAnatoliĭ Mariengof.1 iTitle on microfiche header:aBrityj čelovek  aBerlin :bPetropolis,c[19--]  a121 p. ;c18 cm.  aPublisher's device on fly-leaf.  aAccess restricted to subscribers.  aAlso issued on microfiche.  aElectronic resource.bLeiden :cIDC,d2010.f(Russia USSR Eastern Europe ; R-1077)f(Russian Avant-garde, 1904-1946 ; R-1077)f(Russian symbolism ; R-1077)nMode of access: World Wide Web.  aGermanydBerlin.0 tRussia USSR Eastern EuropewIDC860 tRussian Avant-garde, 1904-1946wIDC143060 tRussian symbolismwIDC1240 hMicrofiche 0aRussia USSR Eastern Europe ;vR-1077. 0aRussian Avant-garde, 1904-1946 ;vR-1077. 0aRussian symbolism ;vR-1077.4 zDigital images available at:uhttp://dx.doi.org/10.1163/9789004192676.R-1077  aIDC14405b106csid-106-col-slavicstudies
\ No newline at end of file
diff --git a/module/finc/tests/fixtures/getTitleDetails/DE-15/106-IDC14405_result.txt b/module/finc/tests/fixtures/getTitleDetails/DE-15/106-IDC14405_result.txt
new file mode 100644
index 0000000000000000000000000000000000000000..09724cc8e2aaf5a42f91ce8b6914bda477a971e7
--- /dev/null
+++ b/module/finc/tests/fixtures/getTitleDetails/DE-15/106-IDC14405_result.txt
@@ -0,0 +1 @@
+BrityÄ­ chelovek [electronic resource] : roman / AnatoliÄ­ Mariengof.
\ No newline at end of file
diff --git a/module/finc/tests/fixtures/getTitleDetails/DE-15/finc-147-978-0-230-27613-0_fullrecord.txt b/module/finc/tests/fixtures/getTitleDetails/DE-15/finc-147-978-0-230-27613-0_fullrecord.txt
new file mode 100644
index 0000000000000000000000000000000000000000..cbc9a1a7b224a4ab95315c578b47ed7b0193fe3f
--- /dev/null
+++ b/module/finc/tests/fixtures/getTitleDetails/DE-15/finc-147-978-0-230-27613-0_fullrecord.txt
@@ -0,0 +1 @@
+01778nam a22004335i 4500001002700000003000900027005001700036007001500053008004100068020003700109024003100146050001600177072001600193072002300209082001200232245017200244264007500416300003200491336002600523337002600549338003600575347002400611520022400635650002900859650002400888650002300912650001500935650002900950650003000979700003401009700003401043710003401077773002001111776003601131856004401167912001401211950006101225980005801286finc-147-978-0-230-27613-0DE-He21320160523200815.0cr nn 008mamaa151204s2010    xxk|    s    |||| 0|eng d  a97802302761309978-0-230-27613-07 a10.1057/97802302761302doi 4aHF1351-1647 7aKCL2bicssc 7aBUS0690202bisacsh04a33722310aReport on the State of the European Unionh[electronic resource] :bVolume 3: Crisis in the EU Economic Governance /cedited by Jean-Paul Fitoussi, Jacques Le Cacheux. 1aLondon :bPalgrave Macmillan UK :bImprint: Palgrave Macmillan,c2010.  aX, 210 p.bonline resource.  atextbtxt2rdacontent  acomputerbc2rdamedia  aonline resourcebcr2rdacarrier  atext filebPDF2rda  aThe Report on the State of the European Union examines the progress of European integration and focuses on economic aspects of the process. This third volume in the series explores the EU in light of the current crisis. 0aInternational economics. 0aRegional economics. 0aSpatial economics.14aEconomics.24aInternational Economics.24aRegional/Spatial Science.1 aFitoussi, Jean-Paul.eeditor.1 aCacheux, Jacques Le.eeditor.2 aSpringerLink (Online service)0 tSpringer eBooks08iPrinted edition:z978134931731840uhttp://dx.doi.org/10.1057/9780230276130  aZDB-2-PEF  aPalgrave Economics & Finance Collection (Springer-41136)  a978-0-230-27613-0b147csid-147-col-palgraveeconomics
\ No newline at end of file
diff --git a/module/finc/tests/fixtures/getTitleDetails/DE-15/finc-147-978-0-230-27613-0_result.txt b/module/finc/tests/fixtures/getTitleDetails/DE-15/finc-147-978-0-230-27613-0_result.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8834abd13f62cdc1e68b468b6d4d85accca534f7
--- /dev/null
+++ b/module/finc/tests/fixtures/getTitleDetails/DE-15/finc-147-978-0-230-27613-0_result.txt
@@ -0,0 +1 @@
+Report on the State of the European Union [electronic resource] : Volume 3: Crisis in the EU Economic Governance / edited by Jean-Paul Fitoussi, Jacques Le Cacheux.
\ No newline at end of file
diff --git a/module/finc/tests/unit-tests/src/fincTest/RecordDriver/SolrMarcFincTestCase.php b/module/finc/tests/unit-tests/src/fincTest/RecordDriver/SolrMarcFincTestCase.php
index 1b5e7ec45dd969f10709e13e1aeaef9304dc1b5a..762ef96f63f35f3d8fbd23cf0c6f0c73b020cd0b 100644
--- a/module/finc/tests/unit-tests/src/fincTest/RecordDriver/SolrMarcFincTestCase.php
+++ b/module/finc/tests/unit-tests/src/fincTest/RecordDriver/SolrMarcFincTestCase.php
@@ -118,6 +118,65 @@ class SolrMarcFincTestCase extends VuFindTestCase
         $expectedResult = $expectedResult ?? $this->getFixtureData("/getUrls/{$testCase}_result.json");
         $this->assertEquals($expectedResult, $actualResult);
     }
+
+    /**
+     * @return void
+     */
+    public function testGetTitleDetails(): void
+    {
+        $fixtures = [
+            '106-IDC14405'               => 'DE-15',
+            'finc-147-978-0-230-27613-0' => 'DE-15'
+        ];
+
+        $this->runTestGetTitleDetails($fixtures, true);
+    }
+
+    /**
+     * @return void
+     */
+    public function testGetTitleDetailsSetPunctuation(): void
+    {
+        // "245a: 245b (245n); 245p/ 245c"
+        $fixtures = [
+            '0-682748102'  => 'DE-15', // |a Faust  |b eine Tragödie  |c Goethe
+            '0-1144749735' => 'DE-15', // |a Briefe der Frau Rat Goethe  |c ausgew. und hrsg. von Rudolf Bach
+            '0-1172722633' => 'DE-15', // |a Faust  |n 2  |p Der Tragödie zweiter Teil / mit Ill. von Max Slevogt  |c Johann Wolfgang Goethe
+            '0-1070158569' => 'DE-15', // |a C. Plini Secundi Naturalis Historiae libri XXXVII  |n 5  |p Libri XXXI - XXXVII
+            '0-130143812'  => 'DE-15', // |a Academische Revue  |b Zeitschrift für das internationale Hochschulwesen  |c in Verbindung mit den Hochschulnachrichten hrsg. von der Centralstelle für das Internationale Hochschulwesen in München
+            '0-229443699'  => 'DE-15', // |a Kunsthistorische Sammlungen des allerhöchsten Kaiserhauses  |b Gemälde; beschreibendes Verzeichnis  |n Bd. 1  |p Italienische, Spanische und Französische Schulen  |c von Eduard R. von Engerth
+            '0-647227738'  => 'DE-15', // |a Die Verwaltung bei den Justizbehörden in Preußen  |b Handbuch zum praktischen Gebrauch in zwei Abtheilungen  |n Abtheilung 2  |p Bestimmungen über die Verwaltung im allgemeinen insbesondere über die persönichen Verhältnisse der Beamten nach den Gesetzen, Verordnungen, Erlassen, Ministerial-Verfügungen etc. mit Berücksichtigung der Verwaltungsgrundsätze, systematisch bearbeitet und erläutert  |n Bd. 2  |c von Hertting
+            '0-130271578'  => 'DE-15', // |a Veröffentlichungen des Seminars für Orientalische Kunstgeschichte an der Universität Bonn  |n Reihe B  |p Antiquitates orientales
+            '0-1072033011' => 'DE-15'  // |a Slawische Altertumskunde des östlichen Mitteleuropas im 9. und 10. Jahrhundert  |n 3  |c Helmut Preidel
+        ];
+
+        $this->runTestGetTitleDetails($fixtures, false);
+    }
+
+    /**
+     * @param array $fixtures
+     * @param bool  $hasPunctuation
+     *
+     * @return void
+     */
+    protected function runTestGetTitleDetails(array $fixtures, $hasPunctuation): void
+    {
+        foreach ($fixtures as $recordId => $isil) {
+            $driver = $this->getDriverMock();
+            $driver->setFullRecord($this->getFixtureData("getTitleDetails/{$isil}/{$recordId}_fullrecord.txt", false));
+            $this->assertEquals(
+                $driver->hasPunctuation(),
+                $hasPunctuation,
+                "{$isil}: Record {$recordId} " . ($hasPunctuation ? "has no punctuation as expected." : "has punctuation but shouldn't.")
+            );
+            $expected = $this->getFixtureData("getTitleDetails/{$isil}/{$recordId}_result.txt", false);
+            $this->assertEquals(
+                $expected,
+                implode($driver->getTitleDetails()),
+                "{$isil}: Record {$recordId} title punctuation does not match expected result: \"" . $expected . "\""
+            );
+        }
+    }
 }
 
 class SolrMarcFincDriverMock extends SolrMarcFincDriver
diff --git a/themes/finc-accessibility/js/record.js b/themes/finc-accessibility/js/record.js
index 26da27f6f5f484bf429a4eab12162fc12bf15de8..4061aac960994b15678094cb98e48c07a075ac3f 100644
--- a/themes/finc-accessibility/js/record.js
+++ b/themes/finc-accessibility/js/record.js
@@ -145,15 +145,6 @@ function registerTabEvents() {
   VuFind.lightbox.bind('.tab-pane.active');
 }
 
-function removeHashFromLocation() {
-  if (window.history.replaceState) {
-    var href = window.location.href.split('#');
-    window.history.replaceState({}, document.title, href[0]);
-  } else {
-    window.location.hash = '#';
-  }
-}
-
 function ajaxLoadTab($newTab, tabid, setHash) {
   // Request the tab via AJAX:
   $.ajax({
@@ -171,12 +162,7 @@ function ajaxLoadTab($newTab, tabid, setHash) {
       if (typeof syn_get_widget === "function") {
         syn_get_widget();
       }
-      if (typeof setHash == 'undefined' || setHash) {
-        window.location.hash = tabid;
-      } else {
-        removeHashFromLocation();
-      }
-      setupJumpMenus($newTab);
+      $('.tab-pane.active').find(':focusable').eq(0).focus();
     });
   return false;
 }
@@ -246,22 +232,6 @@ function backgroundLoadTab(tabid) {
   return ajaxLoadTab(newTab, tabid, false);
 }
 
-function applyRecordTabHash() {
-  var activeTab = $('.record-tabs li.active').attr('data-tab');
-  var $initiallyActiveTab = $('.record-tabs li.initiallyActive a');
-  var newTab = typeof window.location.hash !== 'undefined'
-    ? window.location.hash.toLowerCase() : '';
-
-  // Open tab in url hash
-  if (newTab.length <= 1 || newTab === '#tabnav') {
-    $initiallyActiveTab.click();
-  } else if (newTab.length > 1 && '#' + activeTab !== newTab) {
-    $('.' + newTab.substr(1) + ' a').click();
-  }
-}
-
-$(window).on('hashchange', applyRecordTabHash);
-
 function recordDocReady() {
   $('.record-tabs .nav-tabs a').click(function recordTabsClick() {
     var $li = $(this).parent();
@@ -288,7 +258,6 @@ function recordDocReady() {
       // now need to return -- just switch it back on.
       if ($li.hasClass('initiallyActive')) {
         $(this).tab('show');
-        window.location.hash = 'tabnav';
         return false;
       }
       // otherwise, we need to let the browser follow the link:
@@ -297,21 +266,11 @@ function recordDocReady() {
     $(this).tab('show');
     if ($top.find('.' + tabid + '-tab').length > 0) {
       $top.find('.' + tabid + '-tab').addClass('active');
-      if ($top.find('#' + tabid ).length) {
-        $top.find('#' + tabid ).parent().focus();
-      }
-      if ($(this).parent().hasClass('initiallyActive')) {
-        removeHashFromLocation();
-      } else {
-        window.location.hash = tabid;
-      }
+      $('.tab-pane.active').find(':focusable').eq(0).focus();
       return false;
     } else {
       var newTab = getNewRecordTab(tabid).addClass('active');
       $top.find('.tab-content').append(newTab);
-      if ($top.find('#' + tabid ).length) {
-        $top.find('#' + tabid ).parent().focus();
-      }
       return ajaxLoadTab(newTab, tabid, !$(this).parent().hasClass('initiallyActive'));
     }
   });
@@ -321,5 +280,4 @@ function recordDocReady() {
   });
 
   registerTabEvents();
-  applyRecordTabHash();
 }
diff --git a/themes/finc/scss/compiled.scss b/themes/finc/scss/compiled.scss
index 76039d0252fecf7b2c7694f303a9e0ad12b69170..9eaea47a0003c36ad2a9ac4563e56412c2e8029b 100644
--- a/themes/finc/scss/compiled.scss
+++ b/themes/finc/scss/compiled.scss
@@ -579,8 +579,13 @@ select:hover {
     }
 
     input {
+      margin-left: 1.4rem;
       position: relative;
     }
+
+    label {
+      padding-left: 0;
+    }
   }
 }
 
@@ -3345,6 +3350,12 @@ input {
   label[data-required="true"][for]::after {
     content: ' *';
   }
+
+  .form-group {
+    ul li {
+      color: $brand-danger;
+    }
+  }
 }
 
 // ZEND-FORMS - END
diff --git a/themes/finc/templates/documentdeliveryservice/zform.phtml b/themes/finc/templates/documentdeliveryservice/zform.phtml
index 4f9481ef1576f6cae903b6ae234e8eecb731d49a..fde5f06b3def634a62156ddeff3e1c886c575bd3 100644
--- a/themes/finc/templates/documentdeliveryservice/zform.phtml
+++ b/themes/finc/templates/documentdeliveryservice/zform.phtml
@@ -50,7 +50,7 @@ $formElementErrors->setTranslatorTextDomain('DDS');
     <?php if ($this->department): ?>
       <input type="hidden" name="subito[hdepartment]" value="<?=$this->department?>"/>
     <?php endif; ?>
-  <? /* name */ ?>
+  <?php /* name */ ?>
   <?php
   /** @var Element\Text $elemName */
   $elemName = $form->get('username');
@@ -63,7 +63,7 @@ $formElementErrors->setTranslatorTextDomain('DDS');
     <?=$this->formElementErrors($elemName)?>
   </div>
 
-  <? /* phone */ ?>
+  <?php /* phone */ ?>
   <?php
   /** @var Element\Text $elemPhone */
   $elemPhone = $form->get('phone');
@@ -75,7 +75,7 @@ $formElementErrors->setTranslatorTextDomain('DDS');
     <?=$this->formElement($elemPhone)?>
   </div>
 
-  <? /* email */ ?>
+  <?php /* email */ ?>
   <?php
   /** @var Element\Email $elemEmail */
   $elemEmail = $form->get('email');
@@ -88,7 +88,7 @@ $formElementErrors->setTranslatorTextDomain('DDS');
     <?=$this->formElementErrors($elemEmail)?>
   </div>
 
-  <? /* userid */ ?>
+  <?php /* userid */ ?>
   <?php
   /** @var Element\Text $elemUserid */
   $elemUserid = $form->get('userid');
@@ -101,7 +101,7 @@ $formElementErrors->setTranslatorTextDomain('DDS');
     <?=$this->formElementErrors($elemUserid)?>
   </div>
 
-  <? /* division */ ?>
+  <?php /* division */ ?>
   <?php
   /** @var Element\Select $elemDivision */
   $elemDivision = $form->get('division');
@@ -114,7 +114,7 @@ $formElementErrors->setTranslatorTextDomain('DDS');
     <?=$this->formElementErrors($elemDivision)?>
   </div>
 
-  <? /* department */ ?>
+  <?php /* department */ ?>
   <?php
   /** @var Element\Select $elemDepartment */
   $elemDepartment = $form->get('department');
@@ -127,7 +127,7 @@ $formElementErrors->setTranslatorTextDomain('DDS');
     <?=$this->formElementErrors($elemDepartment)?>
   </div>
 
-  <? /* department medicine */ ?>
+  <?php /* department medicine */ ?>
   <?php
   /** @var Element\Text $elemMdepartment */
   $elemMdepartment = $form->get('inputdepartment');
@@ -140,7 +140,7 @@ $formElementErrors->setTranslatorTextDomain('DDS');
     <?=$this->formElementErrors($elemMdepartment)?>
   </div>
 
-  <? /* author */ ?>
+  <?php /* author */ ?>
   <?php
   /** @var Element\Text $elemAuthor */
   $elemAuthor = $form->get('author');
@@ -153,7 +153,7 @@ $formElementErrors->setTranslatorTextDomain('DDS');
     <?=$this->formElementErrors($elemAuthor)?>
   </div>
 
-  <? /* title of issue */ ?>
+  <?php /* title of issue */ ?>
   <?php
   /** @var Element\Text $elemArticle */
   $elemArticle = $form->get('article');
@@ -166,7 +166,7 @@ $formElementErrors->setTranslatorTextDomain('DDS');
     <?=$this->formElementErrors($elemArticle)?>
   </div>
 
-  <? /* title of journal */ ?>
+  <?php /* title of journal */ ?>
   <?php
   /** @var Element\Text $elemJournal */
   $elemJournal = $form->get('journal');
@@ -179,7 +179,7 @@ $formElementErrors->setTranslatorTextDomain('DDS');
     <?=$this->formElementErrors($elemJournal)?>
   </div>
 
-  <? /* issn */ ?>
+  <?php /* issn */ ?>
   <?php
   /** @var Element\Text $elemIssn */
   $elemIssn = $form->get('issn');
@@ -192,7 +192,7 @@ $formElementErrors->setTranslatorTextDomain('DDS');
     <?=$this->formElementErrors($elemIssn)?>
   </div>
 
-  <? /* publish date */ ?>
+  <?php /* publish date */ ?>
   <?php
   /** @var Element\Text $elemPublishdate */
   $elemPublishdate = $form->get('publishdate');
@@ -205,7 +205,7 @@ $formElementErrors->setTranslatorTextDomain('DDS');
     <?=$this->formElementErrors($elemPublishdate)?>
   </div>
 
-  <? /* journal number */ ?>
+  <?php /* journal number */ ?>
   <?php
   /** @var Element\Text $elemNumber */
   $elemNumber = $form->get('number');
@@ -218,7 +218,7 @@ $formElementErrors->setTranslatorTextDomain('DDS');
     <?=$this->formElementErrors($elemNumber)?>
   </div>
 
-  <? /* pages */ ?>
+  <?php /* pages */ ?>
   <?php
   /** @var Element\Text $elemPages */
   $elemPages = $form->get('pages');
@@ -231,7 +231,7 @@ $formElementErrors->setTranslatorTextDomain('DDS');
     <?=$this->formElementErrors($elemPages)?>
   </div>
 
-  <? /* remarks */ ?>
+  <?php /* remarks */ ?>
   <?php
   /** @var Element\Textarea $elemRemarks */
   $elemRemarks = $form->get('remarks');
@@ -244,7 +244,7 @@ $formElementErrors->setTranslatorTextDomain('DDS');
     <?=$this->formElementErrors($elemRemarks)?>
   </div>
 
-  <? /* submit button */ ?>
+  <?php /* submit button */ ?>
   <?php
   /** @var Submit $elemSubmit */
   $elemSubmit = $form->get('submit');
@@ -275,34 +275,10 @@ $formElementErrors->setTranslatorTextDomain('DDS');
 $this->inlineScript()->captureStart();
 echo <<<JS
   $(document).ready(function(){
-    // if department already selected and post request failed then        
-    // rebuild select menu
-    if ( $('input:hidden[name="department"]').val() != 'undefined') {
-      department.addDepartmentSelect(
-        $('input[name="department"]').val(),
-        $('select[name="division"]').val()
-      );
-    }
+    department.init($('select[name="division"]').val(), true);
     $('select[name="division"]').change(function() {
-      department.init($(this).val());
+      department.init($(this).val(), false);
     });
-    // $('.form-group input').focus(function() {
-    //   $(this).parent().prev('.error-field').hide(200);
-    // });
-    // $('.form-group select').focus(function() {
-    //   $(this).parent().prev('.error-field').hide(200);
-    // });
-    /*if ( $('#loginOptions a.login').length ) {
-        var loginUrl = {
-          followup: true,
-          followupModule: 'Subito',
-          followupAction: 'Subito'
-        };
-        $('#loginOptions a.login').attr('href', function ( index, value ) {
-            return value + '?' + $.param( loginUrl );
-        });
-        // console.log($('#loginOptions a.login').attr('href'));
-    }*/
   });
 /**
 * Show & hide of subito form elements regarding select menu status.
@@ -313,32 +289,31 @@ echo <<<JS
 **/
 
 var department = {
-  init: function ( divisionid ) {
+  init: function ( divisionid, forceKeepOptions ) {
     addOptions = false;
     var elements = [];
     if ( divisionid == '15') {
       elements = {
         "department":"show",
-        "costcentre":"show",
         "sdepartment":"hide"
       }
     } else if (divisionid == '') {
       elements = {
         "department":"hide",
-        "costcentre":"hide",
         "sdepartment":"hide"
       }
     } else {
       elements = {
         "department":"hide",
-        "costcentre":"hide",
         "sdepartment":"show"
         }
-      var addOptions = true;
-      }
+        if (!forceKeepOptions) {
+            var addOptions = true;
+        }
+    }
     department.showHideElements(elements);
-    if (addOptions == true) {
-      department.addDepartmentOptions( divisionid );
+    if (addOptions) {
+        department.addDepartmentOptions( divisionid );
       }
     },
     addDepartmentOptions: function ( divisionid ) {
@@ -378,7 +353,13 @@ var department = {
         }
         if (value == 'hide') {
           $('.input-' + index).hide(200);
-      }
+        }
+        let control = $('.input-' + index).find('.form-control');
+        if (control) {
+            $('.input-' + index).find('.form-control').attr("required", value == 'show');
+            $('.input-' + index).find('.form-control').attr("data-required", value == 'show');
+            $('.input-' + index).find('label').attr("data-required", value == 'show');
+        }
     });
   }
 }
diff --git a/themes/finc/templates/myresearch/editlist.phtml b/themes/finc/templates/myresearch/editlist.phtml
index 929bb53ca801ed12daec205700970390de96cb04..affb476f7e3d4dd00f80ec3a0ba5e51cb2470210 100644
--- a/themes/finc/templates/myresearch/editlist.phtml
+++ b/themes/finc/templates/myresearch/editlist.phtml
@@ -40,14 +40,14 @@
       <fieldset>
         <legend><?=$this->transEsc('Access') ?></legend>
         <div class="radio inline">
-          <label>
-            <input id="list_public_1" type="radio" name="public" value="1"<?php if ($this->list->isPublic()): ?> checked="checked"<?php endif; ?>/> <?=$this->transEsc('Public') ?>
-          </label>
+          <?php /* finc: add for attribute to label; take out input element and put it before label element, #21664 - VE */ ?>
+          <input id="list_public_1" type="radio" name="public" value="1"<?php if ($this->list->isPublic()): ?> checked="checked"<?php endif; ?>/>
+          <label for="list_public_1"><?=$this->transEsc('Public') ?></label>
         </div>
         <div class="radio inline">
-          <label>
-            <input id="list_public_0" type="radio" name="public" value="0"<?php if (!$this->list->isPublic()): ?> checked="checked"<?php endif; ?>/> <?=$this->transEsc('Private') ?>
-          </label>
+          <?php /* finc: add for attribute to label; take out input element and put it before label element, #21664 - VE */ ?>
+          <input id="list_public_0" type="radio" name="public" value="0"<?php if (!$this->list->isPublic()): ?> checked="checked"<?php endif; ?>/>
+          <label for="list_public_0"><?=$this->transEsc('Private') ?></label>
         </div>
       </fieldset>
     </div>