diff --git a/Makefile b/Makefile
index 882f9d4d938ec73ea895003e79c52f958828944d..2c12ee4e67becfd7713ae305c4ab7432bda84391 100644
--- a/Makefile
+++ b/Makefile
@@ -52,9 +52,9 @@ LIBS_SUBDIRS = $(addprefix $(LIBS_DIR)/, js css fonts)
 
 ALL: install
 
-install: clean install-sss cp-src cp-ext cp-conf $(addprefix $(PUBLIC_DIR)/, $(LIBS)) build_properties merge_xsl
+install: clean-ignore-zips install-sss cp-src cp-ext cp-conf $(addprefix $(PUBLIC_DIR)/, $(LIBS)) build_properties merge_xsl merge_js
 
-test: clean install-sss cp-src cp-ext cp-ext-test cp-conf $(addprefix $(PUBLIC_DIR)/, $(TEST_LIBS)) build_properties merge_xsl
+test: clean-ignore-zips install-sss cp-src cp-ext cp-ext-test cp-conf $(addprefix $(PUBLIC_DIR)/, $(TEST_LIBS)) build_properties merge_xsl merge_js
 	@for f in $(shell find $(TEST_EXT_DIR) -type f -iname *.js) ; do \
 		sed -i "/EXTENSIONS/a \<script src=\"$${f#$(TEST_EXT_DIR)/}\" ></script>" $(PUBLIC_DIR)/index.html ; \
 		echo include $$f; \
