diff --git a/config/install/ultimate_cron.settings.yml b/config/install/ultimate_cron.settings.yml
index 4b8d42e..30efff2 100644
--- a/config/install/ultimate_cron.settings.yml
+++ b/config/install/ultimate_cron.settings.yml
@@ -11,13 +11,22 @@ queue:
     enabled: TRUE
     threads: 4
     threshold: 10
+default_plugins:
+  launcher: serial
+  scheduler: simple
+  logger: database
 launcher:
-  thread: 'any'
-  max_threads: 1
-  lock_timeout: 3600
-  max_execution_time: 3600
+  serial:
+    id: 'serial'
+    timeouts:
+      lock_timeout: 3600
+      max_execution_time: 3600
+    launcher:
+      thread: 1
+      max_threads: 1
 logger:
   cache:
+    id: 'cache'
     bin: 'ultimate_cron_logger'
     timeout: -1
   database:
@@ -30,4 +39,6 @@ scheduler:
     rules:
       - '*/10+@ * * * *'
   simple:
-    rule: '*/15+@ * * * *'
+    id: 'simple'
+    rules:
+      - '*/15+@ * * * *'
diff --git a/config/schema/ultimate_cron.schema.yml b/config/schema/ultimate_cron.schema.yml
index f2d1da2..fcde164 100644
--- a/config/schema/ultimate_cron.schema.yml
+++ b/config/schema/ultimate_cron.schema.yml
@@ -45,73 +45,37 @@ ultimate_cron.settings:
             threshold:
               type: integer
               label: Number of items needed for a queue
-    launcher:
+    default_plugins:
       type: mapping
-      label: Launcher
+      label: Default Plugins
       mapping:
-        thread:
+        launcher:
           type: string
-          label: Which thread to use
-        max_threads:
-          type: integer
-          label: Maximum number of threads
-        lock_timeout:
-          type: integer
-          label: Time to lock job
-        max_execution_time:
-          type: integer
-          label: Maximum time for the job to run
+          label: Launcher
+        scheduler:
+          type: string
+          label: Scheduler
+        logger:
+          type: string
+          label: Logger
+    launcher:
+      type: sequence
+      label: Launcher Settings
+      sequence:
+        type: ultimate_cron.plugin.launcher.[id]
+        label: Launcher
     logger:
-      type: mapping
-      label: Logger
-      mapping:
-        cache:
-          type: mapping
-          label: Cache
-          mapping:
-            bin:
-              type: string
-              label: The cache bin to use
-            timeout:
-              type: integer
-              label: Time until cache expires
-        database:
-          type: mapping
-          label: Database
-          mapping:
-            method:
-              type: integer
-              label: The method used for log retention
-            expire:
-              type: integer
-              label: Time until expiration
-            retain:
-              type: integer
-              label: Maximum number of logs to keep
+      type: sequence
+      label: Logger Settings
+      sequence:
+        type: ultimate_cron.plugin.logger.[id]
+        label: Launcher
     scheduler:
-      type: mapping
-      label: Schedulr
-      mapping:
-        crontab:
-          type: mapping
-          label: Crontab
-          mapping:
-            catch_up:
-              type: integer
-              label: Stop between job runs
-            rules:
-              type: sequence
-              label: Array with rules
-              sequence:
-                type: string
-                label: Formatted rule
-        simple:
-          type: mapping
-          label: Simple
-          mapping:
-            rule:
-              type: string
-              label: Rule for Simple scheduler
+      type: sequence
+      label: Schedulers Settings
+      sequence:
+        type: ultimate_cron.plugin.scheduler.[id]
+        label: Scheduler
 
 ultimate_cron.job.*:
   type: config_entity
@@ -133,37 +97,25 @@ ultimate_cron.job.*:
       type: string
       label: 'Callback'
     scheduler:
-      type: mapping
+      type: ultimate_cron.plugin.scheduler.[id]
       label: 'Scheduler'
-      mapping:
-        id:
-          type: string
-          label: 'Scheduler ID'
-        configuration:
-          type: ultimate_cron.plugin.scheduler.[%parent.id]
     launcher:
-      type: mapping
-      label: 'Scheduler'
-      mapping:
-        id:
-          type: string
-          label: 'Launcher ID'
-        configuration:
-          type: ultimate_cron.plugin.launcher.[%parent.id]
+      type: ultimate_cron.plugin.launcher.[id]
+      label: 'Launcher'
     logger:
-      type: mapping
-      label: 'Scheduler'
-      mapping:
-        id:
-          type: string
-          label: 'Logger ID'
-        configuration:
-          type: ultimate_cron.plugin.logger.[%parent.id]
+      type: ultimate_cron.plugin.logger.[id]
+      label: 'Logger'
 
-ultimate_cron.plugin.scheduler.simple:
+ultimate_cron.plugin.scheduler:
   type: mapping
   label: 'Scheduler configuration'
   mapping:
+    id:
+      type: string
+      label: 'ID'
+    uuid:
+      type: string
+      label: 'UUID'
     rules:
       type: sequence
       label: 'Scheduler rules'
@@ -171,24 +123,45 @@ ultimate_cron.plugin.scheduler.simple:
         type: string
         label: 'Scheduling rule'
 
-ultimate_cron.plugin.scheduler.crontab:
-  type: mapping
+ultimate_cron.plugin.scheduler.simple:
+  type: ultimate_cron.plugin.scheduler
   label: 'Scheduler configuration'
   mapping:
+    id:
+      type: string
+      label: 'ID'
+    uuid:
+      type: string
+      label: 'UUID'
     rules:
       type: sequence
       label: 'Scheduler rules'
       sequence:
         type: string
         label: 'Scheduling rule'
+
+ultimate_cron.plugin.scheduler.crontab:
+  type: ultimate_cron.plugin.scheduler
+  label: 'Scheduler configuration'
+  mapping:
     catch_up:
       type: integer
       label: 'Timeout (s) after job run'
 
-ultimate_cron.plugin.launcher.serial:
+ultimate_cron.plugin.launcher:
   type: mapping
   label: 'Scheduler configuration'
   mapping:
+    id:
+      type: string
+      label: 'ID'
+    uuid:
+      type: string
+      label: 'UUID'
+ultimate_cron.plugin.launcher.serial:
+  type: ultimate_cron.plugin.launcher
+  label: 'Scheduler configuration'
+  mapping:
     timeouts:
       type: mapping
       label: 'Timeout settings'
@@ -210,10 +183,20 @@ ultimate_cron.plugin.launcher.serial:
           type: integer
           label: 'Thread'
 
-ultimate_cron.plugin.logger.database:
+ultimate_cron.plugin.logger:
   type: mapping
   label: 'Scheduler configuration'
   mapping:
+    id:
+      type: string
+      label: 'ID'
+    uuid:
+      type: string
+      label: 'UUID'
+ultimate_cron.plugin.logger.database:
+  type: ultimate_cron.plugin.logger
+  label: 'Scheduler configuration'
+  mapping:
     method:
       type: string
       label: 'Method'
@@ -225,7 +208,7 @@ ultimate_cron.plugin.logger.database:
       label: 'Retain X amount of logs'
 
 ultimate_cron.plugin.logger.cache:
-  type: mapping
+  type: ultimate_cron.plugin.logger
   label: 'Scheduler configuration'
   mapping:
     bin:
