diff --git a/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php b/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php
index 219103baabbb5f9ef8d371f230536b27db727561..84838f47913e106156487e6a4de4131fe8c965f8 100644
--- a/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php
+++ b/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php
@@ -808,7 +808,7 @@ trait SolrMarcFincTrait
             $this->getLocalMarcFieldOfLibrary()
         );
         if (!$fields) {
-            return null;
+            return [];
         }
         foreach ($fields as $key => $field) {
             if ($q = $field->getSubfield('q')) {
@@ -1707,34 +1707,91 @@ trait SolrMarcFincTrait
      */
     public function getAllSubjectHeadingsExtended()
     {
-        // define a false indicator
-        $firstindicator = 'x';
         $retval = [];
 
         $fields = $this->getMarcRecord()->getFields('689');
         foreach ($fields as $field) {
-            $subjectrow = $field->getIndicator('1');
-            if ($subjectrow != $firstindicator) {
-                $key = (isset($key) ? $key + 1 : 0);
-                $firstindicator = $subjectrow;
+            $key = $field->getIndicator('1');
+            $order = $field->getIndicator('2');
+            if ("" === trim($order)) {
+                if ($subfield = $field->getSubfield('5')) {
+                    $retval[$key]['source'] = $subfield->getData();
+                }
+                foreach ($field->getSubfields() as $sf) {
+                    $sf->getData();
+                }
             }
-            // #5668 #5046 BSZ MARC may contain uppercase subfields but solrmarc set
-            // to lowercase them which introduces single char topics
             if ($subfields = $field->getSubfields('a')) {
                 foreach ($subfields as $subfield) {
                     if (strlen($subfield->getData()) > 1) {
-                        $retval[$key]['subject'][] = $subfield->getData();
+                        $retval[$key]['subject'][$order] = $subfield->getData();
                     }
                 }
             }
             if ($subfield = $field->getSubfield('t')) {
-                $retval[$key]['subject'][] = $subfield->getData();
+                $retval[$key]['subject'][$order] = $subfield->getData();
             }
             if ($subfield = $field->getSubfield('9')) {
                 $retval[$key]['subsubject'] = $subfield->getData();
             }
         }
-        return  $retval;
+        if (empty($retval)) {
+            return $this->getTopicsField();
+        }
+        foreach ([
+                    'DE-627', //KXP
+                    'DE-576', //GBV
+                    'DE-101'  //DNB
+                 ] as $source) {
+            $return = [];
+            foreach ($retval as $entry) {
+                if (isset($entry['source']) && strpos($entry['source'],$source) !== false) {
+                    $return[] = $entry;
+                }
+            }
+            if (!empty($return)) {
+                return $return;
+            }
+        }
+        return $retval;
+    }
+
+    public function getTopicsField()
+    {
+        $retval = [];
+
+        $fields = $this->getMarcRecord()->getFields('650');
+        foreach ($fields as $field) {
+            $thesaurus = $field->getIndicator('2');
+            if ($subfields = $field->getSubfields('a')) {
+                foreach ($subfields as $subfield) {
+                    if (strlen($subfield->getData()) > 1) {
+                        $retval[$thesaurus][]['subject'][] = $subfield->getData();
+                    }
+                }
+            }
+        }
+
+        if (empty($retval)) {
+            return [];
+        }
+
+        foreach ([
+                     '7', //'Source specified in subfield $2'
+                     '4', //'Source not specified'
+                     '0', //'Library of Congress Subject Headings'
+                     '2', //'Medical Subject Headings'
+                 ] as $thesaurus) {
+            if (isset($retval[$thesaurus])) {
+                return array_map(
+                    'unserialize',
+                    array_unique(
+                        array_map('serialize',$retval[$thesaurus])
+                    )
+                );
+            }
+        }
+        return current($retval);
     }
 
     /**