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/link/link.module b/core/modules/field/modules/link/link.module
index 947c2e9..80f70af 100644
--- a/core/modules/field/modules/link/link.module
+++ b/core/modules/field/modules/link/link.module
@@ -97,19 +97,53 @@ function link_field_widget_info() {
   $widgets['link_default'] = array(
     'label' => 'Link',
     'field types' => array('link'),
+    'settings' => array(
+      'placeholder_title',
+      'placeholder_url',
+    ),
   );
   return $widgets;
 }
 
 /**
+ * Implements hook_field_widget_settings_form().
+ */
+function link_field_widget_settings_form($field, $instance) {
+  $widget = $instance['widget'];
+  $settings = $widget['settings'];
+
+  $form['placeholder_url'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Placeholder for URL'),
+    '#default_value' => isset($settings['placeholder_url']) ? $settings['placeholder_url'] : '',
+    '#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.'),
+  );
+  $form['placeholder_title'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Placeholder for link title'),
+    '#default_value' => isset($settings['placeholder_title']) ? $settings['placeholder_title'] : '',
+    '#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.'),
+    '#states' => array(
+      'invisible' => array(
+        ':input[name="instance[settings][title]"]' => array('value' => DRUPAL_DISABLED),
+      ),
+    ),
+  );
+
+  return $form;
+}
+
+/**
  * Implements hook_field_widget_form().
  */
 function link_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
   $settings = $instance['settings'];
+  $widget_settings = $instance['widget']['settings'];
 
   $element['url'] = array(
     '#type' => 'url',
     '#title' => t('URL'),
+    '#placeholder' => isset($widget_settings['placeholder_url']) ? $widget_settings['placeholder_url'] : '',
     '#default_value' => isset($items[$delta]['url']) ? $items[$delta]['url'] : NULL,
     '#maxlength' => 2048,
     '#required' => $element['#required'],
@@ -117,6 +151,7 @@ function link_field_widget_form(&$form, &$form_state, $field, $instance, $langco
   $element['title'] = array(
     '#type' => 'textfield',
     '#title' => t('Title'),
+    '#placeholder' => isset($widget_settings['placeholder_title']) ? $widget_settings['placeholder_title'] : '',
     '#default_value' => isset($items[$delta]['title']) ? $items[$delta]['title'] : NULL,
     '#maxlength' => 255,
     '#access' => $settings['title'] != DRUPAL_DISABLED,
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..0d38710 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[widget][settings][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'),
     );
