diff --git a/core/modules/block_content/block_content.module b/core/modules/block_content/block_content.module
index a050795..ed15d4e 100644
--- a/core/modules/block_content/block_content.module
+++ b/core/modules/block_content/block_content.module
@@ -83,7 +83,10 @@ function block_content_add_body_field($block_type_id, $label = 'Body') {
       'field_storage' =>  FieldStorageConfig::loadByName('block_content', 'body'),
       'bundle' => $block_type_id,
       'label' => $label,
-      'settings' => array('display_summary' => FALSE),
+      'settings' => array(
+        'display_summary' => FALSE,
+        'available_formats' => array(),
+      ),
     ));
     $field->save();
 
diff --git a/core/modules/book/config/install/field.field.node.book.body.yml b/core/modules/book/config/install/field.field.node.book.body.yml
index 4c128b6..18ac898 100644
--- a/core/modules/book/config/install/field.field.node.book.body.yml
+++ b/core/modules/book/config/install/field.field.node.book.body.yml
@@ -18,5 +18,6 @@ default_value: {  }
 default_value_callback: ''
 settings:
   display_summary: true
+  available_formats: {  }
 third_party_settings: {  }
 field_type: text_with_summary
diff --git a/core/modules/config_translation/src/Tests/ConfigTranslationListUiTest.php b/core/modules/config_translation/src/Tests/ConfigTranslationListUiTest.php
index d59bd7f..d08f961 100644
--- a/core/modules/config_translation/src/Tests/ConfigTranslationListUiTest.php
+++ b/core/modules/config_translation/src/Tests/ConfigTranslationListUiTest.php
@@ -401,7 +401,10 @@ public function doFieldListTest() {
       'field_storage' => FieldStorageConfig::loadByName('block_content', 'body'),
       'bundle' => $block_content_type->id(),
       'label' => 'Body',
-      'settings' => array('display_summary' => FALSE),
+      'settings' => array(
+        'display_summary' => FALSE,
+        'available_formats' => array(),
+      ),
     ));
     $field->save();
 
diff --git a/core/modules/forum/config/install/field.field.node.forum.body.yml b/core/modules/forum/config/install/field.field.node.forum.body.yml
index 279f160..e02afc8 100644
--- a/core/modules/forum/config/install/field.field.node.forum.body.yml
+++ b/core/modules/forum/config/install/field.field.node.forum.body.yml
@@ -18,5 +18,6 @@ default_value: {  }
 default_value_callback: ''
 settings:
   display_summary: true
+  available_formats: {  }
 third_party_settings: {  }
 field_type: text_with_summary
diff --git a/core/modules/migrate_drupal/config/install/migrate.migration.d6_block_content_body_field.yml b/core/modules/migrate_drupal/config/install/migrate.migration.d6_block_content_body_field.yml
index c079619..1c46953 100644
--- a/core/modules/migrate_drupal/config/install/migrate.migration.d6_block_content_body_field.yml
+++ b/core/modules/migrate_drupal/config/install/migrate.migration.d6_block_content_body_field.yml
@@ -12,6 +12,7 @@ source:
     name: body
     label: Body
     display_summary: false
+    available_formats: {  }
 process:
   entity_type: 'constants/entity_type'
   bundle: 'constants/bundle'
diff --git a/core/modules/migrate_drupal/src/Tests/d6/MigrateFieldInstanceTest.php b/core/modules/migrate_drupal/src/Tests/d6/MigrateFieldInstanceTest.php
index a57307e..269efdf 100644
--- a/core/modules/migrate_drupal/src/Tests/d6/MigrateFieldInstanceTest.php
+++ b/core/modules/migrate_drupal/src/Tests/d6/MigrateFieldInstanceTest.php
@@ -90,7 +90,10 @@ public function testFieldInstanceSettings() {
     // Test a text field.
     $field = FieldConfig::load('node.story.field_test');
     $this->assertIdentical('Text Field', $field->label());
-    $expected = array('max_length' => 255);
+    $expected = array(
+      'allowed_formats' => array(),
+      'max_length' => 255,
+    );
     $this->assertIdentical($expected, $field->getSettings());
     $this->assertIdentical('text for default value', $entity->field_test->value);
 
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 4550a6d..bbb32ab 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -328,7 +328,10 @@ function node_add_body_field(NodeTypeInterface $type, $label = 'Body') {
       'field_storage' => $field_storage,
       'bundle' => $type->id(),
       'label' => $label,
-      'settings' => array('display_summary' => TRUE),
+      'settings' => array(
+        'display_summary' => TRUE,
+        'available_formats' => array(),
+      ),
     ));
     $field->save();
 
