diff --git a/src/BuildDirector/LegacyBuildDirector.php b/src/BuildDirector/LegacyBuildDirector.php
new file mode 100644
index 0000000000000000000000000000000000000000..90e01620403535ff1d204cb9222cbc4be5e97177
--- /dev/null
+++ b/src/BuildDirector/LegacyBuildDirector.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace WPDesk\PluginBuilder\BuildDirector;
+
+use WPDesk\PluginBuilder\Builder\AbstractBuilder;
+use WPDesk\PluginBuilder\Plugin\AbstractPlugin;
+use WPDesk\PluginBuilder\Storage\StorageFactory;
+
+class LegacyBuildDirector {
+
+	/** @var AbstractBuilder */
+	private $builder;
+
+	public function __construct( AbstractBuilder $builder ) {
+		$this->builder = $builder;
+	}
+
+	/**
+	 * Builds plugin
+	 */
+	public function build_plugin() {
+		$this->builder->build_plugin();
+		$this->builder->init_plugin();
+
+		$storage = new StorageFactory();
+		$this->builder->store_plugin( $storage->create_storage() );
+	}
+
+	/**
+	 * Returns built plugin
+	 *
+	 * @return AbstractPlugin
+	 */
+	public function get_plugin() {
+		return $this->builder->get_plugin();
+	}
+}
\ No newline at end of file
diff --git a/src/Builder/AbstractBuilder.php b/src/Builder/AbstractBuilder.php
index 296089c714749a62a3d0aa3ae3f6a820a975661b..592c969e1c31e68243ade2e929314424866be3dc 100644
--- a/src/Builder/AbstractBuilder.php
+++ b/src/Builder/AbstractBuilder.php
@@ -3,31 +3,62 @@
 namespace WPDesk\PluginBuilder\Builder;
 
 use WPDesk\PluginBuilder\Plugin\AbstractPlugin;
+use WPDesk\PluginBuilder\Storage\PluginStorage;
 
