diff --git a/core/lib/Drupal/Component/Annotation/Plugin.php b/core/lib/Drupal/Component/Annotation/Plugin.php
index b3699bf..78650dc 100644
--- a/core/lib/Drupal/Component/Annotation/Plugin.php
+++ b/core/lib/Drupal/Component/Annotation/Plugin.php
@@ -39,10 +39,8 @@ class Plugin implements AnnotationInterface {
    */
   public function __construct($values) {
     $reflection = new \ReflectionClass($this);
-    // Only keep actual default values by ignoring NULL values.
-    $defaults = array_filter($reflection->getDefaultProperties(), function ($value) {
-      return $value !== NULL;
-    });
+    $defaults = $reflection->getDefaultProperties();
+    unset($defaults['definition']);
     $parsed_values = $this->parse($values);
     $this->definition = NestedArray::mergeDeep($defaults, $parsed_values);
   }
diff --git a/core/tests/Drupal/Tests/Component/Annotation/PluginTest.php b/core/tests/Drupal/Tests/Component/Annotation/PluginTest.php
new file mode 100644
index 0000000..ba21799
--- /dev/null
+++ b/core/tests/Drupal/Tests/Component/Annotation/PluginTest.php
@@ -0,0 +1,107 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\Component\Annotation\PluginTest.
+ */
+
+namespace Drupal\Tests\Component\Annotation;
+
+use Drupal\Component\Annotation\Plugin;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * @coversDefaultClass \Drupal\Component\Annotation\Plugin
+ *
+ * @group Annotation
+ */
+class PluginTest extends UnitTestCase {
+
+  /**
+   * The annotation values.
+   *
+   * @var mixed[]
+   */
+  protected $annotationValue = [];
+
+  /**
+   * The class under test.
+   *
+   * @var \Drupal\Component\Annotation\Plugin
+   */
+  protected $sut;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setUp() {
+    parent::setUp();
+
+    $this->annotationValue = [
+      'id' => $this->randomMachineName(),
+      'class' => $this->getMockClass('\stdClass'),
+      // Test an arbitrary annotation key.
+      $this->randomMachineName() => $this->randomMachineName(),
+      // Test a NULL value.
+      'null' => NULL,
+      'provider' => $this->randomMachineName(),
+    ];
+
+    $this->sut = new Plugin($this->annotationValue);
+  }
+
+  /**
+   * @covers ::__construct
+   * @covers ::parse
+   */
+  public function testConstruct() {
+    $this->sut = new Plugin($this->annotationValue);
+  }
+
+  /**
+   * @covers ::get
+   */
+  public function testGet() {
+    $definition = $this->sut->get();
+    // The SUT's default implementation returns array plugin definitions.
+    $this->assertInternalType('array', $definition);
+    // The $definition property is not part of the annotation, but is an
+    // implementation detail instead. As such, it must not appear in the plugin
+    // definition.
+    $this->assertArrayNotHasKey('definition', $definition);
+
+    foreach ($this->annotationValue as $key => $value) {
+      $this->assertSame($value, $definition[$key]);
+    }
+  }
+
+  /**
+   * @covers ::getId
+   */
+  public function testGetId() {
+    $this->assertSame($this->annotationValue['id'], $this->sut->getId());
+  }
+
+  /**
+   * @covers ::getClass
+   * @covers ::setClass
+   */
+  public function testGetClass() {
+    $this->assertSame($this->annotationValue['class'], $this->sut->getClass());
+    $class = $this->getMockClass('\stdClass');
+    $this->sut->setClass($class);
+    $this->assertSame($class, $this->sut->getClass());
+  }
+
+  /**
+   * @covers ::getProvider
+   * @covers ::setProvider
+   */
+  public function testGetProvider() {
+    $this->assertSame($this->annotationValue['provider'], $this->sut->getProvider());
+    $provider = $this->randomMachineName();
+    $this->sut->setProvider($provider);
+    $this->assertSame($provider, $this->sut->getProvider());
+  }
+
+}
