diff --git a/panels_ipe/panels_ipe.api.php b/panels_ipe/panels_ipe.api.php
index bda971b..6980c37 100644
--- a/panels_ipe/panels_ipe.api.php
+++ b/panels_ipe/panels_ipe.api.php
@@ -41,3 +41,18 @@ function hook_panels_ipe_blocks_alter(array &$blocks = array()) {
     }
   }
 }
+
+/**
+ * Modify the list of layouts available through the IPE interface.
+ *
+ * @param array $layouts
+ *   The layouts that are currently available.
+ */
+function hook_panels_ipe_layouts_alter(array &$layouts = array()) {
+  // Only show layouts that are in the 'threecol' category.
+  foreach ($layouts as $key => $layout) {
+    if ($layout['category'] !== 'threecol') {
+      unset($layout[$key]);
+    }
+  }
+}
diff --git a/panels_ipe/src/Controller/PanelsIPEPageController.php b/panels_ipe/src/Controller/PanelsIPEPageController.php
index 924ce51..ccb7763 100644
--- a/panels_ipe/src/Controller/PanelsIPEPageController.php
+++ b/panels_ipe/src/Controller/PanelsIPEPageController.php
@@ -170,12 +170,12 @@ public function getLayouts($panels_storage_type, $panels_storage_id) {
     $current_layout_id = $panels_display->getLayout()->getPluginId();
 
     // Get a list of all available layouts.
-    $layouts = $this->layoutPluginManager->getDefinitions();
+    $definitions = $this->layoutPluginManager->getDefinitions();
     $base_path = base_path();
-    $data = [];
-    foreach ($layouts as $id => $layout) {
+    $layouts = [];
+    foreach ($definitions as $id => $layout) {
       $icon = !empty($layout['icon']) ? $layout['icon'] : drupal_get_path('module', 'panels') . '/images/no-layout-preview.png';
-      $data[] = [
+      $layouts[] = [
         'id' => $id,
         'label' => $layout['label'],
         'icon' => $base_path . $icon,
@@ -184,8 +184,16 @@ public function getLayouts($panels_storage_type, $panels_storage_id) {
       ];
     }
 
+    // Trigger hook_panels_ipe_layouts_alter(). Allows other modules to change
+    // the list of layouts that are visible.
+    \Drupal::moduleHandler()->alter('panels_ipe_layouts', $layouts);
+
+    // Reindex the blocks after they were altered in case one of them was
+    // removed.
+    $blocks = array_values($blocks);
+
     // Return a structured JSON response for our Backbone App.
-    return new JsonResponse($data);
+    return new JsonResponse($layouts);
   }
 
   /**
