diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2be6ab8239fea6db01c2d675170cf7b81ad34d5f..72fc0e9f323ee5729e78444a11837280a2538c66 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,4 +1,4 @@
-image: registry.git.cccv.de/uffd/docker-images/buster
+image: registry.git.cccv.de/uffd/docker-images/bookworm
 
 variables:
   DEBIAN_FRONTEND: noninteractive
@@ -59,14 +59,27 @@ linter:bullseye:
     reports:
       codequality: codeclimate.json
 
+linter:bookworm:
+  image: registry.git.cccv.de/uffd/docker-images/bookworm
+  stage: test
+  script:
+  - pip3 install $PYLINT_PIN pylint-gitlab pylint-flask-sqlalchemy # this force-updates jinja2 and some other packages!
+  - python3 -m pylint --exit-zero --rcfile .pylintrc --output-format=pylint_gitlab.GitlabCodeClimateReporter 'uffd-socketmapd' > codeclimate.json
+  - python3 -m pylint --exit-zero --rcfile .pylintrc --output-format=pylint_gitlab.GitlabPagesHtmlReporter 'uffd-socketmapd' > pylint.html
+  - python3 -m pylint --rcfile .pylintrc --output-format=text 'uffd-socketmapd'
+  artifacts:
+    when: always
+    paths:
+    - pylint.html
+    reports:
+      codequality: codeclimate.json
+
 unittests:buster:
   image: registry.git.cccv.de/uffd/docker-images/buster
   stage: test
   script:
   - python3-coverage run --include 'uffd-socketmapd' -m pytest --junitxml=report.xml || true
-  #- python3-coverage report -m
   - python3-coverage html
-  #- python3-coverage xml
   artifacts:
     when: always
     paths:
@@ -74,17 +87,28 @@ unittests:buster:
     - htmlcov
     expose_as: 'Coverage Report'
     reports:
-      #coverage_report:
-      #  coverage_format: cobertura
-      #  path: coverage.xml
       junit: report.xml
-  #coverage: '/^TOTAL.*\s+(\d+\%)$/'
 
 unittests:bullseye:
   image: registry.git.cccv.de/uffd/docker-images/bullseye
   stage: test
   script:
   - python3-coverage run --include 'uffd-socketmapd' -m pytest --junitxml=report.xml || true
+  - python3-coverage html
+  artifacts:
+    when: always
+    paths:
+    - htmlcov/index.html
+    - htmlcov
+    expose_as: 'Coverage Report'
+    reports:
+      junit: report.xml
+
+unittests:bookworm:
+  image: registry.git.cccv.de/uffd/docker-images/bookworm
+  stage: test
+  script:
+  - python3-coverage run --include 'uffd-socketmapd' -m pytest --junitxml=report.xml || true
   - python3-coverage report -m
   - python3-coverage html
   - python3-coverage xml
@@ -117,5 +141,6 @@ publish:apt:
   - echo Update published repo for all distros
   - 'curl --user "${APTLY_API_USER}:${APTLY_API_PW}" -X PUT -H "Content-Type: application/json" --data "{ }" "${APT_API_URL}/api/publish/${APT_REPO}/buster"'
   - 'curl --user "${APTLY_API_USER}:${APTLY_API_PW}" -X PUT -H "Content-Type: application/json" --data "{ }" "${APT_API_URL}/api/publish/${APT_REPO}/bullseye"'
+  - 'curl --user "${APTLY_API_USER}:${APTLY_API_PW}" -X PUT -H "Content-Type: application/json" --data "{ }" "${APT_API_URL}/api/publish/${APT_REPO}/bookworm"'
   dependencies:
   - build:apt