diff --git a/core/modules/layout_builder/layout_builder.routing.yml b/core/modules/layout_builder/layout_builder.routing.yml
index b59e2a036d..9a9ff8c967 100644
--- a/core/modules/layout_builder/layout_builder.routing.yml
+++ b/core/modules/layout_builder/layout_builder.routing.yml
@@ -5,6 +5,7 @@ layout_builder.choose_section:
    _title: 'Choose a layout for this section'
   requirements:
     _layout_builder_access: 'view'
+    _layout_builder_lock_access: 'true'
   options:
     _admin_route: TRUE
     parameters:
@@ -17,6 +18,7 @@ layout_builder.add_section:
     _controller: '\Drupal\layout_builder\Controller\AddSectionController::build'
   requirements:
     _layout_builder_access: 'view'
+    _layout_builder_lock_access: 'true'
   options:
     _admin_route: TRUE
     parameters:
@@ -33,6 +35,7 @@ layout_builder.configure_section:
     plugin_id: null
   requirements:
     _layout_builder_access: 'view'
+    _layout_builder_lock_access: 'true'
   options:
     _admin_route: TRUE
     parameters:
@@ -45,6 +48,7 @@ layout_builder.remove_section:
     _form: '\Drupal\layout_builder\Form\RemoveSectionForm'
   requirements:
     _layout_builder_access: 'view'
+    _layout_builder_lock_access: 'true'
   options:
     _admin_route: TRUE
     parameters:
@@ -58,6 +62,7 @@ layout_builder.choose_block:
     _title: 'Choose a block'
   requirements:
     _layout_builder_access: 'view'
+    _layout_builder_lock_access: 'true'
   options:
     _admin_route: TRUE
     parameters:
@@ -71,6 +76,7 @@ layout_builder.add_block:
     _title: 'Configure block'
   requirements:
     _layout_builder_access: 'view'
+    _layout_builder_lock_access: 'true'
   options:
     _admin_route: TRUE
     parameters:
@@ -84,6 +90,7 @@ layout_builder.choose_inline_block:
     _title: 'Add a new Inline Block'
   requirements:
     _layout_builder_access: 'view'
+    _layout_builder_lock_access: 'true'
   options:
     _admin_route: TRUE
     parameters:
@@ -97,6 +104,7 @@ layout_builder.update_block:
     _title: 'Configure block'
   requirements:
     _layout_builder_access: 'view'
+    _layout_builder_lock_access: 'true'
   options:
     _admin_route: TRUE
     parameters:
@@ -110,6 +118,7 @@ layout_builder.move_block_form:
     _form: '\Drupal\layout_builder\Form\MoveBlockForm'
   requirements:
     _layout_builder_access: 'view'
+    _layout_builder_lock_access: 'true'
   options:
     _admin_route: TRUE
     parameters:
@@ -122,6 +131,7 @@ layout_builder.remove_block:
     _form: '\Drupal\layout_builder\Form\RemoveBlockForm'
   requirements:
     _layout_builder_access: 'view'
+    _layout_builder_lock_access: 'true'
   options:
     _admin_route: TRUE
     parameters:
@@ -140,6 +150,7 @@ layout_builder.move_block:
     preceding_block_uuid: null
   requirements:
     _layout_builder_access: 'view'
+    _layout_builder_lock_access: 'true'
   options:
     _admin_route: TRUE
     parameters:
diff --git a/core/modules/layout_builder/layout_builder.services.yml b/core/modules/layout_builder/layout_builder.services.yml
index 6e94ed74d2..abaafd9e0a 100644
--- a/core/modules/layout_builder/layout_builder.services.yml
+++ b/core/modules/layout_builder/layout_builder.services.yml
@@ -2,6 +2,11 @@ services:
   layout_builder.tempstore_repository:
     class: Drupal\layout_builder\LayoutTempstoreRepository
     arguments: ['@tempstore.shared']
+  access_check.entity.layout_builder_lock_access:
+    class: Drupal\layout_builder\Access\LayoutBuilderLockAccessCheck
+    arguments: ['@layout_builder.tempstore_repository']
+    tags:
+      - { name: access_check, applies_to: _layout_builder_lock_access }
   access_check.entity.layout_builder_access:
     class: Drupal\layout_builder\Access\LayoutBuilderAccessCheck
     tags:
