diff --git a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldFormatter/TextPlainFormatter.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/StringFormatter.php
similarity index 68%
rename from core/modules/text/lib/Drupal/text/Plugin/Field/FieldFormatter/TextPlainFormatter.php
rename to core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/StringFormatter.php
index 6c15bf5..f0bb645 100644
--- a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldFormatter/TextPlainFormatter.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/StringFormatter.php
@@ -2,31 +2,29 @@
 
 /**
  * @file
- * Contains \Drupal\text\Plugin\field\formatter\TextPlainFormatter.
+ * Contains \Drupal\Core\Field\Plugin\field\formatter\StringFormatter.
  */
 
-namespace Drupal\text\Plugin\Field\FieldFormatter;
+namespace Drupal\Core\Field\Plugin\Field\FieldFormatter;
 
 use Drupal\Core\Field\FormatterBase;
 use Drupal\Core\Field\FieldItemListInterface;
 
 /**
- * Plugin implementation of the 'text_plain' formatter.
+ * Plugin implementation of the 'string' formatter.
  *
  * @FieldFormatter(
- *   id = "text_plain",
+ *   id = "string",
  *   label = @Translation("Plain text"),
  *   field_types = {
- *     "text",
- *     "text_long",
- *     "text_with_summary"
+ *     "string"
  *   },
  *   edit = {
  *     "editor" = "plain_text"
  *   }
  * )
  */
