diff --git a/Build/Scripts/runTests.sh b/Build/Scripts/runTests.sh
index e846e5f58bc6fba158b13a6a163895bc78bd960c..5afa8f2ded7c8b5e2c357cb623c25b162a267a6d 100755
--- a/Build/Scripts/runTests.sh
+++ b/Build/Scripts/runTests.sh
@@ -1,7 +1,7 @@
 #!/usr/bin/env bash
 
 #
-# TYPO3 core test runner based on docker.
+# TYPO3 core test runner based on docker or podman
 #
 
 waitFor() {
@@ -24,6 +24,7 @@ waitFor() {
 cleanUp() {
     ATTACHED_CONTAINERS=$(${CONTAINER_BIN} ps --filter network=${NETWORK} --format='{{.Names}}')
     for ATTACHED_CONTAINER in ${ATTACHED_CONTAINERS}; do
+        ${CONTAINER_BIN} kill ${ATTACHED_CONTAINER} >/dev/null
         ${CONTAINER_BIN} rm -f ${ATTACHED_CONTAINER} >/dev/null
     done
     ${CONTAINER_BIN} network rm ${NETWORK} >/dev/null
@@ -213,6 +214,11 @@ Options:
             - unitJavascript: JavaScript unit tests
             - unitRandom: PHP unit tests in random order, add -o <number> to use specific seed
 
+    -b <docker|podman>
+        Container environment:
+            - docker (default)
+            - podman
+
     -a <mysqli|pdo_mysql|sqlsrv|pdo_sqlsrv>
         Only with -s functional|functionalDeprecated
         Specifies to use another driver, following combinations are available:
@@ -249,7 +255,7 @@ Options:
             - 10.9   short-term, maintained until 2023-08
             - 10.10  short-term, maintained until 2023-11
             - 10.11  long-term, maintained until 2028-02
-        With "-d mariadb":
+        With "-d mysql":
             - 5.5   unmaintained since 2018-12 (default)
             - 5.6   unmaintained since 2021-02
             - 5.7   maintained until 2023-10
@@ -352,12 +358,19 @@ EOF
 }
 
 # Test if docker exists, else exit out with error
-if ! type "docker" >/dev/null; then
-    echo "This script relies on docker. Please install" >&2
+if ! type "docker" >/dev/null 2>&1 && ! type "podman" >/dev/null 2>&1; then
+    echo "This script relies on docker or podman. Please install" >&2
     exit 1
 fi
 
-# Option defaults
+# Go to the directory this script is located, so everything else is relative
+# to this dir, no matter from where this script is called, then go up two dirs.
+THIS_SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
+cd "$THIS_SCRIPT_DIR" || exit 1
+cd ../../ || exit 1
+CORE_ROOT="${PWD}"
+
+# Default variables
 TEST_SUITE="unit"
 DBMS="sqlite"
 DBMS_VERSION=""
@@ -372,6 +385,16 @@ DATABASE_DRIVER=""
 CHUNKS=0
 THISCHUNK=0
 CONTAINER_BIN="docker"
+COMPOSER_ROOT_VERSION="11.5.x-dev"
+PHPSTAN_CONFIG_FILE="phpstan.local.neon"
+CONTAINER_INTERACTIVE="-it --init"
+HOST_UID=$(id -u)
+HOST_PID=$(id -g)
+USERSET=""
+SUFFIX=$(echo $RANDOM)
+NETWORK="typo3-core-${SUFFIX}"
+CI_PARAMS=""
+CONTAINER_HOST="host.docker.internal"
 
 # Option parsing updates above default vars
 # Reset in case getopts has been used previously in the shell
@@ -379,11 +402,17 @@ OPTIND=1
 # Array for invalid options
 INVALID_OPTIONS=()
 # Simple option parsing based on getopts (! not getopt)
-while getopts ":a:s:c:d:i:p:e:xy:o:nhug" OPT; do
+while getopts ":a:b:s:c:d:i:p:e:xy:o:nhug" OPT; do
     case ${OPT} in
         s)
             TEST_SUITE=${OPTARG}
             ;;
+        b)
+            if ! [[ ${OPTARG} =~ ^(docker|podman)$ ]]; then
+                INVALID_OPTIONS+=("${OPTARG}")
+            fi
+            CONTAINER_BIN=${OPTARG}
+            ;;
         a)
             DATABASE_DRIVER=${OPTARG}
             ;;
@@ -456,80 +485,71 @@ fi
 
 handleDbmsOptions
 
-COMPOSER_ROOT_VERSION="11.5.x-dev"
-HOST_UID=$(id -u)
-USERSET=""
-if [ $(uname) != "Darwin" ]; then
-    USERSET="--user $HOST_UID"
-fi
-
-# Go to the directory this script is located, so everything else is relative
-# to this dir, no matter from where this script is called, then go up two dirs.
-THIS_SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
-cd "$THIS_SCRIPT_DIR" || exit 1
-cd ../../ || exit 1
-CORE_ROOT="${PWD}"
-
-# Create .cache dir: composer and various npm jobs need this.
-mkdir -p .cache
-mkdir -p typo3temp/var/tests
-
-PHPSTAN_CONFIG_FILE="phpstan.local.neon"
-IMAGE_PREFIX="docker.io/"
-# Non-CI fetches TYPO3 images (php and nodejs) from ghcr.io
-TYPO3_IMAGE_PREFIX="ghcr.io/"
-CONTAINER_INTERACTIVE="-it --init"
-
-IS_CORE_CI=0
-# ENV var "CI" is set by gitlab-ci. We use it here to distinct 'local' and 'CI' environment.
+# ENV var "CI" is set by gitlab-ci. Use it to force some CI details.
 if [ "${CI}" == "true" ]; then
-    IS_CORE_CI=1
     PHPSTAN_CONFIG_FILE="phpstan.ci.neon"
-    # In CI, we need to pull images from docker.io for the registry proxy to kick in.
-    TYPO3_IMAGE_PREFIX="docker.io/"
-    IMAGE_PREFIX=""
     CONTAINER_INTERACTIVE=""
+    CONTAINER_BIN="podman"
+    CI_PARAMS="--pull=never"
 fi
 
-IMAGE_PHP="${TYPO3_IMAGE_PREFIX}typo3/core-testing-$(echo "php${PHP_VERSION}" | sed -e 's/\.//'):latest"
-IMAGE_NODEJS="${TYPO3_IMAGE_PREFIX}typo3/core-testing-js:latest"
-IMAGE_NODEJS_CHROME="${TYPO3_IMAGE_PREFIX}typo3/core-testing-js-chrome:latest"
-IMAGE_ALPINE="${IMAGE_PREFIX}alpine:3.8"
-IMAGE_SELENIUM="${IMAGE_PREFIX}selenium/standalone-chrome:4.0.0-20211102"
-IMAGE_REDIS="${IMAGE_PREFIX}redis:4-alpine"
-IMAGE_MEMCACHED="${IMAGE_PREFIX}memcached:1.5-alpine"
-IMAGE_MARIADB="${IMAGE_PREFIX}mariadb:${DBMS_VERSION}"
-IMAGE_MYSQL="${IMAGE_PREFIX}mysql:${DBMS_VERSION}"
-IMAGE_POSTGRES="${IMAGE_PREFIX}postgres:${DBMS_VERSION}-alpine"
-IMAGE_MSSQL="${IMAGE_PREFIX}typo3/core-testing-mssql2019:latest"
+if [ $(uname) != "Darwin" ] && [ ${CONTAINER_BIN} = "docker" ]; then
+    # Run docker jobs as current user to prevent permission issues. Not needed with podman.
+    USERSET="--user $HOST_UID"
+fi
+
+if ! type ${CONTAINER_BIN} >/dev/null 2>&1; then
+    echo "Selected container environment \"${CONTAINER_BIN}\" not found. Please install or use -b option to select one." >&2
+    exit 1
+fi
+
+IMAGE_PHP="ghcr.io/typo3/core-testing-$(echo "php${PHP_VERSION}" | sed -e 's/\.//'):latest"
+IMAGE_NODEJS="ghcr.io/typo3/core-testing-js:latest"
+IMAGE_NODEJS_CHROME="ghcr.io/typo3/core-testing-js-chrome:latest"
+IMAGE_ALPINE="docker.io/alpine:3.8"
+IMAGE_SELENIUM="docker.io/selenium/standalone-chrome:4.0.0-20211102"
+IMAGE_REDIS="docker.io/redis:4-alpine"
+IMAGE_MEMCACHED="docker.io/memcached:1.5-alpine"
+IMAGE_MARIADB="docker.io/mariadb:${DBMS_VERSION}"
+IMAGE_MYSQL="docker.io/mysql:${DBMS_VERSION}"
+IMAGE_POSTGRES="docker.io/postgres:${DBMS_VERSION}-alpine"
 
 # Detect arm64 to use seleniarm image.
 ARCH=$(uname -m)
 if [ ${ARCH} = "arm64" ]; then
-    IMAGE_SELENIUM="${IMAGE_PREFIX}seleniarm/standalone-chromium:4.1.2-20220227"
-    echo "Architecture" ${ARCH} "requires" ${IMAGE_SELENIUM} "to run acceptance tests."
+    IMAGE_SELENIUM="docker.io/seleniarm/standalone-chromium:4.1.2-20220227"
 fi
 
 # Set $1 to first mass argument, this is the optional test file or test directory to execute
 shift $((OPTIND - 1))
 TEST_FILE=${1}
 
-SUFFIX=$(echo $RANDOM)
-NETWORK="typo3-core-${SUFFIX}"
+# Create .cache dir: composer and various npm jobs need this.
+mkdir -p .cache
+mkdir -p typo3temp/var/tests
+
 ${CONTAINER_BIN} network create ${NETWORK} >/dev/null
 
-CONTAINER_COMMON_PARAMS="${CONTAINER_INTERACTIVE} --rm --network $NETWORK --add-host "host.docker.internal:host-gateway" $USERSET -v ${CORE_ROOT}:${CORE_ROOT} -w ${CORE_ROOT}"
 COMPOSER_IGNORE_PLATFORM_REQ=""
 if [ "${PHP_VERSION}" = "8.3" ]; then
     COMPOSER_IGNORE_PLATFORM_REQ="--ignore-platform-req=php+"
 fi
 
+if [ ${CONTAINER_BIN} = "docker" ]; then
+    # docker needs the add-host for xdebug remote debugging. podman has host.container.internal built in
+    CONTAINER_COMMON_PARAMS="${CONTAINER_INTERACTIVE} --rm --network ${NETWORK} --add-host "${CONTAINER_HOST}:host-gateway" ${USERSET} -v ${CORE_ROOT}:${CORE_ROOT} -w ${CORE_ROOT}"
+else
+    # podman
+    CONTAINER_HOST="host.containers.internal"
+    CONTAINER_COMMON_PARAMS="${CONTAINER_INTERACTIVE} ${CI_PARAMS} --rm --network ${NETWORK} -v ${CORE_ROOT}:${CORE_ROOT} -w ${CORE_ROOT}"
+fi
+
 if [ ${PHP_XDEBUG_ON} -eq 0 ]; then
     XDEBUG_MODE="-e XDEBUG_MODE=off"
     XDEBUG_CONFIG=" "
 else
     XDEBUG_MODE="-e XDEBUG_MODE=debug -e XDEBUG_TRIGGER=foo"
-    XDEBUG_CONFIG="client_port=${PHP_XDEBUG_PORT} client_host=host.docker.internal"
+    XDEBUG_CONFIG="client_port=${PHP_XDEBUG_PORT} client_host=${CONTAINER_HOST}"
 fi
 
 # Suite execution
@@ -549,8 +569,8 @@ case ${TEST_SUITE} in
         if [ "${ACCEPTANCE_HEADLESS}" -eq 0 ]; then
             SELENIUM_GRID="-p 7900:7900 -e SE_VNC_NO_PASSWORD=1 -e VNC_NO_PASSWORD=1"
         fi
-        ${CONTAINER_BIN} run -d ${SELENIUM_GRID} --name ac-chrome-${SUFFIX} --network ${NETWORK} --network-alias chrome --tmpfs /dev/shm:rw,nosuid,nodev,noexec,relatime ${IMAGE_SELENIUM} >/dev/null
-        ${CONTAINER_BIN} run -d --name ac-web-${SUFFIX} --network ${NETWORK} --network-alias web --add-host "host.docker.internal:host-gateway" $USERSET -v ${CORE_ROOT}:${CORE_ROOT} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${IMAGE_PHP} php -S web:8000 -t ${CORE_ROOT} >/dev/null
+        ${CONTAINER_BIN} run ${CI_PARAMS} -d ${SELENIUM_GRID} --name ac-chrome-${SUFFIX} --network ${NETWORK} --network-alias chrome --tmpfs /dev/shm:rw,nosuid,nodev,noexec ${IMAGE_SELENIUM} >/dev/null
+        ${CONTAINER_BIN} run ${CI_PARAMS} -d --name ac-web-${SUFFIX} --network ${NETWORK} --network-alias web --add-host "${CONTAINER_HOST}:host-gateway" ${USERSET} -v ${CORE_ROOT}:${CORE_ROOT} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${IMAGE_PHP} php -S web:8000 -t ${CORE_ROOT} >/dev/null
         waitFor chrome 4444
         waitFor chrome 7900
         waitFor web 8000
@@ -561,23 +581,26 @@ case ${TEST_SUITE} in
         fi
         case ${DBMS} in
             mariadb)
