diff --git a/src/Annotation/ViewsBuilder.php b/src/Annotation/ViewsBuilder.php
new file mode 100644
index 0000000..4bd5b5d
--- /dev/null
+++ b/src/Annotation/ViewsBuilder.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\views_template\Annotation\ViewsBuilder.
+ */
+
+
+namespace Drupal\views_template\Annotation;
+
+
+use Drupal\Component\Annotation\Plugin;
+
+/**
+ * Defines a ViewsBuilder annotation object.
+ *
+ * @todo For some reason this not getting picked up by the manager.
+ *
+ * @Annotation
+ */
+class ViewsBuilder extends Plugin {
+
+  /**
+   * The plugin ID.
+   *
+   * @var string
+   */
+  public $id;
+
+  /**
+   * Description for list page
+   *
+   * @var string
+   *
+   * @ingroup plugin_translatable
+   */
+  public $description = '';
+
+  /**
+   * The administrative label of the View Builder.
+   *
+   * @var \Drupal\Core\Annotation\Translation
+   *
+   * @ingroup plugin_translatable
+   */
+  public $admin_label = '';
+
+  /**
+   * Class used to retrieve derivative definitions of the Views Builder.
+   *
+   * @var string
+   */
+  public $derivative = '';
+
+  /**
+   * Base table of View.
+   *
+   * @var string
+   */
+  public $base_table;
+
+}
diff --git a/src/Controller/ViewsBuilderController.php b/src/Controller/ViewsBuilderController.php
new file mode 100644
index 0000000..ee5ddcd
--- /dev/null
+++ b/src/Controller/ViewsBuilderController.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\views_templates\Controller\ViewsBuilderController.
+ */
+
+
+namespace Drupal\views_templates\Controller;
+
+
+use Drupal\Component\Plugin\PluginManagerInterface;
+use Drupal\Core\Controller\ControllerBase;
+use Drupal\Core\Url;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+class ViewsBuilderController extends ControllerBase {
+
+  /**
+   * @var \Drupal\Component\Plugin\PluginManagerInterface
+   */
+  protected $builder_manager;
+
+  /**
+   * Constructs a new \Drupal\views_templates\Controller\ViewsBuilderController
+   * object.
+   *
+   * @param \Drupal\Component\Plugin\PluginManagerInterface
+   *   The Views Builder Plugin Interface.
+   */
+  public function __construct(PluginManagerInterface $builder_manager) {
+    $this->builder_manager = $builder_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('plugin.manager.views_templates.builder')
+    );
+  }
+
+  /**
+   * Create template list table.
+   *
+   * @return array
+   *  Render array of template list.
+   */
+  public function templateList() {
+    $table = array(
+      '#type' => 'table',
+      '#header' => array(
+        $this->t('Name'),
+        $this->t('Description'),
+        $this->t('Add'),
+      ),
+      '#empty' => $this->t('There are no available Views Templates'),
+    );
+
+    /** @var \Drupal\views_templates\Plugin\ViewsBuilderPluginInterface $definition */
+    foreach ($this->builder_manager->getDefinitions() as $definition) {
+
+      /** @var \Drupal\views_templates\Plugin\ViewsBuilderPluginInterface $builder */
+      $builder = $this->builder_manager->createInstance($definition['id']);
+      $plugin_id = $builder->getPluginId();
+      $row = [
+        'name' => ['#plain_text' => $builder->getAdminLabel()],
+        'description' => ['#plain_text' => $builder->getDescription()],
+        'add' => [
+          '#type' => 'link',
+          '#title' => t('Add'),
+          '#url' => Url::fromRoute('views_templates.create_from_template',
+            [
+              'view_template' => $plugin_id,
+            ]
+          ),
+        ],
+      ];
+
+      $table[$plugin_id] = $row;
+    }
+
+    return $table;
+  }
+}
diff --git a/src/Entity/ViewTemplate.php b/src/Entity/ViewTemplate.php
deleted file mode 100644
index bfe66e3..0000000
--- a/src/Entity/ViewTemplate.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\views_templates\Entity\FilterFormat.
- */
-
-namespace Drupal\views_templates\Entity;
-
-use Drupal\Core\Config\Entity\ConfigEntityBase;
-
-/**
- * Defines a View template configuration entity class.
- *
- * @ConfigEntityType(
- *   id = "view_template",
- *   label = @Translation("View Template"),
- *   handlers = {
- *     "access" = "Drupal\views\ViewAccessControlHandler",
- *     "list_builder" = "Drupal\views_templates\ViewTemplateListBuilder",
- *     "form" = {
- *       "create_from_template" = "Drupal\views_templates\ViewTemplateForm"
- *     }
- *   },
- *   admin_permission = "administer views",
- *   config_prefix = "view_template",
- *   entity_keys = {
- *     "id" = "id",
- *     "label" = "label",
- *   },
- *   links = {
- *     "create-from-template" = "/admin/structure/views/template/{view_template}/add"
- *   },
- *   config_export = {
- *     "id",
- *     "label",
- *     "module",
- *     "description",
- *     "tag",
- *     "base_table",
- *     "base_field",
- *     "core",
- *     "display",
- *   }
- * )
- */
-class ViewTemplate extends ConfigEntityBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function label() {
-    if (!$label = $this->get('label')) {
-      $label = $this->id();
-    }
-    return $label;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getDescription() {
-    return $this->get('description');
-  }
-}
diff --git a/src/Plugin/ViewsBuilderBase.php b/src/Plugin/ViewsBuilderBase.php
new file mode 100644
index 0000000..80d5e04
--- /dev/null
+++ b/src/Plugin/ViewsBuilderBase.php
@@ -0,0 +1,73 @@
+<?php
+
+/**
+ * @file
+ * Contains
+ * \Drupal\views_templates\Plugin\ViewsTemplateBuilder\ViewsBuilderBase.
+ */
+
+namespace Drupal\views_templates\Plugin;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Plugin\PluginBase;
+use Drupal\views\Entity\View;
+
+/**
+ * Base builder for View Templates
+ *
+ * This class get Views information for Plugin definition.
+ * Extending classes can use derivatives to make many plugins.
+ */
+abstract class ViewsBuilderBase extends PluginBase implements ViewsBuilderPluginInterface {
+  /**
+   * {@inheritdoc}
+   */
+  public function getBaseTable() {
+    return $this->getDefinitionValue('base_table');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAdminLabel() {
+    return $this->getDefinitionValue('admin_label');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDescription() {
+    return $this->getDefinitionValue('description');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDefinitionValue($key) {
+    $def = $this->getPluginDefinition();
+    return $def[$key];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function createView($options = NULL) {
+
+    $view_values = [
+      'id' => $options['id'],
+      'label' => $options['label'],
+      'description' => $options['description'],
+      'base_table' => $this->getBaseTable(),
+    ];
+    return View::create($view_values);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildConfigurationForm($form, FormStateInterface $form_state) {
+    return [];
+  }
+
+
+}
diff --git a/src/Plugin/ViewsBuilderPluginInterface.php b/src/Plugin/ViewsBuilderPluginInterface.php
new file mode 100644
index 0000000..7dbfaf4
--- /dev/null
+++ b/src/Plugin/ViewsBuilderPluginInterface.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\views_templates\Plugin\ViewsBuilderPluginInterface.
+ */
+
+
+namespace Drupal\views_templates\Plugin;
+
+
+use Drupal\Component\Plugin\PluginInspectionInterface;
+use Drupal\Core\Form\FormStateInterface;
+
+/**
+ * Creates a common interface for Views Builder classes.
+ */
+interface ViewsBuilderPluginInterface extends PluginInspectionInterface {
+
+  /**
+   * Returns base table id.
+   *
+   * @return string
+   */
+  public function getBaseTable();
+
+  /**
+   * Get template description.
+   *
+   * @return string
+   */
+  public function getDescription();
+
+  /**
+   * Get template admin label.
+   *
+   * @return string
+   */
+  public function getAdminLabel();
+
+  /**
+   * Get a value from the plugin definition.
+   *
+   * @param $key
+   *
+   * @return mixed
+   */
+  public function getDefinitionValue($key);
+
+  /**
+   * Create a View. Don't save it.
+   *
+   * @param null $options
+   *
+   * @return \Drupal\views\ViewEntityInterface
+   */
+  public function createView($options = NULL);
+
+  /**
+   * Return form elements of extra configuration when adding View from template.
+   *
+   * @param $form
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *
+   * @return mixed
+   */
+  public function buildConfigurationForm($form, FormStateInterface $form_state);
+
+}
diff --git a/src/Plugin/ViewsBuilderPluginManager.php b/src/Plugin/ViewsBuilderPluginManager.php
new file mode 100644
index 0000000..6a2ab36
--- /dev/null
+++ b/src/Plugin/ViewsBuilderPluginManager.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views_templates\Plugin\ViewsBuilderPluginManager.
+ */
+
+namespace Drupal\views_templates\Plugin;
+
+use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Plugin\DefaultPluginManager;
+
+/**
+ * Class ViewsTemplateBuilderPluginManager.
+ *
+ * @package Drupal\views_templates\Plugin
+ */
+class ViewsBuilderPluginManager extends DefaultPluginManager {
+
+  /**
+   * Constructs an ViewsTemplateBuilderPluginManager object.
+   *
+   * @param \Traversable $namespaces
+   *   An object that implements \Traversable which contains the root paths
+   *   keyed by the corresponding namespace to look for plugin implementations.
+   * @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
+   *   Cache backend instance to use.
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The module handler to invoke the alter hook with.
+   */
+  public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler) {
+    parent::__construct('Plugin/ViewsTemplateBuilder', $namespaces, $module_handler, 'Drupal\views_templates\Plugin\ViewsBuilderPluginInterface', 'Drupal\Component\Annotation\Plugin');
+    // @todo Figure why Drupal\views_template\Annotation\ViewsBuilder is not working.
+    //parent::__construct('Plugin/ViewsTemplateBuilder', $namespaces, $module_handler, 'Drupal\views_templates\Plugin\ViewsBuilderPluginInterface', 'Drupal\views_template\Annotation\ViewsBuilder');
+    $this->alterInfo('views_template_builder_info');
+    $this->setCacheBackend($cache_backend, 'views_template_builder');
+  }
+
+}
diff --git a/src/Plugin/ViewsDuplicateBuilderBase.php b/src/Plugin/ViewsDuplicateBuilderBase.php
new file mode 100644
index 0000000..c929eea
--- /dev/null
+++ b/src/Plugin/ViewsDuplicateBuilderBase.php
@@ -0,0 +1,169 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\views_templates\Plugin\ViewsDuplicateBuilder.
+ */
+
+
+namespace Drupal\views_templates\Plugin;
+
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\views\Entity\View;
+use Drupal\views_templates\ViewsTemplateLoaderInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+abstract class ViewsDuplicateBuilderBase extends ViewsBuilderBase implements ViewsDuplicateBuilderPluginInterface, ContainerFactoryPluginInterface {
+
+  /** @var \Drupal\views_templates\ViewsTemplateLoaderInterface $template_loader */
+  protected $template_loader;
+
+  protected $loaded_template;
+
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, ViewsTemplateLoaderInterface $loader) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->template_loader = $loader;
+
+  }
+
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('views_templates.loader')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function createView($options = NULL) {
+    $view_template = $this->loadTemplate();
+    $view_template['id'] = $options['id'];
+    $view_template['label'] = $options['label'];
+    $view_template['description'] = $options['description'];
+    return View::create($view_template);
+  }
+
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getViewTemplateId() {
+    return $this->getDefinitionValue('view_template_id');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildConfigurationForm($form, FormStateInterface $form_state) {
+    return [];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAdminLabel() {
+    return $this->loadViewsTemplateValue('label');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDescription() {
+    return $this->loadViewsTemplateValue('description');
+  }
+
+  /**
+   * Return value from template.
+   *
+   * @param $key
+   *
+   * @return null|mixed
+   */
+  protected function loadViewsTemplateValue($key) {
+    $view_template = $this->loadTemplate();
+    if (isset($view_template[$key])) {
+      return $view_template[$key];
+    }
+    return NULL;
+  }
+
+  /**
+   * Load template from service.
+   *
+   * @return object
+   */
+  protected function loadTemplate() {
+    if (empty($this->loaded_template)) {
+      $template = $this->template_loader->load($this);
+      $this->alterViewTemplateAfterCreation($template);
+      $this->loaded_template = $template;
+    }
+
+    return $this->loaded_template;
+  }
+
+  /**
+   * After View Template has been created the Builder should alter it some how.
+   *
+   * @param \Drupal\views_templates\Entity\ViewTemplate $view_template
+   */
+  protected function alterViewTemplateAfterCreation(&$view_template, $options = NULL) {
+    if ($replace_values = $this->getDefinitionValue('replace_values')) {
+      $this->replaceTemplateKeyAndValues($view_template, $replace_values);
+    }
+  }
+
+  /**
+   * Recursively replace keys and values in template elements.
+   *
+   * For example of builder and yml template:
+   *
+   * @see Drupal\views_templates_builder_test\Plugin\ViewsTemplateBuilder
+   *
+   * @param array $template_elements
+   *  Array of elements from a View Template array
+   * @param array $replace_values
+   *  The values in that should be replaced in the template.
+   *  The keys in this array can be keys OR values template array.
+   *  This allows replacing both keys and values in the template.
+   */
+  protected function replaceTemplateKeyAndValues(array &$template_elements, array $replace_values) {
+    foreach ($template_elements as $key => &$value) {
+      if (is_array($value)) {
+        $this->replaceTemplateKeyAndValues($value, $replace_values);
+      }
+      else {
+        foreach ($replace_values as $replace_key => $replace_value) {
+          if (!is_array($value)) {
+            if (is_string($value)) {
+              if (stripos($value,$replace_key) !== FALSE) {
+                $value = str_replace($replace_key, $replace_value, $value);
+              }
+            }
+            elseif ($replace_key === $value) {
+              $value = $replace_value;
+            }
+          }
+          if ($key === $replace_key) {
+            $template_elements[$replace_value] = $value;
+            unset($template_elements[$key]);
+          }
+
+        }
+
+      }
+
+
+    }
+  }
+
+
+}
diff --git a/src/Plugin/ViewsDuplicateBuilderPluginInterface.php b/src/Plugin/ViewsDuplicateBuilderPluginInterface.php
new file mode 100644
index 0000000..e395b64
--- /dev/null
+++ b/src/Plugin/ViewsDuplicateBuilderPluginInterface.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\views_templates\Plugin\ViewsDuplicateBuilderPluginInterface.
+ */
+
+
+namespace Drupal\views_templates\Plugin;
+
+/**
+ * Creates a common interface for Builders that use a View Template entity for
+ * a starting point.
+ *
+ * This allows Views to be exported to CMI and then manually changed to Views
+ * Templates by changing the
+ */
+interface ViewsDuplicateBuilderPluginInterface extends ViewsBuilderPluginInterface {
+
+  /**
+   * Return the View Template id to be used by this Plugin.
+   *
+   * @return string
+   */
+  public function getViewTemplateId();
+
+}
diff --git a/src/ViewTemplateForm.php b/src/ViewTemplateForm.php
index 77b5993..0faa5b7 100644
--- a/src/ViewTemplateForm.php
+++ b/src/ViewTemplateForm.php
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * @file
  * Contains \Drupal\views_templates\ViewTemplateForm.
@@ -7,29 +6,67 @@
 
 namespace Drupal\views_templates;
 
-use Drupal\Core\Entity\EntityForm;
+use Drupal\Component\Plugin\PluginManagerInterface;
+use Drupal\Core\Form\FormBase;
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\views\Element\View;
+use Drupal\views_templates\Plugin\ViewsBuilderPluginInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
- * Form controller for the view template entity edit forms.
+ * Form controller for the view template entity add forms.
  */
-class ViewTemplateForm extends EntityForm {
+class ViewTemplateForm extends FormBase {
+
+  /**
+   * @var \Drupal\Component\Plugin\PluginManagerInterface
+   */
+  protected $builder_manager;
+
+  /**
+   * Constructs a new \Drupal\views_templates\Controller\ViewsBuilderController
+   * object.
+   *
+   * @param \Drupal\Component\Plugin\PluginManagerInterface
+   *   The Views Builder Plugin Interface.
+   */
+  public function __construct(PluginManagerInterface $builder_manager) {
+    $this->builder_manager = $builder_manager;
+  }
+
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('plugin.manager.views_templates.builder')
+    );
+  }
+
 
   /**
    * {@inheritdoc}
    */
-  protected function prepareEntity() {
-    // Do not prepare the entity while it is being added.
+  protected function actions(array $form, FormStateInterface $form_state) {
+    $actions['submit'] = array(
+      '#type' => 'submit',
+      '#value' => $this->t('Continue'),
+    );
+    return $actions;
   }
 
   /**
    * {@inheritdoc}
    */
-  public function form(array $form, FormStateInterface $form_state) {
-    parent::form($form, $form_state);
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    $builder = $this->createBuilder($form_state->getValue('builder_id'));
+    $values = $form_state->cleanValues()->getValues();
+    $view = $builder->createView($values);
+    $view->save();
 
-    $form['#title'] = $this->t('Duplicate of @label', array('@label' => $this->entity->label()));
+    // Redirect the user to the view admin form.
+    $form_state->setRedirectUrl($view->urlInfo('edit-form'));
+  }
+
+  public function buildForm(array $form, FormStateInterface $form_state, $view_template = NULL) {
+    $builder = $this->createBuilder($view_template);
+    $form['#title'] = $this->t('Duplicate of @label', array('@label' => $builder->getAdminLabel()));
 
     $form['label'] = array(
       '#type' => 'textfield',
@@ -37,7 +74,7 @@ class ViewTemplateForm extends EntityForm {
       '#required' => TRUE,
       '#size' => 32,
       '#maxlength' => 255,
-      '#default_value' => $this->entity->label(),
+      '#default_value' => $builder->getAdminLabel(),
     );
     $form['id'] = array(
       '#type' => 'machine_name',
@@ -50,32 +87,38 @@ class ViewTemplateForm extends EntityForm {
       '#description' => $this->t('A unique machine-readable name for this View. It must only contain lowercase letters, numbers, and underscores.'),
     );
 
+    $form['description'] = [
+      '#type' => 'textfield',
+      '#title' => $this->t('Description'),
+      '#default_value' => $builder->getDescription(),
+    ];
+    $form['builder_id'] = [
+      '#type' => 'value',
+      '#value' => $builder->getPluginId(),
+    ];
+
+    $form += $builder->buildConfigurationForm($form, $form_state);
+
+    $form['submit'] = [
+      '#type' => 'submit',
+      '#value' => $this->t('Create View'),
+    ];
+
     return $form;
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  protected function actions(array $form, FormStateInterface $form_state) {
-    $actions['submit'] = array(
-      '#type' => 'submit',
-      '#value' => $this->t('Continue'),
-    );
-    return $actions;
+  public function getFormId() {
+    return 'views_templates_add';
   }
 
   /**
-   * {@inheritdoc}
+   * @param $plugin_id
+   *
+   * @return ViewsBuilderPluginInterface;
    */
-  public function submitForm(array &$form, FormStateInterface $form_state) {
-    $this->entity = $this->entity->createDuplicate();
-    $this->entity->set('label', $form_state->getValue('label'));
-    $this->entity->set('id', $form_state->getValue('id'));
-    $this->entity->set('entityTypeId', 'view');
-    $this->entity->save();
-
-    // Redirect the user to the view admin form.
-    $form_state->setRedirectUrl($this->entity->urlInfo('edit-form'));
+  public function createBuilder($plugin_id) {
+    return $this->builder_manager->createInstance($plugin_id);
   }
 
+
 }
diff --git a/src/ViewTemplateListBuilder.php b/src/ViewTemplateListBuilder.php
deleted file mode 100644
index a707322..0000000
--- a/src/ViewTemplateListBuilder.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\views_templates\ViewTemplateListBuilder.
- */
-
-namespace Drupal\views_templates;
-
-use Drupal\Core\Config\Entity\ConfigEntityListBuilder;
-use Drupal\Core\Entity\EntityInterface;
-use Drupal\Core\Form\FormStateInterface;
-
-/**
- * Defines a class to build a listing of view template entities.
- *
- * @see \Drupal\views_templates\Entity\ViewTemplate
- */
-class ViewTemplateListBuilder extends ConfigEntityListBuilder {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function buildHeader() {
-    $header['label'] = t('Name');
-    $header['description'] = array(
-      'data' => t('Description'),
-      'class' => array(RESPONSIVE_PRIORITY_MEDIUM),
-    );
-    return $header + parent::buildHeader();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function buildRow(EntityInterface $entity) {
-    $row['label'] = $entity->label();
-    $row['description']['data'] = ['#markup' => $entity->getDescription()];
-    return $row + parent::buildRow($entity);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getDefaultOperations(EntityInterface $entity) {
-    $operations = parent::getDefaultOperations($entity);
-
-    $operations['create_from_template'] = array(
-      'title' => $this->t('add'),
-      'weight' => 20,
-      'url' => $entity->urlInfo('create-from-template'),
-    );
-
-    return $operations;
-  }
-
-}
diff --git a/src/ViewsTemplateLoader.php b/src/ViewsTemplateLoader.php
new file mode 100644
index 0000000..7382e7b
--- /dev/null
+++ b/src/ViewsTemplateLoader.php
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views_templates\ViewsTemplateLoader.
+ */
+
+namespace Drupal\views_templates;
+
+use Drupal\Component\Serialization\Yaml;
+use Drupal\views_templates\Plugin\ViewsDuplicateBuilderPluginInterface;
+
+
+/**
+ * Service class to load templates from the file system.
+ *
+ *
+ */
+class ViewsTemplateLoader implements ViewsTemplateLoaderInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function load(ViewsDuplicateBuilderPluginInterface $builder) {
+    // @todo through errors template file is not available.
+    $templates = &drupal_static(__FUNCTION__, array());
+
+    $template_id = $builder->getViewTemplateId();
+    if (!isset($templates[$template_id])) {
+      $dir = drupal_get_path('module', $builder->getDefinitionValue('module')) . '/views_templates';
+      if (is_dir($dir)) {
+
+        $file_path = $dir . '/' . $builder->getViewTemplateId() . '.yml';
+        if (is_file($file_path)) {
+          $templates[$template_id] = Yaml::decode(file_get_contents($file_path));
+        }
+      }
+    }
+    return $templates[$template_id];
+  }
+
+}
diff --git a/src/ViewsTemplateLoaderInterface.php b/src/ViewsTemplateLoaderInterface.php
new file mode 100644
index 0000000..2d8e1f7
--- /dev/null
+++ b/src/ViewsTemplateLoaderInterface.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views_templates\ViewsTemplateLoaderInterface.
+ */
+
+namespace Drupal\views_templates;
+
+use Drupal\views_templates\Plugin\ViewsDuplicateBuilderPluginInterface;
+
+/**
+ * Provide interface for loading Views Templates for a builder.
+ */
+interface ViewsTemplateLoaderInterface {
+
+  /**
+   * Load template array values from file system for builder plugin.
+   *
+   * @param \Drupal\views_templates\Plugin\ViewsDuplicateBuilderPluginInterface $builder
+   *
+   * @return array
+   */
+  public function load(ViewsDuplicateBuilderPluginInterface $builder);
+
+}
diff --git a/tests/modules/views_templates_builder_test/src/Plugin/ViewsTemplateBuilder/NodeViewBuilder.php b/tests/modules/views_templates_builder_test/src/Plugin/ViewsTemplateBuilder/NodeViewBuilder.php
new file mode 100644
index 0000000..4179c93
--- /dev/null
+++ b/tests/modules/views_templates_builder_test/src/Plugin/ViewsTemplateBuilder/NodeViewBuilder.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\views_templates_builder_test\NodeViewBuilder.
+ */
+
+
+namespace Drupal\views_templates_builder_test\Plugin\ViewsTemplateBuilder;
+
+use Drupal\views_templates\Plugin\ViewsBuilderBase;
+
+
+/**
+ * Test comment
+ *
+ * @todo Switch to our own annotation in ViewsBuilderPluginManager
+ *
+ * @Plugin(
+ *  id = "node_builder",
+ *  admin_label = "Node View",
+ *  description = "A Test Node View",
+ *  base_table = "node_field_data",
+ *  default_title = "Nodes List"
+ * )
+ */
+class NodeViewBuilder extends ViewsBuilderBase {
+  public function createView($options = NULL) {
+    $view = parent::createView($options);
+
+
+    $display_options = $view->getDisplay('default');
+    $display_options['fields']['title']['id'] = 'title';
+    $display_options['fields']['title']['table'] = 'node_field_data';
+    $display_options['fields']['title']['field'] = 'title';
+    $display_options['fields']['title']['entity_type'] = 'node';
+    $display_options['fields']['title']['entity_field'] = 'title';
+    $display_options['fields']['title']['label'] = '';
+    $display_options['fields']['title']['alter']['alter_text'] = 0;
+    $display_options['fields']['title']['alter']['make_link'] = 0;
+    $display_options['fields']['title']['alter']['absolute'] = 0;
+    $display_options['fields']['title']['alter']['trim'] = 0;
+    $display_options['fields']['title']['alter']['word_boundary'] = 0;
+    $display_options['fields']['title']['alter']['ellipsis'] = 0;
+    $display_options['fields']['title']['alter']['strip_tags'] = 0;
+    $display_options['fields']['title']['alter']['html'] = 0;
+    $display_options['fields']['title']['hide_empty'] = 0;
+    $display_options['fields']['title']['empty_zero'] = 0;
+    $display_options['fields']['title']['settings']['link_to_entity'] = 1;
+    $display_options['fields']['title']['plugin_id'] = 'field';
+
+    // $executable = $view->getExecutable();
+
+    // Display: Master
+    //$default_display = $executable->newDisplay('default', 'Master', 'default');
+    $view->addDisplay('page');
+
+
+    /*
+        foreach ($display_options['default'] as $option => $value) {
+          $master->setOption($option, $value);
+        }
+    */
+
+    // $executable->save();
+    return $view;
+
+  }
+
+
+}
diff --git a/tests/modules/views_templates_builder_test/src/Plugin/ViewsTemplateBuilder/ViewDuplicatorTest.php b/tests/modules/views_templates_builder_test/src/Plugin/ViewsTemplateBuilder/ViewDuplicatorTest.php
new file mode 100644
index 0000000..1551af5
--- /dev/null
+++ b/tests/modules/views_templates_builder_test/src/Plugin/ViewsTemplateBuilder/ViewDuplicatorTest.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * @file
+ * Contains
+ * \Drupal\views_templates_builder_test\Plugin\ViewsTemplateBuilder\ViewDuplicatorTest.
+ */
+
+
+namespace Drupal\views_templates_builder_test\Plugin\ViewsTemplateBuilder;
+
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\views_templates\Plugin\ViewsDuplicateBuilderBase;
+
+/**
+ * @Plugin(
+ *  id = "view_duplicator_test",
+ *  default_title = "Nodes List",
+ *  view_template_id = "simple_view",
+ *  module = "views_templates_builder_test",
+ *  replace_values = {
+ *    "__TITLE" = "Title Changed",
+ *    "__TITLE_ID" = "title"
+ *  }
+ * )
+ */
+class ViewDuplicatorTest extends ViewsDuplicateBuilderBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function alterViewTemplateAfterCreation(&$view_template, $options = NULL) {
+    parent::alterViewTemplateAfterCreation($view_template, $options);
+    // Make a simple change. This one goes to 11!
+    $view_template['display']['default']['display_options']['pager']['options']['items_per_page'] = $options['pager_count'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildConfigurationForm($form, FormStateInterface $form_state) {
+    $config_form['pager_count'] = [
+      '#type' => 'textfield',
+      '#title' => $this->t('Pager Count'),
+      '#default_value' => '10',
+    ];
+    return $config_form;
+  }
+
+
+}
diff --git a/tests/modules/views_templates_builder_test/views_templates/simple_view.yml b/tests/modules/views_templates_builder_test/views_templates/simple_view.yml
new file mode 100644
index 0000000..41bcc6e
--- /dev/null
+++ b/tests/modules/views_templates_builder_test/views_templates/simple_view.yml
@@ -0,0 +1,171 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - node
+    - user
+id: simplest_view
+label: '__TITLE'
+module: views
+description: 'This is a simple View'
+tag: ''
+base_table: node_field_data
+base_field: nid
+core: 8.x
+display:
+  default:
+    display_plugin: default
+    id: default
+    display_title: Master
+    position: 0
+    display_options:
+      access:
+        type: perm
+        options:
+          perm: 'access content'
+      cache:
+        type: tag
+        options: {  }
+      query:
+        type: views_query
+        options:
+          disable_sql_rewrite: false
+          distinct: false
+          replica: false
+          query_comment: ''
+          query_tags: {  }
+      exposed_form:
+        type: basic
+        options:
+          submit_button: Apply
+          reset_button: false
+          reset_button_label: Reset
+          exposed_sorts_label: 'Sort by'
+          expose_sort_order: true
+          sort_asc_label: Asc
+          sort_desc_label: Desc
+      pager:
+        type: full
+        options:
+          items_per_page: 10
+          offset: 0
+          id: 0
+          total_pages: null
+          expose:
+            items_per_page: false
+            items_per_page_label: 'Items per page'
+            items_per_page_options: '5, 10, 25, 50'
+            items_per_page_options_all: false
+            items_per_page_options_all_label: '- All -'
+            offset: false
+            offset_label: Offset
+          tags:
+            previous: '‹ Previous'
+            next: 'Next ›'
+            first: '« First'
+            last: 'Last »'
+          quantity: 9
+      style:
+        type: default
+        options:
+          grouping: {  }
+          row_class: ''
+          default_row_class: true
+          uses_fields: false
+      row:
+        type: fields
+        options:
+          inline: {  }
+          separator: ''
+          hide_empty: false
+          default_field_elements: true
+      fields:
+        __FIELD_ID:
+          id: __FIELD_ID
+          table: node_field_data
+          field: title
+          entity_type: node
+          entity_field: title
+          label: ''
+          alter:
+            alter_text: false
+            make_link: false
+            absolute: false
+            trim: false
+            word_boundary: false
+            ellipsis: false
+            strip_tags: false
+            html: false
+          hide_empty: false
+          empty_zero: false
+          settings:
+            link_to_entity: true
+          plugin_id: field
+          relationship: none
+          group_type: group
+          admin_label: ''
+          exclude: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: true
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_alter_empty: true
+          click_sort_column: value
+          type: string
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+      filters:
+        status:
+          value: true
+          table: node_field_data
+          field: status
+          plugin_id: boolean
+          entity_type: node
+          entity_field: status
+          id: status
+          expose:
+            operator: ''
+          group: 1
+      sorts:
+        created:
+          id: created
+          table: node_field_data
+          field: created
+          order: DESC
+          entity_type: node
+          entity_field: created
+          plugin_id: date
+          relationship: none
+          group_type: group
+          admin_label: ''
+          exposed: false
+          expose:
+            label: ''
+          granularity: second
+      header: {  }
+      footer: {  }
+      empty: {  }
+      relationships: {  }
+      arguments: {  }
+    cache_metadata:
+      max-age: -1
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - url.query_args
+        - 'user.node_grants:view'
+        - user.permissions
+      tags: {  }
diff --git a/tests/modules/views_templates_builder_test/views_templates_builder_test.info.yml b/tests/modules/views_templates_builder_test/views_templates_builder_test.info.yml
new file mode 100644
index 0000000..2fcfcad
--- /dev/null
+++ b/tests/modules/views_templates_builder_test/views_templates_builder_test.info.yml
@@ -0,0 +1,7 @@
+name:
+type: module
+description: Views Template Test Builder Plugin
+core: 8.x
+package: Testing
+dependencies:
+  - views_templates
diff --git a/views_templates.links.action.yml b/views_templates.links.action.yml
index 3069228..5bb9d96 100644
--- a/views_templates.links.action.yml
+++ b/views_templates.links.action.yml
@@ -1,5 +1,6 @@
 views_add_template_local_action:
-  route_name: views_templates.add
+  route_name: views_templates.list
   title: 'Add view from template'
+  weight: 100
   appears_on:
     - entity.view.collection
diff --git a/views_templates.routing.yml b/views_templates.routing.yml
index a76c7a6..a804b27 100644
--- a/views_templates.routing.yml
+++ b/views_templates.routing.yml
@@ -1,15 +1,17 @@
-views_templates.add:
-  path: '/admin/structure/views/add-template'
+views_templates.create_from_template:
+  path: '/admin/structure/views/template/{view_template}/add'
   defaults:
-    _entity_list: 'view_template'
-    _title: 'Add view from template'
+    _form: '\Drupal\views_templates\ViewTemplateForm'
+    _title: 'Create from View template'
   requirements:
-    _entity_create_access: view
+    _permission: 'administer views'
 
-entity.view_template.create_from_template:
-  path: '/admin/structure/views/template/{view_template}/add'
+views_templates.list:
+  path: '/admin/structure/views/template/list'
   defaults:
-    _entity_form: view_template.create_from_template
-    _title: 'Create from template'
+    _controller: '\Drupal\views_templates\Controller\ViewsBuilderController::templateList'
+    _title: 'Add view from template'
   requirements:
-    _entity_access: view_template.view
+    _permission: 'administer views'
+
+
diff --git a/views_templates.services.yml b/views_templates.services.yml
new file mode 100644
index 0000000..7a82df3
--- /dev/null
+++ b/views_templates.services.yml
@@ -0,0 +1,9 @@
+services:
+  plugin.manager.views_templates.builder:
+    class: Drupal\views_templates\Plugin\ViewsBuilderPluginManager
+    parent: default_plugin_manager
+
+  views_templates.loader:
+    class: Drupal\views_templates\ViewsTemplateLoader
+    arguments: []
+
