diff --git a/core/lib/Drupal/Core/Field/FieldItemList.php b/core/lib/Drupal/Core/Field/FieldItemList.php
index 1067ae8..4c5b9c6 100644
--- a/core/lib/Drupal/Core/Field/FieldItemList.php
+++ b/core/lib/Drupal/Core/Field/FieldItemList.php
@@ -297,13 +297,17 @@ public function getConstraints() {
    */
   public function defaultValuesForm(array &$form, FormStateInterface $form_state) {
     if (empty($this->getFieldDefinition()->default_value_callback)) {
-      // Place the input in a separate place in the submitted values tree.
-      $widget = $this->defaultValueWidget($form_state);
+      if ($widget = $this->defaultValueWidget($form_state)) {
+        $element = array('#parents' => array('default_value_input'));
 
-      $element = array('#parents' => array('default_value_input'));
-      $element += $widget->form($this, $element, $form_state);
+        // Place the input in a separate place in the submitted values tree.
+        $element += $widget->form($this, $element, $form_state);
 
-      return $element;
+        return $element;
+      }
+      else {
+        return ['#markup' => $this->t('No widget available for: %type.', ['%type' => $this->getFieldDefinition()->getType()])];
+      }
     }
   }
 
@@ -312,16 +316,17 @@ public function defaultValuesForm(array &$form, FormStateInterface $form_state)
    */
   public function defaultValuesFormValidate(array $element, array &$form, FormStateInterface $form_state) {
     // Extract the submitted value, and validate it.
-    $widget = $this->defaultValueWidget($form_state);
-    $widget->extractFormValues($this, $element, $form_state);
-    // Force a non-required field definition.
-    // @see self::defaultValueWidget().
-    $this->getFieldDefinition()->setRequired(FALSE);
-    $violations = $this->validate();
+    if ($widget = $this->defaultValueWidget($form_state)) {
+      $widget->extractFormValues($this, $element, $form_state);
+      // Force a non-required field definition.
+      // @see self::defaultValueWidget().
+      $this->getFieldDefinition()->setRequired(FALSE);
+      $violations = $this->validate();
 
-    // Assign reported errors to the correct form element.
-    if (count($violations)) {
-      $widget->flagErrors($this, $violations, $element, $form_state);
+      // Assign reported errors to the correct form element.
+      if (count($violations)) {
+        $widget->flagErrors($this, $violations, $element, $form_state);
+      }
     }
   }
 
@@ -330,9 +335,10 @@ public function defaultValuesFormValidate(array $element, array &$form, FormStat
    */
   public function defaultValuesFormSubmit(array $element, array &$form, FormStateInterface $form_state) {
     // Extract the submitted value, and return it as an array.
-    $widget = $this->defaultValueWidget($form_state);
-    $widget->extractFormValues($this, $element, $form_state);
-    return $this->getValue();
+    if ($widget = $this->defaultValueWidget($form_state)) {
+      $widget->extractFormValues($this, $element, $form_state);
+      return $this->getValue();
+    }
   }
 
   /**
@@ -349,7 +355,7 @@ public static function processDefaultValue($default_value, FieldableEntityInterf
    *   The form state of the (entire) configuration form.
    *
    * @return \Drupal\Core\Field\WidgetInterface
-   *   A Widget object.
+   *   A Widget object or NULL if no widget is available.
    */
   protected function defaultValueWidget(FormStateInterface $form_state) {
     if (!$form_state->has('default_value_widget')) {
diff --git a/core/lib/Drupal/Core/Field/WidgetPluginManager.php b/core/lib/Drupal/Core/Field/WidgetPluginManager.php
index c251135..2bc41f1 100644
--- a/core/lib/Drupal/Core/Field/WidgetPluginManager.php
+++ b/core/lib/Drupal/Core/Field/WidgetPluginManager.php
@@ -151,7 +151,7 @@ public function prepareConfiguration($field_type, array $configuration) {
     // If no widget is specified, use the default widget.
     if (!isset($configuration['type'])) {
       $field_type = $this->fieldTypeManager->getDefinition($field_type);
-      $configuration['type'] = $field_type['default_widget'];
+      $configuration['type'] = isset($field_type['default_widget']) ? $field_type['default_widget'] : NULL;
     }
     // Filter out unknown settings, and fill in defaults for missing settings.
     $default_settings = $this->getDefaultSettings($configuration['type']);
diff --git a/core/modules/field_ui/src/Form/EntityDisplayFormBase.php b/core/modules/field_ui/src/Form/EntityDisplayFormBase.php
index e807073..1b07750 100644
--- a/core/modules/field_ui/src/Form/EntityDisplayFormBase.php
+++ b/core/modules/field_ui/src/Form/EntityDisplayFormBase.php
@@ -279,6 +279,13 @@ protected function buildFieldRow(FieldDefinitionInterface $field_definition, arr
     $display_options = $this->entity->getComponent($field_name);
     $label = $field_definition->getLabel();
 
+    // Disable fields without a default plugin.
+    $default_plugin = $this->getDefaultPlugin($field_definition->getType());
+    if (!$default_plugin && $display_options) {
+      $this->entity->removeComponent($field_name)->save();
+      $display_options = $this->entity->getComponent($field_name);
+    }
+
     $regions = array_keys($this->getRegions());
     $field_row = array(
       '#attributes' => array('class' => array('draggable', 'tabledrag-leaf')),
@@ -286,7 +293,7 @@ protected function buildFieldRow(FieldDefinitionInterface $field_definition, arr
       '#region_callback' => array($this, 'getRowRegion'),
       '#js_settings' => array(
         'rowHandler' => 'field',
-        'defaultPlugin' => $this->getDefaultPlugin($field_definition->getType()),
+        'defaultPlugin' => $default_plugin,
       ),
       'human_name' => array(
         '#plain_text' => $label,
diff --git a/core/tests/Drupal/Tests/Core/Field/FieldItemListTest.php b/core/tests/Drupal/Tests/Core/Field/FieldItemListTest.php
index 42f776a..af2eb17 100644
--- a/core/tests/Drupal/Tests/Core/Field/FieldItemListTest.php
+++ b/core/tests/Drupal/Tests/Core/Field/FieldItemListTest.php
@@ -10,6 +10,7 @@
 use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\Core\Field\FieldItemInterface;
 use Drupal\Core\Field\FieldItemList;
+use Drupal\Core\Form\FormState;
 use Drupal\Tests\UnitTestCase;
 
 /**
@@ -155,4 +156,68 @@ public function testEqualsEmptyItems() {
     $this->assertEquals(TRUE, $field_list_a->equals($field_list_b));
   }
 
+  /**
+   * @covers ::defaultValuesForm
+   *
+   * @test
+   */
+  public function defaultValuesForm() {
+    $field_definition = $this->getMock('DrupalFormStateInterface\Core\Field\FieldDefinitionInterface', ['getType']);
+    $field_definition->expects($this->any())
+      ->method('getType')
+      ->willReturn('field_type');
+    $field_list = $this->getMock('Drupal\Core\Field\FieldItemList', ['defaultValueWidget'], [$field_definition]);
+    $field_list->expects($this->any())
+      ->method('defaultValueWidget')
+      ->willReturn(NULL);
+    $form = [];
+    $form_state = new FormState();
+    $stringTranslation = $this->getMockBuilder('Drupal\Core\StringTranslation\TranslationManager')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $stringTranslation->expects($this->any())
+      ->method('translate')
+      ->willReturn('No widget available for: field_type.');
+    $field_list->setStringTranslation($stringTranslation);
+
+    $this->assertEquals($field_list->defaultValuesForm($form, $form_state)['#markup'], 'No widget available for: field_type.');
+  }
+
+  /**
+   * @covers ::defaultValuesFormValidate
+   *
+   * @test
+   */
+  public function defaultValuesFormValidate() {
+    $field_definition = $this->getMock('DrupalFormStateInterface\Core\Field\FieldDefinitionInterface');
+    $field_list = $this->getMock('Drupal\Core\Field\FieldItemList', ['defaultValueWidget', 'validate'], [$field_definition]);
+    $field_list->expects($this->any())
+      ->method('defaultValueWidget')
+      ->willReturn(NULL);
+    $field_list->expects($this->never())
+      ->method('validate');
+    $form = [];
+    $form_state = new FormState();
+
+    $field_list->defaultValuesFormValidate([], $form, $form_state);
+  }
+
+  /**
+   * @covers ::defaultValuesFormSubmit
+   *
+   * @test
+   */
+  public function defaultValuesFormSubmit() {
+    $field_definition = $this->getMock('DrupalFormStateInterface\Core\Field\FieldDefinitionInterface');
+    $field_list = $this->getMock('Drupal\Core\Field\FieldItemList', ['defaultValueWidget', 'getValue'], [$field_definition]);
+    $field_list->expects($this->any())
+      ->method('defaultValueWidget')
+      ->willReturn(NULL);
+    $form = [];
+    $form_state = new FormState();
+    $field_list->expects($this->never())
+      ->method('getValue');
+
+    $this->assertNull($field_list->defaultValuesFormSubmit([], $form, $form_state));
+  }
 }