-                ${CONTAINER_BIN} run --name mariadb-ac-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MARIADB} >/dev/null
+                ${CONTAINER_BIN} run ${CI_PARAMS} --name mariadb-ac-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MARIADB} >/dev/null
+                DATABASE_IP=$(${CONTAINER_BIN} inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mariadb-ac-${SUFFIX})
                 waitFor mariadb-ac-${SUFFIX} 3306
-                CONTAINERPARAMS="-e typo3DatabaseName=func_test -e typo3DatabaseUsername=root -e typo3DatabasePassword=funcp -e typo3DatabaseHost=mariadb-ac-${SUFFIX}"
+                CONTAINERPARAMS="-e typo3DatabaseName=func_test -e typo3DatabaseUsername=root -e typo3DatabasePassword=funcp -e typo3DatabaseHost=${DATABASE_IP}"
                 ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name ac-mariadb ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND}
                 SUITE_EXIT_CODE=$?
                 ;;
             mysql)
-                ${CONTAINER_BIN} run --name mysql-ac-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MYSQL} >/dev/null
+                ${CONTAINER_BIN} run ${CI_PARAMS} --name mysql-ac-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MYSQL} >/dev/null
+                DATABASE_IP=$(${CONTAINER_BIN} inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-ac-${SUFFIX})
                 waitFor mysql-ac-${SUFFIX} 3306
-                CONTAINERPARAMS="-e typo3DatabaseName=func_test -e typo3DatabaseUsername=root -e typo3DatabasePassword=funcp -e typo3DatabaseHost=mysql-ac-${SUFFIX}"
+                CONTAINERPARAMS="-e typo3DatabaseName=func_test -e typo3DatabaseUsername=root -e typo3DatabasePassword=funcp -e typo3DatabaseHost=${DATABASE_IP}"
                 ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name ac-mysql ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND}
                 SUITE_EXIT_CODE=$?
                 ;;
             postgres)
-                ${CONTAINER_BIN} run --name postgres-ac-${SUFFIX} --network ${NETWORK} -d -e POSTGRES_PASSWORD=funcp -e POSTGRES_USER=funcu --tmpfs /var/lib/postgresql/data:rw,noexec,nosuid ${IMAGE_POSTGRES} >/dev/null
+                ${CONTAINER_BIN} run ${CI_PARAMS} --name postgres-ac-${SUFFIX} --network ${NETWORK} -d -e POSTGRES_PASSWORD=funcp -e POSTGRES_USER=funcu --tmpfs /var/lib/postgresql/data:rw,noexec,nosuid ${IMAGE_POSTGRES} >/dev/null
+                DATABASE_IP=$(${CONTAINER_BIN} inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' postgres-ac-${SUFFIX})
                 waitFor postgres-ac-${SUFFIX} 5432
-                CONTAINERPARAMS="-e typo3DatabaseDriver=pdo_pgsql -e typo3DatabaseName=func_test -e typo3DatabaseUsername=funcu -e typo3DatabasePassword=funcp -e typo3DatabaseHost=postgres-ac-${SUFFIX}"
+                CONTAINERPARAMS="-e typo3DatabaseDriver=pdo_pgsql -e typo3DatabaseName=func_test -e typo3DatabaseUsername=funcu -e typo3DatabasePassword=funcp -e typo3DatabaseHost=${DATABASE_IP}"
                 ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name ac-postgres ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND}
                 SUITE_EXIT_CODE=$?
                 ;;
@@ -594,8 +617,13 @@ case ${TEST_SUITE} in
         if [ "${ACCEPTANCE_HEADLESS}" -eq 0 ]; then
             SELENIUM_GRID="-p 7900:7900 -e SE_VNC_NO_PASSWORD=1 -e VNC_NO_PASSWORD=1"
         fi
-        ${CONTAINER_BIN} run -d ${SELENIUM_GRID} --name ac-istall-chrome-${SUFFIX} --network ${NETWORK} --network-alias chrome --tmpfs /dev/shm:rw,nosuid,nodev,noexec,relatime ${IMAGE_SELENIUM} >/dev/null
-        ${CONTAINER_BIN} run -d --name ac-install-web-${SUFFIX} --network ${NETWORK} --network-alias web --add-host "host.docker.internal:host-gateway" $USERSET -v ${CORE_ROOT}:${CORE_ROOT} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${IMAGE_PHP} php -S web:8000 -t ${CORE_ROOT} >/dev/null
+        if [ ${CONTAINER_BIN} = "docker" ]; then
+            ${CONTAINER_BIN} run -d ${SELENIUM_GRID} --name ac-istall-chrome-${SUFFIX} --network ${NETWORK} --network-alias chrome --tmpfs /dev/shm:rw,nosuid,nodev,noexec ${IMAGE_SELENIUM} >/dev/null
+            ${CONTAINER_BIN} run -d --name ac-install-web-${SUFFIX} --network ${NETWORK} --network-alias web --add-host "${CONTAINER_HOST}:host-gateway" ${USERSET} -v ${CORE_ROOT}:${CORE_ROOT} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${IMAGE_PHP} php -S web:8000 -t ${CORE_ROOT} >/dev/null
+        else
+            ${CONTAINER_BIN} run ${CI_PARAMS} -d ${SELENIUM_GRID} --name ac-istall-chrome-${SUFFIX} --network ${NETWORK} --network-alias chrome --tmpfs /dev/shm:rw,nosuid,nodev,noexec ${IMAGE_SELENIUM} >/dev/null
+            ${CONTAINER_BIN} run ${CI_PARAMS} -d --name ac-install-web-${SUFFIX} --network ${NETWORK} --network-alias web --add-host "${CONTAINER_HOST}:host-gateway" -v ${CORE_ROOT}:${CORE_ROOT} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${IMAGE_PHP} php -S web:8000 -t ${CORE_ROOT} >/dev/null
+        fi
         waitFor chrome 4444
         waitFor chrome 7900
         waitFor web 8000
@@ -610,9 +638,10 @@ case ${TEST_SUITE} in
                 if [ "${ACCEPTANCE_HEADLESS}" -eq 1 ]; then
                     CODECEPION_ENV="--env mysql,headless"
                 fi
-                ${CONTAINER_BIN} run --name mariadb-ac-install-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MARIADB} >/dev/null
+                ${CONTAINER_BIN} run ${CI_PARAMS} --name mariadb-ac-install-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MARIADB} >/dev/null
+                DATABASE_IP=$(${CONTAINER_BIN} inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mariadb-ac-install-${SUFFIX})
                 waitFor mariadb-ac-install-${SUFFIX} 3306
-                CONTAINERPARAMS="-e typo3InstallMysqlDatabaseName=func_test -e typo3InstallMysqlDatabaseUsername=root -e typo3InstallMysqlDatabasePassword=funcp -e typo3InstallMysqlDatabaseHost=mariadb-ac-install-${SUFFIX}"
+                CONTAINERPARAMS="-e typo3InstallMysqlDatabaseName=func_test -e typo3InstallMysqlDatabaseUsername=root -e typo3InstallMysqlDatabasePassword=funcp -e typo3InstallMysqlDatabaseHost=${DATABASE_IP}"
                 COMMAND="bin/codecept run Install -d -c typo3/sysext/core/Tests/codeception.yml ${EXTRA_TEST_OPTIONS} ${CODECEPION_ENV} --html reports.html"
                 ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name ac-install-mariadb ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND}
                 SUITE_EXIT_CODE=$?
@@ -622,9 +651,10 @@ case ${TEST_SUITE} in
                 if [ "${ACCEPTANCE_HEADLESS}" -eq 1 ]; then
                     CODECEPION_ENV="--env mysql,headless"
                 fi
-                ${CONTAINER_BIN} run --name mysql-ac-install-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MYSQL} >/dev/null
+                ${CONTAINER_BIN} run ${CI_PARAMS} --name mysql-ac-install-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MYSQL} >/dev/null
+                DATABASE_IP=$(${CONTAINER_BIN} inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-ac-install-${SUFFIX})
                 waitFor mysql-ac-install-${SUFFIX} 3306
-                CONTAINERPARAMS="-e typo3InstallMysqlDatabaseName=func_test -e typo3InstallMysqlDatabaseUsername=root -e typo3InstallMysqlDatabasePassword=funcp -e typo3InstallMysqlDatabaseHost=mysql-ac-install-${SUFFIX}"
+                CONTAINERPARAMS="-e typo3InstallMysqlDatabaseName=func_test -e typo3InstallMysqlDatabaseUsername=root -e typo3InstallMysqlDatabasePassword=funcp -e typo3InstallMysqlDatabaseHost=${DATABASE_IP}"
                 COMMAND="bin/codecept run Install -d -c typo3/sysext/core/Tests/codeception.yml ${EXTRA_TEST_OPTIONS} ${CODECEPION_ENV} --html reports.html"
                 ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name ac-install-mysql ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND}
                 SUITE_EXIT_CODE=$?
@@ -634,9 +664,10 @@ case ${TEST_SUITE} in
                 if [ "${ACCEPTANCE_HEADLESS}" -eq 1 ]; then
                     CODECEPION_ENV="--env postgresql,headless"
                 fi
-                ${CONTAINER_BIN} run --name postgres-ac-install-${SUFFIX} --network ${NETWORK} -d -e POSTGRES_PASSWORD=funcp -e POSTGRES_USER=funcu --tmpfs /var/lib/postgresql/data:rw,noexec,nosuid ${IMAGE_POSTGRES} >/dev/null
+                ${CONTAINER_BIN} run ${CI_PARAMS} --name postgres-ac-install-${SUFFIX} --network ${NETWORK} -d -e POSTGRES_PASSWORD=funcp -e POSTGRES_USER=funcu --tmpfs /var/lib/postgresql/data:rw,noexec,nosuid ${IMAGE_POSTGRES} >/dev/null
+                DATABASE_IP=$(${CONTAINER_BIN} inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' postgres-ac-install-${SUFFIX})
                 waitFor postgres-ac-install-${SUFFIX} 5432
-                CONTAINERPARAMS="-e typo3InstallPostgresqlDatabasePort=5432 -e typo3InstallPostgresqlDatabaseName=${USER} -e typo3InstallPostgresqlDatabaseHost=postgres-ac-install-${SUFFIX} -e typo3InstallPostgresqlDatabaseUsername=funcu -e typo3InstallPostgresqlDatabasePassword=funcp"
+                CONTAINERPARAMS="-e typo3InstallPostgresqlDatabasePort=5432 -e typo3InstallPostgresqlDatabaseName=${USER} -e typo3InstallPostgresqlDatabaseHost=${DATABASE_IP} -e typo3InstallPostgresqlDatabaseUsername=funcu -e typo3InstallPostgresqlDatabasePassword=funcp"
                 COMMAND="bin/codecept run Install -d -c typo3/sysext/core/Tests/codeception.yml ${EXTRA_TEST_OPTIONS} ${CODECEPION_ENV} --html reports.html"
                 ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name ac-install-postgres ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND}
                 SUITE_EXIT_CODE=$?
@@ -647,7 +678,7 @@ case ${TEST_SUITE} in
                 if [ "${ACCEPTANCE_HEADLESS}" -eq 1 ]; then
                     CODECEPION_ENV="--env sqlite,headless"
                 fi
-                CONTAINERPARAMS="-e typo3DatabaseDriver=pdo_sqlite --tmpfs ${CORE_ROOT}/typo3temp/var/tests/functional-sqlite-dbs/:rw,noexec,nosuid,uid=${HOST_UID}"
+                CONTAINERPARAMS="-e typo3DatabaseDriver=pdo_sqlite --tmpfs ${CORE_ROOT}/typo3temp/var/tests/functional-sqlite-dbs/:rw,noexec,nosuid"
                 COMMAND="bin/codecept run Install -d -c typo3/sysext/core/Tests/codeception.yml ${EXTRA_TEST_OPTIONS} ${CODECEPION_ENV} --html reports.html"
                 ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name ac-install-sqlite ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND}
                 SUITE_EXIT_CODE=$?
@@ -779,15 +810,15 @@ case ${TEST_SUITE} in
         else
             COMMAND="bin/phpunit -c Build/phpunit/FunctionalTests.xml --exclude-group not-${DBMS} ${EXTRA_TEST_OPTIONS} ${TEST_FILE}"
         fi
-        ${CONTAINER_BIN} run --name redis-func-${SUFFIX} --network ${NETWORK} -d ${IMAGE_REDIS} >/dev/null
-        ${CONTAINER_BIN} run --name memcached-func-${SUFFIX} --network ${NETWORK} -d ${IMAGE_MEMCACHED} >/dev/null
+        ${CONTAINER_BIN} run ${CI_PARAMS} --name redis-func-${SUFFIX} --network ${NETWORK} -d ${IMAGE_REDIS} >/dev/null
+        ${CONTAINER_BIN} run ${CI_PARAMS} --name memcached-func-${SUFFIX} --network ${NETWORK} -d ${IMAGE_MEMCACHED} >/dev/null
         waitFor redis-func-${SUFFIX} 6379
         waitFor memcached-func-${SUFFIX} 11211
         CONTAINER_COMMON_PARAMS="${CONTAINER_COMMON_PARAMS} -e typo3TestingRedisHost=redis-func-${SUFFIX} -e typo3TestingMemcachedHost=memcached-func-${SUFFIX}"
         case ${DBMS} in
             mariadb)
                 echo "Using driver: ${DATABASE_DRIVER}"
