diff --git a/facets.module b/facets.module
index 07b5f9d..5308dcf 100644
--- a/facets.module
+++ b/facets.module
@@ -149,12 +149,6 @@ function facets_entity_presave(EntityInterface $entity) {
  */
 function facets_preprocess_block(&$variables) {
   if ($variables['configuration']['provider'] == 'facets') {
-    // Hide the block if it's empty.
-    if (!empty($variables['elements']['content'][0]['#attributes']['class']) && in_array('facet-hidden', $variables['elements']['content'][0]['#attributes']['class'])) {
-      // Add the Drupal class for hiding this for everyone, including screen
-      // readers. See hidden.module.css in the core system module.
-      $variables['attributes']['class'][] = 'hidden';
-    }
     if (!empty($variables['derivative_plugin_id'])) {
       $facet = Facet::load($variables['derivative_plugin_id']);
       $variables['attributes']['class'][] = 'block-facet--' . Html::cleanCssIdentifier($facet->getWidget()['type']);
diff --git a/facets.services.yml b/facets.services.yml
index bd4c6fb..a3c7d65 100644
--- a/facets.services.yml
+++ b/facets.services.yml
@@ -38,3 +38,8 @@ services:
     arguments: ['@plugin.manager.block']
     tags:
       - { name: event_subscriber }
+  facets.section_component_render:
+     class: Drupal\facets\EventSubscriber\SectionComponentRender
+     arguments: []
+     tags:
+       - { name: event_subscriber }
diff --git a/js/facets-views-ajax.js b/js/facets-views-ajax.js
index 01e10f1..a7b6125 100644
--- a/js/facets-views-ajax.js
+++ b/js/facets-views-ajax.js
@@ -39,10 +39,11 @@
 
         // Update view on summary block click.
         if (updateFacetsSummaryBlock() && (facetId === 'facets_summary_ajax')) {
-          $('[data-drupal-facets-summary-id=' + facetSettings.facets_summary_id + ']').children('ul').children('li').once().click(function (e) {
+          $('[data-drupal-facets-summary-id=' + facetSettings.facets_summary_id + ']').find('a').once('facets_summary_ajax_link').click(function (e) {
             e.preventDefault();
-            var facetLink = $(this).find('a');
-            updateFacetsView(facetLink.attr('href'), current_dom_id, view_path);
+            updateFacetsView($(this).attr('href'), current_dom_id, view_path);
+            // Remove clicked element, ajax callback will update the content.
+            $(this).parents('li').remove();
           });
         }
         // Update view on facet item click.
@@ -114,16 +115,8 @@
 
     // Update facets summary block.
     if (updateFacetsSummaryBlock()) {
-      var facet_summary_wrapper_id = $('[data-drupal-facets-summary-id=' + settings.facets_views_ajax.facets_summary_ajax.facets_summary_id + ']').attr('id');
-      var facet_summary_block_id = '';
-      if (facet_summary_wrapper_id.indexOf('--') !== -1) {
-        facet_summary_block_id = facet_summary_wrapper_id.substring(0, facet_summary_wrapper_id.indexOf('--')).replace('block-', '');
-      }
-      else {
-        facet_summary_block_id = facet_summary_wrapper_id.replace('block-', '');
-      }
       facet_settings.submit.update_summary_block = true;
-      facet_settings.submit.facet_summary_block_id = facet_summary_block_id;
+      facet_settings.submit.facet_summary_plugin_id = $('[data-drupal-facets-summary-id=' + settings.facets_views_ajax.facets_summary_ajax.facets_summary_id + ']').data('drupal-facets-summary-plugin-id');
       facet_settings.submit.facet_summary_wrapper_id = settings.facets_views_ajax.facets_summary_ajax.facets_summary_id;
     }
 
@@ -163,7 +156,8 @@
   };
 
   /**
-   * Overrides beforeSend to trigger facetblocks update on exposed filter change.
+   * Overrides beforeSend to trigger facetblocks update on exposed filter
+   * change.
    *
    * @param {XMLHttpRequest} xmlhttprequest
    *   Native Ajax object.
@@ -197,12 +191,12 @@
   }
 
   // Helper function to add exposed form data to facets url
-  var addExposedFiltersToFacetsUrl = function(href, view_name, view_display_id) {
+  var addExposedFiltersToFacetsUrl = function (href, view_name, view_display_id) {
     var $exposed_form = $('form#views-exposed-form-' + view_name.replace(/_/g, '-') + '-' + view_display_id.replace(/_/g, '-'));
 
     var params = Drupal.Views.parseQueryString(href);
 
-    $.each($exposed_form.serializeArray(), function() {
+    $.each($exposed_form.serializeArray(), function () {
       params[this.name] = this.value;
     });
 
diff --git a/modules/facets_summary/facets_summary.module b/modules/facets_summary/facets_summary.module
index bb8267f..fcaa0e4 100644
--- a/modules/facets_summary/facets_summary.module
+++ b/modules/facets_summary/facets_summary.module
@@ -38,6 +38,7 @@ function facets_summary_theme($existing, $type, $theme, $path) {
     'facets_summary_empty' => [
       'variables' => [
         'message' => '',
+        'wrapper_attributes' => [],
       ],
     ],
     'facets_summary_item_list' => [
diff --git a/modules/facets_summary/src/FacetsSummaryManager/DefaultFacetsSummaryManager.php b/modules/facets_summary/src/FacetsSummaryManager/DefaultFacetsSummaryManager.php
index 105c438..f75241e 100644
--- a/modules/facets_summary/src/FacetsSummaryManager/DefaultFacetsSummaryManager.php
+++ b/modules/facets_summary/src/FacetsSummaryManager/DefaultFacetsSummaryManager.php
@@ -116,7 +116,7 @@ class DefaultFacetsSummaryManager {
     $build = [
       '#theme' => 'facets_summary_item_list',
       '#facet_summary_id' => $facets_summary->id(),
-      '#attributes' => [
+      '#wrapper_attributes' => [
         'data-drupal-facets-summary-id' => $facets_summary->id(),
       ],
     ];
diff --git a/modules/facets_summary/src/Plugin/Block/FacetsSummaryBlock.php b/modules/facets_summary/src/Plugin/Block/FacetsSummaryBlock.php
index 5b9255a..55b0252 100644
--- a/modules/facets_summary/src/Plugin/Block/FacetsSummaryBlock.php
+++ b/modules/facets_summary/src/Plugin/Block/FacetsSummaryBlock.php
@@ -97,6 +97,8 @@ class FacetsSummaryBlock extends BlockBase implements FacetsSummaryBlockInterfac
       ];
     }
 
+    $build['#wrapper_attributes']['data-drupal-facets-summary-plugin-id'] = $this->getPluginId();
+
     /** @var \Drupal\views\ViewExecutable $view */
     if ($view = $facets_summary->getFacetSource()->getViewsDisplay()) {
       $build['#attached']['drupalSettings']['facets_views_ajax'] = [
diff --git a/modules/facets_summary/src/Plugin/facets_summary/processor/ShowTextWhenEmptyProcessor.php b/modules/facets_summary/src/Plugin/facets_summary/processor/ShowTextWhenEmptyProcessor.php
index 0c4f1f7..613a8f0 100644
--- a/modules/facets_summary/src/Plugin/facets_summary/processor/ShowTextWhenEmptyProcessor.php
+++ b/modules/facets_summary/src/Plugin/facets_summary/processor/ShowTextWhenEmptyProcessor.php
@@ -3,6 +3,7 @@
 namespace Drupal\facets_summary\Plugin\facets_summary\processor;
 
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Template\Attribute;
 use Drupal\facets_summary\FacetsSummaryInterface;
 use Drupal\facets_summary\Processor\BuildProcessorInterface;
 use Drupal\facets_summary\Processor\ProcessorPluginBase;
@@ -34,7 +35,7 @@ class ShowTextWhenEmptyProcessor extends ProcessorPluginBase implements BuildPro
     }, $facets));
 
     // No items are found, so we should return the empty summary.
-    if (!isset($build['#items']) || $results_count === 0) {
+    if (empty($build['#items']) || $results_count === 0) {
       return [
         '#theme' => 'facets_summary_empty',
         '#message' => [
@@ -42,6 +43,7 @@ class ShowTextWhenEmptyProcessor extends ProcessorPluginBase implements BuildPro
           '#text' => $config['text']['value'],
           '#format' => $config['text']['format'],
         ],
+        '#wrapper_attributes' => new Attribute($build['#wrapper_attributes']),
       ];
     }
 
diff --git a/modules/facets_summary/templates/facets-summary-empty.html.twig b/modules/facets_summary/templates/facets-summary-empty.html.twig
index 34d3699..e98d508 100644
--- a/modules/facets_summary/templates/facets-summary-empty.html.twig
+++ b/modules/facets_summary/templates/facets-summary-empty.html.twig
@@ -6,6 +6,9 @@
  * Available variables:
  * - message: A configurable formatted message to be shown when there are no
  *   results.
+ * - wrapper_attributes: HTML attributes to be applied
  */
 #}
-<span class="source-summary-empty">{{ message }}</span>
+<div{{ wrapper_attributes }}>
+    <span class="source-summary-empty">{{ message }}</span>
+</div>
diff --git a/modules/facets_summary/templates/facets-summary-item-list.html.twig b/modules/facets_summary/templates/facets-summary-item-list.html.twig
index 3887bc3..a4e6371 100644
--- a/modules/facets_summary/templates/facets-summary-item-list.html.twig
+++ b/modules/facets_summary/templates/facets-summary-item-list.html.twig
@@ -24,18 +24,21 @@
 {% if context.list_style %}
   {%- set attributes = attributes.addClass('item-list__' ~ context.list_style) %}
 {% endif %}
+
 {% if items or empty %}
-  {%- if title is not empty -%}
+  {% if title is not empty %}
     <h3>{{ title }}</h3>
-  {%- endif -%}
+  {% endif %}
+{% endif %}
 
-  {%- if items -%}
+<div{{ wrapper_attributes }}>
+  {% if items %}
     <{{ list_type }}{{ attributes }}>
-      {%- for item in items -%}
-        <li{{ item.attributes }}>{{ item.value }}</li>
-      {%- endfor -%}
+    {% for item in items %}
+      <li{{ item.attributes }}>{{ item.value }}</li>
+    {% endfor %}
     </{{ list_type }}>
-  {%- else -%}
-    {{- empty -}}
-  {%- endif -%}
-{%- endif %}
+  {% elseif empty is not empty %}
+    <span class="source-summary-empty">{{ empty }}</span>
+  {% endif %}
+</div>
diff --git a/modules/facets_summary/tests/src/Unit/Plugin/Processor/ShowTextWhenEmptyProcessorTest.php b/modules/facets_summary/tests/src/Unit/Plugin/Processor/ShowTextWhenEmptyProcessorTest.php
index eb1a22e..68fdede 100644
--- a/modules/facets_summary/tests/src/Unit/Plugin/Processor/ShowTextWhenEmptyProcessorTest.php
+++ b/modules/facets_summary/tests/src/Unit/Plugin/Processor/ShowTextWhenEmptyProcessorTest.php
@@ -27,7 +27,7 @@ class ShowTextWhenEmptyProcessorTest extends UnitTestCase {
   /**
    * {@inheritdoc}
    */
-  public function setUp() {
+  public function setUp(): void {
     parent::setUp();
     $string_translation = $this->prophesize(TranslationInterface::class);
 
@@ -65,7 +65,15 @@ class ShowTextWhenEmptyProcessorTest extends UnitTestCase {
     $summary = new FacetsSummary([], 'facets_summary');
     $summary->setFacetSourceId('foo');
 
-    $result = $this->processor->build($summary, ['foo'], []);
+    $build = [
+      'foo' => 'bar',
+      '#wrapper_attributes' => [
+        'class' => [
+          $this->randomMachineName(),
+        ]
+      ]
+    ];
+    $result = $this->processor->build($summary, $build, []);
     $this->assertSame('array', gettype($result));
     $this->assertArrayHasKey('#theme', $result);
     $this->assertEquals('facets_summary_empty', $result['#theme']);
@@ -78,7 +86,7 @@ class ShowTextWhenEmptyProcessorTest extends UnitTestCase {
       ],
     ];
     $this->processor->setConfiguration($configuration);
-    $result = $this->processor->build($summary, ['foo'], []);
+    $result = $this->processor->build($summary, $build, []);
     $this->assertEquals('llama', $result['#message']['#text']);
   }
 
@@ -91,7 +99,14 @@ class ShowTextWhenEmptyProcessorTest extends UnitTestCase {
     $summary = new FacetsSummary([], 'facets_summary');
     $summary->setFacetSourceId('foo');
 
-    $build = ['#items' => []];
+    $build = [
+      '#items' => [],
+      '#wrapper_attributes' => [
+        'class' => [
+          $this->randomMachineName(),
+        ]
+      ]
+    ];
     $result = $this->processor->build($summary, $build, []);
     $this->assertSame('array', gettype($result));
     $this->assertArrayHasKey('#theme', $result);
@@ -111,7 +126,14 @@ class ShowTextWhenEmptyProcessorTest extends UnitTestCase {
     $summary = new FacetsSummary([], 'facets_summary');
     $summary->setFacetSourceId('foo');
 
-    $build = ['#items' => []];
+    $build = [
+      '#items' => [],
+      '#wrapper_attributes' => [
+        'class' => [
+          $this->randomMachineName(),
+        ]
+      ]
+    ];
     $this->processor->setConfiguration(['text' => ['value' => 'Owl', 'format' => 'llama']]);
     $result = $this->processor->build($summary, $build, []);
     $this->assertSame('array', gettype($result));
diff --git a/src/Controller/FacetBlockAjaxController.php b/src/Controller/FacetBlockAjaxController.php
index 8e5613d..3f38e1f 100644
--- a/src/Controller/FacetBlockAjaxController.php
+++ b/src/Controller/FacetBlockAjaxController.php
@@ -5,6 +5,7 @@ namespace Drupal\facets\Controller;
 use Drupal\Core\Ajax\AjaxResponse;
 use Drupal\Core\Ajax\InvokeCommand;
 use Drupal\Core\Ajax\ReplaceCommand;
+use Drupal\Core\Block\BlockManager;
 use Drupal\Core\Controller\ControllerBase;
 use Drupal\Core\Path\CurrentPathStack;
 use Drupal\Core\PathProcessor\PathProcessorManager;
@@ -63,6 +64,13 @@ class FacetBlockAjaxController extends ControllerBase {
    */
   protected $currentRouteMatch;
 
+  /**
+   * The block manager service.
+   *
+   * @var \Drupal\Core\Block\BlockManager
+   */
+  protected $blockManager;
+
   /**
    * Constructs a FacetBlockAjaxController object.
    *
@@ -76,14 +84,20 @@ class FacetBlockAjaxController extends ControllerBase {
    *   The path processor manager.
    * @param \Drupal\Core\Routing\CurrentRouteMatch $currentRouteMatch
    *   The current route match service.
+   * @param \Drupal\Core\Block\BlockManager $blockManager
+   *   The block manager service.
+   *
+   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
+   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
    */
-  public function __construct(RendererInterface $renderer, CurrentPathStack $currentPath, RouterInterface $router, PathProcessorManager $pathProcessor, CurrentRouteMatch $currentRouteMatch) {
+  public function __construct(RendererInterface $renderer, CurrentPathStack $currentPath, RouterInterface $router, PathProcessorManager $pathProcessor, CurrentRouteMatch $currentRouteMatch, BlockManager $blockManager) {
     $this->storage = $this->entityTypeManager()->getStorage('block');
     $this->renderer = $renderer;
     $this->currentPath = $currentPath;
     $this->router = $router;
     $this->pathProcessor = $pathProcessor;
     $this->currentRouteMatch = $currentRouteMatch;
+    $this->blockManager = $blockManager;
   }
 
   /**
@@ -95,7 +109,8 @@ class FacetBlockAjaxController extends ControllerBase {
       $container->get('path.current'),
       $container->get('router'),
       $container->get('path_processor_manager'),
-      $container->get('current_route_match')
+      $container->get('current_route_match'),
+      $container->get('plugin.manager.block')
     );
   }
 
@@ -140,6 +155,7 @@ class FacetBlockAjaxController extends ControllerBase {
 
     // Build the facets blocks found for the current request and update.
     foreach ($facets_blocks as $block_id => $block_selector) {
+      $block_view = '';
       $block_entity = $this->storage->load($block_id);
 
       if ($block_entity) {
@@ -147,7 +163,20 @@ class FacetBlockAjaxController extends ControllerBase {
         $block_view = $this->entityTypeManager
           ->getViewBuilder('block')
           ->view($block_entity);
-
+      }
+      else {
+        $instance = $this->blockManager->createInstance($block_id);
+        if ($instance) {
+          $block_view = $instance->build();
+          if (!empty($block_view[0]['#facet']) || !empty($block_view[0][0]['#facet'])) {
+            /** @var \Drupal\facets\Entity\Facet $facet */
+            $facet = !empty($block_view[0]['#facet']) ? $block_view[0]['#facet'] : $block_view[0][0]['#facet'];
+            $widget_type = $facet->get('widget')['type'];
+            $block_selector .= ' .facets-widget-' . $widget_type;
+          }
+        }
+      }
+      if ($block_view) {
         $block_view = (string) $this->renderer->renderPlain($block_view);
         $response->addCommand(new ReplaceCommand($block_selector, $block_view));
       }
@@ -158,18 +187,18 @@ class FacetBlockAjaxController extends ControllerBase {
     // Update filter summary block.
     $update_summary_block = $request->request->get('update_summary_block');
     if ($update_summary_block) {
-      $facet_summary_block_id = $request->request->get('facet_summary_block_id');
+      $block_view = NULL;
+      $facet_summary_plugin_id = $request->request->get('facet_summary_plugin_id');
       $facet_summary_wrapper_id = $request->request->get('facet_summary_wrapper_id');
-      $facet_summary_block_id = str_replace('-', '_', $facet_summary_block_id);
-
-      if ($facet_summary_block_id) {
-        $block_entity = $this->storage->load($facet_summary_block_id);
-        $block_view = $this->entityTypeManager
-          ->getViewBuilder('block')
-          ->view($block_entity);
-        $block_view = (string) $this->renderer->renderPlain($block_view);
-
-        $response->addCommand(new ReplaceCommand('[data-drupal-facets-summary-id=' . $facet_summary_wrapper_id . ']', $block_view));
+      if (!empty($facet_summary_plugin_id)) {
+        $instance = $this->blockManager->createInstance($facet_summary_plugin_id);
+        if ($instance) {
+          $block_view = $instance->build();
+        }
+        if ($block_view) {
+          $block_view = (string) $this->renderer->renderPlain($block_view);
+          $response->addCommand(new ReplaceCommand('[data-drupal-facets-summary-id=' . $facet_summary_wrapper_id . ']', $block_view));
+        }
       }
     }
 
diff --git a/src/EventSubscriber/SectionComponentRender.php b/src/EventSubscriber/SectionComponentRender.php
new file mode 100644
index 0000000..2e7bb41
--- /dev/null
+++ b/src/EventSubscriber/SectionComponentRender.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace Drupal\facets\EventSubscriber;
+
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Drupal\layout_builder\Event\SectionComponentBuildRenderArrayEvent;
+
+/**
+ * Class SectionComponentRender.
+ */
+class SectionComponentRender implements EventSubscriberInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getSubscribedEvents() {
+    $events['section_component.build.render_array'] = ['onBuildRender'];
+
+    return $events;
+  }
+
+  /**
+   * Adds block classes to section component.
+   *
+   * @param \Drupal\layout_builder\Event\SectionComponentBuildRenderArrayEvent $event
+   *   The section component render event.
+   */
+  public function onBuildRender(SectionComponentBuildRenderArrayEvent $event) {
+    $build = $event->getBuild();
+    if (!empty($build) && $build['#base_plugin_id'] === 'facet_block') {
+      $attributes = isset($build['#attributes']) ? $build['#attributes'] : [];
+      if (empty($build['content']['#attributes'])) {
+        $build['content']['#attributes'] = [];
+      }
+      $build['#attributes'] = array_merge($build['content']['#attributes'], $attributes);
+      $event->setBuild($build);
+    }
+  }
+
+}
diff --git a/src/Plugin/Block/FacetBlock.php b/src/Plugin/Block/FacetBlock.php
index 676c573..049b004 100644
--- a/src/Plugin/Block/FacetBlock.php
+++ b/src/Plugin/Block/FacetBlock.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\facets\Plugin\Block;
 
+use Drupal\Component\Utility\Html;
 use Drupal\Core\Block\BlockBase;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
@@ -107,9 +108,11 @@ class FacetBlock extends BlockBase implements ContainerFactoryPluginInterface {
         // The configuration block id isn't always set in the configuration.
         if (isset($this->configuration['block_id'])) {
           $build['#attributes']['class'][] = 'js-facet-block-id-' . $this->configuration['block_id'];
+          $build['#attributes']['id'] = Html::getUniqueId($this->configuration['block_id']);
         }
         else {
           $build['#attributes']['class'][] = 'js-facet-block-id-' . $this->pluginId;
+          $build['#attributes']['id'] = Html::getUniqueId($this->pluginId);
         }
       }
     }
