diff --git a/core/lib/Drupal/Core/Wizard/WizardFormController.php b/core/lib/Drupal/Core/Wizard/WizardFormController.php
new file mode 100644
index 0000000..65c8f54
--- /dev/null
+++ b/core/lib/Drupal/Core/Wizard/WizardFormController.php
@@ -0,0 +1,130 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\Core\Wizard.
+ */
+
+namespace Drupal\Core\Wizard;
+
+use Drupal\Core\Entity\EntityFormController;
+use Drupal\Core\Entity\EntityInterface;
+
+/**
+ * Form controller for the Views edit form.
+ */
+class WizardFormController extends EntityFormController {
+
+  protected $entity_info;
+
+  protected function init(array &$form_state, EntityInterface $entity) {
+    parent::init($form_state, $entity);
+    $this->entity_info = $entity->entityInfo();
+  }
+
+  /**
+   * Overrides Drupal\Core\Entity\EntityFormController::actions().
+   *
+   * Digs through the entity definition's steps to determine if previous or
+   * next steps exist in order to display the appropriate buttons and text on
+   * those buttons.
+   */
+  protected function actions(array $form, array &$form_state) {
+    $actions = parent::actions($form, $form_state);
+    $entity = $this->buildEntity($form, $form_state += array('values' => array()));
+    $this->entity_info = $entity->entityInfo();
+    // Get the steps of the wizard from the entity definition.
+    $steps = array_keys($this->entity_info['steps']);
+    // Slice to find the operations that occur before the current operation.
+    $before = array_slice($this->entity_info['steps'], 0, array_search($this->getOperation(), $steps));
+    // Slice to find the operations that occur after the current operation.
+    $after = array_slice($this->entity_info['steps'], array_search($this->getOperation(), $steps) + 1);
+
+    // If there are steps after this one, label the button "Next" otherwise
+    // label it "Finish".
+    if ($after) {
+      $actions['submit']['#value'] = t('Next');
+    }
+    else {
+      $actions['submit']['#value'] = t('Finish');
+      $actions['submit']['#submit'][] = array($this, 'finish');
+    }
+
+    // If there are steps before this one, label the button "previous"
+    // otherwise do not display a button.
+    if ($before) {
+      $actions['previous'] = array(
+        '#value' => t('Previous'),
+        '#submit' => array(
+          array($this, 'previous'),
+        ),
+        '#limit_validation_errors' => array(),
+        '#weight' => -10,
+      );
+    }
+
+    return $actions;
+  }
+
+  /**
+   * Overrides Drupal\Core\Entity\EntityFormController::submit().
+   *
+   * Instead of saving the entity at each step, we populate a tempstore with
+   * the entity for the next step.
+   */
+  public function submit(array $form, array &$form_state) {
+    if ($form_state['values']['op'] == 'Next') {
+      $entity = $this->buildEntity($form, $form_state);
+      drupal_container()->get('user.tempstore')->get($entity->entityType())->set($entity->id(), $entity);
+      // Get the steps by key.
+      $steps = array_keys($this->entity_info['steps']);
+      // Get the steps after the current step.
+      $after = array_slice($this->entity_info['steps'], array_search($this->getOperation(), $steps) + 1);
+      // Get the steps after the current step by key.
+      $after = array_keys($after);
+
+      $form_state['redirect'] = 'admin/config/system/conditions/' . $entity->id() . '/' . $after[0];
+    }
+  }
+
+  /**
+   * Form submission handler for the 'previous' action.
+   *
+   * This method finds the previous step and redirects us to it.
+   *
+   * @param array $form
+   *   An associative array containing the structure of the form.
+   * @param array $form_state
+   *   A reference to a keyed array containing the current state of the form.
+   */
+  public function previous(array $form, array &$form_state) {
+    $entity = $this->buildEntity($form, $form_state);
+    // Get the steps by key.
+    $steps = array_keys($this->entity_info['steps']);
+    // Get the steps before the current step.
+    $before = array_slice($this->entity_info['steps'], 0, array_search($this->getOperation(), $steps));
+    // Get the steps before the current step by key.
+    $before = array_keys($before);
+    // Reverse the steps for easy access to the next step.
+    $before = array_reverse($before);
+
+    $form_state['redirect'] = 'admin/config/system/conditions/' . $entity->id() . '/' . $before[0];
+  }
+
+  /**
+   * Form submission handler for the 'previous' action.
+   *
+   * Retrieves the entity, saves it and deletes the values in the tempstore.
+   *
+   * @param array $form
+   *   An associative array containing the structure of the form.
+   * @param array $form_state
+   *   A reference to a keyed array containing the current state of the form.
+   */
+  public function finish(array $form, array &$form_state) {
+    $entity = parent::submit($form, $form_state);
+    $entity->save();
+    drupal_container()->get('user.tempstore')->get($entity->entityType())->delete($entity->id());
+    $form_state['redirect'] = 'admin/config/system/conditions';
+  }
+}
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 60cd4e0..6434f9e 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -1147,6 +1147,41 @@ function system_plugin_ui_access($plugin, $facet = NULL) {
   return $plugin_ui->access($facet);
 }
 
+
+/**
+ * Provides a generic wrapper for multi page entity wizard forms.
+ *
+ * @param $entity_type
+ *   The type of entity we are working with. This will be used for
+ *   entity_create() calls as well as unique storage within tempstore.
+ * @param $step
+ *   The current step in the form wizard process.
+ * @param $id
+ *   The unique identifier of the entity the form wizard is building.
+ *
+ * @return array
+ *   The renderable array from the current step of the entity's available form
+ *   controllers.
+ */
+function system_wizard_form($entity_type, $step, $id = NULL) {
+  if (empty($id)) {
+    $entity = entity_create($entity_type, array());
+  }
+  else {
+    $entity = drupal_container()->get('user.tempstore')->get($entity_type)->get($id);
+    if (!method_exists($entity, 'entityType')) {
+      $entity = entity_load($entity_type, $id);
+    }
+  }
+  $definition = $entity->entityInfo();
+  // This could be any entity form controller and is not necessarily documented
+  // in the steps. If it is not in the steps, it will not have a title.
+  if (isset($definition['steps'][$step])) {
+    drupal_set_title($definition['steps'][$step]);
+  }
+  return entity_get_form($entity, $step);
+}
+
 /**
  * Implements hook_forms().
  */
