diff --git a/core/lib/Drupal/Core/Entity/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php
index 1fcf266..30e11be 100644
--- a/core/lib/Drupal/Core/Entity/EntityManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityManager.php
@@ -233,7 +233,6 @@ public function __construct() {
     $this->discovery = new InfoHookDecorator($this->discovery, 'entity_info');
     $this->discovery = new ProcessDecorator($this->discovery, array($this, 'processDefinition'));
     $this->discovery = new AlterDecorator($this->discovery, 'entity_info');
-    $this->factory = new DefaultFactory($this);
 
     // Entity type plugins includes translated strings, so each language is
     // cached separately.
@@ -298,4 +297,23 @@ public function processDefinition(&$definition, $plugin_id) {
     }
   }
 
+  /**
+   * Overrides Drupal\Component\Plugin\PluginManagerBase::createInstance().
+   */
+  public function createInstance($plugin_id, array $values) {
+    // @todo entity_create() should be a wrapper to createInstance() rather than
+    //   the other way around, but that requires moving storage controller
+    //   access into this manager class: http://drupal.org/node/1831264.
+    return entity_create($plugin_id, $values);
+  }
+
+  /**
+   * Overrides Drupal\Component\Plugin\PluginManagerBase::getInstance().
+   */
+  public function getInstance(array $options) {
+    // @todo entity_load() should be a wrapper to getInstance() rather than the
+    //   other way around, but that requires moving storage controller access
+    //   into this manager class: http://drupal.org/node/1831264.
+    return entity_load($options['entity_type'], $options['entity_id'], !empty($options['reset']));
+  }
 }
diff --git a/core/modules/jsonld/lib/Drupal/jsonld/JsonldBundle.php b/core/modules/jsonld/lib/Drupal/jsonld/JsonldBundle.php
index 538f4d0..3000435 100644
--- a/core/modules/jsonld/lib/Drupal/jsonld/JsonldBundle.php
+++ b/core/modules/jsonld/lib/Drupal/jsonld/JsonldBundle.php
@@ -8,6 +8,7 @@
 namespace Drupal\jsonld;
 
 use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
 use Symfony\Component\HttpKernel\Bundle\Bundle;
 use Symfony\Component\Serializer\Serializer;
 
