diff --git a/modules/webform_ui/src/Tests/WebformUiElementTest.php b/modules/webform_ui/src/Tests/WebformUiElementTest.php
index 9132b3fc..1cf6a0c1 100644
--- a/modules/webform_ui/src/Tests/WebformUiElementTest.php
+++ b/modules/webform_ui/src/Tests/WebformUiElementTest.php
@@ -162,7 +162,7 @@ class WebformUiElementTest extends WebformTestBase {
    * Tests permissions.
    */
   public function testPermissions() {
-    $webform = $this->createWebform();
+    $webform = Webform::load('contact');
 
     // Check source page access not visible to user with 'administer webform'
     // permission.
diff --git a/src/Annotation/WebformElement.php b/src/Annotation/WebformElement.php
index 3d18e25a..bef90b9d 100644
--- a/src/Annotation/WebformElement.php
+++ b/src/Annotation/WebformElement.php
@@ -81,13 +81,6 @@ class WebformElement extends Plugin {
   public $multiline = FALSE;
 
   /**
-   * Flag that defines multiple (value) element.
-   *
-   * @var bool
-   */
-  public $multiple = FALSE;
-
-  /**
    * Flag that defines composite element.
    *
    * @var bool
diff --git a/src/Plugin/WebformElement/Checkboxes.php b/src/Plugin/WebformElement/Checkboxes.php
index 2da22eb0..3e7c2d6a 100644
--- a/src/Plugin/WebformElement/Checkboxes.php
+++ b/src/Plugin/WebformElement/Checkboxes.php
@@ -13,7 +13,6 @@ use Drupal\webform\WebformSubmissionInterface;
  *   label = @Translation("Checkboxes"),
  *   description = @Translation("Provides a form element for a set of checkboxes, with the ability to enter a custom value."),
  *   category = @Translation("Options elements"),
- *   multiple = TRUE,
  * )
  */
 class Checkboxes extends OptionsBase {
@@ -31,6 +30,20 @@ class Checkboxes extends OptionsBase {
   /**
    * {@inheritdoc}
    */
+  public function supportsMultipleValues() {
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function hasMultipleValues(array $element) {
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function prepare(array &$element, WebformSubmissionInterface $webform_submission) {
     parent::prepare($element, $webform_submission);
     $element['#element_validate'][] = [get_class($this), 'validateMultipleOptions'];
diff --git a/src/Plugin/WebformElement/EntityAutocomplete.php b/src/Plugin/WebformElement/EntityAutocomplete.php
index 1283572b..e80737c4 100644
--- a/src/Plugin/WebformElement/EntityAutocomplete.php
+++ b/src/Plugin/WebformElement/EntityAutocomplete.php
@@ -15,7 +15,6 @@ use Drupal\webform\WebformSubmissionInterface;
  *   label = @Translation("Entity autocomplete"),
  *   description = @Translation("Provides a form element to select an entity reference using an autocompletion."),
  *   category = @Translation("Entity reference elements"),
- *   multiple = TRUE,
  * )
  */
 class EntityAutocomplete extends WebformElementBase implements WebformEntityReferenceInterface {
@@ -55,9 +54,21 @@ class EntityAutocomplete extends WebformElementBase implements WebformEntityRefe
   /**
    * {@inheritdoc}
    */
+  public function supportsMultipleValues() {
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function hasMultipleValues(array $element) {
     if ($this->hasProperty('tags')) {
-      return (!empty($element['#tags'])) ? TRUE : FALSE;
+      if (isset($element['#tags'])) {
+        return $element['#tags'];
+      }
+      else {
+        return $this->getDefaultProperty('tags');
+      }
     }
     else {
       return parent::hasMultipleValues($element);
diff --git a/src/Plugin/WebformElement/ManagedFile.php b/src/Plugin/WebformElement/ManagedFile.php
index ba3c3ec6..42264e23 100644
--- a/src/Plugin/WebformElement/ManagedFile.php
+++ b/src/Plugin/WebformElement/ManagedFile.php
@@ -11,7 +11,6 @@ namespace Drupal\webform\Plugin\WebformElement;
  *   label = @Translation("File"),
  *   description = @Translation("Provides a form element for uploading and saving a file."),
  *   category = @Translation("File upload elements"),
- *   multiple = TRUE,
  *   states_wrapper = TRUE,
  * )
  */
diff --git a/src/Plugin/WebformElement/OptionsBase.php b/src/Plugin/WebformElement/OptionsBase.php
index abf20d73..52c3647a 100644
--- a/src/Plugin/WebformElement/OptionsBase.php
+++ b/src/Plugin/WebformElement/OptionsBase.php
@@ -131,24 +131,6 @@ abstract class OptionsBase extends WebformElementBase {
   /**
    * {@inheritdoc}
    */
-  public function hasMultipleValues(array $element) {
-    if ($this->hasProperty('multiple')) {
-      if (isset($element['#multiple'])) {
-        return $element['#multiple'];
-      }
-      else {
-        $default_property = $this->getDefaultProperties();
-        return $default_property['multiple'];
-      }
-    }
-    else {
-      return parent::hasMultipleValues($element);
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function isMultiline(array $element) {
     $format = $this->getItemsFormat($element);
     if (in_array($format, ['ol', 'ul'])) {
diff --git a/src/Plugin/WebformElement/Select.php b/src/Plugin/WebformElement/Select.php
index f40ab18e..8ab7fc9b 100644
--- a/src/Plugin/WebformElement/Select.php
+++ b/src/Plugin/WebformElement/Select.php
@@ -14,7 +14,6 @@ use Drupal\webform\WebformSubmissionInterface;
  *   label = @Translation("Select"),
  *   description = @Translation("Provides a form element for a drop-down menu or scrolling selection box."),
  *   category = @Translation("Options elements"),
- *   multiple = TRUE,
  * )
  */
 class Select extends OptionsBase {
@@ -35,6 +34,13 @@ class Select extends OptionsBase {
   /**
    * {@inheritdoc}
    */
+  public function supportsMultipleValues() {
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function prepare(array &$element, WebformSubmissionInterface $webform_submission) {
     parent::prepare($element, $webform_submission);
     if (empty($element['#multiple'])) {
diff --git a/src/Plugin/WebformElement/TableSelect.php b/src/Plugin/WebformElement/TableSelect.php
index fa6266f9..c38f7d3c 100644
--- a/src/Plugin/WebformElement/TableSelect.php
+++ b/src/Plugin/WebformElement/TableSelect.php
@@ -11,7 +11,6 @@ namespace Drupal\webform\Plugin\WebformElement;
  *   label = @Translation("Table select"),
  *   description = @Translation("Provides a form element for a table with radios or checkboxes in left column."),
  *   category = @Translation("Options elements"),
- *   multiple = TRUE,
  *   states_wrapper = TRUE,
  * )
  */
@@ -34,6 +33,13 @@ class TableSelect extends OptionsBase {
   /**
    * {@inheritdoc}
    */
+  public function supportsMultipleValues() {
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getElementSelectorOptions(array $element) {
     return $this->getTableSelectElementSelectorOptions($element);
   }
diff --git a/src/Plugin/WebformElement/WebformAudioFile.php b/src/Plugin/WebformElement/WebformAudioFile.php
index a4c59a42..098dedc1 100644
--- a/src/Plugin/WebformElement/WebformAudioFile.php
+++ b/src/Plugin/WebformElement/WebformAudioFile.php
@@ -10,7 +10,6 @@ namespace Drupal\webform\Plugin\WebformElement;
  *   label = @Translation("Audio file"),
  *   description = @Translation("Provides a form element for uploading and saving an audio file."),
  *   category = @Translation("File upload elements"),
- *   multiple = TRUE,
  *   states_wrapper = TRUE,
  * )
  */
diff --git a/src/Plugin/WebformElement/WebformCheckboxesOther.php b/src/Plugin/WebformElement/WebformCheckboxesOther.php
index 4ac70e01..e5db0c24 100644
--- a/src/Plugin/WebformElement/WebformCheckboxesOther.php
+++ b/src/Plugin/WebformElement/WebformCheckboxesOther.php
@@ -12,7 +12,6 @@ use Drupal\webform\WebformSubmissionInterface;
  *   label = @Translation("Checkboxes other"),
  *   description = @Translation("Provides a form element for a set of checkboxes."),
  *   category = @Translation("Options elements"),
- *   multiple = TRUE,
  * )
  */
 class WebformCheckboxesOther extends Checkboxes {
diff --git a/src/Plugin/WebformElement/WebformDocumentFile.php b/src/Plugin/WebformElement/WebformDocumentFile.php
index 3110ac9b..3fc72f47 100644
--- a/src/Plugin/WebformElement/WebformDocumentFile.php
+++ b/src/Plugin/WebformElement/WebformDocumentFile.php
@@ -10,7 +10,6 @@ namespace Drupal\webform\Plugin\WebformElement;
  *   label = @Translation("Document file"),
  *   description = @Translation("Provides a form element for uploading and saving a document."),
  *   category = @Translation("File upload elements"),
- *   multiple = TRUE,
  *   states_wrapper = TRUE,
  * )
  */
diff --git a/src/Plugin/WebformElement/WebformEntityCheckboxes.php b/src/Plugin/WebformElement/WebformEntityCheckboxes.php
index b0182066..ef27712e 100644
--- a/src/Plugin/WebformElement/WebformEntityCheckboxes.php
+++ b/src/Plugin/WebformElement/WebformEntityCheckboxes.php
@@ -10,7 +10,6 @@ namespace Drupal\webform\Plugin\WebformElement;
  *   label = @Translation("Entity checkboxes"),
  *   description = @Translation("Provides a form element to select multiple entity references using checkboxes."),
  *   category = @Translation("Entity reference elements"),
- *   multiple = TRUE,
  * )
  */
 class WebformEntityCheckboxes extends Checkboxes implements WebformEntityReferenceInterface {
diff --git a/src/Plugin/WebformElement/WebformEntityReferenceTrait.php b/src/Plugin/WebformElement/WebformEntityReferenceTrait.php
index c327c503..56ecf417 100644
--- a/src/Plugin/WebformElement/WebformEntityReferenceTrait.php
+++ b/src/Plugin/WebformElement/WebformEntityReferenceTrait.php
@@ -179,7 +179,11 @@ trait WebformEntityReferenceTrait {
    * {@inheritdoc}
    */
   public function buildExportHeader(array $element, array $options) {
-    if (!$this->hasMultipleValues($element) && $options['entity_reference_format'] == 'link') {
+    if ($this->hasMultipleValues($element)) {
+      return parent::buildExportHeader($element, $options);
+    }
+
+    if ($options['entity_reference_format'] == 'link') {
       if ($options['header_format'] == 'label') {
         $header = [
           (string) $this->t('ID'),
@@ -202,8 +206,7 @@ trait WebformEntityReferenceTrait {
    */
   public function buildExportRecord(array $element, $value, array $options) {
     if ($this->hasMultipleValues($element)) {
-      $element = ['#format' => 'text', '#format_items' => 'comma'] + $element;
-      return $this->formatTextItems($element, $value, $options);
+      return parent::buildExportRecord($element, $value, $options);
     }
 
     if ($options['entity_reference_format'] == 'link') {
diff --git a/src/Plugin/WebformElement/WebformEntitySelect.php b/src/Plugin/WebformElement/WebformEntitySelect.php
index ced9c655..b7718a4d 100644
--- a/src/Plugin/WebformElement/WebformEntitySelect.php
+++ b/src/Plugin/WebformElement/WebformEntitySelect.php
@@ -10,7 +10,6 @@ namespace Drupal\webform\Plugin\WebformElement;
  *   label = @Translation("Entity select"),
  *   description = @Translation("Provides a form element to select a single or multiple entity references using a select menu."),
  *   category = @Translation("Entity reference elements"),
- *   multiple = TRUE,
  * )
  */
 class WebformEntitySelect extends Select implements WebformEntityReferenceInterface {
diff --git a/src/Plugin/WebformElement/WebformImageFile.php b/src/Plugin/WebformElement/WebformImageFile.php
index 375f201e..1420b4c4 100644
--- a/src/Plugin/WebformElement/WebformImageFile.php
+++ b/src/Plugin/WebformElement/WebformImageFile.php
@@ -10,7 +10,6 @@ namespace Drupal\webform\Plugin\WebformElement;
  *   label = @Translation("Image file"),
  *   description = @Translation("Provides a form element for uploading and saving an image file."),
  *   category = @Translation("File upload elements"),
- *   multiple = TRUE,
  *   states_wrapper = TRUE,
  * )
  */
diff --git a/src/Plugin/WebformElement/WebformManagedFileBase.php b/src/Plugin/WebformElement/WebformManagedFileBase.php
index 5c51abc0..2a8d0758 100644
--- a/src/Plugin/WebformElement/WebformManagedFileBase.php
+++ b/src/Plugin/WebformElement/WebformManagedFileBase.php
@@ -42,8 +42,8 @@ abstract class WebformManagedFileBase extends WebformElementBase {
   /**
    * {@inheritdoc}
    */
-  public function hasMultipleValues(array $element) {
-    return (!empty($element['#multiple'])) ? TRUE : FALSE;
+  public function supportsMultipleValues() {
+    return TRUE;
   }
 
   /**
diff --git a/src/Plugin/WebformElement/WebformSelectOther.php b/src/Plugin/WebformElement/WebformSelectOther.php
index 3915eb5b..8ccd05bb 100644
--- a/src/Plugin/WebformElement/WebformSelectOther.php
+++ b/src/Plugin/WebformElement/WebformSelectOther.php
@@ -10,7 +10,6 @@ namespace Drupal\webform\Plugin\WebformElement;
  *   label = @Translation("Select other"),
  *   description = @Translation("Provides a form element for a drop-down menu or scrolling selection box, with the ability to enter a custom value."),
  *   category = @Translation("Options elements"),
- *   multiple = TRUE,
  * )
  */
 class WebformSelectOther extends Select {
diff --git a/src/Plugin/WebformElement/WebformTableSelectSort.php b/src/Plugin/WebformElement/WebformTableSelectSort.php
index f7638dd7..1a1bbdb8 100644
--- a/src/Plugin/WebformElement/WebformTableSelectSort.php
+++ b/src/Plugin/WebformElement/WebformTableSelectSort.php
@@ -10,7 +10,6 @@ namespace Drupal\webform\Plugin\WebformElement;
  *   label = @Translation("Tableselect sort"),
  *   description = @Translation("Provides a form element for a table with radios or checkboxes in left column that can be sorted."),
  *   category = @Translation("Options elements"),
- *   multiple = TRUE,
  *   states_wrapper = TRUE,
  * )
  */
@@ -36,6 +35,20 @@ class WebformTableSelectSort extends OptionsBase {
   /**
    * {@inheritdoc}
    */
+  public function supportsMultipleValues() {
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function hasMultipleValues(array $element) {
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getItemDefaultFormat() {
     return 'ol';
   }
diff --git a/src/Plugin/WebformElement/WebformTableSort.php b/src/Plugin/WebformElement/WebformTableSort.php
index 03fc4d39..3a2db794 100644
--- a/src/Plugin/WebformElement/WebformTableSort.php
+++ b/src/Plugin/WebformElement/WebformTableSort.php
@@ -12,7 +12,6 @@ use Drupal\webform\WebformInterface;
  *   label = @Translation("Table sort"),
  *   description = @Translation("Provides a form element for a table of values that can be sorted."),
  *   category = @Translation("Options elements"),
- *   multiple = TRUE,
  *   states_wrapper = TRUE,
  * )
  */
@@ -37,6 +36,20 @@ class WebformTableSort extends OptionsBase {
   /**
    * {@inheritdoc}
    */
+  public function supportsMultipleValues() {
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function hasMultipleValues(array $element) {
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getItemDefaultFormat() {
     return 'ol';
   }
diff --git a/src/Plugin/WebformElement/WebformToggles.php b/src/Plugin/WebformElement/WebformToggles.php
index 6f485403..13ef2657 100644
--- a/src/Plugin/WebformElement/WebformToggles.php
+++ b/src/Plugin/WebformElement/WebformToggles.php
@@ -12,7 +12,6 @@ use Drupal\webform\WebformSubmissionInterface;
  *   label = @Translation("Toggles"),
  *   description = @Translation("Provides a form element for toggling multiple on/off states."),
  *   category = @Translation("Options elements"),
- *   multiple = TRUE,
  * )
  */
 class WebformToggles extends OptionsBase {
@@ -34,6 +33,20 @@ class WebformToggles extends OptionsBase {
   /**
    * {@inheritdoc}
    */
+  public function supportsMultipleValues() {
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function hasMultipleValues(array $element) {
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function prepare(array &$element, WebformSubmissionInterface $webform_submission) {
     parent::prepare($element, $webform_submission);
     $element['#element_validate'][] = [get_class($this), 'validateMultipleOptions'];
diff --git a/src/Plugin/WebformElement/WebformVideoFile.php b/src/Plugin/WebformElement/WebformVideoFile.php
index 69b930ef..3d2906b5 100644
--- a/src/Plugin/WebformElement/WebformVideoFile.php
+++ b/src/Plugin/WebformElement/WebformVideoFile.php
@@ -10,7 +10,6 @@ namespace Drupal\webform\Plugin\WebformElement;
  *   label = @Translation("Video file"),
  *   description = @Translation("Provides a form element for uploading and saving a video file."),
  *   category = @Translation("File upload elements"),
- *   multiple = TRUE,
  *   states_wrapper = TRUE,
  * )
  */
diff --git a/src/Tests/WebformAccessTest.php b/src/Tests/WebformAccessTest.php
index 817e1f97..0a78c180 100644
--- a/src/Tests/WebformAccessTest.php
+++ b/src/Tests/WebformAccessTest.php
@@ -12,6 +12,8 @@ use Drupal\webform\Entity\Webform;
  */
 class WebformAccessTest extends WebformTestBase {
 
+  use WebformTestCreationTrait;
+
   /**
    * Tests webform access rules.
    */
diff --git a/src/Tests/WebformPathTest.php b/src/Tests/WebformPathTest.php
index 9b4bfef8..b639b9e9 100644
--- a/src/Tests/WebformPathTest.php
+++ b/src/Tests/WebformPathTest.php
@@ -2,6 +2,9 @@
 
 namespace Drupal\webform\Tests;
 
+use Drupal\Core\Serialization\Yaml;
+use Drupal\webform\Entity\Webform;
+
 /**
  * Tests for webform path and page.
  *
@@ -15,7 +18,16 @@ class WebformPathTest extends WebformTestBase {
    * Tests YAML page and title.
    */
   public function testPaths() {
-    $webform = $this->createWebform();
+    $webform = Webform::create([
+      'langcode' => 'en',
+      'status' => TRUE,
+      'id' => 'test_paths',
+      'title' => 'test_paths',
+      'elements' => Yaml::encode([
+        'test' => ['#markup' => 'test']
+      ]),
+    ]);
+    $webform->save();
 
     // Check default system submit path.
     $this->drupalGet('webform/' . $webform->id());
diff --git a/src/Tests/WebformResultsExportTest.php b/src/Tests/WebformResultsExportTest.php
index bfa455b6..a13c9a0f 100644
--- a/src/Tests/WebformResultsExportTest.php
+++ b/src/Tests/WebformResultsExportTest.php
@@ -14,6 +14,8 @@ use Drupal\webform\Entity\WebformSubmission;
  */
 class WebformResultsExportTest extends WebformTestBase {
 
+  use WebformTestCreationTrait;
+
   /**
    * Modules to enable.
    *
diff --git a/src/Tests/WebformSubmissionAccessTest.php b/src/Tests/WebformSubmissionAccessTest.php
index 654e7b64..264a9520 100644
--- a/src/Tests/WebformSubmissionAccessTest.php
+++ b/src/Tests/WebformSubmissionAccessTest.php
@@ -9,6 +9,8 @@ namespace Drupal\webform\Tests;
  */
 class WebformSubmissionAccessTest extends WebformTestBase {
 
+  use WebformTestCreationTrait;
+
   /**
    * Tests webform submission access.
    */
diff --git a/src/Tests/WebformSubmissionListBuilderTest.php b/src/Tests/WebformSubmissionListBuilderTest.php
index f8650d17..defc8249 100644
--- a/src/Tests/WebformSubmissionListBuilderTest.php
+++ b/src/Tests/WebformSubmissionListBuilderTest.php
@@ -9,6 +9,8 @@ namespace Drupal\webform\Tests;
  */
 class WebformSubmissionListBuilderTest extends WebformTestBase {
 
+  use WebformTestCreationTrait;
+
   /**
    * Tests results.
    */
diff --git a/src/Tests/WebformSubmissionStorageTest.php b/src/Tests/WebformSubmissionStorageTest.php
index 4c67e02e..6576e227 100644
--- a/src/Tests/WebformSubmissionStorageTest.php
+++ b/src/Tests/WebformSubmissionStorageTest.php
@@ -2,7 +2,9 @@
 
 namespace Drupal\webform\Tests;
 
+use Drupal\Core\Serialization\Yaml;
 use Drupal\simpletest\WebTestBase;
+use Drupal\webform\Entity\Webform;
 use Drupal\webform\Entity\WebformSubmission;
 
 /**
@@ -43,7 +45,16 @@ class WebformSubmissionStorageTest extends WebTestBase {
     /** @var \Drupal\webform\WebformSubmissionStorageInterface $storage */
     $storage = \Drupal::entityTypeManager()->getStorage('webform_submission');
 
-    $webform = $this->createWebform();
+    // Create new webform.
+    $id = $this->randomMachineName(8);
+    $webform = Webform::create([
+      'langcode' => 'en',
+      'status' => TRUE,
+      'id' => $id,
+      'title' => $id,
+      'elements' => Yaml::encode(['test' => ['#markup' => 'test']]),
+    ]);
+    $webform->save();
 
     // Create 3 submissions for user1.
     $user1 = $this->drupalCreateUser();
diff --git a/src/Tests/WebformSubmissionTest.php b/src/Tests/WebformSubmissionTest.php
index 28d64b97..f3db238e 100644
--- a/src/Tests/WebformSubmissionTest.php
+++ b/src/Tests/WebformSubmissionTest.php
@@ -11,6 +11,8 @@ use Drupal\webform\Entity\WebformSubmission;
  */
 class WebformSubmissionTest extends WebformTestBase {
 
+  use WebformTestCreationTrait;
+
   /**
    * Tests webform submission entity.
    */
diff --git a/src/Tests/WebformTest.php b/src/Tests/WebformTest.php
index 9a5430e6..1c2e9907 100644
--- a/src/Tests/WebformTest.php
+++ b/src/Tests/WebformTest.php
@@ -9,6 +9,8 @@ namespace Drupal\webform\Tests;
  */
 class WebformTest extends WebformTestBase {
 
+  use WebformTestCreationTrait;
+
   /**
    * Tests webform entity.
    */
diff --git a/src/Tests/WebformTestCreationTrait.php b/src/Tests/WebformTestCreationTrait.php
new file mode 100644
index 00000000..809760ad
--- /dev/null
+++ b/src/Tests/WebformTestCreationTrait.php
@@ -0,0 +1,192 @@
+<?php
+
+namespace Drupal\simpletest;
+
+namespace Drupal\webform\Tests;
+
+use Drupal\Core\Serialization\Yaml;
+use Drupal\webform\Entity\Webform;
+use Drupal\webform\Entity\WebformSubmission;
+
+/**
+ * Provides methods to create webform and submissions based on default settings.
+ *
+ * This trait is meant to be used only by test classes.
+ */
+trait WebformTestCreationTrait {
+
+  /**
+   * Get nodes keyed by nid.
+   *
+   * @return \Drupal\node\NodeInterface[]
+   *   Associative array of nodes keyed by nid.
+   */
+  protected function getNodes() {
+    if (empty($this->nodes)) {
+      $this->drupalCreateContentType(['type' => 'page']);
+      for ($i = 0; $i < 3; $i++) {
+        $this->nodes[$i] = $this->drupalCreateNode(['type' => 'page', 'title' => 'Node ' . $i, 'status' => NODE_PUBLISHED]);
+        $this->drupalGet('node/' . $this->nodes[$i]->id());
+      }
+    }
+    return $this->nodes;
+  }
+
+  /**
+   * Create a webform with submissions.
+   *
+   * @param array|null $elements
+   *   (optional) Array of elements.
+   * @param array $settings
+   *   (optional) Webform settings.
+   *
+   * @return \Drupal\webform\WebformInterface
+   *   A webform.
+   */
+  protected function createWebform($elements = NULL, array $settings = []) {
+    if ($elements === NULL) {
+      $elements = [
+        'first_name' => [
+          '#type' => 'textfield',
+          '#title' => 'First name',
+        ],
+        'last_name' => [
+          '#type' => 'textfield',
+          '#title' => 'Last name',
+        ],
+        'sex' => [
+          '#type' => 'select',
+          '#title' => 'Sex',
+          '#options' => 'gender',
+        ],
+        'dob' => [
+          '#type' => 'date',
+          '#title' => 'Date of birth',
+          '#format' => 'l, F j, Y',
+        ],
+        'node' => [
+          '#type' => 'entity_autocomplete',
+          '#title' => 'Favorite node',
+          '#target_type' => 'node',
+        ],
+        'colors' => [
+          '#type' => 'checkboxes',
+          '#title' => 'Flag colors',
+          '#options' => [
+            'red' => 'Red',
+            'white' => 'White',
+            'blue' => 'Blue',
+          ],
+        ],
+        'likert' => [
+          '#type' => 'likert',
+          '#title' => 'Likert',
+          '#questions' => [
+            'q1' => 'Question 1',
+            'q2' => 'Question 2',
+            'q3' => 'Question 3',
+          ],
+          '#answers' => [
+            '1' => 'Answer 1',
+            '2' => 'Answer 2',
+            '3' => 'Answer 3',
+          ],
+        ],
+        'address' => [
+          '#type' => 'webform_address',
+          '#title' => 'Address',
+        ],
+      ];
+    }
+
+    $this->debug(Yaml::encode($elements));
+
+    // Create new webform.
+    $id = $this->randomMachineName(8);
+    $webform = Webform::create([
+      'langcode' => 'en',
+      'status' => TRUE,
+      'id' => $id,
+      'title' => $id,
+      'elements' => Yaml::encode($elements),
+      'settings' => $settings + Webform::getDefaultSettings(),
+    ]);
+    $webform->save();
+    return $webform;
+  }
+
+  /**
+   * Create a webform with submissions.
+   *
+   * @return array
+   *   Array containing the webform and submissions.
+   */
+  protected function createWebformWithSubmissions() {
+    $webform = $this->createWebform();
+
+    $nodes = $this->getNodes();
+
+    // Create some submissions.
+    $names = [
+      [
+        'George',
+        'Washington',
+        'Male',
+        '1732-02-22',
+        $nodes[0],
+        ['white'],
+        ['q1' => 1, 'q2' => 1, 'q3' => 1],
+        ['address' => '{Address}', 'city' => '{City}', 'state_province' => 'New York', 'country' => 'United States', 'postal_code' => '11111-1111'],
+      ],
+      [
+        'Abraham',
+        'Lincoln',
+        'Male',
+        '1809-02-12',
+        $nodes[1],
+        ['red', 'white', 'blue'],
+        ['q1' => 2, 'q2' => 2, 'q3' => 2],
+        ['address' => '{Address}', 'city' => '{City}', 'state_province' => 'New York', 'country' => 'United States', 'postal_code' => '11111-1111'],
+      ],
+      [
+        'Hillary',
+        'Clinton',
+        'Female',
+        '1947-10-26',
+        $nodes[2],
+        ['red'],
+        ['q1' => 2, 'q2' => 2, 'q3' => 2],
+        ['address' => '{Address}', 'city' => '{City}', 'state_province' => 'New York', 'country' => 'United States', 'postal_code' => '11111-1111'],
+      ],
+    ];
+    $sids = [];
+    foreach ($names as $name) {
+      $edit = [
+        'first_name' => $name[0],
+        'last_name' => $name[1],
+        'sex' => $name[2],
+        'dob' => $name[3],
+        'node' => $name[4]->label() . ' (' . $name[4]->id() . ')',
+      ];
+      foreach ($name[5] as $color) {
+        $edit["colors[$color]"] = $color;
+      }
+      foreach ($name[6] as $question => $answer) {
+        $edit["likert[$question]"] = $answer;
+      }
+      foreach ($name[7] as $composite_key => $composite_value) {
+        $edit["address[$composite_key]"] = $composite_value;
+      }
+      $sids[] = $this->postSubmission($webform, $edit);
+    }
+
+    // Change array keys to index instead of using entity ids.
+    $submissions = array_values(WebformSubmission::loadMultiple($sids));
+
+    $this->assert($webform instanceof Webform, 'Webform was created');
+    $this->assertEqual(count($submissions), 3, 'WebformSubmissions were created.');
+
+    return [$webform, $submissions];
+  }
+
+}
diff --git a/src/Tests/WebformTestTrait.php b/src/Tests/WebformTestTrait.php
index 48841699..ce9fef0a 100644
--- a/src/Tests/WebformTestTrait.php
+++ b/src/Tests/WebformTestTrait.php
@@ -2,13 +2,10 @@
 
 namespace Drupal\webform\Tests;
 
-use Drupal\Core\Serialization\Yaml;
 use Drupal\Component\Render\FormattableMarkup;
 use Drupal\Component\Utility\Unicode;
 use Drupal\Component\Utility\UrlHelper;
 use Drupal\filter\Entity\FilterFormat;
-use Drupal\webform\Entity\Webform;
-use Drupal\webform\Entity\WebformSubmission;
 use Drupal\webform\WebformInterface;
 
 /**
@@ -205,178 +202,6 @@ trait WebformTestTrait {
   }
 
   /**
-   * Get nodes keyed by nid.
-   *
-   * @return \Drupal\node\NodeInterface[]
-   *   Associative array of nodes keyed by nid.
-   */
-  protected function getNodes() {
-    if (empty($this->nodes)) {
-      $this->drupalCreateContentType(['type' => 'page']);
-      for ($i = 0; $i < 3; $i++) {
-        $this->nodes[$i] = $this->drupalCreateNode(['type' => 'page', 'title' => 'Node ' . $i, 'status' => NODE_PUBLISHED]);
-        $this->drupalGet('node/' . $this->nodes[$i]->id());
-      }
-    }
-    return $this->nodes;
-  }
-
-  /**
-   * Create a webform with submissions.
-   *
-   * @param array|null $elements
-   *   (optional) Array of elements.
-   * @param array $settings
-   *   (optional) Webform settings.
-   *
-   * @return \Drupal\webform\WebformInterface
-   *   A webform.
-   */
-  protected function createWebform($elements = NULL, array $settings = []) {
-    if ($elements === NULL) {
-      $elements = [
-        'first_name' => [
-          '#type' => 'textfield',
-          '#title' => 'First name',
-        ],
-        'last_name' => [
-          '#type' => 'textfield',
-          '#title' => 'Last name',
-        ],
-        'sex' => [
-          '#type' => 'select',
-          '#title' => 'Sex',
-          '#options' => 'gender',
-        ],
-        'dob' => [
-          '#type' => 'date',
-          '#title' => 'Date of birth',
-          '#format' => 'l, F j, Y',
-        ],
-        'node' => [
-          '#type' => 'entity_autocomplete',
-          '#title' => 'Favorite node',
-          '#target_type' => 'node',
-        ],
-        'colors' => [
-          '#type' => 'checkboxes',
-          '#title' => 'Flag colors',
-          '#options' => [
-            'red' => 'Red',
-            'white' => 'White',
-            'blue' => 'Blue',
-          ],
-        ],
-        'likert' => [
-          '#type' => 'likert',
-          '#title' => 'Likert',
-          '#questions' => [
-            'q1' => 'Question 1',
-            'q2' => 'Question 2',
-            'q3' => 'Question 3',
-          ],
-          '#answers' => [
-            '1' => 'Answer 1',
-            '2' => 'Answer 2',
-            '3' => 'Answer 3',
-          ],
-        ],
-        'address' => [
-          '#type' => 'webform_address',
-          '#title' => 'Address',
-        ],
-      ];
-    }
-
-    // Create new webform.
-    $id = $this->randomMachineName(8);
-    $webform = Webform::create([
-      'langcode' => 'en',
-      'status' => TRUE,
-      'id' => $id,
-      'title' => $id,
-      'elements' => Yaml::encode($elements),
-      'settings' => $settings + Webform::getDefaultSettings(),
-    ]);
-    $webform->save();
-    return $webform;
-  }
-
-  /**
-   * Create a webform with submissions.
-   *
-   * @return array
-   *   Array containing the webform and submissions.
-   */
-  protected function createWebformWithSubmissions() {
-    $webform = $this->createWebform();
-
-    $nodes = $this->getNodes();
-
-    // Create some submissions.
-    $names = [
-      [
-        'George',
-        'Washington',
-        'Male',
-        '1732-02-22',
-        $nodes[0],
-        ['white'],
-        ['q1' => 1, 'q2' => 1, 'q3' => 1],
-        ['address' => '{Address}', 'city' => '{City}', 'state_province' => 'New York', 'country' => 'United States', 'postal_code' => '11111-1111'],
-      ],
-      [
-        'Abraham',
-        'Lincoln',
-        'Male',
-        '1809-02-12',
-        $nodes[1],
-        ['red', 'white', 'blue'],
-        ['q1' => 2, 'q2' => 2, 'q3' => 2],
-        ['address' => '{Address}', 'city' => '{City}', 'state_province' => 'New York', 'country' => 'United States', 'postal_code' => '11111-1111'],
-      ],
-      [
-        'Hillary',
-        'Clinton',
-        'Female',
-        '1947-10-26',
-        $nodes[2],
-        ['red'],
-        ['q1' => 2, 'q2' => 2, 'q3' => 2],
-        ['address' => '{Address}', 'city' => '{City}', 'state_province' => 'New York', 'country' => 'United States', 'postal_code' => '11111-1111'],
-      ],
-    ];
-    $sids = [];
-    foreach ($names as $name) {
-      $edit = [
-        'first_name' => $name[0],
-        'last_name' => $name[1],
-        'sex' => $name[2],
-        'dob' => $name[3],
-        'node' => $name[4]->label() . ' (' . $name[4]->id() . ')',
-      ];
-      foreach ($name[5] as $color) {
-        $edit["colors[$color]"] = $color;
-      }
-      foreach ($name[6] as $question => $answer) {
-        $edit["likert[$question]"] = $answer;
-      }
-      foreach ($name[7] as $composite_key => $composite_value) {
-        $edit["address[$composite_key]"] = $composite_value;
-      }
-      $sids[] = $this->postSubmission($webform, $edit);
-    }
-
-    // Change array keys to index instead of using entity ids.
-    $submissions = array_values(WebformSubmission::loadMultiple($sids));
-
-    $this->assert($webform instanceof Webform, 'Webform was created');
-    $this->assertEqual(count($submissions), 3, 'WebformSubmissions were created.');
-
-    return [$webform, $submissions];
-  }
-
-  /**
    * Gets that last email sent during the currently running test case.
    *
    * @return array
diff --git a/src/WebformElementBase.php b/src/WebformElementBase.php
index dc607ac8..85c744a3 100644
--- a/src/WebformElementBase.php
+++ b/src/WebformElementBase.php
@@ -164,8 +164,6 @@ class WebformElementBase extends PluginBase implements WebformElementInterface {
       'required' => FALSE,
       'required_error' => '',
       'unique' => FALSE,
-      // Submission display.
-      'format' => $this->getItemDefaultFormat(),
       // Attributes.
       'wrapper_attributes' => [],
       'attributes' => [],
@@ -231,6 +229,14 @@ class WebformElementBase extends PluginBase implements WebformElementInterface {
     return isset($default_properties[$property_name]);
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getDefaultProperty($property_name) {
+    $default_properties = $this->getDefaultProperties();
+    return (isset($default_properties[$property_name])) ? $default_properties[$property_name] : NULL;
+  }
+
   /****************************************************************************/
   // Definition and meta data methods.
   /****************************************************************************/
@@ -303,14 +309,25 @@ class WebformElementBase extends PluginBase implements WebformElementInterface {
    * {@inheritdoc}
    */
   public function supportsMultipleValues() {
-    return $this->pluginDefinition['multiple'];
+    return FALSE;
   }
 
   /**
    * {@inheritdoc}
    */
   public function hasMultipleValues(array $element) {
-    return $this->pluginDefinition['multiple'];
+    if ($this->hasProperty('multiple')) {
+      if (isset($element['#multiple'])) {
+        return $element['#multiple'];
+      }
+      else {
+        $default_property = $this->getDefaultProperties();
+        return $default_property['multiple'];
+      }
+    }
+    else {
+      return FALSE;
+    }
   }
 
   /**
@@ -1017,6 +1034,7 @@ class WebformElementBase extends PluginBase implements WebformElementInterface {
    */
   public function buildExportRecord(array $element, $value, array $export_options) {
     $element['#format'] = 'raw';
+    $element['#format_items'] = 'comma';
     return [$this->formatText($element, $value, $export_options)];
   }
 
@@ -1772,7 +1790,7 @@ class WebformElementBase extends PluginBase implements WebformElementInterface {
    *   The element whose properties are being updated.
    */
   protected function getConfigurationFormProperty(array &$properties, $property_name, $property_value, array $element) {
-    if ($property_name == 'default_value' && is_string($property_value) && $this->hasMultipleValues($element)) {
+    if ($property_name == 'default_value' && is_string($property_value) && $property_value && $this->hasMultipleValues($element)) {
       $properties[$property_name] = preg_split('/\s*,\s*/', $property_value);
     }
   }
diff --git a/src/WebformElementInterface.php b/src/WebformElementInterface.php
index 255da329..64de0df7 100644
--- a/src/WebformElementInterface.php
+++ b/src/WebformElementInterface.php
@@ -40,6 +40,18 @@ interface WebformElementInterface extends PluginInspectionInterface, PluginFormI
   public function getTranslatableProperties();
 
   /**
+   * Get an element's default property value.
+   *
+   * @param string $property_name
+   *   An element's property name.
+   *
+   * @return mixed
+   *   An element's default property value or NULL is default property does not
+   *   exist.
+   */
+  public function getDefaultProperty($property_name);
+
+  /**
    * Determine if an element supports a specified property.
    *
    * @param string $property_name
