diff --git a/panels_ipe/panels_ipe.api.php b/panels_ipe/panels_ipe.api.php
index 2a356bb..ed88e5d 100644
--- a/panels_ipe/panels_ipe.api.php
+++ b/panels_ipe/panels_ipe.api.php
@@ -26,3 +26,22 @@ function hook_panels_ipe_panels_display_presave(PanelsDisplayVariant $panels_dis
     $panels_display->setStorage('custom_storage_key', $configuration['storage_id']);
   }
 }
+
+/**
+ * Change the tempstore ID used by Panels IPE.
+ *
+ * Changes made to a Panels display using the IPE are stored in a shared
+ * temporary storage object (tempstore) until the display either saved or
+ * reverted to its previous state. This hook allows one to specify a different
+ * key for storing changes in the tempstore.
+ *
+ * @param string $id
+ *   The tempstore ID, passed by reference.
+ * @param \Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant $panels_display
+ *   The Panels display for which the tempstore ID will be used.
+ */
+function hook_panels_ipe_tempstore_id_alter(&$id, PanelsDisplayVariant $panels_display) {
+  if ($panels_display->getBuilder()->getPluginId() == 'panelizer') {
+    $id = 'panelizer';
+  }
+}
diff --git a/panels_ipe/src/Controller/PanelsIPEPageController.php b/panels_ipe/src/Controller/PanelsIPEPageController.php
index 5558155..09fb3ea 100644
--- a/panels_ipe/src/Controller/PanelsIPEPageController.php
+++ b/panels_ipe/src/Controller/PanelsIPEPageController.php
@@ -19,6 +19,7 @@ use Drupal\panels\Storage\PanelsStorageManagerInterface;
 use Drupal\panels_ipe\Helpers\RemoveBlockRequestHandler;
 use Drupal\panels_ipe\Helpers\UpdateLayoutRequestHandler;
 use Drupal\panels_ipe\PanelsIPEBlockRendererTrait;