-class TextPlainFormatter extends FormatterBase {
+class StringFormatter extends FormatterBase {
 
   /**
    * {@inheritdoc}
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EmailItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EmailItem.php
index 9e68719..0bb1c53 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EmailItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EmailItem.php
@@ -18,7 +18,9 @@
  *   id = "email",
  *   label = @Translation("E-mail"),
  *   description = @Translation("An entity field containing an e-mail value."),
- *   configurable = FALSE
+ *   configurable = FALSE,
+ *   default_widget = "string",
+ *   default_formatter = "string"
  * )
  */
 class EmailItem extends FieldItemBase {
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItem.php
index c5f6c77..ac1b786 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItem.php
@@ -21,7 +21,9 @@
  *   settings = {
  *     "max_length" = "255"
  *   },
- *   configurable = FALSE
+ *   configurable = FALSE,
+ *   default_widget = "string",
+ *   default_formatter = "string"
  * )
  */
 class StringItem extends FieldItemBase {
@@ -71,7 +73,12 @@ public function getConstraints() {
     if ($max_length = $this->getSetting('max_length')) {
       $constraint_manager = \Drupal::typedDataManager()->getValidationConstraintManager();
       $constraints[] = $constraint_manager->create('ComplexData', array(
-        'value' => array('Length' => array('max' => $max_length))
+        'value' => array(
+          'Length' => array(
+            'max' => $max_length,
+            'maxMessage' => t('%name: the string may not be longer than @max characters.', array('%name' => $this->getFieldDefinition()->getLabel(), '@max' => $max_length)),
+          ),
+        ),
       ));
     }
 
diff --git a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldWidget/TextfieldWidget.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/StringWidget.php
similarity index 59%
copy from core/modules/text/lib/Drupal/text/Plugin/Field/FieldWidget/TextfieldWidget.php
copy to core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/StringWidget.php
index b35e633..524e89d 100644
--- a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldWidget/TextfieldWidget.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/StringWidget.php
@@ -2,23 +2,22 @@
 
 /**
  * @file
- * Contains \Drupal\text\Plugin\Field\FieldWidget\TextfieldWidget.
+ * Contains \Drupal\Core\Field\Plugin\Field\FieldWidget\StringWidget.
  */
 
-namespace Drupal\text\Plugin\Field\FieldWidget;
+namespace Drupal\Core\Field\Plugin\Field\FieldWidget;
 
 use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\Core\Field\WidgetBase;
-use Symfony\Component\Validator\ConstraintViolationInterface;
 
 /**
- * Plugin implementation of the 'text_textfield' widget.
+ * Plugin implementation of the 'string' widget.
  *
  * @FieldWidget(
- *   id = "text_textfield",
- *   label = @Translation("Text field"),
+ *   id = "string",
+ *   label = @Translation("String field"),
  *   field_types = {
- *     "text"
+ *     "string"
  *   },
  *   settings = {
  *     "size" = "60",
@@ -26,7 +25,7 @@
  *   }
  * )
  */
-class TextfieldWidget extends WidgetBase {
+class StringWidget extends WidgetBase {
 
   /**
    * {@inheritdoc}
@@ -67,7 +66,7 @@ public function settingsSummary() {
    * {@inheritdoc}
    */
   public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, array &$form_state) {
-    $main_widget = $element + array(
+    $element['value'] = $element + array(
       '#type' => 'textfield',
       '#default_value' => isset($items[$delta]->value) ? $items[$delta]->value : NULL,
       '#size' => $this->getSetting('size'),
@@ -76,28 +75,6 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
       '#attributes' => array('class' => array('text-full')),
     );
 
-    if ($this->getFieldSetting('text_processing')) {
-      $element = $main_widget;
-      $element['#type'] = 'text_format';
-      $element['#format'] = isset($items[$delta]->format) ? $items[$delta]->format : NULL;
-      $element['#base_type'] = $main_widget['#type'];
-    }
-    else {
-      $element['value'] = $main_widget;
-    }
-
-    return $element;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function errorElement(array $element, ConstraintViolationInterface $violation, array $form, array &$form_state) {
-    if ($violation->arrayPropertyPath == array('format') && isset($element['format']['#access']) && !$element['format']['#access']) {
-      // Ignore validation errors for formats if formats may not be changed,
-      // i.e. when existing formats become invalid. See filter_process_format().
-      return FALSE;
-    }
     return $element;
   }
 
diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentValidationTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentValidationTest.php
index 5f7e03f..a3567da 100644
--- a/core/modules/comment/lib/Drupal/comment/Tests/CommentValidationTest.php
+++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentValidationTest.php
@@ -135,7 +135,8 @@ protected function assertLengthViolation(CommentInterface $comment, $field_name,
     $violations = $comment->validate();
     $this->assertEqual(count($violations), 1, "Violation found when $field_name is too long.");
     $this->assertEqual($violations[0]->getPropertyPath(), "$field_name.0.value");
-    $this->assertEqual($violations[0]->getMessage(), t('This value is too long. It should have %limit characters or less.', array('%limit' => $length)));
+    $field_label = $comment->get($field_name)->getFieldDefinition()->getLabel();
+    $this->assertEqual($violations[0]->getMessage(), t('%name: the string may not be longer than @max characters.', array('%name' => $field_label, '@max' => $length)));
   }
 
 }
diff --git a/core/modules/email/email.module b/core/modules/email/email.module
index f74da6f..363c33d 100644
--- a/core/modules/email/email.module
+++ b/core/modules/email/email.module
@@ -35,12 +35,7 @@ function email_field_info_alter(&$info) {
   $info['email']['class'] = '\Drupal\email\ConfigurableEmailItem';
   $info['email']['list_class'] = '\Drupal\Core\Field\ConfigFieldItemList';
   $info['email']['default_widget'] = 'email_default';
-  if (\Drupal::moduleHandler()->moduleExists('text')) {
-    $info['email']['default_formatter'] = 'text_plain';
-  }
-  else {
-    $info['email']['default_formatter'] = 'email_mailto';
-  }
+  $info['email']['default_formatter'] = 'email_mailto';
   $info['email']['provider'] = 'email';
 }
 
@@ -48,7 +43,5 @@ function email_field_info_alter(&$info) {
  * Implements hook_field_formatter_info_alter().
  */
 function email_field_formatter_info_alter(&$info) {
-  if (isset($info['text_plain'])) {
-    $info['text_plain']['field_types'][] = 'email';
-  }
+  $info['string']['field_types'][] = 'email';
 }
diff --git a/core/modules/entity/config/schema/entity.schema.yml b/core/modules/entity/config/schema/entity.schema.yml
index a2d0b43..6334cb4 100644
--- a/core/modules/entity/config/schema/entity.schema.yml
+++ b/core/modules/entity/config/schema/entity.schema.yml
@@ -139,3 +139,13 @@ entity_form_display.field.*:
     weight:
       type: integer
       label: 'Weight'
+
+entity_view_display.field.string:
+  type: entity_field_view_display_base
+  label: 'Plain text display format settings'
+  mapping:
+    settings:
+      type: sequence
+      label: 'Settings'
+      sequence:
+        - type: string
diff --git a/core/modules/field/lib/Drupal/field/Tests/Views/FieldUITest.php b/core/modules/field/lib/Drupal/field/Tests/Views/FieldUITest.php
index 07507fe..3f01234 100644
--- a/core/modules/field/lib/Drupal/field/Tests/Views/FieldUITest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/Views/FieldUITest.php
@@ -73,7 +73,7 @@ public function testHandlerUI() {
     }, $result);
     // @todo Replace this sort by assertArray once it's in.
     sort($options, SORT_STRING);
-    $this->assertEqual($options, array('text_default', 'text_plain', 'text_trimmed'), 'The text formatters for a simple text field appear as expected.');
+    $this->assertEqual($options, array('string', 'text_default', 'text_trimmed'), 'The text formatters for a simple text field appear as expected.');
 
     $this->drupalPostForm(NULL, array('options[type]' => 'text_trimmed'), t('Apply'));
 
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverviewBase.php b/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverviewBase.php
index 2ed54e8..e81f1c6 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverviewBase.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverviewBase.php
@@ -53,7 +53,7 @@
   public function __construct(EntityManagerInterface $entity_manager, FieldTypePluginManagerInterface $field_type_manager, PluginManagerBase $plugin_manager) {
     parent::__construct($entity_manager);
 
-    $this->fieldTypes = $field_type_manager->getConfigurableDefinitions();
+    $this->fieldTypes = $field_type_manager->getDefinitions();
     $this->pluginManager = $plugin_manager;
   }
 
diff --git a/core/modules/node/lib/Drupal/node/Entity/Node.php b/core/modules/node/lib/Drupal/node/Entity/Node.php
index b8f2a0e..7443b81 100644
--- a/core/modules/node/lib/Drupal/node/Entity/Node.php
+++ b/core/modules/node/lib/Drupal/node/Entity/Node.php
@@ -378,7 +378,7 @@ public static function baseFieldDefinitions($entity_type) {
       ->setLabel(t('Language code'))
       ->setDescription(t('The node language code.'));
 
-    $fields['title'] = FieldDefinition::create('text')
+    $fields['title'] = FieldDefinition::create('string')
       // @todo Account for $node_type->title_label when per-bundle overrides are
       //   possible - https://drupal.org/node/2114707.
       ->setLabel(t('Title'))
@@ -389,15 +389,14 @@ public static function baseFieldDefinitions($entity_type) {
       ->setSettings(array(
         'default_value' => '',
         'max_length' => 255,
-        'text_processing' => 0,
       ))
       ->setDisplayOptions('view', array(
         'label' => 'hidden',
-        'type' => 'text_default',
+        'type' => 'string',
         'weight' => -5,
       ))
       ->setDisplayOptions('form', array(
-        'type' => 'text_textfield',
+        'type' => 'string',
         'weight' => -5,
       ))
       ->setDisplayConfigurable('form', TRUE);
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeValidationTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeValidationTest.php
index 7b0a0a0..1ab176b 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeValidationTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeValidationTest.php
@@ -54,7 +54,7 @@ public function testValidation() {
     $violations = $node->validate();
     $this->assertEqual(count($violations), 1, 'Violation found when title is too long.');
     $this->assertEqual($violations[0]->getPropertyPath(), 'title.0.value');
-    $this->assertEqual($violations[0]->getMessage(), '<em class="placeholder">Title</em>: the text may not be longer than 255 characters.');
+    $this->assertEqual($violations[0]->getMessage(), '<em class="placeholder">Title</em>: the string may not be longer than 255 characters.');
 
     $node->set('title', NULL);
     $violations = $node->validate();
diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/Field/TextFieldRdfaTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/Field/TextFieldRdfaTest.php
index b350b95..d10318c 100644
--- a/core/modules/rdf/lib/Drupal/rdf/Tests/Field/TextFieldRdfaTest.php
+++ b/core/modules/rdf/lib/Drupal/rdf/Tests/Field/TextFieldRdfaTest.php
@@ -73,7 +73,7 @@ public function testDefaultFormatter() {
    * Tests the plain formatter.
    */
   public function testPlainFormatter() {
-    $this->assertFormatterRdfa('text_plain', 'http://schema.org/text', $this->testValue);
+    $this->assertFormatterRdfa('string', 'http://schema.org/text', $this->testValue);
   }
 
   /**
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermValidationTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermValidationTest.php
index e36668f..8d4af9b 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermValidationTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermValidationTest.php
@@ -56,7 +56,8 @@ public function testValidation() {
     $violations = $term->validate();
     $this->assertEqual(count($violations), 1, 'Violation found when name is too long.');
     $this->assertEqual($violations[0]->getPropertyPath(), 'name.0.value');
-    $this->assertEqual($violations[0]->getMessage(), t('This value is too long. It should have %limit characters or less.', array('%limit' => 255)));
+    $field_label = $term->get('name')->getFieldDefinition()->getLabel();
+    $this->assertEqual($violations[0]->getMessage(), t('%name: the string may not be longer than @max characters.', array('%name' => $field_label, '@max' => 255)));
 
     $term->set('name', NULL);
     $violations = $term->validate();
diff --git a/core/modules/telephone/telephone.module b/core/modules/telephone/telephone.module
index 23099a9..eee9213 100644
--- a/core/modules/telephone/telephone.module
+++ b/core/modules/telephone/telephone.module
@@ -26,20 +26,8 @@ function telephone_help($path, $arg) {
 }
 
 /**
- * Implements hook_field_info_alter().
- */
-function telephone_field_info_alter(&$info) {
-  if (\Drupal::moduleHandler()->moduleExists('text')) {
-    $info['telephone']['default_formatter'] = 'text_plain';
-  }
-}
-
-
-/**
  * Implements hook_field_formatter_info_alter().
  */
 function telephone_field_formatter_info_alter(&$info) {
-  if (isset($info['text_plain'])) {
-    $info['text_plain']['field_types'][] = 'telephone';
-  }
+  $info['string']['field_types'][] = 'telephone';
 }
diff --git a/core/modules/text/config/schema/text.schema.yml b/core/modules/text/config/schema/text.schema.yml
index d377366..dc54670 100644
--- a/core/modules/text/config/schema/text.schema.yml
+++ b/core/modules/text/config/schema/text.schema.yml
@@ -110,16 +110,6 @@ entity_view_display.field.text_default:
       sequence:
         - type: string
 
-entity_view_display.field.text_plain:
-  type: entity_field_view_display_base
-  label: 'Plain text display format settings'
-  mapping:
-    settings:
-      type: sequence
-      label: 'Settings'
-      sequence:
-        - type: string
-
 entity_view_display.field.text_summary_or_trimmed:
   type: entity_field_view_display_base
   label: 'Summary or trimmed text display format settings'
diff --git a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextItem.php b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextItem.php
index 93bd949..463f170 100644
--- a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextItem.php
+++ b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextItem.php
@@ -55,16 +55,16 @@ public static function schema(FieldDefinitionInterface $field_definition) {
    * {@inheritdoc}
    */
   public function getConstraints() {
-    $constraint_manager = \Drupal::typedDataManager()->getValidationConstraintManager();
     $constraints = parent::getConstraints();
 
     if ($max_length = $this->getSetting('max_length')) {
+      $constraint_manager = \Drupal::typedDataManager()->getValidationConstraintManager();
       $constraints[] = $constraint_manager->create('ComplexData', array(
         'value' => array(
           'Length' => array(
             'max' => $max_length,
             'maxMessage' => t('%name: the text may not be longer than @max characters.', array('%name' => $this->getFieldDefinition()->getLabel(), '@max' => $max_length)),
-          )
+          ),
         ),
       ));
     }
diff --git a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldWidget/TextfieldWidget.php b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldWidget/TextfieldWidget.php
index b35e633..35f6957 100644
--- a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldWidget/TextfieldWidget.php
+++ b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldWidget/TextfieldWidget.php
@@ -8,7 +8,7 @@
 namespace Drupal\text\Plugin\Field\FieldWidget;
 
 use Drupal\Core\Field\FieldItemListInterface;
-use Drupal\Core\Field\WidgetBase;
+use Drupal\Core\Field\Plugin\Field\FieldWidget\StringWidget;
 use Symfony\Component\Validator\ConstraintViolationInterface;
 
 /**
@@ -18,7 +18,8 @@
  *   id = "text_textfield",
  *   label = @Translation("Text field"),
  *   field_types = {
- *     "text"
+ *     "text",
+ *     "string"
  *   },
  *   settings = {
  *     "size" = "60",
@@ -26,67 +27,22 @@
  *   }
  * )
  */
-class TextfieldWidget extends WidgetBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function settingsForm(array $form, array &$form_state) {
-    $element['size'] = array(
-      '#type' => 'number',
-      '#title' => t('Size of textfield'),
-      '#default_value' => $this->getSetting('size'),
-      '#required' => TRUE,
-      '#min' => 1,
-    );
-    $element['placeholder'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Placeholder'),
-      '#default_value' => $this->getSetting('placeholder'),
-      '#description' => t('Text that will be shown inside the field until a value is entered. This hint is usually a sample value or a brief description of the expected format.'),
-    );
-    return $element;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function settingsSummary() {
-    $summary = array();
-
-    $summary[] = t('Textfield size: !size', array('!size' => $this->getSetting('size')));
-    $placeholder = $this->getSetting('placeholder');
-    if (!empty($placeholder)) {
-      $summary[] = t('Placeholder: @placeholder', array('@placeholder' => $placeholder));
-    }
-
-    return $summary;
-  }
+class TextfieldWidget extends StringWidget {
 
   /**
    * {@inheritdoc}
    */
   public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, array &$form_state) {
-    $main_widget = $element + array(
-      '#type' => 'textfield',
-      '#default_value' => isset($items[$delta]->value) ? $items[$delta]->value : NULL,
-      '#size' => $this->getSetting('size'),
-      '#placeholder' => $this->getSetting('placeholder'),
-      '#maxlength' => $this->getFieldSetting('max_length'),
-      '#attributes' => array('class' => array('text-full')),
-    );
+    $main_widget = parent::formElement($items, $delta, $element, $form, $form_state);
 
     if ($this->getFieldSetting('text_processing')) {
-      $element = $main_widget;
+      $element = $main_widget['value'];
       $element['#type'] = 'text_format';
       $element['#format'] = isset($items[$delta]->format) ? $items[$delta]->format : NULL;
-      $element['#base_type'] = $main_widget['#type'];
-    }
-    else {
-      $element['value'] = $main_widget;
+      $element['#base_type'] = $main_widget['value']['#type'];
+      return $element;
     }
-
-    return $element;
+    return $main_widget;
   }
 
   /**
diff --git a/core/modules/text/lib/Drupal/text/TextProcessed.php b/core/modules/text/lib/Drupal/text/TextProcessed.php
index d07a196..af2d7ab 100644
--- a/core/modules/text/lib/Drupal/text/TextProcessed.php
+++ b/core/modules/text/lib/Drupal/text/TextProcessed.php
@@ -57,7 +57,7 @@ public function getValue($langcode = NULL) {
     }
     else {
       // Escape all HTML and retain newlines.
-      // @see \Drupal\text\Plugin\field\formatter\TextPlainFormatter
+      // @see \Drupal\Core\Field\Plugin\field\formatter\StringFormatter
       $this->processed = nl2br(check_plain($text));
     }
     return $this->processed;
diff --git a/core/modules/text/text.module b/core/modules/text/text.module
index b0eb8fa..0d92089 100644
--- a/core/modules/text/text.module
+++ b/core/modules/text/text.module
@@ -190,3 +190,12 @@ function text_filter_format_update($format) {
 function text_filter_format_disable($format) {
   field_cache_clear();
 }
+
+/**
+ * Implements hook_field_formatter_info_alter().
+ */
+function text_field_formatter_info_alter(&$info) {
+  $info['string']['field_types'][] = 'text';
+  $info['string']['field_types'][] = 'text_with_summary';
+  $info['string']['field_types'][] = 'text_long';
+}
