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..f702bdcb90
--- /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,67 @@
+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
+      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..c6b70d02b3
--- /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..173ec8b00e
--- /dev/null
+++ b/core/modules/layout_builder/tests/src/Functional/LayoutRecursionTest.php
@@ -0,0 +1,58 @@
+<?php
+
+namespace Drupal\Tests\layout_builder\Functional;
+
+use Drupal\node\Entity\Node;
+use Drupal\Tests\BrowserTestBase;
+
+/**
+ * Tests recursion prevention in layouts.
+ *
+ * @group layout_builder
+ */
+class LayoutRecursionTest extends BrowserTestBase {
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = [
+    'views',
+    'layout_builder',
+    'block',
+    'node',
+    'layout_builder_recursive_test',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    // @todo Find balance.
+    // when creating 5 nodes here
+    // \Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay::RECURSIVE_RENDER_LIMIT
+    // has to be 1.
+    for ($i = 1; $i <= 5; $i++) {
+      Node::create([
+        'type' => 'type_with_recursion',
+        'title' => "Title $i",
+        'body' => "Body text $i",
+      ])->save();
+    }
+  }
+
+  /**
+   * Tests recursion prevention.
+   *
+   * @throws \Behat\Mink\Exception\ResponseTextException
+   */
+  public function testRecursionPrevention() {
+    $this->drupalLogin($this->drupalCreateUser([
+      'access content',
+    ]));
+
+    $this->drupalGet('node/1');
+    $this->assertSession()->pageTextContains("Title 1");
+  }
+
+}
diff --git a/core/modules/layout_builder/tests/src/Kernel/LayoutBuilderCompatibilityTestBase.php b/core/modules/layout_builder/tests/src/Kernel/LayoutBuilderCompatibilityTestBase.php
index 72ee01ac60..769100d725 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;
 
 /**
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..db05c6c9f6
--- /dev/null
+++ b/core/modules/layout_builder/tests/src/Kernel/SectionComponentRecursionTest.php
@@ -0,0 +1,78 @@
+<?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}
+   */
+  public 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->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)));
+  }
+
+}
