diff --git a/inline_entity_form.module b/inline_entity_form.module
index ed3f6bc..eaedcde 100644
--- a/inline_entity_form.module
+++ b/inline_entity_form.module
@@ -52,30 +52,6 @@ function inline_entity_form_entity_type_build(array &$entity_types) {
 }
 
 /**
- * Implements hook_entity_property_info_alter().
- *
- * @todo Remove once Commerce 1.5 gets released with #1860248 committed.
- */
-function inline_entity_form_entity_property_info_alter(&$info) {
-  if (!empty($info['commerce_product'])) {
-    $properties = &$info['commerce_product']['properties'];
-    $properties['status']['options list'] = 'inline_entity_form_product_status_options_list';
-  }
-}
-
-/**
- * Returns the options list for the product status property.
- *
- * @todo Remove once Commerce 1.5 gets released with #1860248 committed.
- */
-function inline_entity_form_product_status_options_list() {
-  return array(
-    0 => t('Disabled'),
-    1 => t('Active'),
-  );
-}
-
-/**
  * Implements hook_entity_delete().
  *
  * Deletes referenced entities if needed.
@@ -120,31 +96,6 @@ function inline_entity_form_entity_delete(EntityInterface $entity) {
 }
 
 /**
- * Attaches theme specific CSS files.
- *
- * @param $theme_css
- *  An array of all CSS files that should be considered.
- * @param $css
- *   The $form['#attached']['css'] array, modified by reference.
- */
-function _inline_entity_form_attach_css($theme_css, &$css) {
-  if (empty($theme_css)) {
-    return;
-  }
-
-  // Add the base CSS file, if provided.
-  if (!empty($theme_css['base'])) {
-    $css[] = $theme_css['base'];
-  }
-
-  // Add the theme specific CSS file, if provided.
-  $theme_key = $GLOBALS['theme'];
-  if (!empty($theme_css[$theme_key])) {
-    $css[] = $theme_css[$theme_key];
-  }
-}
-
-/**
  * Implements hook_theme().
  */
 function inline_entity_form_theme() {
@@ -157,39 +108,6 @@ function inline_entity_form_theme() {
 }
 
 /**
- * Implements hook_field_widget_settings_form().
- */
-function inline_entity_form_field_widget_settings_form($field, $instance) {
-  $widget = $instance['widget'];
-  $settings = $widget['settings'];
-  $controller = inline_entity_form_get_controller($instance);
-  // The current entity type is not supported, execution can't continue.
-  if (!$controller) {
-    return array();
-  }
-
-  $element = array();
-  // The fields are not editable from the UI for now.
-  $element['fields'] = array(
-    '#type' => 'value',
-    '#value' => $settings['fields'],
-  );
-
-  // Add entity type specific settings if they exist.
-  $settings_form = $controller->settingsForm($field, $instance);
-  if (!empty($settings_form)) {
-    $entity_info = \Drupal::entityManager()->getDefinition($controller->getEntityType());
-    $element['type_settings'] = array(
-      '#type' => 'fieldset',
-      '#title' => t('Inline Entity Form: %type', array('%type' => $entity_info['label'])),
-    );
-    $element['type_settings'] += $settings_form;
-  }
-
-  return $element;
-}
-
-/**
  * Implements hook_field_widget_properties_alter().
  *
  * IEF is not suited for usage within VBO's "modify entity values" action.
@@ -216,18 +134,6 @@ function inline_entity_form_field_widget_properties_alter(&$widget, $context) {
 }
 
 /**
- * Updates entity weights based on their weights in the widget.
- */
-function inline_entity_form_update_row_weights($element, FormStateInterface $form_state, $form) {
-  $ief_id = $element['#ief_id'];
-  // Loop over the submitted delta values and update the weight of the entities
-  // in the form state.
-  foreach (Element::children($element['entities']) as $key) {
-    $form_state->set(['inline_entity_form', $ief_id, 'entities', $key, '_weight'], $element['entities'][$key]['delta']['#value']);
-  }
-}
-
-/**
  * Provides the form for adding existing entities through an autocomplete field.
  *
  * @param $entity_form
@@ -514,25 +420,6 @@ function inline_entity_form_cleanup_row_form_state($form, FormStateInterface $fo
 }
 
 /**
- * IEF widget #element_validate callback: Required field validation.
- */
-function inline_entity_form_required_field($element, FormStateInterface $form_state, $form) {
-  $ief_id = $element['#ief_id'];
-  $children = $form_state->get(['inline_entity_form', $ief_id, 'entities']);
-  $has_children = !empty($children);
-  $form = $form_state->get(['inline_entity_form', $ief_id, 'form']);
-  $form_open = !empty($form);
-  // If the add new / add existing form is open, its validation / submission
-  // will do the job instead (either by preventing the parent form submission
-  // or by adding a new referenced entity).
-  if (!$has_children && !$form_open) {
-    /** @var \Drupal\Core\Field\FieldDefinitionInterface $instance */
-    $instance = $form_state->get(['inline_entity_form', $ief_id, 'instance']);
-    $form_state->setError($element, t('!name field is required.', array('!name' => $instance->getLabel())));
-  }
-}
-
-/**
  * Returns an IEF widget nearest to the triggering element.
  */
 function inline_entity_form_get_element($form, FormStateInterface $form_state) {
@@ -671,13 +558,6 @@ function theme_inline_entity_form_entity_table($variables) {
 }
 
 /**
- * Implements hook_field_widget_error().
- */
-function inline_entity_form_field_widget_error($element, $error) {
-  form_error($element, $error['message']);
-}
-
-/**
  * Move form elements into fieldsets for presentation purposes.
  *
  * Inline forms use #tree = TRUE to keep their values in a hierarchy for
diff --git a/src/Plugin/Field/FieldWidget/InlineEntityFormBase.php b/src/Plugin/Field/FieldWidget/InlineEntityFormBase.php
new file mode 100644
index 0000000..fb55be6
--- /dev/null
+++ b/src/Plugin/Field/FieldWidget/InlineEntityFormBase.php
@@ -0,0 +1,273 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\inline_entity_form\Plugin\Field\FieldWidget\InlineEntityFormBase.
+ */
+
+namespace Drupal\inline_entity_form\Plugin\Field\FieldWidget;
+
+use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Field\FieldDefinitionInterface;
+use Drupal\Core\Field\WidgetBase;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Inline entity form widget base class (shared between single and multiple).
+ */
+abstract class InlineEntityFormBase extends WidgetBase implements ContainerFactoryPluginInterface {
+
+  /**
+   * The inline entity form id.
+   *
+   * @var string
+   */
+  protected $iefId;
+
+  /**
+   * The entity manager.
+   *
+   * @var \Drupal\Core\Entity\EntityManagerInterface
+   */
+  protected $entityManager;
+
+  /**
+   * The inline entity from handler.
+   *
+   * @var \Drupal\inline_entity_form\InlineEntityFormHandlerInterface
+   */
+  protected $iefHandler;
+
+  /**
+   * Options for match operator.
+   *
+   * @var array
+   */
+  protected $matchOperatorOptions;
+
+  /**
+   * Constructs a InlineEntityFormBase object.
+   *
+   * @param array $plugin_id
+   *   The plugin_id for the widget.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition
+   *   The definition of the field to which the widget is associated.
+   * @param array $settings
+   *   The widget settings.
+   * @param array $third_party_settings
+   *   Any third party settings.
+   * @param \Drupal\Core\Entity\EntityManager $entity_manager
+   *   Entity manager service.
+   */
+  public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, array $third_party_settings, EntityManagerInterface $entity_manager) {
+    parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $third_party_settings);
+    $this->entityManager = $entity_manager;
+    $this->matchOperatorOptions = [
+      'STARTS_WITH' => t('Starts with'),
+      'CONTAINS' => t('Contains'),
+    ];
+
+    $this->initializeIefController();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $plugin_id,
+      $plugin_definition,
+      $configuration['field_definition'],
+      $configuration['settings'],
+      $configuration['third_party_settings'],
+      $container->get('entity.manager')
+    );
+  }
+
+  /**
+   * Initializes IEF form handler.
+   */
+  protected function initializeIefController() {
+    if (!isset($this->iefHandler)) {
+      $target_type = $this->fieldDefinition->getFieldStorageDefinition()->getSetting('target_type');
+      $this->iefHandler = $this->entityManager->getHandler($target_type, 'inline entity form');
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __sleep() {
+    $keys = array_diff(parent::__sleep(), array('iefHandler'));
+    return $keys;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __wakeup() {
+    parent::__wakeup();
+    $this->initializeIefController();
+  }
+
+  /**
+   * Sets inline entity form ID.
+   *
+   * @param string $iefId
+   */
+  protected function setIefId($iefId) {
+    $this->iefId = $iefId;
+  }
+
+  /**
+   * Gets inline entity form ID.
+   *
+   * @return string
+   *   Inline entity form ID.
+   */
+  protected function getIefId() {
+    return $this->iefId;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultSettings() {
+    return [
+      "allow_existing" => FALSE,
+      "match_operator" => "CONTAINS",
+      "delete_references" => FALSE,
+      "override_labels" => FALSE,
+      "label_singular" => "",
+      "label_plural" => "",
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsForm(array $form, FormStateInterface $form_state) {
+    $labels = $this->labels();
+    $states_prefix = 'instance[widget][settings][type_settings]';
+
+    $element['allow_existing'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Allow users to add existing @label.', array('@label' => $labels['plural'])),
+      '#default_value' => $this->settings['allow_existing'],
+    );
+    $element['match_operator'] = array(
+      '#type' => 'select',
+      '#title' => t('Autocomplete matching'),
+      '#default_value' => $this->settings['match_operator'],
+      '#options' => $this->matchOperatorOptions,
+      '#description' => t('Select the method used to collect autocomplete suggestions. Note that <em>Contains</em> can cause performance issues on sites with thousands of nodes.'),
+      '#states' => array(
+        'visible' => array(
+          ':input[name="' . $states_prefix . '[allow_existing]"]' => array('checked' => TRUE),
+        ),
+      ),
+    );
+    // The single widget doesn't offer autocomplete functionality.
+    if ($form_state->get(['widget', 'type']) == 'inline_entity_form_single') {
+      $form['allow_existing']['#access'] = FALSE;
+      $form['match_operator']['#access'] = FALSE;
+    }
+
+    $element['delete_references'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Delete referenced @label when the parent entity is deleted.', array('@label' => $labels['plural'])),
+      '#default_value' => $this->settings['delete_references'],
+    );
+
+    $element['override_labels'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Override labels'),
+      '#default_value' => $this->settings['override_labels'],
+    );
+    $element['label_singular'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Singular label'),
+      '#default_value' => $this->settings['label_singular'],
+      '#states' => array(
+        'visible' => array(
+          ':input[name="' . $states_prefix . '[override_labels]"]' => array('checked' => TRUE),
+        ),
+      ),
+    );
+    $element['label_plural'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Plural label'),
+      '#default_value' => $this->settings['label_plural'],
+      '#states' => array(
+        'visible' => array(
+          ':input[name="' . $states_prefix . '[override_labels]"]' => array('checked' => TRUE),
+        ),
+      ),
+    );
+
+    return $element;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsSummary() {
+    $summary = [];
+
+    if ($this->settings['allow_existing']) {
+      $summary[] = t(
+        'Existing entities can be referenced and are matched with %operator operator.',
+        [
+          '%operator' => $this->matchOperatorOptions[$this->settings['match_operator']]
+        ]
+      );
+    }
+    else {
+      $summary[] = t('Existing entities can not be referenced.');
+    }
+
+    $summary[] = $this->settings['delete_references'] ? t('Referenced entities are deleted when reference is lost.') : t('Referenced entities are persisted when reference is lost.');
+    if ($this->settings['override_labels']) {
+      $summary[] = t(
+        'Overriden labels are used: %singular and %plural',
+        [
+          '%singular' => $this->settings['label_singular'],
+          '%plural' => $this->settings['label_plural'],
+        ]
+      );
+    }
+    else {
+      $summary[] = t('Default labels are used.');
+    }
+
+    return $summary;
+  }
+
+  /**
+   * Returns an array of entity type labels (singular, plural) fit to be
+   * included in the UI text.
+   *
+   * @return array
+   *   Array containing two values:
+   *     - singular: label for singular form,
+   *     - plural: label for plural form.
+   */
+  protected function labels() {
+    // The admin has specified the exact labels that should be used.
+    if ($this->settings['override_labels']) {
+      return [
+        'singular' => $this->settings['label_singular'],
+        'plural' => $this->settings['label_plural'],
+      ];
+    }
+    else {
+      $this->initializeIefController();
+      return $this->iefHandler->labels();
+    }
+  }
+
+}
diff --git a/src/Plugin/Field/FieldWidget/InlineEntityFormMultiple.php b/src/Plugin/Field/FieldWidget/InlineEntityFormMultiple.php
index 5bde64b..98aad8e 100644
--- a/src/Plugin/Field/FieldWidget/InlineEntityFormMultiple.php
+++ b/src/Plugin/Field/FieldWidget/InlineEntityFormMultiple.php
@@ -15,6 +15,7 @@ use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\Core\Field\WidgetBase;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\Core\Render\Element;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -29,173 +30,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
  *   multiple_values = true
  * )
  */
-class InlineEntityFormMultiple extends WidgetBase implements ContainerFactoryPluginInterface {
-
-  /**
-   * The entity manager.
-   *
-   * @var \Drupal\Core\Entity\EntityManagerInterface
-   */
-  protected $entityManager;
-
-  /**
-   * The inline entity from handler.
-   *
-   * @var \Drupal\inline_entity_form\InlineEntityFormHandlerInterface
-   */
-  protected $iefHandler;
-
-  /**
-   * The inline entity form id.
-   *
-   * @var string
-   */
-  protected $iefId;
-
-  public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, array $third_party_settings, EntityManagerInterface $entity_manager) {
-    parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $third_party_settings);
-    $this->entityManager = $entity_manager;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
-    return new static(
-      $plugin_id,
-      $plugin_definition,
-      $configuration['field_definition'],
-      $configuration['settings'],
-      $configuration['third_party_settings'],
-      $container->get('entity.manager')
-    );
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function __sleep() {
-    $keys = array_diff(parent::__sleep(), array('iefHandler'));
-    return $keys;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function __wakeup() {
-    parent::__wakeup();
-    $this->initializeIefController();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function defaultSettings() {
-    return array(
-      "allow_existing" => FALSE,
-      "match_operator" => "CONTAINS",
-      "delete_references" => FALSE,
-      "override_labels" => FALSE,
-      "label_singular" => "",
-      "label_plural" => "",
-    );
-  }
-
-  /**
-   * Returns the settings form for the current entity type.
-   *
-   * The settings form is embedded into the IEF widget settings form.
-   * Settings are later injected into the controller through $this->settings.
-   *
-   * @param $field
-   *   The definition of the reference field used by IEF.
-   * @param $instance
-   *   The definition of the reference field instance.
-   */
-  public function settingsForm(array $form, FormStateInterface $form_state) {
-    $labels = $this->labels();
-    $states_prefix = 'instance[widget][settings][type_settings]';
-
-    $element['allow_existing'] = array(
-      '#type' => 'checkbox',
-      '#title' => t('Allow users to add existing @label.', array('@label' => $labels['plural'])),
-      '#default_value' => $this->settings['allow_existing'],
-    );
-    $element['match_operator'] = array(
-      '#type' => 'select',
-      '#title' => t('Autocomplete matching'),
-      '#default_value' => $this->settings['match_operator'],
-      '#options' => array(
-        'STARTS_WITH' => t('Starts with'),
-        'CONTAINS' => t('Contains'),
-      ),
-      '#description' => t('Select the method used to collect autocomplete suggestions. Note that <em>Contains</em> can cause performance issues on sites with thousands of nodes.'),
-      '#states' => array(
-        'visible' => array(
-          ':input[name="' . $states_prefix . '[allow_existing]"]' => array('checked' => TRUE),
-        ),
-      ),
-    );
-    // The single widget doesn't offer autocomplete functionality.
-    if ($form_state->get(['widget', 'type']) == 'inline_entity_form_single') {
-      $form['allow_existing']['#access'] = FALSE;
-      $form['match_operator']['#access'] = FALSE;
-    }
-
-    $element['delete_references'] = array(
-      '#type' => 'checkbox',
-      '#title' => t('Delete referenced @label when the parent entity is deleted.', array('@label' => $labels['plural'])),
-      '#default_value' => $this->settings['delete_references'],
-    );
-
-    $element['override_labels'] = array(
-      '#type' => 'checkbox',
-      '#title' => t('Override labels'),
-      '#default_value' => $this->settings['override_labels'],
-    );
-    $element['label_singular'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Singular label'),
-      '#default_value' => $this->settings['label_singular'],
-      '#states' => array(
-        'visible' => array(
-          ':input[name="' . $states_prefix . '[override_labels]"]' => array('checked' => TRUE),
-        ),
-      ),
-    );
-    $element['label_plural'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Plural label'),
-      '#default_value' => $this->settings['label_plural'],
-      '#states' => array(
-        'visible' => array(
-          ':input[name="' . $states_prefix . '[override_labels]"]' => array('checked' => TRUE),
-        ),
-      ),
-    );
-
-    return $element;
-  }
-
-  /**
-   * @param mixed $iefId
-   */
-  public function setIefId($iefId) {
-    $this->iefId = $iefId;
-  }
-
-  /**
-   * @return mixed
-   */
-  public function getIefId() {
-    return $this->iefId;
-  }
-
-  function initializeIefController() {
-    if (!isset($this->iefHandler)) {
-      $this->iefHandler = inline_entity_form_get_controller($this->fieldDefinition);
-    }
-  }
+class InlineEntityFormMultiple extends InlineEntityFormBase implements ContainerFactoryPluginInterface {
 
   /**
    * {@inheritdoc}
@@ -207,7 +42,6 @@ class InlineEntityFormMultiple extends WidgetBase implements ContainerFactoryPlu
 
     $settings = $this->getFieldSettings();
     $cardinality = $this->fieldDefinition->getFieldStorageDefinition()->getCardinality();
-    $this->initializeIefController();
 
     if (!$this->iefHandler) {
       return $element;
@@ -285,7 +119,8 @@ class InlineEntityFormMultiple extends WidgetBase implements ContainerFactoryPlu
     }
 
     // Build the "Multiple value" widget.
-    $element['#element_validate'] = array('inline_entity_form_update_row_weights');
+    // TODO - does this belong in #element_validate?
+    $element['#element_validate'] =[[get_class($this), 'updateRowWeights']];
     // Add the required element marker & validation.
     if ($element['#required']) {
       $element['#element_validate'][] = 'inline_entity_form_required_field';
@@ -630,7 +465,6 @@ class InlineEntityFormMultiple extends WidgetBase implements ContainerFactoryPlu
       return;
     }
 
-    $this->initializeIefController();
     $field_name = $this->fieldDefinition->getName();
 
     // Extract the values from $form_state->getValues().
@@ -949,33 +783,6 @@ class InlineEntityFormMultiple extends WidgetBase implements ContainerFactoryPlu
   }
 
   /**
-   * Returns an array of entity type labels (singular, plural) fit to be
-   * included in the UI text.
-   *
-   * @TODO - This could be shared with InlineEntityFormSingle. Let's see if we
-   * base one of the widgets out of the other one. We could use a trait if that
-   * won't be possible.
-   *
-   * @return array
-   *   Array containing two values:
-   *     - singular: label for singular form,
-   *     - plural: label for plural form.
-   */
-  protected function labels() {
-    // The admin has specified the exact labels that should be used.
-    if ($this->settings['override_labels']) {
-      return [
-        'singular' => $this->settings['label_singular'],
-        'plural' => $this->settings['label_plural'],
-      ];
-    }
-    else {
-      $this->initializeIefController();
-      return $this->iefHandler->labels();
-    }
-  }
-
-  /**
    * Determines bundle to be used when creating entity.
    *
    * @param FormStateInterface $form_state
@@ -1038,4 +845,37 @@ class InlineEntityFormMultiple extends WidgetBase implements ContainerFactoryPlu
       $form_state->set(['inline_entity_form', $ief_id, 'entities'], $entities);
     }
   }
+
+  /**
+   * Updates entity weights based on their weights in the widget.
+   */
+  public static function updateRowWights($element, FormStateInterface $form_state, $form) {
+    $ief_id = $element['#ief_id'];
+
+    // Loop over the submitted delta values and update the weight of the entities
+    // in the form state.
+    foreach (Element::children($element['entities']) as $key) {
+      $form_state->set(['inline_entity_form', $ief_id, 'entities', $key, '_weight'], $element['entities'][$key]['delta']['#value']);
+    }
+  }
+
+  /**
+   * IEF widget #element_validate callback: Required field validation.
+   */
+  public static function requiredField($element, FormStateInterface $form_state, $form) {
+    $ief_id = $element['#ief_id'];
+    $children = $form_state->get(['inline_entity_form', $ief_id, 'entities']);
+    $has_children = !empty($children);
+    $form = $form_state->get(['inline_entity_form', $ief_id, 'form']);
+    $form_open = !empty($form);
+    // If the add new / add existing form is open, its validation / submission
+    // will do the job instead (either by preventing the parent form submission
+    // or by adding a new referenced entity).
+    if (!$has_children && !$form_open) {
+      /** @var \Drupal\Core\Field\FieldDefinitionInterface $instance */
+      $instance = $form_state->get(['inline_entity_form', $ief_id, 'instance']);
+      $form_state->setError($element, t('!name field is required.', array('!name' => $instance->getLabel())));
+    }
+  }
+
 }
diff --git a/src/Plugin/Field/FieldWidget/InlineEntityFormSingle.php b/src/Plugin/Field/FieldWidget/InlineEntityFormSingle.php
index 8b8887e..f255e39 100644
--- a/src/Plugin/Field/FieldWidget/InlineEntityFormSingle.php
+++ b/src/Plugin/Field/FieldWidget/InlineEntityFormSingle.php
@@ -20,110 +20,10 @@ use Drupal\Core\Form\FormStateInterface;
  *   field_types = {
  *     "entity_reference"
  *   },
- *   settings = {
- *     "allow_existing" = FALSE,
- *     "match_operator" = "CONTAINS",
- *     "delete_references" = FALSE,
- *     "override_labels" = FALSE,
- *     "label_singular" = "",
- *     "label_plural" = ""
- *   },
  *   multiple_values = false
  * )
  */
-class InlineEntityFormSingle extends WidgetBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function defaultSettings() {
-    return array(
-      "allow_existing" => FALSE,
-      "match_operator" => "CONTAINS",
-      "delete_references" => FALSE,
-      "override_labels" => FALSE,
-      "label_singular" => "",
-      "label_plural" => "",
-    );
-  }
-
-  /**
-   * Returns the settings form for the current entity type.
-   *
-   * The settings form is embedded into the IEF widget settings form.
-   * Settings are later injected into the controller through $this->settings.
-   *
-   * @param $field
-   *   The definition of the reference field used by IEF.
-   * @param $instance
-   *   The definition of the reference field instance.
-   */
-  public function settingsForm(array $form, FormStateInterface $form_state) {
-    $ief_controller = inline_entity_form_get_controller($this->fieldDefinition);
-
-    $labels = $ief_controller->labels();
-    $states_prefix = 'instance[widget][settings][type_settings]';
-
-    $element['allow_existing'] = array(
-      '#type' => 'checkbox',
-      '#title' => t('Allow users to add existing @label.', array('@label' => $labels['plural'])),
-      '#default_value' => $this->settings['allow_existing'],
-    );
-    $element['match_operator'] = array(
-      '#type' => 'select',
-      '#title' => t('Autocomplete matching'),
-      '#default_value' => $this->settings['match_operator'],
-      '#options' => array(
-        'STARTS_WITH' => t('Starts with'),
-        'CONTAINS' => t('Contains'),
-      ),
-      '#description' => t('Select the method used to collect autocomplete suggestions. Note that <em>Contains</em> can cause performance issues on sites with thousands of nodes.'),
-      '#states' => array(
-        'visible' => array(
-          ':input[name="' . $states_prefix . '[allow_existing]"]' => array('checked' => TRUE),
-        ),
-      ),
-    );
-    // The single widget doesn't offer autocomplete functionality.
-    if ($form_state->get(['widget', 'type']) == 'inline_entity_form_single') {
-      $form['allow_existing']['#access'] = FALSE;
-      $form['match_operator']['#access'] = FALSE;
-    }
-
-    $element['delete_references'] = array(
-      '#type' => 'checkbox',
-      '#title' => t('Delete referenced @label when the parent entity is deleted.', array('@label' => $labels['plural'])),
-      '#default_value' => $this->settings['delete_references'],
-    );
-
-    $element['override_labels'] = array(
-      '#type' => 'checkbox',
-      '#title' => t('Override labels'),
-      '#default_value' => $this->settings['override_labels'],
-    );
-    $element['label_singular'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Singular label'),
-      '#default_value' => $this->settings['label_singular'],
-      '#states' => array(
-        'visible' => array(
-          ':input[name="' . $states_prefix . '[override_labels]"]' => array('checked' => TRUE),
-        ),
-      ),
-    );
-    $element['label_plural'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Plural label'),
-      '#default_value' => $this->settings['label_plural'],
-      '#states' => array(
-        'visible' => array(
-          ':input[name="' . $states_prefix . '[override_labels]"]' => array('checked' => TRUE),
-        ),
-      ),
-    );
-
-    return $element;
-  }
+class InlineEntityFormSingle extends InlineEntityFormBase {
 
   /**
    * {@inheritdoc}
@@ -134,18 +34,4 @@ class InlineEntityFormSingle extends WidgetBase {
     return $element;
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function settingsSummary() {
-    $summary = array();
-
-    $summary[] = t('Example summary');
-    /*$placeholder = $this->getSetting('placeholder');
-    if (!empty($placeholder)) {
-      $summary[] = t('Placeholder: @placeholder', array('@placeholder' => $placeholder));
-    } */
-
-    return $summary;
-  }
 }
