diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 3d110a576e..b97487dc91 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -10,13 +10,13 @@ on:
 jobs:
     cs-fix:
         name: Run code style check
-        runs-on: "ubuntu-20.04"
+        runs-on: "ubuntu-22.04"
         strategy:
             matrix:
                 php:
-                    - '8.0'
+                    - '8.3'
         steps:
-            - uses: actions/checkout@v2
+            - uses: actions/checkout@v4
 
             - name: Setup PHP Action
               uses: shivammathur/setup-php@v2
@@ -26,28 +26,26 @@ jobs:
                   extensions: 'pdo_sqlite, gd'
                   tools: cs2pr
 
-            - uses: "ramsey/composer-install@v1"
+            - uses: ramsey/composer-install@v3
               with:
-                  dependency-versions: "highest"
+                  dependency-versions: highest
 
             - name: Run code style check
               run: composer run-script check-cs -- --format=checkstyle | cs2pr
 
     tests:
         name: Unit tests & SQLite integration tests
-        runs-on: "ubuntu-20.04"
+        runs-on: "ubuntu-22.04"
         timeout-minutes: 15
 
         strategy:
             fail-fast: false
             matrix:
                 php:
-                    - '7.4'
-                    - '8.0'
-                    - '8.1'
+                    - '8.3'
 
         steps:
-            - uses: actions/checkout@v2
+            - uses: actions/checkout@v4
 
             - name: Setup PHP Action
               uses: shivammathur/setup-php@v2
@@ -57,9 +55,9 @@ jobs:
                   extensions: pdo_sqlite, gd
                   tools: cs2pr
 
-            - uses: "ramsey/composer-install@v1"
+            - uses: ramsey/composer-install@v3
               with:
-                  dependency-versions: "highest"
+                  dependency-versions: highest
 
             - name: Setup problem matchers for PHPUnit
               run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
@@ -90,19 +88,17 @@ jobs:
                     --health-timeout 5s
                     --health-retries 5
                     --tmpfs /var/lib/postgres
-        runs-on: "ubuntu-20.04"
+        runs-on: "ubuntu-22.04"
         timeout-minutes: 60
 
         strategy:
             fail-fast: false
             matrix:
                 php:
-                    - '7.4'
-                    - '8.0'
-                    - '8.1'
+                    - '8.3'
 
         steps:
-            -   uses: actions/checkout@v2
+            -   uses: actions/checkout@v4
 
             -   name: Setup PHP Action
                 uses: shivammathur/setup-php@v2
@@ -112,9 +108,9 @@ jobs:
                     extensions: pdo_pgsql, gd
                     tools: cs2pr
 
-            -   uses: "ramsey/composer-install@v1"
+            -   uses: ramsey/composer-install@v3
                 with:
-                    dependency-versions: "highest"
+                    dependency-versions: highest
 
             -   name: Setup problem matchers for PHPUnit
                 run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
@@ -145,19 +141,17 @@ jobs:
                     --health-timeout=5s
                     --health-retries=5
                     --tmpfs=/var/lib/mysql
-        runs-on: "ubuntu-20.04"
+        runs-on: "ubuntu-22.04"
         timeout-minutes: 60
 
         strategy:
             fail-fast: false
             matrix:
                 php:
-                    - '7.4'
-                    - '8.0'
-                    - '8.1'
+                    - '8.3'
 
         steps:
-            -   uses: actions/checkout@v2
+            -   uses: actions/checkout@v4
 
             -   name: Setup PHP Action
                 uses: shivammathur/setup-php@v2
@@ -167,9 +161,9 @@ jobs:
                     extensions: pdo_mysql, gd, redis
                     tools: cs2pr
 
-            -   uses: "ramsey/composer-install@v1"
+            -   uses: ramsey/composer-install@v3
                 with:
-                    dependency-versions: "highest"
+                    dependency-versions: highest
 
             -   name: Setup problem matchers for PHPUnit
                 run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
@@ -182,7 +176,7 @@ jobs:
 
     solr-integration:
         name: "Solr integration tests"
-        runs-on: "ubuntu-20.04"
+        runs-on: "ubuntu-22.04"
         timeout-minutes: 30
         permissions:
             packages: read
@@ -207,11 +201,9 @@ jobs:
             fail-fast: false
             matrix:
                 php:
