diff --git a/core/modules/entity/lib/Drupal/entity/Tests/EntityFormTest.php b/core/modules/entity/lib/Drupal/entity/Tests/EntityFormTest.php
new file mode 100644
index 0000000..3950c81
--- /dev/null
+++ b/core/modules/entity/lib/Drupal/entity/Tests/EntityFormTest.php
@@ -0,0 +1,79 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\entity\Tests\EntityFormTest.
+ */
+
+namespace Drupal\entity\Tests;
+
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Tests the Entity Form Controller.
+ */
+class EntityFormTest extends WebTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('entity', 'entity_test', 'language');
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Entity form',
+      'description' => 'Tests the entity form controller.',
+      'group' => 'Entity API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    $web_user = $this->drupalCreateUser(array('administer entity_test content'));
+    $this->drupalLogin($web_user);
+  }
+
+  /**
+   * Tests basic form CRUD functionality.
+   */
+  function testFormCRUD() {
+    $langcode = LANGUAGE_NOT_SPECIFIED;
+    $name1 = $this->randomName(8);
+    $name2 = $this->randomName(8);
+
+    $edit = array(
+      'name' => $name1,
+      'uid' => mt_rand(0, 128),
+      "field_test_text[$langcode][0][value]" => $this->randomName(16),
+    );
+
+    $this->drupalPost('entity-test/add', $edit, t('Save'));
+    $entity = $this->loadEntityByName($name1);
+    $this->assertTrue($entity, t('Entity found in the database.'));
+
+    $edit['name'] = $name2;
+    $this->drupalPost('entity-test/manage/' . $entity->id() . '/edit', $edit, t('Save'));
+    $entity = $this->loadEntityByName($name1);
+    $this->assertFalse($entity, 'The entity has been modified.');
+    $entity = $this->loadEntityByName($name2);
+    $this->assertTrue($entity, 'Modified entity found in the database.');
+    $this->assertNotEqual($entity->get('name'), $name1, 'The entity name has been modified.');
+
+    $this->drupalPost('entity-test/manage/' . $entity->id() . '/edit', array(), t('Delete'));
+    $entity = $this->loadEntityByName($name2);
+    $this->assertFalse($entity, t('Entity not found in the database.'));
+  }
+
+  /**
+   * Loads a test entity by name always resetting the storage controller cache.
+   */
+  protected function loadEntityByName($name) {
+    $entity_type = 'entity_test';
+    // Always load the entity from the database to ensure that changes are
+    // correctly picked up.
+    entity_get_controller($entity_type)->resetCache();
+    return current(entity_load_multiple_by_properties($entity_type, array('name' => $name)));
+  }
+}
diff --git a/core/modules/entity/tests/modules/entity_test/entity_test.module b/core/modules/entity/tests/modules/entity_test/entity_test.module
index 9b1b224..292ce67 100644
--- a/core/modules/entity/tests/modules/entity_test/entity_test.module
+++ b/core/modules/entity/tests/modules/entity_test/entity_test.module
@@ -13,6 +13,9 @@ function entity_test_entity_info() {
     'label' => t('Test entity'),
     'entity class' => 'Drupal\entity_test\EntityTest',
     'controller class' => 'Drupal\entity_test\EntityTestStorageController',
+    'form controller class' => array(
+      'default' => 'Drupal\entity_test\EntityTestFormController',
+    ),
     'base table' => 'entity_test',
     'fieldable' => TRUE,
     'entity keys' => array(
@@ -28,6 +31,60 @@ function entity_test_entity_info() {
 }
 
 /**
+ * Implements hook_permission().
+ */
+function entity_test_permission() {
+  $permissions = array(
+    'administer entity_test content' => array(
+      'title' => t('Administer entity_test content'),
+      'description' => t('Manage entity_test content'),
+    ),
+  );
+  return $permissions;
+}
+
+/**
+ * Implements hook_menu().
+ */
+function entity_test_menu() {
+  $items = array();
+
+  $items['entity-test/add'] = array(
+    'title' => 'Add an entity_test',
+    'page callback' => 'entity_test_add',
+    'access arguments' => array('administer entity_test content'),
+    'type' => MENU_NORMAL_ITEM,
+  );
+
+  $items['entity-test/manage/%entity_test/edit'] = array(
+    'title' => 'Edit test entity',
+    'page callback' => 'entity_test_edit',
+    'page arguments' => array(2),
+    'access arguments' => array('administer entity_test content'),
+    'type' => MENU_NORMAL_ITEM,
+  );
+
+  return $items;
+}
+
+/**
+ * Menu callback: displays the 'Add new entity_test' form.
+ */
+function entity_test_add() {
+  drupal_set_title(t('Create an entity_test'));
+  $entity = entity_create('entity_test', array());
+  return entity_get_form($entity);
+}
+
+/**
+ * Menu callback: displays the 'Edit existing entity_test' form.
+ */
+function entity_test_edit($entity) {
+  drupal_set_title(t('entity_test @id', array('@id' => $entity->id)), PASS_THROUGH);
+  return entity_get_form($entity);
+}
+
+/**
  * Loads a test entity.
  *
  * @param int $id
diff --git a/core/modules/entity/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestFormController.php b/core/modules/entity/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestFormController.php
new file mode 100644
index 0000000..94667b1
--- /dev/null
+++ b/core/modules/entity/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestFormController.php
@@ -0,0 +1,94 @@
+<?php
+/**
+ * @file
+ * Definition of Drupal\field_test\EntityTestFormController.
+ */
+
+namespace Drupal\entity_test;
+
+use Drupal\entity\EntityInterface;
+use Drupal\entity\EntityFormController;
+
+/**
+ * Form controller for the test entity edit forms.
+ */
+class EntityTestFormController extends EntityFormController {
+
+  /**
+   * Overrides Drupal\entity\EntityFormController::form().
+   */
+  public function form(array $form, array &$form_state, EntityInterface $entity) {
+    $form = parent::form($form, $form_state, $entity);
+
+    $langcode = $this->getFormLangcode($form_state);
+    $name = $entity->get('name', $langcode);
+    $uid = $entity->get('uid', $langcode);
+
+    $form['name'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Name'),
+      '#default_value' => !empty($name) ? $name : '',
+      '#size' => 60,
+      '#maxlength' => 128,
+      '#required' => TRUE,
+      '#weight' => -10,
+    );
+
+    $form['uid'] = array(
+      '#type' => 'textfield',
+      '#title' => 'UID',
+      '#default_value' => !empty($uid) ? $uid : '',
+      '#size' => 60,
+      '#maxlength' => 128,
+      '#required' => TRUE,
+      '#weight' => -10,
+    );
+
+    return $form;
+  }
+
+  /**
+   * Overrides Drupal\entity\EntityFormController::submit().
+   */
+  public function submit(array $form, array &$form_state) {
+    $entity = parent::submit($form, $form_state);
+    $langcode = $this->getFormLangcode($form_state);
+
+    // Updates multilingual properties.
+    foreach (array('name', 'uid') as $property) {
+      $entity->set($property, $form_state['values'][$property], $langcode);
+    }
+
+    return $entity;
+  }
+
+  /**
+   * Overrides Drupal\entity\EntityFormController::save().
+   */
+  public function save(array $form, array &$form_state) {
+    $entity = $this->getEntity($form_state);
+    $entity->save();
+
+    $message = $entity->isNew() ? t('entity_test @id has been created.', array('@id' => $entity->id())) : t('entity_test @id has been updated.', array('@id' => $entity->id()));
+    drupal_set_message($message);
+
+    if ($entity->id()) {
+      $form_state['redirect'] = 'entity-test/manage/' . $entity->id() . '/edit';
+    }
+    else {
+      // Error on save.
+      drupal_set_message(t('The entity could not be saved.'), 'error');
+      $form_state['rebuild'] = TRUE;
+    }
+  }
+
+  /**
+   * Overrides Drupal\entity\EntityFormController::delete().
+   */
+  public function delete(array $form, array &$form_state) {
+    $entity = $this->getEntity($form_state);
+    $entity->delete();
+    drupal_set_message(t('entity_test @id has been deleted.', array('@id' => $entity->id())));
+    $form_state['redirect'] = '<front>';
+  }
+}
