diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs
new file mode 100644
index 0000000000000000000000000000000000000000..b6e5820183d72ebc6cfede7b36f1e216fb01a0d3
--- /dev/null
+++ b/.git-blame-ignore-revs
@@ -0,0 +1 @@
+5c1e330583a0d5eda6426db1c632784feff507e2
diff --git a/composer.json b/composer.json
index 9aabcbfd6524c8565176bfdfeb7d3681b73b80be..c5cb15af5aa7484022822b40d0d8b6ead85c7305 100644
--- a/composer.json
+++ b/composer.json
@@ -1,33 +1,40 @@
 {
-    "name": "wpdesk/wp-view",
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "Krzysiek",
-            "email": "krzysiek@wpdesk.pl"
-        }
-    ],
-    "require": {
-        "php": ">=7.0"
-    },
-    "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"
-    },
-    "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"
-    }
+	"name": "wpdesk/wp-view",
+	"license": "MIT",
+	"authors": [
+		{
+			"name": "WP Desk",
+			"role": "Owner"
+		},
+		{
+			"name": "Krzysiek",
+			"email": "krzysiek@wpdesk.pl"
+		}
+	],
+	"require": {
+		"php": ">=7.0 | ^8"
+	},
+	"require-dev": {
+		"phpunit/phpunit": "<7",
+		"wpdesk/wp-code-sniffer": "^1",
+		"mockery/mockery": "*",
+		"10up/wp_mock": "*",
+		"wpdesk/phpstan-rules": "^1.1"
+	},
+	"autoload": {
+		"psr-4": {"WPDesk\\View\\": "src/"}
+	},
+	"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"
+	},
+	"config": {
+		"allow-plugins": {
+			"dealerdirect/phpcodesniffer-composer-installer": true,
+			"phpstan/extension-installer": true
+		}
+	}
 }
