diff --git a/config/schema/webform_views.schema.yml b/config/schema/webform_views.schema.yml
index 3d026d1..748074c 100644
--- a/config/schema/webform_views.schema.yml
+++ b/config/schema/webform_views.schema.yml
@@ -1,3 +1,7 @@
 # Schema definition for select filter.
 views.filter.webform_submission_select_filter:
   type: views.filter.in_operator
+
+# Schema definition for composite field filter.
+views.filter.webform_submission_composite_field_filter:
+  type: views.filter.string
diff --git a/src/Plugin/views/field/WebformSubmissionCompositeField.php b/src/Plugin/views/field/WebformSubmissionCompositeField.php
new file mode 100644
index 0000000..ebf1cf3
--- /dev/null
+++ b/src/Plugin/views/field/WebformSubmissionCompositeField.php
@@ -0,0 +1,50 @@
+<?php
+
+namespace Drupal\webform_views\Plugin\views\field;
+
+use Drupal\views\ResultRow;
+
+/**
+ * Webform submission composite field.
+ *
+ * @ViewsField("webform_submission_composite_field")
+ */
+class WebformSubmissionCompositeField extends WebformSubmissionField {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function render(ResultRow $values) {
+    /** @var \Drupal\webform\WebformSubmissionInterface $webform_submission */
+    $webform_submission = $this->getEntity($values);
+
+    if ($webform_submission->access('view')) {
+      $webform = $webform_submission->getWebform();
+
+      // Get format and element key.
+      $format = $this->options['webform_element_format'];
+      $element_key = $this->definition['webform_submission_field'];
+      $composite_key = $this->definition['webform_submission_property'];
+
+      // Get element and element handler plugin.
+      $element = $webform->getElement($element_key, TRUE);
+      if (!$element) {
+        return [];
+      }
+
+      // Set the format.
+      $element['#format'] = $format;
+
+      $composite_element = $element['#webform_composite_elements'][$composite_key];
+      $composite_element['#webform_key'] = $element['#webform_key'];
+      $options = [
+        'composite_key' => $composite_key,
+      ];
+
+      return $this->webformElementManager->invokeMethod('formatHtml', $composite_element, $webform_submission, $options);
+    }
+
+    return [];
+  }
+
+}
diff --git a/src/Plugin/views/field/WebformSubmissionField.php b/src/Plugin/views/field/WebformSubmissionField.php
index 692ab3e..a61a4e2 100644
--- a/src/Plugin/views/field/WebformSubmissionField.php
+++ b/src/Plugin/views/field/WebformSubmissionField.php
@@ -85,9 +85,6 @@ class WebformSubmissionField extends FieldPluginBase {
     $webform_submission = $this->getEntity($values);
 
     if ($webform_submission->access('view')) {
-      /** @var \Drupal\webform\Plugin\WebformElementManagerInterface $element_manager */
-      $element_manager = \Drupal::service('plugin.manager.webform.element');
-
       $webform = $webform_submission->getWebform();
 
       // Get format and element key.
@@ -104,7 +101,7 @@ class WebformSubmissionField extends FieldPluginBase {
       $element['#format'] = $format;
 
       // Get element handler and get the element's HTML render array.
-      $element_handler = $element_manager->getElementInstance($element);
+      $element_handler = $this->webformElementManager->getElementInstance($element);
       return $element_handler->formatHtml($element, $webform_submission);
     }
 
diff --git a/src/Plugin/views/filter/WebformSubmissionCompositeFieldFilter.php b/src/Plugin/views/filter/WebformSubmissionCompositeFieldFilter.php
new file mode 100644
index 0000000..7477c9f
--- /dev/null
+++ b/src/Plugin/views/filter/WebformSubmissionCompositeFieldFilter.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Drupal\webform_views\Plugin\views\filter;
+
+/**
+ * Filter based on value of a composite of a webform submission.
+ *
+ * @ViewsFilter("webform_submission_composite_field_filter")
+ */
+class WebformSubmissionCompositeFieldFilter extends WebformSubmissionFieldFilter {
+
+  /**
+   * {@inheritdoc}
+   */
+  function operators() {
+    $operators = parent::operators();
+
+    // Replace all occurrences of "use the element type itself" with
+    // "textfield". At the moment we do not support more complex composites than
+    // plain text field.
+    foreach ($operators as $k => $v) {
+      if ($operators[$k]['webform_views_element_type'] == WebformSubmissionFieldFilter::ELEMENT_TYPE) {
+        $operators[$k]['webform_views_element_type'] = 'textfield';
+      }
+    }
+
+    return $operators;
+  }
+
+}
diff --git a/src/WebformElementViews/WebformCompositeViews.php b/src/WebformElementViews/WebformCompositeViews.php
new file mode 100644
index 0000000..70b2f36
--- /dev/null
+++ b/src/WebformElementViews/WebformCompositeViews.php
@@ -0,0 +1,107 @@
+<?php
+
+namespace Drupal\webform_views\WebformElementViews;
+
+use Drupal\Component\Utility\Html;
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+use Drupal\webform\Plugin\WebformElementInterface;
+use Drupal\webform\WebformInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Default webform views handler for composite webform elements.
+ */
+class WebformCompositeViews extends WebformElementViewsAbstract {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getViewsData($element, WebformInterface $webform) {
+    $data = parent::getViewsData($element, $webform);
+
+    // Additionally enrich the data with sub-properties of this composite
+    // element.
+    $table_alias = 'webform_submission_field_' . $webform->id() . '_' . $element['#webform_key'];
+    $element_title = (isset($element['#title']) && $element['#title']) ? $element['#title'] : $element['#webform_key'];
+    $element_plugin = $this->webformElementManager->getElementInstance($element);
+
+    if (isset($element['#webform_composite_elements'])) {
+      $composite_elements = array_keys($element['#webform_composite_elements']);
+      foreach ($composite_elements as $composite_key) {
+        $data[$table_alias . '__' . $composite_key]['table']['group'] = $this->t('Webform @webform submission data', [
+          '@webform' => $webform->label(),
+        ]);
+
+        $data[$table_alias . '__' . $composite_key]['table']['join'][$this->entityType->getBaseTable()] = [
+          'table' => 'webform_submission_data',
+          'field' => 'sid',
+          'left_field' => 'sid',
+          'extra' => [
+            ['field' => 'name', 'value' => $element['#webform_key']],
+            ['field' => 'property', 'value' => $composite_key],
+          ],
+        ];
+
+        $title = $element_title . ': ' . $element['#webform_composite_elements'][$composite_key]['#title'];
+        $data[$table_alias . '__' . $composite_key]['webform_submission_value'] = [
+          'title' => Html::escape($title),
+          'help' => $this->t('Value of the field %field property in webform %webform submission.', [
+            '%field' => $element_title,
+            '%webform' => $webform->label(),
+          ]),
+        ];
+
+        foreach ($this->getCompositeViewsData($element_plugin, $element, $composite_key) as $k => $v) {
+          $v += [
+            'webform_id' => $webform->id(),
+            'webform_submission_field' => $element['#webform_key'],
+            'webform_submission_property' => $composite_key,
+          ];
+          $data[$table_alias . '__' . $composite_key]['webform_submission_value'][$k] = $v;
+        }
+      }
+    }
+
+    return $data;
+  }
+
+  /**
+   * Generate views data for a given composite key of a webform element.
+   *
+   * @param \Drupal\webform\Plugin\WebformElementInterface $element_plugin
+   *   Webform element plugin whose views data definition is requested
+   * @param array $element
+   *   Webform element whose views data definition is requested
+   * @param string $composite_key
+   *   Composite key for which views data to generate
+   *
+   * @return array
+   *   Views data definition array that corresponds to the given webform
+   *   composite key
+   */
+  protected function getCompositeViewsData(WebformElementInterface $element_plugin, array $element, $composite_key) {
+    $views_data = [];
+
+    $views_data['field'] = [
+      'id' => 'webform_submission_composite_field',
+      'real field' => $this->entityType->getKey('id'),
+      'click sortable' => TRUE,
+      'multiple' => $element_plugin->hasMultipleValues($element),
+    ];
+
+    $views_data['sort'] = [
+      'id' => 'webform_submission_field_sort',
+      'real field' => 'value',
+    ];
+
+    $views_data['filter'] = [
+      'id' => 'webform_submission_composite_field_filter',
+      'real field' => 'value',
+    ];
+
+    return $views_data;
+  }
+
+}
diff --git a/webform_views.module b/webform_views.module
index c373616..89ffb04 100644
--- a/webform_views.module
+++ b/webform_views.module
@@ -55,6 +55,9 @@ function webform_views_webform_element_info_alter(array &$elements) {
     if (is_subclass_of($v['class'], \Drupal\webform\Plugin\WebformElement\WebformManagedFileBase::class, TRUE)) {
       $views_handler = \Drupal\webform_views\WebformElementViews\WebformManagedFileViews::class;
     }
+    elseif (is_subclass_of($v['class'], \Drupal\webform\Plugin\WebformElement\WebformCompositeBase::class)) {
+      $views_handler = \Drupal\webform_views\WebformElementViews\WebformCompositeViews::class;
+    }
 
     switch ($k) {
       case 'select':
