diff --git a/Build/Scripts/runTests.sh b/Build/Scripts/runTests.sh
index 084b3bbf438790f08f5b2b687171e3c99f875b25..92b6825809b017d647941401f7f4ed0591d8e8e3 100755
--- a/Build/Scripts/runTests.sh
+++ b/Build/Scripts/runTests.sh
@@ -65,6 +65,7 @@ Options:
         Specifies which test suite to run
             - acceptance: backend acceptance tests
             - acceptancePagetree: backend acceptance tests for page tree
+            - acceptanceInstallTool: acceptance tests for stand alone install tool
             - buildCss: execute scss to css builder
             - buildJavascript: execute typescript to javascript builder
             - cglGit: test and fix latest committed patch for CGL compliance
@@ -289,6 +290,13 @@ case ${TEST_SUITE} in
         SUITE_EXIT_CODE=$?
         docker-compose down
         ;;
+    acceptanceInstallTool)
+        setUpDockerComposeDotEnv
+        docker-compose run prepare_acceptance_installtool_mariadb10
+        docker-compose run acceptance_installtool_mariadb10
+        SUITE_EXIT_CODE=$?
+        docker-compose down
+        ;;
     buildCss)
         setUpDockerComposeDotEnv
         docker-compose run build_css
diff --git a/Build/bamboo/src/main/java/core/AbstractCoreSpec.java b/Build/bamboo/src/main/java/core/AbstractCoreSpec.java
index 94517073abebe9d6b1846daf2b94249f0bf11b08..34648e3d06c3d18499a6325718d033353a7e6b63 100644
--- a/Build/bamboo/src/main/java/core/AbstractCoreSpec.java
+++ b/Build/bamboo/src/main/java/core/AbstractCoreSpec.java
@@ -338,7 +338,7 @@ abstract class AbstractCoreSpec {
                 this.getTaskStopDanglingContainers(),
                 composerTask,
                 this.getTaskPrepareAcceptanceTest(),
-                this.getTaskDockerDependenciesAcceptanceInstallPostgres10(),
+                this.getTaskDockerDependenciesAcceptancePostgres10(),
                 new ScriptTask()
                     .description("Install TYPO3 on postgresql 10")
                     .interpreter(ScriptTaskProperties.Interpreter.BINSH_OR_CMDEXE)
@@ -574,6 +574,63 @@ abstract class AbstractCoreSpec {
         return jobs;
     }
 
+    ArrayList<Job> getJobsAcceptanceTestsInstallToolMysql(int stageNumber, String requirementIdentifier, Task composerTask, Boolean isSecurity) {
+        String name = getTaskNamePartForComposer(stageNumber);
+        ArrayList<Job> jobs = new ArrayList<Job>();
+
+        jobs.add(new Job("Accept InstallTool my " + name + " " + requirementIdentifier, new BambooKey("ACITMY" + stageNumber + requirementIdentifier))
+            .description("Run acceptance tests for install tool " + requirementIdentifier)
+            .pluginConfigurations(this.getDefaultJobPluginConfiguration())
+            .tasks(
+                this.getTaskGitCloneRepository(),
+                this.getTaskGitCherryPick(isSecurity),
+                this.getTaskStopDanglingContainers(),
+                composerTask,
+                this.getTaskPrepareAcceptanceTest(),
+                this.getTaskDockerDependenciesAcceptanceBackendMariadb10(),
+                new ScriptTask()
+                    .description("Execute codeception acceptance test for standalone install tool.")
+                    .interpreter(ScriptTaskProperties.Interpreter.BINSH_OR_CMDEXE)
+                    .inlineBody(
+                        this.getScriptTaskBashInlineBody() +
+                            "function codecept() {\n" +
+                            "    docker run \\\n" +
+                            "        -u ${HOST_UID} \\\n" +
+                            "        -v /bamboo-data/${BAMBOO_COMPOSE_PROJECT_NAME}/passwd:/etc/passwd \\\n" +
+                            "        -v ${BAMBOO_COMPOSE_PROJECT_NAME}_bamboo-data:/srv/bamboo/xml-data/build-dir/ \\\n" +
+                            "        -e typo3DatabaseName=func_test \\\n" +
+                            "        -e typo3DatabaseUsername=root \\\n" +
+                            "        -e typo3DatabasePassword=funcp  \\\n" +
+                            "        -e typo3DatabaseHost=mariadb10  \\\n" +
+                            "        --name ${BAMBOO_COMPOSE_PROJECT_NAME}sib_adhoc \\\n" +
+                            "        --network ${BAMBOO_COMPOSE_PROJECT_NAME}_test \\\n" +
+                            "        --rm \\\n" +
+                            "        typo3gmbh/" + requirementIdentifier.toLowerCase() + ":latest \\\n" +
+                            "        bin/bash -c \"cd ${PWD}; ./bin/codecept $*\"\n" +
+                            "}\n" +
+                            "\n" +
+                            "codecept run InstallTool -d -c typo3/sysext/core/Tests/codeception.yml --env=mysql --xml reports.xml --html reports.html\n"
+                    )
+            )
+            .finalTasks(
+                this.getTaskStopDockerDependencies(),
+                new TestParserTask(TestParserTaskProperties.TestType.JUNIT)
+                    .resultDirectories("typo3temp/var/tests/AcceptanceReports/reports.xml")
+            )
+            .artifacts(new Artifact()
+                .name("Test Report")
+                .copyPattern("typo3temp/var/tests/AcceptanceReports/")
+                .shared(false)
+            )
+            .requirements(
+                this.getRequirementDocker10()
+            )
+            .cleanWorkingDirectory(true)
+        );
+
+        return jobs;
+    }
+
     /**
      * Jobs for mysql based functional tests with driver mysqli
      */
@@ -1744,7 +1801,7 @@ abstract class AbstractCoreSpec {
     /**
      * Start docker sibling containers to execute acceptance install tests on postgres
      */
-    private Task getTaskDockerDependenciesAcceptanceInstallPostgres10() {
+    private Task getTaskDockerDependenciesAcceptancePostgres10() {
         return new ScriptTask()
             .description("Start docker siblings for acceptance test install postgres")
             .interpreter(ScriptTaskProperties.Interpreter.BINSH_OR_CMDEXE)
diff --git a/Build/bamboo/src/main/java/core/AbstractPreMergeSpec.java b/Build/bamboo/src/main/java/core/AbstractPreMergeSpec.java
index ca91daec2b767b4894049d8ab98b5bbde828f0d4..4fdc17cdfd668bac529a3e032b4c852072fb108a 100644
--- a/Build/bamboo/src/main/java/core/AbstractPreMergeSpec.java
+++ b/Build/bamboo/src/main/java/core/AbstractPreMergeSpec.java
@@ -55,6 +55,7 @@ abstract class AbstractPreMergeSpec extends AbstractCoreSpec {
 
         jobsMainStage.addAll(this.getJobsAcceptanceTestsBackendMysql(0, numberOfAcceptanceTestJobs, phpVersions[1], this.getTaskComposerInstall(phpVersions[1]), isSecurity));
         jobsMainStage.addAll(this.getJobsAcceptanceTestsPageTreeMysql(0, phpVersions[1], this.getTaskComposerInstall(phpVersions[1]), isSecurity));
+        jobsMainStage.addAll(this.getJobsAcceptanceTestsInstallToolMysql(0, phpVersions[1], this.getTaskComposerInstall(phpVersions[1]), isSecurity));
 
         jobsMainStage.add(this.getJobIntegrationPhpStan(phpVersions[0], this.getTaskComposerInstall(phpVersions[0]), isSecurity));
         jobsMainStage.add(this.getJobIntegrationDocBlocks(phpVersions[0], this.getTaskComposerInstall(phpVersions[0]), isSecurity));
diff --git a/Build/bamboo/src/main/java/core/NightlySpec.java b/Build/bamboo/src/main/java/core/NightlySpec.java
index 79494ea44cb612c746d56b13d7b3069542631c6c..72bb2e8ee62f6817a62ce897db3a77061b548f32 100644
--- a/Build/bamboo/src/main/java/core/NightlySpec.java
+++ b/Build/bamboo/src/main/java/core/NightlySpec.java
@@ -327,14 +327,17 @@ public class NightlySpec extends AbstractCoreSpec {
         String phpVersion = "PHP72";
         Task composerTask = getComposerTaskByStageNumber(phpVersion, COMPOSER_MIN);
         jobs.add(this.getJobAcceptanceTestInstallPgsql(COMPOSER_MIN, phpVersion, composerTask, false));
+        jobs.addAll(this.getJobsAcceptanceTestsInstallToolMysql(COMPOSER_MIN, phpVersion, composerTask, false));
 
         phpVersion = "PHP73";
         composerTask = getComposerTaskByStageNumber(phpVersion, COMPOSER_DEFAULT);
         jobs.add(this.getJobAcceptanceTestInstallPgsql(COMPOSER_DEFAULT, phpVersion, composerTask, false));
+        jobs.addAll(this.getJobsAcceptanceTestsInstallToolMysql(COMPOSER_DEFAULT, phpVersion, composerTask, false));
 
         phpVersion = "PHP74";
         composerTask = getComposerTaskByStageNumber(phpVersion, COMPOSER_MAX);
         jobs.add(this.getJobAcceptanceTestInstallPgsql(COMPOSER_MAX, phpVersion, composerTask, false));
+        jobs.addAll(this.getJobsAcceptanceTestsInstallToolMysql(COMPOSER_MAX, phpVersion, composerTask, false));
 
         stages.add(new Stage("Acceptance pgsql").jobs(jobs.toArray(new Job[0])));
         return stages;
diff --git a/Build/testing-docker/local/docker-compose.yml b/Build/testing-docker/local/docker-compose.yml
index 27dfc995d083f61cbc061aad628c5f550f9c1bd2..44124bbc9406ec10eb63cd2a41a553d37b7d52ac 100644
--- a/Build/testing-docker/local/docker-compose.yml
+++ b/Build/testing-docker/local/docker-compose.yml
@@ -129,6 +129,46 @@ services:
           && ./bin/codecept run PageTree -d -c typo3/sysext/core/Tests/codeception.yml ${TEST_FILE} --html reports.html
       "
 
+  prepare_acceptance_installtool_mariadb10:
+    image: alpine:3.8
+    links:
+      - mariadb10
+      - chrome
+      - web
+    command: >
+      /bin/sh -c "
+        if [ ${SCRIPT_VERBOSE} -eq 1 ]; then
+          set -x
+        fi
+        echo Waiting for database start...;
+        while ! nc -z mariadb10 3306; do
+          sleep 1;
+        done;
+        echo Database is up;
+      "
+  acceptance_installtool_mariadb10:
+    image: typo3gmbh/${DOCKER_PHP_IMAGE}:latest
+    user: ${HOST_UID}
+    environment:
+      typo3DatabaseName: func_test
+      typo3DatabaseUsername: root
+      typo3DatabasePassword: funcp
+      typo3DatabaseHost: mariadb10
+    volumes:
+      - ${CORE_ROOT}:${CORE_ROOT}
+      - ${HOST_HOME}:${HOST_HOME}
+      - /etc/passwd:/etc/passwd:ro
+      - /etc/group:/etc/group:ro
+    working_dir: ${CORE_ROOT}
+    command: >
+      /bin/sh -c "
+        if [ ${SCRIPT_VERBOSE} -eq 1 ]; then
+          set -x
+        fi
+        mkdir -p typo3temp/var/tests/ \
+          && ./bin/codecept run InstallTool -d -c typo3/sysext/core/Tests/codeception.yml ${TEST_FILE} --html reports.html
+      "
+
   prepare_acceptance_install_mariadb10:
     image: alpine:3.8
     links:
diff --git a/typo3/sysext/core/Tests/Acceptance/InstallTool.suite.yml b/typo3/sysext/core/Tests/Acceptance/InstallTool.suite.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a6cd4ec54bad4ff9a6cfd937f6dce2b2e3e4a452
--- /dev/null
+++ b/typo3/sysext/core/Tests/Acceptance/InstallTool.suite.yml
@@ -0,0 +1,14 @@
+class_name: BackendTester
+modules:
+  enabled:
+    - WebDriver:
+        url: http://web:8000/typo3temp/var/tests/acceptance
+        browser: chrome
+        wait: 1
+        host: chrome
+    - \TYPO3\TestingFramework\Core\Acceptance\Helper\Acceptance
+    - Asserts
+
+extensions:
+  enabled:
+    - TYPO3\CMS\Core\Tests\Acceptance\Support\Extension\BackendCoreEnvironment
diff --git a/typo3/sysext/core/Tests/Acceptance/InstallTool/LoginCest.php b/typo3/sysext/core/Tests/Acceptance/InstallTool/LoginCest.php
index 5b67fac68f3f00f81c8c5bf3ef46804fdb7ba7a3..825595c8860918d4529f0022e781c07e7c7b67fc 100644
--- a/typo3/sysext/core/Tests/Acceptance/InstallTool/LoginCest.php
+++ b/typo3/sysext/core/Tests/Acceptance/InstallTool/LoginCest.php
@@ -21,6 +21,9 @@ use TYPO3\CMS\Core\Tests\Acceptance\Support\BackendTester;
 
 class LoginCest extends AbstractCest
 {
+    /**
+     * @param BackendTester $I
+     */
     public function installToolLogin(BackendTester $I)
     {
         $I->amGoingTo('assert the install tool is locked in the first place');
diff --git a/typo3/sysext/core/Tests/Acceptance/InstallTool/MaintenanceCest.php b/typo3/sysext/core/Tests/Acceptance/InstallTool/MaintenanceCest.php
index 2748f2c53a02cde4762b16ec3fea7970eff3707e..4b24f0c822e5a643f024e5adfdd8b823c27dfbae 100644
--- a/typo3/sysext/core/Tests/Acceptance/InstallTool/MaintenanceCest.php
+++ b/typo3/sysext/core/Tests/Acceptance/InstallTool/MaintenanceCest.php
@@ -28,6 +28,11 @@ class MaintenanceCest extends AbstractCest
         $I->click('Maintenance');
         $I->see('Maintenance', 'h1');
     }
+
+    /**
+     * @param BackendTester $I
+     * @throws \Exception
+     */
     public function flushCacheWorks(BackendTester $I)
     {
         $I->click('Flush cache');
@@ -35,6 +40,10 @@ class MaintenanceCest extends AbstractCest
         $I->see('Caches cleared', '.alert-success h4');
     }
 
+    /**
+     * @param BackendTester $I
+     * @throws \Exception
+     */
     public function analyzeDatabaseStructureWorks(BackendTester $I)
     {
         $I->click('Analyze database');
@@ -46,6 +55,10 @@ class MaintenanceCest extends AbstractCest
         $I->waitForElementNotVisible('.modal-dialog');
     }
 
+    /**
+     * @param BackendTester $I
+     * @throws \Exception
+     */
     public function removeTemporaryAssetsWorks(BackendTester $I)
     {
         $I->click('Scan temporary files');
@@ -55,6 +68,10 @@ class MaintenanceCest extends AbstractCest
         $I->waitForElementNotVisible('.modal-dialog');
     }
 
+    /**
+     * @param BackendTester $I
+     * @throws \Exception
+     */
     public function dumpAutoloadWorks(BackendTester $I)
     {
         $I->click('Dump autoload');
@@ -62,6 +79,10 @@ class MaintenanceCest extends AbstractCest
         $I->see('Successfully dumped class loading information for extensions.', '.alert-success h4');
     }
 
+    /**
+     * @param BackendTester $I
+     * @throws \Exception
+     */
     public function clearPersistentTablesWorks(BackendTester $I)
     {
         $I->click('Scan tables');
@@ -71,6 +92,10 @@ class MaintenanceCest extends AbstractCest
         $I->waitForElementNotVisible('.modal-dialog');
     }
 
+    /**
+     * @param BackendTester $I
+     * @throws \Exception
+     */
     public function createAdminUserWorks(BackendTester $I)
     {
         $I->click('Create Administrator');
@@ -80,6 +105,10 @@ class MaintenanceCest extends AbstractCest
         $I->waitForElementNotVisible('.modal-dialog');
     }
 
+    /**
+     * @param BackendTester $I
+     * @throws \Exception
+     */
     public function resetBackendUserPreferencesWorks(BackendTester $I)
     {
         $I->click('Reset backend user preferences');
@@ -87,6 +116,10 @@ class MaintenanceCest extends AbstractCest
         $I->see('Preferences of all backend users have been reset', '.alert-success h4');
     }
 
+    /**
+     * @param BackendTester $I
+     * @throws \Exception
+     */
     public function manageLanguagePacksWorks(BackendTester $I)
     {
         $I->click('Manage languages');