diff --git a/src/PluginViewBuilder.php b/src/PluginViewBuilder.php
index cb96a8486f6d4c81c7956e90d51dd9b58f2ffa3a..646a9e5c6ccba99d1b3bd75f5d0d8f2453ad3615 100644
--- a/src/PluginViewBuilder.php
+++ b/src/PluginViewBuilder.php
@@ -13,6 +13,7 @@ use WPDesk\View\Resolver\WPThemeResolver;
  * @package WPDesk\View
  */
 class PluginViewBuilder {
+
 	/** @var string */
 	private $plugin_dir;
 
@@ -62,9 +63,9 @@ class PluginViewBuilder {
 	 *
 	 * @return string Rendered template.
 	 */
-	public function loadTemplate( $name, $path = '.', $args = array() ) {
+	public function loadTemplate( $name, $path = '.', $args = [] ) {
 		$renderer = $this->createSimpleRenderer();
 
 		return $renderer->render( trailingslashit( $path ) . $name, $args );
 	}
-}
\ No newline at end of file
+}
diff --git a/src/Renderer/LoadTemplatePlugin.php b/src/Renderer/LoadTemplatePlugin.php
index 0a66a2becb5ba4f9a2504f5eaf81ff40fa19df35..e0d382ef8d22de3ab4ae69568f4e5c8bfc2568f8 100644
--- a/src/Renderer/LoadTemplatePlugin.php
+++ b/src/Renderer/LoadTemplatePlugin.php
@@ -8,20 +8,20 @@ use WPDesk\View\Resolver\Resolver;
  * Can render templates
  */
 class LoadTemplatePlugin implements Renderer {
+
 	private $plugin;
 
 	private $path;
 
-	public function __construct($plugin, $path = '') {
+	public function __construct( $plugin, $path = '' ) {
 		$this->plugin = $plugin;
-		$this->path = $path;
+		$this->path   = $path;
 	}
 
 	public function set_resolver( Resolver $resolver ) {
-
 	}
 
-	public function render($template, array $params = null) {
-		return $this->plugin->load_template($template, $this->path, $params);
+	public function render( $template, array $params = null ) {
+		return $this->plugin->load_template( $template, $this->path, $params );
 	}
 }
diff --git a/src/Renderer/Renderer.php b/src/Renderer/Renderer.php
index e106044c51747edbddf966f4e0242af2f477126f..1c7653b5b3a6a5cd6e0e0b4b3035b6e85ad1d072 100644
--- a/src/Renderer/Renderer.php
+++ b/src/Renderer/Renderer.php
@@ -7,26 +7,26 @@ use WPDesk\View\Resolver\Resolver;
 /**
  * Can render templates
  */
-interface Renderer
-{
-    /**
-     * Set the resolver used to map a template name to a resource the renderer may consume.
-     *
-     * @param  Resolver $resolver
-     */
-    public function set_resolver(Resolver $resolver);
+interface Renderer {
 
-    /**
-     * @param string $template
-     * @param array $params
-     *
-     * @return string
-     */
-    public function render($template, array $params = null);
+	/**
+	 * Set the resolver used to map a template name to a resource the renderer may consume.
+	 *
+	 * @param  Resolver $resolver
+	 */
+	public function set_resolver( Resolver $resolver );
 
-    /**
-     * @param string $template
-     * @param array $params
-     */
-    public function output_render($template, array $params = null);
+	/**
+	 * @param string $template
+	 * @param array $params
+	 *
+	 * @return string
+	 */
+	public function render( $template, array $params = null );
+
+	/**
+	 * @param string $template
+	 * @param array $params
+	 */
+	public function output_render( $template, array $params = null );
 }
diff --git a/src/Renderer/SimplePhpRenderer.php b/src/Renderer/SimplePhpRenderer.php
index 5e6d7596f13430ae8aa76187d9056fac9a71c320..caa4828fa28bd7fe0d694f2564c33ae19a58a633 100644
--- a/src/Renderer/SimplePhpRenderer.php
+++ b/src/Renderer/SimplePhpRenderer.php
@@ -7,50 +7,45 @@ use WPDesk\View\Resolver\Resolver;
 /**
  * Can render templates
  */
-class SimplePhpRenderer implements Renderer
-{
-    /** @var Resolver */
-    private $resolver;
-
-    public function __construct(Resolver $resolver)
-    {
-        $this->set_resolver($resolver);
-    }
-
-    /**
-     * @param Resolver $resolver
-     *
-     * @return void|Resolver
-     */
-    public function set_resolver(Resolver $resolver)
-    {
-        $this->resolver = $resolver;
-    }
-
-    /**
-     * @param string $template
-     * @param array|null $params
-     *
-     * @return string
-     */
-    public function render($template, array $params = null)
-    {
-        ob_start();
-        $this->output_render( $template, $params );
-        return ob_get_clean();
-    }
-
-    /**
-     * @param string $template
-     * @param array|null $params
-     */
-    public function output_render($template, array $params = null)
-    {
-        if ($params !== null) {
-            extract($params, EXTR_SKIP);
-        }
-
-        include($this->resolver->resolve($template . '.php'));
-    }
-
+class SimplePhpRenderer implements Renderer {
+
+	/** @var Resolver */
+	private $resolver;
+
+	public function __construct( Resolver $resolver ) {
+		$this->set_resolver( $resolver );
+	}
+
+	/**
+	 * @param Resolver $resolver
+	 *
+	 * @return void|Resolver
+	 */
+	public function set_resolver( Resolver $resolver ) {
+		$this->resolver = $resolver;
+	}
+
+	/**
+	 * @param string $template
+	 * @param array|null $params
+	 *
+	 * @return string
+	 */
+	public function render( $template, array $params = null ) {
+		ob_start();
+		$this->output_render( $template, $params );
+		return ob_get_clean();
+	}
+
+	/**
+	 * @param string $template
+	 * @param array|null $params
+	 */
+	public function output_render( $template, array $params = null ) {
+		if ( $params !== null ) {
+			extract( $params, EXTR_SKIP );
+		}
+
+		include $this->resolver->resolve( $template . '.php' );
+	}
 }
diff --git a/src/Resolver/ChainResolver.php b/src/Resolver/ChainResolver.php
index eaa394f1d761aa032fa3da442540bbfdeadb20a3..9f18296cf5696e6a6b044ceb4d39bfd88fc9ba2e 100644
--- a/src/Resolver/ChainResolver.php
+++ b/src/Resolver/ChainResolver.php
@@ -2,7 +2,6 @@
 
 namespace WPDesk\View\Resolver;
 
-
 use WPDesk\View\Renderer\Renderer;
 use WPDesk\View\Resolver\Exception\CanNotResolve;
 
@@ -11,51 +10,47 @@ use WPDesk\View\Resolver\Exception\CanNotResolve;
  *
  * @package WPDesk\View\Resolver
  */
-class ChainResolver implements Resolver
-{
-    /** @var Resolver[] */
-    private $resolvers;
-
-    /**
-     * Warning: function with variadic input. Input should be list of Resolver instances.
-     */
-    public function __construct()
-    {
-        $args = func_get_args();
-        foreach ($args as $resolver) {
-            $this->appendResolver($resolver);
-        }
-    }
-
-    /**
-     * Append resolver to the end of the list
-     *
-     * @param Resolver $resolver
-     */
-    public function appendResolver( $resolver)
-    {
-        $this->resolvers[] = $resolver;
-    }
-
-    /**
-     * Resolve name to full path
-     *
-     * @param string $name
-     * @param Renderer|null $renderer
-     *
-     * @return string
-     */
-    public function resolve($name, Renderer $renderer = null)
-    {
-        foreach ($this->resolvers as $resolver) {
-            try {
-                return $resolver->resolve($name);
-            } catch (CanNotResolve $e) {
-                // not interested
-            }
-        }
-
-        throw new CanNotResolve("Cannot resolve {$name}");
-    }
-
+class ChainResolver implements Resolver {
+
+	/** @var Resolver[] */
+	private $resolvers;
+
+	/**
+	 * Warning: function with variadic input. Input should be list of Resolver instances.
+	 */
+	public function __construct() {
+		$args = func_get_args();
+		foreach ( $args as $resolver ) {
+			$this->appendResolver( $resolver );
+		}
+	}
+
+	/**
+	 * Append resolver to the end of the list
+	 *
+	 * @param Resolver $resolver
+	 */
+	public function appendResolver( $resolver ) {
+		$this->resolvers[] = $resolver;
+	}
+
+	/**
+	 * Resolve name to full path
+	 *
+	 * @param string $name
+	 * @param Renderer|null $renderer
+	 *
+	 * @return string
+	 */
+	public function resolve( $name, Renderer $renderer = null ) {
+		foreach ( $this->resolvers as $resolver ) {
+			try {
+				return $resolver->resolve( $name );
+			} catch ( CanNotResolve $e ) {
+				// not interested
+			}
+		}
+
+		throw new CanNotResolve( "Cannot resolve {$name}" );
+	}
 }
diff --git a/src/Resolver/DirResolver.php b/src/Resolver/DirResolver.php
index 69f1b6cca966ae5b396327152baf40d690ed48df..a95d3115ea930982b5c7369c90667a5c2ee04f23 100644
--- a/src/Resolver/DirResolver.php
+++ b/src/Resolver/DirResolver.php
@@ -2,7 +2,6 @@
 
 namespace WPDesk\View\Resolver;
 
-
 use WPDesk\View\Renderer\Renderer;
 use WPDesk\View\Resolver\Exception\CanNotResolve;
 
@@ -11,40 +10,36 @@ use WPDesk\View\Resolver\Exception\CanNotResolve;
  *
  * @package WPDesk\View\Resolver
  */
-class DirResolver implements Resolver
-{
-
-    /** @var string */
-    private $dir;
-
-
-    /**
-     * Base path for templates ie. subdir
-     *
-     * @param $dir
-     */
-    public function __construct($dir)
-    {
-        $this->dir = $dir;
-    }
-
-    /**
-     * Resolve name to full path
-     *
-     * @param string $name
-     * @param Renderer|null $renderer
-     *
-     * @return string
-     */
-    public function resolve($name, Renderer $renderer = null)
-    {
-        $dir = rtrim($this->dir, '/');
-        $fullName = $dir . '/' . $name;
-        if (file_exists($fullName)) {
-            return $fullName;
-        }
-
-        throw new CanNotResolve("Cannot resolve {$name}");
-    }
-
+class DirResolver implements Resolver {
+
+	/** @var string */
+	private $dir;
+
+
+	/**
+	 * Base path for templates ie. subdir
+	 *
+	 * @param $dir
+	 */
+	public function __construct( $dir ) {
+		$this->dir = $dir;
+	}
+
+	/**
+	 * Resolve name to full path
+	 *
+	 * @param string $name
+	 * @param Renderer|null $renderer
+	 *
+	 * @return string
+	 */
+	public function resolve( $name, Renderer $renderer = null ) {
+		$dir      = rtrim( $this->dir, '/' );
+		$fullName = $dir . '/' . $name;
+		if ( file_exists( $fullName ) ) {
+			return $fullName;
+		}
+
+		throw new CanNotResolve( "Cannot resolve {$name}" );
+	}
 }
diff --git a/src/Resolver/Exception/CanNotResolve.php b/src/Resolver/Exception/CanNotResolve.php
index c52dc7c7d6caad8e85d95bbd97f971d25042a7fd..cef04f6144959d0927852b3b8b4281098f55e18a 100644
--- a/src/Resolver/Exception/CanNotResolve.php
+++ b/src/Resolver/Exception/CanNotResolve.php
@@ -3,8 +3,7 @@
 
 namespace WPDesk\View\Resolver\Exception;
 
+class CanNotResolve extends \RuntimeException {
 
-class CanNotResolve extends \RuntimeException
-{
 
-}
\ No newline at end of file
+}
diff --git a/src/Resolver/NullResolver.php b/src/Resolver/NullResolver.php
index 4f69832fb4944bb87ecc7f1706ea3dd1c8790ece..27249b23da536d53100cf55c50f6fd2a9ffff3d1 100644
--- a/src/Resolver/NullResolver.php
+++ b/src/Resolver/NullResolver.php
@@ -2,7 +2,6 @@
 
 namespace WPDesk\View\Resolver;
 
-
 use WPDesk\View\Renderer\Renderer;
 use WPDesk\View\Resolver\Exception\CanNotResolve;
 
@@ -11,12 +10,10 @@ use WPDesk\View\Resolver\Exception\CanNotResolve;
  *
  * @package WPDesk\View\Resolver
  */
-class NullResolver implements Resolver
-{
+class NullResolver implements Resolver {
 
-    public function resolve($name, Renderer $renderer = null)
-    {
-        throw new CanNotResolve("Null Cannot resolve");
-    }
 
+	public function resolve( $name, Renderer $renderer = null ) {
+		throw new CanNotResolve( 'Null Cannot resolve' );
+	}
 }
diff --git a/src/Resolver/Resolver.php b/src/Resolver/Resolver.php
index ac5095964bb115941c72f089f35b0fa5acf9c3c6..883904c6b1592586cf395208cd8544f469ad77c6 100644
--- a/src/Resolver/Resolver.php
+++ b/src/Resolver/Resolver.php
@@ -16,5 +16,5 @@ interface Resolver {
 	 *
 	 * @return string
 	 */
-	public function resolve($name, Renderer $renderer = null);
+	public function resolve( $name, Renderer $renderer = null );
 }
diff --git a/src/Resolver/WPThemeResolver.php b/src/Resolver/WPThemeResolver.php
index d95028ca24e72f3f63717c6a1f01d03a27116110..349066264da149e300d4f6da250b10b591aa995c 100644
--- a/src/Resolver/WPThemeResolver.php
+++ b/src/Resolver/WPThemeResolver.php
@@ -2,7 +2,6 @@
 
 namespace WPDesk\View\Resolver;
 
-
 use WPDesk\View\Renderer\Renderer;
 use WPDesk\View\Resolver\Exception\CanNotResolve;
 
@@ -11,43 +10,39 @@ use WPDesk\View\Resolver\Exception\CanNotResolve;
  *
  * @package WPDesk\View\Resolver
  */
-class WPThemeResolver implements Resolver
-{
-
-    /** @var string */
-    private $template_base_path;
-
-
-    /**
-     * Base path for templates ie. subdir
-     *
-     * @param $template_base_path
-     */
-    public function __construct($template_base_path)
-    {
-        $this->template_base_path = $template_base_path;
-    }
-
-    /**
-     * Resolve name to full path
-     *
-     * @param string $name
-     * @param Renderer|null $renderer
-     *
-     * @return string
-     */
-    public function resolve($name, Renderer $renderer = null)
-    {
-        $templateFile = locate_template(
-            [
-                trailingslashit($this->template_base_path) . $name,
-            ]
-        );
-        if ( ! $templateFile) {
-            throw new CanNotResolve("Cannot resolve {$name}");
-        }
-
-        return $templateFile;
-    }
-
+class WPThemeResolver implements Resolver {
+
+	/** @var string */
+	private $template_base_path;
+
+
+	/**
+	 * Base path for templates ie. subdir
+	 *
+	 * @param $template_base_path
+	 */
+	public function __construct( $template_base_path ) {
+		$this->template_base_path = $template_base_path;
+	}
+
+	/**
+	 * Resolve name to full path
+	 *
+	 * @param string $name
+	 * @param Renderer|null $renderer
+	 *
+	 * @return string
+	 */
+	public function resolve( $name, Renderer $renderer = null ) {
+		$templateFile = locate_template(
+			[
+				trailingslashit( $this->template_base_path ) . $name,
+			]
+		);
+		if ( ! $templateFile ) {
+			throw new CanNotResolve( "Cannot resolve {$name}" );
+		}
+
+		return $templateFile;
+	}
 }