diff --git a/modules/ui_patterns_layouts/src/Plugin/Layout/ComponentLayout.php b/modules/ui_patterns_layouts/src/Plugin/Layout/ComponentLayout.php
index ce2206bcb10a9ec4f186c7322e661396c7f74aad..f90ecd94d29da606b9fd86676645455a0d82e2d1 100644
--- a/modules/ui_patterns_layouts/src/Plugin/Layout/ComponentLayout.php
+++ b/modules/ui_patterns_layouts/src/Plugin/Layout/ComponentLayout.php
@@ -48,7 +48,7 @@ class ComponentLayout extends LayoutDefault implements ContainerFactoryPluginInt
    * @param mixed $plugin_definition
    *   The plugin implementation definition.
    * @param \Drupal\ui_patterns\Resolver\ChainContextEntityResolverInterface $chainContextEntityResolver
-   *   The context helper.
+   *   The context resolver.
    */
   public function __construct(
     array $configuration,
@@ -67,7 +67,7 @@ class ComponentLayout extends LayoutDefault implements ContainerFactoryPluginInt
       $configuration,
       $plugin_id,
       $plugin_definition,
-      $container->get('ui_patterns.chain_context_entity_resolver')
+      $container->get('ui_patterns.chain_context_entity_resolver'),
     );
     return $plugin;
   }
@@ -152,12 +152,6 @@ class ComponentLayout extends LayoutDefault implements ContainerFactoryPluginInt
     return $form;
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) : void {
-  }
-
   /**
    * {@inheritdoc}
    */
diff --git a/src/Element/ComponentForm.php b/src/Element/ComponentForm.php
index 89de156be82e3bc4792a0bb9af725fc172c5d587..220bbc0dc964067c376f9c1a86d8756348e93d02 100644
--- a/src/Element/ComponentForm.php
+++ b/src/Element/ComponentForm.php
@@ -6,6 +6,7 @@ use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Plugin\Context\Context;
 use Drupal\Core\Plugin\Context\ContextDefinition;
+use Drupal\Core\Render\RenderContext;
 
 /**
  * Provides a Component form builder element.
@@ -116,7 +117,7 @@ class ComponentForm extends ComponentFormBase {
       $component_selector_form = array_merge(self::buildComponentSelectorForm(
         $wrapper_id,
         $component_id
-      ), ["#ajax_url" => $element["#ajax_url"]]);
+      ), ["#ajax_url" => $element["#ajax_url"] ?? NULL]);
       $element["component_id"] = self::expandAjax($component_selector_form);
     }
     self::buildComponentForm(
@@ -223,7 +224,7 @@ class ComponentForm extends ComponentFormBase {
       '#component_id' => $component_id,
       '#source_contexts' => $element['#source_contexts'],
       '#tag_filter' => $element['#tag_filter'],
-      '#ajax_url' => $element['#ajax_url'],
+      '#ajax_url' => $element['#ajax_url'] ?? NULL,
       '#access' => $element['#render_slots'] ?? TRUE,
       '#default_value' => [
         'slots' => $element['#default_value']['slots'],
@@ -241,7 +242,7 @@ class ComponentForm extends ComponentFormBase {
       '#component_id' => $component_id,
       '#source_contexts' => $element['#source_contexts'],
       '#tag_filter' => $element['#tag_filter'],
-      '#ajax_url' => $element['#ajax_url'],
+      '#ajax_url' => $element['#ajax_url'] ?? NULL,
       '#access' => $element['#render_props'] ?? TRUE,
       '#default_value' => [
         'props' => $element['#default_value']['props'],
@@ -266,9 +267,33 @@ class ComponentForm extends ComponentFormBase {
    * Form element validation handler.
    */
   public static function validateFormElement(array &$element, FormStateInterface $form_state) : void {
-    $trigger_element = $form_state->getTriggeringElement();
-    if (isset($trigger_element['#ui_patterns']) === FALSE) {
-      $form_state->setValueForElement($element, $element['#value']);
+
+    try {
+      $trigger_element = $form_state->getTriggeringElement();
+      if (isset($trigger_element['#ui_patterns']) === FALSE) {
+        $build = [
+          '#type' => 'component',
+          '#component' => $element['#value']['component_id'] ?? $element['#component_id'],
+          '#ui_patterns' => $element['#value'],
+          '#source_contexts' => $element['#source_contexts'] ?? [],
+        ];
+        $context = new RenderContext();
+        $renderer = \Drupal::service("renderer");
+        $renderer->executeInRenderContext($context, function () use (&$build, $renderer) {
+          return $renderer->render($build);
+        });
+        $form_state->setValueForElement($element, $element['#value']);
+      }
+    }
+    catch (\Throwable $e) {
+      // If a component_id is we just show the error message instead
+      // of highlighting the whole form.
+      if (!empty($element['#component_id'])) {
+        $form_state->setErrorByName('', $e->getMessage());
+      }
+      else {
+        $form_state->setError($element['component_id'], $e->getMessage());
+      }
     }
   }