diff --git a/core/includes/entity.inc b/core/includes/entity.inc
index 964a7be..1ee5e84 100644
--- a/core/includes/entity.inc
+++ b/core/includes/entity.inc
@@ -373,23 +373,26 @@ function entity_delete_multiple($entity_type, array $ids) {
   $entities = $controller->loadMultiple($ids);
   $controller->delete($entities);
 }
-
 /**
- * Constructs a new entity object, without permanently saving it.
+ * Constructs a new entity object with default values, without saving it.
  *
- * @param $entity_type
+ * Returns an entity object with default values applied. If you need an empty
+ * entity object use \Drupal\Core\Entity\EntityManager::createInstance()
+ * instead.
+ *
+ * @see Drupal\Core\Entity\EntityManager::createInstance()
+ *
+ * @param string $entity_type
  *   The type of the entity.
- * @param $values
+ * @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.
  *
  * @return \Drupal\Core\Entity\EntityInterface
- *   A new entity object.
+ *   A new entity object with default values applied.
  */
 function entity_create($entity_type, array $values) {
-  return \Drupal::entityManager()
-    ->getStorageController($entity_type)
-    ->create($values);
+  return \Drupal::entityManager()->createEntity($entity_type, $values);
 }
 
 /**
diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index 7a54191..3c786f1 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -136,20 +136,27 @@ public function __construct(array $values, $entity_type, $bundle = FALSE, $trans
     $this->bundle = $bundle ? $bundle : $this->entityType;
     $this->languages = language_list(Language::STATE_ALL);
 
-    foreach ($values as $key => $value) {
-      // If the key matches an existing property set the value to the property
-      // to ensure non converted properties have the correct value.
-      if (property_exists($this, $key) && isset($value[Language::LANGCODE_DEFAULT])) {
-        $this->$key = $value[Language::LANGCODE_DEFAULT];
+    // This is weird, any bright ideas anyone?
+    if (!empty($values['isDefaultRevision'])) {
+      $this->isDefaultRevision($values['isDefaultRevision'][Language::LANGCODE_DEFAULT]);
+      unset($values['isDefaultRevision']);
+    }
+
+    // Initialize language information of the entity.
+    $values_langcode = Language::LANGCODE_NOT_SPECIFIED;
+    if (!empty($values['langcode'])) {
+      $raw_langcode = (is_array($values['langcode'])) ? reset($values['langcode']) : $values['langcode'];
+      if (!empty($raw_langcode)) {
+        $values_langcode = $raw_langcode;
       }
-      $this->values[$key] = $value;
     }
+    $this->language = isset($this->languages[$values_langcode]) ? $this->languages[$values_langcode] : new Language(array('id' => $values_langcode));
+    $this->defaultLangcode = $values_langcode;
 
     // Initialize translations. Ensure we have at least an entry for the default
     // language.
     $data = array('status' => static::TRANSLATION_EXISTING);
     $this->translations[Language::LANGCODE_DEFAULT] = $data;
-    $this->setDefaultLangcode();
     if ($translations) {
       foreach ($translations as $langcode) {
         if ($langcode != $this->defaultLangcode && $langcode != Language::LANGCODE_DEFAULT) {
@@ -158,7 +165,25 @@ public function __construct(array $values, $entity_type, $bundle = FALSE, $trans
       }
     }
 
+    // Ensure we hit the magic setter when setting properties.
     $this->init();
+
+    $this->getPropertyDefinitions();
+
+    // Currently each stored value has its own internal language structure.
+    // Ensure the passed-in values meet the required structure and set them to
+    // the plain values array of the entity. The plain values array will be used
+    // whenever properties accessed.
+    // @todo Change the raw values array structure to hold field values per
+    //   language instead languages per field.
+    foreach ($values as $field => $value) {
+      // If the value doesn't meet the required raw values structure and is a
+      // defined field, wrap it.
+      if ((!is_array($value) || !isset($value[Language::LANGCODE_DEFAULT])) && isset($this->fieldDefinitions[$field])) {
+        $value = array(Language::LANGCODE_DEFAULT => $value);
+      }
+      $this->values[$field] = $value;
+    }
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Entity/DatabaseStorageController.php b/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
index bfbdfb4..f122b2f 100644
--- a/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
+++ b/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
@@ -239,7 +239,9 @@ public function create(array $values) {
     $entity_class = $this->entityInfo->getClass();
     $entity_class::preCreate($this, $values);
 
-    $entity = new $entity_class($values, $this->entityType);
+    $bundle_key = $this->entityInfo->getKey('bundle');
+    $bundle = isset($values[$bundle_key]) ? $values[$bundle_key] : FALSE;
+    $entity = \Drupal::entityManager()->createInstance($this->entityType, $values, $bundle);
 
     // Assign a new UUID if there is none yet.
     if ($this->uuidKey && !isset($entity->{$this->uuidKey})) {
diff --git a/core/lib/Drupal/Core/Entity/Entity.php b/core/lib/Drupal/Core/Entity/Entity.php
index 2461202..5dc2292 100644
--- a/core/lib/Drupal/Core/Entity/Entity.php
+++ b/core/lib/Drupal/Core/Entity/Entity.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Language\Language;
 use Drupal\Core\Session\AccountInterface;
 use Symfony\Component\Routing\Exception\RouteNotFoundException;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Defines a base entity class.
@@ -71,6 +72,13 @@ public function __construct(array $values, $entity_type) {
   /**
    * {@inheritdoc}
    */