@@ -67,6 +67,10 @@ test: clean install-sss cp-src cp-ext cp-ext-test cp-conf $(addprefix $(PUBLIC_D
 merge_xsl:
 	misc/merge_xsl.sh
 
+merge_js:
+	for f in ${BUILDFILELIST} ; do source "$$f" ; done ; \
+	misc/merge_js.sh $${MODULE_DEPENDENCIES[*]}
+
 EXCLUDE_EXPR = %~ %.backup
 BUILDFILELIST = $(filter-out $(EXCLUDE_EXPR),$(wildcard build.properties.d/*))
 build_properties:
@@ -213,9 +217,6 @@ $(PUBLIC_DIR)/%: $(TEST_EXT_DIR)/%
 $(LIBS_DIR)/fonts: unzip
 	ln -s $(LIBS_DIR)/bootstrap-icons-1.4.1/fonts/ $@
 
-$(LIBS_DIR)/css/fonts: unzip
-	ln -s $(LIBS_DIR)/css/fonts $@
-
 $(LIBS_DIR)/js/bootstrap.js: unzip $(LIBS_DIR)/js
 	ln -s $(LIBS_DIR)/bootstrap-5.0.0-beta3-dist/js/bootstrap.min.js $@
 
@@ -304,17 +305,20 @@ $(addprefix $(LIBS_DIR)/, js css):
 $(LIBS_DIR)/css/fonts: $(LIBS_DIR)/css
 	ln -s $(LIBS_DIR)/fonts/ $(LIBS_DIR)/css/fonts
 
-.PHONY: clean
-clean:
+.PHONY: clean-ignore-zips
+clean-ignore-zips:
 	$(RM) -r $(SSS_BIN_DIR)
 	$(RM) -r $(PUBLIC_DIR)
 	for f in $(LIBS_SUBDIRS); do unlink $$f || $(RM) -r $$f || true; done
-	for f in $(patsubst %.zip,%/,$(LIBS_ZIP)); do $(RM) -r $$f; done
 	$(RM) .server_done
 
+.PHONY: clean
+clean: clean-ignore-zips
+	for f in $(patsubst %.zip,%/,$(LIBS_ZIP)); do $(RM) -r $$f; done
+
 .PHONY: unzip
 unzip:
-	for f in $(LIBS_ZIP); do unzip -q -o -d libs $$f; done
+	for f in $(LIBS_ZIP); do echo "unzip $$f" ; unzip -u -q -o -d libs $$f; done
 
 
 PYLINT ?= pylint
diff --git a/build.properties.d/00_default.properties b/build.properties.d/00_default.properties
index 482913473a8d2620a4484b69424aab82e52e48f3..36d296789f6058d106b450f405af726bf0273b9d 100644
--- a/build.properties.d/00_default.properties
+++ b/build.properties.d/00_default.properties
@@ -90,3 +90,48 @@ BUILD_CUSTOM_IMPRINT='<p> Put an imprint note here </p>'
 # ext_trigger_crawler_form properties
 ##############################################################################
 BUILD_MODULE_EXT_TRIGGER_CRAWLER_FORM_TOOLBOX="Tools"
+
+##############################################################################
+# Module dependencies
+# Override or extend to specify the order of js files in the resulting
+# bundled js file
+##############################################################################
+MODULE_DEPENDENCIES=(
+    jquery.js
+    bootstrap.bundle.min.js
+    bootstrap-autocomplete.min.js
+    bootstrap-select.js
+    state-machine.js
+    showdown.js
+    dropzone.js
+    loglevel.js
+    plotly.js
+    webcaosdb.js
+    pako.js
+    utif.js
+    caosdb.js
+    form_elements.js
+    ext_autocomplete.js
+    preview.js
+    ext_references.js
+    ext_table_preview.js
+    ext_xls_download.js
+    query_shortcuts.js
+    ext_jupyterdrag.js
+    annotation.js
+    edit_mode.js
+    ext_entity_state.js
+    ext_file_download.js
+    leaflet.js
+    leaflet-graticule.js
+    leaflet-latlng-graticule.js
+    leaflet-coordinates.js
+    proj4.js
+    proj4leaflet.js
+    ext_map.js
+    tour.js
+    ext_bottom_line.js
+    ext_sss_markdown.js
+    ext_trigger_crawler_form.js
+    ext_bookmarks.js
+)
diff --git a/misc/merge_js.sh b/misc/merge_js.sh
new file mode 100755
index 0000000000000000000000000000000000000000..375529fe472a05caafb12981a6fb17aef0ae8db9
--- /dev/null
+++ b/misc/merge_js.sh
@@ -0,0 +1,70 @@
+#!/bin/bash
+#
+# ** header v3.0
+# This file is a part of the CaosDB Project.
+#
+# Copyright (C) 2021 IndiScale GmbH
+# Copyright (C) 2021 Timm Fitschen <t.fitschen@indiscale.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+#
+# ** end header
+
+# This file can be used to merge js files together.
+#
+# call: `./merge_js.sh [JS_FILE]*`
+#     where the JS_FILE are the files which will be merged into the resulting
+#     `public/webcaosdb.dist.js` in the order they appear in the command line
+#     call. See `Makefile` for an example.
+#
+# All other files in `public/js` are appended to the resulting file in no
+# particular order.
+
+
+CORE_MODULES=$@
+SOURCE_DIR=public/js/
+TARGET=public/webcaosdb.dist.js
+
+function _merge () {
+    _SOURCE=$2
+    _TARGET=$3
+
+    echo "merging $1 module ${_SOURCE} into ${_TARGET}"
+
+
+    echo "//COPIED FROM ${_SOURCE} (START)" >> ${_TARGET}
+    cat ${_SOURCE} >> ${_TARGET}
+    echo "//COPIED FROM ${_SOURCE} (END)" >> ${_TARGET}
+
+    rm ${_SOURCE}
+}
+
+# clean up old
+rm $TARGET || true
+touch $TARGET
+
+for _SOURCE in ${CORE_MODULES[@]} ; do
+    _merge "core" "${SOURCE_DIR}${_SOURCE}" $TARGET
+done
+
+# load other js files but exclude any subdirectory
+for _SOURCE in $(find ${SOURCE_DIR}* -prune -iname "*.js") ; do
+    _merge "extension" ${_SOURCE} $TARGET
+done
+
+# for `make test`
+for _SOURCE in $(find ${SOURCE_DIR} -ipath "${SOURCE_DIR}modules/*.js") ; do
+    _merge "extension" ${_SOURCE} $TARGET
+done
+
diff --git a/src/core/js/footer.js b/src/core/js/footer.js
deleted file mode 100644
index c48c5cf19c405aea326b36aba2868008466a8329..0000000000000000000000000000000000000000
--- a/src/core/js/footer.js
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * ** header v3.0
- * This file is a part of the CaosDB Project.
- *
- * Copyright (C) 2019 IndiScale GmbH (info@indiscale.com)
- * Copyright (C) 2019 Daniel Hornung (d.hornung@indiscale.com)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- *
- * ** end header
- */
-'use strict';
-
-/**
- * Call initially.
- * 
- * TODO refactor to async function for better readability.
- * @return something
- */
-function footer_initOnDocumentReady() {
-
-    var xhr = new XMLHttpRequest()
-
-    // TODO Refactor and use transformation.retrieveXsltScript, 
-    //
-    // Event better use the transformation module for injecting an entry point,
-    // because this implementation does not allow for non-HTML content in the
-    // caosdb-footer template.
-    xhr.open("GET", "/webinterface/${BUILD_NUMBER}/xsl/footer.xsl");
-    xhr.addEventListener('load', function() {
-        if (this.status != 200) {
-            // TODO use proper logging framework (log.getLogger("footer.js");)
-            console.log(this.status);
-            return;
-        }
-        var footer_xsl = this.responseXML;
-
-        var foot_content = $('[name = "caosdb-footer"]', footer_xsl)[0];
-        var fragment = document.createRange().createContextualFragment(
-            foot_content.innerHTML);
-        var footer = $("footer")[0];
-        footer.appendChild(fragment);
-
-    });
-    xhr.send();
-
-}
-
-$(document).ready(footer_initOnDocumentReady);
diff --git a/src/core/js/webcaosdb.js b/src/core/js/webcaosdb.js
index 2c65b806101265f3a0e346e86497f2c72ad56340..6d374824d0ecc1feebe13f33142b52e3ac9ce7f3 100644
--- a/src/core/js/webcaosdb.js
+++ b/src/core/js/webcaosdb.js
@@ -1285,6 +1285,10 @@ var paging = new function () {
         }
         return index + "L" + length;
     }
+
+    this.init = function () {
+        paging.initPaging(window.location.href, document.body.getAttribute("data-response-count"));
+    }
 };
 
 var queryForm = new function () {
@@ -1889,10 +1893,12 @@ function initOnDocumentReady() {
         $(this).css('max-height', "");
     });
 
-    if (typeof caosdb_modules.auto_init === "undefined") {
+    if (typeof _caosdb_modules_auto_init === "undefined") {
         // the test index.html sets this to false, 
         // unset -> no tests
         caosdb_modules.auto_init = true;
+    } else {
+        caosdb_modules.auto_init = _caosdb_modules_auto_init;
     }
     caosdb_modules.init();
     navbar.init();
diff --git a/src/core/webcaosdb.xsl b/src/core/webcaosdb.xsl
index dd5502008d4431ad63896ba06f7954334a282dc4..9d0dd2e235ca59ce6f4e7b75acd59e063e322751 100644
--- a/src/core/webcaosdb.xsl
+++ b/src/core/webcaosdb.xsl
@@ -69,6 +69,9 @@
         <xsl:call-template name="caosdb-head-js" />
       </head>
       <body>
+        <xsl:attribute name="data-response-count">
+          <xsl:value-of select="/Response/@count"/>
+        </xsl:attribute>
         <xsl:if test="count(/Response/*)&lt;3 and not(/Response/Error|/Response/Info|/Response/Warning)">
             <xsl:attribute name="class">caosdb-welcome</xsl:attribute>
         </xsl:if>
diff --git a/src/core/xsl/main.xsl b/src/core/xsl/main.xsl
index 95802360d69a9de513fc6dc5fe6b05cb5c9d8e6c..238f790fdcd93816d36adf35886e162575df9aa3 100644
--- a/src/core/xsl/main.xsl
+++ b/src/core/xsl/main.xsl
@@ -95,198 +95,13 @@
   </xsl:template>
   <xsl:template name="caosdb-head-js">
     <script>
-        var caosdb_webui_build_number = "${BUILD_NUMBER}";
         window.sessionStorage.caosdbBasePath = "<xsl:value-of select="$basepath"/>";
     </script>
     <xsl:element name="script">
       <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/jquery.js')"/>
+        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/webcaosdb.dist.js')"/>
       </xsl:attribute>
     </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/bootstrap.bundle.min.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/bootstrap-autocomplete.min.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/bootstrap-select.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/state-machine.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/showdown.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/dropzone.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/loglevel.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/plotly.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/webcaosdb.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/pako.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/utif.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <script>
-      $(document).ready(() => paging.initPaging(window.location.href, <xsl:value-of select="/Response/@count"/> ));
-    </script>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/caosdb.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/form_elements.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/ext_autocomplete.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/preview.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/ext_references.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/ext_table_preview.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/ext_xls_download.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/query_shortcuts.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/ext_jupyterdrag.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/annotation.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/edit_mode.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/ext_entity_state.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/ext_file_download.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/leaflet.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/leaflet-graticule.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/leaflet-latlng-graticule.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/leaflet-coordinates.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/proj4.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/proj4leaflet.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/ext_map.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/tour.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/ext_bottom_line.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/ext_sss_markdown.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/ext_trigger_crawler_form.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <xsl:element name="script">
-      <xsl:attribute name="src">
-        <xsl:value-of select="concat($basepath,'webinterface/${BUILD_NUMBER}/js/ext_bookmarks.js')"/>
-      </xsl:attribute>
-    </xsl:element>
-    <!--JS_EXTENSIONS-->
   </xsl:template>
   <xsl:template name="caosdb-data-container">
     <div class="container d-flex flex-column-reverse flex-lg-row caosdb-f-main">
diff --git a/src/core/xsl/welcome.xsl b/src/core/xsl/welcome.xsl
index a38e51607afef2ba107130fda071b808f17c942a..249c2f8e873e83dc4db3132fc22152211fd87965 100644
--- a/src/core/xsl/welcome.xsl
+++ b/src/core/xsl/welcome.xsl
@@ -25,7 +25,7 @@
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html"/>
   <xsl:template name="welcome">
-    <div class="caosdb-f-welcome-panel bg-light">
+    <div class="caosdb-v-welcome-panel bg-light">
       <h1>Welcome</h1>
       <p>This is CaosDB.</p>
               <p>This is the default welcome message. If you are an administrator you can override it. Just copy <code>src/core/xsl/welcome.xsl</code> to <code>src/ext/xsl/welcome.xsl</code> and change this content. Then run <code>make</code> again in CaosdDB's web interface's root directory.</p>
diff --git a/test/core/index.html b/test/core/index.html
index 709bb06d71399fc9fc83cf052f6526d7b641f086..834684b2e737be2e5f241eed3faaea73b3c4020c 100644
--- a/test/core/index.html
+++ b/test/core/index.html
@@ -32,67 +32,9 @@
   <body>
     <div id="qunit"></div>
     <div id="qunit-fixture"></div>
-    <script src="js/jquery.js"></script>
-    <script src="js/loglevel.js"></script>
-    <script src="js/bootstrap.bundle.min.js"></script>
-    <script src="js/bootstrap-select.js"></script>
-    <script src="js/bootstrap-autocomplete.min.js"></script>
-    <script src="js/utif.js"></script>
-    <script src="js/pako.js"></script>
-    <script src="js/webcaosdb.js"></script>
-    <script src="js/plotly.js"></script>
     <script>
-      caosdb_modules.auto_init = false;
-      log.setLevel("trace");
+      var _caosdb_modules_auto_init = false;
     </script>
-    <script src="js/caosdb.js"></script>
-    <script src="js/state-machine.js"></script>
-    <script src="js/showdown.js"></script>
-    <script src="js/qunit.js"></script>
-    <script src="js/dropzone.js"></script>
-    <script src="js/setup.js"></script>
-    <script src="js/preview.js"></script>
-    <script src="js/annotation.js"></script>
-    <script src="js/edit_mode.js"></script>
-    <script src="js/query_shortcuts.js"></script>
-    <script src="js/ext_references.js"></script>
-    <script src="js/ext_file_download.js"></script>
-    <script src="js/ext_xls_download.js"></script>
-    <script src="js/form_elements.js"></script>
-    <script src="js/tour.js"></script>
-    <script src="js/leaflet.js"></script>
-    <script src="js/leaflet-graticule.js"></script>
-    <script src="js/leaflet-latlng-graticule.js"></script>
-    <script src="js/leaflet-coordinates.js"></script>
-    <script src="js/proj4.js"></script>
-    <script src="js/proj4leaflet.js"></script>
-    <script src="js/ext_map.js"></script>
-    <script src="js/ext_table_preview.js"></script>
-    <script src="js/ext_bottom_line.js"></script>
-    <script src="js/ext_autocomplete.js"></script>
-    <script src="js/ext_sss_markdown.js"></script>
-    <script src="js/ext_trigger_crawler_form.js"></script>
-    <script src="js/ext_bookmarks.js"></script>
-    <!--EXTENSIONS-->
-    <script src="js/modules/webcaosdb.js.js"></script>
-    <script src="js/modules/caosdb.js.js"></script>
-    <script src="js/modules/common.xsl.js"></script>
-    <script src="js/modules/entity.xsl.js"></script>
-    <script src="js/modules/welcome.xsl.js"></script>
-    <script src="js/modules/query.xsl.js"></script>
-    <script src="js/modules/annotation.xsl.js"></script>
-    <script src="js/modules/navbar.xsl.js"></script>
-    <script src="js/modules/edit_mode.js.js"></script>
-    <script src="js/modules/ext_xls_download.js.js"></script>
-    <script src="js/modules/ext_file_download.js.js"></script>
-    <script src="js/modules/query_shortcuts.js.js"></script>
-    <script src="js/modules/form_elements.js.js"></script>
-    <script src="js/modules/ext_references.js.js"></script>
-    <script src="js/modules/ext_map.js.js"></script>
-    <script src="js/modules/ext_bottom_line.js.js"></script>
-    <script src="js/modules/ext_autocomplete.js.js"></script>
-    <script src="js/modules/ext_sss_markdown.js.js"></script>
-    <script src="js/modules/ext_trigger_crawler_form.js.js"></script>
-    <script src="js/modules/ext_bookmarks.js.js"></script>
+    <script src="webcaosdb.dist.js"></script>
   </body>
 </html>
diff --git a/test/core/js/modules/welcome.xsl.js b/test/core/js/modules/welcome.xsl.js
index 39fb9fd0edd9e4950e9bbad3189b2aeed4ed7a7c..de59eedca9bbacdbc4c797f9bfd51d11bb332132 100644
--- a/test/core/js/modules/welcome.xsl.js
+++ b/test/core/js/modules/welcome.xsl.js
@@ -46,10 +46,10 @@ QUnit.test("availability", function(assert) {
 	assert.ok(this.welcomeXSL);
 })
 
-QUnit.test("welcome template produces .caosdb-f-welcome-panel", function(assert) {
+QUnit.test("welcome template produces .caosdb-v-welcome-panel", function(assert) {
     var xsl = injectTemplate(this.welcomeXSL, '<xsl:template match="/"><xsl:call-template name="welcome"/></xsl:template>');
     var xml_str = '<root>';
     var xml = str2xml(xml_str);
     var html = xslt(xml, xsl);
-    assert.ok($(html.firstElementChild).hasClass("caosdb-f-welcome-panel"), "has class .caosdb-f-welcome-panel");
+    assert.ok($(html.firstElementChild).hasClass("caosdb-v-welcome-panel"), "has class .caosdb-v-welcome-panel");
 });