diff --git a/core/modules/layout_builder/src/Access/LayoutBuilderLockAccessCheck.php b/core/modules/layout_builder/src/Access/LayoutBuilderLockAccessCheck.php
new file mode 100644
index 0000000000..7f8e8f403b
--- /dev/null
+++ b/core/modules/layout_builder/src/Access/LayoutBuilderLockAccessCheck.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace Drupal\layout_builder\Access;
+
+use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Routing\Access\AccessInterface;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\layout_builder\LayoutTempstoreRepositoryInterface;
+use Drupal\layout_builder\SectionStorageInterface;
+
+/**
+ * Checks access based on whether the layout is locked.
+ *
+ * @ingroup layout_builder_access
+ *
+ * @internal
+ *   Tagged services are internal.
+ */
+class LayoutBuilderLockAccessCheck implements AccessInterface {
+
+  /**
+   * The layout tempstore repository.
+   *
+   * @var \Drupal\layout_builder\LayoutTempstoreRepositoryInterface
+   */
+  protected $layoutTempstoreRepository;
+
+  /**
+   * Constructs a LayoutBuilderLockAccessCheck.
+   *
+   * @param \Drupal\layout_builder\LayoutTempstoreRepositoryInterface $layout_tempstore_repository
+   *   The layout tempstore repository.
+   */
+  public function __construct(LayoutTempstoreRepositoryInterface $layout_tempstore_repository) {
+    $this->layoutTempstoreRepository = $layout_tempstore_repository;
+  }
+
+  /**
+   * Checks for a lock on the layout.
+   *
+   * @param \Drupal\layout_builder\SectionStorageInterface $section_storage
+   *   The section storage.
+   * @param \Drupal\Core\Session\AccountInterface $account
+   *   The current user.
+   *
+   * @return \Drupal\Core\Access\AccessResultInterface
+   *   The access result.
+   */
+  public function access(SectionStorageInterface $section_storage, AccountInterface $account) {
+    $lock = $this->layoutTempstoreRepository->getLock($section_storage);
+    return AccessResult::allowedIf(!$lock || $account->id() === $lock->getOwnerId())->setCacheMaxAge(0);
+  }
+
+}
diff --git a/core/modules/layout_builder/src/Element/LayoutBuilder.php b/core/modules/layout_builder/src/Element/LayoutBuilder.php
index ec75e16bac..25668871f2 100644
--- a/core/modules/layout_builder/src/Element/LayoutBuilder.php
+++ b/core/modules/layout_builder/src/Element/LayoutBuilder.php
@@ -3,7 +3,6 @@
 namespace Drupal\layout_builder\Element;
 
 use Drupal\Core\Ajax\AjaxHelperTrait;
-use Drupal\Core\Messenger\MessengerInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\Core\Plugin\PluginFormInterface;
 use Drupal\Core\Render\Element;
@@ -37,13 +36,6 @@ class LayoutBuilder extends RenderElement implements ContainerFactoryPluginInter
    */
   protected $layoutTempstoreRepository;
 
-  /**
-   * The messenger service.
-   *
-   * @var \Drupal\Core\Messenger\MessengerInterface
-   */
-  protected $messenger;
-
   /**
    * Constructs a new LayoutBuilder.
    *
@@ -55,13 +47,10 @@ class LayoutBuilder extends RenderElement implements ContainerFactoryPluginInter
    *   The plugin implementation definition.
    * @param \Drupal\layout_builder\LayoutTempstoreRepositoryInterface $layout_tempstore_repository
    *   The layout tempstore repository.
-   * @param \Drupal\Core\Messenger\MessengerInterface $messenger
-   *   The messenger service.
    */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, LayoutTempstoreRepositoryInterface $layout_tempstore_repository, MessengerInterface $messenger) {
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, LayoutTempstoreRepositoryInterface $layout_tempstore_repository) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
     $this->layoutTempstoreRepository = $layout_tempstore_repository;