-class AbstractBuilder {
-	protected static $instances = [];
+abstract class AbstractBuilder {
+	/**
+	 * Create plugin class
+	 */
+	public function build_plugin() {
+	}
 
 	/**
-	 * @param string $class
-	 * @param AbstractPlugin $object
+	 * Store plugin class in some kind of storage
 	 */
-	protected function addToStorage( $class, $object ) {
-		if ( isset( self::$instances[ $class ] ) ) {
-			throw new Exception\ClassAlreadyExists( "Class {$class} already exists" );
-		}
-		self::$instances[ $class ] = $object;
+	public function store_plugin( PluginStorage $storage ) {
 	}
 
 	/**
-	 * @param string $class
-	 *
+	 * Init plugin internal structure
+	 */
+	public function init_plugin() {
+	}
+
+	/**
+	 * Return built plugin
 	 * @return AbstractPlugin
 	 */
-	protected function getFromStorage( $class ) {
-		if ( isset( self::$instances[ $class ] ) ) {
-			return self::$instances[ $class ];
-		} else {
-			throw new Exception\ClassNotExists( "Class {$class} not exists in storage" );
-		}
+	abstract function get_plugin();
+
+	/**
+	 * Set settings class in plugin
+	 *
+	 * @param $settings
+	 */
+	public function set_settings( $settings ) {
+	}
+
+	/**
+	 * Set view class in plugin
+	 *
+	 * @param $view
+	 */
+	public function set_view( $view ) {
+	}
+
+	/**
+	 * Set tracker class in plugin
+	 *
+	 * @param $tracker
+	 */
+	public function set_tracker( $tracker ) {
+	}
+
+	/**
+	 * Set helper class in plugin
+	 *
+	 * @param $helper
+	 */
+	public function set_helper( $helper ) {
 	}
 }
\ No newline at end of file
diff --git a/src/Builder/InfoBuilder.php b/src/Builder/InfoBuilder.php
index c3e75f379ad4b562582f099861155da7bfc38198..7afa279fc239574d0f17720b1c1412becc3aa2d2 100644
--- a/src/Builder/InfoBuilder.php
+++ b/src/Builder/InfoBuilder.php
@@ -3,40 +3,51 @@
 namespace WPDesk\PluginBuilder\Builder;
 
 use WPDesk\PluginBuilder\Plugin\AbstractPlugin;
+use WPDesk\PluginBuilder\Storage\PluginStorage;
 
 class InfoBuilder extends AbstractBuilder {
 	const FILTER_PLUGIN_CLASS = 'wp_builder_plugin_class';
 	const HOOK_BEFORE_PLUGIN_INIT = 'wp_builder_before_plugin_init';
 	const HOOK_AFTER_PLUGIN_INIT = 'wp_builder_before_init';
 
+	/** @var AbstractPlugin */
+	private $plugin;
+
+	/** @var \WPDesk_Buildable */
+	private $info;
+
+	/** @var string */
+	protected $storage_id;
+
+	public function __construct( \WPDesk_Buildable $info ) {
+		$this->info       = $info;
+		$this->storage_id = $info->get_class_name();
+	}
+
 	/**
 	 * Builds instance of plugin
-	 *
-	 * @param \WPDesk_Plugin_Info $info
-	 * @return AbstractPlugin
-	 *
-	 * @return AbstractPlugin
 	 */
-	public function build_from_info( \WPDesk_Buildable $info ) {
-		$class_name = apply_filters( self::FILTER_PLUGIN_CLASS, $info->get_class_name() );
+	public function build_plugin() {
+		$class_name = apply_filters( self::FILTER_PLUGIN_CLASS, $this->info->get_class_name() );
 
 		/** @var AbstractPlugin $plugin */
-		$plugin = new $class_name( $info );
-		$this->addToStorage( $info->get_class_name(), $plugin );
+		$this->plugin = new $class_name( $this->info );
+	}
 
-		do_action( self::HOOK_BEFORE_PLUGIN_INIT, $plugin );
-		$plugin->init();
-		do_action( self::HOOK_AFTER_PLUGIN_INIT, $plugin );
+	public function store_plugin( PluginStorage $storage ) {
+		$storage->add_to_storage( $this->storage_id, $this->plugin );
+	}
 
-		return $plugin;
+	public function init_plugin() {
+		do_action( self::HOOK_BEFORE_PLUGIN_INIT, $this->plugin );
+		$this->plugin->init();
+		do_action( self::HOOK_AFTER_PLUGIN_INIT, $this->plugin );
 	}
 
 	/**
-	 * @param string $class
-	 *
 	 * @return AbstractPlugin
 	 */
-	public function get_plugin_instance( $class ) {
-		return $this->getFromStorage( $class );
+	public function get_plugin() {
+		return $this->plugin;
 	}
 }
\ No newline at end of file
diff --git a/src/Plugin/AbstractPlugin.php b/src/Plugin/AbstractPlugin.php
index 709e5d6402caea8159b8103f519752673b29e684..ca5824b3cb1114f2c0bb86fd3a3f56de7f59d142 100644
--- a/src/Plugin/AbstractPlugin.php
+++ b/src/Plugin/AbstractPlugin.php
@@ -11,9 +11,9 @@ namespace WPDesk\PluginBuilder\Plugin;
 abstract class AbstractPlugin implements \WPDesk_Translable {
 
 	/** @var \WPDesk_Plugin_Info */
-    protected $plugin_info;
+	protected $plugin_info;
 
-    /** @var string */
+	/** @var string */
 	protected $plugin_namespace;
 
 	/** @var string */
@@ -24,128 +24,128 @@ abstract class AbstractPlugin implements \WPDesk_Translable {
 
 	/** @var string */
 	protected $settings_url;
-	
+
 	/**
 	 * AbstractPlugin constructor.
 	 *
 	 * @param \WPDesk_Plugin_Info $plugin_info
 	 */
-    public function __construct( $plugin_info ) {
-		$this->plugin_info = $plugin_info;
-		$this->plugin_namespace = strtolower($plugin_info->get_plugin_dir());
-    }
-
-    public function init() {
-    	$this->init_base_variables();
-    	$this->hooks();
-    }
-
-    /**
-     * @return $this
-     */
-    public function get_plugin() {
-        return $this;
-    }
-
-    /**
-     * @return string
-     */
-    public function get_text_domain() {
-        return $this->plugin_info->get_text_domain();
-    }
-
-    /**
-     * @return void
-     */
-    public function load_plugin_text_domain() {
-        load_plugin_textdomain( $this->get_text_domain(), false, $this->get_namespace() . '/lang/' );
-    }
-
-    public function init_base_variables( ) {
-        $this->plugin_url = plugin_dir_url( $this->plugin_info->get_plugin_dir() );
-    }
-
-    /**
-     * @return void
-     */
-    protected function hooks() {
-        add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
-
-        add_action( 'wp_enqueue_scripts', array( $this, 'wp_enqueue_scripts' ) );
-
-        add_action( 'plugins_loaded', array( $this, 'load_plugin_text_domain' ) );
-        add_filter( 'plugin_action_links_' . plugin_basename( $this->get_plugin_file_path() ), array(
-            $this,
-            'links_filter'
-        ) );
-
-    }
-
-    /**
-     *
-     * @return string
-     */
-    public function get_plugin_url() {
-        return esc_url( trailingslashit( $this->plugin_url ) );
-    }
-
-    public function get_plugin_assets_url() {
-        return esc_url( trailingslashit( $this->get_plugin_url() . 'assets' ) );
-    }
-
-    /**
-     * @return string
-     */
-    public function get_plugin_file_path() {
-        return $this->plugin_info->get_plugin_dir();
-    }
-
-    /**
-     * @return string
-     */
-    public function get_namespace() {
-        return $this->plugin_namespace;
-    }
-
-    public function admin_enqueue_scripts( ) {
-    }
-
-    public function wp_enqueue_scripts() {
-    }
-
-    /**
-     * action_links function.
-     *
-     * @access public
-     *
-     * @param mixed $links
-     *
-     * @return array
-     */
-    public function links_filter( $links ) {
-        $support_link = get_locale() === 'pl_PL' ? 'https://www.wpdesk.pl/support/' : 'https://www.wpdesk.net/support';
-
-        $plugin_links = array(
-            '<a href="' . $support_link . '">' . __( 'Support', $this->get_text_domain() ) . '</a>',
-        );
-        $links        = array_merge( $plugin_links, $links );
-
-        if ( $this->docs_url ) {
-            $plugin_links = array(
-                '<a href="' . $this->docs_url . '">' . __( 'Docs', $this->get_text_domain() ) . '</a>',
-            );
-            $links        = array_merge( $plugin_links, $links );
-        }
-
-        if ( $this->settings_url ) {
-            $plugin_links = array(
-                '<a href="' . $this->settings_url . '">' . __( 'Settings', $this->get_text_domain() ) . '</a>',
-            );
-            $links        = array_merge( $plugin_links, $links );
-        }
-
-        return $links;
-    }
+	public function __construct( $plugin_info ) {
+		$this->plugin_info      = $plugin_info;
+		$this->plugin_namespace = strtolower( $plugin_info->get_plugin_dir() );
+	}
+
+	public function init() {
+		$this->init_base_variables();
+		$this->hooks();
+	}
+
+	public function init_base_variables() {
+		$this->plugin_url = plugin_dir_url( $this->plugin_info->get_plugin_dir() );
+	}
+
+	/**
+	 * @return void
+	 */
+	protected function hooks() {
+		add_action( 'admin_enqueue_scripts', [ $this, 'admin_enqueue_scripts' ] );
+
+		add_action( 'wp_enqueue_scripts', [ $this, 'wp_enqueue_scripts' ] );
+
+		add_action( 'plugins_loaded', [ $this, 'load_plugin_text_domain' ] );
+		add_filter( 'plugin_action_links_' . plugin_basename( $this->get_plugin_file_path() ), [
+			$this,
+			'links_filter'
+		] );
+
+	}
+
+	/**
+	 * @return string
+	 */
+	public function get_plugin_file_path() {
+		return $this->plugin_info->get_plugin_dir();
+	}
+
+	/**
+	 * @return $this
+	 */
+	public function get_plugin() {
+		return $this;
+	}
+
+	/**
+	 * @return void
+	 */
+	public function load_plugin_text_domain() {
+		load_plugin_textdomain( $this->get_text_domain(), false, $this->get_namespace() . '/lang/' );
+	}
+
+	/**
+	 * @return string
+	 */
+	public function get_text_domain() {
+		return $this->plugin_info->get_text_domain();
+	}
+
+	/**
+	 * @return string
+	 */
+	public function get_namespace() {
+		return $this->plugin_namespace;
+	}
+
+	public function get_plugin_assets_url() {
+		return esc_url( trailingslashit( $this->get_plugin_url() . 'assets' ) );
+	}
+
+	/**
+	 *
+	 * @return string
+	 */
+	public function get_plugin_url() {
+		return esc_url( trailingslashit( $this->plugin_url ) );
+	}
+
+	public function admin_enqueue_scripts() {
+	}
+
+	public function wp_enqueue_scripts() {
+	}
+
+	/**
+	 * action_links function.
+	 *
+	 * @access public
+	 *
+	 * @param mixed $links
+	 *
+	 * @return array
+	 */
+	public function links_filter( $links ) {
+		$support_link = get_locale() === 'pl_PL' ? 'https://www.wpdesk.pl/support/' : 'https://www.wpdesk.net/support';
+
+		$plugin_links = [
+			'<a href="' . $support_link . '">' . __( 'Support', $this->get_text_domain() ) . '</a>',
+		];
+		$links        = array_merge( $plugin_links, $links );
+
+		if ( $this->docs_url ) {
+			$plugin_links = [
+				'<a href="' . $this->docs_url . '">' . __( 'Docs', $this->get_text_domain() ) . '</a>',
+			];
+			$links        = array_merge( $plugin_links, $links );
+		}
+
+		if ( $this->settings_url ) {
+			$plugin_links = [
+				'<a href="' . $this->settings_url . '">' . __( 'Settings', $this->get_text_domain() ) . '</a>',
+			];
+			$links        = array_merge( $plugin_links, $links );
+		}
+
+		return $links;
+	}
 
 }
 
diff --git a/src/Builder/Exception/ClassAlreadyExists.php b/src/Storage/Exception/ClassAlreadyExists.php
similarity index 55%
rename from src/Builder/Exception/ClassAlreadyExists.php
rename to src/Storage/Exception/ClassAlreadyExists.php
index 2b69111bc281e6f2882ea2a0f1d2570d3867f500..7fb8a0b7116e9548c0b4899b4ea95090abe478c4 100644
--- a/src/Builder/Exception/ClassAlreadyExists.php
+++ b/src/Storage/Exception/ClassAlreadyExists.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace WPDesk\PluginBuilder\Builder\Exception;
+namespace WPDesk\PluginBuilder\Storage\Exception;
 
 class ClassAlreadyExists extends \RuntimeException
 {
diff --git a/src/Builder/Exception/ClassNotExists.php b/src/Storage/Exception/ClassNotExists.php
similarity index 54%
rename from src/Builder/Exception/ClassNotExists.php
rename to src/Storage/Exception/ClassNotExists.php
index bbcfe32efed7b4946626d581d5844f25e6bfae20..d873f70655c0b76fcf0b1b89d232d3cdc564e38d 100644
--- a/src/Builder/Exception/ClassNotExists.php
+++ b/src/Storage/Exception/ClassNotExists.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace WPDesk\PluginBuilder\Builder\Exception;
+namespace WPDesk\PluginBuilder\Storage\Exception;
 
 class ClassNotExists extends \RuntimeException
 {
diff --git a/src/Storage/PluginStorage.php b/src/Storage/PluginStorage.php
new file mode 100644
index 0000000000000000000000000000000000000000..e8a5fce580aaf5bd7acf53ef131fdad9f7ceacb9
--- /dev/null
+++ b/src/Storage/PluginStorage.php
@@ -0,0 +1,22 @@
+<?php
+
+namespace WPDesk\PluginBuilder\Storage;
+
+use WPDesk\PluginBuilder\Plugin\AbstractPlugin;
+
+interface PluginStorage {
+
+	/**
+	 * @param string $class
+	 * @param AbstractPlugin $object
+	 */
+	public function add_to_storage( $class, $object );
+
+	/**
+	 * @param string $class
+	 *
+	 * @return AbstractPlugin
+	 */
+	public function get_from_storage( $class );
+}
+
diff --git a/src/Storage/StaticStorage.php b/src/Storage/StaticStorage.php
new file mode 100644
index 0000000000000000000000000000000000000000..bae150dd37e7a1c6784801c22f50da95539a27dd
--- /dev/null
+++ b/src/Storage/StaticStorage.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace WPDesk\PluginBuilder\Storage;
+
+use WPDesk\PluginBuilder\Plugin\AbstractPlugin;
+
+class StaticStorage implements PluginStorage {
+	protected static $instances = [];
+
+	/**
+	 * @param string $class
+	 * @param AbstractPlugin $object
+	 */
+	public function add_to_storage( $class, $object ) {
+		if ( isset( self::$instances[ $class ] ) ) {
+			throw new Exception\ClassAlreadyExists( "Class {$class} already exists" );
+		}
+		self::$instances[ $class ] = $object;
+	}
+
+	/**
+	 * @param string $class
+	 *
+	 * @return AbstractPlugin
+	 */
+	public function get_from_storage( $class ) {
+		if ( isset( self::$instances[ $class ] ) ) {
+			return self::$instances[ $class ];
+		} else {
+			throw new Exception\ClassNotExists( "Class {$class} not exists in storage" );
+		}
+	}
+}
+
diff --git a/src/Storage/StorageFactory.php b/src/Storage/StorageFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..8a1422f53e033dc1fc3b1da9cf1dee71a302f23a
--- /dev/null
+++ b/src/Storage/StorageFactory.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace WPDesk\PluginBuilder\Storage;
+
+class StorageFactory {
+
+	/**
+	 * @return PluginStorage
+	 */
+	public function create_storage() {
+		return new StaticStorage();
+	}
+}
+