diff --git a/page_manager.services.yml b/page_manager.services.yml
index 37a83bd..c4c7217 100644
--- a/page_manager.services.yml
+++ b/page_manager.services.yml
@@ -32,3 +32,9 @@ services:
     tags:
       - { name: event_subscriber }
     arguments: ['@current_route_match']
+  page_manager.panels_storage:
+    class: Drupal\page_manager\PanelsStorage
+    arguments: ['@entity_type.manager']
+    tags:
+      - { name: panels_storage, storage_type: page_manager }
+    public: false
diff --git a/src/Form/PageVariantAddForm.php b/src/Form/PageVariantAddForm.php
index 7f692ab..804730d 100644
--- a/src/Form/PageVariantAddForm.php
+++ b/src/Form/PageVariantAddForm.php
@@ -24,6 +24,17 @@ class PageVariantAddForm extends PageVariantFormBase {
   /**
    * {@inheritdoc}
    */
+  protected function getVariantPlugin() {
+    $variant_plugin = parent::getVariantPlugin();
+    // Before showing the add form, we need to set the Panels storage
+    // information so that it knows to give the user the IPE as an option.
+    $this->setPanelsStorage($variant_plugin);
+    return $variant_plugin;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function save(array $form, FormStateInterface $form_state) {
     parent::save($form, $form_state);
     $form_state->setRedirectUrl($this->getEntity()->toUrl('edit-form'));
diff --git a/src/Form/PageVariantFormBase.php b/src/Form/PageVariantFormBase.php
index 09961a8..59f3232 100644
--- a/src/Form/PageVariantFormBase.php
+++ b/src/Form/PageVariantFormBase.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\page_manager\Form;
 
+use Drupal\Core\Display\VariantInterface;
 use Drupal\Core\Entity\EntityForm;
 use Drupal\Core\Entity\Query\QueryFactory;
 use Drupal\Core\Form\FormState;
@@ -156,13 +157,26 @@ abstract class PageVariantFormBase extends EntityForm {
     // Allow the variant to submit the form.
     $variant_plugin_values = (new FormState())->setValues($form_state->getValue('variant_settings'));
     $this->getVariantPlugin()->submitConfigurationForm($form, $variant_plugin_values);
+    // Make sure the Panels storage is set correctly before saving!
+    $this->setPanelsStorage($this->getVariantPlugin());
     // Update the original form values.
     $form_state->setValue('variant_settings', $variant_plugin_values->getValues());
-
     parent::submitForm($form, $form_state);
   }
 
   /**
+   * Set Panels storage information on the variant, if it's a Panels variant.
+   *
+   * @param \Drupal\Core\Display\VariantInterface $variant_plugin
+   */
+  protected function setPanelsStorage(VariantInterface $variant_plugin) {
+    if (is_a($variant_plugin, '\Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant', TRUE)) {
+      /** @var $variant_plugin \Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant */
+      $variant_plugin->setStorage('page_manager', $this->entity->id());
+    }
+  }
+
+  /**
    * Gets the variant plugin for this page variant entity.
    *
    * @return \Drupal\Core\Display\VariantInterface
diff --git a/src/PanelsStorage.php b/src/PanelsStorage.php
new file mode 100644
index 0000000..4124296
--- /dev/null
+++ b/src/PanelsStorage.php
@@ -0,0 +1,99 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\page_manager\PanelsStorage
+ */
+
+namespace Drupal\page_manager;
+
+use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant;
+use Drupal\panels\Storage\PanelsStorageInterface;
+
+/**
+ * A Panels storage service that stores Panels displays in Page Manager.
+ */
+class PanelsStorage implements PanelsStorageInterface {
+
+  /**
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * Constructs a PanelsStorage.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manager.
+   */
+  public function __construct(EntityTypeManagerInterface $entity_type_manager) {
+    $this->entityTypeManager = $entity_type_manager;
+  }
+
+  /**
+   * Load a page variant entity.
+   *
+   * @param string $id
+   *   The page variant entity's id.
+   *
+   * @return \Drupal\page_manager\PageVariantInterface
+   */
+  protected function loadPageVariant($id) {
+    return $this->entityTypeManager->getStorage('page_variant')->load($id);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function save(PanelsDisplayVariant $panels_display) {
+    $id = $panels_display->getStorageId();
+    if ($id && ($page_variant = $this->loadPageVariant($id))) {
+      $variant_plugin = $page_variant->getVariantPlugin();
+      if (!($variant_plugin instanceof PanelsDisplayVariant)) {
+        throw new \Exception("Page variant doesn't use a Panels display variant");
+      }
+      $variant_plugin->setConfiguration($panels_display->getConfiguration());
+      $page_variant->save();
+    }
+    else {
+      throw new \Exception("Couuldn't find page variant to store Panels display");
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function load($id) {
+    if ($page_variant = $this->loadPageVariant($id)) {
+      /** @var \Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant $panels_display */
+      $panels_display = $page_variant->getVariantPlugin();
+
+      // If this page variant doesn't have a Panels display on it, then we treat
+      // it the same as if there was no such page variant.
+      if (!($panels_display instanceof PanelsDisplayVariant)) {
+        return;
+      }
+
+      // Pass down the contexts because the display has no other way to get them
+      // from the variant.
+      $panels_display->setContexts($page_variant->getContexts());
+
+      return $panels_display;
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function access($id, $op, AccountInterface $account) {
+    if ($page_variant = $this->loadPageVariant($id)) {
+      return $page_variant->access($op, $account, TRUE);
+    }
+
+    return AccessResult::forbidden();
+  }
+
+}
\ No newline at end of file
