diff --git a/local/languages/de.ini b/local/languages/de.ini
index 8d560f8fd1f1a4a924e50ac649fd9372b261c460..e11ddab1a80b6209e7a22bdac1081e94482d8192 100644
--- a/local/languages/de.ini
+++ b/local/languages/de.ini
@@ -1835,3 +1835,6 @@ no_resolver_links = "Keine Online Links verfügbar."
 ; reset password
 reset_password_text = "Bitten füllen Sie dieses Formular aus, um Ihr Passwort zurücksetzen zu lassen. Sie erhalten an u.g. Email Adresse eine Benachrichtigung, nachdem wir das Passwort zurückgesetzt haben."
 Reset Password = "Passwort zurücksetzen"
+
+Work Title = "Werktitel"
+Work Part Title = "Teilwerktitel"
\ No newline at end of file
diff --git a/local/languages/en.ini b/local/languages/en.ini
index fc4cff97d4bb8bda301487e3c0c72e1eba658802..d9cd790175c338074bebbd00915adc6ae9e35fff 100644
--- a/local/languages/en.ini
+++ b/local/languages/en.ini
@@ -1776,3 +1776,6 @@ no_resolver_links = "No online links available."
 ; reset password
 reset_password_text = "Please complete the form below to reset your password. You will receive an email after we have completed resetting your password."
 Reset Password = "Reset Password"
+
+Work Title = "Workt Title"
+Work Part Title = "Work Part Title"
\ No newline at end of file
diff --git a/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php b/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php
index 710223ca281a26de7736fade66d5027385eb06d4..84a1908810f4a342f553b6047c4116eb9c7ce154 100644
--- a/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php
+++ b/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php
@@ -567,12 +567,136 @@ trait SolrMarcFincTrait
      */
     public function getTitleDetails()
     {
+        $title = '';
+
+        if ($field = $this->getMarcRecord()->getField('245')) {
+            if ($field->getSubfield('a')) {
+                // 245$a
+                $title = $field->getSubfield('a')->getData();
+                // 245$b
+                if ($field->getSubfield('b')) {
+                    // add colon if $h isset and ends with colon
+                    // (see https://intern.finc.info/issues/7972)
+                    if ($field->getSubfield('h')) {
+                        if(preg_match(
+                            '/(\s:\s*)*$/',
+                            $field->getSubfield('h')->getData())
+                        ) {
+                            $title .= ' : ';
+                        }
+                    }
+                    $title .= ' ' . $field->getSubfield('b')->getData();
+                }
+                // 245$n
+                if ($field->getSubfield('n')) {
+                    $title .= ' ' . $field->getSubfield('n')->getData();
+                }
+                // 245$p
+                if ($field->getSubfield('p')) {
+                    $title .= ' ' . $field->getSubfield('p')->getData();
+                }
+                // 245$c
+                if ($field->getSubfield('c')) {
+                    $title .= ' ' . $field->getSubfield('c')->getData();
+                }
+            }
+        }
+        if ($field = $this->getMarcRecord()->getField('249')) {
+            // 249$a and 249$v are repeatable
+            if ($subfields = $field->getSubfields('a')) {
+                $vs = $field->getSubfields('v');
+                foreach ($subfields as $i=>$a) {
+                    $title .= '. ' . $a->getData();
+                    if (isset($vs[$i])) {
+                        $title .= ' / ' . $vs[$i]->getData();
+                    }
+                }
+            }
+            // 249$b is non repeatable and applies to all $a$v combinations
+            if ($field->getSubfield('b')) {
+                $title .= ' : ' . $field->getSubfield('b')->getData();
+            }
+            // 249$c is non repeatable and applies to all $a$v combinations
+            if ($field->getSubfield('c')) {
+                $title .= ' / ' . $field->getSubfield('c')->getData();
+            }
+        }
+
         return array_merge(
-            $this->getFieldArray('245', ['a','b', 'c']),
+            [$title],
             $this->getLinkedFieldArray('245', ['a', 'b', 'c'])
         );
     }
 
