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 872ff06..3a489ef 100644
--- a/panels_ipe/src/Controller/PanelsIPEPageController.php
+++ b/panels_ipe/src/Controller/PanelsIPEPageController.php
@@ -117,7 +117,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->getTempStoreId())) {
+    $key = $this->getTempStoreId($panels_display);
+    if ($variant_config = $this->tempStore->get($key)) {
       $panels_display->setConfiguration($variant_config);
     }
 
@@ -140,7 +141,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->getTempStoreId();
+    $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 8d8a8b9..9a9d89c 100644
--- a/panels_ipe/src/Form/PanelsIPEBlockPluginForm.php
+++ b/panels_ipe/src/Form/PanelsIPEBlockPluginForm.php
@@ -14,6 +14,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;
 
@@ -28,6 +29,7 @@ class PanelsIPEBlockPluginForm extends FormBase {
   use ContextAwarePluginAssignmentTrait;
 
   use PanelsIPEBlockRendererTrait;
+  use TempStoreTrait;
 
   /**
    * @var \Drupal\Component\Plugin\PluginManagerInterface $blockManager
@@ -261,7 +263,7 @@ class PanelsIPEBlockPluginForm extends FormBase {
     }
 
     // If a temporary configuration for this variant exists, use it.
-    $temp_store_key = $this->panelsDisplay->getTempStoreId();
+    $temp_store_key = $this->getTempStoreId($this->panelsDisplay);
     if ($variant_config = $this->tempStore->get($temp_store_key)) {
       $this->panelsDisplay->setConfiguration($variant_config);
     }
@@ -284,7 +286,7 @@ class PanelsIPEBlockPluginForm extends FormBase {
     }
 
     // Set the tempstore value.
-    $this->tempStore->set($this->panelsDisplay->getTempStoreId(), $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);
@@ -377,7 +379,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->getTempStoreId();
+      $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 274816f..234c914 100644
--- a/panels_ipe/src/Form/PanelsIPELayoutForm.php
+++ b/panels_ipe/src/Form/PanelsIPELayoutForm.php
@@ -11,6 +11,7 @@ use Drupal\Core\Plugin\PluginFormInterface;
 use Drupal\Core\Render\Element;
 use Drupal\Core\Render\RendererInterface;
 use Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant;
+use Drupal\panels_ipe\TempStoreTrait;
 use Drupal\user\SharedTempStoreFactory;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -19,6 +20,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->getTempStoreId(), $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 90031a0..5732504 100644
--- a/panels_ipe/src/Helpers/RequestHandlerBase.php
+++ b/panels_ipe/src/Helpers/RequestHandlerBase.php
@@ -8,6 +8,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;
 
@@ -15,6 +16,8 @@ abstract class RequestHandlerBase implements RequestHandlerInterface {
 
   /**
    * @var int */
+
+  use TempStoreTrait;
   private $responseStatusCode = 200;
 
   /**
@@ -113,7 +116,8 @@ abstract class RequestHandlerBase implements RequestHandlerInterface {
    * @throws \Drupal\user\TempStoreException
    */
   protected function savePanelsDisplayToTempStore(PanelsDisplayVariant $panels_display) {
-    $this->tempStore->set($panels_display->getTempStoreId(), $panels_display->getConfiguration());
+    $key = $this->getTempStoreId($panels_display);
+    $this->tempStore->set($key, $panels_display->getConfiguration());
   }
 
   /**
@@ -124,7 +128,8 @@ abstract class RequestHandlerBase implements RequestHandlerInterface {
    * @throws \Drupal\user\TempStoreException
    */
   protected function deletePanelsDisplayTempStore(PanelsDisplayVariant $panels_display) {
-    $this->tempStore->delete($panels_display->getTempStoreId());
+    $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 920e692..b190cc9 100644
--- a/panels_ipe/src/Plugin/DisplayBuilder/InPlaceEditorDisplayBuilder.php
+++ b/panels_ipe/src/Plugin/DisplayBuilder/InPlaceEditorDisplayBuilder.php
@@ -10,6 +10,7 @@ use Drupal\Core\Session\AccountInterface;
 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;
 
@@ -24,6 +25,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.
@@ -169,7 +172,7 @@ class InPlaceEditorDisplayBuilder extends StandardDisplayBuilder {
       $locked = FALSE;
 
       // If a temporary configuration for this variant exists, use it.
-      $temp_store_key = $panels_display->getTempStoreId();
+      $temp_store_key = $this->getTempStoreId($panels_display);
       $lock_info = $this->tempStore->getMetadata($temp_store_key);
       if ($lock_info) {
         if ($lock_info->owner === $this->account->id()) {
diff --git a/panels_ipe/src/TempStoreTrait.php b/panels_ipe/src/TempStoreTrait.php
new file mode 100644
index 0000000..32bc751
--- /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->getTempStoreId();
+    $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/src/Plugin/DisplayVariant/PanelsDisplayVariant.php b/src/Plugin/DisplayVariant/PanelsDisplayVariant.php
index 08b5ffb..0888184 100644
--- a/src/Plugin/DisplayVariant/PanelsDisplayVariant.php
+++ b/src/Plugin/DisplayVariant/PanelsDisplayVariant.php
@@ -524,7 +524,7 @@ class PanelsDisplayVariant extends BlockDisplayVariant implements PluginWizardIn
         $id = array_merge($id, $context->getCacheTags());
       }
     }
-    return implode(':', $id);
+    return implode(':', $id));
   }
 
 }
diff --git a/tests/src/Unit/panels_ipe/RequestHandlerTestBase.php b/tests/src/Unit/panels_ipe/RequestHandlerTestBase.php
index 5f7de8c..271392e 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;
@@ -18,6 +19,8 @@ abstract class RequestHandlerTestBase extends \PHPUnit_Framework_TestCase {
 
   /**
    * @var  \Drupal\panels_ipe\Helpers\RequestHandlerInterface */
+
+  use RandomGeneratorTrait;
   protected $sut;
 
   /**
@@ -43,13 +46,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) {
