diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 107005f2dcd21a39b9c65823b66fe237ef35d12c..0e906bcd8378a65463c807d0c0f2a4fa5836c6cd 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -6,6 +6,7 @@ stages:
   - trigger dumux pipelines
 
 variables:
+  UBUNTU_VERSION: "22.04"
   DUMUX_DOCKER_CI_BRANCH: master
   IMAGE_REGISTRY_URL: $CI_REGISTRY/dumux-repositories/dumux-docker-ci
   DUMUX_CI_TRIGGER_LECTURE_BRANCH: master
@@ -25,7 +26,7 @@ workflow:
 # pipeline on a related merge request already. If yes, we simply return
 # to propagate that pipeline status on master. Otherwise, we trigger a new run.
 check-pipeline-status:
-  image: $IMAGE_REGISTRY_URL/${DUMUX_DOCKER_CI_BRANCH}_full:dune-$DUMUX_CI_DUNE_LATEST_RELEASE-gcc-ubuntu-22.04
+  image: $IMAGE_REGISTRY_URL/${DUMUX_DOCKER_CI_BRANCH}_full:dune-$DUMUX_CI_DUNE_LATEST_RELEASE-gcc-ubuntu-$UBUNTU_VERSION
   stage: check-status
   rules:
     - if: $CI_PIPELINE_SOURCE == "schedule"
@@ -100,27 +101,27 @@ check-pipeline-status:
 full-dune-latest-release-gcc:
   extends: .base-trigger
   variables:
-    IMAGE: $IMAGE_REGISTRY_URL/${DUMUX_DOCKER_CI_BRANCH}_full:dune-$DUMUX_CI_DUNE_LATEST_RELEASE-gcc-ubuntu-22.04
+    IMAGE: $IMAGE_REGISTRY_URL/${DUMUX_DOCKER_CI_BRANCH}_full:dune-$DUMUX_CI_DUNE_LATEST_RELEASE-gcc-ubuntu-$UBUNTU_VERSION
 
 minimal-dune-latest-release-gcc:
   extends: .base-trigger
   variables:
-    IMAGE: $IMAGE_REGISTRY_URL/${DUMUX_DOCKER_CI_BRANCH}_minimal:dune-$DUMUX_CI_DUNE_LATEST_RELEASE-gcc-ubuntu-22.04
+    IMAGE: $IMAGE_REGISTRY_URL/${DUMUX_DOCKER_CI_BRANCH}_minimal:dune-$DUMUX_CI_DUNE_LATEST_RELEASE-gcc-ubuntu-$UBUNTU_VERSION
 
 minimal-dune-master-release-clang:
   extends: .base-trigger
   variables:
-    IMAGE: $IMAGE_REGISTRY_URL/${DUMUX_DOCKER_CI_BRANCH}_minimal:dune-master-clang-ubuntu-22.04
+    IMAGE: $IMAGE_REGISTRY_URL/${DUMUX_DOCKER_CI_BRANCH}_minimal:dune-master-clang-ubuntu-$UBUNTU_VERSION
 
 full-dune-latest-release-clang:
   extends: .base-trigger
   variables:
-    IMAGE: $IMAGE_REGISTRY_URL/${DUMUX_DOCKER_CI_BRANCH}_full:dune-$DUMUX_CI_DUNE_LATEST_RELEASE-clang-ubuntu-22.04
+    IMAGE: $IMAGE_REGISTRY_URL/${DUMUX_DOCKER_CI_BRANCH}_full:dune-$DUMUX_CI_DUNE_LATEST_RELEASE-clang-ubuntu-$UBUNTU_VERSION
 
 full-dune-master-gcc-cpp-20:
   extends: .base-trigger
   variables:
-    IMAGE: $IMAGE_REGISTRY_URL/${DUMUX_DOCKER_CI_BRANCH}_full:dune-master-gcc-12-ubuntu-22.04
+    IMAGE: $IMAGE_REGISTRY_URL/${DUMUX_DOCKER_CI_BRANCH}_full:dune-master-gcc-12-ubuntu-$UBUNTU_VERSION
     CXX_MAX_STANDARD: "20"
     DUMUX_ENABLE_CPPCHECK: "true"
     DUMUX_ENABLE_DOXYGEN_BUILD: "true"