-                ${CONTAINER_BIN} run --name mariadb-func-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MARIADB} >/dev/null
+                ${CONTAINER_BIN} run ${CI_PARAMS} --name mariadb-func-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MARIADB} >/dev/null
                 waitFor mariadb-func-${SUFFIX} 3306
                 CONTAINERPARAMS="-e typo3DatabaseDriver=${DATABASE_DRIVER} -e typo3DatabaseName=func_test -e typo3DatabaseUsername=root -e typo3DatabaseHost=mariadb-func-${SUFFIX} -e typo3DatabasePassword=funcp"
                 ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name functional-${SUFFIX} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND}
@@ -795,7 +826,7 @@ case ${TEST_SUITE} in
                 ;;
             mysql)
                 echo "Using driver: ${DATABASE_DRIVER}"
-                ${CONTAINER_BIN} run --name mysql-func-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MYSQL} >/dev/null
+                ${CONTAINER_BIN} run ${CI_PARAMS} --name mysql-func-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MYSQL} >/dev/null
                 waitFor mysql-func-${SUFFIX} 3306
                 CONTAINERPARAMS="-e typo3DatabaseDriver=${DATABASE_DRIVER} -e typo3DatabaseName=func_test -e typo3DatabaseUsername=root -e typo3DatabaseHost=mysql-func-${SUFFIX} -e typo3DatabasePassword=funcp"
                 ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name functional-${SUFFIX} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND}
@@ -810,7 +841,7 @@ case ${TEST_SUITE} in
                 SUITE_EXIT_CODE=$?
                 ;;
             postgres)
-                ${CONTAINER_BIN} run --name postgres-func-${SUFFIX} --network ${NETWORK} -d -e POSTGRES_PASSWORD=funcp -e POSTGRES_USER=funcu --tmpfs /var/lib/postgresql/data:rw,noexec,nosuid ${IMAGE_POSTGRES} >/dev/null
+                ${CONTAINER_BIN} run ${CI_PARAMS} --name postgres-func-${SUFFIX} --network ${NETWORK} -d -e POSTGRES_PASSWORD=funcp -e POSTGRES_USER=funcu --tmpfs /var/lib/postgresql/data:rw,noexec,nosuid ${IMAGE_POSTGRES} >/dev/null
                 waitFor postgres-func-${SUFFIX} 5432
                 CONTAINERPARAMS="-e typo3DatabaseDriver=pdo_pgsql -e typo3DatabaseName=bamboo -e typo3DatabaseUsername=funcu -e typo3DatabaseHost=postgres-func-${SUFFIX} -e typo3DatabasePassword=funcp"
                 ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name functional-${SUFFIX} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND}
@@ -819,7 +850,7 @@ case ${TEST_SUITE} in
             sqlite)
                 # create sqlite tmpfs mount typo3temp/var/tests/functional-sqlite-dbs/ to avoid permission issues
                 mkdir -p "${CORE_ROOT}/typo3temp/var/tests/functional-sqlite-dbs/"
-                CONTAINERPARAMS="-e typo3DatabaseDriver=pdo_sqlite --tmpfs ${CORE_ROOT}/typo3temp/var/tests/functional-sqlite-dbs/:rw,noexec,nosuid,uid=${HOST_UID}"
+                CONTAINERPARAMS="-e typo3DatabaseDriver=pdo_sqlite --tmpfs ${CORE_ROOT}/typo3temp/var/tests/functional-sqlite-dbs/:rw,noexec,nosuid"
                 ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name functional-${SUFFIX} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND}
                 SUITE_EXIT_CODE=$?
                 ;;
@@ -827,15 +858,15 @@ case ${TEST_SUITE} in
         ;;
     functionalDeprecated)
         COMMAND="bin/phpunit -c Build/phpunit/FunctionalTestsDeprecated.xml --exclude-group not-${DBMS} ${EXTRA_TEST_OPTIONS} ${TEST_FILE}"
-        ${CONTAINER_BIN} run --name redis-func-dep-${SUFFIX} --network ${NETWORK} -d ${IMAGE_REDIS} >/dev/null
-        ${CONTAINER_BIN} run --name memcached-func-dep-${SUFFIX} --network ${NETWORK} -d ${IMAGE_MEMCACHED} >/dev/null
+        ${CONTAINER_BIN} run ${CI_PARAMS} --name redis-func-dep-${SUFFIX} --network ${NETWORK} -d ${IMAGE_REDIS} >/dev/null
+        ${CONTAINER_BIN} run ${CI_PARAMS} --name memcached-func-dep-${SUFFIX} --network ${NETWORK} -d ${IMAGE_MEMCACHED} >/dev/null
         waitFor redis-func-dep-${SUFFIX} 6379
         waitFor memcached-func-dep-${SUFFIX} 11211
         CONTAINER_COMMON_PARAMS="${CONTAINER_COMMON_PARAMS} -e typo3TestingRedisHost=redis-func-dep-${SUFFIX} -e typo3TestingMemcachedHost=memcached-func-dep-${SUFFIX}"
         case ${DBMS} in
             mariadb)
                 echo "Using driver: ${DATABASE_DRIVER}"
-                ${CONTAINER_BIN} run --name mariadb-func-dep-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MARIADB} >/dev/null
+                ${CONTAINER_BIN} run ${CI_PARAMS} --name mariadb-func-dep-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MARIADB} >/dev/null
                 waitFor mariadb-func-dep-${SUFFIX} 3306
                 CONTAINERPARAMS="-e typo3DatabaseDriver=${DATABASE_DRIVER} -e typo3DatabaseName=func_test -e typo3DatabaseUsername=root -e typo3DatabaseHost=mariadb-func-dep-${SUFFIX} -e typo3DatabasePassword=funcp"
                 ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name functional-deprecated-${SUFFIX} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND}
@@ -843,7 +874,7 @@ case ${TEST_SUITE} in
                 ;;
             mysql)
                 echo "Using driver: ${DATABASE_DRIVER}"
-                ${CONTAINER_BIN} run --name mysql-func-dep-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MYSQL} >/dev/null
+                ${CONTAINER_BIN} run ${CI_PARAMS} --name mysql-func-dep-${SUFFIX} --network ${NETWORK} -d -e MYSQL_ROOT_PASSWORD=funcp --tmpfs /var/lib/mysql/:rw,noexec,nosuid ${IMAGE_MYSQL} >/dev/null
                 waitFor mysql-func-dep-${SUFFIX} 3306
                 CONTAINERPARAMS="-e typo3DatabaseDriver=${DATABASE_DRIVER} -e typo3DatabaseName=func_test -e typo3DatabaseUsername=root -e typo3DatabaseHost=mysql-func-dep-${SUFFIX} -e typo3DatabasePassword=funcp"
                 ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name functional-deprecated-${SUFFIX} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND}
@@ -858,7 +889,7 @@ case ${TEST_SUITE} in
                 SUITE_EXIT_CODE=$?
                 ;;
             postgres)
-                ${CONTAINER_BIN} run --name postgres-func-dep-${SUFFIX} --network ${NETWORK} -d -e POSTGRES_PASSWORD=funcp -e POSTGRES_USER=funcu --tmpfs /var/lib/postgresql/data:rw,noexec,nosuid ${IMAGE_POSTGRES} >/dev/null
+                ${CONTAINER_BIN} run ${CI_PARAMS} --name postgres-func-dep-${SUFFIX} --network ${NETWORK} -d -e POSTGRES_PASSWORD=funcp -e POSTGRES_USER=funcu --tmpfs /var/lib/postgresql/data:rw,noexec,nosuid ${IMAGE_POSTGRES} >/dev/null
                 waitFor postgres-func-dep-${SUFFIX} 5432
                 CONTAINERPARAMS="-e typo3DatabaseDriver=pdo_pgsql -e typo3DatabaseName=bamboo -e typo3DatabaseUsername=funcu -e typo3DatabaseHost=postgres-func-dep-${SUFFIX} -e typo3DatabasePassword=funcp"
                 ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name functional-deprecated-${SUFFIX} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND}
@@ -867,7 +898,7 @@ case ${TEST_SUITE} in
             sqlite)
                 # create sqlite tmpfs mount typo3temp/var/tests/functional-sqlite-dbs/ to avoid permission issues
                 mkdir -p "${CORE_ROOT}/typo3temp/var/tests/functional-sqlite-dbs/"
-                CONTAINERPARAMS="-e typo3DatabaseDriver=pdo_sqlite --tmpfs ${CORE_ROOT}/typo3temp/var/tests/functional-sqlite-dbs/:rw,noexec,nosuid,uid=${HOST_UID}"
+                CONTAINERPARAMS="-e typo3DatabaseDriver=pdo_sqlite --tmpfs ${CORE_ROOT}/typo3temp/var/tests/functional-sqlite-dbs/:rw,noexec,nosuid"
                 ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name functional-deprecated-${SUFFIX} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${CONTAINERPARAMS} ${IMAGE_PHP} ${COMMAND}
                 SUITE_EXIT_CODE=$?
                 ;;
@@ -930,12 +961,12 @@ case ${TEST_SUITE} in
         ${CONTAINER_BIN} volume ls -q -f driver=local -f dangling=true | awk '$0 ~ /^[0-9a-f]{64}$/ { print }' | xargs -I {} ${CONTAINER_BIN} volume rm {}
         echo ""
         # pull typo3/core-testing-*:latest versions of those ones that exist locally
-        echo "> pull ${TYPO3_IMAGE_PREFIX}typo3/core-testing-*:latest versions of those ones that exist locally"
-        ${CONTAINER_BIN} images ${TYPO3_IMAGE_PREFIX}typo3/core-testing-*:latest --format "{{.Repository}}:latest" | xargs -I {} ${CONTAINER_BIN} pull {}
+        echo "> pull ghcr.io/typo3/core-testing-*:latest versions of those ones that exist locally"
+        ${CONTAINER_BIN} images ghcr.io/typo3/core-testing-*:latest --format "{{.Repository}}:latest" | xargs -I {} ${CONTAINER_BIN} pull {}
         echo ""
         # remove "dangling" typo3/core-testing-* images (those tagged as <none>)
-        echo "> remove \"dangling\" ${TYPO3_IMAGE_PREFIX}typo3/core-testing-* images (those tagged as <none>)"
-        ${CONTAINER_BIN} images ${TYPO3_IMAGE_PREFIX}typo3/core-testing-* --filter "dangling=true" --format "{{.ID}}" | xargs -I {} ${CONTAINER_BIN} rmi -f {}
+        echo "> remove \"dangling\" ghcr.io/typo3/core-testing-* images (those tagged as <none>)"
+        ${CONTAINER_BIN} images ghcr.io/typo3/core-testing-* --filter "dangling=true" --format "{{.ID}}" | xargs -I {} ${CONTAINER_BIN} rmi -f {}
         echo ""
         ;;
     *)
@@ -953,11 +984,7 @@ cleanUp
 echo "" >&2
 echo "###########################################################################" >&2
 echo "Result of ${TEST_SUITE}" >&2
-if [[ ${IS_CORE_CI} -eq 1 ]]; then
-    echo "Environment: CI" >&2
-else
-    echo "Environment: local" >&2
-fi
+echo "Container runtime: ${CONTAINER_BIN}" >&2
 echo "PHP: ${PHP_VERSION}" >&2
 if [[ ${TEST_SUITE} =~ ^(functional|functionalDeprecated|acceptance|acceptanceInstall)$ ]]; then
     case "${DBMS}" in
diff --git a/Build/gitlab-ci.yml b/Build/gitlab-ci.yml
index 84d7e140354d128171fab48af54ffda88c90da71..fab93936371ffd7b0ed12bed842ec86fe7f93b30 100644
--- a/Build/gitlab-ci.yml
+++ b/Build/gitlab-ci.yml
@@ -1,6 +1,6 @@
 default:
   # Always retry a failed job, so it has a chance to recover from a faulty machine, network or timing issue
-  retry: 1
+  retry: 2
   # Any job taking longer than this is considered 'failed'
   timeout: 30m
 
@@ -10,16 +10,6 @@ variables:
   # and fails with package conflicts. Having a full clone by setting depth 0
   # prevents this, so we don't need to fiddle with COMPOSER_ROOT_VERSION env var.
   GIT_DEPTH: 0
-  # Remove the usage of umask 0000 call for jobs executed with docker executor.
-  # gitlab repo clones otherwise lead to funny file permissions,
-  # which especially confuses runTests.sh -s checkPermissions
-  FF_DISABLE_UMASK_FOR_DOCKER_EXECUTOR: 1
-  # Each script line from will be in a collapsible section in the job output
-  # and show the duration of each line.
-  FF_SCRIPT_SECTIONS: 1
-  # The project directory will be cleaned up at the end of the build with a
-  # series of git clean commands, with our git fetch strategy.
-  FF_ENABLE_JOB_CLEANUP: 1
 
 cache:
   # Default caching of .cache directory if a job does not override it.
@@ -36,23 +26,6 @@ cache:
   paths:
     - .cache
 
-services:
-  # Each job starts two containers: This dind container that starts a docker
-  # daemon, plus a casual container that executes runTests.sh for single jobs
-  # to start containers within the dind container.
-  # @todo Using custom dind image meanwhile to mitigate gitlab-runner healthcheck issue:
-  #       See: https://gitlab.com/gitlab-org/gitlab-runner/-/issues/29130
-  #       Original: docker:20.10-dind
-  - name: typo3/core-testing-docker-dind:latest
-    alias: docker
-
-# This is *never* overridden in single jobs. All jobs start a 'dind' service
-# so runTests.sh starts 'sub' containers within the dind container, and this
-# main entry point container executes runTests.sh to start containers.
-# @todo ^1.2 builds seems to be broken. This leads to endless pulls by not using the proxy registry and failing
-#       acceptance install tests. Pin it to latest working version and investigate later.
-image: typo3/core-testing-docker:1.1.0
-
 stages:
   # Stages for pre-merge
   - main