@@ -22,43 +23,20 @@ class JsonldBundle extends Bundle {
   public function build(ContainerBuilder $container) {
     $priority = 5;
 
-    // Normalizers can be specified to support a particular class and format in
-    // Normalizer::supportsNormalization(). Since the first matching Normalizer
-    // is used, Normalizers should be ordered from most specific to least
-    // specific.
-    $normalizers = array(
-      // Field Item.
-      'entity_reference' => array(
-        'jsonld' => 'Drupal\jsonld\JsonldEntityReferenceNormalizer',
-      ),
-      'field_item' => array(
-        'jsonld' => 'Drupal\jsonld\JsonldFieldItemNormalizer',
-      ),
-      // Entity.
-      'entity' => array(
-        'jsonld' => 'Drupal\jsonld\JsonldEntityNormalizer',
-      ),
-    );
-    // Encoders can only specify which format they support in
-    // Encoder::supportsEncoding().
-    $encoders = array(
-      'jsonld' => 'Drupal\jsonld\JsonldEncoder',
-    );
+    // Register normalizers.
+    $container->register('serializer.normalizer.entity_reference.jsonld', 'Drupal\jsonld\JsonldEntityReferenceNormalizer')
+      ->addTag('normalizer', array('priority' => $priority));
+    $container->register('serializer.normalizer.field_item.jsonld', 'Drupal\jsonld\JsonldFieldItemNormalizer')
+      ->addTag('normalizer', array('priority' => $priority));
+    $container->register('serializer.normalizer.entity.jsonld', 'Drupal\jsonld\JsonldEntityNormalizer')
+      ->addArgument(new Reference('plugin.manager.entity'))
+      ->addTag('normalizer', array('priority' => $priority));
 
-    // Add Normalizers to service container.
-    foreach ($normalizers as $supported_class => $formats) {
-      foreach ($formats as $format => $normalizer_class) {
-        $container->register("serializer.normalizer.{$supported_class}.{$format}", $normalizer_class)
-          ->addTag('normalizer', array('priority' => $priority));
-      }
-    }
-
-    // Add Encoders to service container.
-    foreach ($encoders as $format => $encoder_class) {
-      $container->register("serializer.encoder.{$format}", $encoder_class)
-        ->addTag('encoder', array('priority' => $priority));
-    }
+    // Register encoders.
+    $container->register('serializer.encoder.jsonld', 'Drupal\jsonld\JsonldEncoder')
+      ->addTag('encoder', array('priority' => $priority));
 
+    // Register event subscribers.
     $container->register('jsonld.subscriber', 'Drupal\jsonld\EventSubscriber\JsonldSubscriber')
       ->addTag('event_subscriber');
   }
diff --git a/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityNormalizer.php b/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityNormalizer.php
index 2ab909e..e9bf130 100644
--- a/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityNormalizer.php
+++ b/core/modules/jsonld/lib/Drupal/jsonld/JsonldEntityNormalizer.php
@@ -9,6 +9,7 @@
 
 use Drupal\jsonld\JsonldNormalizerBase;
 use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
+use Drupal\Component\Plugin\Factory\FactoryInterface;
 
 /**
  * Converts the Drupal entity object structure to JSON-LD array structure.
@@ -23,6 +24,20 @@ class JsonldEntityNormalizer extends JsonldNormalizerBase implements Denormalize
   protected static $supportedInterfaceOrClass = 'Drupal\Core\Entity\EntityInterface';
 
   /**
+   * The entity factory to use for creating the entity during denormalization.
+   *
+   * @var \Drupal\Component\Plugin\Factory\FactoryInterface
+   */
+  protected $entityFactory;
+
+  /**
+   * Constructor.
+   */
+  public function __construct(FactoryInterface $entity_factory) {
+    $this->entityFactory = $entity_factory;
+  }
+
+  /**
    * Implements \Symfony\Component\Serializer\Normalizer\NormalizerInterface::normalize()
    */
   public function normalize($entity, $format = NULL) {
@@ -68,7 +83,7 @@ public function denormalize($data, $class, $format = null) {
     else if ($this->containsTranslation($data)) {
       $values['langcode'] = language(LANGUAGE_TYPE_CONTENT)->langcode;
     }
-    $entity = entity_create($entity_type, $values);
+    $entity = $this->entityFactory->createInstance($entity_type, $values);
 
     // For each attribute in the JSON-LD, add the values as fields to the newly
     // created entity. It is assumed that the JSON attribute names are the same
diff --git a/core/modules/jsonld/lib/Drupal/jsonld/Tests/NormalizeDenormalizeTest.php b/core/modules/jsonld/lib/Drupal/jsonld/Tests/NormalizeDenormalizeTest.php
index 9ecfda5..638b8bf 100644
--- a/core/modules/jsonld/lib/Drupal/jsonld/Tests/NormalizeDenormalizeTest.php
+++ b/core/modules/jsonld/lib/Drupal/jsonld/Tests/NormalizeDenormalizeTest.php
@@ -14,6 +14,7 @@
 use Drupal\jsonld\JsonldFieldItemNormalizer;
 use Drupal\simpletest\WebTestBase;
 use Symfony\Component\Serializer\Serializer;
+use Drupal\entity_test\EntityTestFactory;
 
 /**
  * Test the vendor specific JSON-LD normalizer.
@@ -37,6 +38,11 @@ class NormalizeDenormalizeTest extends WebTestBase {
    */
   protected $normalizers;
 
+  /**
+   * A factory for creating test entities.
+   */
+  protected $entityTestFactory;
+
   public static function getInfo() {
     return array(
       'name' => 'Normalize/Denormalize Test',
@@ -51,10 +57,12 @@ public static function getInfo() {
   function setUp() {
     parent::setUp();
 
+    $this->entityTestFactory = new EntityTestFactory();
+
     $this->normalizers = array(
       'entityreference' => new JsonldEntityReferenceNormalizer(),
       'field_item' => new JsonldFieldItemNormalizer(),
-      'entity' => new JsonldEntityNormalizer(),
+      'entity' => new JsonldEntityNormalizer($this->entityTestFactory),
     );
     $serializer = new Serializer($this->normalizers, array(new JsonldEncoder()));
     $this->normalizers['entity']->setSerializer($serializer);
@@ -86,7 +94,7 @@ public function testNormalize() {
       'name' => $this->randomName(),
     );
 
-    $entity = entity_create('entity_test', $values);
+    $entity = $this->entityTestFactory->createInstance('entity_test', $values);
     $entity->save();
     // Add an English value for name property.
     $entity->getTranslation('en')->set('name', array(0 => array('value' => $translationValues['name'])));
diff --git a/core/modules/jsonld/lib/Drupal/jsonld/Tests/SupportsSerializationTest.php b/core/modules/jsonld/lib/Drupal/jsonld/Tests/SupportsSerializationTest.php
index b0d4474..ec74b26 100644
--- a/core/modules/jsonld/lib/Drupal/jsonld/Tests/SupportsSerializationTest.php
+++ b/core/modules/jsonld/lib/Drupal/jsonld/Tests/SupportsSerializationTest.php
@@ -13,6 +13,7 @@
 use Drupal\jsonld\JsonldFieldItemNormalizer;
 use Drupal\simpletest\WebTestBase;
 use Symfony\Component\Serializer\Serializer;
+use Drupal\entity_test\EntityTestFactory;
 
 /**
  * Test the vendor specific JSON-LD normalizer.
@@ -36,6 +37,11 @@ class SupportsSerializationTest extends WebTestBase {
    */
   protected $normalizers;
 
+  /**
+   * A factory for creating test entities.
+   */
+  protected $entityTestFactory;
+
   public static function getInfo() {
     return array(
       'name' => 'Supports class/format serialization test',
@@ -50,10 +56,11 @@ public static function getInfo() {
   function setUp() {
     parent::setUp();
 
+    $this->entityTestFactory = new EntityTestFactory();
     $this->normalizers = array(
       'entityreference' => new JsonldEntityReferenceNormalizer(),
       'field_item' => new JsonldFieldItemNormalizer(),
-      'entity' => new JsonldEntityNormalizer(),
+      'entity' => new JsonldEntityNormalizer($this->entityTestFactory),
     );
     $serializer = new Serializer($this->normalizers);
     $this->normalizers['entity']->setSerializer($serializer);
@@ -64,7 +71,7 @@ function setUp() {
    */
   public function testSupportsNormalization() {
     $format = static::$format;
-    $supportedEntity = entity_create('entity_test', array());
+    $supportedEntity = $this->entityTestFactory->createInstance('entity_test', array());
     $unsupportedEntity = new ConfigEntityTest();
     $field = $supportedEntity->get('uuid');
     $entityreferenceField = $supportedEntity->get('user_id');
diff --git a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestFactory.php b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestFactory.php
new file mode 100644
index 0000000..36e8e05
--- /dev/null
+++ b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestFactory.php
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\entity_test\EntityTestFactory.
+ */
+
+namespace Drupal\entity_test;
+
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Component\Plugin\Factory\FactoryInterface;
+
+/**
+ * Defines a mock factory for creating entity_test entities in unit tests.
+ */
+class EntityTestFactory implements FactoryInterface {
+
+  /**
+   * Implements Drupal\Component\Plugin\Factory\FactoryInterface::createInstance().
+   */
+  public function createInstance($entity_type, array $values) {
+    if ($entity_type == 'entity_test') {
+      $storage_controller = new EntityTestStorageController($entity_type);
+      return $storage_controller->create($values);
+    }
+  }
+
+}
