diff --git a/exist-app/modules/testtrigger.xqm b/exist-app/modules/testtrigger.xqm
index 671da1fce0f2424fb25a1d6c6860bcf4cc8dd9e9..e56797c7b2c0e3b725f645fe022fd1e567989433 100644
--- a/exist-app/modules/testtrigger.xqm
+++ b/exist-app/modules/testtrigger.xqm
@@ -43,19 +43,7 @@ as item()? {
     then error(QName("error://1", "deploy"), "Deploy token incorrect.")
   else
     let $sysout := util:log-system-out("TextAPI and package installation done. running tests…")
-    let $tests := 
-        (
-            test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tapi/tests")),
-            test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/commons-tests")),
-            test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tapi/collection/tests")),
-            test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tei2html-tests")),
-            test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tei2html-textprocessing-tests")),
-            test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tapi/txt/tests")),
-            test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tapi/manifest/tests")),
-            test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tapi/item/tests")),
-            test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tapi/html/tests")),
-            test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/annotations/tests"))
-        )
+    let $tests := testtrigger:execute-tests()
     
     let $fileSeparator := util:system-property("file.separator")
     let $system-path := system:get-exist-home() || $fileSeparator
@@ -68,3 +56,49 @@ as item()? {
     return
         util:log-system-out("Tests complete. See " || $filename)
 };
+
+declare function testtrigger:execute-tests()
+as element()+ {
+    let $test-results :=
+    (
+        test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tapi/tests")),
+        test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tapi/txt/tests")),
+        test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/commons-tests")),
+        test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tapi/collection/tests")),
+        test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tapi/manifest/tests")),
+        test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tapi/item/tests")),
+        test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tapi/html/tests")),
+        test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tei2html-tests")),
+        test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tei2html-textprocessing-tests")),
+        test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/annotations/tests"))
+    )
+
+    for $result in $test-results
+    order by $result//@package return
+        if ($result//@failures = 0
+        and $result//@errors = 0) then
+            <OK name="{local:get-human-readable-pkg-name($result//@package)}" package="{$result//@package}"/>
+        else
+            <PROBLEM name="{local:get-human-readable-pkg-name($result//@package)}"
+                package="{$result//@package}"
+                errors="{$result//@errors}"
+                failures="{$result//@failures}">
+                {$result//testcase[child::*[self::failure or self::error]]}
+            </PROBLEM>
+};
+
+declare function local:get-human-readable-pkg-name($package as xs:string)
+as xs:string? {
+    switch ($package)
+        case "http://ahikar.sub.uni-goettingen.de/ns/tapi/tests" return "TextAPI general"
+        case "http://ahikar.sub.uni-goettingen.de/ns/tapi/txt/tests" return "TXT creation"
+        case "http://ahikar.sub.uni-goettingen.de/ns/commons-tests" return "Commons"
+        case "http://ahikar.sub.uni-goettingen.de/ns/tapi/collection/tests" return "TextAPI Collections"
+        case "http://ahikar.sub.uni-goettingen.de/ns/tapi/manifest/tests" return "TextAPI Manifests"
+        case "http://ahikar.sub.uni-goettingen.de/ns/tapi/item/tests" return "TextAPI Items"
+        case "http://ahikar.sub.uni-goettingen.de/ns/tapi/html/tests" return "HTML creation"
+        case "http://ahikar.sub.uni-goettingen.de/ns/tei2html-tests" return "TEI2HTML transformation"
+        case "http://ahikar.sub.uni-goettingen.de/ns/tei2html-textprocessing-tests" return "TEI2HTML text processing"
+        case "http://ahikar.sub.uni-goettingen.de/ns/annotations/tests" return "AnnotationAPI"
+        default return ()
+};
diff --git a/exist-app/tests/tests-runner.xq b/exist-app/tests/tests-runner.xq
index 9c2ab1672f9d16ad5159b9d41b3a5f00490d22eb..664f46f3cb592aa40eabe1f07b8566052f8506b3 100644
--- a/exist-app/tests/tests-runner.xq
+++ b/exist-app/tests/tests-runner.xq
@@ -5,58 +5,6 @@ xquery version "3.1";
  : Elevated rights (dba/admin) are required for some tests.
  :)
 
-import module namespace ttt="http://ahikar.sub.uni-goettingen.de/ns/tapi/txt/tests" at "tapi-txt-tests.xqm";
-import module namespace ct="http://ahikar.sub.uni-goettingen.de/ns/commons-tests" at "commons-tests.xqm";
-import module namespace tct="http://ahikar.sub.uni-goettingen.de/ns/tapi/collection/tests" at "tapi-collection-tests.xqm";
-import module namespace test="http://exist-db.org/xquery/xqsuite" at "resource:org/exist/xquery/lib/xqsuite/xqsuite.xql";
-import module namespace thtmlt="http://ahikar.sub.uni-goettingen.de/ns/tapi/html/tests" at "tapi-html-tests.xqm";
-import module namespace titemt="http://ahikar.sub.uni-goettingen.de/ns/tapi/item/tests" at "tapi-item-tests.xqm";
-import module namespace tmt="http://ahikar.sub.uni-goettingen.de/ns/tapi/manifest/tests" at "tapi-manifest-tests.xqm";
-import module namespace tt="http://ahikar.sub.uni-goettingen.de/ns/tapi/tests" at "tapi-tests.xqm";
-import module namespace t2ht="http://ahikar.sub.uni-goettingen.de/ns/tei2html-tests" at "tei2html-tests.xqm";
-import module namespace t2htextt="http://ahikar.sub.uni-goettingen.de/ns/tei2html-textprocessing-tests" at "tei2html-textprocessing-tests.xqm";
-import module namespace at="http://ahikar.sub.uni-goettingen.de/ns/annotations/tests" at "../tests/annotation-tests.xqm";
+import module namespace testtrigger="http://ahikar.sub.uni-goettingen.de/ns/testtrigger" at "../modules/testtrigger.xqm";
 
-declare function local:get-human-readable-pkg-name($package as xs:string)
-as xs:string? {
-    switch ($package)
-        case "http://ahikar.sub.uni-goettingen.de/ns/tapi/tests" return "TextAPI general"
-        case "http://ahikar.sub.uni-goettingen.de/ns/tapi/txt/tests" return "TXT creation"
-        case "http://ahikar.sub.uni-goettingen.de/ns/commons-tests" return "Commons"
-        case "http://ahikar.sub.uni-goettingen.de/ns/tapi/collection/tests" return "TextAPI Collections"
-        case "http://ahikar.sub.uni-goettingen.de/ns/tapi/manifest/tests" return "TextAPI Manifests"
-        case "http://ahikar.sub.uni-goettingen.de/ns/tapi/item/tests" return "TextAPI Items"
-        case "http://ahikar.sub.uni-goettingen.de/ns/tapi/html/tests" return "HTML creation"
-        case "http://ahikar.sub.uni-goettingen.de/ns/tei2html-tests" return "TEI2HTML transformation"
-        case "http://ahikar.sub.uni-goettingen.de/ns/tei2html-textprocessing-tests" return "TEI2HTML text processing"
-        case "http://ahikar.sub.uni-goettingen.de/ns/annotations/tests" return "AnnotationAPI"
-        default return ()
-};
-
-let $test-results :=
-    (
-        test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tapi/tests")),
-        test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tapi/txt/tests")),
-        test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/commons-tests")),
-        test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tapi/collection/tests")),
-        test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tapi/manifest/tests")),
-        test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tapi/item/tests")),
-        test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tapi/html/tests")),
-        test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tei2html-tests")),
-        test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/tei2html-textprocessing-tests")),
-        test:suite(util:list-functions("http://ahikar.sub.uni-goettingen.de/ns/annotations/tests"))
-    )
-
-for $result in $test-results
-order by $result//@package return
-    if ($result//@failures = 0
-    and $result//@errors = 0) then
-        <OK name="{local:get-human-readable-pkg-name($result//@package)}" package="{$result//@package}"/>
-    else
-        <PROBLEM name="{local:get-human-readable-pkg-name($result//@package)}"
-            package="{$result//@package}"
-            errors="{$result//@errors}"
-            failures="{$result//@failures}">
-            {$result//testcase[child::*[self::failure or self::error]]}
-        </PROBLEM>
-        
\ No newline at end of file
+testtrigger:execute-tests()
\ No newline at end of file