diff --git a/Build/gitlab-ci/nightly/acceptance-application.yml b/Build/gitlab-ci/nightly/acceptance-application.yml
index 6a98abf1267ed2f03b7aa722ecf6da1ff175375d..82e6605a8f55c2698683ec5742107815efac40b4 100644
--- a/Build/gitlab-ci/nightly/acceptance-application.yml
+++ b/Build/gitlab-ci/nightly/acceptance-application.yml
@@ -1,5 +1,7 @@
 acceptance application mariadb 10.3 php 7.4 locked:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -14,6 +16,8 @@ acceptance application mariadb 10.3 php 7.4 locked:
       - Build/Scripts/runTests.sh -s acceptance -d mariadb -i 10.3 -p 7.4 -c $CI_NODE_INDEX/$CI_NODE_TOTAL
 acceptance application mariadb 10.3 php 7.4 max:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -32,6 +36,8 @@ acceptance application mariadb 10.3 php 7.4 max:
     - Build/Scripts/runTests.sh -s acceptance -d mariadb -i 10.3 -p 7.4 -c $CI_NODE_INDEX/$CI_NODE_TOTAL
 acceptance application mariadb 10.3 php 7.4 min:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -51,6 +57,8 @@ acceptance application mariadb 10.3 php 7.4 min:
 
 acceptance application mariadb 10.3 php 8.0 locked:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -65,6 +73,8 @@ acceptance application mariadb 10.3 php 8.0 locked:
     - Build/Scripts/runTests.sh -s acceptance -d mariadb -i 10.3 -p 8.0 -c $CI_NODE_INDEX/$CI_NODE_TOTAL
 acceptance application mariadb 10.3 php 8.0 max:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -83,6 +93,8 @@ acceptance application mariadb 10.3 php 8.0 max:
     - Build/Scripts/runTests.sh -s acceptance -d mariadb -i 10.3 -p 8.0 -c $CI_NODE_INDEX/$CI_NODE_TOTAL
 acceptance application mariadb 10.3 php 8.0 min:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -102,6 +114,8 @@ acceptance application mariadb 10.3 php 8.0 min:
 
 acceptance application mariadb 10.10 php 8.2 locked:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -116,6 +130,8 @@ acceptance application mariadb 10.10 php 8.2 locked:
     - Build/Scripts/runTests.sh -s acceptance -d mariadb -i 10.10 -p 8.2 -c $CI_NODE_INDEX/$CI_NODE_TOTAL
 acceptance application mariadb 10.10 php 8.2 max:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -134,6 +150,8 @@ acceptance application mariadb 10.10 php 8.2 max:
     - Build/Scripts/runTests.sh -s acceptance -d mariadb -i 10.10 -p 8.2 -c $CI_NODE_INDEX/$CI_NODE_TOTAL
 acceptance application mariadb 10.10 php 8.2 min:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
