diff --git a/core/modules/field/modules/email/lib/Drupal/email/Plugin/field/widget/EmailDefaultWidget.php b/core/modules/field/modules/email/lib/Drupal/email/Plugin/field/widget/EmailDefaultWidget.php
index bb4e859..dbbcccd 100644
--- a/core/modules/field/modules/email/lib/Drupal/email/Plugin/field/widget/EmailDefaultWidget.php
+++ b/core/modules/field/modules/email/lib/Drupal/email/Plugin/field/widget/EmailDefaultWidget.php
@@ -20,18 +20,35 @@
  *   label = @Translation("E-mail"),
  *   field_types = {
  *     "email"
+ *   },
+ *   settings = {
+ *     "placeholder" = ""
  *   }
  * )
  */
 class EmailDefaultWidget extends WidgetBase {
 
   /**
+   * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::settingsForm().
+   */
+  public function settingsForm(array $form, array &$form_state) {
+    $element['placeholder'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Placeholder'),
+      '#default_value' => $this->getSetting('placeholder'),
+      '#description' => t('The placeholder attribute represents a short hint (a word or short phrase) intended to aid the user with data entry. A hint could be a sample value or a brief description of the expected format.'),
+    );
+    return $element;
+  }
+
+  /**
    * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement().
    */
   public function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) {
     $element['value'] = $element + array(
       '#type' => 'email',
       '#default_value' => isset($items[$delta]['value']) ? $items[$delta]['value'] : NULL,
+      '#placeholder' => $this->getSetting('placeholder'),
     );
     return $element;
   }
diff --git a/core/modules/field/modules/number/lib/Drupal/number/Plugin/field/widget/NumberWidget.php b/core/modules/field/modules/number/lib/Drupal/number/Plugin/field/widget/NumberWidget.php
index ecaf204..4fd6afa 100644
--- a/core/modules/field/modules/number/lib/Drupal/number/Plugin/field/widget/NumberWidget.php
+++ b/core/modules/field/modules/number/lib/Drupal/number/Plugin/field/widget/NumberWidget.php
@@ -22,12 +22,28 @@
  *     "number_integer",
  *     "number_decimal",
  *     "number_float"
+ *   },
+ *   settings = {
+ *     "placeholder" = ""
  *   }
  * )
  */
 class NumberWidget extends WidgetBase {
 
   /**
+   * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::settingsForm().
+   */
+  public function settingsForm(array $form, array &$form_state) {
+    $element['placeholder'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Placeholder'),
+      '#default_value' => $this->getSetting('placeholder'),
+      '#description' => t('The placeholder attribute represents a short hint (a word or short phrase) intended to aid the user with data entry. A hint could be a sample value or a brief description of the expected format.'),
+    );
+    return $element;
+  }
+
+  /**
    * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement().
    */
   public function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) {
@@ -39,6 +55,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr
     $element += array(
       '#type' => 'number',
       '#default_value' => $value,
+      '#placeholder' => $this->getSetting('placeholder'),
     );
 
     // Set the step for floating point and decimal numbers.
diff --git a/core/modules/field/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWidget.php b/core/modules/field/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWidget.php
index 17f80a0..db2efda 100644
--- a/core/modules/field/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWidget.php
+++ b/core/modules/field/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWidget.php
@@ -22,7 +22,8 @@
  *     "text_long"
  *   },
  *   settings = {
- *     "rows" = "5"
+ *     "rows" = "5",
+ *     "placeholder" = ""
  *   }
  * )
  */
@@ -39,6 +40,12 @@ public function settingsForm(array $form, array &$form_state) {
       '#required' => TRUE,
       '#min' => 1,
     );
+    $element['placeholder'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Placeholder'),
+      '#default_value' => $this->getSetting('placeholder'),
+      '#description' => t('The placeholder attribute represents a short hint (a word or short phrase) intended to aid the user with data entry. A hint could be a sample value or a brief description of the expected format.'),
+    );
     return $element;
   }
 
@@ -50,6 +57,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr
       '#type' => 'textarea',
       '#default_value' => isset($items[$delta]['value']) ? $items[$delta]['value'] : NULL,
       '#rows' => $this->getSetting('rows'),
+      '#placeholder' => $this->getSetting('placeholder'),
       '#attributes' => array('class' => array('text-full')),
     );
 
diff --git a/core/modules/field/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWithSummaryWidget.php b/core/modules/field/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWithSummaryWidget.php
index 373f1ed..696cbe2 100644
--- a/core/modules/field/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWithSummaryWidget.php
+++ b/core/modules/field/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWithSummaryWidget.php
@@ -22,7 +22,8 @@
  *   },
  *   settings = {
  *     "rows" = "9",
- *     "summary_rows" = "3"
+ *     "summary_rows" = "3",
+ *     "placeholder" = ""
  *   }
  * )
  */