+  public static function createInstance(ContainerInterface $container, array $values, $entity_type, $bundle = FALSE, $translations = array()) {
+    return new static($values, $entity_type, $bundle, $translations);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function id() {
     return isset($this->id) ? $this->id : NULL;
   }
diff --git a/core/lib/Drupal/Core/Entity/EntityInterface.php b/core/lib/Drupal/Core/Entity/EntityInterface.php
index b9f1d5e..f18cab6 100644
--- a/core/lib/Drupal/Core/Entity/EntityInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityInterface.php
@@ -8,6 +8,7 @@
 namespace Drupal\Core\Entity;
 
 use Drupal\Core\Access\AccessibleInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Defines a common interface for all entity objects.
@@ -15,6 +16,25 @@
 interface EntityInterface extends AccessibleInterface {
 
   /**
+   * Creates an entity object based on its values.
+   *
+   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
+   *   The service container this object should use.
+   * @param array $values
+   *   An array of values to set, keyed by property name.
+   * @param string $entity_type
+   *   The type of the entity to create.
+   * @param string|FALSE $bundle
+   *   The bundle of the entity.
+   * @param array $translations
+   *   The language codes of the available translations of the entity.
+   *
+   * @return \Drupal\Core\Entity\EntityInterface
+   *   An empty new entity object.
+   */
+  public static function createInstance(ContainerInterface $container, array $values, $entity_type, $bundle = FALSE, $translations = array());
+
+  /**
    * Returns the entity UUID (Universally Unique Identifier).
    *
    * The UUID is guaranteed to be unique and can be used to identify an entity
diff --git a/core/lib/Drupal/Core/Entity/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php
index 6221633..3105b4f 100644
--- a/core/lib/Drupal/Core/Entity/EntityManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityManager.php
@@ -173,6 +173,68 @@ public function getDefinition($entity_type_id, $exception_on_invalid = FALSE) {
   }
 
   /**
+   * Instantiates an entity object based on its values.
+   *
+   * If you want to create a new entity, use
+   * \Drupal\Core\Entity\EntityManager::create() instead.
+   *
+   * @see \Drupal\Core\Entity\EntityManager::create()
+   *
+   * @param string $entity_type
+   *   The type of the entity.
+   * @param array $values
+   *   The values to create an entity instance with.
+   * @param string|false $bundle
+   *   The bundle of the entity.
+   * @param array $translations
+   *   The language codes of the available translations of the entity.
+   *
+   * @throws \InvalidArgumentException
+   *   If mandatory arguments are missing.
+   *
+   * @return \Drupal\Core\Entity\EntityInterface
+   *   An empty new entity object.
+   */
+  public function createInstance($entity_type, array $values = array(), $bundle = FALSE, array $translations = array()) {
+    $definition = $this->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 = $definition->getKey('bundle');
+    if ($bundle_key) {
+      if (empty($bundle)) {
+        throw new \InvalidArgumentException(format_string('Missing bundle for entity type @type', array('@type' => $entity_type)));
+      }
+      // Make sure the bundle is part of the values too.
+      $values[$bundle_key] = $bundle;
+    }
+    $class = $definition->getClass();
+    return $class::createInstance(\Drupal::getContainer(), $values, $entity_type, $bundle, $translations);
+  }
+
+  /**
+   * Constructs an entity object for creating a new entity.
+   *
+   * Note that for the permanent creation of the new entity, the returned entity
+   * object needs to be saved first.
+   *
+   * @see \Drupal\Core\Entity\EntityManager::createInstance()
+   *
+   * @param string $entity_type
+   *   The type of 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.
+   *
+   * @return \Drupal\Core\Entity\EntityInterface
+   *   A new entity object with default values applied.
+   */
+  public function createEntity($entity_type, array $values) {
+    return $this->getStorageController($entity_type)->create($values);
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function hasController($entity_type, $controller_type) {
diff --git a/core/lib/Drupal/Core/Entity/FieldableEntityStorageControllerBase.php b/core/lib/Drupal/Core/Entity/FieldableEntityStorageControllerBase.php
index 0275597..54167a3 100644
--- a/core/lib/Drupal/Core/Entity/FieldableEntityStorageControllerBase.php
+++ b/core/lib/Drupal/Core/Entity/FieldableEntityStorageControllerBase.php
@@ -56,32 +56,21 @@ public static function createInstance(ContainerInterface $container, EntityTypeI
    * {@inheritdoc}
    */
   public function create(array $values) {
-    $entity_class = $this->entityInfo->getClass();
+    $entity_class = $this->entityClass;
     $entity_class::preCreate($this, $values);
 
     // We have to determine the bundle first.
     $bundle = FALSE;
-    if ($this->bundleKey) {
-      if (!isset($values[$this->bundleKey])) {
-        throw new EntityStorageException(String::format('Missing bundle for entity type @type', array('@type' => $this->entityType)));
-      }
+    if ($this->bundleKey && isset($values[$this->bundleKey])) {
       $bundle = $values[$this->bundleKey];
     }
-    $entity = new $entity_class(array(), $this->entityType, $bundle);
+    $entity = \Drupal::entityManager()->createInstance($this->entityType, $values, $bundle);
 
-    foreach ($entity as $name => $field) {
-      if (isset($values[$name])) {
-        $entity->$name = $values[$name];
-      }
-      elseif (!array_key_exists($name, $values)) {
+    // Apply default values.
+    foreach ($entity->getPropertyDefinitions() as $name => $property_definition) {
+      if (!array_key_exists($name, $values)) {
         $entity->get($name)->applyDefaultValue();
       }
-      unset($values[$name]);
-    }
-
-    // Set any passed values for non-defined fields also.
-    foreach ($values as $name => $value) {
-      $entity->$name = $value;
     }
     $entity->postCreate($this);
 
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldWidget/AutocompleteWidgetBase.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldWidget/AutocompleteWidgetBase.php
index 4621c5c..2a07d2b 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldWidget/AutocompleteWidgetBase.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldWidget/AutocompleteWidgetBase.php
@@ -95,7 +95,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
       '#placeholder' => $this->getSetting('placeholder'),
       '#element_validate' => array(array($this, 'elementValidate')),
       // @todo: Use wrapper to get the user if exists or needed.
-      '#autocreate_uid' => isset($entity->uid) ? $entity->uid : $user->id(),
+      '#autocreate_uid' => isset($entity->uid->value) ? $entity->uid->value : $user->id(),
     );
 
     return array('target_id' => $element);
diff --git a/core/modules/hal/lib/Drupal/hal/Normalizer/EntityNormalizer.php b/core/modules/hal/lib/Drupal/hal/Normalizer/EntityNormalizer.php
index a3aa448..a6b81d6 100644
--- a/core/modules/hal/lib/Drupal/hal/Normalizer/EntityNormalizer.php
+++ b/core/modules/hal/lib/Drupal/hal/Normalizer/EntityNormalizer.php
@@ -99,7 +99,8 @@ public function denormalize($data, $class, $format = NULL, array $context = arra
       $langcode = Language::LANGCODE_NOT_SPECIFIED;
     }
 
-    $entity = entity_create($typed_data_ids['entity_type'], array('langcode' => $langcode, 'type' => $typed_data_ids['bundle']));
+    // Create an entity object without default values applied.
+    $entity = \Drupal::entityManager()->createInstance($typed_data_ids['entity_type'], array('langcode' => $langcode), $typed_data_ids['bundle']);
 
     // 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/menu_link/lib/Drupal/menu_link/MenuLinkStorageController.php b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkStorageController.php
index 0e95f42..0253f77 100644
--- a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkStorageController.php
+++ b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkStorageController.php
@@ -77,6 +77,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);
   }
 
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityCrudHookTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityCrudHookTest.php
index 784b0ac..207f8ce 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityCrudHookTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityCrudHookTest.php
@@ -473,7 +473,7 @@ public function testUserHooks() {
       'mail' => 'test@example.com',
       'created' => REQUEST_TIME,
       'status' => 1,
-      'language' => 'en',
+      'langcode' => 'en',
     ));
 
     $this->assertHookMessageOrder(array(
diff --git a/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php b/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php
index 95c3283..dca4bb6 100644
--- a/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php
+++ b/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php
@@ -17,6 +17,7 @@
 use Drupal\views\Plugin\views\query\Sql;
 use Drupal\views\Entity\View;
 use Drupal\views\ViewStorageInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Stores UI related temporary settings.
@@ -163,6 +164,16 @@ public function __construct(ViewStorageInterface $storage, ViewExecutable $execu
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public static function createInstance(ContainerInterface $container, array $values, $entity_type, $bundle = FALSE, $translations = array()) {
+    // This class shouldn't be used like an entity and thus shouldn't be
+    // instantiated using this helper function. Therefore we break with the
+    // interface and just throw an error.
+    throw new \Exception('ViewUI cannot be handled as entity. Use the normal constructor to create an instance instead.');
+  }
+
+  /**
    * Overrides \Drupal\Core\Config\Entity\ConfigEntityBase::get().
    */
   public function get($property_name, $langcode = NULL) {
