diff --git a/core/includes/entity.inc b/core/includes/entity.inc
index 4dddce1..d6778d4 100644
--- a/core/includes/entity.inc
+++ b/core/includes/entity.inc
@@ -374,23 +374,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 3564f1f..366b729 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -143,14 +143,22 @@ 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_DEFAULT;
+    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 = $this->languages[$values_langcode];
+    $default_langcode = $values_langcode;
 
     // Initialize translations. Ensure we have at least an entry for the default
     // language.
@@ -165,7 +173,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 f258353..e195319 100644
--- a/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
+++ b/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
@@ -251,7 +251,8 @@ public function create(array $values) {
     $entity_class = $this->entityInfo['class'];
     $entity_class::preCreate($this, $values);
 
-    $entity = new $entity_class($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, $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 b0b905d..3d64d06 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.
@@ -64,6 +65,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 bf01326..2d9dd4e 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
+   *   List of available translations of this 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 83a671c..639327e 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\Field\FieldDefinition;
 use Drupal\Core\Cache\CacheBackendInterface;
@@ -143,7 +142,6 @@ public function __construct(\Traversable $namespaces, ContainerInterface $contai
     $this->discovery = new InfoHookDecorator($this->discovery, 'entity_info');
     $this->discovery = new AlterDecorator($this->discovery, 'entity_info');
     $this->discovery = new CacheDecorator($this->discovery, 'entity_info:' . $this->languageManager->getLanguage(Language::TYPE_INTERFACE)->id, 'cache', CacheBackendInterface::CACHE_PERMANENT, array('entity_info' => TRUE));
-    $this->factory = new DefaultFactory($this->discovery);
     $this->container = $container;
   }
 
@@ -165,6 +163,67 @@ public function hasController($entity_type, $controller_type) {
   }
 
   /**
+   * 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 = !empty($definition['entity_keys']['bundle']) ? $definition['entity_keys']['bundle'] : FALSE;
+    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;
+    }
+    return $definition['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 getControllerClass($entity_type, $controller_type, $nested = NULL) {
@@ -336,7 +395,8 @@ public function getFieldDefinitions($entity_type, $bundle = NULL) {
       else {
         // @todo: Refactor to allow for per-bundle overrides.
         // See https://drupal.org/node/2114707.
-        $class = $this->factory->getPluginClass($entity_type, $this->getDefinition($entity_type));
+        $entity_definition = $this->getDefinition($entity_type);
+        $class = $entity_definition['class'];
 
         $this->entityFieldInfo[$entity_type] = array(
           'definitions' => $class::baseFieldDefinitions($entity_type),
diff --git a/core/lib/Drupal/Core/Entity/FieldableDatabaseStorageController.php b/core/lib/Drupal/Core/Entity/FieldableDatabaseStorageController.php
index 5251054..f3e1fff 100644
--- a/core/lib/Drupal/Core/Entity/FieldableDatabaseStorageController.php
+++ b/core/lib/Drupal/Core/Entity/FieldableDatabaseStorageController.php
@@ -167,27 +167,16 @@ public function create(array $values) {
 
     // We have to determine the bundle first.
     $bundle = FALSE;
-    if ($this->bundleKey) {
-      if (!isset($values[$this->bundleKey])) {
-        throw new EntityStorageException(format_string('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 301ee9a..6f0becb 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/field/lib/Drupal/field/Tests/TranslationTest.php b/core/modules/field/lib/Drupal/field/Tests/TranslationTest.php
index a105e90..71e1b44 100644
--- a/core/modules/field/lib/Drupal/field/Tests/TranslationTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/TranslationTest.php
@@ -119,8 +119,9 @@ function setUp() {
   function testFieldAvailableLanguages() {
     // Test 'translatable' fieldable info.
     field_test_entity_info_translatable('entity_test', FALSE);
-    $field = clone($this->field);
-    $field->field_name .= '_untranslatable';
+    $field = $this->field->createDuplicate();
+    $field->enforceIsNew(TRUE);
+    $field->name .= '_ut';
     $field->save();
 
     // Enable field translations for the entity.
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 9744718..8d109b6 100644
--- a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkStorageController.php
+++ b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkStorageController.php
@@ -78,6 +78,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 e7cf674..6edcbf5 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityCrudHookTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityCrudHookTest.php
@@ -472,7 +472,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 ed94fc7..d79b149 100644
--- a/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php
+++ b/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php
@@ -16,6 +16,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.
@@ -162,6 +163,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) {