diff --git a/core/modules/field/modules/text/lib/Drupal/text/Plugin/field/widget/TextfieldWidget.php b/core/modules/field/modules/text/lib/Drupal/text/Plugin/field/widget/TextfieldWidget.php
index e6b87b1..0a8b4dd 100644
--- a/core/modules/field/modules/text/lib/Drupal/text/Plugin/field/widget/TextfieldWidget.php
+++ b/core/modules/field/modules/text/lib/Drupal/text/Plugin/field/widget/TextfieldWidget.php
@@ -22,7 +22,8 @@
  *     "text"
  *   },
  *   settings = {
- *     "size" = "60"
+ *     "size" = "60",
+ *     "placeholder" = ""
  *   }
  * )
  */
@@ -39,6 +40,12 @@ public function settingsForm(array $form, array &$form_state) {
       '#required' => TRUE,
       '#min' => 1,
     );
+    $element['placeholder'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Placeholder'),
+      '#default_value' => $this->getSetting('placeholder'),
+      '#description' => t('The placeholder attribute represents a short hint (a word or short phrase) intended to aid the user with data entry. A hint could be a sample value or a brief description of the expected format.'),
+    );
     return $element;
   }
 
@@ -50,6 +57,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr
       '#type' => 'textfield',
       '#default_value' => isset($items[$delta]['value']) ? $items[$delta]['value'] : NULL,
       '#size' => $this->getSetting('size'),
+      '#placeholder' => $this->getSetting('placeholder'),
       '#maxlength' => $this->field['settings']['max_length'],
       '#attributes' => array('class' => array('text-full')),
     );
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Tests/FieldUiTestBase.php b/core/modules/field_ui/lib/Drupal/field_ui/Tests/FieldUiTestBase.php
index 39324bf..f552076 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/Tests/FieldUiTestBase.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/Tests/FieldUiTestBase.php
@@ -25,7 +25,7 @@ function setUp() {
     parent::setUp();
 
     // Create test user.
-    $admin_user = $this->drupalCreateUser(array('access content', 'administer content types', 'administer taxonomy', 'administer users'));
+    $admin_user = $this->drupalCreateUser(array('access content', 'administer content types', 'administer taxonomy', 'administer users', 'bypass node access'));
     $this->drupalLogin($admin_user);
 
     // Create content type, with underscores.
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageFieldsTest.php b/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageFieldsTest.php
index 17d4bd7..e8a2f51 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageFieldsTest.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageFieldsTest.php
@@ -353,4 +353,26 @@ function testDuplicateFieldName() {
     $this->assertText(t('The machine-readable name is already in use. It must be unique.'));
     $this->assertUrl($url, array(), 'Stayed on the same page.');
   }
+
+  /**
+   * Tests that placeholder element shows up.
+   */
+  function testPlaceholderElement() {
+    $bundle_path = 'admin/structure/types/manage/page';
+    $initial_edit = array(
+      'fields[_add_new_field][label]' => $this->field_label,
+      'fields[_add_new_field][field_name]' => $this->field_name_input,
+      'fields[_add_new_field][type]' => 'text',
+      'fields[_add_new_field][widget_type]' => 'text_textfield',
+    );
+
+    $instance_edit = array(
+      'instance[placeholder]' => 'This is a placeholder',
+    );
+    $this->fieldUIAddNewField($bundle_path, $initial_edit, array(), $instance_edit);
+
+    // Login and verify the placeholder element is present on the text field.
+    $this->drupalGet('node/add/page');
+    $this->assertRaw('placeholder="This is a placeholder"');
+  }
 }
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/field/widget/TaxonomyAutocompleteWidget.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/field/widget/TaxonomyAutocompleteWidget.php
index 3f4d510..2d4306b 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/field/widget/TaxonomyAutocompleteWidget.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/field/widget/TaxonomyAutocompleteWidget.php
@@ -23,7 +23,8 @@
  *   },
  *   settings = {
  *     "size" = "60",
- *     "autocomplete_path" = "taxonomy/autocomplete"
+ *     "autocomplete_path" = "taxonomy/autocomplete",
+ *     "placeholder" = ""
  *   },
  *   multiple_values = TRUE
  * )
@@ -31,6 +32,19 @@
 class TaxonomyAutocompleteWidget extends WidgetBase {
 
   /**
+   * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::settingsForm().
+   */
+  public function settingsForm(array $form, array &$form_state) {
+    $element['placeholder'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Placeholder'),
+      '#default_value' => $this->getSetting('placeholder'),
+      '#description' => t('The placeholder attribute represents a short hint (a word or short phrase) intended to aid the user with data entry. A hint could be a sample value or a brief description of the expected format.'),
+    );
+    return $element;
+  }
+
+  /**
    * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement().
    */
   public function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) {
@@ -45,6 +59,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr
       '#default_value' => taxonomy_implode_tags($tags),
       '#autocomplete_path' => $this->getSetting('autocomplete_path') . '/' . $field['field_name'],
       '#size' => $this->getSetting('size'),
+      '#placeholder' => $this->getSetting('placeholder'),
       '#maxlength' => 1024,
       '#element_validate' => array('taxonomy_autocomplete_validate'),
     );
