diff --git a/tests/e2e/Codeception_Custom_Config_Path/composer.json b/tests/e2e/Codeception_Custom_Config_Path/composer.json
new file mode 100644
index 0000000..5155c76
--- /dev/null
+++ b/tests/e2e/Codeception_Custom_Config_Path/composer.json
@@ -0,0 +1,20 @@
+{
+ "require-dev": {
+ "codeception/codeception": "~5.0",
+ "codeception/module-asserts": "^1.3"
+ },
+ "autoload": {
+ "psr-4": {
+ "Codeception_Basic\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Codeception_Basic\\Test\\": "tests/"
+ }
+ },
+ "require": {
+ "infection/infection": "0.27.4",
+ "infection/codeception-adapter": "dev-master"
+ }
+}
diff --git a/tests/e2e/Codeception_Custom_Config_Path/expected-output.txt b/tests/e2e/Codeception_Custom_Config_Path/expected-output.txt
new file mode 100644
index 0000000..068e9f7
--- /dev/null
+++ b/tests/e2e/Codeception_Custom_Config_Path/expected-output.txt
@@ -0,0 +1,9 @@
+Total: 4
+
+Killed: 3
+Errored: 0
+Syntax Errors: 0
+Escaped: 1
+Timed Out: 0
+Skipped: 0
+Not Covered: 0
diff --git a/tests/e2e/Codeception_Custom_Config_Path/infection.json b/tests/e2e/Codeception_Custom_Config_Path/infection.json
new file mode 100644
index 0000000..d4f1473
--- /dev/null
+++ b/tests/e2e/Codeception_Custom_Config_Path/infection.json
@@ -0,0 +1,11 @@
+{
+ "timeout": 25,
+ "source": {
+ "directories": [
+ "src"
+ ]
+ },
+ "tmpDir": ".",
+ "testFramework": "codeception",
+ "testFrameworkOptions": "-c tools/codeception.yml"
+}
diff --git a/tests/e2e/Codeception_Custom_Config_Path/run_tests.bash b/tests/e2e/Codeception_Custom_Config_Path/run_tests.bash
new file mode 100755
index 0000000..1bc8ac4
--- /dev/null
+++ b/tests/e2e/Codeception_Custom_Config_Path/run_tests.bash
@@ -0,0 +1,43 @@
+#!/usr/bin/env bash
+
+set -e
+
+tputx () {
+ test -x $(which tput) && tput "$@"
+}
+
+run () {
+ local INFECTION=${1}
+ local PHPARGS=${2}
+
+ if [ "$DRIVER" = "phpdbg" ]
+ then
+ phpdbg $PHPARGS -qrr $INFECTION
+ else
+ php $PHPARGS $INFECTION
+ fi
+}
+
+cd "$(dirname "$0")"
+
+git_branch=$(echo "${GITHUB_HEAD_REF:-$(git rev-parse --abbrev-ref HEAD)}" | sed 's/\//\\\//g')
+
+echo "git_branch: ${git_branch}"
+
+if [ "$git_branch" == "master" ]; then
+ exit 0;
+fi;
+
+sed -i "s/\"infection\/codeception-adapter\": \"dev-master\"/\"infection\/codeception-adapter\": \"dev-${git_branch}\"/" composer.json
+
+set -e pipefail
+
+rm -f composer.lock
+composer install
+
+run "vendor/bin/infection"
+
+git checkout composer.json
+
+diff -w expected-output.txt infection.log
+
diff --git a/tests/e2e/Codeception_Custom_Config_Path/src/Inner/InnerSourceClass.php b/tests/e2e/Codeception_Custom_Config_Path/src/Inner/InnerSourceClass.php
new file mode 100644
index 0000000..e022c39
--- /dev/null
+++ b/tests/e2e/Codeception_Custom_Config_Path/src/Inner/InnerSourceClass.php
@@ -0,0 +1,15 @@
+getScenario()->runStep(new \Codeception\Step\Action('setHeader', func_get_args()));
+ }
+
+
+ /**
+ * [!] Method is generated. Documentation taken from corresponding module.
+ *
+ * Authenticates user for HTTP_AUTH
+ *
+ * @param $username
+ * @param $password
+ * @see \Codeception\Module\PhpBrowser::amHttpAuthenticated()
+ */
+ public function amHttpAuthenticated($username, $password) {
+ return $this->getScenario()->runStep(new \Codeception\Step\Condition('amHttpAuthenticated', func_get_args()));
+ }
+
+
+ /**
+ * [!] Method is generated. Documentation taken from corresponding module.
+ *
+ * Open web page at the given absolute URL and sets its hostname as the base host.
+ *
+ * ``` php
+ * amOnUrl('http://codeception.com');
+ * $I->amOnPage('/quickstart'); // moves to http://codeception.com/quickstart
+ * ?>
+ * ```
+ * @see \Codeception\Module\PhpBrowser::amOnUrl()
+ */
+ public function amOnUrl($url) {
+ return $this->getScenario()->runStep(new \Codeception\Step\Condition('amOnUrl', func_get_args()));
+ }
+
+
+ /**
+ * [!] Method is generated. Documentation taken from corresponding module.
+ *
+ * Changes the subdomain for the 'url' configuration parameter.
+ * Does not open a page; use `amOnPage` for that.
+ *
+ * ``` php
+ * amOnSubdomain('user');
+ * $I->amOnPage('/');
+ * // moves to http://user.mysite.com/
+ * ?>
+ * ```
+ *
+ * @param $subdomain
+ *
+ * @return mixed
+ * @see \Codeception\Module\PhpBrowser::amOnSubdomain()
+ */
+ public function amOnSubdomain($subdomain) {
+ return $this->getScenario()->runStep(new \Codeception\Step\Condition('amOnSubdomain', func_get_args()));
+ }
+
+
+ /**
+ * [!] Method is generated. Documentation taken from corresponding module.
+ *
+ * Low-level API method.
+ * If Codeception commands are not enough, use [Guzzle HTTP Client](http://guzzlephp.org/) methods directly
+ *
+ * Example:
+ *
+ * ``` php
+ * executeInGuzzle(function (\GuzzleHttp\Client $client) {
+ * $client->get('/get', ['query' => ['foo' => 'bar']]);
+ * });
+ * ?>
+ * ```
+ *
+ * It is not recommended to use this command on a regular basis.
+ * If Codeception lacks important Guzzle Client methods, implement them and submit patches.
+ *
+ * @param Closure $function
+ * @return mixed
+ * @see \Codeception\Module\PhpBrowser::executeInGuzzle()
+ */
+ public function executeInGuzzle($function) {
+ return $this->getScenario()->runStep(new \Codeception\Step\Action('executeInGuzzle', func_get_args()));
+ }
+
+
+ /**
+ * [!] Method is generated. Documentation taken from corresponding module.
+ *
+ * Sets the HTTP header to the passed value - which is used on
+ * subsequent HTTP requests through PhpBrowser.
+ *
+ * Example:
+ * ```php
+ * haveHttpHeader('X-Requested-With', 'Codeception');
+ * $I->amOnPage('test-headers.php');
+ * ?>
+ * ```
+ *
+ * To use special chars in Header Key use HTML Character Entities:
+ * Example:
+ * Header with underscore - 'Client_Id'
+ * should be represented as - 'Client_Id' or 'Client_Id'
+ *
+ * ```php
+ * haveHttpHeader('Client_Id', 'Codeception');
+ * ?>
+ * ```
+ *
+ * @param string $name the name of the request header
+ * @param string $value the value to set it to for subsequent
+ * requests
+ * @see \Codeception\Lib\InnerBrowser::haveHttpHeader()
+ */
+ public function haveHttpHeader($name, $value) {
+ return $this->getScenario()->runStep(new \Codeception\Step\Action('haveHttpHeader', func_get_args()));
+ }
+
+
+ /**
+ * [!] Method is generated. Documentation taken from corresponding module.
+ *
+ * Deletes the header with the passed name. Subsequent requests
+ * will not have the deleted header in its request.
+ *
+ * Example:
+ * ```php
+ * haveHttpHeader('X-Requested-With', 'Codeception');
+ * $I->amOnPage('test-headers.php');
+ * // ...
+ * $I->deleteHeader('X-Requested-With');
+ * $I->amOnPage('some-other-page.php');
+ * ?>
+ * ```
+ *
+ * @param string $name the name of the header to delete.
+ * @see \Codeception\Lib\InnerBrowser::deleteHeader()
+ */
+ public function deleteHeader($name) {
+ return $this->getScenario()->runStep(new \Codeception\Step\Action('deleteHeader', func_get_args()));
+ }
+
+
+ /**
+ * [!] Method is generated. Documentation taken from corresponding module.
+ *
+ * Opens the page for the given relative URI.
+ *
+ * ``` php
+ * amOnPage('/');
+ * // opens /register page
+ * $I->amOnPage('/register');
+ * ```
+ *
+ * @param string $page
+ * @see \Codeception\Lib\InnerBrowser::amOnPage()
+ */
+ public function amOnPage($page) {
+ return $this->getScenario()->runStep(new \Codeception\Step\Condition('amOnPage', func_get_args()));
+ }
+
+
+ /**
+ * [!] Method is generated. Documentation taken from corresponding module.
+ *
+ * Perform a click on a link or a button, given by a locator.
+ * If a fuzzy locator is given, the page will be searched for a button, link, or image matching the locator string.
+ * For buttons, the "value" attribute, "name" attribute, and inner text are searched.
+ * For links, the link text is searched.
+ * For images, the "alt" attribute and inner text of any parent links are searched.
+ *
+ * The second parameter is a context (CSS or XPath locator) to narrow the search.
+ *
+ * Note that if the locator matches a button of type `submit`, the form will be submitted.
+ *
+ * ``` php
+ * click('Logout');
+ * // button of form
+ * $I->click('Submit');
+ * // CSS button
+ * $I->click('#form input[type=submit]');
+ * // XPath
+ * $I->click('//form/*[@type="submit"]');
+ * // link in context
+ * $I->click('Logout', '#nav');
+ * // using strict locator
+ * $I->click(['link' => 'Login']);
+ * ?>
+ * ```
+ *
+ * @param $link
+ * @param $context
+ * @see \Codeception\Lib\InnerBrowser::click()
+ */
+ public function click($link, $context = NULL) {
+ return $this->getScenario()->runStep(new \Codeception\Step\Action('click', func_get_args()));
+ }
+
+
+ /**
+ * [!] Method is generated. Documentation taken from corresponding module.
+ *
+ * Checks that the current page contains the given string (case insensitive).
+ *
+ * You can specify a specific HTML element (via CSS or XPath) as the second
+ * parameter to only search within that element.
+ *
+ * ``` php
+ * see('Logout'); // I can suppose user is logged in
+ * $I->see('Sign Up', 'h1'); // I can suppose it's a signup page
+ * $I->see('Sign Up', '//body/h1'); // with XPath
+ * $I->see('Sign Up', ['css' => 'body h1']); // with strict CSS locator
+ * ```
+ *
+ * Note that the search is done after stripping all HTML tags from the body,
+ * so `$I->see('strong')` will return true for strings like:
+ *
+ * - `
I am Stronger than thou
`
+ * - ``
+ *
+ * But will *not* be true for strings like:
+ *
+ * - `Home`
+ * - `
Home`
+ * - ``
+ *
+ * For checking the raw source code, use `seeInSource()`.
+ *
+ * @param string $text
+ * @param array|string $selector optional
+ * @see \Codeception\Lib\InnerBrowser::see()
+ */
+ public function see($text, $selector = NULL) {
+ return $this->getScenario()->runStep(new \Codeception\Step\Assertion('see', func_get_args()));
+ }
+
+
+ /**
+ * [!] Method is generated. Documentation taken from corresponding module.
+ *
+ * Checks that the current page doesn't contain the text specified (case insensitive).
+ * Give a locator as the second parameter to match a specific region.
+ *
+ * ```php
+ * dontSee('Login'); // I can suppose user is already logged in
+ * $I->dontSee('Sign Up','h1'); // I can suppose it's not a signup page
+ * $I->dontSee('Sign Up','//body/h1'); // with XPath
+ * $I->dontSee('Sign Up', ['css' => 'body h1']); // with strict CSS locator
+ * ```
+ *
+ * Note that the search is done after stripping all HTML tags from the body,
+ * so `$I->dontSee('strong')` will fail on strings like:
+ *
+ * - `