diff --git a/Build/gitlab-ci/nightly/acceptance-install.yml b/Build/gitlab-ci/nightly/acceptance-install.yml
index 697d38f930e36db88dc1fad9dba9e3e82be71e5f..7101a8c00b738a49304bfe62ba6b3676801ccbf3 100644
--- a/Build/gitlab-ci/nightly/acceptance-install.yml
+++ b/Build/gitlab-ci/nightly/acceptance-install.yml
@@ -1,5 +1,7 @@
 acceptance install mariadb 10.3 php 7.4 locked:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -12,6 +14,8 @@ acceptance install mariadb 10.3 php 7.4 locked:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d mariadb -i 10.3 -p 7.4
 acceptance install mariadb 10.3 php 7.4 max:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -28,6 +32,8 @@ acceptance install mariadb 10.3 php 7.4 max:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d mariadb -i 10.3 -p 7.4
 acceptance install mariadb 10.3 php 7.4 min:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -45,6 +51,8 @@ acceptance install mariadb 10.3 php 7.4 min:
 
 acceptance install mariadb 10.3 php 8.0 locked:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -57,6 +65,8 @@ acceptance install mariadb 10.3 php 8.0 locked:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d mariadb -i 10.6 -p 8.0
 acceptance install mariadb 10.3 php 8.0 max:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -73,6 +83,8 @@ acceptance install mariadb 10.3 php 8.0 max:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d mariadb -i 10.6 -p 8.0
 acceptance install mariadb 10.3 php 8.0 min:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -90,6 +102,8 @@ acceptance install mariadb 10.3 php 8.0 min:
 
 acceptance install mariadb 10.3 php 8.1 locked:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -102,6 +116,8 @@ acceptance install mariadb 10.3 php 8.1 locked:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d mariadb -i 10.3 -p 8.1
 acceptance install mariadb 10.3 php 8.1 max:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -118,6 +134,8 @@ acceptance install mariadb 10.3 php 8.1 max:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d mariadb -i 10.3 -p 8.1
 acceptance install mariadb 10.3 php 8.1 min:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -135,6 +153,8 @@ acceptance install mariadb 10.3 php 8.1 min:
 
 acceptance install mariadb 10.10 php 8.2 locked:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -147,6 +167,8 @@ acceptance install mariadb 10.10 php 8.2 locked:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d mariadb -i 10.10 -p 8.2
 acceptance install mariadb 10.3 php 8.2 max:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -163,6 +185,8 @@ acceptance install mariadb 10.3 php 8.2 max:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d mariadb -i 10.10 -p 8.2
 acceptance install mariadb 10.10 php 8.2 min:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -180,6 +204,8 @@ acceptance install mariadb 10.10 php 8.2 min:
 
 acceptance install mysql php 7.4:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -192,6 +218,8 @@ acceptance install mysql php 7.4:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d mysql -i 5.5 -p 7.4
 acceptance install mysql php 7.4 max:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -208,6 +236,8 @@ acceptance install mysql php 7.4 max:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d mysql -i 5.5 -p 7.4
 acceptance install mysql php 7.4 min:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -225,6 +255,8 @@ acceptance install mysql php 7.4 min:
 
 acceptance install mysql php 8.0:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -237,6 +269,8 @@ acceptance install mysql php 8.0:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d mysql -i 5.5 -p 8.0
 acceptance install mysql php 8.0 max:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -253,6 +287,8 @@ acceptance install mysql php 8.0 max:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d mysql -i 5.5 -p 8.0
 acceptance install mysql php 8.0 min:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -270,6 +306,8 @@ acceptance install mysql php 8.0 min:
 
 acceptance install mysql php 8.1:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -282,6 +320,8 @@ acceptance install mysql php 8.1:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d mysql -i 5.5 -p 8.1
 acceptance install mysql php 8.1 max:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -298,6 +338,8 @@ acceptance install mysql php 8.1 max:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d mysql -i 5.5 -p 8.1
 acceptance install mysql php 8.1 min:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -315,6 +357,8 @@ acceptance install mysql php 8.1 min:
 
 acceptance install postgres php 7.4 locked:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -327,6 +371,8 @@ acceptance install postgres php 7.4 locked:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d postgres -i 10 -p 7.4
 acceptance install postgres php 7.4 max:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -343,6 +389,8 @@ acceptance install postgres php 7.4 max:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d postgres -i 10 -p 7.4
 acceptance install postgres php 7.4 min:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -360,6 +408,8 @@ acceptance install postgres php 7.4 min:
 
 acceptance install postgres php 8.0 locked:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -372,6 +422,8 @@ acceptance install postgres php 8.0 locked:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d postgres -i 10 -p 8.0
 acceptance install postgres php 8.0 max:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -388,6 +440,8 @@ acceptance install postgres php 8.0 max:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d postgres -i 10 -p 8.0
 acceptance install postgres php 8.0 min:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -405,6 +459,8 @@ acceptance install postgres php 8.0 min:
 
 acceptance install postgres php 8.1 locked:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -417,6 +473,8 @@ acceptance install postgres php 8.1 locked:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d postgres -i 10 -p 8.1
 acceptance install postgres php 8.1 max:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -433,6 +491,8 @@ acceptance install postgres php 8.1 max:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d postgres -i 10 -p 8.1
 acceptance install postgres php 8.1 min:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -450,6 +510,8 @@ acceptance install postgres php 8.1 min:
 
 acceptance install sqlite php 7.4 locked:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -462,6 +524,8 @@ acceptance install sqlite php 7.4 locked:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d sqlite -p 7.4
 acceptance install sqlite php 7.4 max:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -478,6 +542,8 @@ acceptance install sqlite php 7.4 max:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d sqlite -p 7.4
 acceptance install sqlite php 7.4 min:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -495,6 +561,8 @@ acceptance install sqlite php 7.4 min:
 
 acceptance install sqlite php 8.0 locked:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -507,6 +575,8 @@ acceptance install sqlite php 8.0 locked:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d sqlite -p 8.0
 acceptance install sqlite php 8.0 max:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -523,6 +593,8 @@ acceptance install sqlite php 8.0 max:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d sqlite -p 8.0
 acceptance install sqlite php 8.0 min:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -540,6 +612,8 @@ acceptance install sqlite php 8.0 min:
 
 acceptance install sqlite php 8.1 locked:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -552,6 +626,8 @@ acceptance install sqlite php 8.1 locked:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d sqlite -p 8.1
 acceptance install sqlite php 8.1 max:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -568,6 +644,8 @@ acceptance install sqlite php 8.1 max:
     - Build/Scripts/runTests.sh -s acceptanceInstall -d sqlite -p 8.1
 acceptance install sqlite php 8.1 min:
   stage: acceptance
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
diff --git a/Build/gitlab-ci/nightly/functional.yml b/Build/gitlab-ci/nightly/functional.yml
index 47c98a6eab863f041a612345937c86f5ec326dd6..4bd3d3694bfef82427f203381afb5bdffc4f9df8 100644
--- a/Build/gitlab-ci/nightly/functional.yml
+++ b/Build/gitlab-ci/nightly/functional.yml
@@ -1,5 +1,7 @@
 functional deprecated mariadb 10.3 php 7.4 locked:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -8,6 +10,8 @@ functional deprecated mariadb 10.3 php 7.4 locked:
     - Build/Scripts/runTests.sh -s functionalDeprecated -d mariadb -i 10.3 -p 7.4
 functional deprecated mariadb 10.3 php 7.4 max:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -20,6 +24,8 @@ functional deprecated mariadb 10.3 php 7.4 max:
     - Build/Scripts/runTests.sh -s functionalDeprecated -d mariadb -i 10.3 -p 7.4
 functional deprecated mariadb 10.3 php 7.4 min:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -33,6 +39,8 @@ functional deprecated mariadb 10.3 php 7.4 min:
 
 functional deprecated mariadb 10.5 php 8.3 locked:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -41,6 +49,8 @@ functional deprecated mariadb 10.5 php 8.3 locked:
     - Build/Scripts/runTests.sh -s functionalDeprecated -d mariadb -i 10.5 -p 8.3
 functional deprecated mariadb 10.5 php 8.2 max:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -53,6 +63,8 @@ functional deprecated mariadb 10.5 php 8.2 max:
     - Build/Scripts/runTests.sh -s functionalDeprecated -d mariadb -i 10.5 -p 8.3
 functional deprecated mariadb 10.5 php 8.3 min:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -66,6 +78,8 @@ functional deprecated mariadb 10.5 php 8.3 min:
 
 functional deprecated mariadb 10.10 php 8.3 locked:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -74,6 +88,8 @@ functional deprecated mariadb 10.10 php 8.3 locked:
     - Build/Scripts/runTests.sh -s functionalDeprecated -d mariadb -i 10.10 -p 8.3
 functional deprecated mariadb 10.10 php 8.3 max:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -86,6 +102,8 @@ functional deprecated mariadb 10.10 php 8.3 max:
     - Build/Scripts/runTests.sh -s functionalDeprecated -d mariadb -i 10.10 -p 8.3
 functional deprecated mariadb 10.10 php 8.3 min:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -99,6 +117,8 @@ functional deprecated mariadb 10.10 php 8.3 min:
 
 functional deprecated mysql 5.5 php 7.4 locked:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -107,6 +127,8 @@ functional deprecated mysql 5.5 php 7.4 locked:
     - Build/Scripts/runTests.sh -s functionalDeprecated -d mysql -i 5.5 -p 7.4
 functional deprecated mysql 5.5 php 7.4 max:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -119,6 +141,8 @@ functional deprecated mysql 5.5 php 7.4 max:
     - Build/Scripts/runTests.sh -s functionalDeprecated -d mysql -i 5.5 -p 7.4
 functional deprecated mysql 5.5 php 7.4 min:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -132,6 +156,8 @@ functional deprecated mysql 5.5 php 7.4 min:
 
 functional deprecated postgres 10 php 7.4 locked:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -140,6 +166,8 @@ functional deprecated postgres 10 php 7.4 locked:
     - Build/Scripts/runTests.sh -s functionalDeprecated -d postgres -i 10 -p 7.4
 functional deprecated postgres 10 php 7.4 max:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -152,6 +180,8 @@ functional deprecated postgres 10 php 7.4 max:
     - Build/Scripts/runTests.sh -s functionalDeprecated -d postgres -i 10 -p 7.4
 functional deprecated postgres 10 php 7.4 min:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -165,6 +195,8 @@ functional deprecated postgres 10 php 7.4 min:
 
 functional deprecated sqlite php 8.1 locked:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -173,6 +205,8 @@ functional deprecated sqlite php 8.1 locked:
     - Build/Scripts/runTests.sh -s functionalDeprecated -d sqlite -p 8.1
 functional deprecated sqlite php 8.1 max:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -185,6 +219,8 @@ functional deprecated sqlite php 8.1 max:
     - Build/Scripts/runTests.sh -s functionalDeprecated -d sqlite -p 8.1
 functional deprecated sqlite php 8.1 min:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -199,6 +235,8 @@ functional deprecated sqlite php 8.1 min:
 
 functional mariadb 10.3 php 7.4 locked:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -208,6 +246,8 @@ functional mariadb 10.3 php 7.4 locked:
     - Build/Scripts/runTests.sh -s functional -d mariadb -i 10.3 -p 7.4 -c $CI_NODE_INDEX/$CI_NODE_TOTAL
 functional mariadb 10.3 php 7.4 max:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -221,6 +261,8 @@ functional mariadb 10.3 php 7.4 max:
     - Build/Scripts/runTests.sh -s functional -d mariadb -i 10.3 -p 7.4 -c $CI_NODE_INDEX/$CI_NODE_TOTAL
 functional mariadb 10.3 php 7.4 min:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -235,6 +277,8 @@ functional mariadb 10.3 php 7.4 min:
 
 functional mariadb 10.10 php 8.3 locked:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -244,6 +288,8 @@ functional mariadb 10.10 php 8.3 locked:
     - Build/Scripts/runTests.sh -s functional -d mariadb -i 10.10 -p 8.3 -c $CI_NODE_INDEX/$CI_NODE_TOTAL
 functional mariadb 10.10 php 8.3 max:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -257,6 +303,8 @@ functional mariadb 10.10 php 8.3 max:
     - Build/Scripts/runTests.sh -s functional -d mariadb -i 10.10 -p 8.3 -c $CI_NODE_INDEX/$CI_NODE_TOTAL
 functional mariadb 10.10 php 8.3 min:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -271,6 +319,8 @@ functional mariadb 10.10 php 8.3 min:
 
 functional mysql 5.5 php 7.4 locked:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -280,6 +330,8 @@ functional mysql 5.5 php 7.4 locked:
     - Build/Scripts/runTests.sh -s functional -d mysql -i 5.5 -p 7.4 -c $CI_NODE_INDEX/$CI_NODE_TOTAL
 functional mysql 5.5 php 7.4 max:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -293,6 +345,8 @@ functional mysql 5.5 php 7.4 max:
     - Build/Scripts/runTests.sh -s functional -d mysql -i 5.5 -p 7.4 -c $CI_NODE_INDEX/$CI_NODE_TOTAL
 functional mysql 5.5 php 7.4 min:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -307,6 +361,8 @@ functional mysql 5.5 php 7.4 min:
 
 functional postgres 10 php 7.4 locked:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -316,6 +372,8 @@ functional postgres 10 php 7.4 locked:
     - Build/Scripts/runTests.sh -s functional -d postgres -i 10 -p 7.4 -c $CI_NODE_INDEX/$CI_NODE_TOTAL
 functional postgres 10 php 7.4 max:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -329,6 +387,8 @@ functional postgres 10 php 7.4 max:
     - Build/Scripts/runTests.sh -s functional -d postgres -i 10 -p 7.4 -c $CI_NODE_INDEX/$CI_NODE_TOTAL
 functional postgres 10 php 7.4 min:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -343,6 +403,8 @@ functional postgres 10 php 7.4 min:
 
 functional postgres 10 php 8.3 locked:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -352,6 +414,8 @@ functional postgres 10 php 8.3 locked:
     - Build/Scripts/runTests.sh -s functional -d postgres -i 10 -p 8.3 -c $CI_NODE_INDEX/$CI_NODE_TOTAL
 functional postgres 10 php 8.3 max:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -365,6 +429,8 @@ functional postgres 10 php 8.3 max:
     - Build/Scripts/runTests.sh -s functional -d postgres -i 10 -p 8.3 -c $CI_NODE_INDEX/$CI_NODE_TOTAL
 functional postgres 10 php 8.3 min:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -379,6 +445,8 @@ functional postgres 10 php 8.3 min:
 
 functional sqlite php 7.4 locked:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -388,6 +456,8 @@ functional sqlite php 7.4 locked:
     - Build/Scripts/runTests.sh -s functional -d sqlite -p 7.4 -c $CI_NODE_INDEX/$CI_NODE_TOTAL
 functional sqlite php 7.4 max:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -401,6 +471,8 @@ functional sqlite php 7.4 max:
     - Build/Scripts/runTests.sh -s functional -d sqlite -p 7.4 -c $CI_NODE_INDEX/$CI_NODE_TOTAL
 functional sqlite php 7.4 min:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -415,6 +487,8 @@ functional sqlite php 7.4 min:
 
 functional sqlite php 8.3 locked:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -424,6 +498,8 @@ functional sqlite php 8.3 locked:
     - Build/Scripts/runTests.sh -s functional -d sqlite -p 8.3 -c $CI_NODE_INDEX/$CI_NODE_TOTAL
 functional sqlite php 8.3 max:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -437,6 +513,8 @@ functional sqlite php 8.3 max:
     - Build/Scripts/runTests.sh -s functional -d sqlite -p 8.3 -c $CI_NODE_INDEX/$CI_NODE_TOTAL
 functional sqlite php 8.3 min:
   stage: functional
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
diff --git a/Build/gitlab-ci/nightly/integrity.yml b/Build/gitlab-ci/nightly/integrity.yml
index 5eb0a80fe22ac5ae098e8f25db56a70e32357ab0..acbbab4eb05e57d9fd0a3217055bf695d44155be 100644
--- a/Build/gitlab-ci/nightly/integrity.yml
+++ b/Build/gitlab-ci/nightly/integrity.yml
@@ -1,5 +1,7 @@
 annotations php 7.4:
   stage: integrity
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -9,6 +11,8 @@ annotations php 7.4:
 
 cgl:
   stage: integrity
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -18,6 +22,8 @@ cgl:
 
 grunt clean:
   stage: integrity
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -30,6 +36,8 @@ grunt clean:
 
 integration various:
   stage: integrity
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -57,6 +65,8 @@ integration various:
 
 lint php 7.4:
   stage: integrity
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -64,6 +74,8 @@ lint php 7.4:
     - Build/Scripts/runTests.sh -s lintPhp -p 7.4
 lint php 8.0:
   stage: integrity
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -71,6 +83,8 @@ lint php 8.0:
     - Build/Scripts/runTests.sh -s lintPhp -p 8.0
 lint php 8.1:
   stage: integrity
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -78,6 +92,8 @@ lint php 8.1:
     - Build/Scripts/runTests.sh -s lintPhp -p 8.1
 lint php 8.2:
   stage: integrity
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -86,6 +102,8 @@ lint php 8.2:
 
 lint scss ts html:
   stage: integrity
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -100,6 +118,8 @@ lint scss ts html:
 
 phpstan php 7.4:
   stage: integrity
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
diff --git a/Build/gitlab-ci/nightly/unit.yml b/Build/gitlab-ci/nightly/unit.yml
index 1255c18e1e25f899c208966828d80c3b77d301cc..a9558c9d872def9a0987d4b2fa527bbf9f6e48da 100644
--- a/Build/gitlab-ci/nightly/unit.yml
+++ b/Build/gitlab-ci/nightly/unit.yml
@@ -1,5 +1,7 @@
 unit javascript:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -13,6 +15,8 @@ unit javascript:
 
 unit php 7.4 locked:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -21,6 +25,8 @@ unit php 7.4 locked:
     - Build/Scripts/runTests.sh -s unit -p 7.4
 unit php 7.4 locked deprecated:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -29,6 +35,8 @@ unit php 7.4 locked deprecated:
     - Build/Scripts/runTests.sh -s unitDeprecated -p 7.4
 unit php 7.4 locked random:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -38,6 +46,8 @@ unit php 7.4 locked random:
 
 unit php 7.4 max:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -50,6 +60,8 @@ unit php 7.4 max:
     - Build/Scripts/runTests.sh -s unit -p 7.4
 unit php 7.4 max deprecated:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -62,6 +74,8 @@ unit php 7.4 max deprecated:
     - Build/Scripts/runTests.sh -s unitDeprecated -p 7.4
 unit php 7.4 max random:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -75,6 +89,8 @@ unit php 7.4 max random:
 
 unit php 7.4 min:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -87,6 +103,8 @@ unit php 7.4 min:
     - Build/Scripts/runTests.sh -s unit -p 7.4
 unit php 7.4 min deprecated:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -99,6 +117,8 @@ unit php 7.4 min deprecated:
     - Build/Scripts/runTests.sh -s unitDeprecated -p 7.4
 unit php 7.4 min random:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -112,6 +132,8 @@ unit php 7.4 min random:
 
 unit php 8.0 locked:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -120,6 +142,8 @@ unit php 8.0 locked:
     - Build/Scripts/runTests.sh -s unit -p 8.0
 unit php 8.0 locked deprecated:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -128,6 +152,8 @@ unit php 8.0 locked deprecated:
     - Build/Scripts/runTests.sh -s unitDeprecated -p 8.0
 unit php 8.0 locked random:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -137,6 +163,8 @@ unit php 8.0 locked random:
 
 unit php 8.0 max:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -149,6 +177,8 @@ unit php 8.0 max:
     - Build/Scripts/runTests.sh -s unit -p 8.0
 unit php 8.0 max deprecated:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -161,6 +191,8 @@ unit php 8.0 max deprecated:
     - Build/Scripts/runTests.sh -s unitDeprecated -p 8.0
 unit php 8.0 max random:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -174,6 +206,8 @@ unit php 8.0 max random:
 
 unit php 8.0 min:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -186,6 +220,8 @@ unit php 8.0 min:
     - Build/Scripts/runTests.sh -s unit -p 8.0
 unit php 8.0 min deprecated:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -198,6 +234,8 @@ unit php 8.0 min deprecated:
     - Build/Scripts/runTests.sh -s unitDeprecated -p 8.0
 unit php 8.0 min random:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -211,6 +249,8 @@ unit php 8.0 min random:
 
 unit php 8.1 locked:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -219,6 +259,8 @@ unit php 8.1 locked:
     - Build/Scripts/runTests.sh -s unit -p 8.1
 unit php 8.1 locked deprecated:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -227,6 +269,8 @@ unit php 8.1 locked deprecated:
     - Build/Scripts/runTests.sh -s unitDeprecated -p 8.1
 unit php 8.1 locked random:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -236,6 +280,8 @@ unit php 8.1 locked random:
 
 unit php 8.1 max:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -248,6 +294,8 @@ unit php 8.1 max:
     - Build/Scripts/runTests.sh -s unit -p 8.1
 unit php 8.1 max deprecated:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -260,6 +308,8 @@ unit php 8.1 max deprecated:
     - Build/Scripts/runTests.sh -s unitDeprecated -p 8.1
 unit php 8.1 max random:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -273,6 +323,8 @@ unit php 8.1 max random:
 
 unit php 8.1 min:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -285,6 +337,8 @@ unit php 8.1 min:
     - Build/Scripts/runTests.sh -s unit -p 8.1
 unit php 8.1 min deprecated:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -297,6 +351,8 @@ unit php 8.1 min deprecated:
     - Build/Scripts/runTests.sh -s unitDeprecated -p 8.1
 unit php 8.1 min random:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -310,6 +366,8 @@ unit php 8.1 min random:
 
 unit php 8.2 locked:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -318,6 +376,8 @@ unit php 8.2 locked:
     - Build/Scripts/runTests.sh -s unit -p 8.2
 unit php 8.2 locked deprecated:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -326,6 +386,8 @@ unit php 8.2 locked deprecated:
     - Build/Scripts/runTests.sh -s unitDeprecated -p 8.2
 unit php 8.2 locked random:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -335,6 +397,8 @@ unit php 8.2 locked random:
 
 unit php 8.2 max:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -347,6 +411,8 @@ unit php 8.2 max:
     - Build/Scripts/runTests.sh -s unit -p 8.2
 unit php 8.2 max deprecated:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -359,6 +425,8 @@ unit php 8.2 max deprecated:
     - Build/Scripts/runTests.sh -s unitDeprecated -p 8.2
 unit php 8.2 max random:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -372,6 +440,8 @@ unit php 8.2 max random:
 
 unit php 8.2 min:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -384,6 +454,8 @@ unit php 8.2 min:
     - Build/Scripts/runTests.sh -s unit -p 8.2
 unit php 8.2 min deprecated:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -396,6 +468,8 @@ unit php 8.2 min deprecated:
     - Build/Scripts/runTests.sh -s unitDeprecated -p 8.2
 unit php 8.2 min random:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -409,6 +483,8 @@ unit php 8.2 min random:
 
 unit php 8.3 locked:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -417,6 +493,8 @@ unit php 8.3 locked:
     - Build/Scripts/runTests.sh -s unit -p 8.3
 unit php 8.3 locked deprecated:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -425,6 +503,8 @@ unit php 8.3 locked deprecated:
     - Build/Scripts/runTests.sh -s unitDeprecated -p 8.3
 unit php 8.3 locked random:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -434,6 +514,8 @@ unit php 8.3 locked random:
 
 unit php 8.3 max:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -446,6 +528,8 @@ unit php 8.3 max:
     - Build/Scripts/runTests.sh -s unit -p 8.3
 unit php 8.3 max deprecated:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -458,6 +542,8 @@ unit php 8.3 max deprecated:
     - Build/Scripts/runTests.sh -s unitDeprecated -p 8.3
 unit php 8.3 max random:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -471,6 +557,8 @@ unit php 8.3 max random:
 
 unit php 8.3 min:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -483,6 +571,8 @@ unit php 8.3 min:
     - Build/Scripts/runTests.sh -s unit -p 8.3
 unit php 8.3 min deprecated:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
