diff --git a/core/lib/Drupal.php b/core/lib/Drupal.php
index 0d100df..b94ce32 100644
--- a/core/lib/Drupal.php
+++ b/core/lib/Drupal.php
@@ -547,4 +547,8 @@ public static function transliteration() {
     return static::$container->get('transliteration');
   }
 
+  public static function underscore($camel_case_string) {
+    return strtolower(preg_replace(array('/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'), array('\\1_\\2', '\\1_\\2'), strtr($camel_case_string, '_', '.')));
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Entity/Entity.php b/core/lib/Drupal/Core/Entity/Entity.php
index 6d41d13..dc0f677 100644
--- a/core/lib/Drupal/Core/Entity/Entity.php
+++ b/core/lib/Drupal/Core/Entity/Entity.php
@@ -23,6 +23,8 @@
  */
 class Entity implements \IteratorAggregate, EntityInterface {
 
+  static $entityManager;
+
   /**
    * The language code of the entity's default language.
    *
@@ -59,6 +61,37 @@ class Entity implements \IteratorAggregate, EntityInterface {
   protected $isDefaultRevision = TRUE;
 
   /**
+   * Constructs a new entity object, without permanently saving it.
+   *
+   * @param $entity_type
+   *   The type of the entity.
+   * @param $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.
+   */
+  static function create(array $values) {
+    $entity_type = static::entityName();
+    return static::manager()
+      ->getStorageController($entity_type)
+      ->create($values);
+  }
+
+  static function manager() {
+    if (!static::$entityManager) {
+      static::$entityManager = \Drupal::entityManager();
+    }
+    return static::$entityManager;
+  }
+
+  static function entityName() {
+    $parts = explode('\\', get_called_class());
+    return \Drupal::underscore(end($parts));
+  }
+
+  /**
    * Constructs an Entity object.
    *
    * @param array $values
diff --git a/core/modules/field/lib/Drupal/field/Entity/Field.php b/core/modules/field/lib/Drupal/field/Entity/Field.php
index 3421461..6e502b3 100644
--- a/core/modules/field/lib/Drupal/field/Entity/Field.php
+++ b/core/modules/field/lib/Drupal/field/Entity/Field.php
@@ -198,6 +198,10 @@ class Field extends ConfigEntityBase implements FieldInterface {
    */
   public $original = NULL;
 
+  static function entityName() {
+    return 'field_entity';
+  }
+
   /**
    * Constructs a Field object.
    *
diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldUnitTestBase.php b/core/modules/field/lib/Drupal/field/Tests/FieldUnitTestBase.php
index cd809a6..d7663c8 100644
--- a/core/modules/field/lib/Drupal/field/Tests/FieldUnitTestBase.php
+++ b/core/modules/field/lib/Drupal/field/Tests/FieldUnitTestBase.php
@@ -9,6 +9,8 @@
 
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Language\Language;
+use Drupal\field\Entity\Field;
+use Drupal\field\Entity\FieldInstance;
 use Drupal\simpletest\DrupalUnitTestBase;
 
 /**
@@ -67,7 +69,7 @@ function createFieldWithInstance($suffix = '', $entity_type = 'entity_test', $bu
     $instance_definition = 'instance_definition' . $suffix;
 
     $this->$field_name = drupal_strtolower($this->randomName() . '_field_name' . $suffix);
-    $this->$field = entity_create('field_entity', array(
+    $this->$field = Field::create(array(
       'name' => $this->$field_name,
       'entity_type' => $entity_type,
       'type' => 'test_field',
@@ -85,7 +87,7 @@ function createFieldWithInstance($suffix = '', $entity_type = 'entity_test', $bu
         'test_instance_setting' => $this->randomName(),
       ),
     );
-    $this->$instance = entity_create('field_instance', $this->$instance_definition);
+    $this->$instance = FieldInstance::create($this->$instance_definition);
     $this->$instance->save();
 
     entity_get_form_display($entity_type, $bundle, 'default')
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 84231d3..e1b604d 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityCrudHookTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityCrudHookTest.php
@@ -9,6 +9,14 @@
 
 use Drupal\Core\Language\Language;
 use Drupal\Core\Database\Database;
+use Drupal\block\Entity\Block;
+use Drupal\comment\Entity\Comment;
+use Drupal\node\Entity\Node;
+use Drupal\file\Entity\File;
+use Drupal\taxonomy\Entity\Vocabulary;
+use Drupal\taxonomy\Entity\Term;
+use Drupal\entity_test\Entity\EntityTest;
+use Drupal\user\Entity\User;
 
 /**
  * Tests invocation of hooks when performing an action.
@@ -77,7 +85,7 @@ protected function assertHookMessageOrder($messages) {
    * Tests hook invocations for CRUD operations on blocks.
    */
   public function testBlockHooks() {
-    $entity = entity_create('block', array(
+    $entity = Block::create(array(
       'id' => 'stark.test_html_id',
       'plugin' => 'test_html_id',
     ));
@@ -133,7 +141,7 @@ public function testBlockHooks() {
   public function testCommentHooks() {
     $account = $this->createUser();
 
-    $node = entity_create('node', array(
+    $node = Node::create(array(
       'uid' => $account->id(),
       'type' => 'article',
       'title' => 'Test node',
@@ -149,7 +157,7 @@ public function testCommentHooks() {
     $nid = $node->id();
     $_SESSION['entity_crud_hook_test'] = array();
 
-    $comment = entity_create('comment', array(
+    $comment = Comment::create(array(
       'node_type' => 'node_type_' . $node->bundle(),
       'cid' => NULL,
       'pid' => 0,
@@ -214,7 +222,7 @@ public function testFileHooks() {
     $this->installSchema('file', array('file_managed', 'file_usage'));
     $url = 'public://entity_crud_hook_test.file';
     file_put_contents($url, 'Test test test');
-    $file = entity_create('file', array(
+    $file = File::create(array(
       'fid' => NULL,
       'uid' => 1,
       'filename' => 'entity_crud_hook_test.file',
@@ -276,7 +284,7 @@ public function testFileHooks() {
   public function testNodeHooks() {
     $account = $this->createUser();
 
-    $node = entity_create('node', array(
+    $node = Node::create(array(
       'uid' => $account->id(),
       'type' => 'article',
       'title' => 'Test node',
@@ -340,7 +348,7 @@ public function testNodeHooks() {
   public function testTaxonomyTermHooks() {
     $this->installSchema('taxonomy', array('taxonomy_term_data', 'taxonomy_term_hierarchy'));
 
-    $vocabulary = entity_create('taxonomy_vocabulary', array(
+    $vocabulary = Vocabulary::create(array(
       'name' => 'Test vocabulary',
       'vid' => 'test',
       'langcode' => Language::LANGCODE_NOT_SPECIFIED,
@@ -350,7 +358,7 @@ public function testTaxonomyTermHooks() {
     $vocabulary->save();
     $_SESSION['entity_crud_hook_test'] = array();
 
-    $term = entity_create('taxonomy_term', array(
+    $term = Term::create(array(
       'vid' => $vocabulary->id(),
       'name' => 'Test term',
       'langcode' => Language::LANGCODE_NOT_SPECIFIED,
@@ -409,7 +417,7 @@ public function testTaxonomyTermHooks() {
   public function testTaxonomyVocabularyHooks() {
     $this->installSchema('taxonomy', array('taxonomy_term_data', 'taxonomy_term_hierarchy'));
 
-    $vocabulary = entity_create('taxonomy_vocabulary', array(
+    $vocabulary = Vocabulary::create(array(
       'name' => 'Test vocabulary',
       'vid' => 'test',
       'langcode' => Language::LANGCODE_NOT_SPECIFIED,
@@ -466,7 +474,7 @@ public function testTaxonomyVocabularyHooks() {
    * Tests hook invocations for CRUD operations on users.
    */
   public function testUserHooks() {
-    $account = entity_create('user', array(
+    $account = User::create(array(
       'name' => 'Test user',
       'mail' => 'test@example.com',
       'created' => REQUEST_TIME,
@@ -525,7 +533,7 @@ public function testUserHooks() {
   function testEntityNGRollback() {
     // Create a block.
     try {
-      $entity = entity_create('entity_test', array('name' => 'fail_insert'))->save();
+      $entity = EntityTest::create(array('name' => 'fail_insert'))->save();
       $this->fail('Expected exception has not been thrown.');
     }
     catch (\Exception $e) {
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Entity/Term.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Entity/Term.php
index 03ddfe2..84d2b0c 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Entity/Term.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Entity/Term.php
@@ -122,6 +122,10 @@ class Term extends EntityNG implements TermInterface {
    */
   public $parent;
 
+  static function entityName() {
+    return 'taxonomy_term';
+  }
+
   /**
    * Implements Drupal\Core\Entity\EntityInterface::id().
    */
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Entity/Vocabulary.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Entity/Vocabulary.php
index df4018a..cbc214b 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Entity/Vocabulary.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Entity/Vocabulary.php
@@ -92,6 +92,10 @@ class Vocabulary extends ConfigEntityBase implements VocabularyInterface {
    */
   public $weight = 0;
 
+  static function entityName() {
+    return 'taxonomy_vocabulary';
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 24aee74..4c34f71 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -5,6 +5,7 @@
 use Drupal\Core\Session\AccountInterface;
 use Drupal\entity\Entity\EntityDisplay;
 use Drupal\file\Entity\File;
+use Drupal\system\Entity\Action;
 use Drupal\user\Entity\User;
 use Drupal\user\UserInterface;
 use Drupal\user\RoleInterface;
@@ -1490,7 +1491,7 @@ function user_user_role_insert(RoleInterface $role) {
     return;
   }
 
-  $action = entity_create('action', array(
+  $action = Action::create(array(
     'id' => 'user_add_role_action.' . $role->id(),
     'type' => 'user',
     'label' => t('Add the @label role to the selected users', array('@label' => $role->label())),
@@ -1500,7 +1501,7 @@ function user_user_role_insert(RoleInterface $role) {
     'plugin' => 'user_add_role_action',
   ));
   $action->save();
-  $action = entity_create('action', array(
+  $action = Action::create(array(
     'id' => 'user_remove_role_action.' . $role->id(),
     'type' => 'user',
     'label' => t('Remove the @label role from the selected users', array('@label' => $role->label())),