+    /**
+     * Get an array of title detail lines with original notations combining
+     * information from MARC field 245 and linked content in 880.
+     *
+     * @return array
+     */
+    public function getWorkPartTitleDetails()
+    {
+        $workPartTitles = [];
+        $titleRegexPattern = '/(\s[\/\.:]\s*)*$/';
+
+        $truncateTrail = function ($string) use ($titleRegexPattern) {
+            return preg_replace(
+                $titleRegexPattern, '', trim($string)
+            );
+        };
+
+        if ($fields = $this->getMarcRecord()->getFields('505')) {
+            foreach ($fields as $field) {
+                if ($subfields = $field->getSubfields('t')) {
+                    $rs = $field->getSubfields('r');
+                    foreach ($subfields as $i=>$subfield) {
+                        // each occurance of $t gets $a pretached if it exists
+                        if (isset($rs[$i])) {
+                            $workPartTitles[] =
+                                $truncateTrail($subfield->getData()) . ' /' .
+                                $truncateTrail($rs[$i]);
+                        } else {
+                            $workPartTitles[] =
+                                $truncateTrail($subfield->getData());
+                        }
+                    }
+                }
+            }
+        }
+
+        return $workPartTitles;
+    }
+
+    /**
+     * Get an array of title detail lines with original notations combining
+     * information from MARC field 245 and linked content in 880.
+     *
+     * @return array
+     */
+    public function getWorkTitleDetails()
+    {
+        $workTitles = [];
+        $titleRegexPattern = '/(\s[\/\.:]\s*)*$/';
+
+        $truncateTrail = function ($string) use ($titleRegexPattern) {
+            return preg_replace(
+                $titleRegexPattern, '', trim($string)
+            );
+        };
+
+        if ($fields = $this->getMarcRecord()->getFields('700')) {
+            foreach ($fields as $field) {
+                if ($field->getSubfield('t') && $field->getSubfield('a')) {
+                    $workTitles[] =
+                        $truncateTrail($field->getSubfield('a')->getData()) . ': ' .
+                        $truncateTrail($field->getSubfield('t')->getData());
+                }
+            }
+        }
+
+        return $workTitles;
+    }
+
     /**
      * Get the original statement of responsibility that goes with the title (i.e.
      * "by John Smith").
@@ -1060,29 +1184,6 @@ trait SolrMarcFincTrait
         return $array;
     }
 
-    /**
-     * Get additional titles.
-     *
-     * @return array
-     */
-    public function getAdditionalTitles()
-    {
-        // result array to return
-        $retval = [];
-
-        $results = $this->getMarcRecord()->getFields('249');
-        if (!$results) {
-            return $retval;
-        }
-
-        foreach ($results as $line) {
-            $retval[] =
-                ($line->getSubfield('a') ? $line->getSubfield('a')->getData() : '') .
-                ($line->getSubfield('v') ? ' / ' . $line->getSubfield('v')->getData() : '');
-        }
-        return $retval;
-    }
-
     /**
      * Get addional entries for personal names.
      *
diff --git a/themes/finc/templates/RecordDriver/SolrMarc/core.phtml b/themes/finc/templates/RecordDriver/SolrMarc/core.phtml
index 4e26e7861378cb71f513db3b465e133b6c182967..ce2a86f7511ef39b5799f0114ae75c9bb97e31b3 100644
--- a/themes/finc/templates/RecordDriver/SolrMarc/core.phtml
+++ b/themes/finc/templates/RecordDriver/SolrMarc/core.phtml
@@ -171,14 +171,38 @@ if($loggedin = $this->auth()->isLoggedIn()) {
         <td property="bookEdition"><?=$this->escapeHtml($edition)?></td>
       </tr>
       <? endif; ?>
-      <? /* THis is the only SolrMarc core specific change - rest identical with solrDefault core */  ?>
+
+      <? /* These are the only SolrMarc core specific changes - rest identical with solrDefault core */  ?>
+      <? $workPartTitleDetails = $this->driver->tryMethod('getWorkPartTitleDetails'); if (!empty($workPartTitleDetails)): ?>
+        <tr>
+          <th><?=$this->transEsc('Work Part Title')?>: </th>
+          <td property="work part title">
+            <? $i = 0; foreach ($workPartTitleDetails as $title): ?>
+              <?=($i > 0 ? '<br />':'')?><?=$this->escapeHtml($title)?><? $i++ ;?>
+            <? endforeach; ?>
+          </td>
+        </tr>
+      <? endif; ?>
+
+      <? $workTitleDetails = $this->driver->tryMethod('getWorkTitleDetails'); if (!empty($workTitleDetails)): ?>
+        <tr>
+          <th><?=$this->transEsc('Work Title')?>: </th>
+          <td property="work title">
+            <? $i = 0; foreach ($workTitleDetails as $title): ?>
+              <?=($i > 0 ? '<br />':'')?><?=$this->escapeHtml($title)?><? $i++ ;?>
+            <? endforeach; ?>
+          </td>
+        </tr>
+      <? endif; ?>
+
       <? $dissertationNote = $this->driver->getDissertationNote(); if (!empty($dissertationNote)): ?>
         <tr>
           <th><?=$this->transEsc('Dissertation Note')?>: </th>
           <td><?=$dissertationNote?></td>
         </tr>
       <? endif; ?>
-      <? /* THis is the only SolrMarc core specific change - END */  ?>
+      <? /* These are the only SolrMarc core specific changes - END */  ?>
+
       <?/* Display series section if at least one series exists. */?>
       <? $series = $this->driver->getSeries(); if (!empty($series)): ?>
       <tr>