@@ -495,6 +585,8 @@ unit php 8.3 min deprecated:
     - Build/Scripts/runTests.sh -s unitDeprecated -p 8.3
 unit php 8.3 min random:
   stage: unit
+  tags:
+    - metal2
   needs: []
   only:
     - schedules
diff --git a/Build/gitlab-ci/pre-merge/acceptance-application.yml b/Build/gitlab-ci/pre-merge/acceptance-application.yml
index 7ecf8c5102333fc4c14b96c8ff6413ea343e2870..1c53e4576bee0446be79f07cf326fe63aea8ecdf 100644
--- a/Build/gitlab-ci/pre-merge/acceptance-application.yml
+++ b/Build/gitlab-ci/pre-merge/acceptance-application.yml
@@ -1,5 +1,7 @@
 acceptance application mariadb php 7.4 pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -16,6 +18,8 @@ acceptance application mariadb php 7.4 pre-merge:
 
 acceptance application mariadb php 8.3 pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
diff --git a/Build/gitlab-ci/pre-merge/acceptance-install.yml b/Build/gitlab-ci/pre-merge/acceptance-install.yml
index b2ad1db1b1b93993c68f2245648fecad93a377c3..da1922149635c7c637431a7ade7b1351a9b43dd1 100644
--- a/Build/gitlab-ci/pre-merge/acceptance-install.yml
+++ b/Build/gitlab-ci/pre-merge/acceptance-install.yml
@@ -1,5 +1,7 @@
 acceptance install mariadb 10.3 php 7.4 pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -14,6 +16,8 @@ acceptance install mariadb 10.3 php 7.4 pre-merge:
 
 acceptance install mariadb 10.10 php 8.2 pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -28,6 +32,8 @@ acceptance install mariadb 10.10 php 8.2 pre-merge:
 
 acceptance install mysql php 8.2 pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -42,6 +48,8 @@ acceptance install mysql php 8.2 pre-merge:
 
 acceptance install postgres php 7.4 pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -56,6 +64,8 @@ acceptance install postgres php 7.4 pre-merge:
 
 acceptance install sqlite php 8.1 pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
diff --git a/Build/gitlab-ci/pre-merge/functional.yml b/Build/gitlab-ci/pre-merge/functional.yml
index 3f1781538c909a5a0122256beed4b1764c5df51f..25d223d7217551771edc805bcb34b85b210778b2 100644
--- a/Build/gitlab-ci/pre-merge/functional.yml
+++ b/Build/gitlab-ci/pre-merge/functional.yml
@@ -1,5 +1,7 @@
 functional deprecated mariadb 10.3 php 8.1 pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -10,6 +12,8 @@ functional deprecated mariadb 10.3 php 8.1 pre-merge:
 
 functional deprecated postgres 10 php 7.4 pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -20,6 +24,8 @@ functional deprecated postgres 10 php 7.4 pre-merge:
 
 functional mariadb 10.3 php 8.0 pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -31,6 +37,8 @@ functional mariadb 10.3 php 8.0 pre-merge:
 
 functional postgres 10 php 8.3 pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -42,6 +50,8 @@ functional postgres 10 php 8.3 pre-merge:
 
 functional sqlite php 7.4 pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
diff --git a/Build/gitlab-ci/pre-merge/integrity.yml b/Build/gitlab-ci/pre-merge/integrity.yml
index 78cefdac55c4001d3c215bdcf3caa63ed254e9ab..c50adfaba4bf072cd896db07827107d4cd1ec3ba 100644
--- a/Build/gitlab-ci/pre-merge/integrity.yml
+++ b/Build/gitlab-ci/pre-merge/integrity.yml
@@ -1,5 +1,7 @@
 annotations php 7.4 pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -10,6 +12,8 @@ annotations php 7.4 pre-merge:
 
 cgl pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -20,6 +24,8 @@ cgl pre-merge:
 
 grunt clean pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -33,6 +39,8 @@ grunt clean pre-merge:
 
 integration various pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -61,6 +69,8 @@ integration various pre-merge:
 
 lint php 7.4 pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -71,6 +81,8 @@ lint php 7.4 pre-merge:
 
 lint php 8.2 pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -81,6 +93,8 @@ lint php 8.2 pre-merge:
 
 lint scss ts html pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -96,6 +110,8 @@ lint scss ts html pre-merge:
 
 phpstan php 7.4 pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
diff --git a/Build/gitlab-ci/pre-merge/unit.yml b/Build/gitlab-ci/pre-merge/unit.yml
index e8302c48e31518998ba0f9cd55abf9713e53d06c..481b354ea51231752435efe3047150d39fb3ace4 100644
--- a/Build/gitlab-ci/pre-merge/unit.yml
+++ b/Build/gitlab-ci/pre-merge/unit.yml
@@ -1,5 +1,7 @@
 unit javascript pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -14,6 +16,8 @@ unit javascript pre-merge:
 
 unit php 7.4 deprecated pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -23,6 +27,8 @@ unit php 7.4 deprecated pre-merge:
     - Build/Scripts/runTests.sh -s unitDeprecated -p 7.4
 unit php 7.4 pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -32,6 +38,8 @@ unit php 7.4 pre-merge:
     - Build/Scripts/runTests.sh -s unit -p 7.4
 unit php 7.4 random pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -42,6 +50,8 @@ unit php 7.4 random pre-merge:
 
 unit php 8.1 deprecated pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -51,6 +61,8 @@ unit php 8.1 deprecated pre-merge:
     - Build/Scripts/runTests.sh -s unitDeprecated -p 8.1
 unit php 8.1 pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -60,6 +72,8 @@ unit php 8.1 pre-merge:
     - Build/Scripts/runTests.sh -s unit -p 8.1
 unit php 8.1 random pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -70,6 +84,8 @@ unit php 8.1 random pre-merge:
 
 unit php 8.2 pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -79,6 +95,8 @@ unit php 8.2 pre-merge:
     - Build/Scripts/runTests.sh -s unit -p 8.2
 unit php 8.2 deprecated pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -89,6 +107,8 @@ unit php 8.2 deprecated pre-merge:
 
 unit php 8.3 pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
@@ -98,6 +118,8 @@ unit php 8.3 pre-merge:
     - Build/Scripts/runTests.sh -s unit -p 8.3
 unit php 8.3 deprecated pre-merge:
   stage: main
+  tags:
+    - metal2
   except:
     refs:
       - schedules
diff --git a/Build/phpstan/phpstan.ci.neon b/Build/phpstan/phpstan.ci.neon
index 31cf691e74674552355cb8570738d4a27cfc4e65..31088e915f48bf37b6f50b75a0877673072a6706 100644
--- a/Build/phpstan/phpstan.ci.neon
+++ b/Build/phpstan/phpstan.ci.neon
@@ -7,8 +7,6 @@ parameters:
   tmpDir: /tmp
 
   parallel:
-    # Don't be overly greedy on machines with more CPU's to be a good neighbor especially on CI
-    maximumNumberOfProcesses: 5
     # @todo Process timeout raised as a intermediate solution. This should be further investigated if we can mitigate
     #       the occurring subprocess timeout issue through other configurations and minimize the execution time again.
     processTimeout: 900.0
diff --git a/typo3/sysext/core/Tests/Acceptance/Application/FileList/FileClipboardCest.php b/typo3/sysext/core/Tests/Acceptance/Application/FileList/FileClipboardCest.php
index 0cd92675d7c3dcff74df0f75016c8f95a42c074c..35b4b9631c6e9d78f860cfa66fc41a45a334daf0 100644
--- a/typo3/sysext/core/Tests/Acceptance/Application/FileList/FileClipboardCest.php
+++ b/typo3/sysext/core/Tests/Acceptance/Application/FileList/FileClipboardCest.php
@@ -83,6 +83,7 @@ class FileClipboardCest extends AbstractFileCest
         $I->switchToContentFrame();
 
         $I->amGoingTo('add multiple elements to clipboard');
+        $I->wait(1);
         $I->click('Clipboard #1 (multi-selection mode)');
         $I->click('.dropdown-toggle');
         $I->click('button[data-multi-record-selection-check-action="check-all"]');
