diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetBase.php b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetBase.php
index 1dbe4bb..98134ad 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetBase.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetBase.php
@@ -113,6 +113,7 @@ public function form(EntityInterface $entity, $langcode, array $items, array &$f
       $element = array(
         '#title' => check_plain($instance['label']),
         '#description' => field_filter_xss(token_replace($instance['description'])),
+        '#placeholder' => isset($instance['placeholder']) ? $instance['placeholder'] : '',
       );
       $element = $this->formSingleElement($entity, $items, $delta, $langcode, $element, $form, $form_state);
 
@@ -204,6 +205,7 @@ protected function formMultipleElements(EntityInterface $entity, array $items, $
 
     $title = check_plain($instance['label']);
     $description = field_filter_xss(token_replace($instance['description']));
+    $placeholder = isset($instance['placeholder']) ? $instance['placeholder'] : '';
 
     $elements = array();
 
@@ -213,6 +215,7 @@ protected function formMultipleElements(EntityInterface $entity, array $items, $
       $element = array(
         '#title' => $is_multiple ? '' : $title,
         '#description' => $is_multiple ? '' : $description,
+        '#placeholder' => $placeholder,
       );
       $element = $this->formSingleElement($entity, $items, $delta, $langcode, $element, $form, $form_state);
 
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..b75a9c9 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,6 +20,9 @@
  *   label = @Translation("E-mail"),
  *   field_types = {
  *     "email"
+ *   },
+ *   settings = {
+ *     "placeholder" = ""
  *   }
  * )
  */
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..1102169 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,6 +22,9 @@
  *     "number_integer",
  *     "number_decimal",
  *     "number_float"
+ *   },
+ *   settings = {
+ *     "placeholder" = ""
  *   }
  * )
  */
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..80a8e9e 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" = ""
  *   }
  * )
  */
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..a164be8 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" = ""
  *   }
  * )
  */
diff --git a/core/modules/field_ui/field_ui.admin.inc b/core/modules/field_ui/field_ui.admin.inc
index c93aa03..d71ce59 100644
--- a/core/modules/field_ui/field_ui.admin.inc
+++ b/core/modules/field_ui/field_ui.admin.inc
@@ -853,6 +853,17 @@ function field_ui_field_edit_form($form, &$form_state, $instance) {
     '#weight' => -20,
   );
 
+  // Add default placeholder element if exposed by the widget definition.
+  if (isset($instance['widget']['settings']['placeholder'])) {
+    $form['instance']['placeholder'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Placeholder'),
+      '#default_value' => !empty($instance['placeholder']) ? $instance['placeholder'] : $instance['widget']['settings']['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.'),
+      '#weight' => -15,
+    );
+  }
+
   $form['instance']['description'] = array(
     '#type' => 'textarea',
     '#title' => t('Help text'),
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..b73d659 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
  * )
