diff --git a/core/modules/rest/tests/src/Unit/Plugin/Derivative/EntityDerivativeTest.php b/core/modules/rest/tests/src/Unit/Plugin/Derivative/EntityDerivativeTest.php
new file mode 100644
index 0000000..08b2900
--- /dev/null
+++ b/core/modules/rest/tests/src/Unit/Plugin/Derivative/EntityDerivativeTest.php
@@ -0,0 +1,134 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\rest\Unit\Plugin\Derivative\EntityDerivativeTest.
+ */
+
+namespace Drupal\Tests\rest\Unit\Plugin\Derivative;
+
+use Drupal\Tests\UnitTestCase;
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\rest\Plugin\Derivative\EntityDerivative;
+
+/**
+ * @coversDefaultClass \Drupal\rest\Plugin\Derivative\EntityDerivative
+ * @group rest
+ */
+class EntityDerivativeTest extends UnitTestCase {
+
+  /**
+   * @var \Drupal\Core\DependencyInjection\ContainerBuilder
+   */
+  protected $containerBuilder;
+
+  /**
+   * @var \Drupal\rest\Plugin\Derivative\EntityDerivative
+   */
+  protected $entityDerivative;
+
+  /**
+   * Fake entity definitions.
+   *
+   * @var array
+   */
+  protected $entityDefinitions = array();
+
+  /**
+   *  {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    // Setup fake entity types to be returned by the entity manager.
+    $entity_type_1 = $this->getMockBuilder('\Drupal\Core\Entity\EntityTypeInterface')
+      ->getMock();
+    $entity_type_2 = $this->getMockBuilder('\Drupal\Core\Entity\EntityTypeInterface')
+      ->getMock();
+    $entity_type_2->method('getLinkTemplate')
+      ->willReturn('valid-router-item');
+    $entity_type_3 = $this->getMockBuilder('\Drupal\Core\Entity\EntityTypeInterface')
+      ->getMock();
+    $entity_type_3->method('getLinkTemplate')
+      ->willReturn('invalid-router-item');
+    $this->entityDefinitions = array(
+      'entity1' => $entity_type_1,
+      'entity2' => $entity_type_2,
+      'entity3' => $entity_type_3,
+    );
+    $entity_manager = $this->getMockBuilder('\Drupal\Core\Entity\EntityManager')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $entity_manager->method('getDefinitions')
+      ->willReturn($this->entityDefinitions);
+
+    // Setup a route provider with routes.
+    $route = $this->getMockBuilder('\Symfony\Component\Routing\Route')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $route->method('getPath')
+      ->willReturn('valid-router-path');
+    $route_provider = $this->getMockBuilder('\Drupal\Core\Routing\RouteProvider')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $map = array(
+      array('invalid-router-item', FALSE),
+      array('valid-router-item', $route),
+    );
+    $route_provider->method('getRouteByName')
+      ->will($this->returnValueMap($map));
+
+    // Mock route builder.
+    $route_builder = $this->getMockBuilder('\Drupal\Core\Routing\RouteBuilder')
+      ->disableOriginalConstructor()
+      ->getMock();
+
+    $this->containerBuilder = new ContainerBuilder();
+    $this->containerBuilder->set('entity.manager', $entity_manager);
+    $this->containerBuilder->set('router.route_provider', $route_provider);
+    $this->containerBuilder->set('router.builder', $route_builder);
+
+    $this->entityDerivative = new EntityDerivative($entity_manager, $route_provider, $route_builder);
+  }
+
+  /**
+   * Tests the create() method.
+   *
+   * @covers ::create()
+   */
+  public function testCreate() {
+    $entityDerivative = EntityDerivative::create($this->containerBuilder, 'dummy');
+    $this->assertInstanceOf('\Drupal\rest\Plugin\Derivative\EntityDerivative', $entityDerivative);
+  }
+
+  /**
+   * Tests the getDerivativeDefinitions() method.
+   *
+   * @covers ::getDerivativeDefinition()
+   * @covers ::getDerivativeDefinitions()
+   */
+  public function testGetDerivativeDefinitions() {
+    $base_plugin_definition = array(
+      'foo' => 'bar',
+    );
+
+    // Default uris.
+    $definition = $this->entityDerivative->getDerivativeDefinition('entity1', $base_plugin_definition);
+    $this->assertSame('bar', $definition['foo'], 'The base plugin definition was not properly merged.');
+    $this->assertSame('entity:entity1', $definition['id'], 'The derivative ID was not properly set.');
+    $this->assertSame('/entity/entity1/{entity1}', $definition['uri_paths']['canonical'], 'The default canonical uri was not properly set.');
+
+    // Custom link template.
+    $definition = $this->entityDerivative->getDerivativeDefinition('entity2', $base_plugin_definition);
+    $this->assertSame('bar', $definition['foo'], 'The base plugin definition was not properly merged.');
+    $this->assertSame('entity:entity2', $definition['id'], 'The derivative ID was not properly set.');
+    $this->assertSame('valid-router-path', $definition['uri_paths']['canonical'], 'The custom canonical uri was not properly set.');
+
+    $definitions = $this->entityDerivative->getDerivativeDefinitions($base_plugin_definition);
+    $this->assertArrayHasKey('entity1', $definitions);
+    $this->assertArrayHasKey('entity2', $definitions);
+    // Derivative with invalid router item should not be present.
+    $this->assertArrayNotHasKey('entity3', $definitions);
+  }
+
+}