+use Drupal\panels_ipe\TempStoreTrait;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
@@ -33,6 +34,7 @@ use Drupal\user\SharedTempStoreFactory;
 class PanelsIPEPageController extends ControllerBase {
 
   use PanelsIPEBlockRendererTrait;
+  use TempStoreTrait;
 
   /**
    * @var \Drupal\Core\Block\BlockManagerInterface
@@ -122,7 +124,8 @@ class PanelsIPEPageController extends ControllerBase {
     $panels_display = $this->panelsStorage->load($panels_storage_type, $panels_storage_id);
 
     // If a temporary configuration for this variant exists, use it.
-    if ($variant_config = $this->tempStore->get($panels_display->id())) {
+    $key = $this->getTempStoreId($panels_display);
+    if ($variant_config = $this->tempStore->get($key)) {
       $panels_display->setConfiguration($variant_config);
     }
 
@@ -145,7 +148,7 @@ class PanelsIPEPageController extends ControllerBase {
     $panels_display = $this->loadPanelsDisplay($panels_storage_type, $panels_storage_id);
 
     // If a temporary configuration for this variant exists, use it.
-    $temp_store_key = $panels_display->id();
+    $temp_store_key = $this->getTempStoreId($panels_display);
     if ($variant_config = $this->tempStore->get($temp_store_key)) {
       $this->tempStore->delete($temp_store_key);
     }
diff --git a/panels_ipe/src/Form/PanelsIPEBlockPluginForm.php b/panels_ipe/src/Form/PanelsIPEBlockPluginForm.php
index cfa87d2..379031c 100644
--- a/panels_ipe/src/Form/PanelsIPEBlockPluginForm.php
+++ b/panels_ipe/src/Form/PanelsIPEBlockPluginForm.php
@@ -19,6 +19,7 @@ use Drupal\Core\Render\Element;
 use Drupal\Core\Render\RendererInterface;
 use Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant;
 use Drupal\panels_ipe\PanelsIPEBlockRendererTrait;
+use Drupal\panels_ipe\TempStoreTrait;
 use Drupal\user\SharedTempStoreFactory;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -33,6 +34,7 @@ class PanelsIPEBlockPluginForm extends FormBase {
   use ContextAwarePluginAssignmentTrait;
 
   use PanelsIPEBlockRendererTrait;
+  use TempStoreTrait;
 
   /**
    * @var \Drupal\Component\Plugin\PluginManagerInterface $blockManager
@@ -262,7 +264,7 @@ class PanelsIPEBlockPluginForm extends FormBase {
     }
 
     // If a temporary configuration for this variant exists, use it.
-    $temp_store_key = $this->panelsDisplay->id();
+    $temp_store_key = $this->getTempStoreId($this->panelsDisplay);
     if ($variant_config = $this->tempStore->get($temp_store_key)) {
       $this->panelsDisplay->setConfiguration($variant_config);
     }
@@ -285,7 +287,7 @@ class PanelsIPEBlockPluginForm extends FormBase {
     }
 
     // Set the tempstore value.
-    $this->tempStore->set($this->panelsDisplay->id(), $this->panelsDisplay->getConfiguration());
+    $this->tempStore->set($temp_store_key, $this->panelsDisplay->getConfiguration());
 
     // Assemble data required for our App.
     $build = $this->buildBlockInstance($block_instance, $this->panelsDisplay);
@@ -374,7 +376,7 @@ class PanelsIPEBlockPluginForm extends FormBase {
     // If a UUID is provided, the Block should already exist.
     if ($uuid = $form_state->getValue('uuid')) {
       // If a temporary configuration for this variant exists, use it.
-      $temp_store_key = $this->panelsDisplay->id();
+      $temp_store_key = $this->getTempStoreId($this->panelsDisplay);
       if ($variant_config = $this->tempStore->get($temp_store_key)) {
         $this->panelsDisplay->setConfiguration($variant_config);
       }
diff --git a/panels_ipe/src/Form/PanelsIPELayoutForm.php b/panels_ipe/src/Form/PanelsIPELayoutForm.php
index f67de59..97b705a 100644
--- a/panels_ipe/src/Form/PanelsIPELayoutForm.php
+++ b/panels_ipe/src/Form/PanelsIPELayoutForm.php
@@ -15,6 +15,7 @@ use Drupal\Core\Render\Element;
 use Drupal\Core\Render\RendererInterface;
 use Drupal\layout_plugin\Plugin\Layout\LayoutPluginManagerInterface;
 use Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant;
+use Drupal\panels_ipe\TempStoreTrait;
 use Drupal\user\SharedTempStoreFactory;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -24,6 +25,8 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
  */
 class PanelsIPELayoutForm extends FormBase {
 
+  use TempStoreTrait;
+
   /**
    * @var \Drupal\Core\Render\RendererInterface $renderer
    */
@@ -202,7 +205,8 @@ class PanelsIPELayoutForm extends FormBase {
     $this->panelsDisplay->setLayout($this->layout, $layout_config);
 
     // Update tempstore.
-    $this->tempStore->set($panels_display->id(), $panels_display->getConfiguration());
+    $temp_store_key = $this->getTempStoreId($panels_display);
+    $this->tempStore->set($temp_store_key, $panels_display->getConfiguration());
 
     $region_data = [];
     $region_content = [];
diff --git a/panels_ipe/src/Helpers/RequestHandlerBase.php b/panels_ipe/src/Helpers/RequestHandlerBase.php
index 4b04a5b..c9f2167 100644
--- a/panels_ipe/src/Helpers/RequestHandlerBase.php
+++ b/panels_ipe/src/Helpers/RequestHandlerBase.php
@@ -7,12 +7,15 @@ use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant;
 use Drupal\panels\Storage\PanelsStorageManagerInterface;
 use Drupal\panels_ipe\Exception\EmptyRequestContentException;
+use Drupal\panels_ipe\TempStoreTrait;
 use Drupal\user\SharedTempStore;
 use Symfony\Component\HttpFoundation\JsonResponse;
 use Symfony\Component\HttpFoundation\Request;
 
 abstract class RequestHandlerBase implements RequestHandlerInterface {
 
+  use TempStoreTrait;
+
   /** @var int */
   private $responseStatusCode = 200;
 
@@ -107,7 +110,8 @@ abstract class RequestHandlerBase implements RequestHandlerInterface {
    * @throws \Drupal\user\TempStoreException
    */
   protected function savePanelsDisplayToTempStore(PanelsDisplayVariant $panels_display) {
-    $this->tempStore->set($panels_display->id(), $panels_display->getConfiguration());
+    $key = $this->getTempStoreId($panels_display);
+    $this->tempStore->set($key, $panels_display->getConfiguration());
   }
 
   /**
@@ -117,7 +121,8 @@ abstract class RequestHandlerBase implements RequestHandlerInterface {
    * @throws \Drupal\user\TempStoreException
    */
   protected function deletePanelsDisplayTempStore(PanelsDisplayVariant $panels_display) {
-    $this->tempStore->delete($panels_display->id());
+    $key = $this->getTempStoreId($panels_display);
+    $this->tempStore->delete($key);
   }
 
   /**
diff --git a/panels_ipe/src/Plugin/DisplayBuilder/InPlaceEditorDisplayBuilder.php b/panels_ipe/src/Plugin/DisplayBuilder/InPlaceEditorDisplayBuilder.php
index 8d8bf39..eb711eb 100644
--- a/panels_ipe/src/Plugin/DisplayBuilder/InPlaceEditorDisplayBuilder.php
+++ b/panels_ipe/src/Plugin/DisplayBuilder/InPlaceEditorDisplayBuilder.php
@@ -15,6 +15,7 @@ use Drupal\layout_plugin\Plugin\Layout\LayoutInterface;
 use Drupal\panels\Plugin\DisplayBuilder\StandardDisplayBuilder;
 use Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant;
 use Drupal\panels\Storage\PanelsStorageManagerInterface;
+use Drupal\panels_ipe\TempStoreTrait;
 use Drupal\user\SharedTempStoreFactory;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -29,6 +30,8 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
  */
 class InPlaceEditorDisplayBuilder extends StandardDisplayBuilder {
 
+  use TempStoreTrait;
+
   /**
    * @var \Drupal\user\SharedTempStore
    */
@@ -142,7 +145,7 @@ class InPlaceEditorDisplayBuilder extends StandardDisplayBuilder {
     $settings['panels_display'] = [
       'storage_type' => $storage_type,
       'storage_id' => $storage_id,
-      'id' => $panels_display->id(),
+      'id' => $this->getTempStoreId($panels_display),
     ];
 
     // Inform the App of our saved state.
@@ -164,7 +167,7 @@ class InPlaceEditorDisplayBuilder extends StandardDisplayBuilder {
       $unsaved = FALSE;
 
       // If a temporary configuration for this variant exists, use it.
-      $temp_store_key = $panels_display->id();
+      $temp_store_key = $this->getTempStoreId($panels_display);
       if ($variant_config = $this->tempStore->get($temp_store_key)) {
         unset($variant_config['id']);
         $panels_display->setConfiguration($variant_config);
diff --git a/panels_ipe/src/TempStoreTrait.php b/panels_ipe/src/TempStoreTrait.php
new file mode 100644
index 0000000..f64b7a8
--- /dev/null
+++ b/panels_ipe/src/TempStoreTrait.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Drupal\panels_ipe;
+
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant;
+
+/**
+ * A trait for getting the tempstore ID of a Panels IPE display.
+ */
+trait TempStoreTrait {
+
+  /**
+   * Returns the tempstore ID of a Panels IPE display.
+   *
+   * Modules will be allowed to alter the ID via
+   * hook_panels_ipe_tempstore_id_alter().
+   *
+   * @param \Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant $panels_display
+   *   The Panels display.
+   *
+   * @return string
+   *   The tempstore ID to use. Defaults to the display ID.
+   *
+   * @throws \UnexpectedValueException
+   *   If the tempstore ID is empty after being altered by modules.
+   */
+  protected function getTempStoreId(PanelsDisplayVariant $panels_display) {
+    $id = $panels_display->id();
+
+    // Get the module handler. We cannot define a $moduleHandler property in
+    // this trait, or we could get fatal errors if classes that use this trait
+    // have a $moduleHandler property of their own.
+    if (isset($this->moduleHandler) && $this->moduleHandler instanceof ModuleHandlerInterface) {
+      $module_handler = $this->moduleHandler;
+    }
+    else {
+      $module_handler = \Drupal::moduleHandler();
+    }
+
+    // Allow modules to alter the tempstore ID.
+    $module_handler
+      ->alter('panels_ipe_tempstore_id', $id, $panels_display);
+
+    if (empty($id)) {
+      throw new \UnexpectedValueException('Tempstore ID cannot be empty');
+    }
+    return $id;
+  }
+
+}
diff --git a/tests/src/Unit/panels_ipe/RequestHandlerTestBase.php b/tests/src/Unit/panels_ipe/RequestHandlerTestBase.php
index 7923e45..02a6f14 100644
--- a/tests/src/Unit/panels_ipe/RequestHandlerTestBase.php
+++ b/tests/src/Unit/panels_ipe/RequestHandlerTestBase.php
@@ -6,6 +6,7 @@ namespace Drupal\Tests\panels\Unit\panels_ipe;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant;
 use Drupal\panels\Storage\PanelsStorageManagerInterface;
+use Drupal\Tests\RandomGeneratorTrait;
 use Drupal\user\SharedTempStore;
 use PHPUnit_Framework_MockObject_MockObject;
 use Symfony\Component\HttpFoundation\JsonResponse;
@@ -16,6 +17,8 @@ use Symfony\Component\HttpFoundation\Request;
  */
 abstract class RequestHandlerTestBase extends \PHPUnit_Framework_TestCase {
 
+  use RandomGeneratorTrait;
+
   /** @var  \Drupal\panels_ipe\Helpers\RequestHandlerInterface */
   protected $sut;
 
@@ -35,13 +38,17 @@ abstract class RequestHandlerTestBase extends \PHPUnit_Framework_TestCase {
     parent::setUp();
     $this->moduleHandler = $this->getMockForAbstractClass(ModuleHandlerInterface::class);
     $this->panelsStore = $this->getMockForAbstractClass(PanelsStorageManagerInterface::class);
-    $this->tempStore = $this->getMockBuilder(SharedTempstore::class)
+    $this->tempStore = $this->getMockBuilder(SharedTempStore::class)
       ->disableOriginalConstructor()
       ->getMock();
 
     $this->panelsDisplay = $this->getMockBuilder(PanelsDisplayVariant::class)
       ->disableOriginalConstructor()
       ->getMock();
+
+    $this->panelsDisplay->method('id')->willReturn(
+      $this->randomMachineName(16)
+    );
   }
 
   protected function createRequest($content = NULL) {
