diff --git a/panelizer.module b/panelizer.module
index 2672b1b..2049b16 100644
--- a/panelizer.module
+++ b/panelizer.module
@@ -4,10 +4,11 @@
  * Hook implementations for the Panelizer module.
  */
 
-use \Drupal\Core\Entity\FieldableEntityInterface;
-use \Drupal\Core\Entity\RevisionableInterface;
-use \Drupal\Core\Form\FormStateInterface;
-use \Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant;
+use Drupal\Core\Entity\FieldableEntityInterface;
+use Drupal\Core\Entity\RevisionableInterface;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Url;
+use Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant;
 
 /**
  * Implements hook_theme().
@@ -162,9 +163,11 @@ function panelizer_form_entity_view_display_edit_form_alter(&$form, FormStateInt
       '#tree' => TRUE,
     ];
     $form['panelizer']['enable'] = [
-      '#type' => 'checkbox',
       '#title' => t('Panelize this view mode'),
-      '#default_value' => !empty($settings['enable']),
+      '#type' => 'link',
+      '#url' => Url::fromRoute('panelizer.wizard', [
+        'machine_name' => $display->getTargetEntityTypeId() . '__' . $display->getTargetBundle() . '__' . $display->getMode(),
+      ]),
     ];
     $form['panelizer']['custom'] = [
       '#type' => 'checkbox',
diff --git a/panelizer.routing.yml b/panelizer.routing.yml
index feac328..acf8e36 100644
--- a/panelizer.routing.yml
+++ b/panelizer.routing.yml
@@ -12,3 +12,32 @@ panelizer.panels_ipe.revert_to_default:
     _method: 'POST'
     _permission: 'access panels in-place editing'
     _custom_access: '\Drupal\panelizer\Controller\PanelizerPanelsIPEController::accessRevertToDefault'
+
+# Wizard
+panelizer.wizard:
+  path: '/admin/panelizer/wizard/{machine_name}'
+  defaults:
+    _wizard: '\Drupal\panelizer\Wizard\PanelizerWizard'
+    _title: 'Panelizer Wizard'
+    tempstore_id: 'panelizer.wizard'
+  requirements:
+    _access: 'TRUE'
+
+panelizer.wizard.step:
+  path: '/admin/panelizer/wizard/{machine_name}/{step}'
+  defaults:
+    _wizard: '\Drupal\panelizer\Wizard\PanelizerWizard'
+    _title: 'Panelizer Wizard'
+    tempstore_id: 'panelizer.wizard'
+  requirements:
+    _access: 'TRUE'
+
+# Contexts
+panelizer.wizard.step.context.add:
+  path: '/admin/panelizer/wizard/{machine_name}/contexts/add/{context_id}'
+  defaults:
+    _form: '\Drupal\panelizer\Form\PanelizerWizardContextConfigure'
+    _title: 'Add custom context'
+    tempstore_id: 'panelizer.wizard'
+  requirements:
+    _permission: 'administer pages'
diff --git a/src/Form/PanelizerWizardContextConfigure.php b/src/Form/PanelizerWizardContextConfigure.php
new file mode 100644
index 0000000..d297498
--- /dev/null
+++ b/src/Form/PanelizerWizardContextConfigure.php
@@ -0,0 +1,63 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\panelizer\Form\PanelizerWizardContextConfigure.
+ */
+
+namespace Drupal\panelizer\Form;
+
+use Drupal\Core\Plugin\Context\ContextInterface;
+use Drupal\ctools\Form\ContextConfigure;
+
+class PanelizerWizardContextConfigure extends ContextConfigure {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getParentRouteInfo($cached_values) {
+    return ['panelizer.wizard.step', [
+      'machine_name' => $cached_values['machine_name'],
+      'step' => 'contexts',
+    ]];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getContexts($cached_values) {
+    return $cached_values['contexts'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function addContext($cached_values, $context_id, ContextInterface $context) {
+    $context_config = [
+      'label' => $context->getContextDefinition()->getLabel(),
+      'type' => $context->getContextDefinition()->getDataType(),
+      'description' => $context->getContextDefinition()->getDescription(),
+      'value' => strpos($context->getContextDefinition()->getDataType(), 'entity:') === 0 ? $context->getContextValue()->uuid() : $context->getContextValue(),
+    ];
+    $cached_values['contexts'][$context_id] = $context_config;
+    return $cached_values;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function contextExists($value, $element, $form_state) {
+    return FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function disableMachineName($cached_values, $machine_name) {
+    if ($machine_name) {
+      return !empty($cached_values['contexts'][$machine_name]);
+    }
+    return FALSE;
+  }
+
+}
diff --git a/src/Form/PanelizerWizardContextForm.php b/src/Form/PanelizerWizardContextForm.php
new file mode 100644
index 0000000..2046049
--- /dev/null
+++ b/src/Form/PanelizerWizardContextForm.php
@@ -0,0 +1,114 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\panelizer\Form\PanelizerWizardContextForm.
+ */
+
+namespace Drupal\panelizer\Form;
+
+use Drupal\Core\Form\FormBase;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\ctools\Form\ManageContext;
+
+/**
+ * Simple wizard step form.
+ */
+class PanelizerWizardContextForm extends ManageContext {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $relationships = FALSE;
+
+  /**
+   * Returns a unique string identifying the form.
+   *
+   * @return string
+   *   The unique string identifying the form.
+   */
+  public function getFormId() {
+    return 'panelizer_wizard_context_form';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getContextClass($cached_values) {
+    return PanelizerWizardContextConfigure::class;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getRelationshipClass($cached_values) {}
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getContextAddRoute($cached_values) {
+    return 'panelizer.wizard.step.context.add';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getRelationshipAddRoute($cached_values) {
+    return 'panelizer.wizard.step.context.add';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getContexts($cached_values) {
+    if (!isset($cached_values['contexts'])) {
+      $cached_values['contexts'] = [];
+    }
+
+    return $this->getContextMapper()->getContextValues($cached_values['contexts']);
+  }
+
+  /**
+   * Wraps the context mapper.
+   *
+   * @return \Drupal\page_manager\ContextMapperInterface
+   */
+  protected function getContextMapper() {
+    return \Drupal::service('page_manager.context_mapper');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getTempstoreId() {
+    return 'panelizer.wizard.contexts';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getContextOperationsRouteInfo($cached_values, $machine_name, $row) {
+    return ['panelizer.wizard.step.context.add', [
+      'machine_name' => $machine_name,
+      'context_id' => $row,
+    ]];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getRelationshipOperationsRouteInfo($cached_values, $machine_name, $row) {
+    return ['panelizer.wizard.step.context.add', [
+      'machine_name' => $machine_name,
+      'context_id' => $row,
+    ]];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function isEditableContext($cached_values, $row) {
+    return !empty($cached_values['contexts'][$row]);
+  }
+
+}
diff --git a/src/Form/PanelizerWizardGeneralForm.php b/src/Form/PanelizerWizardGeneralForm.php
new file mode 100644
index 0000000..0835246
--- /dev/null
+++ b/src/Form/PanelizerWizardGeneralForm.php
@@ -0,0 +1,78 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\panelizer\Form\PanelizerWizardGeneralForm.
+ */
+
+namespace Drupal\panelizer\Form;
+
+
+use Drupal\Core\Form\FormBase;
+use Drupal\Core\Form\FormStateInterface;
+
+/**
+ * General settings for a panelized bundle.
+ */
+class PanelizerWizardGeneralForm extends FormBase {
+
+  /**
+   * The SharedTempStore key for our current wizard values.
+   *
+   * @var string|NULL
+   */
+  protected $machine_name;
+
+  /**
+   * Returns a unique string identifying the form.
+   *
+   * @return string
+   *   The unique string identifying the form.
+   */
+  public function getFormId() {
+    return 'panelizer_wizard_general_form';
+  }
+
+  /**
+   * Form constructor.
+   *
+   * @param array $form
+   *   An associative array containing the structure of the form.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current state of the form.
+   *
+   * @return array
+   *   The form structure.
+   */
+  public function buildForm(array $form, FormStateInterface $form_state, $machine_name = NULL) {
+    $cached_values = $form_state->getTemporaryValue('wizard');
+
+    $form['custom'] = [
+      '#type' => 'checkbox',
+      '#title' => t('Allow custom overrides of each entity'),
+      '#default_value' => !empty($cached_values['one']) ? $cached_values['one'] : FALSE,
+    ];
+
+    return $form;
+  }
+
+  /**
+   * Form submission handler.
+   *
+   * @param array $form
+   *   An associative array containing the structure of the form.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current state of the form.
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    $keys = array(
+      'custom',
+    );
+    $cached_values = $form_state->getTemporaryValue('wizard');
+    foreach ($keys as $key) {
+      $cached_values[$key] = $form_state->getValue($key);
+    }
+    $form_state->setTemporaryValue('wizard', $cached_values);
+  }
+
+}
diff --git a/src/Wizard/PanelizerWizard.php b/src/Wizard/PanelizerWizard.php
new file mode 100644
index 0000000..888168d
--- /dev/null
+++ b/src/Wizard/PanelizerWizard.php
@@ -0,0 +1,72 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\panelizer\Wizard\PanelizerWizard.
+ */
+
+namespace Drupal\panelizer\Wizard;
+
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\ctools\Wizard\FormWizardBase;
+
+class PanelizerWizard extends FormWizardBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getWizardLabel() {
+    return $this->t('Wizard Information');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getMachineLabel() {
+    return $this->t('Wizard Test Name');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getOperations($cached_values) {
+    return array(
+      'general' => [
+        'form' => 'Drupal\panelizer\Form\PanelizerWizardGeneralForm',
+        'title' => $this->t('General settings'),
+      ],
+      'contexts' => [
+        'form' => 'Drupal\panelizer\Form\PanelizerWizardContextForm',
+        'title' => $this->t('Contexts'),
+      ],
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getRouteName() {
+    return 'panelizer.wizard.step';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, FormStateInterface $form_state) {
+    $form = parent::buildForm($form, $form_state);
+    $cached_values = $form_state->getTemporaryValue('wizard');
+    $cached_values['id'] = $this->getMachineName();
+    $form_state->setTemporaryValue('wizard', $cached_values);
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function finish(array &$form, FormStateInterface $form_state) {
+    $cached_values = $form_state->getTemporaryValue('wizard');
+    parent::finish($form, $form_state);
+  }
+
+}
