diff --git a/panels_ipe/panels_ipe.api.php b/panels_ipe/panels_ipe.api.php
index bda971b..df1a2b4 100644
--- a/panels_ipe/panels_ipe.api.php
+++ b/panels_ipe/panels_ipe.api.php
@@ -41,3 +41,22 @@ function hook_panels_ipe_blocks_alter(array &$blocks = array()) {
     }
   }
 }
+
+/**
+ * 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 924ce51..b7b938e 100644
--- a/panels_ipe/src/Controller/PanelsIPEPageController.php
+++ b/panels_ipe/src/Controller/PanelsIPEPageController.php
@@ -18,6 +18,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;
@@ -32,6 +33,7 @@ use Drupal\user\SharedTempStoreFactory;
 class PanelsIPEPageController extends ControllerBase {
 
   use PanelsIPEBlockRendererTrait;
+  use TempStoreTrait;
 
   /**
    * @var \Drupal\Core\Block\BlockManagerInterface
@@ -121,7 +123,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);
     }
 
@@ -144,7 +147,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 8735f2f..34c2dad 100644
--- a/panels_ipe/src/Form/PanelsIPEBlockPluginForm.php
+++ b/panels_ipe/src/Form/PanelsIPEBlockPluginForm.php
@@ -18,6 +18,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;
 
@@ -32,6 +33,7 @@ class PanelsIPEBlockPluginForm extends FormBase {
   use ContextAwarePluginAssignmentTrait;
 
   use PanelsIPEBlockRendererTrait;
+  use TempStoreTrait;
 
   /**
    * @var \Drupal\Component\Plugin\PluginManagerInterface $blockManager
@@ -265,7 +267,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);
     }
@@ -288,7 +290,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);
@@ -381,7 +383,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 b980b43..65b473c 100644
--- a/panels_ipe/src/Form/PanelsIPELayoutForm.php
+++ b/panels_ipe/src/Form/PanelsIPELayoutForm.php
@@ -14,6 +14,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;
 
@@ -22,6 +23,8 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
  */
 class PanelsIPELayoutForm extends FormBase {
 
+  use TempStoreTrait;
+
   /**
    * @var \Drupal\Core\Render\RendererInterface $renderer
    */
@@ -201,7 +204,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 3a80f06..54dea2a 100644
--- a/panels_ipe/src/Helpers/RequestHandlerBase.php
+++ b/panels_ipe/src/Helpers/RequestHandlerBase.php
@@ -12,6 +12,7 @@ use Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant;
 use Drupal\panels\Storage\PanelsStorageManagerInterface;
 use Drupal\panels_ipe\Exception\EmptyRequestContentException;
 use Drupal\user\SharedTempStore;
+use Drupal\panels_ipe\TempStoreTrait;
 use Symfony\Component\HttpFoundation\JsonResponse;
 use Symfony\Component\HttpFoundation\Request;
 
@@ -19,6 +20,8 @@ abstract class RequestHandlerBase implements RequestHandlerInterface {
 
   /**
    * @var int */
+
+  use TempStoreTrait;
   private $responseStatusCode = 200;
 
   /**
@@ -117,7 +120,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());
   }
 
   /**
@@ -128,7 +132,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 94da137..d3e90f2 100644
--- a/panels_ipe/src/Plugin/DisplayBuilder/InPlaceEditorDisplayBuilder.php
+++ b/panels_ipe/src/Plugin/DisplayBuilder/InPlaceEditorDisplayBuilder.php
@@ -14,6 +14,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;
 
@@ -28,6 +29,8 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
  */
 class InPlaceEditorDisplayBuilder extends StandardDisplayBuilder {
 
+  use TempStoreTrait;
+
   /**
    * @var \Drupal\user\SharedTempStore
    */
@@ -146,7 +149,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.
@@ -171,7 +174,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..ccc3f3a
--- /dev/null
+++ b/panels_ipe/src/TempStoreTrait.php
@@ -0,0 +1,57 @@
+<?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();
+    $modified_id = &drupal_static('panels_ipe_temp_store_id_' . $id);
+
+    if (!$modified_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);
+
+      $modified_id = $id;
+    }
+
+    if (empty($modified_id)) {
+      throw new \UnexpectedValueException('Tempstore ID cannot be empty');
+    }
+
+    return $modified_id;
+  }
+
+}
diff --git a/tests/src/Unit/panels_ipe/RequestHandlerTestBase.php b/tests/src/Unit/panels_ipe/RequestHandlerTestBase.php
index 53e1bd4..cc99ec4 100644
--- a/tests/src/Unit/panels_ipe/RequestHandlerTestBase.php
+++ b/tests/src/Unit/panels_ipe/RequestHandlerTestBase.php
@@ -10,6 +10,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;
@@ -22,6 +23,8 @@ abstract class RequestHandlerTestBase extends \PHPUnit_Framework_TestCase {
 
   /**
    * @var  \Drupal\panels_ipe\Helpers\RequestHandlerInterface */
+
+  use RandomGeneratorTrait;
   protected $sut;
 
   /**
@@ -47,13 +50,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) {
