diff --git a/core/modules/layout_builder/src/Controller/ChooseBlockController.php b/core/modules/layout_builder/src/Controller/ChooseBlockController.php
index 9bd76ba..7168288 100644
--- a/core/modules/layout_builder/src/Controller/ChooseBlockController.php
+++ b/core/modules/layout_builder/src/Controller/ChooseBlockController.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Block\BlockManagerInterface;
 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Entity\EntityTypeRepositoryInterface;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Drupal\Core\Url;
 use Drupal\layout_builder\Context\LayoutBuilderContextTrait;
@@ -38,16 +39,26 @@ class ChooseBlockController implements ContainerInjectionInterface {
   protected $entityTypeManager;
 
   /**
+   * The entity type repository.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeRepositoryInterface
+   */
+  protected $entityTypeRepository;
+
+  /**
    * ChooseBlockController constructor.
    *
    * @param \Drupal\Core\Block\BlockManagerInterface $block_manager
    *   The block manager.
    * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
    *   The entity type manager.
+   * @param \Drupal\Core\Entity\EntityTypeRepositoryInterface $entity_type_repository
+   *   The entity type repository.
    */
-  public function __construct(BlockManagerInterface $block_manager, EntityTypeManagerInterface $entity_type_manager) {
+  public function __construct(BlockManagerInterface $block_manager, EntityTypeManagerInterface $entity_type_manager, EntityTypeRepositoryInterface $entity_type_repository) {
     $this->blockManager = $block_manager;
     $this->entityTypeManager = $entity_type_manager;
+    $this->entityTypeRepository = $entity_type_repository;
   }
 
   /**
@@ -56,7 +67,8 @@ public function __construct(BlockManagerInterface $block_manager, EntityTypeMana
   public static function create(ContainerInterface $container) {
     return new static(
       $container->get('plugin.manager.block'),
-      $container->get('entity_type.manager')
+      $container->get('entity_type.manager'),
+      $container->get('entity_type.repository')
     );
   }
 
@@ -124,16 +136,96 @@ public function build(SectionStorageInterface $section_storage, $delta, $region)
     ]);
     $grouped_definitions = $this->blockManager->getGroupedDefinitions($definitions);
     foreach ($grouped_definitions as $category => $blocks) {
-      $block_categories[$category]['#type'] = 'details';
-      $block_categories[$category]['#open'] = TRUE;
-      $block_categories[$category]['#title'] = $category;
-      $block_categories[$category]['links'] = $this->getBlockLinks($section_storage, $delta, $region, $blocks);
+      $block_categories[$category] = $this->getCategoryBuild($section_storage, $delta, $region, $blocks, $category);
     }
     $build['block_categories'] = $block_categories;
     return $build;
   }
 
   /**
+   * Gets the build for category of blocks.
+   *
+   * @param \Drupal\layout_builder\SectionStorageInterface $section_storage
+   *   The section storage.
+   * @param int $delta
+   *   The delta of the section to splice.
+   * @param string $region
+   *   The region the block is going in.
+   * @param array $blocks
+   *   The blocks for the category.
+   * @param string $category
+   *   The category label.
+   *
+   * @return array
+   *   The render array for the block category.
+   */
+  protected function getCategoryBuild(SectionStorageInterface $section_storage, $delta, $region, array $blocks, $category) {
+    // Keep track of the weight for field block categories so that these
+    // categories can be moved ot the top.
+    static $field_block_category_weight = -200;
+
+    $is_primary_block = function (array $block) {
+      return empty($block['_is_secondary_layout_builder_block']);
+    };
+    $is_secondary_block = function (array $block) use ($is_primary_block) {
+      return !$is_primary_block($block);
+    };
+    $primary_blocks = array_filter($blocks, $is_primary_block);
+    $secondary_blocks = array_filter($blocks, $is_secondary_block);
+    $primary_block_links = $this->getBlockLinks($section_storage, $delta, $region, $primary_blocks);
+    $secondary_block_links = $this->getBlockLinks($section_storage, $delta, $region, $secondary_blocks);
+
+    $category_build = [
+      '#type' => 'details',
+      '#title' => $category,
+      'links' => $primary_block_links,
+    ];
+
+    if ($secondary_block_links['#links']) {
+      if (!$primary_block_links['#links']) {
+        // If no other links exist add these links as top level links for the
+        // category.
+        $category_build['links'] = $secondary_block_links;
+      }
+      else {
+        $category_build['more_fields'] = [
+          '#type' => 'details',
+          '#title' => $this->t('More'),
+          '#open' => FALSE,
+          'links' => $secondary_block_links,
+        ];
+      }
+    }
+    // If this a entity category and there are links besides non 'view'
+    // configurable field blocks move the category to the top and open it.
+    if ($this->isFieldCategory($category) && $primary_block_links['#links']) {
+      $category_build['#open'] = TRUE;
+      $category_build['#weight'] = $field_block_category_weight;
+      $field_block_category_weight += 10;
+    }
+    return $category_build;
+  }
+
+  /**
+   * Determines if a block category is field block category.
+   *
+   * @param string $category
+   *   The block category.
+   *
+   * @return bool
+   *   TRUE if the category is a field block category.
+   */
+  protected function isFieldCategory($category) {
+    static $entity_field_categories = [];
+    if (empty($entity_field_categories)) {
+      foreach ($this->entityTypeRepository->getEntityTypeLabels() as $entity_type_label) {
+        $entity_field_categories[] = (string) $this->t('@entity fields', ['@entity' => $entity_type_label]);
+      }
+    }
+    return in_array($category, $entity_field_categories, TRUE);
+  }
+
+  /**
    * Provides the UI for choosing a new inline block.
    *
    * @param \Drupal\layout_builder\SectionStorageInterface $section_storage
diff --git a/core/modules/layout_builder/src/Plugin/Derivative/FieldBlockDeriver.php b/core/modules/layout_builder/src/Plugin/Derivative/FieldBlockDeriver.php
index 57d2c1e..2cb8975 100644
--- a/core/modules/layout_builder/src/Plugin/Derivative/FieldBlockDeriver.php
+++ b/core/modules/layout_builder/src/Plugin/Derivative/FieldBlockDeriver.php
@@ -114,9 +114,16 @@ public function getDerivativeDefinitions($base_plugin_definition) {
           if ($field_definition instanceof FieldConfigInterface) {
             $derivative['config_dependencies'][$field_definition->getConfigDependencyKey()][] = $field_definition->getConfigDependencyName();
           }
+
+          $is_display_configurable = $field_definition->isDisplayConfigurable('view');
           // For any field that is not display configurable, mark it as
           // unavailable to place in the block UI.
-          $derivative['_block_ui_hidden'] = !$field_definition->isDisplayConfigurable('view');
+          $derivative['_block_ui_hidden'] = !$is_display_configurable;
+
+          // Mark field that are not view configurable has secondary blocks for
+          // layout builder.
+          // @see \Drupal\layout_builder\Controller\ChooseBlockController::build()
+          $derivative['_is_secondary_layout_builder_block'] = !$is_display_configurable;
 
           $context_definition = EntityContextDefinition::fromEntityTypeId($entity_type_id)->setLabel($entity_type_labels[$entity_type_id]);
           $context_definition->addConstraint('Bundle', [$bundle]);
diff --git a/core/modules/layout_builder/tests/src/FunctionalJavascript/AjaxBlockTest.php b/core/modules/layout_builder/tests/src/FunctionalJavascript/AjaxBlockTest.php
index 653185f..dc79fc9 100644
--- a/core/modules/layout_builder/tests/src/FunctionalJavascript/AjaxBlockTest.php
+++ b/core/modules/layout_builder/tests/src/FunctionalJavascript/AjaxBlockTest.php
@@ -11,6 +11,8 @@
  */
 class AjaxBlockTest extends WebDriverTestBase {
 
+  use LayoutBuilderTestTrait;
+
   /**
    * {@inheritdoc}
    */
@@ -71,7 +73,8 @@ public function testAddAjaxBlock() {
     $assert_session->linkExists('Add Block');
     $this->clickLink('Add Block');
     $assert_session->assertWaitOnAjaxRequest();
-    $assert_session->linkExists('TestAjax');
+    $this->clickBlockCategory('Test');
+    $this->assertBlockLinkVisible('TestAjax');
     $this->clickLink('TestAjax');
     $assert_session->assertWaitOnAjaxRequest();
     // Find the radio buttons.
diff --git a/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderTestTrait.php b/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderTestTrait.php
new file mode 100644
index 0000000..239618f
--- /dev/null
+++ b/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderTestTrait.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace Drupal\Tests\layout_builder\FunctionalJavascript;
+
+/**
+ * Trait for Layout Builder Javascript tests.
+ */
+trait LayoutBuilderTestTrait {
+
+  /**
+   * Clicks a category in the block list.
+   *
+   * @param string $category
+   *   The category.
+   */
+  protected function clickBlockCategory($category) {
+    $this->assertSession()->elementExists('css', "#drupal-off-canvas summary:contains('$category')")->click();
+  }
+
+  /**
+   * Asserts that block link is visible.
+   *
+   * @param string $link_text
+   *   The link text.
+   */
+  protected function assertBlockLinkVisible($link_text) {
+    $this->assertNotEmpty($this->assertSession()->waitForElementVisible('css', "#drupal-off-canvas a:contains('$link_text')"));
+  }
+
+  /**
+   * Asserts that block link is not visible.
+   *
+   * @param string $link_text
+   *   The link text.
+   */
+  protected function assertBlockLinkNotVisible($link_text) {
+    $this->assertEmpty($this->assertSession()->waitForElementVisible('css', "#drupal-off-canvas a:contains('$link_text')"));
+  }
+
+}
diff --git a/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderUiTest.php b/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderUiTest.php
index c5510e9..46a51f4 100644
--- a/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderUiTest.php
+++ b/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderUiTest.php
@@ -2,6 +2,9 @@
 
 namespace Drupal\Tests\layout_builder\FunctionalJavascript;
 
+use Behat\Mink\Element\NodeElement;
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
 use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
 
 /**
@@ -11,6 +14,8 @@
  */
 class LayoutBuilderUiTest extends WebDriverTestBase {
 
+  use LayoutBuilderTestTrait;
+
   /**
    * Path prefix for the field UI for the test bundle.
    *
@@ -91,4 +96,147 @@ protected function assertModifiedLayout($path) {
     $assert_session->pageTextContainsOnce('You have unsaved changes.');
   }
 
+  /**
+   * Tests the block list in the Layout Builder.
+   */
+  public function testBlockList() {
+    $assert_session = $this->assertSession();
+    $page = $this->getSession()->getPage();
+
+    // Enable layout builder.
+    $this->drupalPostForm(
+      static::FIELD_UI_PREFIX . '/display/default',
+      ['layout[enabled]' => TRUE],
+      'Save'
+    );
+    $page->clickLink('Manage layout');
+    $assert_session->addressEquals(static::FIELD_UI_PREFIX . '/display-layout/default');
+
+    // Add a new block.
+    $page->clickLink('Add Block');
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#drupal-off-canvas'));
+
+    // The 'User fields' category should not be moved to the top if there are no
+    // 'view' configurable fields.
+    $this->assertRelativeCategoryOrder(['Content fields', 'Content', 'System', 'User', 'User fields']);
+
+    $this->assertBlockLinkVisible('Body');
+    $this->assertBlockLinkNotVisible('Title');
+    $this->assertBlockLinkNotVisible('Revision ID');
+    $this->clickMore('Content fields');
+    $this->assertBlockLinkVisible('Title');
+    $this->assertBlockLinkVisible('Revision ID');
+
+    $this->assertBlockLinkNotVisible('Messages');
+    $this->clickBlockCategory('System');
+    $this->assertEmpty($this->findCategoryMoreElement('System'));
+    $this->assertBlockLinkVisible('Messages');
+
+    // Currently User has no configurable fields. Therefore it will have no
+    // 'More' link and the category will be closed by default.
+    $this->assertBlockLinkNotVisible('Roles');
+    $this->clickBlockCategory('User fields');
+    $this->assertBlockLinkVisible('Roles');
+    $this->assertEmpty($this->findCategoryMoreElement('User'));
+
+    // Add user field that will be 'view' configurable.
+    FieldStorageConfig::create([
+      'field_name' => 'bio',
+      'entity_type' => 'user',
+      'module' => 'text',
+      'type' => 'text',
+      'cardinality' => 1,
+    ])->save();
+
+    FieldConfig::create([
+      'field_name' => 'bio',
+      'entity_type' => 'user',
+      'label' => 'Bio',
+      'bundle' => 'user',
+      'required' => FALSE,
+    ])->save();
+
+    $this->drupalGet(static::FIELD_UI_PREFIX . '/display-layout/default');
+    // Add a new block.
+    $page->clickLink('Add Block');
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#drupal-off-canvas'));
+    // User category should now be moved to the top since the new 'Bio' field
+    // is 'view' configurable.
+    $this->assertRelativeCategoryOrder([
+      'Content fields',
+      'User fields',
+      'Content',
+      'System',
+      'User',
+    ]);
+    // Ensure new 'Bio' field is visible by default and other fields are only
+    // visible after clicking 'More'.
+    $this->assertBlockLinkVisible('Bio');
+    $this->assertBlockLinkNotVisible('Roles');
+    $this->clickMore('User fields');
+    $this->assertBlockLinkVisible('Bio');
+    $this->assertBlockLinkVisible('Roles');
+  }
+
+  /**
+   * Clicks the 'More' element of a category.
+   *
+   * @param string $category
+   *   The category.
+   */
+  protected function clickMore($category) {
+    $this->findCategoryMoreElement($category)->click();
+  }
+
+  /**
+   * Finds a 'details' element for a category.
+   *
+   * @param string $category
+   *   The category to find.
+   *
+   * @return \Behat\Mink\Element\NodeElement|null
+   *   The 'details' element element if it exists, otherwise NULL.
+   */
+  protected function findCategoryDetails($category) {
+    $all_details = $this->getSession()->getPage()->findAll('css', '#drupal-off-canvas .block-categories details');
+    foreach ($all_details as $details) {
+      $summary = $details->find('css', 'summary');
+      if ($summary instanceof NodeElement && $summary->getText() === $category) {
+        return $details;
+      }
+    }
+    return NULL;
+  }
+
+  /**
+   * Asserts that given categories are in the correct relative order.
+   *
+   * @param string[] $categories
+   *   The categories in the order to check.
+   */
+  protected function assertRelativeCategoryOrder(array $categories) {
+    $page = $this->getSession()->getPage();
+    $display_categories = [];
+    /** @var \Behat\Mink\Element\NodeElement $category_summary */
+    foreach ($page->findAll('css', '#drupal-off-canvas summary') as $category_summary) {
+      $display_categories[] = $category_summary->getText();
+    }
+    $this->assertSame($categories, array_values(array_intersect($display_categories, $categories)));
+  }
+
+  /**
+   * Find the 'More' element for a category.
+   *
+   * @param string $category
+   *   The category.
+   *
+   * @return \Behat\Mink\Element\NodeElement|mixed|null
+   *   The 'More' element if it exists or NULL.
+   */
+  protected function findCategoryMoreElement($category) {
+    $details_element = $this->findCategoryDetails($category);
+    $this->assertInstanceOf(NodeElement::class, $details_element);
+    return $details_element->find('css', 'summary:contains(\'More\')');
+  }
+
 }