diff --git a/src/CronJobDiscovery.php b/src/CronJobDiscovery.php
index 4cf74d2..3319ff9 100644
--- a/src/CronJobDiscovery.php
+++ b/src/CronJobDiscovery.php
@@ -71,9 +71,7 @@ class CronJobDiscovery {
           'callback' => 'ultimate_cron.queue_worker:queueCallback',
           'scheduler' => [
             'id' => 'simple',
-            'configuration' => [
-              'rules' => ['* * * * *'],
-            ],
+            'rules' => ['* * * * *'],
           ]
         ];
 
@@ -101,6 +99,14 @@ class CronJobDiscovery {
         'callback' => $info['callback'],
       );
 
+      /*
+      // Set defaults
+      $config = $this->configFactory->get('ultimate_cron_general_settings');
+      $values['scheduler'] = [
+        'id' => 'simple',
+        'rule' => '',
+      ];
+*/
       $job = CronJob::create($values);
 
       $job->save();
diff --git a/src/CronPlugin.php b/src/CronPlugin.php
index dad895a..afecf96 100644
--- a/src/CronPlugin.php
+++ b/src/CronPlugin.php
@@ -6,6 +6,7 @@ use Drupal\Component\Plugin\PluginInspectionInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Plugin\PluginBase;
 use Drupal\Core\Plugin\PluginFormInterface;
+use Drupal\ultimate_cron\Form\PluginSettingsFormBase;
 
 /**
  * This is the base class for all Ultimate Cron plugins.
@@ -13,7 +14,7 @@ use Drupal\Core\Plugin\PluginFormInterface;
  * This class handles all the load/save settings for a plugin as well as the
  * forms, etc.
  */
