diff --git a/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php b/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php
index 6da6940..2726a4a 100644
--- a/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php
+++ b/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php
@@ -2,11 +2,13 @@
 
 /**
  * @file
- * Definition of Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator.
+ * Contains \Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator.
  */
 
 namespace Drupal\Component\Plugin\Discovery;
 
+use Drupal\Component\Plugin\Exception\InvalidDerivativeClassException;
+
 /**
  * Base class providing the tools for a plugin discovery to be derivative aware.
  *
@@ -134,13 +136,13 @@ protected function encodePluginId($base_plugin_id, $derivative_id) {
    *   The base plugin definition to build derivatives.
    *
    * @return Drupal\Component\Plugin\Discovery\DerivativeInterface|null
-   *   A DerivativeInterface or null if none exists for the plugin.
+   *   A DerivativeInterface or NULL if none exists for the plugin.
    */
   protected function getDerivativeFetcher($base_plugin_id, array $base_definition) {
     if (!isset($this->derivativeFetchers[$base_plugin_id])) {
       $this->derivativeFetchers[$base_plugin_id] = FALSE;
-      if (isset($base_definition['derivative'])) {
-        $class = $base_definition['derivative'];
+      $class = $this->getDerivativeClass($base_definition);
+      if ($class) {
         $this->derivativeFetchers[$base_plugin_id] = new $class($base_plugin_id);
       }
     }
@@ -148,6 +150,30 @@ protected function getDerivativeFetcher($base_plugin_id, array $base_definition)
   }
 
   /**
+   * Get the derivative class name from the base plugin definition.
+   *
+   * @param array $base_definition
+   *   The base plugin definition to build derivatives.
+   *
+   * @return string|NULL
+   *   The name of a class implementing \Drupal\Component\Plugin\Derivative\DerivativeInterface.
+   *
+   * @throws \Drupal\Component\Plugin\Exception\InvalidDerivativeClassException
+   *   Thrown if the class in the definition does not implement the expected
+   *   interface.
+   */
+  protected function getDerivativeClass($base_definition) {
+    $class = NULL;
+    if (isset($base_definition['derivative'])) {
+      $class = $base_definition['derivative'];
+      if (!is_subclass_of($class, '\Drupal\Component\Plugin\Derivative\DerivativeInterface')) {
+        throw new InvalidDerivativeClassException(sprintf('Plugin (%s) derivative class "%s" has to implement interface \Drupal\Component\Plugin\Derivative\DerivativeInterface', $base_definition['id'], $class));
+      }
+    }
+    return $class;
+  }
+
+  /**
    * Passes through all unknown calls onto the decorated object.
    */
   public function __call($method, $args) {
diff --git a/core/lib/Drupal/Component/Plugin/Exception/InvalidDerivativeClassException.php b/core/lib/Drupal/Component/Plugin/Exception/InvalidDerivativeClassException.php
new file mode 100644
index 0000000..e3f7ed0
--- /dev/null
+++ b/core/lib/Drupal/Component/Plugin/Exception/InvalidDerivativeClassException.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * @file
+ * Definition of \Drupal\Component\Plugin\Exception\InvalidDerivativeClassException.
+ */
+
+namespace Drupal\Component\Plugin\Exception;
+
+/**
+ * Exception to be thrown if a plugin tries to use an invalid derivative class.
+ */
+class InvalidDerivativeClassException extends PluginException { }
diff --git a/core/lib/Drupal/Core/Plugin/Discovery/ContainerDerivativeDiscoveryDecorator.php b/core/lib/Drupal/Core/Plugin/Discovery/ContainerDerivativeDiscoveryDecorator.php
index fcae2e3..eed640c 100644
--- a/core/lib/Drupal/Core/Plugin/Discovery/ContainerDerivativeDiscoveryDecorator.php
+++ b/core/lib/Drupal/Core/Plugin/Discovery/ContainerDerivativeDiscoveryDecorator.php
@@ -17,8 +17,8 @@ class ContainerDerivativeDiscoveryDecorator extends DerivativeDiscoveryDecorator
   protected function getDerivativeFetcher($base_plugin_id, array $base_definition) {
     if (!isset($this->derivativeFetchers[$base_plugin_id])) {
       $this->derivativeFetchers[$base_plugin_id] = FALSE;
-      if (isset($base_definition['derivative'])) {
-        $class = $base_definition['derivative'];
+      $class = $this->getDerivativeClass($base_definition);
+      if ($class) {
         // If the derivative class provides a factory method, pass the container
         // to it.
         if (is_subclass_of($class, 'Drupal\Core\Plugin\Discovery\ContainerDerivativeInterface')) {
diff --git a/core/tests/Drupal/Tests/Core/Plugin/Discovery/DerivativeDiscoveryDecoratorTest.php b/core/tests/Drupal/Tests/Core/Plugin/Discovery/DerivativeDiscoveryDecoratorTest.php
new file mode 100644
index 0000000..a0487c1
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/Plugin/Discovery/DerivativeDiscoveryDecoratorTest.php
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\Core\Plugin\Discovery\DerivativeDiscoveryDecoratorTest.
+ */
+
+namespace Drupal\Tests\Core\Plugin\Discovery;
+
+use Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator;
+use Drupal\Component\Plugin\Exception\InvalidDerivativeClassException;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * Unit tests for the derivative discovery decorator.
+ */
+class DerivativeDiscoveryDecoratorTest extends UnitTestCase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getInfo() {
+    return array(
+      'name' => 'Derivative discovery decorator.',
+      'description' => 'Tests the derivative discovery decorator.',
+      'group' => 'Plugin',
+    );
+  }
+
+  /**
+   * Tests the getDerivativeFetcher method.
+   *
+   * @see  \Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator::getDerivativeFetcher().
+   */
+  public function testGetDerivativeFetcher() {
+    $definitions = array();
+    $definitions['non_container_aware_discovery'] = array(
+      'id' => 'non_container_aware_discovery',
+      'derivative' => '\Drupal\Tests\Core\Plugin\Discovery\TestDerivativeDiscovery',
+    );
+
+    $discovery_main = $this->getMock('Drupal\Component\Plugin\Discovery\DiscoveryInterface');
+    $discovery_main->expects($this->any())
+      ->method('getDefinitions')
+      ->will($this->returnValue($definitions));
+
+    $discovery = new DerivativeDiscoveryDecorator($discovery_main);
+    $definitions = $discovery->getDefinitions();
+
+    // Ensure that both test derivatives got added.
+    $this->assertEquals(2, count($definitions));
+  }
+
+  /**
+   * Tests the getDerivativeFetcher method with an invalid class.
+   *
+   * @see \Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator::getDerivativeFetcher().\
+   *
+   * @expectedException Drupal\Component\Plugin\Exception\InvalidDerivativeClassException
+   */
+  public function testInvalidDerivativeFetcher() {
+    $definitions = array();
+    // Do this with a class that doesn't implement the interface.
+    $definitions['invalid_discovery'] = array(
+      'id' => 'invalid_discovery',
+      'derivative' => '\Drupal\system\Tests\Plugin\DerivativeTest',
+    );
+    $discovery_main = $this->getMock('Drupal\Component\Plugin\Discovery\DiscoveryInterface');
+    $discovery_main->expects($this->any())
+      ->method('getDefinitions')
+      ->will($this->returnValue($definitions));
+
+    $discovery = new DerivativeDiscoveryDecorator($discovery_main);
+    $definitions = $discovery->getDefinitions();
+  }
+}
