diff --git a/composer.json b/composer.json
index 9aabcbfd6524c8565176bfdfeb7d3681b73b80be..79afa9c48eba7ee11cc1ccbb97b237c913a60723 100644
--- a/composer.json
+++ b/composer.json
@@ -8,26 +8,24 @@
         }
     ],
     "require": {
-        "php": ">=7.0"
+        "php": ">=7.1 | ^8"
     },
     "require-dev": {
-        "phpunit/phpunit": "<7",
-        "wp-coding-standards/wpcs": "^0.14.1",
-        "squizlabs/php_codesniffer": "^3.0.2",
-        "mockery/mockery": "*",
-        "10up/wp_mock": "*",
-        "wimg/php-compatibility": "^8"
+        "phpunit/phpunit": "^7 | ^8 | ^9",
+        "wpdesk/wp-code-sniffer": "^1",
+        "mockery/mockery": "^1",
+        "10up/wp_mock": "^1"
     },
     "autoload": {
         "psr-4": {"WPDesk\\View\\": "src/"}
     },
-    "autoload-dev": {
-    },
     "scripts": {
-        "phpcs": "phpcs",
-        "phpunit-unit": "phpunit --configuration phpunit-unit.xml --coverage-text --colors=never",
-        "phpunit-unit-fast": "phpunit --configuration phpunit-unit.xml --no-coverage",
-        "phpunit-integration": "phpunit --configuration phpunit-integration.xml --coverage-text --colors=never",
-        "phpunit-integration-fast": "phpunit --configuration phpunit-integration.xml --no-coverage"
+        "test": "phpunit",
+        "phpcs": "phpcs"
+    },
+    "config": {
+        "allow-plugins": {
+            "dealerdirect/phpcodesniffer-composer-installer": true
+        }
     }
 }
diff --git a/phpcs.xml.dist b/phpcs.xml.dist
new file mode 100644
index 0000000000000000000000000000000000000000..ba9325b380317b240d2a7ed4cfd7abe8c894eebb
--- /dev/null
+++ b/phpcs.xml.dist
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<ruleset name="WordPress Coding Standards for WP Desk Plugin">
+
+	<!--
+	#############################################################################
+	COMMAND LINE ARGUMENTS
+	https://github.com/squizlabs/PHP_CodeSniffer/wiki/Annotated-ruleset.xml
+	#############################################################################
+	-->
+
+	<!-- Only check PHP files. -->
+	<arg name="extensions" value="php"/>
+
+	<!-- Show progress, show the error codes for each message (source). -->
+	<arg value="sp"/>
+
+	<!-- Check up to 8 files simultaneously. -->
+	<arg name="parallel" value="8"/>
+
+	<!-- Cache outcomes for better performance. Remember to add the file to .gitignore. -->
+	<arg name="cache" value="./.phpcs-cache"/>
+
+	<!--
+	#############################################################################
+	USE THE WPDeskCS RULESET
+	#############################################################################
+	-->
+
+	<!-- This value should be aligned with WordPress support version declared in plugin header -->
+	<config name="minimum_supported_wp_version" value="6.0"/>
+
+	<!-- Set value aligned with supported PHP Version for PHPCompatibilityWP check. -->
+	<config name="testVersion" value="7.1-"/>
+
+	<rule ref="WPDeskPlugin"/>
+
+</ruleset>
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
new file mode 100644
index 0000000000000000000000000000000000000000..1a6fcff411945c43b606a086c378529d837e460d
--- /dev/null
+++ b/phpunit.xml.dist
@@ -0,0 +1,7 @@
+<phpunit bootstrap="vendor/autoload.php">
+    <testsuites>
+        <testsuite name="Unit Tests">
+            <directory prefix="Test" suffix=".php">./tests/</directory>
+        </testsuite>
+    </testsuites>
+</phpunit>
diff --git a/tests/unit/Renderer/TestSimplePhpRenderer.php b/tests/Renderer/TestSimplePhpRenderer.php
similarity index 100%
rename from tests/unit/Renderer/TestSimplePhpRenderer.php
rename to tests/Renderer/TestSimplePhpRenderer.php
diff --git a/tests/unit/Renderer/templates/some_template.php b/tests/Renderer/templates/some_template.php
similarity index 100%
rename from tests/unit/Renderer/templates/some_template.php
rename to tests/Renderer/templates/some_template.php
diff --git a/tests/unit/Resolver/TestChainResolver.php b/tests/Resolver/TestChainResolver.php
similarity index 95%
rename from tests/unit/Resolver/TestChainResolver.php
rename to tests/Resolver/TestChainResolver.php
index 3d5d51011d3764141325aabea78a63778f635794..0e32b1faeceb3e9a52a4a9a6fcba43684dc8dfe9 100644
--- a/tests/unit/Resolver/TestChainResolver.php
+++ b/tests/Resolver/TestChainResolver.php
@@ -10,12 +10,12 @@ class TestChainResolver extends \PHPUnit\Framework\TestCase
 
     const RESOLVE_METHOD_NAME = 'resolve';
 
-    public function setUp()
+    public function setUp(): void
     {
         \WP_Mock::setUp();
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         \WP_Mock::tearDown();
     }