diff --git a/core/modules/options/tests/options_config_install_test/config/install/field.field.node.options_install_test.body.yml b/core/modules/options/tests/options_config_install_test/config/install/field.field.node.options_install_test.body.yml
index 2078a84..2d93745 100644
--- a/core/modules/options/tests/options_config_install_test/config/install/field.field.node.options_install_test.body.yml
+++ b/core/modules/options/tests/options_config_install_test/config/install/field.field.node.options_install_test.body.yml
@@ -16,5 +16,6 @@ default_value: {  }
 default_value_callback: ''
 settings:
   display_summary: true
+  available_formats: {  }
 third_party_settings: {  }
 field_type: text_with_summary
diff --git a/core/modules/text/config/schema/text.schema.yml b/core/modules/text/config/schema/text.schema.yml
index dfc92cd..af49e03 100644
--- a/core/modules/text/config/schema/text.schema.yml
+++ b/core/modules/text/config/schema/text.schema.yml
@@ -19,6 +19,10 @@ field.storage_settings.text:
 field.field_settings.text:
   type: mapping
   label: 'Text (formatted) settings'
+  mapping:
+    available_formats:
+      type: mapping
+      label: 'Available formats'
 
 field.value.text:
   type: mapping
@@ -38,6 +42,10 @@ field.storage_settings.text_long:
 field.field_settings.text_long:
   label: 'Text (formatted, long) settings'
   type: mapping
+  mapping:
+    available_formats:
+      type: mapping
+      label: 'Available formats'
 
 field.value.text_long:
   type: mapping
@@ -61,6 +69,9 @@ field.field_settings.text_with_summary:
     display_summary:
       type: boolean
       label: 'Summary input'
+    available_formats:
+      type: mapping
+      label: 'Available formats'
 
 field.value.text_with_summary:
   type: mapping
diff --git a/core/modules/text/src/Plugin/Field/FieldType/TextItemBase.php b/core/modules/text/src/Plugin/Field/FieldType/TextItemBase.php
index 13d15c9..d1fbfc1 100644
--- a/core/modules/text/src/Plugin/Field/FieldType/TextItemBase.php
+++ b/core/modules/text/src/Plugin/Field/FieldType/TextItemBase.php
@@ -12,12 +12,37 @@
 use Drupal\Core\Field\FieldItemBase;
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
 use Drupal\Core\TypedData\DataDefinition;
