diff --git a/config/install/textimage.settings.yml b/config/install/textimage.settings.yml
index 4cd318c..4c4dbea 100644
--- a/config/install/textimage.settings.yml
+++ b/config/install/textimage.settings.yml
@@ -3,20 +3,6 @@ default_extension: 'png'
 url_generation:
   enabled: FALSE
   text_separator: '---'
-font:
-  plugin_id: textimage
-  plugin_settings:
-    textimage:
-      path: ''
 default_font:
   name:
   uri:
-background:
-  plugin_id: textimage
-  plugin_settings:
-    textimage:
-      path: ''
-color:
-  plugin_id: textimage
-  plugin_settings:
-    textimage: { }
diff --git a/config/schema/textimage.schema.yml b/config/schema/textimage.schema.yml
index 514feeb..d51a7d9 100644
--- a/config/schema/textimage.schema.yml
+++ b/config/schema/textimage.schema.yml
@@ -21,18 +21,6 @@ textimage.settings:
         text_separator:
           type: string
           label: 'Sequence of characters to be used to split the URL text string'
-    font:
-      type: mapping
-      label: 'Font management'
-      mapping:
-        plugin_id:
-          type: text
-          label: 'Selected plugin id'
-        plugin_settings:
-          type: sequence
-          label: 'Plugins settings'
-          sequence:
-            type: textimage.plugin.font.[%key]
     default_font:
       type: mapping
       label: 'Default font'
@@ -43,65 +31,6 @@ textimage.settings:
         uri:
           type: string
           label: 'Default font file URI'
-    background:
-      type: mapping
-      label: 'Background image management'
-      mapping:
-        plugin_id:
-          type: text
-          label: 'Selected plugin id'
-        plugin_settings:
-          type: sequence
-          label: 'Plugins settings'
-          sequence:
-            type: textimage.plugin.background.[%key]
-    color:
-      type: mapping
-      label: 'Color form element management'
-      mapping:
-        plugin_id:
-          type: text
-          label: 'Selected plugin id'
-        plugin_settings:
-          type: sequence
-          label: 'Plugins settings'
-          sequence:
-            type: textimage.plugin.color.[%key]
-
-
-# Schema for Textimage plugins settings.
-textimage.plugin.font.*:
-  type: mapping
-  label: 'Font plugin settings'
-
-textimage.plugin.font.textimage:
-  type: mapping
-  label: 'Textimage font plugin settings'
-  mapping:
-    path:
-      type: string
-      label: 'Path where font files can be found'
-
-textimage.plugin.background.*:
-  type: mapping
-  label: 'Background image plugin settings'
-
-textimage.plugin.background.textimage:
-  type: mapping
-  label: 'Textimage background image plugin settings'
-  mapping:
-    path:
-      type: string
-      label: 'Path where image files can be found'
-
-textimage.plugin.color.*:
-  type: mapping
-  label: 'Color element plugin settings'
-
-textimage.plugin.color.textimage:
-  type: mapping
-  label: 'Textimage color element plugin settings'
-
 
 # Schema for Textimage third party settings for image styles.
 image.style.*.third_party.textimage:
diff --git a/css/admin.ui.css b/css/admin.ui.css
index 35b62f2..e808e39 100644
--- a/css/admin.ui.css
+++ b/css/admin.ui.css
@@ -12,11 +12,3 @@
   margin: 0;
   padding: 0;
 }