diff --git a/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/FalMetadataCest.php b/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/FalMetadataCest.php
index 80c8ffabbc26edb4fcda5b115333be29fa3b2a5c..ce80f9e915fc53d3df39b2740a26760b30d1ed08 100644
--- a/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/FalMetadataCest.php
+++ b/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/FalMetadataCest.php
@@ -54,7 +54,9 @@ class FalMetadataCest
     public function checkIfUpdatedFileMetadataIsUpdatedInContent(ApplicationTester $I, PageTree $pageTree, FileTree $fileTree): void
     {
         $I->amGoingTo('Create new CE with image');
+        $I->wait(1);
         $I->click('.t3js-page-new-ce button');
+        $I->wait(1);
         $I->switchToMainFrame();
         $I->waitForElement('.t3js-modal.show');
         $I->wait(3);
@@ -67,6 +69,7 @@ class FalMetadataCest
         $I->click('Images');
         $I->click('Add image');
         $I->switchToWindow();
+        $I->wait(2);
         $I->switchToIFrame('modal_frame');
         $I->waitForElement('.svg-tree-wrapper .nodes .node', 5);
         $I->click('.node[title="styleguide"]');
@@ -146,6 +149,7 @@ class FalMetadataCest
     public function checkIfFileMetadataIsInheritedInContent(ApplicationTester $I): void
     {
         $I->amGoingTo('Create new CE with image with filled metadata');
+        $I->wait(1);
         $I->click('.t3js-page-new-ce button');
         $I->switchToMainFrame();
         $I->waitForElement('.t3js-modal.show');
@@ -159,6 +163,7 @@ class FalMetadataCest
         $I->click('Images');
         $I->click('Add image');
         $I->switchToWindow();
+        $I->wait(2);
         $I->switchToIFrame('modal_frame');
         $I->waitForElement('.svg-tree-wrapper .nodes .node', 5);
         $I->click('.node[title="styleguide"]');
diff --git a/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlineContentElementLocalizeSynchronizeCest.php b/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlineContentElementLocalizeSynchronizeCest.php
index 5e56f51b3b5b94e2d7c718b79748a20ac58c37da..d9b50e86ebe7098b1aacbc2330b5ca346915bfc3 100644
--- a/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlineContentElementLocalizeSynchronizeCest.php
+++ b/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlineContentElementLocalizeSynchronizeCest.php
@@ -49,6 +49,7 @@ class InlineContentElementLocalizeSynchronizeCest
         $I->click('Images');
         $I->click('span[data-identifier="actions-insert-record"]', 'div.active');
         $I->switchToWindow();
+        $I->wait(2);
         $I->switchToIFrame('modal_frame');
         // Find page 'styleguide' in page tree of modal and click it
         $context = $I->executeInSelenium(function (RemoteWebDriver $webdriver) {
@@ -65,8 +66,10 @@ class InlineContentElementLocalizeSynchronizeCest
         $I->waitForElementVisible('.module-docheader a[title="Close"]');
         $I->click('.module-docheader a[title="Close"]');
         $I->switchToWindow();
+        $I->wait(1);
         $I->waitForText('Save and close');
         $I->click('Save and close');
+        $I->wait(1);
         // Switch to "All languages" view and localize content element
         $I->switchToContentFrame();
         $I->waitForElementVisible('select[name=actionMenu]');
@@ -89,6 +92,7 @@ class InlineContentElementLocalizeSynchronizeCest
         $I->click('Images');
         $I->click('span[data-identifier="actions-insert-record"]', 'div.active');
         $I->switchToWindow();
+        $I->wait(2);
         $I->switchToIFrame('modal_frame');
         // Find page 'styleguide' in page tree of modal and click it
         $context = $I->executeInSelenium(function (RemoteWebDriver $webdriver) {
@@ -104,8 +108,10 @@ class InlineContentElementLocalizeSynchronizeCest
         $I->switchToContentFrame();
         $I->click('.module-docheader a[title="Close"]');
         $I->switchToWindow();
+        $I->wait(1);
         $I->waitForText('Save and close');
         $I->click('Save and close');
+        $I->wait(1);
         $I->waitForElementNotVisible('.t3js-modal.show');
         // Open the localized element and see that the second image can be synchronized
         $I->switchToContentFrame();
diff --git a/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlineFalCest.php b/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlineFalCest.php
index a7be00465210024e98aa12229c30e77d1918d5a8..4f4b4986f82686900d45592c9888082f26b1b1cb 100644
--- a/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlineFalCest.php
+++ b/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlineFalCest.php
@@ -50,11 +50,14 @@ class InlineFalCest
     public function seeFalRelationInfo(ApplicationTester $I, ModalDialog $modalDialog): void
     {
         $infoButtonSelector = '.tab-content button[data-action="infowindow"]';
-
+        $I->wait(2);
         $filename = $I->grabTextFrom(self::$filenameSelector);
         $I->click($infoButtonSelector);
+        $I->wait(2);
         $modalDialog->canSeeDialog();
+        $I->wait(2);
         $I->switchToIFrame('.modal-iframe');
+        $I->wait(2);
         $modalTitle = $I->grabTextFrom('.card-title');
         $I->assertStringContainsString($filename, $modalTitle);
     }
diff --git a/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlinePagesLocalizeResourceCest.php b/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlinePagesLocalizeResourceCest.php
index 511b5413f8e1a9f241b4f1c0f3f655fa6459978b..ec851f17a07123db18bbb15dce24da1f85d16352 100644
--- a/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlinePagesLocalizeResourceCest.php
+++ b/typo3/sysext/core/Tests/Acceptance/Application/FormEngine/InlinePagesLocalizeResourceCest.php
@@ -59,11 +59,14 @@ class InlinePagesLocalizeResourceCest
         $I->switchToContentFrame();
         $I->click('.module-docheader a[title="Close"]');
         $I->switchToWindow();
+        $I->wait(1);
         $I->waitForText('Save and close');
         $I->click('Save and close');
+        $I->wait(1);
         // Edit the page translation and see if that resource has been added.
         $I->switchToContentFrame();
         $I->waitForText('staticdata - language 1');
+        $I->wait(1);
         $I->click('staticdata - language 1');
         $I->waitForText('Edit Page "staticdata - language 1"', 3, 'h1');
         $I->click('Resources');
diff --git a/typo3/sysext/core/Tests/Acceptance/Application/Frontend/SitemapXmlCest.php b/typo3/sysext/core/Tests/Acceptance/Application/Frontend/SitemapXmlCest.php
index fc9b5bb47ad11746cf3dfb39ad234b7e2a739dc5..8344d33574d84c6a6ca46593017ce5be5bc1e001 100644
--- a/typo3/sysext/core/Tests/Acceptance/Application/Frontend/SitemapXmlCest.php
+++ b/typo3/sysext/core/Tests/Acceptance/Application/Frontend/SitemapXmlCest.php
@@ -39,6 +39,7 @@ class SitemapXmlCest
         $pageTree->openPath(['styleguide frontend demo']);
         $I->switchToContentFrame();
         $I->waitForElementVisible('.t3js-module-docheader-bar a[title="View webpage"]');
+        $I->wait(2);
         $I->click('.t3js-module-docheader-bar a[title="View webpage"]');
         $I->executeInSelenium(function (RemoteWebDriver $webdriver) {
             $handles = $webdriver->getWindowHandles();
@@ -48,7 +49,6 @@ class SitemapXmlCest
 
         // Get current url
         $url = $this->getCurrentURL($I);
-
         // Add Sitemap parameter to URL
         $I->amOnUrl($url . '?type=1533906435');
     }
diff --git a/typo3/sysext/core/Tests/Acceptance/Application/Impexp/AbstractCest.php b/typo3/sysext/core/Tests/Acceptance/Application/Impexp/AbstractCest.php
index 43c58d987d380efa42b56988cbbd99b50a421ff6..1939e1a118a0567f53c72590eb835a740e2132cc 100644
--- a/typo3/sysext/core/Tests/Acceptance/Application/Impexp/AbstractCest.php
+++ b/typo3/sysext/core/Tests/Acceptance/Application/Impexp/AbstractCest.php
@@ -52,8 +52,11 @@ abstract class AbstractCest
         $I->waitForElement($this->inPageTree . ' .node', 5);
         $pageTree->openPath($pagePath);
         $I->switchToContentFrame();
+        $I->wait(2);
         $I->waitForElementVisible('//table[@id="typo3-permissionList"]/tbody/tr[1]/td[2]/a[@title="Change permissions"]');
+        $I->wait(2);
         $I->click('//table[@id="typo3-permissionList"]/tbody/tr[1]/td[2]/a[@title="Change permissions"]');
+        $I->wait(2);
         $I->waitForElementVisible('#PermissionControllerEdit');
         $I->selectOption('//select[@id="selectGroup"]', ['value' => $userGroupId]);
         $recursionLevelOption = $I->grabTextFrom('//select[@id="recursionLevel"]/option[' . $recursionLevel . ']');
diff --git a/typo3/sysext/core/Tests/Acceptance/Application/InstallTool/UpgradeCest.php b/typo3/sysext/core/Tests/Acceptance/Application/InstallTool/UpgradeCest.php
index 5c4d5ba6d78589483b850d9f72f3ce1474279274..7a2901a4a28cf4b19903f9e509780664a3a6240b 100644
--- a/typo3/sysext/core/Tests/Acceptance/Application/InstallTool/UpgradeCest.php
+++ b/typo3/sysext/core/Tests/Acceptance/Application/InstallTool/UpgradeCest.php
@@ -143,6 +143,7 @@ class UpgradeCest extends AbstractCest
 
     public function seeCheckForBrokenExtensions(ApplicationTester $I, ModalDialog $modalDialog): void
     {
+        $I->wait(1);
         $I->click('Check Extension Compatibility');
         $modalDialog->canSeeDialog();
         $I->see('ext_localconf.php of all loaded extensions successfully loaded', ModalDialog::$openedModalSelector);
diff --git a/typo3/sysext/core/Tests/Acceptance/Application/Recycler/RecyclerModuleCest.php b/typo3/sysext/core/Tests/Acceptance/Application/Recycler/RecyclerModuleCest.php
index 9c56b976b82cca37c49be82fdf002abeeb6acfe5..e16e601bc0cec805410663e47dd58c9f5352e1dd 100644
--- a/typo3/sysext/core/Tests/Acceptance/Application/Recycler/RecyclerModuleCest.php
+++ b/typo3/sysext/core/Tests/Acceptance/Application/Recycler/RecyclerModuleCest.php
@@ -72,6 +72,7 @@ class RecyclerModuleCest
         $this->goToRecyclerModule($I);
 
         // Select depth infinite
+        $I->wait(1);
         $I->selectOption('select[name="depth"]', 999);
 
         $I->amGoingTo('See if the deleted page its content appear in the recycler');
diff --git a/typo3/sysext/core/Tests/Acceptance/Application/Site/SiteModuleCest.php b/typo3/sysext/core/Tests/Acceptance/Application/Site/SiteModuleCest.php
index a1a27d72a6844a477c176dccc25689a9d26fd75f..a32c91be0c039a9890c0d40526d2bcf01ec2c6fb 100644
--- a/typo3/sysext/core/Tests/Acceptance/Application/Site/SiteModuleCest.php
+++ b/typo3/sysext/core/Tests/Acceptance/Application/Site/SiteModuleCest.php
@@ -17,11 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Acceptance\Application\Site;
 
-use Facebook\WebDriver\Remote\RemoteWebDriver;
-use Facebook\WebDriver\Remote\RemoteWebElement;
 use TYPO3\CMS\Core\Tests\Acceptance\Support\ApplicationTester;
 use TYPO3\CMS\Core\Tests\Acceptance\Support\Helper\ModalDialog;
-use TYPO3\CMS\Core\Tests\Acceptance\Support\Helper\PageTree;
 
 /**
  * Tests concerning Sites Module
@@ -35,39 +32,35 @@ class SiteModuleCest
 
     public function editExistingRecord(ApplicationTester $I, ModalDialog $modalDialog): void
     {
-        $acceptanceUrl = $I->grabModuleConfig('WebDriver', 'url');
-        $acceptanceUrlWithTrailingSlash = rtrim($acceptanceUrl, '/') . '/';
-
         $I->amGoingTo('Access the site module');
         $I->click('Sites');
         $I->switchToContentFrame();
-        $I->canSee('Site Configuration', 'h1');
+        $I->see('Site Configuration', 'h1');
 
         $I->amGoingTo('edit an automatically created site configuration');
         $I->click('Edit');
         $I->waitForElementNotVisible('#t3js-ui-block');
-        $I->canSee('Edit Site Configuration', 'h1');
-        $I->fillField('//input[contains(@data-formengine-input-name, "data[site]") and contains(@data-formengine-input-name, "[identifier]")]', 'autogenerated-1-c4ca4238a0');
-        $I->fillField('//input[contains(@data-formengine-input-name, "data[site]") and contains(@data-formengine-input-name, "[base]")]', $acceptanceUrlWithTrailingSlash);
+        $I->see('Edit Site Configuration', 'h1');
 
         $I->amGoingTo('Edit the default site language');
         $I->click('Languages');
-        $I->canSee('English [0] (en_US.UTF-8)');
+        $I->see('English [0] (en_US.UTF-8)');
         $I->click('div[data-table-unique-original-value=site_language_0] > div:nth-child(1) > div:nth-child(1)');
         $I->waitForElementVisible('div[data-table-unique-original-value=site_language_0] > div.panel-collapse');
         $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[title]")]', 'English Edit');
-        $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[base]")]', $acceptanceUrlWithTrailingSlash);
+        $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[base]")]', '/');
         $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[locale]")]', 'en_US.UTF-8');
 
         $I->amGoingTo('Delete a site language');
-        $I->canSee('styleguide demo language danish [1] (da_DK.UTF-8)');
+        $I->see('styleguide demo language danish [1] (da_DK.UTF-8)');
         $I->click('div[data-table-unique-original-value=site_language_1] > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) button');
         $modalDialog->canSeeDialog();
         $I->click('button[name="yes"]', ModalDialog::$openedModalButtonContainerSelector);
         $I->waitForElementNotVisible(ModalDialog::$openedModalSelector, 30);
         $I->switchToContentFrame();
+        $I->wait(2);
         $I->dontSee('styleguide demo language danish [1] (da_DK.UTF-8)');
-        $I->canSee('styleguide demo language danish [1]', 'option');
+        $I->see('styleguide demo language danish [1]', 'option');
 
         $I->amGoingTo('Save the site configuration');
         $saveButtonLink = '//*/button[@name="_savedok"][1]';
@@ -76,14 +69,14 @@ class SiteModuleCest
         $I->waitForElementNotVisible('#t3js-ui-block');
 
         $I->amGoingTo('Verify default site language has changed and danish is deleted');
-        $I->canSee('English Edit [0] (en_US.UTF-8)');
+        $I->see('English Edit [0] (en_US.UTF-8)');
         $I->dontSee('styleguide demo language danish [1] (da_DK.UTF-8)');
 
         $I->amGoingTo('Create a completely new site language');
         $I->click('Create new language');
         $I->waitForElementVisible('div.inlineIsNewRecord');
         $I->scrollTo('div.inlineIsNewRecord');
-        $I->canSee('[New language]');
+        $I->see('[New language]');
         $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[title]")]', 'New Language');
         $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[base]")]', '/new-language/');
         $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[locale]")]', 'C');
@@ -100,207 +93,6 @@ class SiteModuleCest
         $I->amGoingTo('Close the site configuration form');
         $I->click('Close');
         $I->waitForElementVisible('table.table-striped');
-        $I->canSee('Site Configuration', 'h1');
-        $I->canSee('autogenerated-1-c4ca4238a0', 'code');
-
-        $I->amGoingTo('Ensure the previously added language is available and the default is prefilled in a new site configuration');
-        $I->click('Add new site configuration for this site');
-        $I->waitForElementNotVisible('#t3js-ui-block');
-        $I->canSee('Create new Site Configuration', 'h1');
-        $I->click('Languages');
-        $I->canSee('New Language [5]', 'option');
-        $I->canSee('English Edit [0] (en_US.UTF-8)');
-        $title = $I->grabValueFrom('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[title]")]');
-        $I->assertEquals('English Edit', $title);
-        $I->click('div.inlineIsNewRecord:nth-child(1) > div:nth-child(1) > div:nth-child(1)');
-
-        $I->amGoingTo('Verify new language can be added from selector box and deleted afterwards');
-        $I->selectOption('.t3js-create-new-selector', '5');
-        $I->waitForElementVisible('div.inlineIsNewRecord:nth-child(2)');
-        $I->scrollTo('div.inlineIsNewRecord:nth-child(2)');
-        $I->canSee('New Language [5] (C)');
-        $I->click('div.inlineIsNewRecord:nth-child(2) > div:nth-child(1) > div:nth-child(1)');
-        $I->canSee('/hr/');
-        $I->click('div.inlineIsNewRecord:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) button');
-        $modalDialog->canSeeDialog();
-        $I->click('button[name="yes"]', ModalDialog::$openedModalButtonContainerSelector);
-        $I->waitForElementNotVisible(ModalDialog::$openedModalSelector, 30);
-        $I->switchToContentFrame();
-        $I->waitForText('New Language [5]');
-        $I->see('New Language [5]', 'option');
-
-        $I->amGoingTo('Undo the generation of the new site configuration');
-        $I->click('Close');
-        $modalDialog->canSeeDialog();
-        $I->click('button[name="yes"]', ModalDialog::$openedModalButtonContainerSelector);
-        $I->waitForElementNotVisible(ModalDialog::$openedModalSelector, 30);
-        $I->switchToContentFrame();
-        $I->canSee('Add new site configuration for this site', 'a');
-    }
-
-    /**
-     * Add a default FE ts snipped to the existing site config and verify FE is rendered
-     *
-     * @depends editExistingRecord
-     */
-    public function defaultFrontendRendering(ApplicationTester $I, PageTree $pageTree, ModalDialog $modalDialog): void
-    {
-        $I->amGoingTo('Create a default FE typoscript for the created site configuration');
-
-        // Select the root page
-        $I->switchToMainFrame();
-        $I->amGoingTo('Access template module');
-        $I->click('Template');
-        // click on PID=0
-        $I->waitForElement('svg .nodes .node');
-        $I->clickWithLeftButton('#identifier-0_0 text.node-name');
-        $I->switchToContentFrame();
-        $I->waitForElementVisible('#ts-overview');
-        $I->see('Template tools');
-
-        $I->amGoingTo('Select the root page and switch back to content frame');
-        $I->switchToMainFrame();
-        $I->click('Template');
-        $pageTree->openPath(['styleguide TCA demo']);
-        $I->switchToContentFrame();
-        $I->waitForText('Create new website');
-
-        $I->amGoingTo('Create a new template for the root page');
-        $I->click("//input[@name='newWebsite']");
-        $I->selectOption('.t3-js-jumpMenuBox', 'Info/Modify');
-        $I->see('NEW SITE', 'h3');
-        $I->waitForElement('table.table.table-striped');
-        $I->see('Title');
-
-        $I->amGoingTo('Add the PAGE object');
-        $I->click('Edit the whole template record');
-        $I->waitForElement('#EditDocumentController');
-        $I->fillField($this->getInputByLabel($I, 'Template Title'), 'Default Title');
-        $I->click("//button[@name='_savedok']");
-        $I->waitForElementNotVisible('#t3js-ui-block', 30);
-        $I->waitForElement('#EditDocumentController');
-        $I->waitForElementNotVisible('#t3js-ui-block');
-
-        // watch out for new line after each instruction. Anything else doesn't work.
-        $config = 'page = PAGE
-page.shortcutIcon = fileadmin/styleguide/bus_lane.jpg
-page.10 = TEXT
-page.10.value = This is a default text for default rendering without dynamic content creation
-';
-        $I->fillField($this->getInputByLabel($I, 'Setup', 'textarea'), $config);
-        $I->click('//button[@name="_savedok"]');
-        $I->waitForElementNotVisible('#t3js-ui-block');
-
-        $I->amGoingTo('Call FE and verify it is properly rendered');
-        $I->amOnPage('/');
-        $I->canSee('This is a default text for default rendering without dynamic content creation');
-
-        $I->amGoingTo('Delete the site template record again');
-        $I->amOnPage('/typo3/index.php');
-        $I->click('Template');
-        // click on PID=0
-        $I->waitForElement('svg .nodes .node');
-        $I->clickWithLeftButton('#identifier-0_0 text.node-name');
-        $I->switchToContentFrame();
-        $I->waitForElementVisible('#ts-overview');
-        $I->switchToMainFrame();
-        $pageTree->openPath(['styleguide TCA demo']);
-        $I->wait(0.2);
-        $I->switchToContentFrame();
-        $I->click('Edit the whole template record');
-        $I->waitForElement('#EditDocumentController');
-        $I->click('Delete');
-        $modalDialog->canSeeDialog();
-        $I->click('button[name="yes"]', ModalDialog::$openedModalButtonContainerSelector);
-        $I->waitForElementNotVisible(ModalDialog::$openedModalSelector, 30);
-        $I->switchToContentFrame();
-        $I->see('Create new website');
-    }
-
-    /**
-     * @depends defaultFrontendRendering
-     * @throws \Exception
-     */
-    public function createSiteConfigIfNoneExists(ApplicationTester $I, ModalDialog $modalDialog): void
-    {
-        $acceptanceUrl = $I->grabModuleConfig('WebDriver', 'url');
-        $acceptanceUrlWithTrailingSlash = rtrim($acceptanceUrl, '/') . '/';
-
-        $I->amGoingTo('Access the site module');
-        $I->click('Sites');
-        $I->switchToContentFrame();
-        $I->canSee('Site Configuration', 'h1');
-
-        $I->amGoingTo('delete the auto generated config in order to create one manually');
-        $I->click('Delete site configuration');
-        $modalDialog->canSeeDialog();
-        $modalDialog->clickButtonInDialog('Delete');
-        $I->switchToContentFrame();
-
-        $I->amGoingTo('manually create a new site config for the existing root page');
-        $I->click('Add new site configuration for this site');
-        $I->waitForElementNotVisible('#t3js-ui-block');
-        $I->canSee('Create new Site configuration');
-        $I->fillField('//input[contains(@data-formengine-input-name, "data[site]") and contains(@data-formengine-input-name, "[identifier]")]', 'SitesTestIdentifier');
-        $I->fillField('//input[contains(@data-formengine-input-name, "data[site]") and contains(@data-formengine-input-name, "[base]")]', $acceptanceUrlWithTrailingSlash);
-        $I->click('Languages');
-
-        $I->amGoingTo('Delete the automatically added default language and add it again from the selector afterwards');
-        $I->click('div.inlineIsNewRecord > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) button');
-        $modalDialog->canSeeDialog();
-        $I->click('button[name="yes"]', ModalDialog::$openedModalButtonContainerSelector);
-        $I->waitForElementNotVisible(ModalDialog::$openedModalSelector, 30);
-        $I->switchToContentFrame();
-        $I->wait(1);
-        $I->canSee('English [0]', 'option');
-        $I->selectOption('.t3js-create-new-selector', '0');
-        $I->waitForElementVisible('div.inlineIsNewRecord:nth-child(1)');
-        $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[title]")]', 'Homepage');
-        $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[base]")]', $acceptanceUrlWithTrailingSlash);
-        $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[locale]")]', 'en_US.UTF-8');
-        $saveButtonLink = '//*/button[@name="_savedok"][1]';
-        $I->waitForElement($saveButtonLink, 30);
-        $I->click($saveButtonLink);
-
-        $I->amGoingTo('Create and delete new site language. Verify "Placehoder" is not added to selector');
-        $I->click('Languages');
-        $I->click('Create new language');
-        $I->waitForElementVisible('div.inlineIsNewRecord');
-        $I->scrollTo('div.inlineIsNewRecord');
-        $I->canSee('[New language]');
-        $I->click('div.inlineIsNewRecord > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) button');
-        $modalDialog->canSeeDialog();
-        $I->click('button[name="yes"]', ModalDialog::$openedModalButtonContainerSelector);
-        $I->waitForElementNotVisible(ModalDialog::$openedModalSelector, 30);
-        $I->switchToContentFrame();
-        $I->dontSee('Placeholder');
-
-        $I->amGoingTo('Close site configuration and verify that it got saved');
-        $I->waitForElementNotVisible('#t3js-ui-block');
-        $I->click('div.module-docheader .btn.t3js-editform-close');
-        $modalDialog->canSeeDialog();
-        $I->click('button[name="save"]', ModalDialog::$openedModalButtonContainerSelector);
-        $I->waitForElementNotVisible(ModalDialog::$openedModalSelector, 30);
-        $I->switchToContentFrame();
-        $I->waitForElementVisible('table.table-striped');
-        $I->canSee('Site Configuration', 'h1');
-        $I->canSee('SitesTestIdentifier');
-    }
-
-    /**
-     * Find input field by label name
-     */
-    protected function getInputByLabel(ApplicationTester $I, string $labelName, string $tag = 'input[@type="text"]'): RemoteWebElement
-    {
-        $I->comment('Get input for label "' . $labelName . '"');
-        return $I->executeInSelenium(
-            static function (RemoteWebDriver $webDriver) use ($labelName, $tag) {
-                return $webDriver->findElement(
-                    \Facebook\WebDriver\WebDriverBy::xpath(
-                        '//abbr[contains(text(),"' . $labelName . '")]/parent::*/parent::*/following-sibling::div//' . $tag
-                    )
-                );
-            }
-        );
+        $I->see('Site Configuration', 'h1');
     }
 }
diff --git a/typo3/sysext/core/Tests/Acceptance/Application/Template/TemplateCest.php b/typo3/sysext/core/Tests/Acceptance/Application/Template/TemplateCest.php
index 93ca7f6eedb5f7d461cfcdcf7255a37195f71201..99d4e60c4aa5c353dc8a1c3d946d43607a141a42 100644
--- a/typo3/sysext/core/Tests/Acceptance/Application/Template/TemplateCest.php
+++ b/typo3/sysext/core/Tests/Acceptance/Application/Template/TemplateCest.php
@@ -46,6 +46,7 @@ class TemplateCest
 
         $I->switchToContentFrame();
         $I->waitForElementVisible('#ts-overview');
+        $I->wait(2);
         $I->see('This is an overview of the pages in the database containing one or more template records. Click a page title to go to the page.');
 
         $I->wantTo('show templates overview on website root page (uid = 1 and pid = 0)');
@@ -54,6 +55,7 @@ class TemplateCest
         $I->clickWithLeftButton('//*[text()=\'styleguide TCA demo\']');
         $I->switchToContentFrame();
         $I->waitForText('No template');
+        $I->wait(2);
         $I->see('There was no template on this page!');
         $I->see('You need to create a template record below in order to edit your configuration.');
 
@@ -74,11 +76,13 @@ class TemplateCest
         $I->clickWithLeftButton('//*[text()=\'styleguide TCA demo\']');
         $I->switchToContentFrame();
         $I->waitForText('Create new website');
+        $I->wait(2);
         $I->click("//input[@name='newWebsite']");
         $I->waitForText('Edit constants for template');
 
         $I->wantTo('change to Info/Modify and see the template overview table');
         $I->selectOption('.t3-js-jumpMenuBox', 'Info/Modify');
+        $I->wait(3);
         $I->waitForElement('.table-striped');
         $I->see('Title');
         $I->see('Description');
@@ -111,6 +115,7 @@ class TemplateCest
         $I->see('Acceptance Test Site');
 
         $I->wantTo('change the template within the TypoScript Object Browser');
+        $I->wait(1);
         $I->selectOption('.t3-js-jumpMenuBox', 'TypoScript Object Browser');
         $I->waitForText('CONSTANTS ROOT');
         $I->selectOption('//select[@name="SET[ts_browser_type]"]', 'Setup');
@@ -142,6 +147,7 @@ class TemplateCest
         $I->clickWithLeftButton('//*[text()=\'menu_sitemap_pages\']');
         $I->switchToContentFrame();
         $I->waitForText('No template');
+        $I->wait(2);
         $I->see('There was no template on this page!');
         $I->see('You need to create a template record below in order to edit your configuration.');
         $I->seeLink('Click here to go.');
@@ -166,6 +172,7 @@ class TemplateCest
         $I->clickWithLeftButton('(//*[contains(concat(" ", normalize-space(@class), " "), " toggle ")])[4]');
         $I->clickWithLeftButton('//*[text()=\'menu_sitemap_pages\']');
         $I->switchToContentFrame();
+        $I->wait(2);
         $I->waitForText('No template');
         $I->see('There was no template on this page!');
         $I->see('You need to create a template record below in order to edit your configuration.');
@@ -199,9 +206,9 @@ class TemplateCest
         $I->switchToMainFrame();
         $I->clickWithLeftButton('//*[text()=\'styleguide TCA demo\']');
         $I->switchToContentFrame();
+        $I->wait(2);
         $I->selectOption('.t3-js-jumpMenuBox', 'TypoScript Object Browser');
         $I->waitForText('CONSTANTS ROOT');
-
         $I->amGoingTo('type "styles" into the search field and submit.');
         $I->fillField('#search_field', 'styles');
         $I->click("//input[@name='search']");
@@ -220,6 +227,7 @@ class TemplateCest
         $I->switchToContentFrame();
 
         $I->amGoingTo('Switch to object browser.');
+        $I->wait(2);
         $I->selectOption('.t3-js-jumpMenuBox', 'TypoScript Object Browser');
         $I->waitForText('CONSTANTS ROOT');
         $I->selectOption('select[name="SET[ts_browser_type]"]', 'Setup');
diff --git a/typo3/sysext/core/Tests/Acceptance/Application/Workspace/WorkspaceModuleCest.php b/typo3/sysext/core/Tests/Acceptance/Application/Workspace/WorkspaceModuleCest.php
index 4a75681b5266d8bfc0fbe5a0287ffb8f42afe546..b30671e8e4ec04469e492684459bc522c147c649 100644
--- a/typo3/sysext/core/Tests/Acceptance/Application/Workspace/WorkspaceModuleCest.php
+++ b/typo3/sysext/core/Tests/Acceptance/Application/Workspace/WorkspaceModuleCest.php
@@ -58,6 +58,7 @@ class WorkspaceModuleCest
         $I->comment('Rename page');
         $I->switchToContentFrame();
         $I->waitForElement('button[data-action="edit"]');
+        $I->wait(1);
         $I->click('button[data-action="edit"]');
         $I->wait(1);
         $I->fillField('input[class*="t3js-title-edit-input"]', $newPageTitle);
diff --git a/typo3/sysext/core/Tests/Acceptance/Support/Helper/Mouse.php b/typo3/sysext/core/Tests/Acceptance/Support/Helper/Mouse.php
index c437d270d0de9faa00b7bcf8d2efd033667a83be..716841582f4b3f3457ed3d4f2a4f2a1de61fa37e 100644
--- a/typo3/sysext/core/Tests/Acceptance/Support/Helper/Mouse.php
+++ b/typo3/sysext/core/Tests/Acceptance/Support/Helper/Mouse.php
@@ -101,6 +101,7 @@ class Mouse
     {
         $I = $this->tester;
         try {
+            $I->wait(0.5);
             return $I->executeInSelenium(static function (RemoteWebDriver $webDriver) use ($selector) {
                 return $webDriver->findElement(WebDriverBy::cssSelector($selector));
             });