diff --git a/tests/unit/Resolver/TestDirResolver.php b/tests/Resolver/TestDirResolver.php
similarity index 93%
rename from tests/unit/Resolver/TestDirResolver.php
rename to tests/Resolver/TestDirResolver.php
index c8c79f3e47b678c3fdf819ec9421aca3a76c7b65..088bc09eea390c76d1569dec3cd4af8facbd96d8 100644
--- a/tests/unit/Resolver/TestDirResolver.php
+++ b/tests/Resolver/TestDirResolver.php
@@ -9,12 +9,12 @@ class TestDirResolver extends \PHPUnit\Framework\TestCase
     const TEMPLATE_FILE = 'some_template.php';
     const TEMPLATE_SUBDIR = 'templates';
 
-	public function setUp()
+	public function setUp(): void
 	{
 		\WP_Mock::setUp();
 	}
 
-	public function tearDown()
+	public function tearDown(): void
 	{
 		\WP_Mock::tearDown();
 	}
diff --git a/tests/unit/Resolver/TestWpThemeResolver.php b/tests/Resolver/TestWpThemeResolver.php
similarity index 96%
rename from tests/unit/Resolver/TestWpThemeResolver.php
rename to tests/Resolver/TestWpThemeResolver.php
index 635aeebf86afd1a2c220ee321f395b7f175ce22e..ab400a52f00b48ea304f734d94ba43050dca2ef4 100644
--- a/tests/unit/Resolver/TestWpThemeResolver.php
+++ b/tests/Resolver/TestWpThemeResolver.php
@@ -9,7 +9,7 @@ class TestThemeResolver extends \PHPUnit\Framework\TestCase
     const TEMPLATE_FILE = 'some_template.php';
     const TEMPLATE_SUBDIR = 'templates';
 
-    public function setUp()
+    public function setUp(): void
     {
         \WP_Mock::setUp();
 
@@ -43,7 +43,7 @@ class TestThemeResolver extends \PHPUnit\Framework\TestCase
         ]);
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         \WP_Mock::tearDown();
     }
diff --git a/tests/unit/Resolver/templates/some_template.php b/tests/Resolver/templates/some_template.php
similarity index 100%
rename from tests/unit/Resolver/templates/some_template.php
rename to tests/Resolver/templates/some_template.php
diff --git a/tests/unit/TestPluginViewBuilder.php b/tests/TestPluginViewBuilder.php
similarity index 93%
rename from tests/unit/TestPluginViewBuilder.php
rename to tests/TestPluginViewBuilder.php
index fcefdb7f0659f63e59aa67a6f4dc4ba77a5e0bd6..6c25585225ca6b454398b689645b3768950c7f62 100644
--- a/tests/unit/TestPluginViewBuilder.php
+++ b/tests/TestPluginViewBuilder.php
@@ -4,7 +4,7 @@
 use WPDesk\View\PluginViewBuilder;
 
 class TestPluginViewBuilder extends \PHPUnit\Framework\TestCase {
-	public function setUp() {
+	public function setUp(): void {
 		\WP_Mock::setUp();
 
 		\WP_Mock::userFunction('trailingslashit', [
@@ -14,7 +14,7 @@ class TestPluginViewBuilder extends \PHPUnit\Framework\TestCase {
 		]);
 	}
 
-	public function tearDown()
+	public function tearDown(): void
 	{
 		\WP_Mock::tearDown();
 	}
diff --git a/tests/integration/bootstrap.php b/tests/integration/bootstrap.php
deleted file mode 100644
index a422fd9c7fea652a15b2aced0b2e6134a5590201..0000000000000000000000000000000000000000
--- a/tests/integration/bootstrap.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-ini_set('error_reporting', E_ALL); // or error_reporting(E_ALL);
-ini_set('display_errors', '1');
-ini_set('display_startup_errors', '1');
-
-require_once __DIR__ . '/../../vendor/autoload.php';
-
-// disable xdebug backtrace
-if ( function_exists( 'xdebug_disable' ) ) {
-	xdebug_disable();
-}
-
-if ( getenv( 'PLUGIN_PATH' ) !== false ) {
-	define( 'PLUGIN_PATH', getenv( 'PLUGIN_PATH' ) );
-} else {
-	define( 'PLUGIN_PATH', __DIR__ . DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR );
-}
-
-require_once( getenv( 'WP_DEVELOP_DIR' ) . '/tests/phpunit/includes/functions.php' );
-
-tests_add_filter( 'muplugins_loaded', function () {
-}, 100 );
-
-putenv('WP_TESTS_DIR=' . getenv( 'WP_DEVELOP_DIR' ) . '/tests/phpunit');
-require_once( getenv( 'WC_DEVELOP_DIR' ) . '/tests/bootstrap.php' );
-
-do_action('plugins_loaded');
\ No newline at end of file
diff --git a/tests/unit/stub/template/file.php b/tests/stub/template/file.php
similarity index 100%
rename from tests/unit/stub/template/file.php
rename to tests/stub/template/file.php
diff --git a/tests/unit/bootstrap.php b/tests/unit/bootstrap.php
deleted file mode 100644
index 575b33bd7df4416b1684dcd7b22e6b5beb4760c6..0000000000000000000000000000000000000000
--- a/tests/unit/bootstrap.php
+++ /dev/null
@@ -1,6 +0,0 @@
-<?php
-/**
- * PHPUnit bootstrap file
- */
-
-require_once __DIR__ . '/../../vendor/autoload.php';