diff --git a/Makefile b/Makefile
index 6479bc27af5617c58bdb9f2362414f2717c57384..f63274c3b6a8681d233fa96ba90dc2fe7bb22bac 100644
--- a/Makefile
+++ b/Makefile
@@ -69,7 +69,7 @@ merge_xsl:
 
 merge_js:
 	for f in ${BUILDFILELIST} ; do source "$$f" ; done ; \
-	misc/merge_js.sh $${MODULE_DEPENDENCIES[*]}
+	BUILD_JS_DIST_BUNDLE=$${BUILD_JS_DIST_BUNDLE} misc/merge_js.sh $${MODULE_DEPENDENCIES[*]}
 
 EXCLUDE_EXPR = %~ %.backup
 BUILDFILELIST = $(filter-out $(EXCLUDE_EXPR),$(wildcard build.properties.d/*))
diff --git a/misc/merge_js.sh b/misc/merge_js.sh
index c24ac6e246de49b2459175ceef97dae8224fd016..d1b70a4fa9403eb11945ae4f547e10d7c4771494 100755
--- a/misc/merge_js.sh
+++ b/misc/merge_js.sh
@@ -33,11 +33,44 @@
 
 
 CORE_MODULES=$@
-SOURCE_DIR=public/js/
-TARGET=public/webcaosdb.dist.js
+PUBLIC_JS_DIR=public/js/
+DIST_BUNDLE=webcaosdb.dist.js
+DIST_BUNDLE_TARGET=public/${DIST_BUNDLE}
 JSHEADER_TARGET=public/xsl/jsheader.xsl
+ALL_SOURCES=()
 
 _create_jsheader () {
+    _JS_INCLUDE=
+    if [ "$BUILD_JS_DIST_BUNDLE" == "TRUE" ] ; then
+        _SIZE=$(( $(wc -c ${DIST_BUNDLE_TARGET} | awk '{print $1}')/1024))
+        echo "including ${DIST_BUNDLE} (${_SIZE}kB) into ${JSHEADER_TARGET}"
+        _JS_INCLUDE="
+    <xsl:element name=\"script\">
+      <xsl:attribute name=\"src\">
+        <xsl:value-of select=\"concat(\$basepath,'webinterface/\${BUILD_NUMBER}/${DIST_BUNDLE}')\"/>
+      </xsl:attribute>
+    </xsl:element>
+    "
+        sed -i "s|^\(.*JS_INCLUDE.*\)$|    <script src=\"${DIST_BUNDLE}\"><\/script>\n\1|g" public/index.html ;
+    else
+        _ALL_SOURCES=$@
+        echo "${_ALL_SOURCES}"
+        for _SOURCE in ${_ALL_SOURCES[@]} ; do
+            _SIZE=$(( $(wc -c ${_SOURCE} | awk '{print $1}')/1024))
+            _SOURCE=js/${_SOURCE/${PUBLIC_JS_DIR}/}
+            echo "including ${_SOURCE} (${_SIZE}kB) into ${JSHEADER_TARGET}"
+            _JS_INCLUDE="${_JS_INCLUDE}
+    <xsl:element name=\"script\">
+      <xsl:attribute name=\"src\">
+        <xsl:value-of select=\"concat(\$basepath,'webinterface/\${BUILD_NUMBER}/${_SOURCE}')\"/>
+      </xsl:attribute>
+    </xsl:element>
+    "
+            sed -i "s|^\(.*JS_INCLUDE.*\)$|    <script src=\"${_SOURCE}\"><\/script>\n\1|g" public/index.html ;
+        done
+    fi
+
+
     echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
 <!-- THIS FILE IS AUTO-GENERATED BY THE merge_js.sh SCRIPT -->
 <xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">
@@ -46,16 +79,15 @@ _create_jsheader () {
     <script>
         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}/webcaosdb.dist.js')\"/>
-      </xsl:attribute>
-    </xsl:element>
+    ${_JS_INCLUDE}
   </xsl:template>
 </xsl:stylesheet>" > ${JSHEADER_TARGET}
 }
 
 function _merge () {
+    if [ "$BUILD_JS_DIST_BUNDLE" != "TRUE" ] ; then
+        return 0
+    fi
     _SOURCE=$2
     _TARGET=$3
 
@@ -70,21 +102,24 @@ function _merge () {
 }
 
 # clean up old
-rm $TARGET || true
-touch $TARGET
+rm $DIST_BUNDLE_TARGET || true
+touch $DIST_BUNDLE_TARGET
 
 for _SOURCE in ${CORE_MODULES[@]} ; do
-    _merge "core" "${SOURCE_DIR}${_SOURCE}" $TARGET
+    [[ ! " ${ALL_SOURCES[@]} " =~ " ${_SOURCE} " ]] && ALL_SOURCES+=(${PUBLIC_JS_DIR}${_SOURCE})
+    _merge "core" "${PUBLIC_JS_DIR}${_SOURCE}" $DIST_BUNDLE_TARGET
 done
 
 # load other js files but exclude any subdirectory
-for _SOURCE in $(find ${SOURCE_DIR}* -prune -iname "*.js") ; do
-    _merge "extension" ${_SOURCE} $TARGET
+for _SOURCE in $(find ${PUBLIC_JS_DIR}* -prune -iname "*.js") ; do
+    [[ ! " ${ALL_SOURCES[@]} " =~ " ${_SOURCE} " ]] && ALL_SOURCES+=(${_SOURCE})
+    _merge "extension" ${_SOURCE} $DIST_BUNDLE_TARGET
 done
 
 # for `make test`
-for _SOURCE in $(find ${SOURCE_DIR} -ipath "${SOURCE_DIR}modules/*.js") ; do
-    _merge "extension" ${_SOURCE} $TARGET
+for _SOURCE in $(find ${PUBLIC_JS_DIR} -ipath "${PUBLIC_JS_DIR}modules/*.js") ; do
+    [[ ! " ${ALL_SOURCES[@]} " =~ " ${_SOURCE} " ]] && ALL_SOURCES+=(${_SOURCE})
+    _merge "extension" ${_SOURCE} $DIST_BUNDLE_TARGET
 done
 
-_create_jsheader
+_create_jsheader ${ALL_SOURCES[@]}
diff --git a/test/core/index.html b/test/core/index.html
index 834684b2e737be2e5f241eed3faaea73b3c4020c..0dfea85580fe64d0f7a4676f1d919ec5662dee09 100644
--- a/test/core/index.html
+++ b/test/core/index.html
@@ -35,6 +35,6 @@
     <script>
       var _caosdb_modules_auto_init = false;
     </script>
-    <script src="webcaosdb.dist.js"></script>
+    <!--JS_INCLUDE-->
   </body>
 </html>