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 5a32aa6..63a4bef 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItem.php
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Contains \Drupal\Core\Entity\Plugin\Field\FieldType\StringItem.
+ * Contains \Drupal\Core\Field\Plugin\Field\FieldType\StringItem.
  */
 
 namespace Drupal\Core\Field\Plugin\Field\FieldType;
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php
index 27ca9e9..f9e9869 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Contains \Drupal\Core\Entity\Plugin\Field\FieldType\UuidItem.
+ * Contains \Drupal\Core\Field\Plugin\Field\FieldType\UuidItem.
  */
 
 namespace Drupal\Core\Field\Plugin\Field\FieldType;
diff --git a/core/modules/field/field.module b/core/modules/field/field.module
index 6bd2c6d..cc706c7 100644
--- a/core/modules/field/field.module
+++ b/core/modules/field/field.module
@@ -690,3 +690,14 @@ function field_hook_info() {
 
   return $hooks;
 }
+
+/**
+ * Implements hook_field_info_alter().
+ */
+function field_field_info_alter(&$info) {
+  // Provide the core field types with formatters and widgets.
+  $info['string']['default_formatter'] = 'text_plain';
+  $info['string']['default_widget'] = 'field_text';
+  $info['integer']['default_formatter'] = 'text_plain';
+  $info['integer']['default_widget'] = 'field_text';
+}
diff --git a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldFormatter/TextPlainFormatter.php b/core/modules/field/lib/Drupal/field/Plugin/Field/FieldFormatter/FieldTextFormatter.php
similarity index 72%
rename from core/modules/text/lib/Drupal/text/Plugin/Field/FieldFormatter/TextPlainFormatter.php
rename to core/modules/field/lib/Drupal/field/Plugin/Field/FieldFormatter/FieldTextFormatter.php
index 6c15bf5..b52f5c9 100644
--- a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldFormatter/TextPlainFormatter.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Field/FieldFormatter/FieldTextFormatter.php
@@ -2,11 +2,12 @@
 
 /**
  * @file
- * Contains \Drupal\text\Plugin\field\formatter\TextPlainFormatter.
+ * Contains \Drupal\text\Plugin\field\formatter\FieldTextFormatter.
  */
 
-namespace Drupal\text\Plugin\Field\FieldFormatter;
+namespace Drupal\field\Plugin\Field\FieldFormatter;
 
+use Drupal\Component\Utility\String;
 use Drupal\Core\Field\FormatterBase;
 use Drupal\Core\Field\FieldItemListInterface;
 
@@ -26,7 +27,7 @@
  *   }
  * )
  */
-class TextPlainFormatter extends FormatterBase {
+class FieldTextFormatter extends FormatterBase {
 
   /**
    * {@inheritdoc}
@@ -37,7 +38,7 @@ public function viewElements(FieldItemListInterface $items) {
     foreach ($items as $delta => $item) {
       // The text value has no text format assigned to it, so the user input
       // should equal the output, including newlines.
-      $elements[$delta] = array('#markup' => nl2br(check_plain($item->value)));
+      $elements[$delta] = array('#markup' => nl2br(String::checkPlain($item->value)));
     }
 
     return $elements;
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Field/FieldWidget/TextWidget.php b/core/modules/field/lib/Drupal/field/Plugin/Field/FieldWidget/TextWidget.php
new file mode 100644
index 0000000..c58cc85
--- /dev/null
+++ b/core/modules/field/lib/Drupal/field/Plugin/Field/FieldWidget/TextWidget.php
@@ -0,0 +1,82 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\field\Plugin\Field\FieldWidget\TextWidget.
+ */
+
+namespace Drupal\field\Plugin\Field\FieldWidget;
+
+use Drupal\Core\Field\FieldItemListInterface;
+use Drupal\Core\Field\WidgetBase;
+
+/**
+ * Plugin implementation of the 'field_text' widget.
+ *
+ * @FieldWidget(
+ * id = "field_text",
+ * label = @Translation("Text field"),
+ * field_types = {
+ * "string",
+ * "number"
+ * },
+ * settings = {
+ * "size" = "60",
+ * "placeholder" = ""
+ * }
+ * )
+ */
+class TextWidget 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;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, array &$form_state) {
+    $element['value'] = $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')),
+      );
+
+    return $element;
+  }
+
+}
diff --git a/core/modules/node/lib/Drupal/node/Entity/Node.php b/core/modules/node/lib/Drupal/node/Entity/Node.php
index b8f2a0e..0a544d5 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' => 'plain_text',
         'weight' => -5,
       ))
       ->setDisplayOptions('form', array(
-        'type' => 'text_textfield',
+        'type' => 'field_text',
         'weight' => -5,
       ))
       ->setDisplayConfigurable('form', TRUE);
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..88c4280 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
@@ -54,27 +54,6 @@ 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')) {
-      $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)),
-          )
-        ),
-      ));
-    }
-
-    return $constraints;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function settingsForm(array $form, array &$form_state, $has_data) {
     $element = array();
 
diff --git a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextItemBase.php b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextItemBase.php
index 9cac637..9cfaea0 100644
--- a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextItemBase.php
+++ b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextItemBase.php
@@ -8,6 +8,7 @@
 namespace Drupal\text\Plugin\Field\FieldType;
 
 use Drupal\Core\Field\ConfigFieldItemBase;
+use Drupal\Core\Field\ConfigFieldItemInterface;
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\PrepareCacheInterface;
 use Drupal\Core\TypedData\DataDefinition;
@@ -15,7 +16,7 @@
 /**
  * Base class for 'text' configurable field types.
  */
-abstract class TextItemBase extends ConfigFieldItemBase implements PrepareCacheInterface {
+abstract class TextItemBase extends StringItem implements ConfigFieldItemInterface, PrepareCacheInterface {
 
   /**
    * {@inheritdoc}
@@ -94,4 +95,11 @@ public function onChange($property_name) {
     }
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsForm(array $form, array &$form_state, $has_data) {
+    return array();
+  }
+
 }
diff --git a/core/modules/text/lib/Drupal/text/TextProcessed.php b/core/modules/text/lib/Drupal/text/TextProcessed.php
index d07a196..7530b15 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\field\Plugin\field\formatter\FieldTextFormatter
       $this->processed = nl2br(check_plain($text));
     }
     return $this->processed;
diff --git a/core/modules/text/text.module b/core/modules/text/text.module
index b1672de..f3843c6 100644
--- a/core/modules/text/text.module
+++ b/core/modules/text/text.module
@@ -170,3 +170,15 @@ 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) {
+  // Allow the text field types to be used with the formatter provided by Field
+  // module.
+  $info['text_plain']['field_types'] = array_merge(
+    $info['text_plain']['field_types'],
+    array('text', 'text_long', 'text_with_summary')
+  );
+}
