diff --git a/core/modules/layout_builder/layout_builder.services.yml b/core/modules/layout_builder/layout_builder.services.yml
index b2ee1fe13e..62fd7b5fc8 100644
--- a/core/modules/layout_builder/layout_builder.services.yml
+++ b/core/modules/layout_builder/layout_builder.services.yml
@@ -42,7 +42,7 @@ services:
     arguments: ['@tempstore.shared', '@entity_type.manager']
   layout_builder.render_block_component_subscriber:
     class: Drupal\layout_builder\EventSubscriber\BlockComponentRenderArray
-    arguments: ['@current_user']
+    arguments: ['@current_user', '@logger.channel.layout_builder']
     tags:
       - { name: event_subscriber }
   logger.channel.layout_builder:
diff --git a/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php b/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php
index dc07388ba3..7b72014017 100644
--- a/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php
+++ b/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php
@@ -9,6 +9,7 @@
 use Drupal\Core\Entity\Entity\EntityViewDisplay as BaseEntityViewDisplay;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\FieldableEntityInterface;
+use Drupal\Core\Entity\RevisionableInterface;
 use Drupal\Core\Plugin\Context\Context;
 use Drupal\Core\Plugin\Context\ContextDefinition;
 use Drupal\Core\Plugin\Context\EntityContext;
@@ -31,6 +32,25 @@ class LayoutBuilderEntityViewDisplay extends BaseEntityViewDisplay implements La
   use SectionStorageTrait;
   use LayoutEntityHelperTrait;
 
