diff -u b/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderTest.php b/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderTest.php
--- b/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderTest.php
+++ b/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderTest.php
@@ -396,27 +396,57 @@
   }
 
   /**
-   * Tests the Messages block in the Layout Builder UI.
+   * {@inheritdoc}
+   *
+    $assert_session->linkNotExists('Add block');
+  }
+
+  /**
+   * Tests Messages block Layout Builder UI.
+   *
+   * See https://www.drupal.org/project/drupal/issues/3137995.
    */
   public function testMessagesBlock() {
     $assert_session = $this->assertSession();
     $page = $this->getSession()->getPage();
 
+    // Enable Layout Builder for the default view mode.
     $this->drupalGet('admin/structure/types/manage/bundle_with_section_field/display/default');
     $this->submitForm(['layout[enabled]' => TRUE], 'Save');
 
+    // Go to manage layout.
     $this->drupalGet("admin/structure/types/manage/bundle_with_section_field/display/default/layout");
+    // Turn off preview.
+    $page->uncheckField('layout-builder-content-preview');
+
+    // Add messages block to layout.
     $this->openAddBlockForm('Messages');
     $page->pressButton('Add block');
-
     $assert_session->assertWaitOnAjaxRequest();
+
+    // Part 1: Check for Messages placeholder text.
     $assert_session->elementTextContains('css', '.layout__region--content', '"Messages" block');
-  }
 
-  /**
-   * {@inheritdoc}
-   *
-    $assert_session->linkNotExists('Add block');
+    // Part 2: Make sure we can drag the block to a new section.
+    $this->clickLink('Add section');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->clickLink('Two column');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->pressButton('Add section');
+    $assert_session->assertWaitOnAjaxRequest();
+    // The Messages block does not have helpful classes so use data attribute.
+    $this->sortableTo("[data-layout-content-preview-placeholder-label*='Messages']", '.layout__region--content', '.layout__region--second');
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->elementTextNotContains('css', '.layout__region--content', '"Messages" block');
+    $assert_session->elementTextContains('css', '.layout__region--second', '"Messages" block');
+
+    // Part 3: Remove the Messages block.
+    $this->clickContextualLink('[data-layout-content-preview-placeholder-label*="Messages"]', 'Remove block');
+    $this->assertOffCanvasFormAfterWait('layout_builder_remove_block');
+    $page->pressButton('Remove');
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->assertNoElementAfterWait('css', '#drupal-off-canvas');
+    $assert_session->elementTextNotContains('css', '.layout__region--content', '"Messages" block');
   }
 
   /**
only in patch2:
unchanged:
--- a/core/modules/system/templates/block--system-messages-block.html.twig
+++ b/core/modules/system/templates/block--system-messages-block.html.twig
@@ -3,13 +3,46 @@
  * @file
  * Default theme implementation for the messages block.
  *
- * Removes wrapper elements from block so that empty block does not appear when
- * there are no messages.
+ * If in_preview is FALSE wrapper elements are removed from the block
+ * so that an empty block does not appear when there are no messages.
  *
  * Available variables:
+ * - plugin_id: The ID of the block implementation.
+ * - label: The configured label of the block if visible.
+ * - configuration: A list of the block's configuration values.
+ *   - label: The configured label for the block.
+ *   - label_display: The display settings for the label.
+ *   - provider: The module or other provider that provided this block plugin.
+ *   - Block plugin specific settings will also be stored here.
+ * - in_preview: Whether the plugin is being rendered in preview mode.
  * - content: The content of this block.
+ * - attributes: array of HTML attributes populated by modules, intended to
+ *   be added to the main container tag of this template.
+ *   - id: A valid HTML ID and guaranteed unique.
+ * - title_attributes: Same as attributes, except applied to the main title
+ *   tag that appears in the template.
+ * - content_attributes: Same as attributes, except applied to the main content
+ *   tag that appears in the template.
+ * - title_prefix: Additional output populated by modules, intended to be
+ *   displayed in front of the main title tag that appears in the template.
+ * - title_suffix: Additional output populated by modules, intended to be
+ *   displayed after the main title tag that appears in the template.
  *
  * @ingroup themeable
  */
 #}
-{{ content }}
+
+{% if in_preview %}
+  <div{{ attributes }}>
+    {{ title_prefix }}
+    {% if label %}
+      <h2{{ title_attributes }}>{{ label }}</h2>
+    {% endif %}
+    {{ title_suffix }}
+    {% block content %}
+      {{ content }}
+    {% endblock %}
+  </div>
+{% else %}
+  {{ content }}
+{% endif %}
only in patch2:
unchanged:
--- a/core/themes/stable9/templates/block/block--system-messages-block.html.twig
+++ b/core/themes/stable9/templates/block/block--system-messages-block.html.twig
@@ -3,11 +3,44 @@
  * @file
  * Theme override for the messages block.
  *
- * Removes wrapper elements from block so that empty block does not appear when
- * there are no messages.
+ * If in_preview is FALSE wrapper elements are removed from the block
+ * so that an empty block does not appear when there are no messages.
  *
  * Available variables:
+ * - plugin_id: The ID of the block implementation.
+ * - label: The configured label of the block if visible.
+ * - configuration: A list of the block's configuration values.
+ *   - label: The configured label for the block.
+ *   - label_display: The display settings for the label.
+ *   - provider: The module or other provider that provided this block plugin.
+ *   - Block plugin specific settings will also be stored here.
+ * - in_preview: Whether the plugin is being rendered in preview mode.
  * - content: The content of this block.
+ * - attributes: array of HTML attributes populated by modules, intended to
+ *   be added to the main container tag of this template.
+ *   - id: A valid HTML ID and guaranteed unique.
+ * - title_attributes: Same as attributes, except applied to the main title
+ *   tag that appears in the template.
+ * - content_attributes: Same as attributes, except applied to the main content
+ *   tag that appears in the template.
+ * - title_prefix: Additional output populated by modules, intended to be
+ *   displayed in front of the main title tag that appears in the template.
+ * - title_suffix: Additional output populated by modules, intended to be
+ *   displayed after the main title tag that appears in the template.
  */
 #}
-{{ content }}
+
+{% if in_preview %}
+  <div{{ attributes }}>
+    {{ title_prefix }}
+    {% if label %}
+      <h2{{ title_attributes }}>{{ label }}</h2>
+    {% endif %}
+    {{ title_suffix }}
+    {% block content %}
+      {{ content }}
+    {% endblock %}
+  </div>
+{% else %}
+  {{ content }}
+{% endif %}
