diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 28d502c417828847fb035afec9c07d8ed50e2759..f0415a0899b0a71c86894e99dfe526cf8285e35f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -66,12 +66,12 @@ test-server-side-scripting:
 # Build a docker image in which tests for this repository can run
 build-testenv:
   tags: [ cached-dind ]
-  image: docker:19.03
+  image: docker:27.3.1
   stage: setup
   timeout: 3 h
-  only:
-    - web
-    - schedules
+  # only:
+  #   - web
+  #   - schedules
   script: 
     - cd test/docker
     - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
@@ -93,7 +93,8 @@ pages_prepare: &pages_prepare
     refs:
       - /^release-.*$/i
   script:
-    - npm install jsdoc jsdoc-sphinx
+    - npm install -g jsdoc
+    - npm install @indiscale/jsdoc-sphinx
     - echo "Deploying"
     - make doc
     - rm -r public || true ; cp -r build/doc/html public
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 881604778b77e981be8eb3721ec48594e03f2f03..56f004255fa90aa130f25f5684af9c5a1219855e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,6 +20,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ### Documentation ###
 
+## [0.15.1] - 2014-12-20 ##
+
+### Fixed ###
+
+- [#254](https://gitlab.com/linkahead/linkahead-webui/-/issues/254) "Download files referenced in the table" failed
+- [#230](https://gitlab.com/linkahead/linkahead-webui/-/issues/230)
+  `make doc` is now compatible with npm >= 9.0.0.
+
 ## [0.15.0] - 2024-10-01 ##
 
 ### Added ###
diff --git a/README_SETUP.md b/README_SETUP.md
index 9b8a6457d9a0b79fe0d6acf3e8df9294f0074981..99b13956987528a19fedacebf0524675fb694f2f 100644
--- a/README_SETUP.md
+++ b/README_SETUP.md
@@ -80,13 +80,16 @@ See `build.properties.d/00_default.properties` for more information.
 
 ## Build the documentation #
 
-Build documentation in `build/` with `make doc`.
+Install the below requirements and build documentation in `build/`
+with `make doc`. You may need to set the environment variables used in
+`src/doc/Makefile`, especially `JSDOC_BIN` in case you didn't install
+jsdoc globally.
 
 ### Requirements ##
 
 - sphinx
 - sphinx-autoapi
 - jsdoc (`npm install jsdoc`)
-- jsdoc-sphinx  (`npm install jsdoc-sphinx`)
+- @indiscale/jsdoc-sphinx  (`npm install @indiscale/jsdoc-sphinx`)
 - sphinx-js
 - recommonmark
diff --git a/src/doc/Makefile b/src/doc/Makefile
index 17510caebd1f34ed6dc0bc19108cb41fa730de76..7f5c3d5ec0d0bf6ae06d1ddd3ae6386aa3732ae2 100644
--- a/src/doc/Makefile
+++ b/src/doc/Makefile
@@ -24,16 +24,15 @@
 # It is based upon the autocreated makefile for Sphinx documentation.
 
 # You can set these variables from the command line, and also
-# from the environment for the first two.
+# from the environment for the first four.
 SPHINXOPTS    ?= -a
 SPHINXBUILD   ?= sphinx-build
+NPM_PREFIX ?= ../..
+JSDOC_BIN ?= jsdoc
 # SPHINXAPIDOC  ?= javasphinx-apidoc
 SOURCEDIR      = .
 BUILDDIR       = ../../build/doc
 
-# npm is not always in the global PATH
-NPM_PATH = $(shell npm bin)
-NPM_PREFIX = $(shell npm prefix)
 
 .PHONY: doc-help Makefile api
 
@@ -44,8 +43,8 @@ doc-help:
 # Catch-all target: route all unknown targets to Sphinx using the new
 # "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
 %: Makefile api
-	PATH=$(NPM_PATH):$$PATH $(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+	$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
 #	sphinx-build -M html . ../../build/doc
 
 api:
-	PATH=$(NPM_PATH):$$PATH jsdoc -t $(NPM_PREFIX)/node_modules/jsdoc-sphinx/template -d $@ -r "../../src/core"
+	$(JSDOC_BIN) -t $(NPM_PREFIX)/node_modules/@indiscale/jsdoc-sphinx/template -d $@ -r "../../src/core"
diff --git a/src/doc/conf.py b/src/doc/conf.py
index 24ef8545a66f32a7b791b688429c7e2a6fe8a98c..00013dacb1bac017ebdf7cbc91650fb33dfa2304 100644
--- a/src/doc/conf.py
+++ b/src/doc/conf.py
@@ -26,9 +26,9 @@ copyright = '2022 - 2024, IndiScale GmbH'
 author = 'Daniel Hornung'
 
 # The short X.Y version
-version = '0.15.1'
+version = '0.15.2'
 # The full version, including alpha/beta/rc tags
-release = '0.15.1-SNAPSHOT'
+release = '0.15.2-SNAPSHOT'
 
 
 # -- General configuration ---------------------------------------------------
@@ -196,7 +196,7 @@ primary_domain = 'js'  # Not strictly necessary?
 # -- Options for intersphinx extension ---------------------------------------
 
 # Example configuration for intersphinx: refer to the Python standard library.
-intersphinx_mapping = {'https://docs.python.org/': None}
+intersphinx_mapping = {}
 
 # TODO Which options do we want?
 autodoc_default_options = {
diff --git a/src/doc/index.rst b/src/doc/index.rst
index f5b5d9c5828c8ff7e3d5d26b37dbe6653fc00541..adb28b2df1632b6df3c5bf12791a196419bb8cb9 100644
--- a/src/doc/index.rst
+++ b/src/doc/index.rst
@@ -28,5 +28,4 @@ the most important concepts and offers a range of
 Indices and tables
 ==================
 
-* :ref:`genindex`
 * :ref:`search`
diff --git a/src/server_side_scripting/ext_file_download/zip_files.py b/src/server_side_scripting/ext_file_download/zip_files.py
index 2ecfaa8c25b694c7de940cd03e9bf97196ce2b86..7f151d8bf28d89d3193d44665ae7a1645828255c 100755
--- a/src/server_side_scripting/ext_file_download/zip_files.py
+++ b/src/server_side_scripting/ext_file_download/zip_files.py
@@ -32,7 +32,7 @@ from zipfile import ZipFile
 
 import linkahead as db
 import pandas as pd
-from linkaheadadvancedtools.serverside import helper
+from caosadvancedtools.serverside import helper
 from linkahead import LinkAheadException, ConsistencyError, EntityDoesNotExistError
 
 
@@ -71,9 +71,7 @@ def collect_files_in_zip(ids, table):
         # download and add all files
         for file_id in ids:
             try:
-                tmp = db.execute_query("FIND FILE WITH ID={a:}".format(
-                    a=file_id),
-                    unique=True)
+                tmp = db.get_entity_by_id(file_id, role="FILE")
             except EntityDoesNotExistError as e:
                 # TODO
                 # Current behavior: script terminates with error if just one
@@ -81,14 +79,14 @@ def collect_files_in_zip(ids, table):
                 # Desired behavior: The script should go on with the other
                 # ids, but the user should be informed about the missing files.
                 # How should we do this?
-                logger = logging.getLogger("linkaheadadvancedtools")
-                logger.error("Did not find Entity with ID={}.".format(
+                logger = logging.getLogger("caosadvancedtools")
+                logger.error("Did not find File with ID={}.".format(
                     file_id))
 
                 raise e
             savename = nc.get_unique_savename(os.path.basename(tmp.path))
             val_file = helper.get_file_via_download(
-                tmp, logger=logging.getLogger("linkaheadadvancedtools"))
+                tmp, logger=logging.getLogger("caosadvancedtools"))
 
             zf.write(val_file, savename)
 
diff --git a/src/server_side_scripting/ext_table_preview/pandas_table_preview.py b/src/server_side_scripting/ext_table_preview/pandas_table_preview.py
index 13c9b394648548bd6124de8a7318b18bb8a9221c..bc24201a121be056693963705373ed9e6ebe29f1 100755
--- a/src/server_side_scripting/ext_table_preview/pandas_table_preview.py
+++ b/src/server_side_scripting/ext_table_preview/pandas_table_preview.py
@@ -35,8 +35,8 @@ from datetime import datetime
 
 import linkahead as db
 import pandas as pd
-from linkaheadadvancedtools.serverside.helper import get_argument_parser
-from linkaheadadvancedtools.serverside.logging import configure_server_side_logging
+from caosadvancedtools.serverside.helper import get_argument_parser
+from caosadvancedtools.serverside.logging import configure_server_side_logging
 
 MAXIMUMFILESIZE = 1e8
 VALID_ENDINGS = [".csv", ".tsv", ".xls", ".xlsx"]
@@ -135,7 +135,7 @@ if __name__ == "__main__":
     args = parser.parse_args()
 
     debug_file = configure_server_side_logging()
-    logger = logging.getLogger("linkaheadadvancedtools")
+    logger = logging.getLogger("caosadvancedtools")
 
     db.configure_connection(auth_token=args.auth_token)
     entity_id = args.filename
diff --git a/test/docker/Dockerfile b/test/docker/Dockerfile
index 6a14c5027171e80293504a33bb8ff5af5fec4bd8..d816f92fa3a7a529c55d0aaaafbaf30082f0a6da 100644
--- a/test/docker/Dockerfile
+++ b/test/docker/Dockerfile
@@ -1,4 +1,4 @@
-FROM debian:11
+FROM debian:12
 ADD node_gpg.asc /etc/apt/
 RUN  apt-get update \
     && apt-get install -y gnupg ca-certificates\
@@ -12,14 +12,15 @@ RUN  apt-get update \
       nodejs npm \
     && apt-get install -f
 
-RUN pip3 install pylint pytest
+RUN pip3 install --break-system-packages pylint pytest
+RUN pip3 install --break-system-packages sphinx-js sphinx-autoapi recommonmark sphinx-rtd-theme
+RUN pip3 install --break-system-packages pandas
+
 # TODO rename to linkahead
-# RUN pip3 install caosdb>=0.7.4
-RUN pip3 install git+https://gitlab.com/caosdb/caosdb-pylib.git@f-linkahead-rename
-RUN pip3 install pandas
+RUN pip3 install --break-system-packages git+https://gitlab.com/caosdb/caosdb-pylib.git@dev
 # TODO rename to linkahead
-RUN pip3 install git+https://gitlab.com/caosdb/caosdb-advanced-user-tools.git@f-linkahead-rename
+RUN pip3 install --break-system-packages git+https://gitlab.com/caosdb/caosdb-advanced-user-tools.git@dev
+
 # For automatic documentation
 # RUN npm install -g jsdoc
 # RUN npm install -g jsdoc-sphinx
-RUN pip3 install sphinx-js sphinx-autoapi recommonmark sphinx-rtd-theme
diff --git a/test/server_side_scripting/ext_file_download/test_zip_files.py b/test/server_side_scripting/ext_file_download/test_zip_files.py
new file mode 100644
index 0000000000000000000000000000000000000000..d42b49b067705a6a91e6e4bba5258fd9db685d9b
--- /dev/null
+++ b/test/server_side_scripting/ext_file_download/test_zip_files.py
@@ -0,0 +1,33 @@
+#!/usr/bin/env python3
+# encoding: utf-8
+#
+# This file is a part of the LinkAhead Project.
+#
+# Copyright (C) 2024 IndiScale GmbH <info@indiscale.com>
+# Copyright (C) 2024 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/>.
+#
+
+import os
+import unittest
+
+import linkahead as db
+from linkahead.common.models import _parse_single_xml_element
+from lxml import etree
+from zip_files import (collect_files_in_zip)
+
+
+class ZipTest(unittest.TestCase):
+    pass
diff --git a/test/server_side_scripting/ext_file_download/zip_files.py b/test/server_side_scripting/ext_file_download/zip_files.py
new file mode 120000
index 0000000000000000000000000000000000000000..4f594ec180c19a84199da1f8a13efeefdb974d19
--- /dev/null
+++ b/test/server_side_scripting/ext_file_download/zip_files.py
@@ -0,0 +1 @@
+../../../src/server_side_scripting/ext_file_download/zip_files.py
\ No newline at end of file
diff --git a/test/server_side_scripting/ext_table_preview/requirements.txt b/test/server_side_scripting/ext_table_preview/requirements.txt
index 828669fd56d10e7dda0e61917621f15c0fd057a8..d52075bbf03485c453582e876c046a27b35ce2bd 100644
--- a/test/server_side_scripting/ext_table_preview/requirements.txt
+++ b/test/server_side_scripting/ext_table_preview/requirements.txt
@@ -1,4 +1,4 @@
+linkahead
 # TODO rename to linkahead
-caosdb
 caosadvancedtools
 pandas