-                    - '7.4'
-                    - '8.0'
-                    - '8.1'
+                    - '8.3'
         steps:   
-            - uses: actions/checkout@v2
+            - uses: actions/checkout@v4
               with:
                   fetch-depth: 0
 
@@ -226,9 +218,9 @@ jobs:
                 VERSION=$(jq -r '.extra | ."branch-alias" | ."dev-main"' < composer.json)
                 composer require --no-update "ibexa/solr:$VERSION"
 
-            - uses: "ramsey/composer-install@v1"
+            - uses: ramsey/composer-install@v3
               with:
-                  dependency-versions: "highest"
+                  dependency-versions: highest
 
             - name: Run integration test suite
               run: composer test-integration-solr
diff --git a/.github/workflows/gha-docker-solr.yaml b/.github/workflows/gha-docker-solr.yaml
index f32cb9525f..2d49d29290 100644
--- a/.github/workflows/gha-docker-solr.yaml
+++ b/.github/workflows/gha-docker-solr.yaml
@@ -15,7 +15,7 @@ env:
 
 jobs:
     build-and-publish:
-        runs-on: "ubuntu-20.04"
+        runs-on: "ubuntu-22.04"
         permissions:
             packages: write
         services:
@@ -50,9 +50,9 @@ jobs:
                 VERSION=$(jq -r '.extra | ."branch-alias" | ."dev-main"' < composer.json)
                 composer require --no-update "ibexa/solr:$VERSION"
 
-            - uses: "ramsey/composer-install@v2"
+            - uses: ramsey/composer-install@v3
               with:
-                  dependency-versions: "highest"
+                  dependency-versions: highest
 
             - name: Run integration test suite
               run: composer test-integration-solr
@@ -71,4 +71,3 @@ jobs:
 
             - name: Push image
               run: docker push "$IMAGE_NAME"