-    $this->messenger = $messenger;
   }
 
   /**
@@ -72,8 +61,7 @@ public static function create(ContainerInterface $container, array $configuratio
       $configuration,
       $plugin_id,
       $plugin_definition,
-      $container->get('layout_builder.tempstore_repository'),
-      $container->get('messenger')
+      $container->get('layout_builder.tempstore_repository')
     );
   }
 
@@ -140,13 +128,9 @@ protected function layout(SectionStorageInterface $section_storage) {
    *   The section storage.
    */
   protected function prepareLayout(SectionStorageInterface $section_storage) {
-    // If the layout has pending changes, add a warning.
-    if ($this->layoutTempstoreRepository->has($section_storage)) {
-      $this->messenger->addWarning($this->t('You have unsaved changes.'));
-    }
     // If the layout is an override that has not yet been overridden, copy the
     // sections from the corresponding default.
-    elseif ($section_storage instanceof OverridesSectionStorageInterface && !$section_storage->isOverridden()) {
+    if ($section_storage instanceof OverridesSectionStorageInterface && !$section_storage->isOverridden() && !$this->layoutTempstoreRepository->has($section_storage)) {
       $sections = $section_storage->getDefaultSectionStorage()->getSections();
       foreach ($sections as $section) {
         $section_storage->appendSection($section);
diff --git a/core/modules/layout_builder/src/Form/DefaultsEntityForm.php b/core/modules/layout_builder/src/Form/DefaultsEntityForm.php
index b95ddd3bad..737f7e3b9c 100644
--- a/core/modules/layout_builder/src/Form/DefaultsEntityForm.php
+++ b/core/modules/layout_builder/src/Form/DefaultsEntityForm.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\TempStore\Lock;
 use Drupal\layout_builder\Entity\LayoutEntityDisplayInterface;
 use Drupal\layout_builder\LayoutTempstoreRepositoryInterface;
 use Drupal\layout_builder\SectionStorageInterface;
@@ -80,6 +81,15 @@ public function getBaseFormId() {
    * {@inheritdoc}
    */
   public function buildForm(array $form, FormStateInterface $form_state, SectionStorageInterface $section_storage = NULL) {
+    if ($lock = $this->layoutTempstoreRepository->getLock($section_storage)) {
+      if ($this->currentUser()->id() === $lock->getOwnerId()) {
+        $this->messenger()->addWarning($this->t('You have unsaved changes.'));
+      }
+      else {
+        return $this->lockMessage($section_storage, $lock);
+      }
+    }
+
     $form['layout_builder'] = [
       '#type' => 'layout_builder',
       '#section_storage' => $section_storage,
@@ -90,6 +100,36 @@ public function buildForm(array $form, FormStateInterface $form_state, SectionSt
     return parent::buildForm($form, $form_state);
   }
 
+  /**
+   * Builds the lock message.
+   *
+   * @param \Drupal\layout_builder\SectionStorageInterface $section_storage
+   *   The section storage.
+   * @param \Drupal\Core\TempStore\Lock $lock
+   *   The lock object.
+   *
+   * @return array
+   *   A render array.
+   */
+  protected function lockMessage(SectionStorageInterface $section_storage, Lock $lock) {
+    return [
+      '#theme' => 'status_messages',
+      '#message_list' => [
+        'warning' => [
+          [
+            '#type' => 'break_lock_link',
+            '#label' => $this->t('layout'),
+            '#lock' => $lock,
+            '#url' => $section_storage->getLayoutBuilderUrl('discard_changes'),
+          ],
+        ],
+      ],
+      '#status_headings' => [
+        'warning' => $this->t('Warning message'),
+      ],
+    ];
+  }
+
   /**
    * Renders a message to display at the top of the layout builder.
    *
@@ -159,6 +199,13 @@ public function getEntityFromRouteMatch(RouteMatchInterface $route_match, $entit
    */
   protected function actions(array $form, FormStateInterface $form_state) {
     $actions = parent::actions($form, $form_state);
+
+    // Restrict access to actions if the form is locked by another user.
+    $lock = $this->layoutTempstoreRepository->getLock($this->sectionStorage);
+    if ($lock && $lock->getOwnerId() !== $this->currentUser()->id()) {
+      $actions['#access'] = FALSE;
+    }
+
     $actions['submit']['#value'] = $this->t('Save layout');
     $actions['#weight'] = -1000;
 
diff --git a/core/modules/layout_builder/src/Form/DiscardLayoutChangesForm.php b/core/modules/layout_builder/src/Form/DiscardLayoutChangesForm.php
index 7e44a03675..d672e0887a 100644
--- a/core/modules/layout_builder/src/Form/DiscardLayoutChangesForm.php
+++ b/core/modules/layout_builder/src/Form/DiscardLayoutChangesForm.php
@@ -5,6 +5,7 @@
 use Drupal\Core\Form\ConfirmFormBase;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Messenger\MessengerInterface;
+use Drupal\Core\Session\AccountInterface;
 use Drupal\layout_builder\LayoutTempstoreRepositoryInterface;
 use Drupal\layout_builder\SectionStorageInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -31,6 +32,13 @@ class DiscardLayoutChangesForm extends ConfirmFormBase {
    */
   protected $messenger;
 
+  /**
+   * The current user.
+   *
+   * @var \Drupal\Core\Session\AccountInterface
+   */
+  protected $currentUser;
+
   /**
    * The section storage.
    *
@@ -38,6 +46,13 @@ class DiscardLayoutChangesForm extends ConfirmFormBase {
    */
   protected $sectionStorage;
 
+  /**
+   * Indicates if the owner of the lock is the current user or not.
+   *
+   * @var bool
+   */
+  protected $isOwnerCurrentUser;
+
   /**
    * Constructs a new DiscardLayoutChangesForm.
    *
@@ -45,10 +60,13 @@ class DiscardLayoutChangesForm extends ConfirmFormBase {
    *   The layout tempstore repository.
    * @param \Drupal\Core\Messenger\MessengerInterface $messenger
    *   The messenger service.
+   * @param \Drupal\Core\Session\AccountInterface $current_user
+   *   The current user.
    */
-  public function __construct(LayoutTempstoreRepositoryInterface $layout_tempstore_repository, MessengerInterface $messenger) {
+  public function __construct(LayoutTempstoreRepositoryInterface $layout_tempstore_repository, MessengerInterface $messenger, AccountInterface $current_user) {
     $this->layoutTempstoreRepository = $layout_tempstore_repository;
     $this->messenger = $messenger;
+    $this->currentUser = $current_user;
   }
 
   /**
@@ -57,7 +75,8 @@ public function __construct(LayoutTempstoreRepositoryInterface $layout_tempstore
   public static function create(ContainerInterface $container) {
     return new static(
       $container->get('layout_builder.tempstore_repository'),
-      $container->get('messenger')
+      $container->get('messenger'),
+      $container->get('current_user')
     );
   }
 
@@ -72,14 +91,14 @@ public function getFormId() {
    * {@inheritdoc}
    */
   public function getQuestion() {
-    return $this->t('Are you sure you want to discard your layout changes?');
+    return $this->isOwnerCurrentUser ? $this->t('Are you sure you want to discard your layout changes?') : $this->t('Are you sure you want to break the lock on the layout changes?');
   }
 
   /**
    * {@inheritdoc}
    */
   public function getCancelUrl() {
-    return $this->sectionStorage->getRedirectUrl();
+    return $this->sectionStorage->getLayoutBuilderUrl();
   }
 
   /**
@@ -87,6 +106,10 @@ public function getCancelUrl() {
    */
   public function buildForm(array $form, FormStateInterface $form_state, SectionStorageInterface $section_storage = NULL) {
     $this->sectionStorage = $section_storage;
+    $lock = $this->layoutTempstoreRepository->getLock($section_storage);
+    // The current user is considered the owner if they are the ones who made
+    // the changes or if there are no changes made.
+    $this->isOwnerCurrentUser = $lock ? $lock->getOwnerId() === $this->currentUser()->id() : TRUE;
     return parent::buildForm($form, $form_state);
   }
 
@@ -98,7 +121,10 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
 
     $this->messenger->addMessage($this->t('The changes to the layout have been discarded.'));
 
-    $form_state->setRedirectUrl($this->getCancelUrl());
+    // If the user is discarding their own changes, redirect as usual. If they
+    // are breaking the lock of another user's changes, redirect them back to
+    // the Layout Builder UI to make their own changes.
+    $form_state->setRedirectUrl($this->isOwnerCurrentUser ? $this->sectionStorage->getRedirectUrl() : $this->sectionStorage->getLayoutBuilderUrl());
   }
 
 }
diff --git a/core/modules/layout_builder/src/Form/OverridesEntityForm.php b/core/modules/layout_builder/src/Form/OverridesEntityForm.php
index 8b7ba87fbb..5ced5b3186 100644
--- a/core/modules/layout_builder/src/Form/OverridesEntityForm.php
+++ b/core/modules/layout_builder/src/Form/OverridesEntityForm.php
@@ -9,6 +9,7 @@
 use Drupal\Core\Entity\EntityRepositoryInterface;
 use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\TempStore\Lock;
 use Drupal\layout_builder\LayoutTempstoreRepositoryInterface;
 use Drupal\layout_builder\OverridesSectionStorageInterface;
 use Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage;
@@ -95,6 +96,15 @@ protected function init(FormStateInterface $form_state) {
    * {@inheritdoc}
    */
   public function buildForm(array $form, FormStateInterface $form_state, SectionStorageInterface $section_storage = NULL) {
+    if ($lock = $this->layoutTempstoreRepository->getLock($section_storage)) {
+      if ($this->currentUser()->id() === $lock->getOwnerId()) {
+        $this->messenger()->addWarning($this->t('You have unsaved changes.'));
+      }
+      else {
+        return $this->lockMessage($section_storage, $lock);
+      }
+    }
+
     $this->sectionStorage = $section_storage;
     $form = parent::buildForm($form, $form_state);
 
@@ -107,6 +117,36 @@ public function buildForm(array $form, FormStateInterface $form_state, SectionSt
     return $form;
   }
 
+  /**
+   * Builds the lock message.
+   *
+   * @param \Drupal\layout_builder\SectionStorageInterface $section_storage
+   *   The section storage.
+   * @param \Drupal\Core\TempStore\Lock $lock
+   *   The lock object.
+   *
+   * @return array
+   *   A render array.
+   */
+  protected function lockMessage(SectionStorageInterface $section_storage, Lock $lock) {
+    return [
+      '#theme' => 'status_messages',
+      '#message_list' => [
+        'warning' => [
+          [
+            '#type' => 'break_lock_link',
+            '#label' => $this->t('layout'),
+            '#lock' => $lock,
+            '#url' => $section_storage->getLayoutBuilderUrl('discard_changes'),
+          ],
+        ],
+      ],
+      '#status_headings' => [
+        'warning' => $this->t('Warning message'),
+      ],
+    ];
+  }
+
   /**
    * Renders a message to display at the top of the layout builder.
    *
@@ -186,6 +226,13 @@ public function save(array $form, FormStateInterface $form_state) {
    */
   protected function actions(array $form, FormStateInterface $form_state) {
     $actions = parent::actions($form, $form_state);
+
+    // Restrict access to actions if the form is locked by another user.
+    $lock = $this->layoutTempstoreRepository->getLock($this->sectionStorage);
+    if ($lock && $lock->getOwnerId() !== $this->currentUser()->id()) {
+      $actions['#access'] = FALSE;
+    }
+
     $actions['submit']['#value'] = $this->t('Save layout');
     $actions['delete']['#access'] = FALSE;
     $actions['#weight'] = -1000;
diff --git a/core/modules/layout_builder/src/LayoutTempstoreRepository.php b/core/modules/layout_builder/src/LayoutTempstoreRepository.php
index 36b78948b3..7535de2ec3 100644
--- a/core/modules/layout_builder/src/LayoutTempstoreRepository.php
+++ b/core/modules/layout_builder/src/LayoutTempstoreRepository.php
@@ -43,6 +43,14 @@ public function get(SectionStorageInterface $section_storage) {
     return $section_storage;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getLock(SectionStorageInterface $section_storage) {
+    $key = $this->getKey($section_storage);
+    return $this->getTempstore($section_storage)->getMetadata($key);
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/layout_builder/src/LayoutTempstoreRepositoryInterface.php b/core/modules/layout_builder/src/LayoutTempstoreRepositoryInterface.php
index a4220b00f1..c58ce19e9d 100644
--- a/core/modules/layout_builder/src/LayoutTempstoreRepositoryInterface.php
+++ b/core/modules/layout_builder/src/LayoutTempstoreRepositoryInterface.php
@@ -22,6 +22,17 @@ interface LayoutTempstoreRepositoryInterface {
    */
   public function get(SectionStorageInterface $section_storage);
 
+  /**
+   * Returns the lock object.
+   *
+   * @param \Drupal\layout_builder\SectionStorageInterface $section_storage
+   *   The section storage.
+   *
+   * @return \Drupal\Core\TempStore\Lock|null
+   *   The lock object, or NULL if none exists.
+   */
+  public function getLock(SectionStorageInterface $section_storage);
+
   /**
    * Stores this section storage in tempstore.
    *
diff --git a/core/modules/layout_builder/tests/src/Functional/LayoutBuilderTest.php b/core/modules/layout_builder/tests/src/Functional/LayoutBuilderTest.php
index 5629dc9982..2808a14d5f 100644
--- a/core/modules/layout_builder/tests/src/Functional/LayoutBuilderTest.php
+++ b/core/modules/layout_builder/tests/src/Functional/LayoutBuilderTest.php
@@ -632,6 +632,61 @@ public function testLayoutBuilderUiFullViewMode() {
     $page->pressButton('Confirm');
   }
 
+  /**
+   * Tests concurrent editing of the layout by two users.
+   */
+  public function testConcurrentEditing() {
+    $assert_session = $this->assertSession();
+    $page = $this->getSession()->getPage();
+
+    $user1 = $this->drupalCreateUser([
+      'configure any layout',
+      'administer node display',
+    ]);
+    $user2 = $this->drupalCreateUser([
+      'configure any layout',
+      'administer node display',
+    ]);
+
+    $this->drupalLogin($user1);
+    $this->drupalPostForm('admin/structure/types/manage/bundle_with_section_field/display/default', ['layout[enabled]' => TRUE], 'Save');
+
+    $this->drupalGet('admin/structure/types/manage/bundle_with_section_field/display/default/layout');
+    $assert_session->elementsCount('css', '.layout-builder__layout', 1);
+    $assert_session->elementNotExists('css', '.layout--twocol-section');
+    $page->clickLink('Add Section');
+    $page->clickLink('Two column');
+    $page->pressButton('Add section');
+    $assert_session->elementsCount('css', '.layout-builder__layout', 2);
+    $assert_session->elementExists('css', '.layout--twocol-section');
+    $assert_session->pageTextContains('You have unsaved changes.');
+    $assert_session->buttonExists('Save layout');
+    $assert_session->buttonExists('Discard changes');
+    $this->drupalGet('layout_builder/choose/section/defaults/node.bundle_with_section_field.default/0');
+    $assert_session->statusCodeEquals(200);
+
+    $this->drupalLogin($user2);
+    $this->drupalGet('admin/structure/types/manage/bundle_with_section_field/display/default/layout');
+    $assert_session->elementsCount('css', '.layout-builder__layout', 0);
+    $assert_session->pageTextContains(sprintf('This layout is being edited by user %s, and is therefore locked from editing by others.', $user1->getDisplayName()));
+    $assert_session->pageTextNotContains('You have unsaved changes.');
+    $assert_session->buttonNotExists('Save layout');
+    $assert_session->buttonNotExists('Discard changes');
+    $this->drupalGet('layout_builder/choose/section/defaults/node.bundle_with_section_field.default/0');
+    $assert_session->statusCodeEquals(403);
+
+    $this->drupalGet('admin/structure/types/manage/bundle_with_section_field/display/default/layout');
+    $page->clickLink('break this lock');
+    $page->pressButton('Confirm');
+    $assert_session->elementsCount('css', '.layout-builder__layout', 1);
+    $assert_session->elementNotExists('css', '.layout--twocol-section');
+    $assert_session->pageTextNotContains(sprintf('This layout is being edited by user %s, and is therefore locked from editing by others.', $user1->getDisplayName()));
+    $assert_session->pageTextNotContains('You have unsaved changes.');
+    $assert_session->pageTextContains('The changes to the layout have been discarded.');
+    $assert_session->buttonExists('Save layout');
+    $assert_session->buttonExists('Discard changes');
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/layout_builder/tests/src/Functional/Update/TempstoreKeyUpdatePathTest.php b/core/modules/layout_builder/tests/src/Functional/Update/TempstoreKeyUpdatePathTest.php
index 17afb1ca82..b220525d3f 100644
--- a/core/modules/layout_builder/tests/src/Functional/Update/TempstoreKeyUpdatePathTest.php
+++ b/core/modules/layout_builder/tests/src/Functional/Update/TempstoreKeyUpdatePathTest.php
@@ -3,6 +3,7 @@
 namespace Drupal\Tests\layout_builder\Functional\Update;
 
 use Drupal\FunctionalTests\Update\UpdatePathTestBase;
+use Drupal\user\Entity\User;
 
 /**
  * Tests the upgrade path for Layout Builder tempstore keys.
@@ -26,7 +27,7 @@ protected function setDatabaseDumpFiles() {
   }
 
   /**
-   * Tests the upgrade path for Layout Builder extra fields.
+   * Tests the upgrade path for Layout Builder tempstore keys.
    */
   public function testRunUpdates() {
     $page = $this->getSession()->getPage();
@@ -34,18 +35,22 @@ public function testRunUpdates() {
 
     $this->runUpdates();
 
-    $this->drupalLogin($this->drupalCreateUser([
+    $account = $this->drupalCreateUser([
       'configure any layout',
       'administer node display',
-    ]));
+    ]);
+    $this->drupalLogin($account);
     $this->drupalGet('node/1');
     $assert_session->elementExists('css', '.layout--onecol');
     $assert_session->elementNotExists('css', '.layout--twocol-section');
 
     $page->clickLink('Layout');
-    $assert_session->pageTextContains('You have unsaved changes.');
-    $assert_session->elementNotExists('css', '.layout--onecol');
-    $assert_session->elementExists('css', '.layout--twocol-section');
+    // User 1 is the owner of the lock and is not the current user.
+    $this->assertNotSame(1, $account->id());
+    $user = User::load(1);
+    $assert_session->pageTextContains(sprintf('This layout is being edited by user %s, and is therefore locked from editing by others.', $user->getDisplayName()));
+    $assert_session->elementNotExists('css', '.layout');
+    $assert_session->elementNotExists('css', '.layout--twocol-section');
   }
 
 }
diff --git a/core/modules/layout_builder/tests/src/FunctionalJavascript/InlineBlockTest.php b/core/modules/layout_builder/tests/src/FunctionalJavascript/InlineBlockTest.php
index f1c2b67fb2..8afd05b5d8 100644
--- a/core/modules/layout_builder/tests/src/FunctionalJavascript/InlineBlockTest.php
+++ b/core/modules/layout_builder/tests/src/FunctionalJavascript/InlineBlockTest.php
@@ -542,7 +542,7 @@ public function testAddInlineBlocksPermission() {
    * Tests 'create and edit custom blocks' permission to edit an existing block.
    */
   public function testEditInlineBlocksPermission() {
-    $assert_session = $this->assertSession();
+    $page = $this->getSession()->getPage();
 
     LayoutBuilderEntityViewDisplay::load('node.bundle_with_section_field.default')
       ->enableLayoutBuilder()
@@ -557,6 +557,7 @@ public function testEditInlineBlocksPermission() {
     ]));
     $this->drupalGet(static::FIELD_UI_PREFIX . '/display/default/layout');
     $this->addInlineBlockToLayout('The block label', 'The body value');
+    $page->pressButton('Save layout');
 
     $assert = function ($permissions, $expected) {
       $assert_session = $this->assertSession();
