diff --git a/core/lib/Drupal/Component/Plugin/Derivative/DerivativeBase.php b/core/lib/Drupal/Component/Plugin/Derivative/DerivativeBase.php
index 2c5e2d2..3adc150 100644
--- a/core/lib/Drupal/Component/Plugin/Derivative/DerivativeBase.php
+++ b/core/lib/Drupal/Component/Plugin/Derivative/DerivativeBase.php
@@ -27,7 +27,7 @@
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinition($derivative_id, array $base_plugin_definition) {
+  public function getDerivativeDefinition($derivative_id, $base_plugin_definition) {
     if (!empty($this->derivatives) && !empty($this->derivatives[$derivative_id])) {
       return $this->derivatives[$derivative_id];
     }
@@ -38,7 +38,7 @@ public function getDerivativeDefinition($derivative_id, array $base_plugin_defin
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     return $this->derivatives;
   }
 }
diff --git a/core/lib/Drupal/Component/Plugin/Derivative/DerivativeInterface.php b/core/lib/Drupal/Component/Plugin/Derivative/DerivativeInterface.php
index bb07069..b32438f 100644
--- a/core/lib/Drupal/Component/Plugin/Derivative/DerivativeInterface.php
+++ b/core/lib/Drupal/Component/Plugin/Derivative/DerivativeInterface.php
@@ -18,16 +18,17 @@
    * @param string $derivative_id
    *   The derivative id. The id must uniquely identify the derivative within a
    *   given base plugin, but derivative ids can be reused across base plugins.
-   * @param array $base_plugin_definition
-   *   The definition array of the base plugin from which the derivative plugin
-   *   is derived.
+   * @param mixed $base_plugin_definition
+   *   The definition of the base plugin from which the derivative plugin
+   *   is derived. It is maybe an entire object or just some array, depending
+   *   on the discovery mechanism.
    *
    * @return array
    *   The full definition array of the derivative plugin, typically a merge of
    *   $base_plugin_definition with extra derivative-specific information. NULL
    *   if the derivative doesn't exist.
    */
-  public function getDerivativeDefinition($derivative_id, array $base_plugin_definition);
+  public function getDerivativeDefinition($derivative_id, $base_plugin_definition);
 
   /**
    * Returns the definition of all derivatives of a base plugin.
@@ -39,6 +40,6 @@ public function getDerivativeDefinition($derivative_id, array $base_plugin_defin
    *
    * @see getDerivativeDefinition()
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition);
+  public function getDerivativeDefinitions($base_plugin_definition);
 
 }
diff --git a/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php b/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php
index 027c59a..4c8feb0 100644
--- a/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php
+++ b/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php
@@ -155,17 +155,17 @@ protected function encodePluginId($base_plugin_id, $derivative_id) {
    *
    * @param string $base_plugin_id
    *   The base plugin id of the plugin.
-   * @param array $base_definition
+   * @param mixed $base_definition
    *   The base plugin definition to build derivatives.
    *
    * @return \Drupal\Component\Plugin\Derivative\DerivativeInterface|null
-+   *   A DerivativeInterface or NULL if none exists for the plugin.
-+   *
-+   * @throws \Drupal\Component\Plugin\Exception\InvalidDerivativeClassException
-+   *   Thrown if the 'derivative' class specified in the plugin definition does
-+   *   not implement \Drupal\Component\Plugin\Derivative\DerivativeInterface.
+   *   A DerivativeInterface or NULL if none exists for the plugin.
+   *
+   * @throws \Drupal\Component\Plugin\Exception\InvalidDerivativeClassException
+   *   Thrown if the 'derivative' class specified in the plugin definition does
+   *   not implement \Drupal\Component\Plugin\Derivative\DerivativeInterface.
    */
-  protected function getDerivativeFetcher($base_plugin_id, array $base_definition) {
+  protected function getDerivativeFetcher($base_plugin_id, $base_definition) {
     if (!isset($this->derivativeFetchers[$base_plugin_id])) {
       $this->derivativeFetchers[$base_plugin_id] = FALSE;
       $class = $this->getDerivativeClass($base_definition);
@@ -191,8 +191,7 @@ protected function getDerivativeFetcher($base_plugin_id, array $base_definition)
    */
   protected function getDerivativeClass($base_definition) {
     $class = NULL;
-    if (isset($base_definition['derivative'])) {
-      $class = $base_definition['derivative'];
+    if ((is_array($base_definition) || ($base_definition = (array) $base_definition)) && (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));
       }
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 f5a9aa4..214a63a 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/DataType/Deriver/EntityDeriver.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/DataType/Deriver/EntityDeriver.php
@@ -63,7 +63,7 @@ public static function create(ContainerInterface $container, $base_plugin_id) {
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinition($derivative_id, array $base_plugin_definition) {
+  public function getDerivativeDefinition($derivative_id, $base_plugin_definition) {
     if (!empty($this->derivatives) && !empty($this->derivatives[$derivative_id])) {
       return $this->derivatives[$derivative_id];
     }
@@ -76,7 +76,7 @@ public function getDerivativeDefinition($derivative_id, array $base_plugin_defin
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     // Also keep the 'entity' defined as is.
     $this->derivatives[''] = $base_plugin_definition;
     // Add definitions for each entity type and bundle.
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 8d0ef20..09207f1 100644
--- a/core/lib/Drupal/Core/Field/Plugin/DataType/Deriver/FieldItemDeriver.php
+++ b/core/lib/Drupal/Core/Field/Plugin/DataType/Deriver/FieldItemDeriver.php
@@ -63,7 +63,7 @@ public static function create(ContainerInterface $container, $base_plugin_id) {
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinition($derivative_id, array $base_plugin_definition) {
+  public function getDerivativeDefinition($derivative_id, $base_plugin_definition) {
     if (!isset($this->derivatives)) {
       $this->getDerivativeDefinitions($base_plugin_definition);
     }
@@ -75,7 +75,7 @@ public function getDerivativeDefinition($derivative_id, array $base_plugin_defin
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     foreach ($this->fieldTypePluginManager->getDefinitions() as $plugin_id => $definition) {
       $definition['definition_class'] = '\Drupal\Core\Field\TypedData\FieldItemDataDefinition';
       $definition['list_definition_class'] = '\Drupal\Core\Field\FieldDefinition';
diff --git a/core/lib/Drupal/Core/Plugin/Discovery/ContainerDerivativeDiscoveryDecorator.php b/core/lib/Drupal/Core/Plugin/Discovery/ContainerDerivativeDiscoveryDecorator.php
index eed640c..b01d1ac 100644
--- a/core/lib/Drupal/Core/Plugin/Discovery/ContainerDerivativeDiscoveryDecorator.php
+++ b/core/lib/Drupal/Core/Plugin/Discovery/ContainerDerivativeDiscoveryDecorator.php
@@ -14,7 +14,7 @@ class ContainerDerivativeDiscoveryDecorator extends DerivativeDiscoveryDecorator
   /**
    * {@inheritdoc}
    */
-  protected function getDerivativeFetcher($base_plugin_id, array $base_definition) {
+  protected function getDerivativeFetcher($base_plugin_id, $base_definition) {
     if (!isset($this->derivativeFetchers[$base_plugin_id])) {
       $this->derivativeFetchers[$base_plugin_id] = FALSE;
       $class = $this->getDerivativeClass($base_definition);
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Derivative/CustomBlock.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Derivative/CustomBlock.php
index b2fa6b5..f93b413 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Derivative/CustomBlock.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Derivative/CustomBlock.php
@@ -17,7 +17,7 @@ class CustomBlock extends DerivativeBase {
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     $custom_blocks = entity_load_multiple('custom_block');
     foreach ($custom_blocks as $custom_block) {
       $this->derivatives[$custom_block->uuid()] = $base_plugin_definition;
diff --git a/core/modules/block/lib/Drupal/block/Plugin/Derivative/ThemeLocalTask.php b/core/modules/block/lib/Drupal/block/Plugin/Derivative/ThemeLocalTask.php
index 055ab48..be4cad5 100644
--- a/core/modules/block/lib/Drupal/block/Plugin/Derivative/ThemeLocalTask.php
+++ b/core/modules/block/lib/Drupal/block/Plugin/Derivative/ThemeLocalTask.php
@@ -58,7 +58,7 @@ public static function create(ContainerInterface $container, $base_plugin_id) {
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     $default_theme = $this->config->get('default');
 
     foreach ($this->themeHandler->listInfo() as $theme_name => $theme) {
diff --git a/core/modules/config_translation/lib/Drupal/config_translation/Plugin/Derivative/ConfigTranslationContextualLinks.php b/core/modules/config_translation/lib/Drupal/config_translation/Plugin/Derivative/ConfigTranslationContextualLinks.php
index 0fac412..f705d4e 100644
--- a/core/modules/config_translation/lib/Drupal/config_translation/Plugin/Derivative/ConfigTranslationContextualLinks.php
+++ b/core/modules/config_translation/lib/Drupal/config_translation/Plugin/Derivative/ConfigTranslationContextualLinks.php
@@ -47,7 +47,7 @@ public static function create(ContainerInterface $container, $base_plugin_id) {
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     // Create contextual links for all mappers.
     $mappers = $this->mapperManager->getMappers();
     foreach ($mappers as $plugin_id => $mapper) {
diff --git a/core/modules/config_translation/lib/Drupal/config_translation/Plugin/Derivative/ConfigTranslationLocalTasks.php b/core/modules/config_translation/lib/Drupal/config_translation/Plugin/Derivative/ConfigTranslationLocalTasks.php
index 20b9c79..53077d6 100644
--- a/core/modules/config_translation/lib/Drupal/config_translation/Plugin/Derivative/ConfigTranslationLocalTasks.php
+++ b/core/modules/config_translation/lib/Drupal/config_translation/Plugin/Derivative/ConfigTranslationLocalTasks.php
@@ -57,7 +57,7 @@ public static function create(ContainerInterface $container, $base_plugin_id) {
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     $mappers = $this->mapperManager->getMappers();
     foreach ($mappers as $plugin_id => $mapper) {
       /** @var \Drupal\config_translation\ConfigMapperInterface $mapper */
diff --git a/core/modules/content_translation/lib/Drupal/content_translation/Plugin/Derivative/ContentTranslationContextualLinks.php b/core/modules/content_translation/lib/Drupal/content_translation/Plugin/Derivative/ContentTranslationContextualLinks.php
index 24ebbee..f231aa3 100644
--- a/core/modules/content_translation/lib/Drupal/content_translation/Plugin/Derivative/ContentTranslationContextualLinks.php
+++ b/core/modules/content_translation/lib/Drupal/content_translation/Plugin/Derivative/ContentTranslationContextualLinks.php
@@ -49,7 +49,7 @@ public static function create(ContainerInterface $container, $base_plugin_id) {
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     // Create contextual links for translatable entity types.
     foreach ($this->contentTranslationManager->getSupportedEntityTypes() as $entity_type_id => $entity_type) {
       $this->derivatives[$entity_type_id]['title'] = t('Translate');
diff --git a/core/modules/content_translation/lib/Drupal/content_translation/Plugin/Derivative/ContentTranslationLocalTasks.php b/core/modules/content_translation/lib/Drupal/content_translation/Plugin/Derivative/ContentTranslationLocalTasks.php
index adb3aa4..3fcfefe 100644
--- a/core/modules/content_translation/lib/Drupal/content_translation/Plugin/Derivative/ContentTranslationLocalTasks.php
+++ b/core/modules/content_translation/lib/Drupal/content_translation/Plugin/Derivative/ContentTranslationLocalTasks.php
@@ -57,7 +57,7 @@ public static function create(ContainerInterface $container, $base_plugin_id) {
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     // Create tabs for all possible entity types.
     foreach ($this->contentTranslationManager->getSupportedEntityTypes() as $entity_type_id => $entity_type) {
       // Find the route name for the translation overview.
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Derivative/SelectionBase.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Derivative/SelectionBase.php
index 80ecc16..79a8327 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Derivative/SelectionBase.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Derivative/SelectionBase.php
@@ -16,7 +16,7 @@ class SelectionBase extends DerivativeBase {
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     $supported_entities = array(
       'comment',
       'file',
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Plugin/Derivative/FieldUiLocalTask.php b/core/modules/field_ui/lib/Drupal/field_ui/Plugin/Derivative/FieldUiLocalTask.php
index e80bd9d..740f814 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/Plugin/Derivative/FieldUiLocalTask.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/Plugin/Derivative/FieldUiLocalTask.php
@@ -70,7 +70,7 @@ public static function create(ContainerInterface $container, $base_plugin_id) {
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     $this->derivatives = array();
 
     foreach ($this->entityManager->getDefinitions() as $entity_type_id => $entity_type) {
diff --git a/core/modules/language/lib/Drupal/language/Plugin/Derivative/LanguageBlock.php b/core/modules/language/lib/Drupal/language/Plugin/Derivative/LanguageBlock.php
index acf276f..88c0736 100644
--- a/core/modules/language/lib/Drupal/language/Plugin/Derivative/LanguageBlock.php
+++ b/core/modules/language/lib/Drupal/language/Plugin/Derivative/LanguageBlock.php
@@ -18,7 +18,7 @@ class LanguageBlock extends DerivativeBase {
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     $language_manager = \Drupal::languageManager();
 
     if ($language_manager instanceof ConfigurableLanguageManagerInterface) {
diff --git a/core/modules/rest/lib/Drupal/rest/Plugin/Derivative/EntityDerivative.php b/core/modules/rest/lib/Drupal/rest/Plugin/Derivative/EntityDerivative.php
index 2b3cf22..f77d5e3 100644
--- a/core/modules/rest/lib/Drupal/rest/Plugin/Derivative/EntityDerivative.php
+++ b/core/modules/rest/lib/Drupal/rest/Plugin/Derivative/EntityDerivative.php
@@ -52,7 +52,7 @@ public static function create(ContainerInterface $container, $base_plugin_id) {
   /**
    * Implements DerivativeInterface::getDerivativeDefinition().
    */
-  public function getDerivativeDefinition($derivative_id, array $base_plugin_definition) {
+  public function getDerivativeDefinition($derivative_id, $base_plugin_definition) {
     if (!isset($this->derivatives)) {
       $this->getDerivativeDefinitions($base_plugin_definition);
     }
@@ -64,7 +64,7 @@ public function getDerivativeDefinition($derivative_id, array $base_plugin_defin
   /**
    * Implements DerivativeInterface::getDerivativeDefinitions().
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     if (!isset($this->derivatives)) {
       // Add in the default plugin configuration and the resource type.
       foreach ($this->entityManager->getDefinitions() as $entity_type_id => $entity_type) {
diff --git a/core/modules/search/lib/Drupal/search/Plugin/Derivative/SearchLocalTask.php b/core/modules/search/lib/Drupal/search/Plugin/Derivative/SearchLocalTask.php
index 2024478..543c190 100644
--- a/core/modules/search/lib/Drupal/search/Plugin/Derivative/SearchLocalTask.php
+++ b/core/modules/search/lib/Drupal/search/Plugin/Derivative/SearchLocalTask.php
@@ -46,7 +46,7 @@ public static function create(ContainerInterface $container, $base_plugin_id) {
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     $this->derivatives = array();
 
     if ($default = $this->searchPageRepository->getDefaultSearchPage()) {
diff --git a/core/modules/system/lib/Drupal/system/Plugin/Derivative/SystemMenuBlock.php b/core/modules/system/lib/Drupal/system/Plugin/Derivative/SystemMenuBlock.php
index 5542808..372de9b 100644
--- a/core/modules/system/lib/Drupal/system/Plugin/Derivative/SystemMenuBlock.php
+++ b/core/modules/system/lib/Drupal/system/Plugin/Derivative/SystemMenuBlock.php
@@ -48,7 +48,7 @@ public static function create(ContainerInterface $container, $base_plugin_id) {
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     foreach ($this->menuStorage->loadMultiple() as $menu => $entity) {
       $this->derivatives[$menu] = $base_plugin_definition;
       $this->derivatives[$menu]['admin_label'] = $entity->label();
diff --git a/core/modules/system/lib/Drupal/system/Plugin/Derivative/ThemeLocalTask.php b/core/modules/system/lib/Drupal/system/Plugin/Derivative/ThemeLocalTask.php
index 8a25fc3..da6910d 100644
--- a/core/modules/system/lib/Drupal/system/Plugin/Derivative/ThemeLocalTask.php
+++ b/core/modules/system/lib/Drupal/system/Plugin/Derivative/ThemeLocalTask.php
@@ -17,7 +17,7 @@ class ThemeLocalTask extends DerivativeBase {
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     foreach (list_themes() as $theme_name => $theme) {
       if ($theme->status) {
         $this->derivatives[$theme_name] = $base_plugin_definition;
diff --git a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Plugin/Derivative/EntityTestLocalTasks.php b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Plugin/Derivative/EntityTestLocalTasks.php
index b9bbefb..8188ea4 100644
--- a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Plugin/Derivative/EntityTestLocalTasks.php
+++ b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Plugin/Derivative/EntityTestLocalTasks.php
@@ -17,7 +17,7 @@ class EntityTestLocalTasks extends DerivativeBase {
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     $this->derivatives = array();
     $types = entity_test_entity_types();
 
diff --git a/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/Plugin/Derivative/LocalTaskTest.php b/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/Plugin/Derivative/LocalTaskTest.php
index 807c78d..29314ef 100644
--- a/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/Plugin/Derivative/LocalTaskTest.php
+++ b/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/Plugin/Derivative/LocalTaskTest.php
@@ -13,7 +13,7 @@ class LocalTaskTest extends DerivativeBase {
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     $weight = $base_plugin_definition['weight'];
     foreach (array('derive1' => 'Derive 1', 'derive2' => 'Derive 2') as $key => $title) {
       $this->derivatives[$key] = $base_plugin_definition;
diff --git a/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/plugin_test/mock_block/MockLayoutBlockDeriver.php b/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/plugin_test/mock_block/MockLayoutBlockDeriver.php
index dea1f29..1a33551 100644
--- a/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/plugin_test/mock_block/MockLayoutBlockDeriver.php
+++ b/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/plugin_test/mock_block/MockLayoutBlockDeriver.php
@@ -19,7 +19,7 @@ class MockLayoutBlockDeriver implements DerivativeInterface {
   /**
    * Implements Drupal\Component\Plugin\Derivative\DerivativeInterface::getDerivativeDefinition().
    */
-  public function getDerivativeDefinition($derivative_id, array $base_plugin_definition) {
+  public function getDerivativeDefinition($derivative_id, $base_plugin_definition) {
     $derivatives = $this->getDerivativeDefinitions($base_plugin_definition);
     if (isset($derivatives[$derivative_id])) {
       return $derivatives[$derivative_id];
@@ -29,7 +29,7 @@ public function getDerivativeDefinition($derivative_id, array $base_plugin_defin
   /**
    * Implements Drupal\Component\Plugin\Derivative\DerivativeInterface::getDerivativeDefinitions().
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     // This isn't strictly necessary, but it helps reduce clutter in
     // DerivativePluginTest::testDerivativeDecorator()'s $expected variable.
     // Since derivative definitions don't need further deriving, we remove this
diff --git a/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/plugin_test/mock_block/MockMenuBlockDeriver.php b/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/plugin_test/mock_block/MockMenuBlockDeriver.php
index 35e7bca..aaa1d1c 100644
--- a/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/plugin_test/mock_block/MockMenuBlockDeriver.php
+++ b/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/plugin_test/mock_block/MockMenuBlockDeriver.php
@@ -19,7 +19,7 @@ class MockMenuBlockDeriver implements DerivativeInterface {
   /**
    * Implements Drupal\Component\Plugin\Derivative\DerivativeInterface::getDerivativeDefinition().
    */
-  public function getDerivativeDefinition($derivative_id, array $base_plugin_definition) {
+  public function getDerivativeDefinition($derivative_id, $base_plugin_definition) {
     $derivatives = $this->getDerivativeDefinitions($base_plugin_definition);
     if (isset($derivatives[$derivative_id])) {
       return $derivatives[$derivative_id];
@@ -29,7 +29,7 @@ public function getDerivativeDefinition($derivative_id, array $base_plugin_defin
   /**
    * Implements Drupal\Component\Plugin\Derivative\DerivativeInterface::getDerivativeDefinitions().
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     // This isn't strictly necessary, but it helps reduce clutter in
     // DerivativePluginTest::testDerivativeDecorator()'s $expected variable.
     // Since derivative definitions don't need further deriving, we remove this
diff --git a/core/modules/views/lib/Drupal/views/Plugin/Derivative/DefaultWizardDeriver.php b/core/modules/views/lib/Drupal/views/Plugin/Derivative/DefaultWizardDeriver.php
index a46bbd8..211d8be 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/Derivative/DefaultWizardDeriver.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/Derivative/DefaultWizardDeriver.php
@@ -19,7 +19,7 @@ class DefaultWizardDeriver extends DerivativeBase {
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     $views_data = Views::viewsData();
     $base_tables = array_keys($views_data->fetchBaseTables());
     $this->derivatives = array();
diff --git a/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsBlock.php b/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsBlock.php
index 30d242a..a7fb041 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsBlock.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsBlock.php
@@ -65,7 +65,7 @@ public function __construct($base_plugin_id, EntityStorageControllerInterface $v
   /**
    * Implements \Drupal\Component\Plugin\Derivative\DerivativeInterface::getDerivativeDefinition().
    */
-  public function getDerivativeDefinition($derivative_id, array $base_plugin_definition) {
+  public function getDerivativeDefinition($derivative_id, $base_plugin_definition) {
     if (!empty($this->derivatives) && !empty($this->derivatives[$derivative_id])) {
       return $this->derivatives[$derivative_id];
     }
@@ -76,7 +76,7 @@ public function getDerivativeDefinition($derivative_id, array $base_plugin_defin
   /**
    * Implements \Drupal\Component\Plugin\Derivative\DerivativeInterface::getDerivativeDefinitions().
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     // Check all Views for block displays.
     foreach ($this->viewStorageController->loadMultiple() as $view) {
       // Do not return results for disabled views.
diff --git a/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsEntityArgumentValidator.php b/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsEntityArgumentValidator.php
index eb2f383..9800e32 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsEntityArgumentValidator.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsEntityArgumentValidator.php
@@ -79,7 +79,7 @@ public static function create(ContainerInterface $container, $base_plugin_id) {
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     $entity_types = $this->entityManager->getDefinitions();
     $this->derivatives = array();
     foreach ($entity_types as $entity_type_id => $entity_type) {
diff --git a/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsEntityRow.php b/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsEntityRow.php
index c82a88b..4376fc3 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsEntityRow.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsEntityRow.php
@@ -79,7 +79,7 @@ public static function create(ContainerInterface $container, $base_plugin_id) {
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinition($derivative_id, array $base_plugin_definition) {
+  public function getDerivativeDefinition($derivative_id, $base_plugin_definition) {
     if (!empty($this->derivatives) && !empty($this->derivatives[$derivative_id])) {
       return $this->derivatives[$derivative_id];
     }
@@ -90,7 +90,7 @@ public function getDerivativeDefinition($derivative_id, array $base_plugin_defin
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     foreach ($this->entityManager->getDefinitions() as $entity_type_id => $entity_type) {
       // Just add support for entity types which have a views integration.
       if (($base_table = $entity_type->getBaseTable()) && $this->viewsData->get($base_table) && $this->entityManager->hasController($entity_type_id, 'view_builder')) {
diff --git a/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsExposedFilterBlock.php b/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsExposedFilterBlock.php
index 96bdd4c..0423bb5 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsExposedFilterBlock.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsExposedFilterBlock.php
@@ -65,7 +65,7 @@ public static function create(ContainerInterface $container, $base_plugin_id) {
   /**
    * Implements \Drupal\Component\Plugin\Derivative\DerivativeInterface::getDerivativeDefinition().
    */
-  public function getDerivativeDefinition($derivative_id, array $base_plugin_definition) {
+  public function getDerivativeDefinition($derivative_id, $base_plugin_definition) {
     if (!empty($this->derivatives) && !empty($this->derivatives[$derivative_id])) {
       return $this->derivatives[$derivative_id];
     }
@@ -76,7 +76,7 @@ public function getDerivativeDefinition($derivative_id, array $base_plugin_defin
   /**
    * Implements \Drupal\Component\Plugin\Derivative\DerivativeInterface::getDerivativeDefinitions().
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     // Check all Views for displays with an exposed filter block.
     foreach ($this->viewStorageController->loadMultiple() as $view) {
       // Do not return results for disabled views.
diff --git a/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsLocalTask.php b/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsLocalTask.php
index dd346c9..b38c4a4 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsLocalTask.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/Derivative/ViewsLocalTask.php
@@ -59,7 +59,7 @@ public static function create(ContainerInterface $container, $base_plugin_id) {
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     $this->derivatives = array();
 
     $view_route_names = $this->state->get('views.view_route_names');
diff --git a/core/tests/Drupal/Tests/Core/Plugin/Discovery/DerivativeDiscoveryDecoratorTest.php b/core/tests/Drupal/Tests/Core/Plugin/Discovery/DerivativeDiscoveryDecoratorTest.php
index a0487c1..fc760fb 100644
--- a/core/tests/Drupal/Tests/Core/Plugin/Discovery/DerivativeDiscoveryDecoratorTest.php
+++ b/core/tests/Drupal/Tests/Core/Plugin/Discovery/DerivativeDiscoveryDecoratorTest.php
@@ -48,7 +48,43 @@ public function testGetDerivativeFetcher() {
     $definitions = $discovery->getDefinitions();
 
     // Ensure that both test derivatives got added.
+    print_r($definitions);
     $this->assertEquals(2, count($definitions));
+    $this->assertEquals(array('id' => 'non_container_aware_discovery', 'derivative' => '\Drupal\Tests\Core\Plugin\Discovery\TestDerivativeDiscovery'),
+      $definitions['non_container_aware_discovery:test_discovery_0']
+    );
+    $this->assertEquals(array('id' => 'non_container_aware_discovery', 'derivative' => '\Drupal\Tests\Core\Plugin\Discovery\TestDerivativeDiscovery'),
+      $definitions['non_container_aware_discovery:test_discovery_1']
+    );
+  }
+
+  /**
+   * Tests the getDerivativeFetcher method with objects instead of arrays.
+   */
+  public function testGetDerivativeFetcherWithAnnotationObjects() {
+    $definitions = array();
+    $definitions['non_container_aware_discovery'] = (object) array(
+      'id' => 'non_container_aware_discovery',
+      'derivative' => '\Drupal\Tests\Core\Plugin\Discovery\TestDerivativeDiscoveryWithObject',
+    );
+
+    $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));
+    $this->assertInstanceOf('\stdClass', $definitions['non_container_aware_discovery:test_discovery_0']);
+    $this->assertEquals('non_container_aware_discovery', $definitions['non_container_aware_discovery:test_discovery_0']->id);
+    $this->assertEquals('\Drupal\Tests\Core\Plugin\Discovery\TestDerivativeDiscoveryWithObject', $definitions['non_container_aware_discovery:test_discovery_0']->derivative);
+
+    $this->assertInstanceOf('\stdClass', $definitions['non_container_aware_discovery:test_discovery_1']);
+    $this->assertEquals('non_container_aware_discovery', $definitions['non_container_aware_discovery:test_discovery_1']->id);
+    $this->assertEquals('\Drupal\Tests\Core\Plugin\Discovery\TestDerivativeDiscoveryWithObject', $definitions['non_container_aware_discovery:test_discovery_1']->derivative);
   }
 
   /**
@@ -56,7 +92,7 @@ public function testGetDerivativeFetcher() {
    *
    * @see \Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator::getDerivativeFetcher().\
    *
-   * @expectedException Drupal\Component\Plugin\Exception\InvalidDerivativeClassException
+   * @expectedException \Drupal\Component\Plugin\Exception\InvalidDerivativeClassException
    */
   public function testInvalidDerivativeFetcher() {
     $definitions = array();
@@ -71,6 +107,6 @@ public function testInvalidDerivativeFetcher() {
       ->will($this->returnValue($definitions));
 
     $discovery = new DerivativeDiscoveryDecorator($discovery_main);
-    $definitions = $discovery->getDefinitions();
+    $discovery->getDefinitions();
   }
 }
diff --git a/core/tests/Drupal/Tests/Core/Plugin/Discovery/TestDerivativeDiscovery.php b/core/tests/Drupal/Tests/Core/Plugin/Discovery/TestDerivativeDiscovery.php
index d0b8218..f1bf083 100644
--- a/core/tests/Drupal/Tests/Core/Plugin/Discovery/TestDerivativeDiscovery.php
+++ b/core/tests/Drupal/Tests/Core/Plugin/Discovery/TestDerivativeDiscovery.php
@@ -17,7 +17,7 @@ class TestDerivativeDiscovery implements DerivativeInterface {
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinition($derivative_id, array $base_plugin_definition) {
+  public function getDerivativeDefinition($derivative_id, $base_plugin_definition) {
     $definitions = $this->getDerivativeDefinitions($base_plugin_definition);
     return $definitions[$derivative_id];
   }
@@ -25,7 +25,7 @@ public function getDerivativeDefinition($derivative_id, array $base_plugin_defin
   /**
    * {@inheritdoc}
    */
-  public function getDerivativeDefinitions(array $base_plugin_definition) {
+  public function getDerivativeDefinitions($base_plugin_definition) {
     $plugins = array();
     for ($i = 0; $i < 2; $i++) {
       $plugins['test_discovery_' . $i] = $base_plugin_definition;
diff --git a/core/tests/Drupal/Tests/Core/Plugin/Discovery/TestDerivativeDiscoveryWithObject.php b/core/tests/Drupal/Tests/Core/Plugin/Discovery/TestDerivativeDiscoveryWithObject.php
new file mode 100644
index 0000000..1e7e5bc
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/Plugin/Discovery/TestDerivativeDiscoveryWithObject.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\Core\Plugin\Discovery\TestDerivativeDiscoveryWithObject.
+ */
+
+namespace Drupal\Tests\Core\Plugin\Discovery;
+
+use Drupal\Component\Plugin\Derivative\DerivativeInterface;
+
+/**
+ * Defines test derivative discovery using an object..
+ */
+class TestDerivativeDiscoveryWithObject implements DerivativeInterface {
+
+  /**
+   * {@inheritdoc}
+   * @param string $derivative_id
+   * @param array $base_plugin_definition
+   * @return array
+   */
+  public function getDerivativeDefinition($derivative_id, $base_plugin_definition) {
+    $definitions = $this->getDerivativeDefinitions($base_plugin_definition);
+    return $definitions[$derivative_id];
+  }
+
+  /**
+   * {@inheritdoc}
+   * @param array $base_plugin_definition
+   * @return array
+   */
+  public function getDerivativeDefinitions($base_plugin_definition) {
+    $plugins = array();
+    for ($i = 0; $i < 2; $i++) {
+      $plugins['test_discovery_' . $i] = $base_plugin_definition;
+    }
+    return $plugins;
+  }
+
+}
