diff --git a/core/core.services.yml b/core/core.services.yml
index 7f9ed9b..9b78f48 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -892,7 +892,7 @@ services:
     parent: default_plugin_manager
   image.toolkit.operation.manager:
     class: Drupal\Core\ImageToolkit\ImageToolkitOperationManager
-    arguments: ['@logger.channel.image']
+    arguments: ['@logger.channel.image', '@image.toolkit.manager']
     parent: default_plugin_manager
   image.factory:
     class: Drupal\Core\Image\ImageFactory
diff --git a/core/lib/Drupal/Core/Entity/Plugin/DataType/Deriver/EntityDeriver.php b/core/lib/Drupal/Core/Entity/Plugin/DataType/Deriver/EntityDeriver.php
index 0c80fcf..d6490dc 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/DataType/Deriver/EntityDeriver.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/DataType/Deriver/EntityDeriver.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\Core\Entity\Plugin\DataType\Deriver;
 
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -53,7 +54,7 @@ public function __construct($base_plugin_id, EntityManagerInterface $entity_mana
   /**
    * {@inheritdoc}
    */
-  public static function create(ContainerInterface $container, $base_plugin_id) {
+  public static function create(ContainerInterface $container, $base_plugin_id, DiscoveryInterface $discovery = NULL) {
     return new static(
       $base_plugin_id,
       $container->get('entity.manager')
diff --git a/core/lib/Drupal/Core/Field/Plugin/DataType/Deriver/FieldItemDeriver.php b/core/lib/Drupal/Core/Field/Plugin/DataType/Deriver/FieldItemDeriver.php
index ef15e33..2525048 100644
--- a/core/lib/Drupal/Core/Field/Plugin/DataType/Deriver/FieldItemDeriver.php
+++ b/core/lib/Drupal/Core/Field/Plugin/DataType/Deriver/FieldItemDeriver.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\Core\Field\Plugin\DataType\Deriver;
 
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\Core\Field\FieldTypePluginManagerInterface;
 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -53,7 +54,7 @@ public function __construct($base_plugin_id, FieldTypePluginManagerInterface $fi
   /**
    * {@inheritdoc}
    */
-  public static function create(ContainerInterface $container, $base_plugin_id) {
+  public static function create(ContainerInterface $container, $base_plugin_id, DiscoveryInterface $discovery = NULL) {
     return new static(
       $base_plugin_id,
       $container->get('plugin.manager.field.field_type')
diff --git a/core/lib/Drupal/Core/ImageToolkit/Annotation/ImageToolkit.php b/core/lib/Drupal/Core/ImageToolkit/Annotation/ImageToolkit.php
index a73e5e2..e9a1961 100644
--- a/core/lib/Drupal/Core/ImageToolkit/Annotation/ImageToolkit.php
+++ b/core/lib/Drupal/Core/ImageToolkit/Annotation/ImageToolkit.php
@@ -17,8 +17,7 @@
  *
  * Plugin namespace: Plugin\ImageToolkit
  *
- * For a working example, see
- * \Drupal\system\Plugin\ImageToolkit\GDToolkit
+ * For a working example, see \Drupal\system\Plugin\ImageToolkit\GDToolkit.
  *
  * @see \Drupal\Core\ImageToolkit\Annotation\ImageToolkitOperation
  * @see \Drupal\Core\ImageToolkit\ImageToolkitInterface
@@ -48,4 +47,11 @@ class ImageToolkit extends Plugin {
    */
   public $title;
 
+  /**
+   * A class to make the plugin derivative aware.
+   *
+   * @var string
+   */
+  public $derivative = '';
+
 }
diff --git a/core/lib/Drupal/Core/ImageToolkit/ImageToolkitDerivative.php b/core/lib/Drupal/Core/ImageToolkit/ImageToolkitDerivative.php
new file mode 100644
index 0000000..69aefde
--- /dev/null
+++ b/core/lib/Drupal/Core/ImageToolkit/ImageToolkitDerivative.php
@@ -0,0 +1,72 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Plugin\ImageToolkit\ImageToolkitDerivative.
+ */
+
+namespace Drupal\Core\Plugin\ImageToolkit;
+
+use Drupal\Core\ImageToolkit\ImageToolkitManager;
+use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
+use Drupal\Core\Plugin\PluginBase;
+use Drupal\Component\Plugin\Derivative\DeriverBase;
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Provides derived class for image toolkit derivative plugins.
+ */
+class ImageToolkitDerivative extends DeriverBase implements ContainerDeriverInterface {
+
+  /**
+   * The image toolkit manager.
+   *
+   * @var \Drupal\Core\ImageToolkit\ImageToolkitManager
+   */
+  protected $toolkitManager;
+
+  /**
+   * The decorated plugin discovery.
+   *
+   * @var \Drupal\Component\Plugin\Discovery\DiscoveryInterface
+   */
+  public $discovery;
+
+  /**
+   * Constructs a deriver class for image toolkit plugin derivatives.
+   *
+   * @param \Drupal\Core\ImageToolkit\ImageToolkitManager $toolkit_manager
+   *   The image toolkit manager service.
+   * @param \Drupal\Component\Plugin\Discovery\DiscoveryInterface
+   *   The decorated plugin discovery object.
+   */
+  public function __construct(ImageToolkitManager $toolkit_manager, DiscoveryInterface $discovery) {
+    $this->toolkitManager = $toolkit_manager;
+    $this->discovery = $discovery;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  static public function create(ContainerInterface $container, $base_plugin_id, DiscoveryInterface $discovery = NULL) {
+    return new static($container->get('image.toolkit.manager'), $discovery);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDerivativeDefinitions($base_plugin_definition) {
+    $base_plugin_id = $base_plugin_definition['id'];
+    $pattern = '/^' . $base_plugin_id . '(\\' . PluginBase::DERIVATIVE_SEPARATOR . '(.*))?$/';
+    foreach ($this->discovery->getDefinitions() as $plugin_id => $definition) {
+      if (preg_match($pattern, $plugin_id, $found)) {
+        $id = !empty($found[2]) ? $found[2] : '';
+        $this->derivatives[$id] = $definition;
+      }
+    }
+
+    return parent::getDerivativeDefinitions($base_plugin_definition);
+  }
+
+}
diff --git a/core/lib/Drupal/Core/ImageToolkit/ImageToolkitOperationManager.php b/core/lib/Drupal/Core/ImageToolkit/ImageToolkitOperationManager.php
index dc4abaa..111085d 100644
--- a/core/lib/Drupal/Core/ImageToolkit/ImageToolkitOperationManager.php
+++ b/core/lib/Drupal/Core/ImageToolkit/ImageToolkitOperationManager.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\Core\ImageToolkit;
 
+use Drupal\Component\Plugin\DerivativeInspectionInterface;
 use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Plugin\DefaultPluginManager;
@@ -33,6 +34,13 @@ class ImageToolkitOperationManager extends DefaultPluginManager implements Image
   protected $logger;
 
   /**
+   * The image toolkit manager.
+   *
+   * @var \Drupal\Core\ImageToolkit\ImageToolkitManager
+   */
+  protected $toolkitManager;
+
+  /**
    * Constructs the ImageToolkitOperationManager object.
    *
    * @param \Traversable $namespaces
@@ -44,20 +52,23 @@ class ImageToolkitOperationManager extends DefaultPluginManager implements Image
    *   The module handler to invoke the alter hook with.
    * @param \Psr\Log\LoggerInterface $logger
    *   A logger instance.
+   * @param \Drupal\Core\ImageToolkit\ImageToolkitManager $toolkit_manager
+   *   The image toolkit manager.
    */
-  public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler, LoggerInterface $logger) {
+  public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler, LoggerInterface $logger, ImageToolkitManager $toolkit_manager) {
     parent::__construct('Plugin/ImageToolkit/Operation', $namespaces, $module_handler, 'Drupal\Core\ImageToolkit\ImageToolkitOperationInterface', 'Drupal\Core\ImageToolkit\Annotation\ImageToolkitOperation');
 
     $this->alterInfo('image_toolkit_operation');
     $this->setCacheBackend($cache_backend, 'image_toolkit_operation_plugins');
     $this->logger = $logger;
+    $this->toolkitManager = $toolkit_manager;
   }
 
   /**
    * Returns the plugin ID for a given toolkit and operation.
    *
-   * @param string $toolkit_id
-   *   The toolkit plugin ID.
+   * @param \Drupal\Core\ImageToolkit\ImageToolkitInterface $toolkit
+   *   The toolkit instance.
    * @param string $operation
    *   The operation (e.g. "crop").
    *
@@ -67,7 +78,8 @@ public function __construct(\Traversable $namespaces, CacheBackendInterface $cac
    * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
    *   When no plugin is available.
    */
-  protected function getToolkitOperationPluginId($toolkit_id, $operation) {
+  protected function getToolkitOperationPluginId(ImageToolkitInterface $toolkit, $operation) {
+    $toolkit_id = $toolkit->getPluginId();
     $definitions = $this->getDefinitions();
 
     $definitions = array_filter($definitions,
@@ -77,6 +89,15 @@ function ($definition) use ($toolkit_id, $operation) {
     );
 
     if (!$definitions) {
+      // If this image toolkit plugin is a derivative and returns no operation,
+      // try once again with its base plugin.
+      $base_toolkit_id = $toolkit->getBaseId();
+      if (($toolkit_id != $base_toolkit_id) && !empty($base_toolkit_id)) {
+        $base_toolkit = $this->toolkitManager->createInstance($base_toolkit_id);
+
+        return $this->getToolkitOperationPluginId($base_toolkit, $operation);
+      }
+
       $message = String::format("No image operation plugin for '@toolkit' toolkit and '@operation' operation.", array('@toolkit' => $toolkit_id, '@operation' => $operation));
       throw new PluginNotFoundException($toolkit_id . '.' . $operation, $message);
     }
@@ -92,17 +113,17 @@ function ($definition) use ($toolkit_id, $operation) {
   /**
    * {@inheritdoc}
    */
-  public function createInstance($plugin_id, array $configuration = array(), ImageToolkitInterface $toolkit = NULL) {
+  public function createInstance($plugin_id, array $configuration = array(), ImageToolkitInterface $toolkit = NULL, ImageToolkitManager $toolkit_manager = NULL) {
     $plugin_definition = $this->getDefinition($plugin_id);
     $plugin_class = DefaultFactory::getPluginClass($plugin_id, $plugin_definition);
-    return new $plugin_class($configuration, $plugin_id, $plugin_definition, $toolkit, $this->logger);
+    return new $plugin_class($configuration, $plugin_id, $plugin_definition, $toolkit, $this->logger, $this->toolkitManager);
   }
 
   /**
    * {@inheritdoc}
    */
   public function getToolkitOperation(ImageToolkitInterface $toolkit, $operation) {
-    $plugin_id = $this->getToolkitOperationPluginId($toolkit->getPluginId(), $operation);
+    $plugin_id = $this->getToolkitOperationPluginId($toolkit, $operation);
     return $this->createInstance($plugin_id, array(), $toolkit);
   }
 
diff --git a/core/lib/Drupal/Core/Plugin/Discovery/ContainerDerivativeDiscoveryDecorator.php b/core/lib/Drupal/Core/Plugin/Discovery/ContainerDerivativeDiscoveryDecorator.php
index 6951c77..4e0238b 100644
--- a/core/lib/Drupal/Core/Plugin/Discovery/ContainerDerivativeDiscoveryDecorator.php
+++ b/core/lib/Drupal/Core/Plugin/Discovery/ContainerDerivativeDiscoveryDecorator.php
@@ -22,7 +22,7 @@ protected function getDeriver($base_plugin_id, $base_definition) {
         // If the deriver provides a factory method, pass the container to it.
         if (is_subclass_of($class, '\Drupal\Core\Plugin\Discovery\ContainerDeriverInterface')) {
           /** @var \Drupal\Core\Plugin\Discovery\ContainerDeriverInterface $class */
-          $this->derivers[$base_plugin_id] = $class::create(\Drupal::getContainer(), $base_plugin_id);
+          $this->derivers[$base_plugin_id] = $class::create(\Drupal::getContainer(), $base_plugin_id, $this->decorated);
         }
         else {
           $this->derivers[$base_plugin_id] = new $class($base_plugin_id);
diff --git a/core/lib/Drupal/Core/Plugin/Discovery/ContainerDeriverInterface.php b/core/lib/Drupal/Core/Plugin/Discovery/ContainerDeriverInterface.php
index e0e9ee7..10edc4c 100644
--- a/core/lib/Drupal/Core/Plugin/Discovery/ContainerDeriverInterface.php
+++ b/core/lib/Drupal/Core/Plugin/Discovery/ContainerDeriverInterface.php
@@ -8,6 +8,7 @@
 namespace Drupal\Core\Plugin\Discovery;
 
 use Drupal\Component\Plugin\Derivative\DeriverInterface;
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -23,10 +24,12 @@
    *   The container to pull out services used in the fetcher.
    * @param string $base_plugin_id
    *   The base plugin ID for the plugin ID.
+   * @param \Drupal\Component\Plugin\Discovery\DiscoveryInterface|null $discovery
+   *   (optional) The decorated plugin discovery. Defaults to NULL
    *
    * @return static
    *   Returns an instance of this fetcher.
    */
-  public static function create(ContainerInterface $container, $base_plugin_id);
+  public static function create(ContainerInterface $container, $base_plugin_id, DiscoveryInterface $discovery = NULL);
 
 }
diff --git a/core/modules/block/src/Plugin/Derivative/ThemeLocalTask.php b/core/modules/block/src/Plugin/Derivative/ThemeLocalTask.php
index 849df45..9431c69 100644
--- a/core/modules/block/src/Plugin/Derivative/ThemeLocalTask.php
+++ b/core/modules/block/src/Plugin/Derivative/ThemeLocalTask.php
@@ -8,6 +8,7 @@
 namespace Drupal\block\Plugin\Derivative;
 
 use Drupal\Component\Plugin\Derivative\DeriverBase;
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Extension\ThemeHandlerInterface;
 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
@@ -48,7 +49,7 @@ public function __construct(ConfigFactoryInterface $config_factory, ThemeHandler
   /**
    * {@inheritdoc}
    */
-  public static function create(ContainerInterface $container, $base_plugin_id) {
+  public static function create(ContainerInterface $container, $base_plugin_id, DiscoveryInterface $discovery = NULL) {
     return new static(
       $container->get('config.factory'),
       $container->get('theme_handler')
diff --git a/core/modules/config_translation/src/Plugin/Derivative/ConfigTranslationContextualLinks.php b/core/modules/config_translation/src/Plugin/Derivative/ConfigTranslationContextualLinks.php
index 5050b0d..a7802b3 100644
--- a/core/modules/config_translation/src/Plugin/Derivative/ConfigTranslationContextualLinks.php
+++ b/core/modules/config_translation/src/Plugin/Derivative/ConfigTranslationContextualLinks.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\config_translation\Plugin\Derivative;
 
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\Component\Utility\Unicode;
 use Drupal\Component\Plugin\Derivative\DeriverBase;
 use Drupal\config_translation\ConfigMapperManagerInterface;
@@ -38,7 +39,7 @@ public function __construct(ConfigMapperManagerInterface $mapper_manager) {
   /**
    * {@inheritdoc}
    */
-  public static function create(ContainerInterface $container, $base_plugin_id) {
+  public static function create(ContainerInterface $container, $base_plugin_id, DiscoveryInterface $discovery = NULL) {
     return new static(
       $container->get('plugin.manager.config_translation.mapper')
     );
diff --git a/core/modules/config_translation/src/Plugin/Derivative/ConfigTranslationLocalTasks.php b/core/modules/config_translation/src/Plugin/Derivative/ConfigTranslationLocalTasks.php
index c36f72d..a99d0b3 100644
--- a/core/modules/config_translation/src/Plugin/Derivative/ConfigTranslationLocalTasks.php
+++ b/core/modules/config_translation/src/Plugin/Derivative/ConfigTranslationLocalTasks.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\config_translation\Plugin\Derivative;
 
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\config_translation\ConfigMapperManagerInterface;
 use Drupal\Component\Plugin\Derivative\DeriverBase;
 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
@@ -47,7 +48,7 @@ public function __construct($base_plugin_id, ConfigMapperManagerInterface $mappe
   /**
    * {@inheritdoc}
    */
-  public static function create(ContainerInterface $container, $base_plugin_id) {
+  public static function create(ContainerInterface $container, $base_plugin_id, DiscoveryInterface $discovery = NULL) {
     return new static(
       $base_plugin_id,
       $container->get('plugin.manager.config_translation.mapper')
diff --git a/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationContextualLinks.php b/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationContextualLinks.php
index b1f424f..ae2bf89 100644
--- a/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationContextualLinks.php
+++ b/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationContextualLinks.php
@@ -8,6 +8,7 @@
 namespace Drupal\content_translation\Plugin\Derivative;
 
 use Drupal\Component\Plugin\Derivative\DeriverBase;
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
 use Drupal\Core\Routing\RouteProviderInterface;
 use Drupal\content_translation\ContentTranslationManagerInterface;
@@ -40,7 +41,7 @@ public function __construct(ContentTranslationManagerInterface $content_translat
   /**
    * {@inheritdoc}
    */
-  public static function create(ContainerInterface $container, $base_plugin_id) {
+  public static function create(ContainerInterface $container, $base_plugin_id, DiscoveryInterface $discovery = NULL) {
     return new static(
       $container->get('content_translation.manager')
     );
diff --git a/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationLocalTasks.php b/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationLocalTasks.php
index 8b060f2..13fb45e 100644
--- a/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationLocalTasks.php
+++ b/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationLocalTasks.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\content_translation\Plugin\Derivative;
 
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\content_translation\ContentTranslationManagerInterface;
 use Drupal\Component\Plugin\Derivative\DeriverBase;
 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
@@ -47,7 +48,7 @@ public function __construct($base_plugin_id, ContentTranslationManagerInterface
   /**
    * {@inheritdoc}
    */
-  public static function create(ContainerInterface $container, $base_plugin_id) {
+  public static function create(ContainerInterface $container, $base_plugin_id, DiscoveryInterface $discovery = NULL) {
     return new static(
       $base_plugin_id,
       $container->get('content_translation.manager')
diff --git a/core/modules/field_ui/src/Plugin/Derivative/FieldUiLocalTask.php b/core/modules/field_ui/src/Plugin/Derivative/FieldUiLocalTask.php
index ad1f7da..a483996 100644
--- a/core/modules/field_ui/src/Plugin/Derivative/FieldUiLocalTask.php
+++ b/core/modules/field_ui/src/Plugin/Derivative/FieldUiLocalTask.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\field_ui\Plugin\Derivative;
 
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Component\Plugin\Derivative\DeriverBase;
 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
@@ -54,7 +55,7 @@ public function __construct(RouteProviderInterface $route_provider, EntityManage
   /**
    * {@inheritdoc}
    */
-  public static function create(ContainerInterface $container, $base_plugin_id) {
+  public static function create(ContainerInterface $container, $base_plugin_id, DiscoveryInterface $discovery = NULL) {
     return new static(
       $container->get('router.route_provider'),
       $container->get('entity.manager'),
diff --git a/core/modules/migrate/src/Plugin/Derivative/MigrateEntity.php b/core/modules/migrate/src/Plugin/Derivative/MigrateEntity.php
index 8f4a573..1d8f143 100644
--- a/core/modules/migrate/src/Plugin/Derivative/MigrateEntity.php
+++ b/core/modules/migrate/src/Plugin/Derivative/MigrateEntity.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\migrate\Plugin\Derivative;
 
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -39,7 +40,7 @@ public function __construct(array $entity_definitions) {
   /**
    * {@inheritdoc}
    */
-  public static function create(ContainerInterface $container, $base_plugin_id) {
+  public static function create(ContainerInterface $container, $base_plugin_id, DiscoveryInterface $discovery = NULL) {
     return new static(
       $container->get('entity.manager')->getDefinitions()
     );
diff --git a/core/modules/migrate/src/Plugin/Derivative/MigrateEntityRevision.php b/core/modules/migrate/src/Plugin/Derivative/MigrateEntityRevision.php
index 5c9ae19..d7e0dba 100644
--- a/core/modules/migrate/src/Plugin/Derivative/MigrateEntityRevision.php
+++ b/core/modules/migrate/src/Plugin/Derivative/MigrateEntityRevision.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\migrate\Plugin\Derivative;
 
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -39,7 +40,7 @@ public function __construct(array $entity_definitions) {
   /**
    * {@inheritdoc}
    */
-  public static function create(ContainerInterface $container, $base_plugin_id) {
+  public static function create(ContainerInterface $container, $base_plugin_id, DiscoveryInterface $discovery = NULL) {
     return new static(
       $container->get('entity.manager')->getDefinitions()
     );
diff --git a/core/modules/rest/src/Plugin/Derivative/EntityDerivative.php b/core/modules/rest/src/Plugin/Derivative/EntityDerivative.php
index f80694f..fa31e5c 100644
--- a/core/modules/rest/src/Plugin/Derivative/EntityDerivative.php
+++ b/core/modules/rest/src/Plugin/Derivative/EntityDerivative.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\rest\Plugin\Derivative;
 
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
 use Drupal\Core\Routing\RouteBuilderInterface;
@@ -68,7 +69,7 @@ public function __construct(EntityManagerInterface $entity_manager, RouteProvide
   /**
    * {@inheritdoc}
    */
-  public static function create(ContainerInterface $container, $base_plugin_id) {
+  public static function create(ContainerInterface $container, $base_plugin_id, DiscoveryInterface $discovery = NULL) {
     return new static(
       $container->get('entity.manager'),
       $container->get('router.route_provider'),
diff --git a/core/modules/search/src/Plugin/Derivative/SearchLocalTask.php b/core/modules/search/src/Plugin/Derivative/SearchLocalTask.php
index f9e07a0..3e35055 100644
--- a/core/modules/search/src/Plugin/Derivative/SearchLocalTask.php
+++ b/core/modules/search/src/Plugin/Derivative/SearchLocalTask.php
@@ -8,6 +8,7 @@
 namespace Drupal\search\Plugin\Derivative;
 
 use Drupal\Component\Plugin\Derivative\DeriverBase;
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
 use Drupal\search\SearchPageRepositoryInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -37,7 +38,7 @@ public function __construct(SearchPageRepositoryInterface $search_page_repositor
   /**
    * {@inheritdoc}
    */
-  public static function create(ContainerInterface $container, $base_plugin_id) {
+  public static function create(ContainerInterface $container, $base_plugin_id, DiscoveryInterface $discovery = NULL) {
     return new static(
       $container->get('search.search_page_repository')
     );
diff --git a/core/modules/system/src/Plugin/Derivative/SystemMenuBlock.php b/core/modules/system/src/Plugin/Derivative/SystemMenuBlock.php
index 611ef2a..5dd8453 100644
--- a/core/modules/system/src/Plugin/Derivative/SystemMenuBlock.php
+++ b/core/modules/system/src/Plugin/Derivative/SystemMenuBlock.php
@@ -8,6 +8,7 @@
 namespace Drupal\system\Plugin\Derivative;
 
 use Drupal\Component\Plugin\Derivative\DeriverBase;
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -39,7 +40,7 @@ public function __construct(EntityStorageInterface $menu_storage) {
   /**
    * {@inheritdoc}
    */
-  public static function create(ContainerInterface $container, $base_plugin_id) {
+  public static function create(ContainerInterface $container, $base_plugin_id, DiscoveryInterface $discovery = NULL) {
     return new static(
       $container->get('entity.manager')->getStorage('menu')
     );
diff --git a/core/modules/system/src/Plugin/Derivative/ThemeLocalTask.php b/core/modules/system/src/Plugin/Derivative/ThemeLocalTask.php
index 9c9de19..a1507b3 100644
--- a/core/modules/system/src/Plugin/Derivative/ThemeLocalTask.php
+++ b/core/modules/system/src/Plugin/Derivative/ThemeLocalTask.php
@@ -8,6 +8,7 @@
 namespace Drupal\system\Plugin\Derivative;
 
 use Drupal\Component\Plugin\Derivative\DeriverBase;
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\Core\Extension\ThemeHandlerInterface;
 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -37,7 +38,7 @@ public function __construct(ThemeHandlerInterface $theme_handler) {
   /**
    * {@inheritdoc}
    */
-  public static function create(ContainerInterface $container, $base_plugin_id) {
+  public static function create(ContainerInterface $container, $base_plugin_id, DiscoveryInterface $discovery = NULL) {
     return new static(
       $container->get('theme_handler')
     );
diff --git a/core/modules/system/src/Tests/Image/ToolkitTest.php b/core/modules/system/src/Tests/Image/ToolkitTest.php
index 35686bf..caaed9f 100644
--- a/core/modules/system/src/Tests/Image/ToolkitTest.php
+++ b/core/modules/system/src/Tests/Image/ToolkitTest.php
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Definition of Drupal\system\Tests\Image\ToolkitTest.
+ * Contains \Drupal\system\Tests\Image\ToolkitTest.
  */
 
 namespace Drupal\system\Tests\Image;
@@ -21,6 +21,7 @@ function testGetAvailableToolkits() {
     $manager = $this->container->get('image.toolkit.manager');
     $toolkits = $manager->getAvailableToolkits();
     $this->assertTrue(isset($toolkits['test']), 'The working toolkit was returned.');
+    $this->assertTrue(isset($toolkits['test:derived_toolkit']), 'The derived toolkit was returned.');
     $this->assertFalse(isset($toolkits['broken']), 'The toolkit marked unavailable was not returned');
     $this->assertToolkitOperationsCalled(array());
   }
@@ -71,4 +72,27 @@ function testApplyNoParameters() {
     $this->assertEqual($calls['apply'][0][0], 'my_operation', "'my_operation' was passed correctly as operation");
     $this->assertEqual($calls['apply'][0][1], array(), 'passing no parameters was handled correctly');
   }
+
+  /**
+   * Tests image toolkit operations inheritance by derivative toolkits.
+   */
+  public function testDerivative() {
+    /** @var \Drupal\Core\ImageToolkit\ImageToolkitManager $manager */
+    $manager = $this->container->get('image.toolkit.manager');
+
+    /** @var \Drupal\Core\ImageToolkit\ImageToolkitInterface $toolkit */
+    $toolkit = $manager->createInstance('test:derived_toolkit');
+
+    /** @var \Drupal\Core\ImageToolkit\ImageToolkitOperationManager $operation */
+    $operation = $this->container->get('image.toolkit.operation.manager');
+
+    /** @var \Drupal\Core\ImageToolkit\ImageToolkitOperationInterface $blur */
+    $blur = $operation->getToolkitOperation($toolkit, 'blur');
+    /** @var \Drupal\Core\ImageToolkit\ImageToolkitOperationInterface $invert */
+    $invert = $operation->getToolkitOperation($toolkit, 'invert');
+
+    $this->assertEqual('foo_derived', $blur->getPluginId(), "'Blur' operation overwritten by derivative.");
+    $this->assertEqual('bar', $invert->getPluginId(), '"Invert" operation inherited from base plugin.');
+  }
+
 }
diff --git a/core/modules/system/tests/modules/image_test/src/Plugin/ImageToolkit/DerivedToolkit.php b/core/modules/system/tests/modules/image_test/src/Plugin/ImageToolkit/DerivedToolkit.php
new file mode 100644
index 0000000..cd11b34
--- /dev/null
+++ b/core/modules/system/tests/modules/image_test/src/Plugin/ImageToolkit/DerivedToolkit.php
@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\image_test\Plugin\ImageToolkit\DerivedToolkit.
+ */
+
+namespace Drupal\image_test\Plugin\ImageToolkit;
+
+/**
+ * Provides a derivative of TestToolkit.
+ *
+ * @ImageToolkit(
+ *   id = "test:derived_toolkit",
+ *   title = @Translation("A dummy toolkit, derivative of 'test'.")
+ * )
+ */
+class DerivedToolkit extends TestToolkit {
+
+}
diff --git a/core/modules/system/tests/modules/image_test/src/Plugin/ImageToolkit/Operation/Bar.php b/core/modules/system/tests/modules/image_test/src/Plugin/ImageToolkit/Operation/Bar.php
new file mode 100644
index 0000000..780dbe5
--- /dev/null
+++ b/core/modules/system/tests/modules/image_test/src/Plugin/ImageToolkit/Operation/Bar.php
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\image_test\Plugin\ImageToolkit\Operation\Bar
+ */
+
+namespace Drupal\image_test\Plugin\ImageToolkit\Operation;
+
+/**
+ * Builds an image toolkit operation.
+ *
+ * @ImageToolkitOperation(
+ *   id = "bar",
+ *   toolkit = "test",
+ *   operation = "invert",
+ *   label = @Translation("Invert"),
+ *   description = @Translation("Bar.")
+ * )
+ */
+class Bar extends OperationBase { }
diff --git a/core/modules/system/tests/modules/image_test/src/Plugin/ImageToolkit/Operation/Foo.php b/core/modules/system/tests/modules/image_test/src/Plugin/ImageToolkit/Operation/Foo.php
new file mode 100644
index 0000000..67938f1
--- /dev/null
+++ b/core/modules/system/tests/modules/image_test/src/Plugin/ImageToolkit/Operation/Foo.php
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\image_test\Plugin\ImageToolkit\Operation\Foo
+ */
+
+namespace Drupal\image_test\Plugin\ImageToolkit\Operation;
+
+/**
+ * Builds an image toolkit operation.
+ *
+ * @ImageToolkitOperation(
+ *   id = "foo",
+ *   toolkit = "test",
+ *   operation = "blur",
+ *   label = @Translation("Blur"),
+ *   description = @Translation("Foo.")
+ * )
+ */
+class Foo extends OperationBase { }
diff --git a/core/modules/system/tests/modules/image_test/src/Plugin/ImageToolkit/Operation/FooDerived.php b/core/modules/system/tests/modules/image_test/src/Plugin/ImageToolkit/Operation/FooDerived.php
new file mode 100644
index 0000000..fed0d53
--- /dev/null
+++ b/core/modules/system/tests/modules/image_test/src/Plugin/ImageToolkit/Operation/FooDerived.php
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\image_test\Plugin\ImageToolkit\Operation\FooDerived
+ */
+
+namespace Drupal\image_test\Plugin\ImageToolkit\Operation;
+
+/**
+ * Builds an image toolkit operation.
+ *
+ * @ImageToolkitOperation(
+ *   id = "foo_derived",
+ *   toolkit = "test:derived_toolkit",
+ *   operation = "blur",
+ *   label = @Translation("Blur Derived"),
+ *   description = @Translation("Foo derived.")
+ * )
+ */
+class FooDerived extends OperationBase { }
diff --git a/core/modules/system/tests/modules/image_test/src/Plugin/ImageToolkit/Operation/OperationBase.php b/core/modules/system/tests/modules/image_test/src/Plugin/ImageToolkit/Operation/OperationBase.php
new file mode 100644
index 0000000..0cc7f5e
--- /dev/null
+++ b/core/modules/system/tests/modules/image_test/src/Plugin/ImageToolkit/Operation/OperationBase.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\image_test\Plugin\ImageToolkit\Operation\OperationBase.
+ */
+
+namespace Drupal\image_test\Plugin\ImageToolkit\Operation;
+
+use Drupal\Core\ImageToolkit\ImageToolkitOperationBase;
+
+/**
+ * Provides a base class for test operations.
+ */
+class OperationBase extends ImageToolkitOperationBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function arguments() {
+    return array();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function execute(array $arguments) {
+    // Nothing to do.
+  }
+
+}
diff --git a/core/modules/views/src/Plugin/Derivative/ViewsBlock.php b/core/modules/views/src/Plugin/Derivative/ViewsBlock.php
index cec9895..704d0a3 100644
--- a/core/modules/views/src/Plugin/Derivative/ViewsBlock.php
+++ b/core/modules/views/src/Plugin/Derivative/ViewsBlock.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\views\Plugin\Derivative;
 
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -42,7 +43,7 @@ class ViewsBlock implements ContainerDeriverInterface {
   /**
    * {@inheritdoc}
    */
-  public static function create(ContainerInterface $container, $base_plugin_id) {
+  public static function create(ContainerInterface $container, $base_plugin_id, DiscoveryInterface $discovery = NULL) {
     return new static(
       $base_plugin_id,
       $container->get('entity.manager')->getStorage('view')
diff --git a/core/modules/views/src/Plugin/Derivative/ViewsEntityArgumentValidator.php b/core/modules/views/src/Plugin/Derivative/ViewsEntityArgumentValidator.php
index ee6a582..cf74696 100644
--- a/core/modules/views/src/Plugin/Derivative/ViewsEntityArgumentValidator.php
+++ b/core/modules/views/src/Plugin/Derivative/ViewsEntityArgumentValidator.php
@@ -8,6 +8,7 @@
 namespace Drupal\views\Plugin\Derivative;
 
 use Drupal\Component\Plugin\Derivative\DeriverBase;
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
@@ -64,7 +65,7 @@ public function __construct($base_plugin_id, EntityManagerInterface $entity_mana
   /**
    * {@inheritdoc}
    */
-  public static function create(ContainerInterface $container, $base_plugin_id) {
+  public static function create(ContainerInterface $container, $base_plugin_id, DiscoveryInterface $discovery = NULL) {
     return new static(
       $base_plugin_id,
       $container->get('entity.manager'),
diff --git a/core/modules/views/src/Plugin/Derivative/ViewsEntityRow.php b/core/modules/views/src/Plugin/Derivative/ViewsEntityRow.php
index 9f7ab13..48a749d 100644
--- a/core/modules/views/src/Plugin/Derivative/ViewsEntityRow.php
+++ b/core/modules/views/src/Plugin/Derivative/ViewsEntityRow.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\views\Plugin\Derivative;
 
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
 use Drupal\views\ViewsData;
@@ -68,7 +69,7 @@ public function __construct($base_plugin_id, EntityManagerInterface $entity_mana
   /**
    * {@inheritdoc}
    */
-  public static function create(ContainerInterface $container, $base_plugin_id) {
+  public static function create(ContainerInterface $container, $base_plugin_id, DiscoveryInterface $discovery = NULL) {
     return new static(
       $base_plugin_id,
       $container->get('entity.manager'),
diff --git a/core/modules/views/src/Plugin/Derivative/ViewsExposedFilterBlock.php b/core/modules/views/src/Plugin/Derivative/ViewsExposedFilterBlock.php
index 0ef5fcd..63c899e 100644
--- a/core/modules/views/src/Plugin/Derivative/ViewsExposedFilterBlock.php
+++ b/core/modules/views/src/Plugin/Derivative/ViewsExposedFilterBlock.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\views\Plugin\Derivative;
 
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -55,7 +56,7 @@ public function __construct($base_plugin_id, EntityStorageInterface $view_storag
   /**
    * {@inheritdoc}
    */
-  public static function create(ContainerInterface $container, $base_plugin_id) {
+  public static function create(ContainerInterface $container, $base_plugin_id, DiscoveryInterface $discovery = NULL) {
     return new static(
       $base_plugin_id,
       $container->get('entity.manager')->getStorage('view')
diff --git a/core/modules/views/src/Plugin/Derivative/ViewsLocalTask.php b/core/modules/views/src/Plugin/Derivative/ViewsLocalTask.php
index ef531b4..37386d9 100644
--- a/core/modules/views/src/Plugin/Derivative/ViewsLocalTask.php
+++ b/core/modules/views/src/Plugin/Derivative/ViewsLocalTask.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\views\Plugin\Derivative;
 
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\Core\State\StateInterface;
 use Drupal\Component\Plugin\Derivative\DeriverBase;
 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
@@ -49,7 +50,7 @@ public function __construct(RouteProviderInterface $route_provider, StateInterfa
   /**
    * {@inheritdoc}
    */
-  public static function create(ContainerInterface $container, $base_plugin_id) {
+  public static function create(ContainerInterface $container, $base_plugin_id, DiscoveryInterface $discovery = NULL) {
     return new static(
       $container->get('router.route_provider'),
       $container->get('state')
diff --git a/core/tests/Drupal/Tests/Core/Plugin/Discovery/TestContainerDerivativeDiscovery.php b/core/tests/Drupal/Tests/Core/Plugin/Discovery/TestContainerDerivativeDiscovery.php
index 46ca62c..4d44a7a 100644
--- a/core/tests/Drupal/Tests/Core/Plugin/Discovery/TestContainerDerivativeDiscovery.php
+++ b/core/tests/Drupal/Tests/Core/Plugin/Discovery/TestContainerDerivativeDiscovery.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\Tests\Core\Plugin\Discovery;
 
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\EventDispatcher\EventDispatcherInterface;
@@ -28,7 +29,7 @@ public function __construct(EventDispatcherInterface $example_service) {
   /**
    * {@inheritdoc}
    */
-  public static function create(ContainerInterface $container, $base_plugin_id) {
+  public static function create(ContainerInterface $container, $base_plugin_id, DiscoveryInterface $discovery = NULL) {
     return new static($container->get('example_service'));
   }
 
