diff --git a/core/modules/edit/edit.module b/core/modules/edit/edit.module
index 6a73d89..5ac9e44 100644
--- a/core/modules/edit/edit.module
+++ b/core/modules/edit/edit.module
@@ -14,6 +14,7 @@
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\edit\Form\EditFieldForm;
 use Drupal\Component\Utility\NestedArray;
+use Drupal\user\TempStoreFactory;
 
 /**
  * Implements hook_custom_theme().
@@ -173,7 +174,7 @@ function edit_preprocess_block(&$variables) {
  *
  * @ingroup forms
  */
-function edit_field_form(array $form, array &$form_state, EntityInterface $entity, $field_name) {
+function edit_field_form(array $form, array &$form_state, EntityInterface $entity, $field_name, TempStoreFactory $temp_store_factory) {
   $form_handler = new EditFieldForm();
-  return $form_handler->build($form, $form_state, $entity, $field_name);
+  return $form_handler->build($form, $form_state, $entity, $field_name, $temp_store_factory);
 }
diff --git a/core/modules/edit/edit.routing.yml b/core/modules/edit/edit.routing.yml
index d66881d..ff2d1a5 100644
--- a/core/modules/edit/edit.routing.yml
+++ b/core/modules/edit/edit.routing.yml
@@ -12,3 +12,12 @@ edit_field_form:
   requirements:
     _permission: 'access in-place editing'
     _access_edit_entity_field: 'TRUE'
+
+
+edit_entity_save:
+  pattern: '/edit/entity/{entity_type}/{entity}'
+  defaults:
+    _controller: '\Drupal\edit\EditController::entitySave'
+  requirements:
+    _permission: 'access in-place editing'
+    _access_edit_entity: 'TRUE'
diff --git a/core/modules/edit/edit.services.yml b/core/modules/edit/edit.services.yml
index 91c37b1..2552f579 100644
--- a/core/modules/edit/edit.services.yml
+++ b/core/modules/edit/edit.services.yml
@@ -6,6 +6,10 @@ services:
     class: Drupal\edit\Access\EditEntityFieldAccessCheck
     tags:
       - { name: access_check }
+  access_check.edit.entity:
+    class: Drupal\edit\Access\EditEntityAccessCheck
+    tags:
+      - { name: access_check }
   edit.editor.selector:
     class: Drupal\edit\EditorSelector
     arguments: ['@plugin.manager.edit.editor']
diff --git a/core/modules/edit/lib/Drupal/edit/Access/EditEntityAccessCheck.php b/core/modules/edit/lib/Drupal/edit/Access/EditEntityAccessCheck.php
new file mode 100644
index 0000000..9dfbfd1
--- /dev/null
+++ b/core/modules/edit/lib/Drupal/edit/Access/EditEntityAccessCheck.php
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\edit\Access\EditEntityAccessCheck.
+ */
+
+namespace Drupal\edit\Access;
+
+use Drupal\Core\Access\AccessCheckInterface;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+use Drupal\Core\Entity\EntityInterface;
+
+/**
+ * Access check for editing entities.
+ */
+class EditEntityAccessCheck implements AccessCheckInterface, EditEntityAccessCheckInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function applies(Route $route) {
+    // @see edit.routing.yml
+    return array_key_exists('_access_edit_entity', $route->getRequirements());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function access(Route $route, Request $request) {
+    // @todo Request argument validation and object loading should happen
+    //   elsewhere in the request processing pipeline:
+    //   http://drupal.org/node/1798214.
+    $this->validateAndUpcastRequestAttributes($request);
+
+    return $this->accessEditEntity($request->attributes->get('entity'));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function accessEditEntity(EntityInterface $entity) {
+    return $entity->access('update');
+  }
+
+  /**
+   * Validates and upcasts request attributes.
+   */
+  protected function validateAndUpcastRequestAttributes(Request $request) {
+    // Load the entity.
+    if (!is_object($entity = $request->attributes->get('entity'))) {
+      $entity_id = $entity;
+      $entity_type = $request->attributes->get('entity_type');
+      if (!$entity_type || !entity_get_info($entity_type)) {
+        throw new NotFoundHttpException();
+      }
+      $entity = entity_load($entity_type, $entity_id);
+      if (!$entity) {
+        throw new NotFoundHttpException();
+      }
+      $request->attributes->set('entity', $entity);
+    }
+  }
+
+}
diff --git a/core/modules/edit/lib/Drupal/edit/Access/EditEntityAccessCheckInterface.php b/core/modules/edit/lib/Drupal/edit/Access/EditEntityAccessCheckInterface.php
new file mode 100644
index 0000000..5df39e1
--- /dev/null
+++ b/core/modules/edit/lib/Drupal/edit/Access/EditEntityAccessCheckInterface.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\edit\Access\EditEntityAccessCheckInterface.
+ */
+
+namespace Drupal\edit\Access;
+
+use Drupal\Core\Entity\EntityInterface;
+
+/**
+ * Access check for editing entities.
+ */
+interface EditEntityAccessCheckInterface {
+
+  /**
+   * Checks access to edit the requested entity.
+   */
+  public function accessEditEntity(EntityInterface $entity);
+
+}
diff --git a/core/modules/edit/lib/Drupal/edit/Access/EditEntityFieldAccessCheck.php b/core/modules/edit/lib/Drupal/edit/Access/EditEntityFieldAccessCheck.php
index f7f0c06..4d6a8a5 100644
--- a/core/modules/edit/lib/Drupal/edit/Access/EditEntityFieldAccessCheck.php
+++ b/core/modules/edit/lib/Drupal/edit/Access/EditEntityFieldAccessCheck.php
@@ -22,6 +22,7 @@ class EditEntityFieldAccessCheck implements AccessCheckInterface, EditEntityFiel
    * Implements AccessCheckInterface::applies().
    */
   public function applies(Route $route) {
+    // @see edit.routing.yml
     return array_key_exists('_access_edit_entity_field', $route->getRequirements());
   }
 
diff --git a/core/modules/edit/lib/Drupal/edit/Ajax/EntitySavedCommand.php b/core/modules/edit/lib/Drupal/edit/Ajax/EntitySavedCommand.php
new file mode 100644
index 0000000..6b6cc59
--- /dev/null
+++ b/core/modules/edit/lib/Drupal/edit/Ajax/EntitySavedCommand.php
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\edit\Ajax\EntitySavedCommand.
+ */
+
+namespace Drupal\edit\Ajax;
+
+use Drupal\Core\Ajax\CommandInterface;
+
+/**
+ * AJAX command to indicate the entity was loaded from TempStore and saved into
+ * the database.
+ */
+class EntitySavedCommand extends BaseCommand {
+
+  /**
+   * Constructs a EntitySaveCommand object.
+   *
+   * @param string $data
+   *   The data to pass on to the client side.
+   */
+  public function __construct($data) {
+    parent::__construct('editEntitySaved', $data);
+  }
+
+}
diff --git a/core/modules/edit/lib/Drupal/edit/Ajax/FieldFormSavedCommand.php b/core/modules/edit/lib/Drupal/edit/Ajax/FieldFormSavedCommand.php
index bdee56e..2e89c19 100644
--- a/core/modules/edit/lib/Drupal/edit/Ajax/FieldFormSavedCommand.php
+++ b/core/modules/edit/lib/Drupal/edit/Ajax/FieldFormSavedCommand.php
@@ -10,8 +10,8 @@
 use Drupal\Core\Ajax\CommandInterface;
 
 /**
- * AJAX command to indicate a field form was saved without validation errors and
- * pass the rerendered field to Edit's JavaScript app.
+ * AJAX command to indicate a field was saved into TempStore without validation
+ * errors and pass the rerendered field to Edit's JavaScript app.
  */
 class FieldFormSavedCommand extends BaseCommand {
 
diff --git a/core/modules/edit/lib/Drupal/edit/EditController.php b/core/modules/edit/lib/Drupal/edit/EditController.php
index f64665b..c943ecc 100644
--- a/core/modules/edit/lib/Drupal/edit/EditController.php
+++ b/core/modules/edit/lib/Drupal/edit/EditController.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\edit;
 
+use Drupal;
 use Symfony\Component\DependencyInjection\ContainerAware;
 use Symfony\Component\HttpFoundation\JsonResponse;
 use Symfony\Component\HttpFoundation\Request;
@@ -16,7 +17,9 @@
 use Drupal\edit\Ajax\FieldFormCommand;
 use Drupal\edit\Ajax\FieldFormSavedCommand;
 use Drupal\edit\Ajax\FieldFormValidationErrorsCommand;
+use Drupal\edit\Ajax\EntitySavedCommand;
 use Drupal\edit\Ajax\MetadataCommand;
+use Drupal\user\TempStoreFactory;
 
 /**
  * Returns responses for Edit module routes.
@@ -24,6 +27,23 @@
 class EditController extends ContainerAware {
 
   /**
+   * Stores the tempstore factory.
+   *
+   * @var \Drupal\user\TempStoreFactory
+   */
+  protected $tempStoreFactory;
+
+  /**
+   * Constructs a new EditController.
+   *
+   * @param \Drupal\user\TempStoreFactory $temp_store_factory
+   *   The factory for the temp store object.
+   */
+  public function __construct(TempStoreFactory $temp_store_factory = NULL) {
+    $this->tempStoreFactory = $temp_store_factory ?: Drupal::service('user.tempstore');
+  }
+
+  /**
    * Returns the metadata for a set of fields.
    *
    * Given a list of field edit IDs as POST parameters, run access checks on the
@@ -99,17 +119,27 @@ public function metadata(Request $request) {
   public function fieldForm(EntityInterface $entity, $field_name, $langcode, $view_mode) {
     $response = new AjaxResponse();
 
+    // Replace entity with tempstore copy if available and not resetting, init
+    // tempstore copy otherwise.
+    $tempstore_entity = $this->tempStoreFactory->get('edit')->get($entity->uuid());
+    if ($tempstore_entity && !(isset($_POST['reset']) && $_POST['reset'] === 'true')) {
+      $entity = $tempstore_entity;
+    }
+    else {
+      $this->tempStoreFactory->get('edit')->set($entity->uuid(), $entity);
+    }
+
     $form_state = array(
       'langcode' => $langcode,
       'no_redirect' => TRUE,
-      'build_info' => array('args' => array($entity, $field_name)),
+      'build_info' => array('args' => array($entity, $field_name, $this->tempStoreFactory)),
     );
     $form = drupal_build_form('edit_field_form', $form_state);
 
     if (!empty($form_state['executed'])) {
-      // The form submission took care of saving the updated entity. Return the
-      // updated view of the field.
-      $entity = entity_load($form_state['entity']->entityType(), $form_state['entity']->id(), TRUE);
+      // The form submission saved the entity in tempstore. Return the
+      // updated view of the field from the tempstore copy.
+      $entity = $this->tempStoreFactory->get('edit')->get($entity->uuid());
       // @todo Remove when http://drupal.org/node/1346214 is complete.
       $entity = $entity->getBCEntity();
       $output = field_view_field($entity, $field_name, $view_mode, $langcode);
@@ -134,4 +164,23 @@ public function fieldForm(EntityInterface $entity, $field_name, $langcode, $view
     return $response;
   }
 
+  /**
+   * Saves an entity into the database, from TempStore.
+   *
+   * @param \Drupal\Core\Entity\EntityInterface $entity
+   *   The entity being edited.
+   */
+  public function entitySave(EntityInterface $entity) {
+    // Take the entity from tempstore and save in entity storage. fieldForm()
+    // ensures that the tempstore copy exists ahead.
+    $tempstore = $this->tempStoreFactory->get('edit');
+    $tempstore->get($entity->uuid())->save();
+    $tempstore->delete($entity->uuid());
+
+    // Respond to client that the entity was saved properly.
+    $response = new AjaxResponse();
+    $response->addCommand(new EntitySavedCommand($output));
+    return $response;
+  }
+
 }
diff --git a/core/modules/edit/lib/Drupal/edit/Form/EditFieldForm.php b/core/modules/edit/lib/Drupal/edit/Form/EditFieldForm.php
index 3a0da13..908e638 100644
--- a/core/modules/edit/lib/Drupal/edit/Form/EditFieldForm.php
+++ b/core/modules/edit/lib/Drupal/edit/Form/EditFieldForm.php
@@ -7,7 +7,9 @@
 
 namespace Drupal\edit\Form;
 
+use Drupal;
 use Drupal\Core\Entity\EntityInterface;
+use Drupal\user\TempStoreFactory;
 
 /**
  * Builds and process a form for editing a single entity field.
@@ -15,12 +17,20 @@
 class EditFieldForm {
 
   /**
+   * Stores the tempstore factory.
+   *
+   * @var \Drupal\user\TempStoreFactory
+   */
+  protected $tempStoreFactory;
+
+  /**
    * Builds a form for a single entity field.
    */
-  public function build(array $form, array &$form_state, EntityInterface $entity, $field_name) {
+  public function build(array $form, array &$form_state, EntityInterface $entity, $field_name, TempStoreFactory $temp_store_factory) {
     if (!isset($form_state['entity'])) {
       $this->init($form_state, $entity, $field_name);
     }
+    $this->tempStoreFactory = $temp_store_factory;
 
     // Add the field form.
     field_attach_form($form_state['entity'], $form, $form_state, $form_state['langcode'], array('field_name' =>  $form_state['field_name']));
@@ -74,7 +84,9 @@ public function validate(array $form, array &$form_state) {
    */
   public function submit(array $form, array &$form_state) {
     $form_state['entity'] = $this->buildEntity($form, $form_state);
-    $form_state['entity']->save();
+
+    // Store entity in tempstore with its UUID as tempstore key.
+    $this->tempStoreFactory->get('edit')->set($form_state['entity']->uuid(), $form_state['entity']);
   }
 
   /**