-
-/* Color box in image style UI */
-
-span.textimage-color-box {
-  border: 1px solid;
-  font-weight: bold;
-  padding: 0.1em 0.5em;
-}
diff --git a/css/textimage.color_element.css b/css/textimage.color_element.css
deleted file mode 100644
index 3170708..0000000
--- a/css/textimage.color_element.css
+++ /dev/null
@@ -1,5 +0,0 @@
-/* Textimage-provided color element */
-
-div.textimage-color-element  span.field-suffix {
-  vertical-align: -webkit-baseline-middle;
-}
diff --git a/js/textimage.color_element.js b/js/textimage.color_element.js
deleted file mode 100644
index 78632c9..0000000
--- a/js/textimage.color_element.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * @file
- *
- * Textimage color element.
- *
- * Alters field_suffix form element after change to the color field.
- */
-
-(function ($) {
-
-  "use strict";
-
-  Drupal.behaviors.textimageColorElement = {
-
-    attach: function (context, settings) {
-      $('.textimage-color-element .form-color', context).once('textimage-color-element').each(function (index) {
-        $(this).on('change', function (event) {
-          var suffix = $(this).parents('.textimage-color-element').find('.field-suffix').get(0);
-          $(suffix).text(this.value.toUpperCase());
-        });
-      });
-    }
-
-  };
-})(jQuery);
diff --git a/src/Component/ColorUtility.php b/src/Component/ColorUtility.php
deleted file mode 100644
index f218aef..0000000
--- a/src/Component/ColorUtility.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\textimage\Component\ColorUtility.
- */
-
-namespace Drupal\textimage\Component;
-
-use Drupal\Component\Utility\Color;
-use Drupal\Component\Utility\Unicode;
-
-/**
- * Textimage - Color handling methods.
- */
-abstract class ColorUtility {
-
-  /**
-   * Determine best match to over/underlay a defined color.
-   *
-   * Calculates UCCIR 601 luma of the entered color and returns a black or
-   * white color to ensure readibility.
-   *
-   * @see http://en.wikipedia.org/wiki/Luma_video
-   */
-  public static function matchLuma($rgba, $soft = FALSE) {
-    $rgb = Unicode::substr($rgba, 0, 7);
-    list($r, $g, $b) = array_values(Color::hexToRgb($rgb));
-    $luma = 1 - (0.299 * $r + 0.587 * $g + 0.114 * $b) / 255;
-    if ($luma < 0.5) {
-      // Bright colors - black.
-      $d = 0;
-    }
-    else {
-      // Dark colors - white.
-      $d = 255;
-    }
-    return Color::rgbToHex(array($d, $d, $d));
-  }
-
-  /**
-   * Convert RGBA alpha to percent opacity.
-   *
-   * @param string $rgba
-   *   RGBA hexadecimal.
-   *
-   * @return int
-   *   Opacity as percentage (0 = transparent, 100 = fully opaque).
-   */
-  public static function rgbaToOpacity($rgba) {
-    $hex = Unicode::substr($rgba, 7, 2);
-    return $hex ? floor(hexdec($hex) / 255 * 100) : 100;
-  }
-
-  /**
-   * Convert percent opacity to hex alpha.
-   *
-   * @param int $value
-   *   Opacity as percentage (0 = transparent, 100 = fully opaque).
-   *
-   * @return string|null
-   *   Opacity as HEX (#00 = transparent, #FF = fully opaque).
-   */
-  public static function opacityToAlpha($value) {
-    if (!$value || $value < 0 || $value > 100) {
-      return NULL;
-    }
-    return Unicode::strtoupper(str_pad(dechex(ceil($value / 100 * 255)), 2, '0', STR_PAD_LEFT));
-  }
-
-}
diff --git a/src/Element/TextimageColor.php b/src/Element/TextimageColor.php
deleted file mode 100644
index 93cf0d5..0000000
--- a/src/Element/TextimageColor.php
+++ /dev/null
@@ -1,172 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\textimage\Element\TextimageColor.
- */
-
-namespace Drupal\textimage\Element;
-
-use Drupal\Component\Utility\Unicode;
-use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Render\Element\FormElement;
-use Drupal\textimage\Component\ColorUtility;
-
-/**
- * Implements a form element to enable capturing color information.
- *
- * Enable capturing color information. Depending on the options, uses a normal
- * textfield or a jquery_colorpicker element to capture the HEX value of a
- * color.
- *
- * @FormElement("textimage_color")
- */
-class TextimageColor extends FormElement {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getInfo() {
-    $class = get_class($this);
-    return array(
-      '#input' => TRUE,
-      '#process' => array(
-        array($class, 'processTextimageColor'),
-      ),
-      '#element_validate' => array(
-        array($class, 'validateTextimageColor'),
-      ),
-    );
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function valueCallback(&$element, $input, FormStateInterface $form_state) {
-    if ($input !== FALSE && $input !== NULL) {
-      // Make sure element properties are set.
-      $element['#allow_null'] = isset($element['#allow_null']) ? $element['#allow_null'] : FALSE;
-      $element['#allow_opacity'] = isset($element['#allow_opacity']) ? $element['#allow_opacity'] : FALSE;
-
-      // Normalize returned element values to a rgba hex value.
-      $val = '';
-      if ($element['#allow_null'] && !empty($input['container']['transparent'])) {
-        return '';
-      }
-      elseif ($element['#allow_null'] || $element['#allow_opacity']) {
-        $val = Unicode::strtoupper($input['container']['hex']);
-      }
-      else {
-        $val = Unicode::strtoupper($input['hex']);
-      }
-      if ($val[0] <> '#') {
-        $val = '#' . $val;
-      }
-      if ($element['#allow_opacity']) {
-        $val .= ColorUtility::opacityToAlpha($input['container']['opacity']);
-      }
-      return $val;
-    }
-    return '';
-  }
-
-  /**
-   * Processes a 'textimage_color' form element.
-   *
-   * @param array $element
-   *   The form element to process. Properties used:
-   *     '#allow_null' - if set to TRUE, a checkbox is displayed to set the
-   *      color as a full transparency, In this case, color hex and opacity are
-   *      hidden, and the value returned is NULL.
-   *     '#allow_opacity' - if set to TRUE, a textfield is displayed to capture the
-   *      'opacity' value, as a percentage.
-   * @param \Drupal\Core\Form\FormStateInterface $form_state
-   *   The current state of the form.
-   * @param array $complete_form
-   *   The complete form structure.
-   *
-   * @return array
-   *   The processed element.
-   */
-  public static function processTextimageColor(&$element, FormStateInterface $form_state, &$complete_form) {
-    // Make sure element properties are set.
-    $element['#allow_null'] = isset($element['#allow_null']) ? $element['#allow_null'] : FALSE;
-    $element['#allow_opacity'] = isset($element['#allow_opacity']) ? $element['#allow_opacity'] : FALSE;
-    $element['#description'] = isset($element['#description']) ? $element['#description'] : NULL;
-    $element['#states'] = isset($element['#states']) ? $element['#states'] : NULL;
-    $element['#checkbox_title'] = isset($element['#checkbox_title']) ? $element['#checkbox_title'] : t('Transparent');
-
-    // In case default value is transparent, set hex and opacity to default
-    // values (white, fully opaque) so that if transparency is unchecked,
-    // we have a starting value.
-    $transparent = empty($element['#default_value']) ? TRUE : FALSE;
-    $hex = $transparent ? '#FFFFFF' : Unicode::substr($element['#default_value'], 0, 7);
-    $opacity = $transparent ? 100 : ColorUtility::rgbaToOpacity($element['#default_value']);
-
-    $colorPlugin = \Drupal::service('plugin.manager.textimage.color')->getPlugin();
-
-    if ($element['#allow_null'] || $element['#allow_opacity']) {
-      // More sub-fields are needed to define the color, wrap them in a
-      // container fieldset.
-      $element['container'] = array(
-        '#type' => 'fieldset',
-        '#description' => $element['#description'],
-        '#title' => $element['#title'],
-        '#states' => $element['#states'],
-      );
-      // Checkbox for transparency.
-      if ($element['#allow_null']) {
-        $element['container']['transparent'] = array(
-          '#type' => 'checkbox',
-          '#title' => $element['#checkbox_title'],
-          '#default_value' => $transparent,
-        );
-      }
-      // Color field.
-      $element['container']['hex'] = $colorPlugin->selectionElement(array('#default_value' => $hex));
-      // States management for color field.
-      $element['container']['hex']['#states'] = array(
-        'visible' => array(
-          ':input[name="' . $element['#name'] . '[container][transparent]"]' => array('checked' => FALSE),
-        ),
-      );
-      // Textfield for opacity.
-      if ($element['#allow_opacity']) {
-        $element['container']['opacity'] = array(
-          '#type'  => 'number',
-          '#title' => t('Opacity'),
-          '#default_value' => $opacity,
-          '#maxlength' => 3,
-          '#size' => 2,
-          '#field_suffix' => '%',
-          '#min' => 0,
-          '#max' => 100,
-          '#states' => array(
-            'visible' => array(
-              ':input[name="' . $element['#name'] . '[container][transparent]"]' => array('checked' => FALSE),
-            ),
-          ),
-        );
-      }
-    }
-    else {
-      // No transparency or opacity, straight color field.
-      $element['hex'] = $colorPlugin->selectionElement(array('#default_value' => $hex));
-    }
-
-    unset(
-      $element['#description'],
-      $element['#title']
-    );
-
-    return $element;
-  }
-
-  /**
-   * Form element validation handler.
-   */
-  public static function validateTextimageColor(&$element, FormStateInterface $form_state, &$complete_form) {
-    $form_state->setValueForElement($element, $element['#value']);
-  }
-
-}
diff --git a/src/Form/SettingsForm.php b/src/Form/SettingsForm.php
index 85ddc10..ed63fd1 100644
--- a/src/Form/SettingsForm.php
+++ b/src/Form/SettingsForm.php
@@ -13,8 +13,7 @@ use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Form\ConfigFormBase;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Image\ImageFactory;
-use Drupal\textimage\Plugin\TextimagePluginManager;
-use Drupal\textimage\Plugin\TextimagePluginBaseInterface;
+use Drupal\image_effects\Plugin\ImageEffectsPluginManager;
 use Drupal\textimage\TextimageFactory;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -31,27 +30,13 @@ class SettingsForm extends ConfigFormBase {
   protected $textimageFactory;
 
   /**
-   * The font plugin manager.
+   * The font selector plugin manager.
    *
-   * @var \Drupal\textimage\Plugin\TextimagePluginManager
+   * @var \Drupal\image_effects\Plugin\ImageEffectsPluginManager
    */
   protected $fontManager;
 
   /**
-   * The background plugin manager.
-   *
-   * @var \Drupal\textimage\Plugin\TextimagePluginManager
-   */
-  protected $backgroundManager;
-
-  /**
-   * The color plugin manager.
-   *
-   * @var \Drupal\textimage\Plugin\TextimagePluginManager
-   */
-  protected $colorManager;
-
-  /**
    * The Image factory.
    *
    * @var \Drupal\Core\Image\ImageFactory
@@ -65,21 +50,15 @@ class SettingsForm extends ConfigFormBase {
    *   The Textimage factory.
    * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
    *   The factory for configuration objects.
-   * @param \Drupal\textimage\Plugin\TextimagePluginManager $font_plugin_manager
-   *   The font plugin manager.
-   * @param \Drupal\textimage\Plugin\TextimagePluginManager $background_plugin_manager
-   *   The background images plugin manager.
-   * @param \Drupal\textimage\Plugin\TextimagePluginManager $color_plugin_manager
-   *   The color plugin manager.
-   * @param \Drupal\textimage\Plugin\TextimagePluginManager $image_factory
+   * @param \Drupal\image_effects\Plugin\ImageEffectsPluginManager $font_plugin_manager
+   *   The font selector plugin manager.
+   * @param \Drupal\Core\Image\ImageFactory $image_factory
    *   The Image factory.
    */
-  public function __construct(TextimageFactory $textimage_factory, ConfigFactoryInterface $config_factory, TextimagePluginManager $font_plugin_manager, TextimagePluginManager $background_plugin_manager, TextimagePluginManager $color_plugin_manager, ImageFactory $image_factory) {
+  public function __construct(TextimageFactory $textimage_factory, ConfigFactoryInterface $config_factory, ImageEffectsPluginManager $font_plugin_manager, ImageFactory $image_factory) {
     parent::__construct($config_factory);
     $this->textimageFactory = $textimage_factory;
     $this->fontManager = $font_plugin_manager;
-    $this->backgroundManager = $background_plugin_manager;
-    $this->colorManager = $color_plugin_manager;
     $this->imageFactory = $image_factory;
   }
 
@@ -90,9 +69,7 @@ class SettingsForm extends ConfigFormBase {
     return new static(
       $container->get('textimage.factory'),
       $container->get('config.factory'),
-      $container->get('plugin.manager.textimage.font'),
-      $container->get('plugin.manager.textimage.background'),
-      $container->get('plugin.manager.textimage.color'),
+      $container->get('plugin.manager.image_effects.font_selector'),
       $container->get('image.factory')
     );
   }
@@ -115,41 +92,8 @@ class SettingsForm extends ConfigFormBase {
    * {@inheritdoc}
    */
   public function buildForm(array $form, FormStateInterface $form_state) {
-
     $config = $this->config('textimage.settings');
 
-    $ajaxing = (bool) $form_state->getValues();
-
-    // Font plugin.
-    $font_plugin_id = $ajaxing ? $form_state->getValue(['settings', 'font', 'plugin_id']) : $config->get('font.plugin_id');
-    $font_plugin = $this->fontManager->getPlugin($font_plugin_id);
-    if ($ajaxing && $form_state->hasValue(['settings', 'font', 'plugin_settings'])) {
-      $font_plugin->setConfiguration($form_state->getValue(['settings', 'font', 'plugin_settings']));
-    }
-
-    // Background plugin.
-    $background_plugin_id = $ajaxing ? $form_state->getValue(['settings', 'background', 'plugin_id']) : $config->get('background.plugin_id');
-    $background_plugin = $this->backgroundManager->getPlugin($background_plugin_id);
-    if ($ajaxing && $form_state->hasValue(['settings', 'background', 'plugin_settings'])) {
-      $background_plugin->setConfiguration($form_state->getValue(['settings', 'background', 'plugin_settings']));
-    }
-
-    // Color plugin.
-    $color_plugin_id = $ajaxing ? $form_state->getValue(['settings', 'color', 'plugin_id']) : $config->get('color.plugin_id');
-    $color_plugin = $this->colorManager->getPlugin($color_plugin_id);
-    if ($ajaxing && $form_state->hasValue(['settings', 'color', 'plugin_settings'])) {
-      $color_plugin->setConfiguration($form_state->getValue(['settings', 'color', 'plugin_settings']));
-    }
-
-    // AJAX messages
-    $form['ajax_messages'] = array(
-      '#type' => 'container',
-      '#attributes' => [
-        'id' => 'textimage-ajax-messages',
-      ],
-    );
-
-    // Main part of settings form.
     $form['settings'] = array(
       '#type' => 'container',
       '#tree' => TRUE,
@@ -158,12 +102,12 @@ class SettingsForm extends ConfigFormBase {
       ],
     );
 
+    // Main part of settings form.
     $form['settings']['main'] = array(
       '#type' => 'details',
       '#open' => TRUE,
       '#title' => $this->t('Main settings'),
     );
-
     // Default image file format/extension.
     $extensions = $this->imageFactory->getSupportedExtensions();
     $options = array_combine($extensions, $extensions);
@@ -175,64 +119,14 @@ class SettingsForm extends ConfigFormBase {
       '#required' => TRUE,
       '#description' => $this->t('Select the default extension of the image files produced by Textimage. This can be overridden by image style effects that specify a format conversion like e.g. <em>Convert</em> or <em>Textimage Background</em>. This setting does not affect image derivatives created by the Image module.'),
     );
-
-    $ajax_settings = ['callback' => [$this, 'processAjax']];
-
-    // Fonts.
-    $form['settings']['font'] = array(
-      '#type' => 'details',
-      '#open' => TRUE,
-      '#title' => $this->t('Fonts manager'),
-      '#tree' => TRUE,
-    );
-    $form['settings']['font']['plugin_id'] = array(
-      '#type' => 'radios',
-      '#options' => $this->fontManager->getPluginOptions(),
-      '#default_value' => $font_plugin->getPluginId(),
-      '#required' => TRUE,
-      '#ajax'  => $ajax_settings,
-    );
-    $form['settings']['font']['plugin_settings'] = $font_plugin->buildConfigurationForm(array(), $form_state, $ajax_settings);
-
     // Default font.
-    $form['settings']['font']['default_font_name'] = $font_plugin->selectionElement(array(
+    $font_plugin = $this->fontManager->getPlugin($this->config('image_effects.settings')->get('font_selector.plugin_id'));
+    $form['settings']['main']['default_font_uri'] = $font_plugin->selectionElement(array(
       '#title' => $this->t('Default font'),
       '#description' => $this->t('Select the default font to be used by Textimage.'),
-      '#default_value' => $config->get('default_font.name'),
+      '#default_value' => $config->get('default_font.uri'),
     ));
 
-    // Background images.
-    $form['settings']['background'] = array(
-      '#type' => 'details',
-      '#open' => TRUE,
-      '#title' => $this->t('Background images manager'),
-      '#tree' => TRUE,
-    );
-    $form['settings']['background']['plugin_id'] = array(
-      '#type'    => 'radios',
-      '#options' => $this->backgroundManager->getPluginOptions(),
-      '#default_value' => $background_plugin->getPluginId(),
-      '#required'    => TRUE,
-      '#ajax'  => $ajax_settings,
-    );
-    $form['settings']['background']['plugin_settings'] = $background_plugin->buildConfigurationForm(array(), $form_state, $ajax_settings);
-
-    // Color.
-    $form['settings']['color'] = array(
-      '#type' => 'details',
-      '#open' => TRUE,
-      '#title' => $this->t('Color manager'),
-      '#tree' => TRUE,
-    );
-    $form['settings']['color']['plugin_id'] = array(
-      '#type' => 'radios',
-      '#options' => $this->colorManager->getPluginOptions(),
-      '#default_value' => $color_plugin->getPluginId(),
-      '#required' => TRUE,
-      '#ajax'  => $ajax_settings,
-    );
-    $form['settings']['color']['plugin_settings'] = $color_plugin->buildConfigurationForm(array(), $form_state, $ajax_settings);
-
     // URL generation.
     $form['settings']['url_generation'] = array(
       '#type' => 'details',
@@ -295,7 +189,6 @@ class SettingsForm extends ConfigFormBase {
    * {@inheritdoc}
    */
   public function submitForm(array &$form, FormStateInterface $form_state) {
-
     $config = $this->config('textimage.settings');
 
     // Redirect to cleanup if required.
@@ -305,40 +198,11 @@ class SettingsForm extends ConfigFormBase {
     }
 
     // Main settings.
+    $font_plugin = $this->fontManager->getPlugin($this->config('image_effects.settings')->get('font_selector.plugin_id'));
     $config
-      ->set('default_extension', $form_state->getValue(['settings', 'main', 'default_extension']));
-
-    // Font plugin.
-    $font_plugin = $this->fontManager->getPlugin($form_state->getValue(['settings', 'font', 'plugin_id']));
-    if ($form_state->hasValue(['settings', 'font', 'plugin_settings'])) {
-      $font_plugin->setConfiguration($form_state->getValue(['settings', 'font', 'plugin_settings']));
-    }
-    $config
-      ->set('font.plugin_id', $font_plugin->getPluginId())
-      ->set('font.plugin_settings.' . $font_plugin->getPluginId(), $font_plugin->getConfiguration());
-
-    // Default font.
-    $config
-      ->set('default_font.name', $form_state->getValue(['settings', 'font', 'default_font_name']))
-      ->set('default_font.uri', $font_plugin->getUri($form_state->getValue(['settings', 'font', 'default_font_name'])));
-
-    // Background plugin.
-    $background_plugin = $this->backgroundManager->getPlugin($form_state->getValue(['settings', 'background', 'plugin_id']));
-    if ($form_state->hasValue(['settings', 'background', 'plugin_settings'])) {
-      $background_plugin->setConfiguration($form_state->getValue(['settings', 'background', 'plugin_settings']));
-    }
-    $config
-      ->set('background.plugin_id', $background_plugin->getPluginId())
-      ->set('background.plugin_settings.' . $background_plugin->getPluginId(), $background_plugin->getConfiguration());
-
-    // Color plugin.
-    $color_plugin = $this->colorManager->getPlugin($form_state->getValue(['settings', 'color', 'plugin_id']));
-    if ($form_state->hasValue(['settings', 'color', 'plugin_settings'])) {
-      $color_plugin->setConfiguration($form_state->getValue(['settings', 'color', 'plugin_settings']));
-    }
-    $config
-      ->set('color.plugin_id', $color_plugin->getPluginId())
-      ->set('color.plugin_settings.' . $color_plugin->getPluginId(), $color_plugin->getConfiguration());
+      ->set('default_extension', $form_state->getValue(['settings', 'main', 'default_extension']))
+      ->set('default_font.name', $font_plugin->getDescription($form_state->getValue(['settings', 'main', 'default_font_uri'])))
+      ->set('default_font.uri', $form_state->getValue(['settings', 'main', 'default_font_uri']));
 
     // URL generation.
     $config
@@ -353,15 +217,4 @@ class SettingsForm extends ConfigFormBase {
     parent::submitForm($form, $form_state);
   }
 
-  /**
-   * AJAX callback.
-   */
-  public function processAjax($form, FormStateInterface $form_state) {
-    $response = new AjaxResponse();
-    $status_messages = array('#type' => 'status_messages');
-    $response->addCommand(new HtmlCommand('#textimage-ajax-messages', $status_messages));
-    $response->addCommand(new HtmlCommand('#textimage-settings-main', $form['settings']));
-    return $response;
-  }
-
 }
diff --git a/src/Plugin/ImageEffect/TextimageBackground.php b/src/Plugin/ImageEffect/TextimageBackground.php
index 1a09387..f655a07 100644
--- a/src/Plugin/ImageEffect/TextimageBackground.php
+++ b/src/Plugin/ImageEffect/TextimageBackground.php
@@ -72,7 +72,6 @@ class TextimageBackground extends TextimageEffectBase {
       '#name' => 'background_image',
       '#type' => 'fieldset',
       '#title' => $this->t('Background image'),
-      '#description' => $this->t('Select a background image to be used.'),
     );
     // Background image mode - options.
     $image_options = array(
@@ -86,7 +85,13 @@ class TextimageBackground extends TextimageEffectBase {
       '#default_value' => $this->configuration['background_image']['mode'],
     );
     // Background image selection.
-    $form['background_image']['uri'] = $this->backgroundPlugin->selectionElement($this->configuration);
+    $options = [
+      '#states' => [
+        'visible' => [':input[name="data[background_image][mode]"]' => ['value' => 'select']],
+      ],
+      '#default_value' => $this->configuration['background_image']['uri'],
+    ];
+    $form['background_image']['uri'] = $this->imageSelector->selectionElement($options);
 
     // Derivative image format.
     $form['format'] = array(
@@ -108,7 +113,7 @@ class TextimageBackground extends TextimageEffectBase {
     );
     // Derivative image format - GIF color.
     $form['format']['gif_transparent_color'] = array(
-      '#type' => 'textimage_color',
+      '#type' => 'image_effects_color',
       '#title' => $this->t('Transparent color for GIF images'),
       '#description'  => $this->t('Select a color to be used for transparency of GIF image files. Leave the checkbox ticked to use the color of the image being processed, if it has one.'),
       '#allow_null' => TRUE,
@@ -132,7 +137,7 @@ class TextimageBackground extends TextimageEffectBase {
       '#description'  => $this->t('Select the color you wish to use for the background of the image. This color will be placed around the image or fill the background if no image is selected.'),
     );
     $form['background']['color'] = array(
-      '#type' => 'textimage_color',
+      '#type' => 'image_effects_color',
       '#title' => $this->t('Color'),
       '#allow_null' => TRUE,
       '#allow_opacity' => TRUE,
@@ -291,7 +296,7 @@ class TextimageBackground extends TextimageEffectBase {
     $data = $this->configuration;
     if ($data['background']['color']) {
       $data['background_color_detail'] = array(
-        '#theme' => 'textimage_color_detail',
+        '#theme' => 'image_effects_color_detail',
         '#color' => $data['background']['color'],
         '#border' => TRUE,
         '#border_color' => 'matchLuma',
diff --git a/src/Plugin/ImageEffect/TextimageEffectBase.php b/src/Plugin/ImageEffect/TextimageEffectBase.php
index 1b1cdf5..5bcd214 100644
--- a/src/Plugin/ImageEffect/TextimageEffectBase.php
+++ b/src/Plugin/ImageEffect/TextimageEffectBase.php
@@ -13,8 +13,8 @@ use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Image\ImageFactory;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\image\ConfigurableImageEffectBase;
-use Drupal\textimage\Plugin\TextimageBackgroundPluginInterface;
-use Drupal\textimage\Plugin\TextimageFontPluginInterface;
+use Drupal\image_effects\Plugin\ImageEffectsFontSelectorPluginInterface;
+use Drupal\image_effects\Plugin\ImageEffectsPluginBaseInterface;
 use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -45,29 +45,29 @@ abstract class TextimageEffectBase extends ConfigurableImageEffectBase implement
   protected $imageFactory;
 
   /**
-   * The font plugin.
+   * The font selector plugin.
    *
-   * @var \Drupal\textimage\Plugin\TextimageFontPluginInterface
+   * @var \Drupal\image_effects\Plugin\ImageEffectsFontSelectorPluginInterface
    */
-  protected $fontPlugin;
+  protected $fontSelector;
 
   /**
-   * The background plugin.
+   * The image selector plugin.
    *
-   * @var \Drupal\textimage\Plugin\TextimageBackgroundPluginInterface
+   * @var \Drupal\image_effects\Plugin\ImageEffectsPluginBaseInterface
    */
-  protected $backgroundPlugin;
+  protected $imageSelector;
 
   /**
    * {@inheritdoc}
    */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, ModuleHandlerInterface $module_handler, LoggerInterface $logger, ImageFactory $image_factory, $textimage_factory, TextimageFontPluginInterface $font_plugin, TextimageBackgroundPluginInterface $background_plugin) {
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, ModuleHandlerInterface $module_handler, LoggerInterface $logger, ImageFactory $image_factory, $textimage_factory, ImageEffectsFontSelectorPluginInterface $font_selector_plugin, ImageEffectsPluginBaseInterface $image_selector_plugin) {
     parent::__construct($configuration, $plugin_id, $plugin_definition, $logger);
     $this->moduleHandler = $module_handler;
     $this->imageFactory = $image_factory;
     $this->textimageFactory = $textimage_factory;
-    $this->fontPlugin = $font_plugin;
-    $this->backgroundPlugin = $background_plugin;
+    $this->fontSelector = $font_selector_plugin;
+    $this->imageSelector = $image_selector_plugin;
   }
 
   /**
@@ -82,8 +82,8 @@ abstract class TextimageEffectBase extends ConfigurableImageEffectBase implement
       $container->get('textimage.logger'),
       $container->get('image.factory'),
       $container->get('textimage.factory'),
-      $container->get('plugin.manager.textimage.font')->getPlugin(),
-      $container->get('plugin.manager.textimage.background')->getPlugin()
+      $container->get('plugin.manager.image_effects.font_selector')->getPlugin(),
+      $container->get('plugin.manager.image_effects.image_selector')->getPlugin()
     );
   }
 
diff --git a/src/Plugin/ImageEffect/TextimageText.php b/src/Plugin/ImageEffect/TextimageText.php
index 4ebfce8..b6bc077 100644
--- a/src/Plugin/ImageEffect/TextimageText.php
+++ b/src/Plugin/ImageEffect/TextimageText.php
@@ -14,9 +14,8 @@ use Drupal\Core\Ajax\ReplaceCommand;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Image\ImageInterface;
 use Drupal\Core\Render\BubbleableMetadata;
-use Drupal\textimage\Component\ColorUtility;
+use Drupal\image_effects\Component\ColorUtility;
 use Drupal\textimage\Component\Rectangle;
-use Drupal\textimage\Element\TextimageColor;
 
 /**
  * Define the Textimage text.
@@ -156,10 +155,10 @@ class TextimageText extends TextimageEffectBase {
       '#title' => $this->t('Font settings'),
       '#group'   => 'settings',
     );
-    $form['font']['name'] = $this->fontPlugin->selectionElement(array(
+    $form['font']['uri'] = $this->fontSelector->selectionElement(array(
       '#title' => $this->t('Font'),
       '#description' => $this->t('Select the font to be used in this image.'),
-      '#default_value' => $this->configuration['font']['name'],
+      '#default_value' => $this->configuration['font']['uri'],
     ));
     $form['font']['size'] = array(
       '#type'  => 'number',
@@ -183,7 +182,7 @@ class TextimageText extends TextimageEffectBase {
       '#max' => 360,
     );
     $form['font']['color'] = array(
-      '#type' => 'textimage_color',
+      '#type' => 'image_effects_color',
       '#title' => $this->t('Font color'),
       '#description'  => $this->t('Set the font color.'),
       '#allow_opacity' => TRUE,
@@ -318,7 +317,7 @@ class TextimageText extends TextimageEffectBase {
       ),
     );
     $form['font']['stroke']['color'] = array(
-      '#type' => 'textimage_color',
+      '#type' => 'image_effects_color',
       '#title' => $this->t('Color'),
       '#description'  => $this->t('Set the outline/shadow color.'),
       '#allow_opacity' => TRUE,
@@ -490,7 +489,7 @@ class TextimageText extends TextimageEffectBase {
     );
     // Background color.
     $form['layout']['background_color'] = array(
-      '#type' => 'textimage_color',
+      '#type' => 'image_effects_color',
       '#title' => $this->t('Background color'),
       '#description'  => $this->t('Select the color you wish to use for the background of the text.'),
       '#allow_null' => TRUE,
@@ -525,13 +524,10 @@ class TextimageText extends TextimageEffectBase {
     // Get x-y position from the anchor element.
     list($x_pos, $y_pos) = explode('-', $form_state->getValue(['layout', 'position', 'placement']));
 
-    // Get the font URI.
-    $font_uri = $form_state->hasValue(['font', 'name']) ? $this->fontPlugin->getUri($form_state->getValue(['font', 'name'])) : NULL;
-
     $this->configuration = array(
       'font'   => array(
-        'name'                 => $form_state->hasValue(['font', 'name']) ? $form_state->getValue(['font', 'name']) : NULL,
-        'uri'                  => $font_uri,
+        'name'                 => $form_state->hasValue(['font', 'uri']) ? $this->fontSelector->getDescription($form_state->getValue(['font', 'uri'])) : NULL,
+        'uri'                  => $form_state->getValue(['font', 'uri']),
         'size'                 => $form_state->getValue(['font', 'size']),
         'angle'                => $form_state->getValue(['font', 'angle']),
         'color'                => $form_state->getValue(['font', 'color']),
@@ -585,7 +581,7 @@ $form_state->setValue(['ajax_config', 'preview_bar', 'debug_visuals'], $form_sta
   public function getSummary() {
     $data = $this->configuration;
     $data['font_color_detail'] = array(
-      '#theme' => 'textimage_color_detail',
+      '#theme' => 'image_effects_color_detail',
       '#color' => $data['font']['color'],
       '#border' => TRUE,
       '#border_color' => 'matchLuma',
@@ -593,7 +589,7 @@ $form_state->setValue(['ajax_config', 'preview_bar', 'debug_visuals'], $form_sta
     if ($stroke_mode = $this->strokeMode()) {
       $data['stroke_mode'] = $stroke_mode;
       $data['stroke_color_detail'] = array(
-        '#theme' => 'textimage_color_detail',
+        '#theme' => 'image_effects_color_detail',
         '#color' => $data['font']['stroke_color'],
         '#border' => TRUE,
         '#border_color' => 'matchLuma',
@@ -601,7 +597,7 @@ $form_state->setValue(['ajax_config', 'preview_bar', 'debug_visuals'], $form_sta
     }
     if ($data['layout']['background_color']) {
       $data['background_color_detail'] = array(
-        '#theme' => 'textimage_color_detail',
+        '#theme' => 'image_effects_color_detail',
         '#color' => $data['layout']['background_color'],
         '#border' => TRUE,
         '#border_color' => 'matchLuma',
diff --git a/src/Plugin/ImageToolkit/Operation/TextimageDrawRectangleTrait.php b/src/Plugin/ImageToolkit/Operation/TextimageDrawRectangleTrait.php
index 21a5557..ee07ded 100644
--- a/src/Plugin/ImageToolkit/Operation/TextimageDrawRectangleTrait.php
+++ b/src/Plugin/ImageToolkit/Operation/TextimageDrawRectangleTrait.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\textimage\Plugin\ImageToolkit\Operation;
 
-use Drupal\textimage\Component\ColorUtility;
+use Drupal\image_effects\Component\ColorUtility;
 use Drupal\textimage\Component\Rectangle;
 
 /**
diff --git a/src/Plugin/ImageToolkit/Operation/gd/GDTextimageOperationBase.php b/src/Plugin/ImageToolkit/Operation/gd/GDTextimageOperationBase.php
index 6958571..01695d8 100644
--- a/src/Plugin/ImageToolkit/Operation/gd/GDTextimageOperationBase.php
+++ b/src/Plugin/ImageToolkit/Operation/gd/GDTextimageOperationBase.php
@@ -10,7 +10,7 @@ namespace Drupal\textimage\Plugin\ImageToolkit\Operation\gd;
 use Drupal\Component\Utility\Color;
 use Drupal\Component\Utility\Unicode;
 use Drupal\system\Plugin\ImageToolkit\Operation\gd\GDImageToolkitOperationBase;
-use Drupal\textimage\Component\ColorUtility;
+use Drupal\image_effects\Component\ColorUtility;
 use Drupal\textimage\Component\Rectangle;
 use Drupal\textimage\Plugin\ImageToolkit\Operation\TextimageOperationTrait;
 
diff --git a/src/Plugin/ImageToolkit/Operation/gd/TextimageTextOverlay.php b/src/Plugin/ImageToolkit/Operation/gd/TextimageTextOverlay.php
index 9f34b40..5e9a5de 100644
--- a/src/Plugin/ImageToolkit/Operation/gd/TextimageTextOverlay.php
+++ b/src/Plugin/ImageToolkit/Operation/gd/TextimageTextOverlay.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\textimage\Plugin\ImageToolkit\Operation\gd;
 
-use Drupal\textimage\Component\ColorUtility;
+use Drupal\image_effects\Component\ColorUtility;
 
 /**
  * Defines Textimage GD2 text overlay operation.
diff --git a/src/Plugin/ImageToolkit/Operation/gd/TextimageTextToWrapper.php b/src/Plugin/ImageToolkit/Operation/gd/TextimageTextToWrapper.php
index 4ede49e..2bea64d 100644
--- a/src/Plugin/ImageToolkit/Operation/gd/TextimageTextToWrapper.php
+++ b/src/Plugin/ImageToolkit/Operation/gd/TextimageTextToWrapper.php
@@ -9,7 +9,7 @@ namespace Drupal\textimage\Plugin\ImageToolkit\Operation\gd;
 
 use Drupal\Component\Utility\Unicode;
 use Drupal\Core\Image\ImageInterface;
-use Drupal\textimage\Component\ColorUtility;
+use Drupal\image_effects\Component\ColorUtility;
 use Drupal\textimage\Component\Rectangle;
 use Drupal\textimage\Component\TextUtility;
 use Drupal\textimage\Plugin\ImageToolkit\Operation\TextimageTextToWrapperTrait;
diff --git a/src/Plugin/TextimageBackgroundPluginInterface.php b/src/Plugin/TextimageBackgroundPluginInterface.php
deleted file mode 100644
index aa9bb54..0000000
--- a/src/Plugin/TextimageBackgroundPluginInterface.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\textimage\Plugin\TextimageBackgroundPluginInterface.
- */
-
-namespace Drupal\textimage\Plugin;
-
-/**
- * Background images plugin interface.
- *
- * Defines the methods that background plugins have to implement.
- */
-interface TextimageBackgroundPluginInterface extends TextimagePluginBaseInterface {
-
-}
diff --git a/src/Plugin/TextimageColorPluginInterface.php b/src/Plugin/TextimageColorPluginInterface.php
deleted file mode 100644
index e611b69..0000000
--- a/src/Plugin/TextimageColorPluginInterface.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\textimage\Plugin\TextimageColorPluginInterface.
- */
-
-namespace Drupal\textimage\Plugin;
-
-/**
- * Color plugin interface.
- *
- * Defines the methods that color plugins have to implement.
- */
-interface TextimageColorPluginInterface extends TextimagePluginBaseInterface {
-
-}
diff --git a/src/Plugin/TextimageFontPluginInterface.php b/src/Plugin/TextimageFontPluginInterface.php
deleted file mode 100644
index 54f8c5c..0000000
--- a/src/Plugin/TextimageFontPluginInterface.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\textimage\Plugin\TextimageFontPluginInterface.
- */
-
-namespace Drupal\textimage\Plugin;
-
-/**
- * Fonts handler interface.
- *
- * Defines the methods that font plugins have to implement.
- */
-interface TextimageFontPluginInterface extends TextimagePluginBaseInterface {
-
-  /**
-   * Get the URI of a font file.
-   *
-   * @param string $font_name
-   *   the name of the font.
-   *
-   * @return string
-   *   the URI of the font file.
-   */
-  public function getUri($font_name);
-
-}
diff --git a/src/Plugin/TextimagePluginBase.php b/src/Plugin/TextimagePluginBase.php
deleted file mode 100644
index 7d0baee..0000000
--- a/src/Plugin/TextimagePluginBase.php
+++ /dev/null
@@ -1,143 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\textimage\Plugin\TextimagePluginBase.
- */
-
-namespace Drupal\textimage\Plugin;
-
-use Drupal\Core\Config\ConfigFactoryInterface;
-use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Plugin\PluginBase;
-use Psr\Log\LoggerInterface;
-use Symfony\Component\DependencyInjection\ContainerInterface;
-
-/**
- * Base plugin for Textimage.
- */
-abstract class TextimagePluginBase extends PluginBase implements TextimagePluginBaseInterface {
-
-  /**
-   * The Textimage plugin type (font/background/color).
-   *
-   * @var string
-   */
-  protected $pluginType;
-
-  /**
-   * Textimage configuration object.
-   *
-   * @var \Drupal\Core\Config\Config
-   */
-  protected $config;
-
-  /**
-   * The Textimage logger.
-   *
-   * @var \Psr\Log\LoggerInterface.
-   */
-  protected $logger;
-
-  /**
-   * Constructs a TextimagePluginBase object.
-   *
-   * @param array $configuration
-   *   A configuration array containing information about the plugin instance.
-   * @param string $plugin_id
-   *   The plugin_id for the plugin instance.
-   * @param mixed $plugin_definition
-   *   The plugin implementation definition.
-   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
-   *   The configuration factory.
-   * @param \Psr\Log\LoggerInterface $logger
-   *   The Textimage logger.
-   */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, ConfigFactoryInterface $config_factory, LoggerInterface $logger) {
-    $this->config = $config_factory->getEditable('textimage.settings');
-    parent::__construct($configuration, $plugin_id, $plugin_definition);
-    $this->pluginType = $configuration['plugin_type'];
-    $config = $this->config->get($this->pluginType . '.plugin_settings.' . $plugin_id);
-    $this->setConfiguration(array_merge($this->defaultConfiguration(), is_array($config) ? $config : array()));
-    $this->logger = $logger;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
-    return new static(
-      $configuration,
-      $plugin_id,
-      $plugin_definition,
-      $container->get('config.factory'),
-      $container->get('textimage.logger')
-    );
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function defaultConfiguration() {
-    return array();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getConfiguration() {
-    return $this->configuration;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setConfiguration(array $configuration) {
-    $this->configuration = $configuration;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function calculateDependencies() {
-    return parent::calculateDependencies();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function isAvailable() {
-    return TRUE;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getType() {
-    return $this->pluginType;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function buildConfigurationForm(array $form, FormStateInterface $form_state, array $ajax_settings = []) {
-    return array();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) { }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) { }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function selectionElement(array $options = array()) {
-    return array();
-  }
-}
diff --git a/src/Plugin/TextimagePluginBaseInterface.php b/src/Plugin/TextimagePluginBaseInterface.php
deleted file mode 100644
index bace5c0..0000000
--- a/src/Plugin/TextimagePluginBaseInterface.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-namespace Drupal\textimage\Plugin;
-
-use Drupal\Component\Plugin\ConfigurablePluginInterface;
-use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
-use Drupal\Core\Plugin\PluginFormInterface;
-
-
-/**
- * Textimage base plugin interface.
- */
-interface TextimagePluginBaseInterface extends ConfigurablePluginInterface, ContainerFactoryPluginInterface, PluginFormInterface {
-  /**
-   * Return a form element to select the plugin content.
-   *
-   * @param array $options
-   *   (Optional) An array of additional Form API keys and values.
-   *
-   * @return array
-   *   Render array of the form element.
-   */
-  public function selectionElement(array $options = array());
-
-  /**
-   * Get the plugin Textimage type.
-   *
-   * @return string
-   *   The plugin type.
-   */
-  public function getType();
-
-  /**
-   * Determines if plugin can be used.
-   *
-   * @return boolean
-   *   TRUE if the plugin is available.
-   */
-  public static function isAvailable();
-}
diff --git a/src/Plugin/TextimagePluginManager.php b/src/Plugin/TextimagePluginManager.php
deleted file mode 100644
index 802bd3b..0000000
--- a/src/Plugin/TextimagePluginManager.php
+++ /dev/null
@@ -1,99 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\textimage\Plugin\TextimagePluginManager.
- */
-
-namespace Drupal\textimage\Plugin;
-
-use Drupal\Core\Cache\CacheBackendInterface;
-use Drupal\Core\Config\ConfigFactoryInterface;
-use Drupal\Core\Extension\ModuleHandlerInterface;
-use Drupal\Core\Language\LanguageManager;
-use Drupal\Core\Plugin\DefaultPluginManager;
-
-/**
- * Plugin manager for Textimage plugins.
- */
-class TextimagePluginManager extends DefaultPluginManager {
-
-  /**
-   * The configuration object.
-   *
-   * @var \Drupal\Core\Config\Config
-   */
-  protected $config;
-
-  /**
-   * {@inheritdoc}
-   *
-   * @param string $type
-   *   The plugin type, for example Font.
-   */
-  public function __construct($type, \Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler, ConfigFactoryInterface $config_factory) {
-    $this->config = $config_factory->get('textimage.settings');
-    parent::__construct("Plugin/textimage/$type", $namespaces, $module_handler);
-    $this->alterInfo('textimage_' . $type . '_plugin_info');
-    $this->setCacheBackend($cache_backend, 'textimage_' . $type . '_plugins');
-    $this->defaults += array(
-      'plugin_type' => $type,
-    );
-  }
-
-  public function getType() {
-    return $this->defaults['plugin_type'];
-  }
-
-  public function getPlugin($plugin_id = NULL) {
-    $plugin_id = $plugin_id ?: $this->config->get($this->getType() . '.plugin_id');
-    $plugins = $this->getAvailablePlugins();
-
-    // Check if plugin is available.
-    if (!isset($plugins[$plugin_id]) || !class_exists($plugins[$plugin_id]['class'])) {
-      trigger_error("Textimage " . $this->getType() . " handling plugin '$plugin_id' is no longer available.", E_USER_ERROR);
-      $plugin_id = NULL;
-    }
-
-    // Return plugin instance or base Textimage plugin if not available.
-    if ($plugin_id) {
-      return $this->createInstance($plugin_id, array('plugin_type' => $this->getType()));
-    }
-    else {
-      return $this->createInstance('textimage', array('plugin_type' => $this->getType()));
-    }
-  }
-
-  /**
-   * Gets a list of available plugins.
-   *
-   * @return array
-   *   An array with the plugin ids as keys and the definitions as values.
-   */
-  public function getAvailablePlugins() {
-    $plugins = $this->getDefinitions();
-    $output = array();
-    foreach ($plugins as $id => $definition) {
-      // Only allow plugins that are available.
-      if (call_user_func($definition['class'] . '::isAvailable')) {
-        $output[$id] = $definition;
-      }
-    }
-    return $output;
-  }
-
-  /**
-   * Gets a formatted list of available plugins.
-   *
-   * @return array
-   *   An array with the plugin ids as keys and the descriptions as values.
-   */
-  public function getPluginOptions() {
-    $options = array();
-    foreach ($this->getAvailablePlugins() as $plugin) {
-      $options[$plugin['id']] = '<b>' . $plugin['short_title'] . '</b> - ' . $plugin['help'];
-    }
-    return $options;
-  }
-
-}
diff --git a/src/Plugin/textimage/background/Textimage.php b/src/Plugin/textimage/background/Textimage.php
deleted file mode 100644
index 11163a0..0000000
--- a/src/Plugin/textimage/background/Textimage.php
+++ /dev/null
@@ -1,127 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\textimage\Plugin\textimage\background\Textimage.
- */
-
-namespace Drupal\textimage\Plugin\textimage\background;
-
-use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Url;
-use Drupal\textimage\Plugin\TextimageBackgroundPluginInterface;
-use Drupal\textimage\Plugin\TextimagePluginBase;
-
-/**
- * Basic background image plugin for Textimage.
- *
- * Provides access to images stored in a directory, specified in configuration.
- *
- * @Plugin(
- *   id = "textimage",
- *   title = @Translation("Textimage basic image handler"),
- *   short_title = @Translation("Textimage"),
- *   help = @Translation("Access images stored in the directory specified in configuration.")
- * )
- */
-class Textimage extends TextimagePluginBase implements TextimageBackgroundPluginInterface {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function defaultConfiguration() {
-    return array('path' => '');
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function buildConfigurationForm(array $form, FormStateInterface $form_state, array $ajax_settings = []) {
-    $element['path'] = array(
-      '#type' => 'textfield',
-      '#title' => $this->t('Path'),
-      '#default_value' => $this->configuration['path'],
-      '#element_validate' => array(array($this, 'validatePath')),
-      '#maxlength' => 255,
-      '#description' =>
-        $this->t('Location of the directory where the background images are stored.') . ' ' .
-        $this->t('Relative paths will be resolved relative to the Drupal installation directory.'),
-    );
-    return $element;
-  }
-
-  /**
-   * Validation handler for the 'path' element.
-   */
-  public function validatePath($element, FormStateInterface $form_state, $form) {
-    if (!is_dir($element['#value'])) {
-      $form_state->setErrorByName(implode('][', $element['#parents']), $this->t('Invalid directory specified.'));
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function selectionElement(array $options = array()) {
-    // Get list of images.
-    $image_files = $this->getList();
-    if (empty($image_files)) {
-      $this->logger->warning(
-        'No background images available. Make sure at least one image is available in the directory specified in the <a href=":url">configuration page</a>.',
-        [':url' => Url::fromRoute('textimage.settings')->toString()]
-      );
-    }
-    // Element.
-    return array(
-      '#type'  => 'select',
-      '#title'   => isset($options['#title']) ? $options['#title'] : $this->t('Background image'),
-      '#description' => isset($options['#description']) ? $options['#description'] : $this->t('Select image.'),
-      '#options' => array_combine($image_files, $image_files),
-      '#default_value' => isset($options['background_image']['uri']) ? pathinfo($options['background_image']['uri'], PATHINFO_BASENAME) : '',
-      '#element_validate' => array(array($this, 'validateSelectorUri')),
-      '#states' => array(
-        'visible' => array(
-          ':input[name="data[background_image][mode]"]' => array('value' => 'select'),
-        ),
-      ),
-    );
-  }
-
-  /**
-   * Validation handler for the selection element.
-   */
-  public function validateSelectorUri($element, FormStateInterface $form_state, $form) {
-    if ($form_state->getValue(array('data', 'background_image', 'mode')) == 'select') {
-      $file_path = $this->configuration['path'] . '/' . $element['#value'];
-      if (!file_exists($file_path)) {
-        $form_state->setErrorByName(implode('][', $element['#parents']), $this->t('The file selected does not exist.'));
-      }
-      else {
-        $form_state->setValue(array('data', 'background_image', 'uri'), $file_path);
-      }
-    }
-  }
-
-  /**
-   * Returns an array of files with image extensions in the specified directory.
-   *
-   * @param string $images_dir
-   *   URL of the images directory.
-   *
-   * @return array
-   *   Array of image files.
-   */
-  protected function getList() {
-    $filelist = array();
-    if (is_dir($this->configuration['path']) && $handle = opendir($this->configuration['path'])) {
-      while ($file = readdir($handle)) {
-        if (preg_match("/\.gif|\.png|\.jpg|\.jpeg$/i", $file) == 1) { // @todo make this list dependent on toolkit capabilities
-          $filelist[] = $file;
-        }
-      }
-      closedir($handle);
-    }
-    return $filelist;
-  }
-
-}
diff --git a/src/Plugin/textimage/color/Textimage.php b/src/Plugin/textimage/color/Textimage.php
deleted file mode 100644
index 5290f35..0000000
--- a/src/Plugin/textimage/color/Textimage.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\textimage\Plugin\textimage\color\Textimage.
- */
-
-namespace Drupal\textimage\Plugin\textimage\color;
-
-use Drupal\Core\Form\FormStateInterface;
-use Drupal\textimage\Plugin\TextimageColorPluginInterface;
-use Drupal\textimage\Plugin\TextimagePluginBase;
-
-/**
- * Basic color plugin for Textimage.
- *
- * Provides access to images stored in a directory, specified in configuration.
- *
- * @Plugin(
- *   id = "textimage",
- *   title = @Translation("Textimage basic color handler"),
- *   short_title = @Translation("Textimage"),
- *   help = @Translation("Use an HTML5 color element to select colors.")
- * )
- */
-class Textimage extends TextimagePluginBase implements TextimageColorPluginInterface {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function selectionElement(array $options = array()) {
-    return array(
-      '#type' => 'color',
-      '#title'   => isset($options['#title']) ? $options['#title'] : $this->t('Color'),
-      '#description' => isset($options['#description']) ? $options['#description'] : NULL,
-      '#default_value' => $options['#default_value'],
-      '#field_suffix' => $options['#default_value'],
-      '#wrapper_attributes' => ['class' => ['textimage-color-element']],
-      '#maxlength' => 7,
-      '#size' => 7,
-      '#attached' => ['library' => ['textimage/textimage.color_element']],
-    );
-  }
-}
diff --git a/src/Plugin/textimage/font/Textimage.php b/src/Plugin/textimage/font/Textimage.php
deleted file mode 100644
index cbbb7fa..0000000
--- a/src/Plugin/textimage/font/Textimage.php
+++ /dev/null
@@ -1,254 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\textimage\Plugin\textimage\font\Textimage.
- */
-
-namespace Drupal\textimage\Plugin\textimage\font;
-
-use Drupal\Component\Utility\Unicode;
-use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Url;
-use Drupal\textimage\Plugin\TextimageFontPluginInterface;
-use Drupal\textimage\Plugin\TextimagePluginBase;
-
-/**
- * Basic font handler for Textimage.
- *
- * Provides access to fonts stored in a directory, specified in configuration.
- *
- * @Plugin(
- *   id = "textimage",
- *   title = @Translation("Textimage basic font handler"),
- *   short_title = @Translation("Textimage"),
- *   help = @Translation("Access fonts stored in the directory specified in configuration.")
- * )
- */
-class Textimage extends TextimagePluginBase implements TextimageFontPluginInterface {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function defaultConfiguration() {
-    return array('path' => '');
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function buildConfigurationForm(array $form, FormStateInterface $form_state, array $ajax_settings = []) {
-    $element['path'] = array(
-      '#type' => 'textfield',
-      '#title' => $this->t('Path'),
-      '#default_value' => $this->configuration['path'],
-      '#maxlength' => 255,
-      '#element_validate' => array(array($this, 'validatePath')),
-      '#limit_validation_errors' => FALSE,
-      '#description' =>
-        $this->t('Location of the directory where the fonts are stored.') . ' ' .
-        $this->t('Relative paths will be resolved relative to the Drupal installation directory.'),
-    );
-    if ($ajax_settings) {
-      $element['path']['#ajax'] = $ajax_settings;
-      $element['path']['#ajax']['event'] = 'change';
-    }
-    return $element;
-  }
-
-  /**
-   * Validation handler for the 'path' element.
-   */
-  public function validatePath($element, FormStateInterface $form_state, $form) {
-    if (!is_dir($element['#value'])) {
-      $form_state->setErrorByName(implode('][', $element['#parents']), $this->t('Invalid directory specified.'));
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function selectionElement(array $options = array()) {
-
-    // Get list of font names.
-    $fonts_list = $this->getList();
-    if (empty($fonts_list)) {
-      $this->logger->warning(
-        'No fonts available. Make sure at least one font is available in the directory specified in the <a href=":url">configuration page</a>.',
-        [':url' => Url::fromRoute('textimage.settings')->toString()]
-      );
-      return [];
-    }
-
-    // Default font.
-    $font_options = array_combine($fonts_list, $fonts_list);
-
-    // Element.
-    return array(
-      '#type'    => 'select',
-      '#title'   => isset($options['#title']) ? $options['#title'] : $this->t('Font'),
-      '#description' => isset($options['#description']) ? $options['#description'] : $this->t('Select font.'),
-      '#options' => $font_options,
-      '#default_value' => $options['#default_value'],
-      '#limit_validation_errors' => FALSE,
-      '#required' => TRUE,
-    );
-
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getUri($font_name) {
-    if (is_dir($this->configuration['path']) && $handle = opendir($this->configuration['path'])) {
-      while ($file_name = readdir($handle)) {
-        if (preg_match("/\.[ot]tf$/i", $file_name) == 1) {
-          $font = $this->getData($this->configuration['path'] . '/' . $file_name);
-          if ($font_name == $font['name']) {
-            return $font['file'];
-          }
-        }
-      }
-      closedir($handle);
-    }
-    return NULL;
-  }
-
-  /**
-   * Return an array of fonts.
-   *
-   * Scans through files available in the directory specified through
-   * configuration.
-   *
-   * @param array $options
-   *   an array of additional options.
-   *
-   * @return array
-   *   Array of font names.
-   */
-  protected function getList() {
-    $filelist = array();
-    if (is_dir($this->configuration['path']) && $handle = opendir($this->configuration['path'])) {
-      while ($file_name = readdir($handle)) {
-        if (preg_match("/\.[ot]tf$/i", $file_name) == 1) {
-          $font = $this->getData($this->configuration['path'] . '/' . $file_name);
-          $filelist[$file_name] = $font['name'];
-        }
-      }
-      closedir($handle);
-    }
-    asort($filelist);
-    return $filelist;
-  }
-
-  /**
-   * Return the font information.
-   *
-   * Scans the font file to return tags information.
-   *
-   * @param string $uri
-   *   the URI of the font file.
-   *
-   * @return array
-   *   an associative array with the following keys:
-   *   'copyright' => Copyright information
-   *   'family' => Font family
-   *   'subfamily' => Font subfamily
-   *   'name' => Font name
-   *   'file' => Font file URI
-   */
-  protected function getData($uri) {
-    $realpath = drupal_realpath($uri);
-    $pathinfo = pathinfo($realpath);
-    $fd = fopen($realpath, "r");
-    $text = fread($fd, filesize($realpath));
-    fclose($fd);
-
-    $number_of_tabs = $this->dec2hex(ord($text[4])) . $this->dec2hex(ord($text[5]));
-    for ($i = 0; $i < hexdec($number_of_tabs); $i++) {
-      $tag = $text[12 + $i * 16] . $text[12 + $i * 16 + 1] . $text[12 + $i * 16 + 2] . $text[12 + $i * 16 + 3];
-      if ($tag == "name") {
-        $offset_name_table_hex = $this->dec2hex(ord($text[12 + $i * 16 + 8])) . $this->dec2hex(ord($text[12 + $i * 16 + 8 + 1])) . $this->dec2hex(ord($text[12 + $i * 16 + 8 + 2])) . $this->dec2hex(ord($text[12 + $i * 16 + 8 + 3]));
-        $offset_name_table_dec = hexdec($offset_name_table_hex);
-        $offset_storage_hex = $this->dec2hex(ord($text[$offset_name_table_dec + 4])) . $this->dec2hex(ord($text[$offset_name_table_dec + 5]));
-        $offset_storage_dec = hexdec($offset_storage_hex);
-        $number_name_records_hex = $this->dec2hex(ord($text[$offset_name_table_dec + 2])) . $this->dec2hex(ord($text[$offset_name_table_dec + 3]));
-        $number_name_records_dec = hexdec($number_name_records_hex);
-        break;
-      }
-    }
-
-    $storage_dec = $offset_storage_dec + $offset_name_table_dec;
-    $storage_hex = Unicode::strtoupper(dechex($storage_dec));
-    $font = array(
-      'copyright' => '',
-      'family' => '',
-      'subfamily' => '',
-      'name' => '',
-      'file' => $uri,
-    );
-
-    for ($j = 0; $j < $number_name_records_dec; $j++) {
-      $platform_id_hex = $this->dec2hex(ord($text[$offset_name_table_dec + 6 + $j * 12 + 0])) . $this->dec2hex(ord($text[$offset_name_table_dec + 6 + $j * 12 + 1]));
-      $platform_id_dec = hexdec($platform_id_hex);
-      $name_id_hex = $this->dec2hex(ord($text[$offset_name_table_dec + 6 + $j * 12 + 6])) . $this->dec2hex(ord($text[$offset_name_table_dec + 6 + $j * 12 + 7]));
-      $name_id_dec = hexdec($name_id_hex);
-      $string_length_hex = $this->dec2hex(ord($text[$offset_name_table_dec + 6 + $j * 12 + 8])) . $this->dec2hex(ord($text[$offset_name_table_dec + 6 + $j * 12 + 9]));
-      $string_length_dec = hexdec($string_length_hex);
-      $string_offset_hex = $this->dec2hex(ord($text[$offset_name_table_dec + 6 + $j * 12 + 10])) . $this->dec2hex(ord($text[$offset_name_table_dec + 6 + $j * 12 + 11]));
-      $string_offset_dec = hexdec($string_offset_hex);
-
-      if ($name_id_dec == 0 && empty($font['copyright'])) {
-        for ($l = 0; $l < $string_length_dec; $l++) {
-          if (ord($text[$storage_dec + $string_offset_dec + $l]) >= 32) {
-            $font['copyright'] .= $text[$storage_dec + $string_offset_dec + $l];
-          }
-        }
-      }
-
-      if ($name_id_dec == 1 && empty($font['family'])) {
-        for ($l = 0; $l < $string_length_dec; $l++) {
-          if (ord($text[$storage_dec + $string_offset_dec + $l]) >= 32) {
-            $font['family'] .= $text[$storage_dec + $string_offset_dec + $l];
-          }
-        }
-      }
-
-      if ($name_id_dec == 2 && empty($font['subfamily'])) {
-        for ($l = 0; $l < $string_length_dec; $l++) {
-          if (ord($text[$storage_dec + $string_offset_dec + $l]) >= 32) {
-            $font['subfamily'] .= $text[$storage_dec + $string_offset_dec + $l];
-          }
-        }
-      }
-
-      if ($name_id_dec == 4 && empty($font['name'])) {
-        for ($l = 0; $l < $string_length_dec; $l++) {
-          if (ord($text[$storage_dec + $string_offset_dec + $l]) >= 32) {
-            $font['name'] .= $text[$storage_dec + $string_offset_dec + $l];
-          }
-        }
-      }
-
-      if ($font['copyright'] != "" && $font['family'] != "" && $font['subfamily'] != "" && $font['name'] != "") {
-        break;
-      }
-    }
-
-    return $font;
-  }
-
-  /**
-   * Convert a dec to a hex.
-   *
-   * @param int $dec
-   *   an integer number
-   *
-   * @return string
-   *   the number represented as hex
-   */
-  protected function dec2hex($dec) {
-    $hex = dechex($dec);
-    return str_repeat("0", 2 - Unicode::strlen($hex)) . Unicode::strtoupper($hex);
-  }
-}
diff --git a/src/Tests/TextimageTest.php b/src/Tests/TextimageTest.php
index f01ab83..65cea71 100644
--- a/src/Tests/TextimageTest.php
+++ b/src/Tests/TextimageTest.php
@@ -31,23 +31,23 @@ class TextimageTest extends TextimageTestBase {
     $input = [
       [
         'text' => ['preview text image'],
-        'width' => 177,
-        'height' => 28,
+        'width' => 171,
+        'height' => 24,
       ],
       [
         'text' => ['Предварительный просмотр текста'],
-        'width' => 331,
-        'height' => 28,
+        'width' => 335,
+        'height' => 24,
       ],
       [
         'text' => ['προεπισκόπηση της εικόνας κείμενο'],
-        'width' => 328,
-        'height' => 28,
+        'width' => 325,
+        'height' => 24,
       ],
       [
         'text' => ['Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'],
-        'width' => 1148,
-        'height' => 28,
+        'width' => 1104,
+        'height' => 24,
       ],
     ];
 
@@ -142,7 +142,7 @@ class TextimageTest extends TextimageTestBase {
     $this->assertResponse(200);
     $files_count = count(file_scan_directory($public_directory_path . '/textimage/textimage_test', '/.*/'));
     $this->assertTrue($files_count == 1, 'Textimage generation via request URL.');
-    $this->assertTextimage('public://textimage/textimage_test/url_preview_text_image---additional text.png', 225, 28);
+    $this->assertTextimage('public://textimage/textimage_test/url_preview_text_image---additional text.png', 217, 24);
 
     // Test build a textimage at target URI via API.
     $uri = $this->textimageFactory->get()
@@ -153,7 +153,7 @@ class TextimageTest extends TextimageTestBase {
       ->getUri();
     $files_count = count(file_scan_directory('public://textimage-testing', '/.*/'));
     $this->assertTrue($files_count == 1, 'Textimage generation at target URI via API.');
-    $this->assertTextimage('public://textimage-testing/bingo-bongo.png', 35, 28);
+    $this->assertTextimage('public://textimage-testing/bingo-bongo.png', 33, 24);
 
     // Test build another textimage at same target URI.
     $uri = $this->textimageFactory->get()
@@ -165,7 +165,7 @@ class TextimageTest extends TextimageTestBase {
     // Check file was replaced.
     $files_count = count(file_scan_directory('public://textimage-testing', '/.*/'));
     $this->assertTrue($files_count == 1, 'Textimage replaced at target URI via API.');
-    $this->assertTextimage('public://textimage-testing/bingo-bongo.png', 113, 28);
+    $this->assertTextimage('public://textimage-testing/bingo-bongo.png', 107, 24);
   }
 
 }
diff --git a/src/Tests/TextimageTestBase.php b/src/Tests/TextimageTestBase.php
index 6324e0b..014bf74 100644
--- a/src/Tests/TextimageTestBase.php
+++ b/src/Tests/TextimageTestBase.php
@@ -21,7 +21,7 @@ abstract class TextimageTestBase extends WebTestBase {
   protected $textimageFactory;
   protected $renderer;
 
-  public static $modules = array('textimage', 'node');
+  public static $modules = array('textimage', 'node', 'image_effects');
 
   /**
    * {@inheritdoc}
@@ -50,11 +50,18 @@ abstract class TextimageTestBase extends WebTestBase {
     ));
     $this->drupalLogin($this->adminUser);
 
+    // Change Image Effects settings.
+    $config = \Drupal::configFactory()->getEditable('image_effects.settings');
+    $config
+      ->set('image_selector.plugin_id', 'dropdown')
+      ->set('image_selector.plugin_settings.dropdown.path', drupal_get_path('module', 'textimage') . '/tests')
+      ->set('font_selector.plugin_id', 'dropdown')
+      ->set('font_selector.plugin_settings.dropdown.path', drupal_get_path('module', 'image_effects') . '/tests/fonts/LinLibertineTTF_5.3.0_2012_07_02')
+      ->save();
+
     // Change Textimage settings.
     $config = \Drupal::configFactory()->getEditable('textimage.settings');
     $config
-      ->set('font.plugin_settings.textimage.path', drupal_get_path('module', 'textimage') . '/tests/fonts')
-      ->set('background.plugin_settings.textimage.path', drupal_get_path('module', 'textimage') . '/tests')
       ->set('url_generation.enabled', TRUE)
       ->set('debug', TRUE)
       ->save();
@@ -62,7 +69,7 @@ abstract class TextimageTestBase extends WebTestBase {
     // Set default font.
     $this->drupalGet($this->textimageAdmin);
     $edit = array(
-      'settings[font][default_font_name]' => 'Old Standard TT Regular',
+      'settings[main][default_font_uri]' => 'LinLibertine_Rah.ttf',
     );
     $this->drupalPostForm(NULL, $edit, t('Save configuration'));
 
diff --git a/templates/textimage-color-detail.html.twig b/templates/textimage-color-detail.html.twig
deleted file mode 100644
index 36fe45a..0000000
--- a/templates/textimage-color-detail.html.twig
+++ /dev/null
@@ -1,20 +0,0 @@
-{#
-/**
- * @file
- * Default theme implementation for Textimage color box templates.
- *
- * @ingroup themeable
- */
-#}
-{% if color %}
-  {% if border %}
-	<span class='textimage-color-box' style='background-color: {{ color }}; color: {{ color }}; border-color: {{ border_color }};'>M</span> {{ color }}
-  {% else %}
-	<span class='textimage-color-box' style='background-color: {{ color }}; color: {{ color }}; '>M</span> {{ color }}
-  {% endif %}
-  {% if color_opacity < 100 %}
-    {{ 'opacity'|t  }}: {{ color_opacity }}%
-  {% endif %}
-{% else %}
-  {{ 'Transparent'|t  }}
-{% endif %}
diff --git a/tests/fonts/OldStandard-Bold.ttf b/tests/fonts/OldStandard-Bold.ttf
deleted file mode 100644
index ac6c8fe..0000000
Binary files a/tests/fonts/OldStandard-Bold.ttf and /dev/null differ
diff --git a/tests/fonts/OldStandard-Italic.ttf b/tests/fonts/OldStandard-Italic.ttf
deleted file mode 100644
index 29a3309..0000000
Binary files a/tests/fonts/OldStandard-Italic.ttf and /dev/null differ
diff --git a/tests/fonts/OldStandard-Regular.ttf b/tests/fonts/OldStandard-Regular.ttf
deleted file mode 100644
index 835e098..0000000
Binary files a/tests/fonts/OldStandard-Regular.ttf and /dev/null differ
diff --git a/tests/fonts/SIL Open Font License 1.1.txt b/tests/fonts/SIL Open Font License 1.1.txt
deleted file mode 100644
index de3c0b8..0000000
--- a/tests/fonts/SIL Open Font License 1.1.txt	
+++ /dev/null
@@ -1,91 +0,0 @@
-This Font Software is licensed under the SIL Open Font License, Version 1.1.
-This license is copied below, and is also available with a FAQ at:
-http://scripts.sil.org/OFL
-
-
------------------------------------------------------------
-SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
------------------------------------------------------------
-
-PREAMBLE
-The goals of the Open Font License (OFL) are to stimulate worldwide
-development of collaborative font projects, to support the font creation
-efforts of academic and linguistic communities, and to provide a free and
-open framework in which fonts may be shared and improved in partnership
-with others.
-
-The OFL allows the licensed fonts to be used, studied, modified and
-redistributed freely as long as they are not sold by themselves. The
-fonts, including any derivative works, can be bundled, embedded,
-redistributed and/or sold with any software provided that any reserved
-names are not used by derivative works. The fonts and derivatives,
-however, cannot be released under any other type of license. The
-requirement for fonts to remain under this license does not apply
-to any document created using the fonts or their derivatives.
-
-DEFINITIONS
-"Font Software" refers to the set of files released by the Copyright
-Holder(s) under this license and clearly marked as such. This may
-include source files, build scripts and documentation.
-
-"Reserved Font Name" refers to any names specified as such after the
-copyright statement(s).
-
-"Original Version" refers to the collection of Font Software components as
-distributed by the Copyright Holder(s).
-
-"Modified Version" refers to any derivative made by adding to, deleting,
-or substituting -- in part or in whole -- any of the components of the
-Original Version, by changing formats or by porting the Font Software to a
-new environment.
-
-"Author" refers to any designer, engineer, programmer, technical
-writer or other person who contributed to the Font Software.
-
-PERMISSION & CONDITIONS
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the Font Software, to use, study, copy, merge, embed, modify,
-redistribute, and sell modified and unmodified copies of the Font
-Software, subject to the following conditions:
-
-1) Neither the Font Software nor any of its individual components,
-in Original or Modified Versions, may be sold by itself.
-
-2) Original or Modified Versions of the Font Software may be bundled,
-redistributed and/or sold with any software, provided that each copy
-contains the above copyright notice and this license. These can be
-included either as stand-alone text files, human-readable headers or
-in the appropriate machine-readable metadata fields within text or
-binary files as long as those fields can be easily viewed by the user.
-
-3) No Modified Version of the Font Software may use the Reserved Font
-Name(s) unless explicit written permission is granted by the corresponding
-Copyright Holder. This restriction only applies to the primary font name as
-presented to the users.
-
-4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
-Software shall not be used to promote, endorse or advertise any
-Modified Version, except to acknowledge the contribution(s) of the
-Copyright Holder(s) and the Author(s) or with their explicit written
-permission.
-
-5) The Font Software, modified or unmodified, in part or in whole,
-must be distributed entirely under this license, and must not be
-distributed under any other license. The requirement for fonts to
-remain under this license does not apply to any document created
-using the Font Software.
-
-TERMINATION
-This license becomes null and void if any of the above conditions are
-not met.
-
-DISCLAIMER
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
-OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
-COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
-DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
-OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/textimage.libraries.yml b/textimage.libraries.yml
index fb10b83..d8e77f4 100644
--- a/textimage.libraries.yml
+++ b/textimage.libraries.yml
@@ -5,11 +5,3 @@ admin.ui:
   css:
     component:
       css/admin.ui.css: {}
-
-textimage.color_element:
-  version: VERSION
-  js:
-    js/textimage.color_element.js: {}
-  css:
-    component:
-      css/textimage.color_element.css: {}
diff --git a/textimage.module b/textimage.module
index d4f2452..09dbbc7 100644
--- a/textimage.module
+++ b/textimage.module
@@ -12,7 +12,7 @@ use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\Core\StreamWrapper\StreamWrapperInterface;
 use Drupal\Core\Template\Attribute;
 use Drupal\image\ImageStyleInterface;
-use Drupal\textimage\Component\ColorUtility;
+use Drupal\image_effects\Component\ColorUtility;
 use Drupal\textimage\Textimage;
 use Drupal\textimage\TextimageException;
 
@@ -65,14 +65,6 @@ function textimage_theme() {
         'textimage_data' => [],
       ),
     ),
-    // Render a color information box and string.
-    'textimage_color_detail' => array(
-      'variables' => array(
-        'color' => '#000000',
-        'border' => FALSE,
-        'border_color' => '#000000',
-      ),
-    ),
   );
   return $theme;
 }
@@ -285,27 +277,6 @@ function template_preprocess_textimage_formatter(&$variables) {
 }
 
 /**
- * Prepares variables to get a color info.
- *
- * Default template: textimage-color-detail.html.twig.
- */
-function template_preprocess_textimage_color_detail(&$variables) {
-  $variables['#attached']['library'][] = 'textimage/admin.ui';
-  if ($variables['color']) {
-    if ($variables['border']) {
-      if ($variables['border_color'] == 'matchLuma') {
-        $variables['border_color'] = ColorUtility::matchLuma($variables['color']);
-      }
-      else {
-        $variables['border_color'] = Unicode::substr($variables['border_color'], 0, 7);
-      }
-    }
-    $variables['color_opacity'] = ColorUtility::rgbaToOpacity($variables['color']);
-    $variables['color'] = Unicode::substr($variables['color'], 0, 7);
-  }
-}
-
-/**
  * Prepares variables to get a Textimage preview.
  *
  * Default template: textimage-preview.html.twig.
diff --git a/textimage.services.yml b/textimage.services.yml
index 815fd08..dc75563 100644
--- a/textimage.services.yml
+++ b/textimage.services.yml
@@ -13,15 +13,6 @@ services:
   logger.channel.textimage:
     parent: logger.channel_base
     arguments: ['textimage']
-  plugin.manager.textimage.font:
-    class: Drupal\textimage\Plugin\TextimagePluginManager
-    arguments: [font, '@container.namespaces', '@cache.discovery', '@module_handler', '@config.factory']
-  plugin.manager.textimage.background:
-    class: Drupal\textimage\Plugin\TextimagePluginManager
-    arguments: [background, '@container.namespaces', '@cache.discovery', '@module_handler', '@config.factory']
-  plugin.manager.textimage.color:
-    class: Drupal\textimage\Plugin\TextimagePluginManager
-    arguments: [color, '@container.namespaces', '@cache.discovery', '@module_handler', '@config.factory']
   textimage.factory:
     class: Drupal\textimage\TextimageFactory
     arguments: ['@config.factory', '@token', '@textimage.logger', '@cache.textimage', '@current_user', '@stream_wrapper_manager', '@entity.manager']