-class CronPlugin extends PluginBase implements PluginInspectionInterface, ConfigurablePluginInterface, PluginFormInterface {
+abstract class CronPlugin extends PluginBase implements PluginInspectionInterface, ConfigurablePluginInterface, PluginFormInterface {
   static public $multiple = FALSE;
   static public $instances = array();
   public $weight = 0;
@@ -29,14 +30,14 @@ class CronPlugin extends PluginBase implements PluginInspectionInterface, Config
 
   /**
    * Returns a list of plugin types.
-   * 
+   *
    * @return array
    */
   public static function getPluginTypes() {
     return array(
       'scheduler' => t('Scheduler'),
       'launcher' => t('Launcher'),
-      'logger' => t('Logger')
+      'logger' => t('Logger'),
     );
   }
 
@@ -52,7 +53,7 @@ class CronPlugin extends PluginBase implements PluginInspectionInterface, Config
    * {@inheritdoc}
    */
   public function setConfiguration(array $configuration) {
-    $this->configuration = array_merge(
+    $this->configuration = array_replace_recursive(
       $this->defaultConfiguration(),
       $configuration
     );
@@ -62,14 +63,14 @@ class CronPlugin extends PluginBase implements PluginInspectionInterface, Config
    * {@inheritdoc}
    */
   public function defaultConfiguration() {
-    return array();
+    return [];
   }
 
   /**
    * {@inheritdoc}
    */
   public function calculateDependencies() {
-    return array();
+    return [];
   }
 
   /**
@@ -268,4 +269,29 @@ class CronPlugin extends PluginBase implements PluginInspectionInterface, Config
     }
   }
 
+  /**
+   * Gets the values for configuration form from the Form State.
+   *
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *
+   * @return array
+   */
+  protected function getFormConfigurationValues(FormStateInterface $form_state) {
+    $form_object = $form_state->getFormObject();
+    $values = $form_state->getValues();
+    if ($form_object instanceof PluginSettingsFormBase) {
+      return $values['plugins'][$this->pluginId];
+    }
+    return $values[$this->getCronPluginType()];
+  }
+
+  /**
+   * Gets the cron plugin type for this plugin.
+   *
+   * @return string
+   */
+  protected function getCronPluginType() {
+    return $this->getPluginDefinition()['cron_plugin_type'];
+  }
+
 }
diff --git a/src/Entity/CronJob.php b/src/Entity/CronJob.php
index 21ab382..510dbd1 100644
--- a/src/Entity/CronJob.php
+++ b/src/Entity/CronJob.php
@@ -160,7 +160,7 @@ class CronJob extends ConfigEntityBase implements CronJobInterface {
    *   The configuration array.
    */
   public function setConfiguration($plugin_type, array $configuration) {
-    $this->{$plugin_type}['configuration'] = $configuration;
+    $this->{$plugin_type} = $configuration + ['id' => $this->{$plugin_type}['id']];
   }
 
   /**
@@ -280,8 +280,8 @@ class CronJob extends ConfigEntityBase implements CronJobInterface {
     }
     /* @var \Drupal\Core\Plugin\DefaultPluginManager $manager */
     $manager = \Drupal::service('plugin.manager.ultimate_cron.' . $plugin_type);
-    $this->plugins[$plugin_type] = $manager->createInstance($name, isset($this->{$plugin_type}['configuration']) ? $this->{$plugin_type}['configuration'] : array());
-    return $this->plugins[$plugin_type];
+    $this->plugins[$plugin_type] = $manager->createInstance($name, isset($this->{$plugin_type}) ? $this->{$plugin_type} : array());
+     return $this->plugins[$plugin_type];
   }
 
   /**
@@ -293,11 +293,11 @@ class CronJob extends ConfigEntityBase implements CronJobInterface {
    *   An array of this plugin's configuration.
    */
   public function getConfiguration($plugin_type) {
-    if (!isset($this->{$plugin_type}['configuration'])) {
-      $this->{$plugin_type}['configuration'] = $this->getPlugin($plugin_type)->defaultConfiguration();
+    if(!isset($this->{$plugin_type})) {
+      $this->{$plugin_type} = $this->getPlugin($plugin_type)->defaultConfiguration();
     }
 
-    return $this->{$plugin_type}['configuration'];
+    return $this->{$plugin_type};
   }
 
   /**
@@ -807,7 +807,7 @@ class CronJob extends ConfigEntityBase implements CronJobInterface {
    * {@inheritdoc}
    */
   public function getSchedulerId() {
-    return $this->scheduler;
+    return $this->scheduler['id'];
   }
 
   /**
diff --git a/src/Form/CronJobForm.php b/src/Form/CronJobForm.php
index 52ab17b..832deb6 100644
--- a/src/Form/CronJobForm.php
+++ b/src/Form/CronJobForm.php
@@ -4,6 +4,7 @@ namespace Drupal\ultimate_cron\Form;
 
 use Drupal\Core\Entity\EntityForm;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Render\Element;
 use Drupal\ultimate_cron\CronPlugin;
 use Drupal\ultimate_cron\CronRule;
 
@@ -127,6 +128,11 @@ class CronJobForm extends EntityForm {
       $form[$plugin_type]['configuration'] = $plugin->buildConfigurationForm($temp_form, $form_state);
       $form[$plugin_type]['configuration']['#prefix'] = '<div id="' . $plugin_type . '_settings' . '">';
       $form[$plugin_type]['configuration']['#suffix'] = '</div>';
+      // Set parents to under 'configuration' to be the $plugin_type
+      // 'configuration' is not in the schema
+      foreach (Element::children($form[$plugin_type]['configuration']) as $key) {
+        $form[$plugin_type]['configuration']['#parents'] = [$plugin_type];
+      }
     }
 
     //$form['#attached']['js'][] = drupal_get_path('module', 'ultimate_cron') . '/js/ultimate_cron.job.js';
@@ -152,7 +158,6 @@ class CronJobForm extends EntityForm {
     parent::validateForm($form, $form_state);
 
     $this->entity->getPlugin('scheduler')->validateConfigurationForm($form, $form_state);
-
   }
 
   /**
diff --git a/src/Form/LauncherSettingsForm.php b/src/Form/LauncherSettingsForm.php
index 4099cba..ea9c275 100644
--- a/src/Form/LauncherSettingsForm.php
+++ b/src/Form/LauncherSettingsForm.php
@@ -1,17 +1,19 @@
 <?php
 
 namespace Drupal\ultimate_cron\Form;
-use Drupal\Core\Form\ConfigFormBase;
-use Drupal\Core\Form\FormStateInterface;
 
 /**
  * Form for launcher settings.
  */
-class LauncherSettingsForm extends ConfigFormBase {
+class LauncherSettingsForm extends PluginSettingsFormBase {
 
   /**
    * {@inheritdoc}
    */
+  const CRON_PLUGIN_TYPE = 'launcher';
+  /**
+   * {@inheritdoc}
+   */
   public function getFormId() {
     return 'ultimate_cron_launcher_settings';
   }
@@ -23,76 +25,4 @@ class LauncherSettingsForm extends ConfigFormBase {
     return ['ultimate_cron.settings'];
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function buildForm(array $form, FormStateInterface $form_state) {
-    $values = $this->config('ultimate_cron.settings');
-
-    $form['timeouts'] = [
-      '#type' => 'fieldset',
-      '#title' => t('Timeouts'),
-    ];
-    $form['launcher'] = [
-      '#type' => 'fieldset',
-      '#title' => t('Launching options'),
-    ];
-    $form['timeouts']['lock_timeout'] = [
-      '#title' => t('Job lock timeout'),
-      '#type' => 'textfield',
-      '#default_value' => $values->get('launcher.lock_timeout'),
-      '#description' => t('Number of seconds to keep lock on job.'),
-      '#fallback' => TRUE,
-      '#required' => TRUE,
-    ];
-    $form['timeouts']['max_execution_time'] = [
-      '#title' => t('Maximum execution time'),
-      '#type' => 'textfield',
-      '#default_value' => $values->get('launcher.max_execution_time'),
-      '#description' => t('Maximum execution time for a cron run in seconds.'),
-      '#fallback' => TRUE,
-      '#required' => TRUE,
-    ];
-    $form['launcher']['max_threads'] = [
-      '#title' => t('Maximum number of launcher threads'),
-      '#type' => 'textfield',
-      '#default_value' => $values->get('launcher.max_threads'),
-      '#description' => t('The maximum number of launch threads that can be running at any given time.'),
-      '#fallback' => TRUE,
-      '#required' => TRUE,
-      '#weight' => 1,
-    ];
-
-    $options = ['any', '-- fixed --', '1'];
-
-    $form['launcher']['thread'] = [
-      '#title' => t('Run in thread'),
-      '#type' => 'select',
-      '#default_value' => $values->get('thread'),
-      '#options' => $options,
-      '#description' => t('Which thread to run jobs in.') . '<br/>' .
-        t('<strong>Any</strong>: Just use any available thread') . '<br/>' .
-        t('<strong>Fixed</strong>: Only run in one specific thread. The maximum number of threads is spread across the jobs.') . '<br/>' .
-        t('<strong>1-?</strong>: Only run when a specific thread is invoked. This setting only has an effect when cron is run through cron.php with an argument ?thread=N or through Drush with --options=thread=N.'),
-      '#fallback' => TRUE,
-      '#required' => TRUE,
-      '#weight' => 2,
-    ];
-
-    return parent::buildForm($form, $form_state);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function submitForm(array &$form, FormStateInterface $form_state) {
-    $this->config('ultimate_cron.settings')
-      ->set('launcher.lock_timeout', $form_state->getValue('lock_timeout'))
-      ->set('launcher.max_threads', $form_state->getValue('max_threads'))
-      ->set('launcher.thread', $form_state->getValue('thread'))
-      ->save();
-
-    parent::submitForm($form, $form_state);
-  }
-
 }
diff --git a/src/Form/LoggerSettingsForm.php b/src/Form/LoggerSettingsForm.php
index 009b10b..3ff8caf 100644
--- a/src/Form/LoggerSettingsForm.php
+++ b/src/Form/LoggerSettingsForm.php
@@ -1,126 +1,22 @@
 <?php
 
 namespace Drupal\ultimate_cron\Form;
-use Drupal\Core\Form\ConfigFormBase;
-use Drupal\Core\Form\FormStateInterface;
 
 /**
  * Form for logger settings.
  */
-class LoggerSettingsForm extends ConfigFormBase {
+class LoggerSettingsForm extends PluginSettingsFormBase {
 
   /**
    * {@inheritdoc}
    */
-  public function getFormId() {
-    return 'ultimate_cron_logger_settings';
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function getEditableConfigNames() {
-    return ['ultimate_cron.settings'];
-  }
+  const CRON_PLUGIN_TYPE = 'logger';
 
   /**
    * {@inheritdoc}
    */
-  public function buildForm(array $form, FormStateInterface $form_state) {
-    $config = $this->config('ultimate_cron.settings');
-
-    // Setup vertical tabs.
-    $form['settings_tabs'] = [
-      '#type' => 'vertical_tabs',
-    ];
-
-    // Settings for Cache logger.
-    $form['cache'] = [
-      '#type' => 'details',
-      '#title' => t('Cache'),
-      '#group' => 'settings_tabs',
-      '#tree' => TRUE,
-    ];
-
-    $form['cache']['bin'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Cache bin'),
-      '#description' => t('Select which cache bin to use for storing logs.'),
-      '#default_value' => $config->get('logger.cache.bin'),
-      '#fallback' => TRUE,
-      '#required' => TRUE,
-    );
-    $form['cache']['timeout'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Cache timeout'),
-      '#description' => t('Seconds before cache entry expires (0 = never, -1 = on next general cache wipe).'),
-      '#default_value' => $config->get('logger.cache.timeout'),
-      '#fallback' => TRUE,
-      '#required' => TRUE,
-    );
-
-    // Settings for Database logger.
-    $form['database'] = [
-      '#type' => 'details',
-      '#title' => t('Database'),
-      '#group' => 'settings_tabs',
-      '#tree' => TRUE,
-    ];
-    $options['method'] = [
-      1 => t('Disabled'),
-      2 => t('Remove logs older than a specified age'),
-      3 => t('Retain only a specific amount of log entries'),
-    ];
-    $form['database']['method'] = array(
-      '#type' => 'select',
-      '#title' => t('Log entry cleanup method'),
-      '#description' => t('Select which method to use for cleaning up logs.'),
-      '#options' => $options['method'],
-      '#default_value' => $config->get('logger.database.method'),
-      '#fallback' => TRUE,
-      '#required' => TRUE,
-    );
-
-    $states = array('expire' => array(), 'retain' => array());
-    $form['database']['method_expire'] = array(
-      '#type' => 'fieldset',
-      '#title' => t('Remove logs older than a specified age'),
-    ) + $states['expire'];
-    $form['database']['method_expire']['expire'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Log entry expiration'),
-      '#description' => t('Remove log entries older than X seconds.'),
-      '#default_value' => $config->get('logger.database.expire'),
-      '#fallback' => TRUE,
-      '#required' => TRUE,
-    ) + $states['expire'];
-
-    $form['database']['method_retain'] = array(
-      '#type' => 'fieldset',
-      '#title' => t('Retain only a specific amount of log entries'),
-    ) + $states['retain'];
-    $form['database']['method_retain']['retain'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Retain logs'),
-      '#description' => t('Retain X amount of log entries.'),
-      '#default_value' => $config->get('logger.database.retain'),
-      '#fallback' => TRUE,
-      '#required' => TRUE,
-    ) + $states['retain'];
-
-    return parent::buildForm($form, $form_state);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function submitForm(array &$form, FormStateInterface $form_state) {
-    $this->config('ultimate_cron.settings')
-      ->set('logger.cache', $form_state->getValue('cache'))
-      ->set('logger.database', $form_state->getValue('database'))
-      ->save('');
-
-    parent::submitForm($form, $form_state);
+  public function getFormId() {
+    return 'ultimate_cron_logger_settings';
   }
 
 }
diff --git a/src/Form/PluginSettingsFormBase.php b/src/Form/PluginSettingsFormBase.php
new file mode 100644
index 0000000..ec59d34
--- /dev/null
+++ b/src/Form/PluginSettingsFormBase.php
@@ -0,0 +1,151 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\ultimate_cron\Form\PluginSettingsFormBase.
+ */
+
+namespace Drupal\ultimate_cron\Form;
+
+
+use Drupal\Component\Plugin\PluginManagerInterface;
+use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Form\ConfigFormBase;
+use Drupal\Core\Form\FormStateInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Base form for all plugin general settings forms.
+ */
+abstract class PluginSettingsFormBase extends ConfigFormBase {
+
+
+  /**
+   * The type of plugin this form should handle.
+   *
+   * @var string
+   */
+  const CRON_PLUGIN_TYPE = '';
+
+  /**
+   * @var \Drupal\Component\Plugin\PluginManagerInterface
+   */
+  protected $pluginManager;
+
+  /**
+   * PluginSettingsFormBase constructor.
+   *
+   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
+   * @param \Drupal\Component\Plugin\PluginManagerInterface $plugin_manager
+   */
+  public function __construct(ConfigFactoryInterface $config_factory, PluginManagerInterface $plugin_manager) {
+    parent::__construct($config_factory);
+    $this->pluginManager = $plugin_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('config.factory'),
+      $container->get('plugin.manager.ultimate_cron.' . static::CRON_PLUGIN_TYPE)
+    );
+  }
+
+
+  /**
+   * Get all plugins for this form.
+   *
+   * @return \Drupal\ultimate_cron\CronPlugin[]
+   */
+  protected function getPlugins() {
+    $definitions = $this->pluginManager->getDefinitions();
+    /** @var \Drupal\ultimate_cron\CronPlugin[] $plugins */
+    $plugins = [];
+    $config = $this->config('ultimate_cron.settings');
+    $plugins_settings = $config->get(static::CRON_PLUGIN_TYPE) ?: [];
+    foreach ($definitions as $id => $definition) {
+      $config = isset($plugins_settings[$id]) ? $plugins_settings[$id] : [];
+      $plugins[$id] = $this->pluginManager->createInstance($id, $config);
+    }
+    return $plugins;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getEditableConfigNames() {
+    return ['ultimate_cron.settings'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, FormStateInterface $form_state) {
+    $config = $this->config('ultimate_cron.settings');
+    $plugins = $this->getPlugins();
+    $form['settings_tabs'] = array(
+      '#type' => 'vertical_tabs',
+    );
+
+    $default_options = [];
+    $form['plugins'] = [
+      '#tree' => TRUE,
+    ];
+    foreach ($plugins as $id => $plugin) {
+      $definition = $plugin->getPluginDefinition();
+      $default_options[$id] = $definition['title'];
+
+      $form['plugins'][$id] = [
+        '#type' => 'details',
+        '#title' => $definition['title'],
+        '#group' => 'settings_tabs',
+        '#tree' => TRUE,
+      ];
+      $form['plugins'][$id] += $plugin->buildConfigurationForm([], $form_state);
+      $form['plugins'][$id]['id'] = [
+        '#type' => 'value',
+        '#value' => $id,
+      ];
+    }
+    $form['default_plugin'] = [
+      '#type' => 'select',
+      '#title' => $this->t('Default Plugin'),
+      '#options' => $default_options,
+      '#default_value' => $config->get('default_plugins.' . static::CRON_PLUGIN_TYPE),
+      '#weight' => -100,
+    ];
+    return parent::buildForm($form, $form_state);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateForm(array &$form, FormStateInterface $form_state) {
+    parent::validateForm($form, $form_state);
+    $plugins = $this->getPlugins();
+    // Validate each plugin form.
+    foreach ($plugins as $plugin) {
+      $plugin->validateConfigurationForm($form, $form_state);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    $form_state->cleanValues();
+    $config = $this->config('ultimate_cron.settings');
+    $values = $form_state->getValues();
+    // Set the default plugin for this type.
+    $config->set('default_plugins.' . static::CRON_PLUGIN_TYPE, $values['default_plugin']);
+    $config->save();
+    $plugins = $this->getPlugins();
+    // Submit each plugin form.
+    foreach ($plugins as $plugin) {
+      $plugin->submitConfigurationForm($form, $form_state);
+    }
+    parent::submitForm($form, $form_state);
+  }
+
+}
diff --git a/src/Form/SchedulerSettingsForm.php b/src/Form/SchedulerSettingsForm.php
index c9bdc71..cdfaea5 100644
--- a/src/Form/SchedulerSettingsForm.php
+++ b/src/Form/SchedulerSettingsForm.php
@@ -2,118 +2,21 @@
 
 namespace Drupal\ultimate_cron\Form;
 
-use Drupal\Core\Form\ConfigFormBase;
-use Drupal\Core\Form\FormStateInterface;
-
 /**
  * Form for scheduler settings.
  */
-class SchedulerSettingsForm extends ConfigFormBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getFormId() {
-    return 'ultimate_cron_scheduler_settings';
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function getEditableConfigNames() {
-    return ['ultimate_cron.settings'];
-  }
+class SchedulerSettingsForm extends PluginSettingsFormBase {
 
   /**
    * {@inheritdoc}
    */
-  public function buildForm(array $form, FormStateInterface $form_state) {
-    $values = $this->config('ultimate_cron.settings');
-    $rules = is_array($values->get('rules')) ? implode(';', $values->get('rules')) : '';
-
-    // Setup vertical tabs.
-    $form['settings_tabs'] = array(
-      '#type' => 'vertical_tabs',
-    );
-
-    // Settings for crontab.
-    $form['crontab'] = [
-      '#type' => 'details',
-      '#title' => 'Crontab',
-      '#group' => 'settings_tabs',
-      '#tree' => TRUE,
-    ];
-
-    $form['crontab']['catch_up'] = array(
-      '#title' => t("Catch up"),
-      '#type' => 'textfield',
-      '#default_value' => $values->get('catch_up'),
-      '#description' => t("Don't run job after X seconds of rule."),
-      '#fallback' => TRUE,
-      '#required' => TRUE,
-    );
-
-    $form['crontab']['rules'] = array(
-      '#title' => t("Rules"),
-      '#type' => 'textfield',
-      '#default_value' => $rules,
-      '#description' => t('Semi-colon separated list of crontab rules.'),
-      '#fallback' => TRUE,
-      '#required' => TRUE,
-      '#element_validate' => array('ultimate_cron_plugin_crontab_element_validate_rule'),
-    );
-    $form['crontab']['rules_help'] = array(
-      '#type' => 'fieldset',
-      '#title' => t('Rules help'),
-      '#collapsible' => TRUE,
-      '#collapsed' => TRUE,
-    );
-    $form['crontab']['rules_help']['info'] = array(
-      '#markup' => file_get_contents(drupal_get_path('module', 'ultimate_cron') . '/help/rules.html'),
-    );
-
-    // Settings for Simple scheduler.
-    $form['simple'] = [
-      '#type' => 'details',
-      '#title' => t('Simple'),
-      '#group' => 'settings_tabs',
-      '#tree' => TRUE,
-    ];
-
-    $options = [
-      '* * * * *' => 'Every minute',
-      '*/15+@ * * * *' => 'Every 15 minutes',
-      '*/30+@ * * * *' => 'Every 30 minutes',
-      '0+@ * * * *' => 'Every hour',
-      '0+@ */3 * * *' => 'Every 3 hours',
-      '0+@ */6 * * *' => 'Every 6 hours',
-      '0+@ */12 * * *' => 'Every 12 hours',
-      '0+@ 0 * * *' => 'Every day',
-      '0+@ 0 * * 0' => 'Every week',
-    ];
-    $form['simple']['rule'] = array(
-      '#type' => 'select',
-      '#title' => t('Run cron every'),
-      '#default_value' => $values->get('rule'),
-      '#description' => t('Select the interval you wish cron to run on.'),
-      '#options' => $options,
-      '#fallback' => TRUE,
-      '#required' => TRUE,
-    );
-
-    parent::buildForm($form, $form_state);
-  }
+  const CRON_PLUGIN_TYPE = 'scheduler';
 
   /**
    * {@inheritdoc}
    */
-  public function submitForm(array &$form, FormStateInterface $form_state) {
-    $this->config('ultimate_cron.settings')
-      ->set('scheduler.crontab', $form_state->getValue('crontab'))
-      ->set('scheduler.simple', explode(';', $form_state->getValue('simple')))
-      ->save();
-
-    parent::submitForm($form, $form_state);
+  public function getFormId() {
+    return 'ultimate_cron_scheduler_settings';
   }
 
 }
diff --git a/src/Launcher/LauncherManager.php b/src/Launcher/LauncherManager.php
index bea3cb4..267aac0 100644
--- a/src/Launcher/LauncherManager.php
+++ b/src/Launcher/LauncherManager.php
@@ -4,12 +4,12 @@ namespace Drupal\ultimate_cron\Launcher;
 
 use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
-use Drupal\Core\Plugin\DefaultPluginManager;
+use Drupal\ultimate_cron\PluginManagerBase;
 
 /**
  * A plugin manager for launcher plugins.
  */
-class LauncherManager extends DefaultPluginManager {
+class LauncherManager extends PluginManagerBase {
 
   /**
    * Constructs a LauncherManager object.
@@ -28,4 +28,11 @@ class LauncherManager extends DefaultPluginManager {
     $this->setCacheBackend($cache_backend, 'ultimate_cron_launcher');
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  protected function pluginType() {
+    return 'launcher';
+  }
+
 }
diff --git a/src/Logger/LoggerManager.php b/src/Logger/LoggerManager.php
index 0ac89d9..98a7d4c 100644
--- a/src/Logger/LoggerManager.php
+++ b/src/Logger/LoggerManager.php
@@ -5,12 +5,12 @@ namespace Drupal\ultimate_cron\Logger;
 use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Language\LanguageManager;
-use Drupal\Core\Plugin\DefaultPluginManager;
+use Drupal\ultimate_cron\PluginManagerBase;
 
 /**
  * A plugin manager for logger plugins.
  */
-class LoggerManager extends DefaultPluginManager {
+class LoggerManager extends PluginManagerBase {
 
   /**
    * Constructs a LoggerManager object.
@@ -29,4 +29,11 @@ class LoggerManager extends DefaultPluginManager {
     $this->setCacheBackend($cache_backend, 'ultimate_cron_logger');
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  protected function pluginType() {
+    return 'logger';
+  }
+
 }
diff --git a/src/Plugin/ultimate_cron/Launcher/SerialLauncher.php b/src/Plugin/ultimate_cron/Launcher/SerialLauncher.php
index 7c1beee..5992124 100644
--- a/src/Plugin/ultimate_cron/Launcher/SerialLauncher.php
+++ b/src/Plugin/ultimate_cron/Launcher/SerialLauncher.php
@@ -50,71 +50,63 @@ class SerialLauncher extends LauncherBase implements PluginCleanupInterface {
    * {@inheritdoc}
    */
   public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
-    $form['timeouts'] = array(
+
+    $form['timeouts'] = [
       '#type' => 'fieldset',
-      '#title' => t('Timeouts'),
-    );
+      '#title' => $this->t('Timeouts'),
+    ];
 
-    $form['launcher'] = array(
+    $form['launcher'] = [
       '#type' => 'fieldset',
-      '#title' => t('Launching options'),
-    );
+      '#title' => $this->t('Launching options'),
+    ];
 
-    $form['timeouts']['lock_timeout'] = array(
-      '#title' => t("Job lock timeout"),
+    $form['timeouts']['lock_timeout'] = [
+      '#title' => $this->t("Job lock timeout"),
       '#type' => 'textfield',
       '#default_value' => $this->configuration['timeouts']['lock_timeout'],
-      '#description' => t('Number of seconds to keep lock on job.'),
+      '#description' => $this->t('Number of seconds to keep lock on job.'),
       '#fallback' => TRUE,
       '#required' => TRUE,
-    );
-
-    // @todo: Figure this out when converting global settings to use plugin
-    // classes.
-    if (FALSE) {
-      $form['timeouts']['max_execution_time'] = array(
-        '#title' => t("Maximum execution time"),
-        '#type' => 'textfield',
-        '#default_value' => $this->configuration['timeouts']['max_execution_time'],
-        '#description' => t('Maximum execution time for a cron run in seconds.'),
-        '#fallback' => TRUE,
-        '#required' => TRUE,
-      );
-      $form['launcher']['max_threads'] = array(
-        '#title' => t("Maximum number of launcher threads"),
-        '#type' => 'number',
-        '#default_value' => $this->configuration['launcher']['max_threads'],
-        '#description' => t('The maximum number of launch threads that can be running at any given time.'),
-        '#fallback' => TRUE,
-        '#required' => TRUE,
-        '#weight' => 1,
-      );
+    ];
 
-      return $form;
-    }
-    else {
-      $max_threads = isset($this->configuration['launcher']['max_threads']) ? $this->configuration['launcher']['max_threads'] : 1;
-    }
-
-    $options = array(
-      'any' => t('-- Any -- '),
-      'fixed' => t('-- Fixed -- '),
-    );
+    $form['timeouts']['max_execution_time'] = [
+      '#title' => $this->t("Maximum execution time"),
+      '#type' => 'textfield',
+      '#default_value' => $this->configuration['timeouts']['max_execution_time'],
+      '#description' => $this->t('Maximum execution time for a cron run in seconds.'),
+      '#fallback' => TRUE,
+      '#required' => TRUE,
+    ];
+    $form['launcher']['max_threads'] = [
+      '#title' => $this->t("Maximum number of launcher threads"),
+      '#type' => 'number',
+      '#default_value' => $this->configuration['launcher']['max_threads'],
+      '#description' => $this->t('The maximum number of launch threads that can be running at any given time.'),
+      '#fallback' => TRUE,
+      '#required' => TRUE,
+      '#weight' => 1,
+    ];
+    $max_threads = isset($this->configuration['launcher']['max_threads']) ? $this->configuration['launcher']['max_threads'] : 1;
+    $options = [
+      'any' => $this->t('-- Any -- '),
+      'fixed' => $this->t('-- Fixed -- '),
+    ];
     for ($i = 1; $i <= $max_threads; $i++) {
       $options[$i] = $i;
     }
 
-
-    $form['launcher']['thread'] = array(
-      '#title' => t("Run in thread"),
+    $form['launcher']['thread'] = [
+      '#title' => $this->t("Run in thread"),
       '#type' => 'select',
       '#default_value' => isset($this->configuration['launcher']['thread']) ? $this->configuration['launcher']['thread'] : 'any',
       '#options' => $options,
-      '#description' => t('Which thread to run in when invoking with ?thread=N. Note: This setting only has an effect when cron is run through cron.php with an argument ?thread=N or through Drush with --options=thread=N.'),
+      '#description' => $this->t('Which thread to run in when invoking with ?thread=N. Note: This setting only has an effect when cron is run through cron.php with an argument ?thread=N or through Drush with --options=thread=N.'),
       '#fallback' => TRUE,
       '#required' => TRUE,
       '#weight' => 2,
-    );
+    ];
+
     return $form;
   }
 
@@ -122,18 +114,32 @@ class SerialLauncher extends LauncherBase implements PluginCleanupInterface {
    * {@inheritdoc}
    */
   public function settingsFormValidate(&$form, &$form_state, $job = NULL) {
-    $elements = & $form['configuration'][$this->type][$this->name];
-    $values = & $form_state['values']['configuration'][$this->type][$this->name];
+    $elements = &$form['configuration'][$this->type][$this->name];
+    $values = &$form_state['values']['configuration'][$this->type][$this->name];
     if (!$job) {
       if (intval($values['max_threads']) <= 0) {
-        form_set_error("settings[$this->type][$this->name", t('%title must be greater than 0', array(
-          '%title' => $elements['launcher']['max_threads']['#title']
-        )));
+        form_set_error("settings[$this->type][$this->name", $this->t('%title must be greater than 0', [
+          '%title' => $elements['launcher']['max_threads']['#title'],
+        ]));
       }
     }
   }
 
   /**
+   *
+   */
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
+    $form_state->cleanValues();
+    $defination = $this->getPluginDefinition();
+    $config = \Drupal::service('config.factory')
+      ->getEditable('ultimate_cron.settings');
+    $values = $form_state->getValues()['plugins'][$this->pluginId];
+    $config->set($defination['cron_plugin_type'] . "." . $this->pluginId, $values)
+      ->save();
+    parent::submitConfigurationForm($form, $form_state);
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function lock(CronJobInterface $job) {
@@ -201,12 +207,12 @@ class SerialLauncher extends LauncherBase implements PluginCleanupInterface {
     \Drupal::moduleHandler()->invokeAll('cron_pre_launch', array($this));
 
     if ($this->currentThread) {
-      $init_message = t('Launched in thread @current_thread', array(
+      $init_message = $this->t('Launched in thread @current_thread', array(
         '@current_thread' => $this->currentThread,
       ));
     }
     else {
-      $init_message = t('Launched manually');
+      $init_message = $this->t('Launched manually');
     }
 
     // Run job.
@@ -318,16 +324,16 @@ class SerialLauncher extends LauncherBase implements PluginCleanupInterface {
     $lock_name = 'ultimate_cron_serial_launcher_' . $thread;
     foreach ($jobs as $job) {
       $configuration = $job->getConfiguration('launcher');
-      $configuration['launcher'] += array(
+      $configuration += array(
         'thread' => 'any',
       );
-      switch ($configuration['launcher']['thread']) {
+      switch ($configuration['thread']) {
         case 'any':
-          $configuration['launcher']['thread'] = $thread;
+          $configuration['thread'] = $thread;
           break;
 
         case 'fixed':
-          $configuration['launcher']['thread'] = ($job->getUniqueID() % $configuration['launcher']['max_threads']) + 1;
+          $configuration['thread'] = ($job->getUniqueID() % $configuration['max_threads']) + 1;
           break;
       }
       if ((!self::getGlobalOption('thread') || $configuration['launcher']['thread'] == $thread) && $job->isScheduled()) {
diff --git a/src/Plugin/ultimate_cron/Logger/CacheLogger.php b/src/Plugin/ultimate_cron/Logger/CacheLogger.php
index a97070c..e961092 100644
--- a/src/Plugin/ultimate_cron/Logger/CacheLogger.php
+++ b/src/Plugin/ultimate_cron/Logger/CacheLogger.php
@@ -85,27 +85,51 @@ class CacheLogger extends LoggerBase implements ContainerFactoryPluginInterface
    * {@inheritdoc}
    */
   public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
-    $form['bin'] = array(
+    $plugin_id = $this->pluginId;
+    $defination = $this->getPluginDefinition();
+    $form['logger_default']['#options'][$plugin_id] = $defination['title'];
+
+    $form = [
+      '#type' => 'fieldset',
+      '#title' => $defination['title'],
+      '#tree' => TRUE,
+    ];
+
+    $form['bin'] = [
       '#type' => 'textfield',
       '#title' => t('Cache bin'),
       '#description' => t('Select which cache bin to use for storing logs.'),
       '#default_value' => $this->configuration['bin'],
       '#fallback' => TRUE,
       '#required' => TRUE,
-    );
+    ];
 
-    $form['timeout'] = array(
+    $form['timeout'] = [
       '#type' => 'textfield',
       '#title' => t('Cache timeout'),
       '#description' => t('Seconds before cache entry expires (0 = never, -1 = on next general cache wipe).'),
       '#default_value' => $this->configuration['timeout'],
       '#fallback' => TRUE,
       '#required' => TRUE,
-    );
+    ];
 
     return $form;
   }
 
+   /**
+    * {@inheritdoc}
+    */
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
+    $form_state->cleanValues();
+    $defination = $this->getPluginDefinition();
+    $config = \Drupal::service('config.factory')
+      ->getEditable('ultimate_cron.settings');
+    $values = $form_state->getValues()['plugins'][$this->pluginId];
+    $config->set($defination['cron_plugin_type'] . "." . $this->pluginId, $values)
+      ->save();
+    parent::submitConfigurationForm($form, $form_state);
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/src/Plugin/ultimate_cron/Logger/DatabaseLogger.php b/src/Plugin/ultimate_cron/Logger/DatabaseLogger.php
index dbd5dfb..badc2a8 100644
--- a/src/Plugin/ultimate_cron/Logger/DatabaseLogger.php
+++ b/src/Plugin/ultimate_cron/Logger/DatabaseLogger.php
@@ -170,6 +170,16 @@ class DatabaseLogger extends LoggerBase implements PluginCleanupInterface, Conta
    * {@inheritdoc}
    */
   public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+    $plugin_id = $this->pluginId;
+    $defination = $this->getPluginDefinition();
+    $form['logger_default']['#options'][$plugin_id] = $defination['title'];
+
+    $form = [
+      '#type' => 'fieldset',
+      '#title' => $defination['title'],
+      '#tree' => TRUE,
+    ];
+
     $form['method'] = array(
       '#type' => 'select',
       '#title' => t('Log entry cleanup method'),
@@ -209,11 +219,24 @@ class DatabaseLogger extends LoggerBase implements PluginCleanupInterface, Conta
         ),
       ),
     );
-
     return $form;
   }
 
   /**
+   *
+   */
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
+    $form_state->cleanValues();
+    $defination = $this->getPluginDefinition();
+    $config = \Drupal::service('config.factory')
+      ->getEditable('ultimate_cron.settings');
+    $values = $form_state->getValues()['plugins'][$this->pluginId];
+    $config->set($defination['cron_plugin_type'] . "." . $this->pluginId, $values)
+      ->save();
+    parent::submitConfigurationForm($form, $form_state);
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function load($name, $lock_id = NULL, array $log_types = [ULTIMATE_CRON_LOG_TYPE_NORMAL]) {
@@ -298,7 +321,7 @@ class DatabaseLogger extends LoggerBase implements PluginCleanupInterface, Conta
     $log_entries = array();
     while ($object = $result->fetchObject(LogEntry::class, array(
       $name,
-      $this
+      $this,
     ))) {
       $log_entries[$object->lid] = $object;
     }
diff --git a/src/Plugin/ultimate_cron/Scheduler/Crontab.php b/src/Plugin/ultimate_cron/Scheduler/Crontab.php
index ae1d513..1b7fd73 100644
--- a/src/Plugin/ultimate_cron/Scheduler/Crontab.php
+++ b/src/Plugin/ultimate_cron/Scheduler/Crontab.php
@@ -3,7 +3,6 @@
 namespace Drupal\ultimate_cron\Plugin\ultimate_cron\Scheduler;
 
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\ultimate_cron\CronJobInterface;
 use Drupal\ultimate_cron\CronRule;
 use Drupal\ultimate_cron\Entity\CronJob;
 
@@ -19,6 +18,7 @@ use Drupal\ultimate_cron\Entity\CronJob;
 class Crontab extends SchedulerBase {
   /**
    * Default settings.
+   *
    * @todo: $catch_up is randomly failing when value is low in some situation. 0 value is ignoring catch_up checks.
    */
   public function defaultConfiguration() {
@@ -55,7 +55,7 @@ class Crontab extends SchedulerBase {
       }
     }
     $parsed .= t('Next scheduled run at @datetime', array(
-      '@datetime' => format_date($next_schedule, 'custom', 'Y-m-d H:i:s')
+      '@datetime' => format_date($next_schedule, 'custom', 'Y-m-d H:i:s'),
     ));
     return $parsed;
   }
@@ -67,12 +67,12 @@ class Crontab extends SchedulerBase {
     $form['rules'][0] = array(
       '#title' => t("Rules"),
       '#type' => 'textfield',
-      '#default_value' =>  $this->configuration['rules'],
+      '#default_value' => $this->configuration['rules'],
       '#description' => t('Comma separated list of crontab rules.'),
       '#fallback' => TRUE,
       '#required' => TRUE,
       // @todo: check this out.
-      //'#element_validate' => array('ultimate_cron_plugin_crontab_element_validate_rule'),
+      // '#element_validate' => array('ultimate_cron_plugin_crontab_element_validate_rule'),
     );
 
     $form['rules_help'] = array(
@@ -103,7 +103,8 @@ class Crontab extends SchedulerBase {
    */
   public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
     parent::validateConfigurationForm($form, $form_state);
-    $rule = $form_state->getValues()['scheduler']['configuration']['rules'][0];
+    $values = $this->getFormConfigurationValues($form_state);
+    $rule = $values['rules'][0];
     $cron = CronRule::factory($rule);
     if (!$cron->isValid()) {
       $form_state->setErrorByName('scheduler][configuration][rules][0', t('Rule is invalid'));
@@ -111,6 +112,20 @@ class Crontab extends SchedulerBase {
   }
 
   /**
+   *
+   */
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
+    $form_state->cleanValues();
+    $defination = $this->getPluginDefinition();
+    $config = \Drupal::service('config.factory')
+      ->getEditable('ultimate_cron.settings');
+    $values = $form_state->getValues()['plugins'][$this->pluginId];
+    $config->set($defination['cron_plugin_type'] . "." . $this->pluginId, $values)
+      ->save();
+    parent::submitConfigurationForm($form, $form_state);
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function settingsFormSubmit(&$form, &$form_state, CronJob $job = NULL) {
@@ -190,4 +205,5 @@ class Crontab extends SchedulerBase {
   protected function getSkew(CronJob $job) {
     return $job->getUniqueID() & 0xff;
   }
+
 }
diff --git a/src/Plugin/ultimate_cron/Scheduler/Simple.php b/src/Plugin/ultimate_cron/Scheduler/Simple.php
index b65b217..d64f568 100644
--- a/src/Plugin/ultimate_cron/Scheduler/Simple.php
+++ b/src/Plugin/ultimate_cron/Scheduler/Simple.php
@@ -2,7 +2,6 @@
 
 namespace Drupal\ultimate_cron\Plugin\ultimate_cron\Scheduler;
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\ultimate_cron\CronRule;
 use Drupal\ultimate_cron\Entity\CronJob;
 
 /**
@@ -77,4 +76,19 @@ class Simple extends Crontab {
 
     return $form;
   }
+
+  /**
+   *
+   */
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
+    $form_state->cleanValues();
+    $defination = $this->getPluginDefinition();
+    $config = \Drupal::service('config.factory')
+      ->getEditable('ultimate_cron.settings');
+    $values = $form_state->getValues()['plugins'][$this->pluginId];
+    $config->set($defination['cron_plugin_type'] . "." . $this->pluginId, $values)
+      ->save();
+    parent::submitConfigurationForm($form, $form_state);
+  }
+
 }
diff --git a/src/PluginManagerBase.php b/src/PluginManagerBase.php
new file mode 100644
index 0000000..2ca2dd8
--- /dev/null
+++ b/src/PluginManagerBase.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\ultimate_cron\PluginManagerBase.
+ */
+
+namespace Drupal\ultimate_cron;
+
+use Drupal\Core\Plugin\DefaultPluginManager;
+
+abstract class PluginManagerBase extends DefaultPluginManager{
+
+  /**
+   * {@inheritdoc}
+   *
+   * Override to add cron_plugin_type.
+   */
+  public function getDefinitions() {
+    $definitions = parent::getDefinitions();
+    foreach ($definitions as &$definition) {
+      $definition['cron_plugin_type'] = $this->pluginType();
+    }
+    return $definitions;
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * Override to add cron_plugin_type.
+   */
+  public function getDefinition($plugin_id, $exception_on_invalid = TRUE) {
+    $definition =  parent::getDefinition($plugin_id, $exception_on_invalid);
+    $definition['cron_plugin_type'] = $this->pluginType();
+    return $definition;
+  }
+
+  /**
+   * Gets the cron plugin type
+   * @return string
+   */
+  abstract protected function pluginType();
+
+}
diff --git a/src/Scheduler/SchedulerManager.php b/src/Scheduler/SchedulerManager.php
index a115234..8bfe40c 100644
--- a/src/Scheduler/SchedulerManager.php
+++ b/src/Scheduler/SchedulerManager.php
@@ -4,15 +4,15 @@ namespace Drupal\ultimate_cron\Scheduler;
 
 use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
-use Drupal\Core\Plugin\DefaultPluginManager;
 use Drupal\payment\Plugin\Payment\OperationsProviderPluginManagerTrait;
+use Drupal\ultimate_cron\PluginManagerBase;
 
 /**
  * A plugin manager for scheduler plugins.
  *
  *  @see \Drupal\ultimate_cron\Scheduler\SchedulerInterface
  */
-class SchedulerManager extends DefaultPluginManager {
+class SchedulerManager extends PluginManagerBase {
 
   /**
    * Constructs a SchedulerManager object.
@@ -31,4 +31,12 @@ class SchedulerManager extends DefaultPluginManager {
     $this->setCacheBackend($cache_backend, 'ultimate_cron_scheduler');
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  protected function pluginType() {
+    return 'scheduler';
+  }
+
+
 }
diff --git a/src/Tests/CronJobFormTest.php b/src/Tests/CronJobFormTest.php
index 89a93ca..0c6fdd9 100644
--- a/src/Tests/CronJobFormTest.php
+++ b/src/Tests/CronJobFormTest.php
@@ -19,7 +19,11 @@ class CronJobFormTest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = array('ultimate_cron', 'block');
+  public static $modules = [
+    'ultimate_cron',
+    'block',
+    'ultimate_cron_plugin_test',
+  ];
 
   /**
    * A user with permission to create and edit books and to administer blocks.
@@ -96,7 +100,7 @@ class CronJobFormTest extends WebTestBase {
 
     // Change time when cron runs, check the 'Scheduled' label is updated.
     $this->clickLink(t('Edit'));
-    $this->drupalPostForm(NULL, ['scheduler[configuration][rules][0]' => '0+@ */6 * * *'], t('Save'));
+    $this->drupalPostForm(NULL, ['scheduler[rules][0]' => '0+@ */6 * * *'], t('Save'));
     $this->assertText('Every 6 hours');
 
     // Test disabling a job.
@@ -147,12 +151,13 @@ class CronJobFormTest extends WebTestBase {
       'scheduler[id]' => 'crontab',
     );
     $this->drupalPostForm(NULL, $job_configuration, t('Save'));
-    $this->drupalPostForm('admin/config/system/cron/jobs/manage/' . $this->job_id, ['scheduler[configuration][rules][0]' => '0+@ * * * *'], t('Save'));
+    $this->drupalPostForm('admin/config/system/cron/jobs/manage/' . $this->job_id, ['scheduler[rules][0]' => '0+@ * * * *'], t('Save'));
     $this->assertText('0+@ * * * *');
 
     // Try editing the rule to an invalid one.
+    $this->drupalGet('admin/config/system/cron/jobs');
     $this->clickLink('Edit');
-    $this->drupalPostForm(NULL, ['scheduler[configuration][rules][0]' => '*//15+@ *-2 * * *'], t('Save'));
+    $this->drupalPostForm(NULL, ['scheduler[rules][0]' => '*//15+@ *-2 * * *'], t('Save'));
     $this->assertText('Rule is invalid');
     $this->assertTitle('Edit job | Drupal');
 
@@ -192,6 +197,19 @@ class CronJobFormTest extends WebTestBase {
     // The message logged depends on timing, do not hardcode that.
     $this->assertEqual((string) $xpath[0]->td[3], $log_entry->message ?: $log_entry->formatInitMessage());
     $this->assertEqual((string) $xpath[0]->td[4], '00:00');
+    // Test that the plugin from ultimate_cron_plugin_test is available
+    $this->drupalGet('admin/config/system/cron/jobs');
+    $this->clickLink(t('Edit'), 0);
+    $job_configuration = array(
+      'scheduler[id]' => 'simpler',
+    );
+    $this->drupalPostForm(NULL, $job_configuration, t('Select'));
+    $this->assertText('Simpler Run cron every', 'New plugin label is found.');
+    $this->assertOption('edit-scheduler-rules-0', '* * * * *');
+    $this->assertNoOption('edit-scheduler-rules-0', '0+@ 0 * * 0', 'Option available in Simpler plugin is not shown.');
+    $job_configuration['scheduler[rules][0]'] = '* * * * *';
+    $this->drupalPostForm(NULL, $job_configuration, t('Save'));
+    $this->assertText('Simpler Every 1 min', 'Plugin label override used');
   }
 
 }
diff --git a/tests/ultimate_cron_plugin_test/config/schema/ultimate_cron_plugin_test.schema.yml b/tests/ultimate_cron_plugin_test/config/schema/ultimate_cron_plugin_test.schema.yml
new file mode 100644
index 0000000..87fdd8e
--- /dev/null
+++ b/tests/ultimate_cron_plugin_test/config/schema/ultimate_cron_plugin_test.schema.yml
@@ -0,0 +1,16 @@
+ultimate_cron.plugin.scheduler.simpler:
+  type: ultimate_cron.plugin.scheduler
+  label: 'Scheduler configuration'
+  mapping:
+    id:
+      type: string
+      label: 'ID'
+    uuid:
+      type: string
+      label: 'UUID'
+    rules:
+      type: sequence
+      label: 'Scheduler rules'
+      sequence:
+        type: string
+        label: 'Scheduling rule'
diff --git a/tests/ultimate_cron_plugin_test/src/Plugin/ultimate_cron/Scheduler/Simpler.php b/tests/ultimate_cron_plugin_test/src/Plugin/ultimate_cron/Scheduler/Simpler.php
new file mode 100644
index 0000000..0f0efbf
--- /dev/null
+++ b/tests/ultimate_cron_plugin_test/src/Plugin/ultimate_cron/Scheduler/Simpler.php
@@ -0,0 +1,62 @@
+<?php
+
+namespace Drupal\ultimate_cron_plugin_test\Plugin\ultimate_cron\Scheduler;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\ultimate_cron\Entity\CronJob;
+use Drupal\ultimate_cron\Plugin\ultimate_cron\Scheduler\Simple;
+
+/**
+ * Simple scheduler.
+ *
+ * @SchedulerPlugin(
+ *   id = "simpler",
+ *   title = @Translation("Simpler"),
+ *   description = @Translation("Provides a set of predefined intervals for scheduling."),
+ * )
+ */
+class Simpler extends Simple {
+
+  public $presets = array(
+    '* * * * *' => 60,
+    '*/5+@ * * * *' => 300,
+  );
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return array(
+      'rules' => array('* * * * *'),
+    ) + parent::defaultConfiguration();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function formatLabel(CronJob $job) {
+    return t('Simpler Every @interval', array(
+      '@interval' => \Drupal::service('date.formatter')->formatInterval($this->presets[$this->configuration['rules'][0]]),
+    ));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+    $date_formatter = \Drupal::service('date.formatter');
+    $intervals = array_map(array($date_formatter, 'formatInterval'), $this->presets);
+
+    $form['rules'][0] = array(
+      '#type' => 'select',
+      '#title' => t('Simpler Run cron every'),
+      '#default_value' => $this->configuration['rules'][0],
+      '#description' => t('Select the interval you wish cron to run on.'),
+      '#options' => $intervals,
+      '#fallback' => TRUE,
+      '#required' => TRUE,
+    );
+
+    return $form;
+  }
+}
diff --git a/tests/ultimate_cron_plugin_test/ultimate_cron_plugin_test.info.yml b/tests/ultimate_cron_plugin_test/ultimate_cron_plugin_test.info.yml
new file mode 100644
index 0000000..3332248
--- /dev/null
+++ b/tests/ultimate_cron_plugin_test/ultimate_cron_plugin_test.info.yml
@@ -0,0 +1,7 @@
+name: Ultimate Cron Plugin Test
+type: module
+description: Ultimate Cron Test module provides a new plugin
+core: 8.x
+package: Test
+dependencies:
+  - ultimate_cron
