diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000000000000000000000000000000000000..f8cf764ddd07a52c96758afd18d3aa3780b4ecf0
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,6 @@
+## [2.3.0] - 2019-03-25
+### Added
+- Factory
+- Interface
+### Changed
+- Minor internal action renaming
\ No newline at end of file
diff --git a/src/Basic_Requirement_Checker.php b/src/Basic_Requirement_Checker.php
index 89ae599f125432ffbc8297e4293872ecbeccdef2..a928633433d0a61769e3cfa330ecb28d4464f4ba 100644
--- a/src/Basic_Requirement_Checker.php
+++ b/src/Basic_Requirement_Checker.php
@@ -4,11 +4,16 @@ if ( ! interface_exists( 'WPDesk_Translatable' ) ) {
 	require_once 'Translatable.php';
 }
 
+if ( ! interface_exists( 'WPDesk_Requirement_Checker' ) ) {
+	require_once 'Requirement_Checker.php';
+}
+
 /**
  * Checks requirements for plugin
  * have to be compatible with PHP 5.2.x
  */
-class WPDesk_Basic_Requirement_Checker implements WPDesk_Translatable {
+class WPDesk_Basic_Requirement_Checker implements WPDesk_Translatable, WPDesk_Requirement_Checker
+{
 	const EXTENSION_NAME_OPENSSL = 'openssl';
 	const HOOK_ADMIN_NOTICES_ACTION = 'admin_notices';
 
@@ -349,7 +354,7 @@ class WPDesk_Basic_Requirement_Checker implements WPDesk_Translatable {
      * @deprecated use render_notices or disable_plugin
 	 */
 	public function disable_plugin_render_notice() {
-		add_action( self::HOOK_ADMIN_NOTICES_ACTION, array( $this, 'render_notices_action' ) );
+		add_action( self::HOOK_ADMIN_NOTICES_ACTION, array( $this, 'handle_render_notices_action') );
 	}
 
     /**
@@ -358,7 +363,7 @@ class WPDesk_Basic_Requirement_Checker implements WPDesk_Translatable {
      * @return void
      */
     public function render_notices() {
-        add_action( self::HOOK_ADMIN_NOTICES_ACTION, array( $this, 'render_notices_action' ) );
+        add_action( self::HOOK_ADMIN_NOTICES_ACTION, array( $this, 'handle_render_notices_action') );
     }
 
     /**
@@ -367,7 +372,7 @@ class WPDesk_Basic_Requirement_Checker implements WPDesk_Translatable {
      * @return void
      */
     public function disable_plugin() {
-        add_action( self::HOOK_ADMIN_NOTICES_ACTION, array( $this, 'deactivate_action' ) );
+        add_action( self::HOOK_ADMIN_NOTICES_ACTION, array( $this, 'handle_deactivate_action') );
     }
 
     /**
@@ -375,22 +380,22 @@ class WPDesk_Basic_Requirement_Checker implements WPDesk_Translatable {
      *
      * @return void
      */
-    public function deactivate_action() {
+    public function handle_deactivate_action() {
         if ( isset( $this->plugin_file ) ) {
             deactivate_plugins( plugin_basename( $this->plugin_file ) );
         }
     }
 
-	/**
-	 * Should be called as WordPress action
-	 *
+    /**
+     * Should be called as WordPress action
+     *
      * @internal Do not use as public. Public only for wp action.
      *
-	 * @return void
-	 */
-	public function render_notices_action() {
-		foreach ( $this->notices as $notice ) {
-			echo $notice;
-		}
-	}
+     * @return void
+     */
+    public function handle_render_notices_action() {
+        foreach ( $this->notices as $notice ) {
+            echo $notice;
+        }
+    }
 }
diff --git a/src/Basic_Requirement_Checker_Factory.php b/src/Basic_Requirement_Checker_Factory.php
new file mode 100644
index 0000000000000000000000000000000000000000..a4bbb9cedf9dd6e93b43659438955140177043b0
--- /dev/null
+++ b/src/Basic_Requirement_Checker_Factory.php
@@ -0,0 +1,22 @@
+<?php
+
+if ( ! class_exists('Basic_Requirement_Checker')) {
+    require_once 'Basic_Requirement_Checker.php';
+}
+
+class WPDesk_Basic_Requirement_Checker_Factory
+{
+    /**
+     * @param $plugin_file
+     * @param $plugin_name
+     * @param $text_domain
+     * @param $php_version
+     * @param $wp_version
+     *
+     * @return WPDesk_Requirement_Checker
+     */
+    public function create_requirement_checker($plugin_file, $plugin_name, $text_domain)
+    {
+        return new WPDesk_Basic_Requirement_Checker($plugin_file, $plugin_name, $text_domain, null, null);
+    }
+}
diff --git a/src/Requirement_Checker.php b/src/Requirement_Checker.php
new file mode 100644
index 0000000000000000000000000000000000000000..aa472cad4e5c02e9ad38aded009b296d1c370f87
--- /dev/null
+++ b/src/Requirement_Checker.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ * Checks requirements for plugin
+ * have to be compatible with PHP 5.2.x
+ */
+interface WPDesk_Requirement_Checker
+{
+    /**
+     * @param string $version
+     *
+     * @return $this
+     */
+    public function set_min_php_require($version);
+
+    /**
+     * @param string $version
+     *
+     * @return $this
+     */
+    public function set_min_wp_require($version);
+
+    /**
+     * @param string $version
+     *
+     * @return $this
+     */
+    public function set_min_wc_require($version);
+
+    /**
+     * @param $version
+     *
+     * @return $this
+     */
+    public function set_min_openssl_require($version);
+
+    /**
+     * @param string $plugin_name
+     * @param string $nice_plugin_name Nice plugin name for better looks in notice
+     *
+     * @return $this
+     */
+    public function add_plugin_require($plugin_name, $nice_plugin_name = null);
+
+    /**
+     * @param string $module_name
+     * @param string $nice_name Nice module name for better looks in notice
+     *
+     * @return $this
+     */
+    public function add_php_module_require($module_name, $nice_name = null);
+
+    /**
+     * @param string $setting
+     * @param mixed $value
+     *
+     * @return $this
+     */
+    public function add_php_setting_require($setting, $value);
+
+    /**
+     * @return bool
+     */
+    public function are_requirements_met();
+
+    /**
+     * @return void
+     */
+    public function disable_plugin_render_notice();
+
+	/**
+	 * @return void
+	 */
+	public function render_notices();
+
+    /**
+     * Renders requirement notices in admin panel
+     *
+     * @return void
+     */
+    public function disable_plugin();
+}
\ No newline at end of file
diff --git a/src/Requirement_Checker_Factory.php b/src/Requirement_Checker_Factory.php
new file mode 100644
index 0000000000000000000000000000000000000000..803eb810781ebd5fa6c49eb5e77c2c64d32532fb
--- /dev/null
+++ b/src/Requirement_Checker_Factory.php
@@ -0,0 +1,15 @@
+<?php
+
+interface WPDesk_Requirement_Checker_Factory
+{
+    /**
+     * @param $plugin_file
+     * @param $plugin_name
+     * @param $text_domain
+     * @param $php_version
+     * @param $wp_version
+     *
+     * @return WPDesk_Requirement_Checker
+     */
+    public function create_requirement_checker($plugin_file, $plugin_name, $text_domain);
+}
diff --git a/tests/unit/Test_Basic_Requirement_Checker.php b/tests/unit/Test_Basic_Requirement_Checker.php
index e68e24d5e82e428bad51c0c6cd46fec47ae5560d..260369cb7ae4e8233e25b552878685d7a4ac2250 100644
--- a/tests/unit/Test_Basic_Requirement_Checker.php
+++ b/tests/unit/Test_Basic_Requirement_Checker.php
@@ -46,7 +46,7 @@ class Test_Basic_Requirement_Checker extends PHPUnit\Framework\TestCase {
 		$requirements->set_min_php_require( self::ALWAYS_NOT_VALID_PHP_VERSION );
 		$requirements->are_requirements_met();
 		$this->expectOutputRegex( "/PHP/" );
-		$requirements->render_notices_action();
+		$requirements->handle_render_notices_action();
 	}
 
 	/**
@@ -73,7 +73,7 @@ class Test_Basic_Requirement_Checker extends PHPUnit\Framework\TestCase {
 			'Should fail because required WP should be at least ' . $wp_version_fail );
 
 		$this->expectOutputRegex( "/WordPress/" );
-		$requirements->render_notices_action();
+		$requirements->handle_render_notices_action();
 	}
 
 	/**
@@ -88,7 +88,7 @@ class Test_Basic_Requirement_Checker extends PHPUnit\Framework\TestCase {
 		$this->assertTrue( $requirements->are_requirements_met(), 'Curl should exists' );
 
 		$this->expectOutputRegex( "/^$/" );
-		$requirements->render_notices_action();
+		$requirements->handle_render_notices_action();
 	}
 
 	public function test_plugin_check_with_multisite() {
@@ -122,7 +122,7 @@ class Test_Basic_Requirement_Checker extends PHPUnit\Framework\TestCase {
 		$this->assertFalse( $requirements->are_requirements_met(), 'Plugin should not exists' );
 
 		$this->expectOutputRegex( "/$not_existing_plugin_name/" );
-		$requirements->render_notices_action();
+		$requirements->handle_render_notices_action();
 	}
 
 	/**
@@ -147,7 +147,7 @@ class Test_Basic_Requirement_Checker extends PHPUnit\Framework\TestCase {
 			'Requirement OpenSSL should fail for that high number' );
 
 		$this->expectOutputRegex( '/without OpenSSL module/' );
-		$requirements->render_notices_action();
+		$requirements->handle_render_notices_action();
 	}
 
 	public function test_deactivate_plugin_notice() {
@@ -155,13 +155,13 @@ class Test_Basic_Requirement_Checker extends PHPUnit\Framework\TestCase {
 			self::ALWAYS_VALID_WP_VERSION );
 
 		WP_Mock::expectActionAdded( WPDesk_Basic_Requirement_Checker::HOOK_ADMIN_NOTICES_ACTION,
-			[ $requirements, 'render_notices_action' ] );
+			[ $requirements, 'handle_render_notices_action'] );
 
 		$this->assertFalse( $requirements->are_requirements_met() );
 		$requirements->disable_plugin();
         $requirements->render_notices();
 
 		$this->expectOutputRegex( '/cannot run on PHP/' );
-		$requirements->render_notices_action();
+		$requirements->handle_render_notices_action();
 	}
 }