diff --git a/.Build/gitlab-ci/README.md b/.Build/gitlab-ci/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..05bc181bc943aa488a516e3b6e0da3bcead51013
--- /dev/null
+++ b/.Build/gitlab-ci/README.md
@@ -0,0 +1,67 @@
+
+# use as git subtree (preferred)
+
+## add gitlab-ci to your extension
+```
+git subtree add --prefix .Build/gitlab-ci https://git.slub-dresden.de/typo3/gitlab-ci.git main --squash
+```
+
+## add a .gitlab-ci.yml to your extension root, with this content
+```
+include:
+  - local: '.Build/gitlab-ci/extension-gitlab-ci.yml'
+```
+
+## pull from remote
+```
+git subtree pull --prefix .Build/gitlab-ci https://git.slub-dresden.de/typo3/gitlab-ci.git main --squash
+```
+## push from remote
+```
+git subtree push --prefix .Build/gitlab-ci https://git.slub-dresden.de/typo3/gitlab-ci.git main
+```
+# use from remote repository
+
+## add a .gitlab-ci.yml to your extension root, with this content
+```
+include:
+  - remote: 'https://git.slub-dresden.de/typo3/gitlab-ci/-/raw/main/extension-gitlab-ci.yml'
+```
+
+## create a .gitignore in your extension root, with this content
+```
+composer.lock
+/vendor
+/public
+.php_cs.cache
+.php-cs-fixer.cache
+```
+# use rector local
+```
+composer require --dev ssch/typo3-rector
+```
+## run rector
+```
+./vendor/bin/rector process . --config .Build/gitlab-ci/typo3-rector/Extension.php
+```
+
+# use php-cs-fixer local
+```
+composer require --dev friendsofphp/php-cs-fixer
+```
+
+## run php-cs-fixer
+```
+./vendor/bin/php-cs-fixer fix --config .Build/gitlab-ci/php-cs-fixer/Extension.php
+```
+
+# use typo3-typoscript-lint local
+```
+composer require --dev helmich/typo3-typoscript-lint
+```
+
+## run typo3-typoscript-lint
+```
+vendor/bin/typoscript-lint -c .Build/gitlab-ci/typoscript-lint/Extension.yml --fail-on-warnings
+```
+
diff --git a/.Build/gitlab-ci/extension-gitlab-ci.yml b/.Build/gitlab-ci/extension-gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9f6d3d388962ae304c1f0f59fc380e9eb4ea6d3e
--- /dev/null
+++ b/.Build/gitlab-ci/extension-gitlab-ci.yml
@@ -0,0 +1,33 @@
+
+stages:
+    - test
+"PHP CS Fixer":
+    stage: test
+    image: ekreative/php-cs-fixer:3
+    script:
+        - php-cs-fixer fix --dry-run --config=.Build/gitlab-ci/php-cs-fixer/Extension.php --diff --format=junit > php-report.xml
+    tags:
+        - docker
+    artifacts:
+        expire_in: 2 hours
+        reports:
+            junit:
+                - php-report.xml
+"PHP Rector":
+    stage: test
+    image: composer:2
+    tags:
+        - docker
+    before_script:
+        - composer global req ssch/typo3-rector
+    script:
+        - /tmp/vendor/bin/rector process . --config .Build/gitlab-ci/typo3-rector/Extension.php --dry-run
+"TypoScript Linter":
+    stage: test
+    image: composer:2
+    tags:
+        - docker
+    before_script:
+        - composer global req helmich/typo3-typoscript-lint
+    script:
+        - /tmp/vendor/bin/typoscript-lint -c .Build/gitlab-ci/typoscript-lint/Extension.yml --fail-on-warnings
diff --git a/.Build/gitlab-ci/php-cs-fixer/Extension.php b/.Build/gitlab-ci/php-cs-fixer/Extension.php
new file mode 100644
index 0000000000000000000000000000000000000000..92d273e46f403176cf6a5d11697dfd01a0d314dd
--- /dev/null
+++ b/.Build/gitlab-ci/php-cs-fixer/Extension.php
@@ -0,0 +1,101 @@
+<?php
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+/**
+ * This file represents the configuration for Code Sniffing PSR-2-related
+ * automatic checks of coding guidelines
+ * Install @fabpot's great php-cs-fixer tool via
+ *
+ *  $ composer global require friendsofphp/php-cs-fixer
+ *
+ * And then simply run
+ *
+ *  $ ./bin/php-cs-fixer fix --config ./Build/gitlab-ci/php-cs-fixer/Extension.php
+ *
+ * inside the TYPO3 directory. Warning: This may take up to 10 minutes.
+ *
+ * For more information read:
+ *     https://www.php-fig.org/psr/psr-2/
+ *     https://cs.sensiolabs.org
+ */
+if (PHP_SAPI !== 'cli') {
+    die('This script supports command line usage only. Please check your command.');
+}
+// Define in which folders to search and which folders to exclude
+// Exclude all files and directories from .gitignore
+$finder = (new PhpCsFixer\Finder())
+    ->ignoreVCSIgnored(true)
+    ->in(realpath(__DIR__ . '/../../../'));
+// Return a Code Sniffing configuration using
+// all sniffers needed for PSR-2
+// and additionally:
+//  - Remove leading slashes in use clauses.
+//  - PHP single-line arrays should not have trailing comma.
+//  - Single-line whitespace before closing semicolon are prohibited.
+//  - Remove unused use statements in the PHP source code
+//  - Ensure Concatenation to have at least one whitespace around
+//  - Remove trailing whitespace at the end of blank lines.
+return (new \PhpCsFixer\Config())
+    ->setRiskyAllowed(true)
+    ->setRules([
+        '@DoctrineAnnotation' => true,
+        '@PSR2' => true,
+        'array_syntax' => ['syntax' => 'short'],
+        'blank_line_after_opening_tag' => false,
+        'braces' => ['allow_single_line_closure' => true],
+        'cast_spaces' => ['space' => 'none'],
+        'compact_nullable_typehint' => true,
+        'concat_space' => ['spacing' => 'one'],
+        'declare_equal_normalize' => ['space' => 'none'],
+        'dir_constant' => true,
+        'function_typehint_space' => true,
+        'lowercase_cast' => true,
+        'method_argument_space' => ['on_multiline' => 'ensure_fully_multiline'],
+        'modernize_types_casting' => true,
+        'native_function_casing' => true,
+        'new_with_braces' => true,
+        'no_alias_functions' => true,
+        'no_blank_lines_after_phpdoc' => true,
+        'no_empty_phpdoc' => true,
+        'no_empty_statement' => true,
+        'no_extra_blank_lines' => true,
+        'no_leading_import_slash' => true,
+        'no_leading_namespace_whitespace' => true,
+        'no_null_property_initialization' => true,
+        'no_short_bool_cast' => true,
+        'no_singleline_whitespace_before_semicolons' => true,
+        'no_superfluous_elseif' => true,
+        'no_trailing_comma_in_singleline_array' => true,
+        'no_unneeded_control_parentheses' => true,
+        'no_unused_imports' => true,
+        'no_useless_else' => true,
+        'no_whitespace_in_blank_line' => true,
+        'ordered_imports' => true,
+        'php_unit_construct' => ['assertions' => ['assertEquals', 'assertSame', 'assertNotEquals', 'assertNotSame']],
+        'php_unit_mock_short_will_return' => true,
+        'php_unit_test_case_static_method_calls' => ['call_type' => 'self'],
+        'phpdoc_no_access' => true,
+        'phpdoc_no_empty_return' => true,
+        'phpdoc_no_package' => true,
+        'phpdoc_scalar' => true,
+        'phpdoc_trim' => true,
+        'phpdoc_types' => true,
+        'phpdoc_types_order' => ['null_adjustment' => 'always_last', 'sort_algorithm' => 'none'],
+        'return_type_declaration' => ['space_before' => 'none'],
+        'single_quote' => true,
+        'single_line_comment_style' => ['comment_types' => ['hash']],
+        'single_trait_insert_per_statement' => true,
+        'trailing_comma_in_multiline' => ['elements' => ['arrays']],
+        'whitespace_after_comma_in_array' => true,
+    ])
+    ->setFinder($finder);
diff --git a/.Build/gitlab-ci/php-cs-fixer/Project.php b/.Build/gitlab-ci/php-cs-fixer/Project.php
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/.Build/gitlab-ci/project-gitlab-ci.yml b/.Build/gitlab-ci/project-gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/.Build/gitlab-ci/typo3-rector/Extension.php b/.Build/gitlab-ci/typo3-rector/Extension.php
new file mode 100644
index 0000000000000000000000000000000000000000..63f4c00e79a5e95957c24811cae3dbc4f6ad41f8
--- /dev/null
+++ b/.Build/gitlab-ci/typo3-rector/Extension.php
@@ -0,0 +1,96 @@
+<?php
+
+declare(strict_types=1);
+
+use Rector\Config\RectorConfig;
+use Rector\Core\Configuration\Option;
+use Rector\Core\ValueObject\PhpVersion;
+use Rector\PostRector\Rector\NameImportingPostRector;
+use Ssch\TYPO3Rector\Configuration\Typo3Option;
+use Ssch\TYPO3Rector\Rector\General\ConvertImplicitVariablesToExplicitGlobalsRector;
+use Ssch\TYPO3Rector\Rector\General\ExtEmConfRector;
+use Ssch\TYPO3Rector\Set\Typo3LevelSetList;
+
+return static function (RectorConfig $rectorConfig): void {
+
+    // If you want to override the number of spaces for your typoscript files you can define it here, the default value is 4
+    // $parameters = $rectorConfig->parameters();
+    // $parameters->set(Typo3Option::TYPOSCRIPT_INDENT_SIZE, 2);
+
+    $rectorConfig->sets([
+        Typo3LevelSetList::UP_TO_TYPO3_9,
+        Typo3LevelSetList::UP_TO_TYPO3_10,
+        Typo3LevelSetList::UP_TO_TYPO3_11,
+    ]);
+
+    // Define your target version which you want to support
+    $rectorConfig->phpVersion(PhpVersion::PHP_74);
+
+    // If you only want to process one/some TYPO3 extension(s), you can specify its path(s) here.
+    // If you use the option --config change __DIR__ to getcwd()
+    // $rectorConfig->paths([
+    //    __DIR__ . '/packages/acme_demo/',
+    // ]);
+
+    // When you use rector there are rules that require some more actions like creating UpgradeWizards for outdated TCA types.
+    // To fully support you we added some warnings. So watch out for them.
+
+    // If you use importNames(), you should consider excluding some TYPO3 files.
+    $rectorConfig->skip([
+        // @see https://github.com/sabbelasichon/typo3-rector/issues/2536
+        getcwd() . '/**/Configuration/ExtensionBuilder/*',
+        // We skip those directories on purpose as there might be node_modules or similar
+        // that include typescript which would result in false positive processing
+        getcwd() . '/**/Resources/**/node_modules/*',
+        getcwd() . '/**/Resources/**/NodeModules/*',
+        getcwd() . '/**/Resources/**/BowerComponents/*',
+        getcwd() . '/**/Resources/**/bower_components/*',
+        getcwd() . '/**/Resources/**/build/*',
+        getcwd() . '/vendor/*',
+        getcwd() . '/Build/*',
+        getcwd() . '/public/*',
+        getcwd() . '/.github/*',
+        getcwd() . '/.Build/*',
+        NameImportingPostRector::class => [
+            'ext_localconf.php',
+            'ext_tables.php',
+            'ClassAliasMap.php',
+            getcwd() . '/**/Configuration/*.php',
+            getcwd() . '/**/Configuration/**/*.php',
+        ]
+    ]);
+
+    // If you have trouble that rector cannot run because some TYPO3 constants are not defined add an additional constants file
+    // @see https://github.com/sabbelasichon/typo3-rector/blob/master/typo3.constants.php
+    // @see https://github.com/rectorphp/rector/blob/main/docs/static_reflection_and_autoload.md#include-files
+    // $parameters->set(Option::BOOTSTRAP_FILES, [
+    //    __DIR__ . '/typo3.constants.php'
+    // ]);
+
+    // register a single rule
+    // $rectorConfig->rule(\Ssch\TYPO3Rector\Rector\v9\v0\InjectAnnotationRector::class);
+
+    /**
+     * Useful rule from RectorPHP itself to transform i.e. GeneralUtility::makeInstance('TYPO3\CMS\Core\Log\LogManager')
+     * to GeneralUtility::makeInstance(\TYPO3\CMS\Core\Log\LogManager::class) calls.
+     * But be warned, sometimes it produces false positives (edge cases), so watch out
+     */
+    // $rectorConfig->rule(\Rector\Php55\Rector\String_\StringClassNameToClassConstantRector::class);
+
+    // Optional non-php file functionalities:
+    // @see https://github.com/sabbelasichon/typo3-rector/blob/main/docs/beyond_php_file_processors.md
+
+    // Rewrite your extbase persistence class mapping from typoscript into php according to official docs.
+    // This processor will create a summarized file with all the typoscript rewrites combined into a single file.
+    /* $rectorConfig->ruleWithConfiguration(\Ssch\TYPO3Rector\FileProcessor\TypoScript\Rector\v10\v0\ExtbasePersistenceTypoScriptRector::class, [
+        \Ssch\TYPO3Rector\FileProcessor\TypoScript\Rector\v10\v0\ExtbasePersistenceTypoScriptRector::FILENAME => __DIR__ . '/packages/acme_demo/Configuration/Extbase/Persistence/Classes.php',
+    ]); */
+    // Add some general TYPO3 rules
+    $rectorConfig->rule(ConvertImplicitVariablesToExplicitGlobalsRector::class);
+    $rectorConfig->ruleWithConfiguration(ExtEmConfRector::class, [
+        ExtEmConfRector::ADDITIONAL_VALUES_TO_BE_REMOVED => []
+    ]);
+
+    // Modernize your TypoScript include statements for files and move from <INCLUDE /> to @import use the FileIncludeToImportStatementVisitor (introduced with TYPO3 9.0)
+    // $rectorConfig->rule(\Ssch\TYPO3Rector\FileProcessor\TypoScript\Rector\v9\v0\FileIncludeToImportStatementTypoScriptRector::class);
+};
diff --git a/.Build/gitlab-ci/typo3-rector/Project.php b/.Build/gitlab-ci/typo3-rector/Project.php
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/.Build/gitlab-ci/typoscript-lint/Extension.yml b/.Build/gitlab-ci/typoscript-lint/Extension.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6f9c51b089362afa90c8538be0c6aa86c9e1b348
--- /dev/null
+++ b/.Build/gitlab-ci/typoscript-lint/Extension.yml
@@ -0,0 +1,22 @@
+paths:
+    - Configuration/
+filePatterns:
+    - "*.tsconfig"
+    - "*.typoscript"
+    - "ext_typoscript_*.txt"
+    - "setup.txt"
+    - "constants.txt"
+sniffs:
+    -   class: Indentation
+        parameters:
+            useSpaces: true
+            indentPerLevel: 2
+            indentConditions: false
+    -   class: DeadCode
+    -   class: OperatorWhitespace
+    -   class: RepeatingRValue
+        disabled: true
+    -   class: EmptySection
+    -   class: NestingConsistency
+        parameters:
+            commonPathPrefixThreshold: 1
diff --git a/.Build/gitlab-ci/typoscript-lint/Project.yml b/.Build/gitlab-ci/typoscript-lint/Project.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391