@@ -131,12 +132,12 @@ full-dune-master-gcc-cpp-20:
 full-dune-master-clang:
   extends: .non-mr-trigger
   variables:
-    IMAGE: $IMAGE_REGISTRY_URL/${DUMUX_DOCKER_CI_BRANCH}_full:dune-master-clang-ubuntu-22.04
+    IMAGE: $IMAGE_REGISTRY_URL/${DUMUX_DOCKER_CI_BRANCH}_full:dune-master-clang-ubuntu-$UBUNTU_VERSION
 
 full-dune-master-gcc:
   extends: .non-mr-trigger
   variables:
-    IMAGE: $IMAGE_REGISTRY_URL/${DUMUX_DOCKER_CI_BRANCH}_full:dune-master-gcc-ubuntu-22.04
+    IMAGE: $IMAGE_REGISTRY_URL/${DUMUX_DOCKER_CI_BRANCH}_full:dune-master-gcc-ubuntu-$UBUNTU_VERSION
 
 ################################################
 # trigger test pipelines of downstream modules #
@@ -162,6 +163,7 @@ trigger lecture:
     DUMUX_COMMIT_SHA: $CI_COMMIT_SHA
     DUMUX_REFERENCE_SHA: $CI_REFERENCE_SHA
     DUMUX_DOCKER_CI_BRANCH: $DUMUX_DOCKER_CI_BRANCH
+    UBUNTU_VERSION: $UBUNTU_VERSION
 
 ################################################
 # enable secrets security check                #
diff --git a/.gitlab-ci/default.yml b/.gitlab-ci/default.yml
index fc536b40301539284810ad0335c68f1c4f8028a7..63507ae33bc65a27f3e9ea12e4a832273abcd6a8 100644
--- a/.gitlab-ci/default.yml
+++ b/.gitlab-ci/default.yml
@@ -50,6 +50,7 @@ configure:
       python3 -m venv build-cmake/ci-env
       source build-cmake/ci-env/bin/activate
       python3 -m pip install -r requirements.txt
+      pip list
   artifacts:
     paths:
       - build-cmake
diff --git a/.pylintrc b/.pylintrc
index 59ee4bfb79b518defe8c76a6ba98e3744a552958..368ecc9fd77d510ffd0af963f70e07c9c2705e48 100644
--- a/.pylintrc
+++ b/.pylintrc
@@ -35,10 +35,7 @@ ignore-patterns=
 
 # Python code to execute, usually for sys.path manipulation such as
 # pygtk.require().
-init-hook=
-    import os, sys
-    from pylint.config import PYLINTRC
-    sys.path.append(os.path.join(os.path.dirname(PYLINTRC), 'bin/testing'))
+init-hook='import sys; sys.path.append("bin/testing")'
 
 # Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the
 # number of processors available to use.
@@ -91,7 +88,10 @@ disable=raw-checker-failed,
         too-few-public-methods,
         unspecified-encoding,
         logging-fstring-interpolation,
-        logging-format-interpolation
+        logging-format-interpolation,
+        possibly-used-before-assignment,
+        nested-min-max,
+        broad-exception-raised
 
 # Enable the message, report, category or checker with the given id(s). You can
 # either give multiple identifier separated by comma (,) or put this option
diff --git a/requirements.txt b/requirements.txt
index 5dd13cb56c98191525b05ae27ba4e2dc05f3eb64..0c330679f4f30bfe971d344e0cbf3155df0dedea 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -3,8 +3,8 @@
 
 numpy
 matplotlib
-pylint~=2.14.0
-flake8~=6.0.0
+pylint~=3.2.2
+flake8~=7.0.0
 black~=22.0
 codespell~=2.2.2
 fieldcompare[all]~=0.1.0