+use Drupal\Core\Form\FormStateInterface;
 
 /**
  * Base class for 'text' configurable field types.
  */
 abstract class TextItemBase extends FieldItemBase {
 
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultFieldSettings() {
+    return array(
+      'available_formats' => array(),
+    ) + parent::defaultFieldSettings();
+  }
+
+  public function fieldSettingsForm(array $form, FormStateInterface $form_state) {
+    $element = parent::fieldSettingsForm($form, $form_state);
+    $settings = $this->getSettings();
+
+    $element['available_formats'] =  array(
+      '#type' => 'checkboxes',
+      '#title' => t('Available text formats'),
+      '#options' => $this->getProperties()['format']->getPossibleOptions(),
+      '#default_value' => $settings['available_formats'],
+    );
+
+    return $element;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/text/src/Plugin/Field/FieldType/TextWithSummaryItem.php b/core/modules/text/src/Plugin/Field/FieldType/TextWithSummaryItem.php
index 48d4dac..6f65d94 100644
--- a/core/modules/text/src/Plugin/Field/FieldType/TextWithSummaryItem.php
+++ b/core/modules/text/src/Plugin/Field/FieldType/TextWithSummaryItem.php
@@ -90,7 +90,7 @@ public function isEmpty() {
    * {@inheritdoc}
    */
   public function fieldSettingsForm(array $form, FormStateInterface $form_state) {
-    $element = array();
+    $element = parent::fieldSettingsForm($form, $form_state);
     $settings = $this->getSettings();
 
     $element['display_summary'] = array(
diff --git a/core/modules/text/src/Plugin/Field/FieldWidget/TextareaWidget.php b/core/modules/text/src/Plugin/Field/FieldWidget/TextareaWidget.php
index 0ac3151..1701109 100644
--- a/core/modules/text/src/Plugin/Field/FieldWidget/TextareaWidget.php
+++ b/core/modules/text/src/Plugin/Field/FieldWidget/TextareaWidget.php
@@ -35,6 +35,12 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
     $element['#type'] = 'text_format';
     $element['#format'] = $items[$delta]->format;
     $element['#base_type'] = $main_widget['value']['#type'];
+
+    $available_formats = array_filter($this->getFieldSetting('available_formats'));
+    if (!empty($available_formats) && !$this->isDefaultValueWidget($form_state)) {
+      $element['#allowed_formats'] = $available_formats;
+    }
+
     return $element;
   }
 
diff --git a/core/modules/text/src/Plugin/Field/FieldWidget/TextfieldWidget.php b/core/modules/text/src/Plugin/Field/FieldWidget/TextfieldWidget.php
index ab2f19a..7c699f0 100644
--- a/core/modules/text/src/Plugin/Field/FieldWidget/TextfieldWidget.php
+++ b/core/modules/text/src/Plugin/Field/FieldWidget/TextfieldWidget.php
@@ -35,6 +35,12 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
     $element['#type'] = 'text_format';
     $element['#format'] = isset($items[$delta]->format) ? $items[$delta]->format : NULL;
     $element['#base_type'] = $main_widget['value']['#type'];
+
+    $available_formats = array_filter($this->getFieldSetting('available_formats'));
+    if (!empty($available_formats) && !$this->isDefaultValueWidget($form_state)) {
+      $element['#allowed_formats'] = $available_formats;
+    }
+
     return $element;
   }
 
diff --git a/core/modules/views/src/Tests/Entity/ViewEntityDependenciesTest.php b/core/modules/views/src/Tests/Entity/ViewEntityDependenciesTest.php
index 8805214..678c08f 100644
--- a/core/modules/views/src/Tests/Entity/ViewEntityDependenciesTest.php
+++ b/core/modules/views/src/Tests/Entity/ViewEntityDependenciesTest.php
@@ -76,7 +76,10 @@ protected function setUp() {
       'field_storage' => FieldStorageConfig::loadByName('node', 'body'),
       'bundle' => $content_type->id(),
       'label' => $this->randomMachineName() . '_body',
-      'settings' => array('display_summary' => TRUE),
+      'settings' => array(
+        'display_summary' => TRUE,
+        'allowed_formats' => array(),
+      ),
     ))->save();
 
     ViewTestData::createTestViews(get_class($this), array('views_test_config'));
diff --git a/core/profiles/standard/config/install/field.field.block_content.basic.body.yml b/core/profiles/standard/config/install/field.field.block_content.basic.body.yml
index e115700..bff3742 100644
--- a/core/profiles/standard/config/install/field.field.block_content.basic.body.yml
+++ b/core/profiles/standard/config/install/field.field.block_content.basic.body.yml
@@ -18,5 +18,6 @@ default_value: {  }
 default_value_callback: ''
 settings:
   display_summary: false
+  available_formats: {  }
 third_party_settings: {  }
 field_type: text_with_summary
diff --git a/core/profiles/standard/config/install/field.field.comment.comment.comment_body.yml b/core/profiles/standard/config/install/field.field.comment.comment.comment_body.yml
index 30aaabe..16d01d4 100644
--- a/core/profiles/standard/config/install/field.field.comment.comment.comment_body.yml
+++ b/core/profiles/standard/config/install/field.field.comment.comment.comment_body.yml
@@ -16,6 +16,7 @@ required: true
 translatable: true
 default_value: {  }
 default_value_callback: ''
-settings: {  }
+settings:
+  available_formats: {  }
 third_party_settings: {  }
 field_type: text_long
diff --git a/core/profiles/standard/config/install/field.field.node.article.body.yml b/core/profiles/standard/config/install/field.field.node.article.body.yml
index e2cdb3a..37fdc0b 100644
--- a/core/profiles/standard/config/install/field.field.node.article.body.yml
+++ b/core/profiles/standard/config/install/field.field.node.article.body.yml
@@ -18,5 +18,6 @@ default_value: {  }
 default_value_callback: ''
 settings:
   display_summary: true
+  available_formats: {  }
 third_party_settings: {  }
 field_type: text_with_summary
diff --git a/core/profiles/standard/config/install/field.field.node.page.body.yml b/core/profiles/standard/config/install/field.field.node.page.body.yml
index 57bb0b0..62c5eff 100644
--- a/core/profiles/standard/config/install/field.field.node.page.body.yml
+++ b/core/profiles/standard/config/install/field.field.node.page.body.yml
@@ -18,5 +18,6 @@ default_value: {  }
 default_value_callback: ''
 settings:
   display_summary: true
+  available_formats: {  }
 third_party_settings: {  }
 field_type: text_with_summary
