diff --git a/core/includes/entity.inc b/core/includes/entity.inc
index 0c2a206..fe2e62a 100644
--- a/core/includes/entity.inc
+++ b/core/includes/entity.inc
@@ -378,10 +378,10 @@ function entity_delete_multiple($entity_type, array $ids) {
  * Constructs a new entity object with default values, without saving it.
  *
  * Returns an entity object with default values applied. If you need an empty
- * entity object use \Drupal\Core\Entity\EntityManager::instantiateEntity()
+ * entity object use \Drupal\Core\Entity\EntityManager::createInstance()
  * instead.
  *
- * @see Drupal\Core\Entity\EntityManager::instantiateEntity()
+ * @see Drupal\Core\Entity\EntityManager::createInstance()
  *
  * @param string $entity_type
  *   The type of the entity.
diff --git a/core/lib/Drupal/Core/Entity/DatabaseStorageController.php b/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
index c62a96c..dbbed8c 100644
--- a/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
+++ b/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
@@ -388,7 +388,11 @@ public function create(array $values) {
     $entity_class = $this->entityInfo['class'];
     $entity_class::preCreate($this, $values);
 
-    $entity = $entity_class::createInstance($values, $this->entityType);
+    $bundle = (isset($this->entityInfo['entity_keys']['bundle']) && $values[$this->entityInfo['entity_keys']['bundle']]) ? $values[$this->entityInfo['entity_keys']['bundle']] : FALSE;
+    $entity = \Drupal::entityManager()->createInstance($this->entityType, array(
+      'bundle' => $bundle,
+      'values' => $values,
+    ));
 
     // Assign a new UUID if there is none yet.
     if ($this->uuidKey && !isset($entity->{$this->uuidKey})) {
diff --git a/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php b/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php
index b4a141e..cf13dc1 100644
--- a/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php
+++ b/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php
@@ -104,7 +104,10 @@ public function create(array $values) {
     if ($this->bundleKey && isset($values[$this->bundleKey])) {
       $bundle = $values[$this->bundleKey];
     }
-    $entity = $entity_class::createInstance($values, $this->entityType, $bundle);
+    $entity = \Drupal::entityManager()->createInstance($this->entityType, array(
+      'bundle' => $bundle,
+      'values' => $values,
+    ));
 
     // Apply default values.
     foreach ($entity as $name => $field) {
@@ -235,7 +238,10 @@ protected function mapFromStorageRecords(array $records, $load_revision = FALSE)
       if (!$this->dataTable) {
         $bundle = $this->bundleKey ? $record->{$this->bundleKey} : FALSE;
         // Turn the record into an entity object.
-        $entities[$id] = \Drupal::entityManager()->instantiateEntity($this->entityType, $bundle, $entities[$id]);
+        $entities[$id] = \Drupal::entityManager()->createInstance($this->entityType, array(
+          'bundle' => $bundle,
+          'values' => $entities[$id],
+        ));
       }
     }
     $this->attachPropertyData($entities, $load_revision);
@@ -303,11 +309,14 @@ protected function attachPropertyData(array &$entities, $revision_id = FALSE) {
         }
       }
 
-      $entity_class = $this->entityClass;
       foreach ($entities as $id => $values) {
         $bundle = $this->bundleKey ? $values[$this->bundleKey][Language::LANGCODE_DEFAULT] : FALSE;
         // Turn the record into an entity class.
-        $entities[$id] = $entity_class::createInstance($values, $this->entityType, $bundle, array_keys($translations[$id]));
+        $entities[$id] = \Drupal::entityManager()->createInstance($this->entityType, array(
+          'bundle' => $bundle,
+          'values' => $values,
+          'translations' => array_keys($translations[$id]),
+        ));
       }
     }
   }
diff --git a/core/lib/Drupal/Core/Entity/Entity.php b/core/lib/Drupal/Core/Entity/Entity.php
index 9f9b6d4..9d95e03 100644
--- a/core/lib/Drupal/Core/Entity/Entity.php
+++ b/core/lib/Drupal/Core/Entity/Entity.php
@@ -79,19 +79,7 @@ public function __construct(array $values, $entity_type) {
    * Implements \Drupal\Core\Entity\EntityInterface::createInstance().
    */
   public static function createInstance(array $values, $entity_type, $bundle = FALSE, $translations = array()) {
-    $definition = \Drupal::entityManager()->getDefinition($entity_type);
-    if (!$definition) {
-      throw new \InvalidArgumentException(sprintf('The %s entity type does not exist.', $entity_type));
-    }
-    // Check if this entity type has bundles and if so if a bundle is defined.
-    $bundle_key = !empty($definition['entity_keys']['bundle']) ? $definition['entity_keys']['bundle'] : FALSE;
-    if ($bundle_key) {
-      if (empty($bundle)) {
-        throw new EntityStorageException(format_string('Missing bundle for entity type @type', array('@type' => $entity_type)));
-      }
-    }
-    $entity = new $definition['class']($values, $entity_type, $bundle, $translations);
-    return $entity;
+    return new static($values, $entity_type, $bundle, $translations);
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Entity/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php
index cf71ebf..d65c009 100644
--- a/core/lib/Drupal/Core/Entity/EntityManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityManager.php
@@ -8,7 +8,6 @@
 namespace Drupal\Core\Entity;
 
 use Drupal\Component\Plugin\PluginManagerBase;
-use Drupal\Component\Plugin\Factory\DefaultFactory;
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Language\LanguageManager;
@@ -138,7 +137,6 @@ public function __construct(\Traversable $namespaces, ContainerInterface $contai
     $this->translationManager = $translation_manager;
 
     $this->doDiscovery($namespaces);
-    $this->factory = new DefaultFactory($this->discovery);
     $this->container = $container;
   }
 
@@ -199,63 +197,51 @@ public function hasController($entity_type, $controller_type) {
    * Instantiates a new empty entity object.
    *
    * Returns an empty entity object. If you need an entity object with default
-   * values applied use entity_create() instead.
+   * values applied use \Drupal\Core\Entity\EntityManager::create() instead.
    *
    * @see entity_create()
-   * @see Drupal\Core\Entity\EntityManager::instantiateEntity()
+   * @see \Drupal\Core\Entity\EntityManager::createInstance()
    *
    * @param string $plugin_id
    *   The type of the entity.
    * @param array $configuration
-   *   The configuration to create an entity instance. Required keys are
-   *   "bundle" and "values".
+   *   The configuration to create an entity instance. By default available keys
+   *   are
+   *   bundle: the bundle of the entity,
+   *   values: An array of values to set, keyed by property name,
+   *   translations: An array of available translations of this entity.
    *
    * @return \Drupal\Core\Entity\EntityInterface
    *   An empty new entity object.
    */
   public function createInstance($plugin_id, array $configuration) {
-    return $this->instantiateEntity($plugin_id, $configuration['bundle'], $configuration['values']);
-  }
-
-  /**
-   * Instantiates a new empty entity object.
-   *
-   * Returns an empty entity object. If you need an entity object with default
-   * values applied use \Drupal\Core\Entity\EntityManager::createEntity()
-   * instead.
-   *
-   * @see \Drupal\Core\Entity\EntityManager::createEntity()
-   *
-   * @param string $entity_type
-   *   The type of the entity.
-   * @param string|FALSE $bundle
-   *   The bundle fo the entity.
-   * @param array $values
-   *   An array of values to set, keyed by property name. If the entity type has
-   *   bundles the bundle key has to be specified.
-   * @param array $translations
-   *   The langcodes of the available translations of the entity.
-   *
-   * @return \Drupal\Core\Entity\EntityInterface
-   *   An empty new entity object.
-   */
-  public function instantiateEntity($entity_type, $bundle = FALSE, $values = array(), $translations = array()) {
-    $definition = $this->getDefinition($entity_type);
+    $configuration += array(
+      'bundle' => FALSE,
+      'values' => array(),
+      'translations' => array()
+    );
+    $definition = $this->getDefinition($plugin_id);
     if (!$definition) {
-      throw new \InvalidArgumentException(sprintf('The %s entity type does not exist.', $entity_type));
+      throw new \InvalidArgumentException(sprintf('The %s entity type does not exist.', $plugin_id));
+    }
+    // Check if this entity type has bundles and if so if a bundle is defined.
+    $bundle_key = !empty($definition['entity_keys']['bundle']) ? $definition['entity_keys']['bundle'] : FALSE;
+    if ($bundle_key) {
+      if (empty($configuration['bundle'])) {
+        throw new EntityStorageException(format_string('Missing bundle for entity type @type', array('@type' => $plugin_id)));
+      }
     }
-    $entity = $definition['class']::createInstance($values, $entity_type, $bundle, $translations);
-    return $entity;
+    return $definition['class']::createInstance($configuration['values'], $plugin_id, $configuration['bundle'], $configuration['translations']);
   }
 
   /**
    * Constructs a new entity object with default values, without saving it.
    *
    * Returns an entity object with default values applied. If you need an empty
-   * entity object use \Drupal\Core\Entity\EntityManager::instantiateEntity()
+   * entity object use \Drupal\Core\Entity\EntityManager::createInstance()
    * instead.
    *
-   * @see \Drupal\Core\Entity\EntityManager::instantiateEntity()
+   * @see \Drupal\Core\Entity\EntityManager::createInstance()
    *
    * @param string $entity_type
    *   The type of the entity.
@@ -551,9 +537,9 @@ public function getFieldDefinitions($entity_type, $bundle = NULL) {
         $this->entityFieldInfo[$entity_type] = $cache->data;
       }
       else {
-        $class = $this->factory->getPluginClass($entity_type, $this->getDefinition($entity_type));
+        $entity_definition = $this->getDefinition($entity_type);
         $this->entityFieldInfo[$entity_type] = array(
-          'definitions' => $class::baseFieldDefinitions($entity_type),
+          'definitions' => $entity_definition['class']::baseFieldDefinitions($entity_type),
           // Contains definitions of optional (per-bundle) fields.
           'optional' => array(),
           // An array keyed by bundle name containing the optional fields added
diff --git a/core/lib/Drupal/Core/TypedData/ItemList.php b/core/lib/Drupal/Core/TypedData/ItemList.php
index 9b39e83..dc5a484 100644
--- a/core/lib/Drupal/Core/TypedData/ItemList.php
+++ b/core/lib/Drupal/Core/TypedData/ItemList.php
@@ -133,6 +133,10 @@ public function offsetGet($offset) {
    * @return \Drupal\Core\TypedData\TypedDataInterface
    */
   protected function createItem($offset = 0, $value = NULL) {
+    // If no value is set but it's a list, store an empty array instead NULL.
+    if (!isset($value) && !empty($this->definition['list'])) {
+      $value = array();
+    }
     return \Drupal::typedData()->getPropertyInstance($this, $offset, $value);
   }
 
diff --git a/core/lib/Drupal/Core/TypedData/Plugin/DataType/Map.php b/core/lib/Drupal/Core/TypedData/Plugin/DataType/Map.php
index 180003c..74e9371 100644
--- a/core/lib/Drupal/Core/TypedData/Plugin/DataType/Map.php
+++ b/core/lib/Drupal/Core/TypedData/Plugin/DataType/Map.php
@@ -48,10 +48,12 @@ class Map extends TypedData implements \IteratorAggregate, ComplexDataInterface
    */
   public function getPropertyDefinitions() {
     $definitions = array();
-    foreach ($this->values as $name => $value) {
-      $definitions[$name] = array(
-        'type' => 'any',
-      );
+    if (!empty($this->values)) {
+      foreach ($this->values as $name => $value) {
+        $definitions[$name] = array(
+          'type' => 'any',
+        );
+      }
     }
     return $definitions;
   }
diff --git a/core/lib/Drupal/Core/TypedData/TypedDataManager.php b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
index bbc0d7f..8b4c246 100644
--- a/core/lib/Drupal/Core/TypedData/TypedDataManager.php
+++ b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
@@ -250,9 +250,8 @@ public function getPropertyInstance(TypedDataInterface $object, $property_name,
     // data value if necessary.
     $property = clone $this->prototypes[$key];
     $property->setContext($property_name, $object);
-    if (isset($value)) {
-      $property->setValue($value, FALSE);
-    }
+    // Set even NULL values to make sure the value is set accordingly.
+    $property->setValue($value, FALSE);
     return $property;
   }
 
diff --git a/core/modules/hal/lib/Drupal/hal/Normalizer/EntityNormalizer.php b/core/modules/hal/lib/Drupal/hal/Normalizer/EntityNormalizer.php
index a87abd1..da779e9 100644
--- a/core/modules/hal/lib/Drupal/hal/Normalizer/EntityNormalizer.php
+++ b/core/modules/hal/lib/Drupal/hal/Normalizer/EntityNormalizer.php
@@ -100,7 +100,10 @@ public function denormalize($data, $class, $format = NULL, array $context = arra
     }
 
     // Create an entity object without default values applied.
-    $entity = $class::createInstance(array('langcode' => $langcode), $typed_data_ids['entity_type'], $typed_data_ids['bundle']);
+    $entity = \Drupal::entityManager()->createInstance($typed_data_ids['entity_type'], array(
+      'bundle' => $typed_data_ids['bundle'],
+      'values' => array('langcode' => $langcode),
+    ));
 
     // Special handling for PATCH: destroy all possible default values that
     // might have been set on entity creation. We want an "empty" entity that
diff --git a/core/modules/hal/lib/Drupal/hal/Tests/DenormalizeTest.php b/core/modules/hal/lib/Drupal/hal/Tests/DenormalizeTest.php
index 910c14f..e307df6 100644
--- a/core/modules/hal/lib/Drupal/hal/Tests/DenormalizeTest.php
+++ b/core/modules/hal/lib/Drupal/hal/Tests/DenormalizeTest.php
@@ -108,7 +108,7 @@ public function testMarkFieldForDeletion() {
     $empty_field_denormalized = $this->serializer->denormalize($empty_field_data, $this->entityClass, $this->format);
     $empty_field_value = $empty_field_denormalized->field_test_text->getValue();
 
-    $this->assertTrue(!empty($no_field_value) && empty($empty_field_value), 'A field set to an empty array in the data is structured differently than an empty field.');
+    $this->assertTrue(!isset($no_field_value) && empty($empty_field_value) && is_array($empty_field_value), 'A field set to an empty array in the data is structured differently than an empty field.');
   }
 
   /**
diff --git a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkStorageController.php b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkStorageController.php
index 1fa6140..1998880 100644
--- a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkStorageController.php
+++ b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkStorageController.php
@@ -80,6 +80,10 @@ public function create(array $values) {
     if (!isset($values['bundle']) && isset($values['menu_name'])) {
       $values['bundle'] = $values['menu_name'];
     }
+    elseif (!isset($values['bundle'])) {
+      // Set the default bundle if none could be found.
+      $values['bundle'] = 'tools';
+    }
     return parent::create($values);
   }
 
