diff --git a/docs/config-management.md b/docs/config-management.md
index 038dafd211569b8ef2a8b0601766637a02ac5b9d..0e0bc3c96218a9fb6702bcef22151a4d164fa567 100644
--- a/docs/config-management.md
+++ b/docs/config-management.md
@@ -208,6 +208,7 @@ overrides the "Published" (saved) version on certain routes, thanks to a conditi
 See:
 - `\Drupal\experience_builder\Entity\PageRegion`
 - `\Drupal\experience_builder\Plugin\DisplayVariant\XbPageVariant`
+- `\Drupal\experience_builder\Controller\XbBlockListController`
 
 Multiple `PageRegion config entities` may be created per Drupal theme: one per region, except the `content` region. This allows using XB instead of the Block module's
 "Block Layout" functionality (at `/admin/structure/block`) to populate the `theme region`s of the Drupal theme's
@@ -225,7 +226,8 @@ XB's product requirements [`37. Revisionable templates`](https://docs.google.com
 and [`55. Workspaces`](https://docs.google.com/spreadsheets/d/1OpETAzprh6DWjpTsZG55LWgldWV_D8jNe9AM73jNaZo/edit?gid=1721130122#gid=1721130122&range=B62).
 
 Once a theme has >=1 XB _enabled_ `PageRegion config entity`, then the block layout (if any) is not used, and XB's
-`PageVariantInterface` implementation is used instead.
+`PageVariantInterface` implementation is used instead. The Ambitious Site Builder is informed about this on the block
+listing UI.
 
 That means that when this is used, the Block module is in principle unnecessary. However, Drupal admin themes typically
 rely on the Block module to provide the intended administrative User Experience, which makes that impractical.
diff --git a/experience_builder.services.yml b/experience_builder.services.yml
index 8d5853af66257a5c841d1e4092960f95914fa4f7..7eb47b07f60031ae62e7c7d7352915d134926149 100644
--- a/experience_builder.services.yml
+++ b/experience_builder.services.yml
@@ -88,6 +88,7 @@ services:
   Drupal\experience_builder\PathProcessor\ExperienceBuilderPathProcessor:
     tags:
       - { name: path_processor_inbound, priority: 200 }
+  Drupal\experience_builder\Controller\XbBlockListController: ~
 
   # Routing.
   Drupal\experience_builder\Entity\Routing\XbHtmlRouteEnhancer:
diff --git a/src/Controller/XbBlockListController.php b/src/Controller/XbBlockListController.php
new file mode 100644
index 0000000000000000000000000000000000000000..1c9dfb1b59c5be94c2bd036e71c576c92817017a
--- /dev/null
+++ b/src/Controller/XbBlockListController.php
@@ -0,0 +1,109 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\experience_builder\Controller;
+
+use Drupal\block\Controller\BlockListController;
+use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Extension\ThemeHandlerInterface;
+use Drupal\Core\Routing\RouteBuildEvent;
+use Drupal\Core\Routing\RoutingEvents;
+use Drupal\Core\Url;
+use Drupal\Core\Link;
+use Drupal\Core\Messenger\MessengerInterface;
+use Drupal\experience_builder\Entity\PageRegion;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Show warning message in Block UI when using Experience Builder's PageRegions.
+ *
+ * @see \Drupal\experience_builder\EventSubscriber\XbBlockListingRouteSubscriber
+ */
+final class XbBlockListController extends BlockListController implements EventSubscriberInterface {
+
+  /**
+   * Constructs a new XbBlockListController.
+   *
+   * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory
+   *   The config factory.
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager
+   *   The entity type manager.
+   * @param \Drupal\Core\Messenger\MessengerInterface $messenger
+   *   The messenger service.
+   * @param \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler
+   *   The theme handler.
+   */
+  public function __construct(
+    ConfigFactoryInterface $configFactory,
+    EntityTypeManagerInterface $entityTypeManager,
+    MessengerInterface $messenger,
+    ThemeHandlerInterface $theme_handler,
+  ) {
+    parent::__construct($theme_handler);
+    $this->configFactory = $configFactory;
+    $this->entityTypeManager = $entityTypeManager;
+    $this->messenger = $messenger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new self(
+      $container->get(ConfigFactoryInterface::class),
+      $container->get(EntityTypeManagerInterface::class),
+      $container->get(MessengerInterface::class),
+      $container->get(ThemeHandlerInterface::class),
+    );
+  }
+
+  /**
+   * Overrides the block listing.
+   *
+   * @param string|null $theme
+   *   (Optional) The theme name.
+   * @param \Symfony\Component\HttpFoundation\Request|null $request
+   *   (Optional) The request object.
+   *
+   * @return array
+   *   A renderable array for the block listing.
+   */
+  public function listing($theme = NULL, ?Request $request = NULL): array {
+    $build = parent::listing($theme, $request);
+    assert(is_array($build));
+
+    // Load the editable page regions for the current default theme.
+    $theme = $theme ?? $this->configFactory->get('system.theme')->get('default');
+    $regions = $this->entityTypeManager->getStorage(PageRegion::PLUGIN_ID)->loadByProperties(['theme' => $theme]);
+    if (!empty($regions)) {
+      $theme_settings_url = Url::fromRoute('system.theme_settings_theme', ['theme' => $theme]);
+      $link = Link::fromTextAndUrl($this->t('theme'), $theme_settings_url)->toString();
+      $this->messenger->addWarning($this->t('This form currently has no effect because the @link has been configured to use Experience Builder for managing the block layout.', ['@link' => $link]));
+    }
+
+    return $build;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getSubscribedEvents(): array {
+    $events[RoutingEvents::ALTER] = 'onAlterRoutes';
+    return $events;
+  }
+
+  public function onAlterRoutes(RouteBuildEvent $event): void {
+    $collection = $event->getRouteCollection();
+    if ($route = $collection->get('block.admin_display')) {
+      $route->setDefault('_controller', static::class . '::listing');
+    }
+    if ($route = $collection->get('block.admin_display_theme')) {
+      $route->setDefault('_controller', static::class . '::listing');
+    }
+  }
+
+}
diff --git a/tests/src/Functional/XbPageVariantEnableTest.php b/tests/src/Functional/XbPageVariantEnableTest.php
index a1fd3888f2dd31eb555ccadabef6598eafb9846a..3ffc16a0b548bc7eddaa75addb5b84aadc10e1c5 100644
--- a/tests/src/Functional/XbPageVariantEnableTest.php
+++ b/tests/src/Functional/XbPageVariantEnableTest.php
@@ -15,6 +15,7 @@ use Drupal\Tests\experience_builder\Traits\GenerateComponentConfigTrait;
  * @group experience_builder
  * @covers \experience_builder_form_system_theme_settings_alter()
  * @covers \experience_builder_form_system_theme_settings_submit()
+ * @covers \Drupal\experience_builder\Controller\XbBlockListController
  * @covers \Drupal\experience_builder\Entity\PageRegion::createFromBlockLayout()
  */
 class XbPageVariantEnableTest extends BrowserTestBase {
@@ -32,6 +33,8 @@ class XbPageVariantEnableTest extends BrowserTestBase {
   protected $defaultTheme = 'olivero';
 
   public function test(): void {
+    $assert = $this->assertSession();
+
     $this->drupalLogin($this->rootUser);
     $this->generateComponentConfig();
 
@@ -48,14 +51,22 @@ class XbPageVariantEnableTest extends BrowserTestBase {
     // We start with no templates.
     $this->assertEmpty(PageRegion::loadMultiple());
 
-    // No template is created if we do not enable XB.
+    // No template is created if we do not enable XB; no warning messages on
+    // block listing.
     $this->submitForm(['use_xb' => FALSE], 'Save configuration');
     $this->assertEmpty(PageRegion::loadMultiple());
+    $this->drupalGet('/admin/structure/block');
+    $assert->elementsCount('css', '[aria-label="Warning message"]', 0);
 
-    // Regions are created when we enable XB.
+    // Regions are created when we enable XB; warning message appears on block
+    // listing.
+    $this->drupalGet('/admin/appearance/settings/olivero');
     $this->submitForm(['use_xb' => TRUE], 'Save configuration');
     $regions = PageRegion::loadMultiple();
     $this->assertCount(12, $regions);
+    $this->drupalGet('/admin/structure/block');
+    $assert->elementsCount('css', '[aria-label="Warning message"]', 1);
+    $assert->elementTextContains('css', '[aria-label="Warning message"] .messages__content', 'configured to use Experience Builder for managing the block layout');
 
     // Check the regions are created correctly.
     $expected_page_region_ids = \array_filter([