+  /**
+   * The number of times this formatter allows rendering the same entity.
+   *
+   * @var int
+   */
+  const RECURSIVE_RENDER_LIMIT = 1;
+
+  /**
+   * An array of counters for the recursive rendering protection.
+   *
+   * Each counter takes into account all the relevant information about the
+   * field and the referenced entity that is being rendered.
+   *
+   * @var array
+   *
+   * @see \Drupal\Core\Field\Plugin\Field\FieldFormatter\EntityReferenceEntityFormatter::viewElements()
+   */
+  protected static $recursiveRenderDepth = [];
+
   /**
    * The entity field manager.
    *
@@ -314,6 +334,10 @@ protected function buildSections(FieldableEntityInterface $entity) {
     $build = [];
     if ($storage) {
       foreach ($storage->getSections() as $delta => $section) {
+        if ($this->isRecursiveRenderLimit($entity, $delta)) {
+          $build[$delta] = [];
+          continue;
+        }
         $build[$delta] = $section->toRenderArray($contexts);
       }
     }
@@ -482,6 +506,49 @@ protected function getDefaultSection() {
     return $this->getSection(0);
   }
 
+  /**
+   * Tests if this section has been rendered beyond the recursive limit.
+   *
+   * @param \Drupal\Core\Entity\FieldableEntityInterface $entity
+   *   The entity being rendered.
+   * @param int $section_delta
+   *   The section delta.
+   *
+   * @return bool
+   *   TRUE if the recursive limit has been reached, otherwise FALSE.
+   */
+  protected function isRecursiveRenderLimit(FieldableEntityInterface $entity, $section_delta) {
+    $render_id_values = [
+      '%entity_type' => $entity->getEntityTypeId(),
+      '%entiy_id' => $entity->id(),
+      '%view_mode' => $this->getMode(),
+      '%section_delta' => $section_delta,
+    ];
+    if ($entity instanceof RevisionableInterface) {
+      $render_id_values['%revision_id'] = $entity->getRevisionId();
+    }
+    $recursive_render_id = implode(':', $render_id_values);
+
+    if (isset(static::$recursiveRenderDepth[$recursive_render_id])) {
+      static::$recursiveRenderDepth[$recursive_render_id]++;
+    }
+    else {
+      static::$recursiveRenderDepth[$recursive_render_id] = 1;
+    }
+
+    // Protect ourselves from recursive rendering.
+    if (static::$recursiveRenderDepth[$recursive_render_id] > static::RECURSIVE_RENDER_LIMIT) {
+      $error = 'Recursive rendering detected when rendering layout:';
+      foreach ($render_id_values as $key => $render_id_value) {
+        $error .= str_replace('%', '', $key) . ": $key, ";
+      }
+      $error = $this->t("$error. Aborting rendering.");
+      $this->getLogger('layout_builder')->error($error, $render_id_values);
+      return TRUE;
+    }
+    return FALSE;
+  }
+
   /**
    * Gets the section storage manager.
    *
diff --git a/core/modules/layout_builder/src/EventSubscriber/BlockComponentRenderArray.php b/core/modules/layout_builder/src/EventSubscriber/BlockComponentRenderArray.php
index d9218b5387..ce4d85df9c 100644
--- a/core/modules/layout_builder/src/EventSubscriber/BlockComponentRenderArray.php
+++ b/core/modules/layout_builder/src/EventSubscriber/BlockComponentRenderArray.php
@@ -13,7 +13,9 @@
 use Drupal\layout_builder\Access\LayoutPreviewAccessAllowed;
 use Drupal\layout_builder\Event\SectionComponentBuildRenderArrayEvent;
 use Drupal\layout_builder\LayoutBuilderEvents;
+use Drupal\layout_builder\LayoutEntityHelperTrait;
 use Drupal\views\Plugin\Block\ViewsBlock;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
 /**
@@ -24,6 +26,7 @@
  */
 class BlockComponentRenderArray implements EventSubscriberInterface {
 
+  use LayoutEntityHelperTrait;
   use StringTranslationTrait;
 
   /**
@@ -33,14 +36,45 @@ class BlockComponentRenderArray implements EventSubscriberInterface {
    */
   protected $currentUser;
 
+  /**
+   * An array of counters used for Views block recursive rendering protection.
+   *
+   * The counter records every time a specific entity has been rendered by a
+   * Views block within the same layout.
+   *
+   * @var array
+   */
+  protected static $viewsRecursiveRenderDepth = [];
+
+  /**
+   * The logger instance.
+   *
+   * @var \Psr\Log\LoggerInterface
+   */
+  protected $logger;
+
+  /**
+   * The number of times the same entity can be rendered by Views blocks.
+   *
+   * @var int
+   */
+  const VIEWS_RECURSIVE_RENDER_LIMIT = 2;
+
   /**
    * Creates a BlockComponentRenderArray object.
    *
    * @param \Drupal\Core\Session\AccountInterface $current_user
    *   The current user.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   The logger service.
    */
-  public function __construct(AccountInterface $current_user) {
+  public function __construct(AccountInterface $current_user, LoggerInterface $logger = NULL) {
     $this->currentUser = $current_user;
+    if (!$logger) {
+      @trigger_error('The logger.channel.layout_builder service must be passed to BlockComponentRenderArray::__construct(), it is required before Drupal 9.0.0.', E_USER_DEPRECATED);
+      $logger = \Drupal::service('logger.channel.layout_builder');
+    }
+    $this->logger = $logger;
   }
 
   /**
@@ -58,6 +92,7 @@ public static function getSubscribedEvents() {
    *   The section component render event.
    */
   public function onBuildRender(SectionComponentBuildRenderArrayEvent $event) {
+    $bypass_build = FALSE;
     $block = $event->getPlugin();
     if (!$block instanceof BlockPluginInterface) {
       return;
@@ -144,7 +179,53 @@ public function onBuildRender(SectionComponentBuildRenderArrayEvent $event) {
         }
       }
 
-      $event->setBuild($build);
+
+      if ($block instanceof ViewsBlock) {
+        $this->checkForViewsBlockRecursion($block, $bypass_build);
+      }
+
+      if (!$bypass_build) {
+        $event->setBuild($build);
+      }
+
+    }
+  }
+
+  /**
+   * Sets $bypass_build to true when Views blocks exceed recursion limits.
+   *
+   * @param \Drupal\views\Plugin\Derivative\ViewsBlock $block
+   *   The Views block.
+   * @param bool $bypass_build
+   *   Determines if block component should be built.
+   */
+  protected function checkForViewsBlockRecursion(ViewsBlock $block, &$bypass_build) {
+    $view = $block->getViewExecutable();
+    $view_id = $view->id();
+    $view_current_display = $view->current_display;
+    $current_display = $view->getDisplay($view->current_display);
+    $row_plugin = $current_display->getPlugin('row');
+    list($is_displaying,) = explode(':', $row_plugin->getPluginId(), 2);
+    if ($is_displaying === 'entity') {
+      foreach ($view->result as $row) {
+        if (isset($row->_entity)) {
+          $type = $row->_entity->getEntityTypeId();
+          $bundle = $row->_entity->bundle();
+          $id = $row->_entity->id();
+          $row_recursion_id = "$type:$bundle:$id";
+          if (isset(static::$viewsRecursiveRenderDepth[$row_recursion_id])) {
+            static::$viewsRecursiveRenderDepth[$row_recursion_id]++;
+          }
+          else {
+            static::$viewsRecursiveRenderDepth[$row_recursion_id] = 1;
+          }
+          if (static::$viewsRecursiveRenderDepth[$row_recursion_id] > static::VIEWS_RECURSIVE_RENDER_LIMIT) {
+            $error = "Did not render View: $view_id with display $view_current_display to prevent recursion";
+            $this->logger->error($error);
+            $bypass_build = TRUE;
+          }
+        }
+      }
     }
   }
 
diff --git a/core/modules/layout_builder/src/QuickEditIntegration.php b/core/modules/layout_builder/src/QuickEditIntegration.php
index 9ee5045fbd..b4e832e58b 100644
--- a/core/modules/layout_builder/src/QuickEditIntegration.php
+++ b/core/modules/layout_builder/src/QuickEditIntegration.php
@@ -129,18 +129,20 @@ public function entityViewAlter(array &$build, EntityInterface $entity, EntityVi
     $plugin_ids_to_update = [];
     foreach (Element::children($build['_layout_builder']) as $delta) {
       $section = $build['_layout_builder'][$delta];
+      // Recursion protection makes it possible for there to be a $section
+      // without a '#layout' key. Skip when this is the case.
+      if (!isset($section['#layout'])) {
+        continue;
+      }
+      /** @var \Drupal\Core\Layout\LayoutDefinition $layout */
+      $layout = $section['#layout'];
+      $regions = $layout->getRegionNames();
 
-      if (!Element::isEmpty($section)) {
-        /** @var \Drupal\Core\Layout\LayoutDefinition $layout */
-        $layout = $section['#layout'];
-        $regions = $layout->getRegionNames();
-
-        foreach ($regions as $region) {
-          if (isset($section[$region])) {
-            foreach ($section[$region] as $uuid => $component) {
-              if (isset($component['#plugin_id']) && $this->supportQuickEditOnComponent($component, $entity)) {
-                $plugin_ids_to_update[$component['#plugin_id']][$delta][$region][$uuid] = $uuid;
-              }
+      foreach ($regions as $region) {
+        if (isset($section[$region])) {
+          foreach ($section[$region] as $uuid => $component) {
+            if (isset($component['#plugin_id']) && $this->supportQuickEditOnComponent($component, $entity)) {
+              $plugin_ids_to_update[$component['#plugin_id']][$delta][$region][$uuid] = $uuid;
             }
           }
         }
diff --git a/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/core.entity_form_display.node.type_with_recursion.default.yml b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/core.entity_form_display.node.type_with_recursion.default.yml
new file mode 100644
index 0000000000..212177f122
--- /dev/null
+++ b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/core.entity_form_display.node.type_with_recursion.default.yml
@@ -0,0 +1,68 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.field.node.type_with_recursion.body
+    - node.type.type_with_recursion
+  module:
+    - text
+id: node.type_with_recursion.default
+targetEntityType: node
+bundle: type_with_recursion
+mode: default
+content:
+  body:
+    type: text_textarea_with_summary
+    weight: 121
+    settings:
+      rows: 9
+      summary_rows: 3
+      placeholder: ''
+    third_party_settings: {  }
+    region: content
+  created:
+    type: datetime_timestamp
+    weight: 10
+    region: content
+    settings: {  }
+    third_party_settings: {  }
+  promote:
+    type: boolean_checkbox
+    settings:
+      display_label: true
+    weight: 15
+    region: content
+    third_party_settings: {  }
+  status:
+    type: boolean_checkbox
+    settings:
+      display_label: true
+    weight: 120
+    region: content
+    third_party_settings: {  }
+  sticky:
+    type: boolean_checkbox
+    settings:
+      display_label: true
+    weight: 16
+    region: content
+    third_party_settings: {  }
+  title:
+    type: string_textfield
+    weight: -5
+    region: content
+    settings:
+      size: 60
+      placeholder: ''
+    third_party_settings: {  }
+  uid:
+    type: entity_reference_autocomplete
+    weight: 5
+    settings:
+      match_operator: CONTAINS
+      match_limit: 10
+      size: 60
+      placeholder: ''
+    region: content
+    third_party_settings: {  }
+hidden: {  }
diff --git a/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/core.entity_view_display.node.type_with_recursion.default.yml b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/core.entity_view_display.node.type_with_recursion.default.yml
new file mode 100644
index 0000000000..c5a47ce29c
--- /dev/null
+++ b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/core.entity_view_display.node.type_with_recursion.default.yml
@@ -0,0 +1,66 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.field.node.type_with_recursion.body
+    - node.type.type_with_recursion
+    - views.view.list_all_nodes
+  module:
+    - layout_builder
+    - layout_discovery
+    - text
+    - user
+    - views
+third_party_settings:
+  layout_builder:
+    sections:
+      -
+        layout_id: layout_onecol
+        layout_settings: {  }
+        components:
+          17412d69-83ed-4958-9385-0f4bf4ce03c7:
+            uuid: 17412d69-83ed-4958-9385-0f4bf4ce03c7
+            region: content
+            configuration:
+              id: 'field_block:node:type_with_recursion:body'
+              label_display: ''
+              formatter:
+                label: hidden
+                type: text_default
+                settings: {  }
+                third_party_settings: {  }
+              context_mapping:
+                entity: layout_builder.entity
+            additional: {  }
+            weight: 0
+          7c7b9a4c-4bbe-411b-9dc2-e924668b2713:
+            uuid: 7c7b9a4c-4bbe-411b-9dc2-e924668b2713
+            region: content
+            configuration:
+              id: 'views_block:list_all_nodes-block_1'
+              label: ''
+              provider: views
+              label_display: visible
+              views_label: ''
+              items_per_page: none
+              context_mapping: {  }
+            additional: {  }
+            weight: 1
+id: node.type_with_recursion.default
+targetEntityType: node
+bundle: type_with_recursion
+mode: default
+content:
+  body:
+    label: hidden
+    type: text_default
+    weight: 101
+    settings: {  }
+    third_party_settings: {  }
+    region: content
+  links:
+    weight: 100
+    settings: {  }
+    third_party_settings: {  }
+    region: content
+hidden: {  }
diff --git a/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/core.entity_view_display.node.type_with_recursion.teaser.yml b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/core.entity_view_display.node.type_with_recursion.teaser.yml
new file mode 100644
index 0000000000..7f2fcada1f
--- /dev/null
+++ b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/core.entity_view_display.node.type_with_recursion.teaser.yml
@@ -0,0 +1,54 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.node.teaser
+    - field.field.node.type_with_recursion.body
+    - node.type.type_with_recursion
+  module:
+    - layout_builder
+    - layout_discovery
+    - text
+    - user
+third_party_settings:
+  layout_builder:
+    sections:
+      -
+        layout_id: layout_onecol
+        layout_settings: {  }
+        components:
+          2ec78b8d-0568-48e5-b67c-38370363877b:
+            uuid: 2ec78b8d-0568-48e5-b67c-38370363877b
+            region: content
+            configuration:
+              id: 'field_block:node:type_with_recursion:body'
+              label_display: ''
+              formatter:
+                label: hidden
+                type: text_summary_or_trimmed
+                settings:
+                  trim_length: 600
+                third_party_settings: {  }
+              context_mapping:
+                entity: layout_builder.entity
+            additional: {  }
+            weight: 0
+id: node.type_with_recursion.teaser
+targetEntityType: node
+bundle: type_with_recursion
+mode: teaser
+content:
+  body:
+    label: hidden
+    type: text_summary_or_trimmed
+    weight: 101
+    settings:
+      trim_length: 600
+    third_party_settings: {  }
+    region: content
+  links:
+    weight: 100
+    settings: {  }
+    third_party_settings: {  }
+    region: content
+hidden: {  }
diff --git a/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/field.field.node.type_with_recursion.body.yml b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/field.field.node.type_with_recursion.body.yml
new file mode 100644
index 0000000000..4fa0b933dc
--- /dev/null
+++ b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/field.field.node.type_with_recursion.body.yml
@@ -0,0 +1,21 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.node.body
+    - node.type.type_with_recursion
+  module:
+    - text
+id: node.type_with_recursion.body
+field_name: body
+entity_type: node
+bundle: type_with_recursion
+label: Body
+description: ''
+required: false
+translatable: true
+default_value: {  }
+default_value_callback: ''
+settings:
+  display_summary: true
+field_type: text_with_summary
diff --git a/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/node.type.type_with_recursion.yml b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/node.type.type_with_recursion.yml
new file mode 100644
index 0000000000..d351be868d
--- /dev/null
+++ b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/node.type.type_with_recursion.yml
@@ -0,0 +1,9 @@
+langcode: en
+status: true
+name: 'Type with recursion'
+type: type_with_recursion
+description: ''
+help: ''
+new_revision: true
+preview_mode: 1
+display_submitted: true
diff --git a/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/views.view.list_all_nodes.yml b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/views.view.list_all_nodes.yml
new file mode 100644
index 0000000000..fbd0ec21a7
--- /dev/null
+++ b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/views.view.list_all_nodes.yml
@@ -0,0 +1,165 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.node.full
+  module:
+    - node
+    - user
+id: list_all_nodes
+label: 'List all nodes'
+module: views
+description: ''
+tag: ''
+base_table: node_field_data
+base_field: nid
+#core: 8.x
+display:
+  default:
+    display_plugin: default
+    id: default
+    display_title: Master
+    position: 0
+    display_options:
+      access:
+        type: perm
+        options:
+          perm: 'access content'
+      cache:
+        type: tag
+        options: {  }
+      query:
+        type: views_query
+        options:
+          disable_sql_rewrite: false
+          distinct: false
+          replica: false
+          query_comment: ''
+          query_tags: {  }
+      exposed_form:
+        type: basic
+        options:
+          submit_button: Apply
+          reset_button: false
+          reset_button_label: Reset
+          exposed_sorts_label: 'Sort by'
+          expose_sort_order: true
+          sort_asc_label: Asc
+          sort_desc_label: Desc
+      pager:
+        type: none
+        options:
+          items_per_page: 0
+          offset: 0
+      style:
+        type: default
+      row:
+        type: 'entity:node'
+        options:
+          view_mode: full
+      fields:
+        title:
+          id: title
+          table: node_field_data
+          field: title
+          entity_type: node
+          entity_field: title
+          label: ''
+          alter:
+            alter_text: false
+            make_link: false
+            absolute: false
+            trim: false
+            word_boundary: false
+            ellipsis: false
+            strip_tags: false
+            html: false
+          hide_empty: false
+          empty_zero: false
+          settings:
+            link_to_entity: true
+          plugin_id: field
+          relationship: none
+          group_type: group
+          admin_label: ''
+          exclude: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: true
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_alter_empty: true
+          click_sort_column: value
+          type: string
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+      filters:
+        status:
+          value: '1'
+          table: node_field_data
+          field: status
+          plugin_id: boolean
+          entity_type: node
+          entity_field: status
+          id: status
+          expose:
+            operator: ''
+          group: 1
+      sorts:
+        created:
+          id: created
+          table: node_field_data
+          field: created
+          order: DESC
+          entity_type: node
+          entity_field: created
+          plugin_id: date
+          relationship: none
+          group_type: group
+          admin_label: ''
+          exposed: false
+          expose:
+            label: ''
+          granularity: second
+      title: 'List all nodes'
+      header: {  }
+      footer: {  }
+      empty: {  }
+      relationships: {  }
+      arguments: {  }
+      display_extenders: {  }
+    cache_metadata:
+      max-age: -1
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - 'user.node_grants:view'
+        - user.permissions
+      tags: {  }
+  block_1:
+    display_plugin: block
+    id: block_1
+    display_title: Block
+    position: 1
+    display_options:
+      display_extenders: {  }
+    cache_metadata:
+      max-age: -1
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - 'user.node_grants:view'
+        - user.permissions
+      tags: {  }
diff --git a/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/layout_builder_recursive_test.info.yml b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/layout_builder_recursive_test.info.yml
new file mode 100644
index 0000000000..7025992b06
--- /dev/null
+++ b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/layout_builder_recursive_test.info.yml
@@ -0,0 +1,8 @@
+name: 'Layout Builder Recursive Test'
+type: module
+description: 'Support module for testing recursion prevention.'
+package: Testing
+version: VERSION
+core: 8.x
+dependencies:
+  - views
diff --git a/core/modules/layout_builder/tests/modules/layout_builder_test/config/schema/layout_builder_test.schema.yml b/core/modules/layout_builder/tests/modules/layout_builder_test/config/schema/layout_builder_test.schema.yml
index 75050837fa..8ba8237a84 100644
--- a/core/modules/layout_builder/tests/modules/layout_builder_test/config/schema/layout_builder_test.schema.yml
+++ b/core/modules/layout_builder/tests/modules/layout_builder_test/config/schema/layout_builder_test.schema.yml
@@ -5,3 +5,13 @@ layout_builder_test.test_simple_config.*:
       type: sequence
       sequence:
         type: layout_builder.section
+
+block.settings.layout_builder_test_entity_block:
+  type: block_settings
+  label: 'Test Entity Block'
+  mapping:
+    entity_type_id:
+      type: string
+      label: 'Entity type ID'
+    entity_id:
+      type: integer
diff --git a/core/modules/layout_builder/tests/modules/layout_builder_test/src/Plugin/Block/EntityBlock.php b/core/modules/layout_builder/tests/modules/layout_builder_test/src/Plugin/Block/EntityBlock.php
new file mode 100644
index 0000000000..711684b44e
--- /dev/null
+++ b/core/modules/layout_builder/tests/modules/layout_builder_test/src/Plugin/Block/EntityBlock.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Drupal\layout_builder_test\Plugin\Block;
+
+use Drupal\Core\Block\BlockBase;
+
+/**
+ * Provides a block that renders an arbitrary entity.
+ *
+ * @Block(
+ *   id = "layout_builder_test_entity_block",
+ *   admin_label = @Translation("Test Entity Block"),
+ * )
+ */
+class EntityBlock extends BlockBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return [
+      'entity_type_id' => NULL,
+      'entity_id' => NULL,
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function build() {
+    $entity = \Drupal::entityTypeManager()
+      ->getStorage($this->configuration['entity_type_id'])
+      ->load($this->configuration['entity_id']);
+    return \Drupal::entityTypeManager()
+      ->getViewBuilder($this->configuration['entity_type_id'])
+      ->view($entity);
+  }
+
+}
diff --git a/core/modules/layout_builder/tests/src/Functional/LayoutRecursionTest.php b/core/modules/layout_builder/tests/src/Functional/LayoutRecursionTest.php
new file mode 100644
index 0000000000..412ce85dba
--- /dev/null
+++ b/core/modules/layout_builder/tests/src/Functional/LayoutRecursionTest.php
@@ -0,0 +1,70 @@
+<?php
+
+namespace Drupal\Tests\layout_builder\Functional;
+
+use Drupal\node\Entity\Node;
+use Drupal\Tests\BrowserTestBase;
+use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay;
+
+/**
+ * Tests recursion prevention in layouts.
+ *
+ * @group layout_builder
+ */
+class LayoutRecursionTest extends BrowserTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'views',
+    'layout_builder',
+    'block',
+    'node',
+    'layout_builder_recursive_test',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $defaultTheme = 'stark';
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    for ($i = 1; $i <= 9; $i++) {
+      Node::create([
+        'type' => 'type_with_recursion',
+        'title' => "Title $i",
+        'body' => "Body text $i",
+      ])->save();
+    }
+
+    LayoutBuilderEntityViewDisplay::load('node.type_with_recursion.default')
+      ->enableLayoutBuilder()
+      ->save();
+  }
+
+  /**
+   * Tests recursion prevention.
+   */
+  public function testRecursionPrevention() {
+    $assert_session = $this->assertSession();
+
+    $this->drupalLogin($this->drupalCreateUser([
+      'access content',
+    ]));
+
+    $this->drupalGet('node/1');
+
+    // If recursion prevention is not properly implemented for Views within
+    // Layout Builder layouts, there will be an error page and the actual
+    // contents of node 1 will never be rendered. A check for anything that
+    // should appear in node 1 proves recursion protection was successful.
+    $assert_session->pageTextContains('List all nodes');
+  }
+
+}
diff --git a/core/modules/layout_builder/tests/src/Kernel/LayoutBuilderCompatibilityTestBase.php b/core/modules/layout_builder/tests/src/Kernel/LayoutBuilderCompatibilityTestBase.php
index fa1047c377..d2e2488f32 100644
--- a/core/modules/layout_builder/tests/src/Kernel/LayoutBuilderCompatibilityTestBase.php
+++ b/core/modules/layout_builder/tests/src/Kernel/LayoutBuilderCompatibilityTestBase.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay;
 use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
 
 /**
@@ -116,6 +117,13 @@ protected function enableOverrides() {
   protected function assertFieldAttributes(EntityInterface $entity, array $attributes) {
     $view_builder = $this->container->get('entity_type.manager')->getViewBuilder($entity->getEntityTypeId());
     $build = $view_builder->view($entity);
+
+    if ($this->display instanceof LayoutBuilderEntityViewDisplay) {
+      $property = new \ReflectionProperty($this->display, 'recursiveRenderDepth');
+      $property->setAccessible(TRUE);
+      $property->setValue($this->recursiveRenderDepth, []);
+    }
+
     $this->render($build);
 
     $actual = array_map(function (\SimpleXMLElement $element) {
diff --git a/core/modules/layout_builder/tests/src/Kernel/SectionComponentRecursionTest.php b/core/modules/layout_builder/tests/src/Kernel/SectionComponentRecursionTest.php
new file mode 100644
index 0000000000..418726f785
--- /dev/null
+++ b/core/modules/layout_builder/tests/src/Kernel/SectionComponentRecursionTest.php
@@ -0,0 +1,79 @@
+<?php
+
+namespace Drupal\Tests\layout_builder\Kernel;
+
+use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
+use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay;
+use Drupal\layout_builder\Section;
+use Drupal\layout_builder\SectionComponent;
+
+/**
+ * Tests the recursion protection in \Drupal\layout_builder\SectionComponent.
+ *
+ * @group layout_builder
+ */
+class SectionComponentRecursionTest extends EntityKernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'entity_test',
+    'layout_builder',
+    'layout_builder_test',
+    'layout_discovery',
+    'layout_test',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->installEntitySchema('entity_test');
+  }
+
+  /**
+   * Tests that Layout Builder protects against recursive rendering.
+   */
+  public function testRecursion() {
+    $entity_storage = $this->container->get('entity_type.manager')->getStorage('entity_test');
+    // @todo Remove langcode workarounds after resolving
+    //   https://www.drupal.org/node/2915034.
+    $entity = $entity_storage->createWithSampleValues('entity_test', [
+      'langcode' => 'en',
+      'langcode_default' => TRUE,
+    ]);
+    $entity->save();
+
+    $section = new Section('layout_onecol');
+    $component = (new SectionComponent(\Drupal::service('uuid')->generate(), 'content', [
+      'id' => 'layout_builder_test_entity_block',
+      'entity_type_id' => $entity->getEntityTypeId(),
+      'entity_id' => $entity->id(),
+    ]));
+    $section->appendComponent($component);
+    $display = LayoutBuilderEntityViewDisplay::create([
+      'targetEntityType' => 'entity_test',
+      'bundle' => 'entity_test',
+      'mode' => 'default',
+      'status' => TRUE,
+      'third_party_settings' => [
+        'layout_builder' => [
+          'sections' => [$section],
+        ],
+      ],
+    ]);
+    $display->enableLayoutBuilder();
+    $display->save();
+
+    $build = $this->container->get('entity_type.manager')
+      ->getViewBuilder('entity_test')
+      ->view($entity);
+
+    // This would recursively render $entity without our protection, and throw
+    // an exception.
+    $this->assertFalse(empty($this->render($build)));
+  }
+
+}