-
diff --git a/composer.json b/composer.json
index b0dc4324d3..9a73ae54e5 100644
--- a/composer.json
+++ b/composer.json
@@ -7,82 +7,82 @@
         "php-64bit": "For support of more than 30 languages, a 64bit php installation on all involved prod/dev machines is required"
     },
     "require": {
-        "php": "^7.4 || ^8.0",
+        "php": " >=8.3",
+        "ext-PDO": "*",
+        "ext-SPL": "*",
         "ext-ctype": "*",
+        "ext-curl": "*",
+        "ext-dom": "*",
         "ext-fileinfo": "*",
         "ext-intl": "*",
         "ext-json": "*",
         "ext-mbstring": "*",
-        "ext-PDO": "*",
-        "ext-SPL": "*",
         "ext-xsl": "*",
-        "ext-curl": "*",
-        "ext-dom": "*",
+        "composer/package-versions-deprecated": "^1.11",
+        "doctrine/dbal": "^2.13.0",
+        "doctrine/doctrine-bundle": "^2.0",
+        "doctrine/orm": "^2.7",
+        "friendsofphp/proxy-manager-lts": "^1.0",
+        "friendsofsymfony/http-cache-bundle": "^2.8",
+        "friendsofsymfony/jsrouting-bundle": "^2.5",
+        "guzzlehttp/guzzle": "^6.5",
+        "ibexa/doctrine-schema": "~5.0.x-dev",
+        "jms/translation-bundle": "^1.5",
+        "league/flysystem-memory": "^2.0.6",
+        "liip/imagine-bundle": "^2.3",
+        "nelmio/cors-bundle": "^2.0",
+        "oneup/flysystem-bundle": "^4.4.2",
+        "pagerfanta/pagerfanta": "^2.1",
+        "php-http/guzzle6-adapter": "^2.0",
+        "psr/event-dispatcher": "^1.0",
+        "sensio/framework-extra-bundle": "^6.1",
+        "symfony-cmf/routing": "^2.3",
         "symfony/cache": "^5.3.0",
-        "symfony/http-foundation": "^5.3.0",
-        "symfony/framework-bundle": "^5.3.0",
-        "symfony/process": "^5.3.0",
+        "symfony/console": "^5.3.0",
         "symfony/dependency-injection": "^5.3.0",
         "symfony/event-dispatcher": "^5.3.0",
+        "symfony/expression-language": "^5.3.0",
+        "symfony/framework-bundle": "^5.3.0",
+        "symfony/http-client": "^5.3.0",
+        "symfony/http-foundation": "^5.3.0",
+        "symfony/http-kernel": "^5.3.0",
         "symfony/mime": "^5.3.0",
-        "symfony/translation": "^5.3.0",
-        "symfony/yaml": "^5.3.0",
         "symfony/polyfill-php80": "^1.27",
+        "symfony/process": "^5.3.0",
+        "symfony/security-bundle": "^5.3.0",
         "symfony/security-core": "^5.3.0",
         "symfony/security-http": "^5.3.0",
-        "symfony/security-bundle": "^5.3.0",
         "symfony/serializer": "^5.3.0",
-        "symfony/http-client": "^5.3.0",
-        "symfony/http-kernel": "^5.3.0",
-        "symfony/console": "^5.3.0",
-        "symfony/expression-language": "^5.3.0",
+        "symfony/templating": "^5.3.0",
+        "symfony/translation": "^5.3.0",
         "symfony/validator": "^5.3.0",
         "symfony/var-dumper": "^5.3.0",
-        "ibexa/doctrine-schema": "~5.0.0@dev",
-        "symfony-cmf/routing": "^2.3",
-        "guzzlehttp/guzzle": "^6.5",
-        "php-http/guzzle6-adapter": "^2.0",
-        "nelmio/cors-bundle": "^2.0",
-        "pagerfanta/pagerfanta": "^2.1",
-        "doctrine/dbal": "^2.13.0",
-        "doctrine/orm": "^2.7",
-        "doctrine/doctrine-bundle": "^2.0",
-        "liip/imagine-bundle": "^2.3",
-        "oneup/flysystem-bundle": "^4.4.2",
-        "league/flysystem-memory": "^2.0.6",
-        "friendsofsymfony/http-cache-bundle": "^2.8",
-        "sensio/framework-extra-bundle": "^6.1",
-        "jms/translation-bundle": "^1.5",
-        "twig/twig": "^3.0",
+        "symfony/yaml": "^5.3.0",
         "twig/extra-bundle": "^3.0",
-        "friendsofsymfony/jsrouting-bundle": "^2.5",
-        "friendsofphp/proxy-manager-lts": "^1.0",
-        "psr/event-dispatcher": "^1.0",
-        "symfony/templating": "^5.3.0",
-        "composer/package-versions-deprecated": "^1.11"
+        "twig/twig": "^3.0"
     },
     "require-dev": {
         "behat/behat": "^3.6.1",
-        "jenner/simple_fork": "^1.2",
         "friends-of-behat/mink-extension": "^2.4",
         "ibexa/ci-scripts": "^0.2@dev",
         "ibexa/code-style": "^1.0",
-        "phpunit/phpunit": "^8.2",
+        "jenner/simple_fork": "^1.2",
         "matthiasnoback/symfony-dependency-injection-test": "^4.1",
-        "symfony/phpunit-bridge": "^5.1",
-        "symfony/proxy-manager-bridge": "^5.3",
-        "symfony/runtime": "^5.3.0",
         "phpstan/phpstan": "^1.2",
+        "phpstan/phpstan-phpunit": "^1.3",
         "phpstan/phpstan-symfony": "^1.3",
-        "phpstan/phpstan-phpunit": "^1.3"
+        "phpunit/phpunit": "^8.2",
+        "symfony/phpunit-bridge": "^5.1",
+        "symfony/proxy-manager-bridge": "^5.3",
+        "symfony/runtime": "^5.3.0"
     },
     "conflict": {
-        "friendsofphp/php-cs-fixer": "3.5.0",
-        "symfony/dependency-injection": "5.3.7",
-        "symfony/security-core": "5.3.0",
         "doctrine/dbal": "2.7.0",
         "ezsystems/ezpublish-legacy": "*",
-        "phpunit/phpunit": "8.4.0"
+        "friendsofphp/php-cs-fixer": "3.5.0",
+        "phpunit/phpunit": "8.4.0",
+        "symfony/dependency-injection": "5.3.7",
+        "symfony/security-core": "5.3.0"
     },
     "replace": {
         "ezsystems/ezplatform-kernel": "*"
@@ -131,6 +131,7 @@
     },
     "config": {
         "process-timeout": 3000,
+        "sort-packages": true,
         "allow-plugins": {
             "composer/package-versions-deprecated": true,
             "*": false