diff --git a/core/modules/field/field.api.php b/core/modules/field/field.api.php
index 16b0143..0a9b22b 100644
--- a/core/modules/field/field.api.php
+++ b/core/modules/field/field.api.php
@@ -996,7 +996,7 @@ function hook_field_attach_update(\Drupal\Core\Entity\EntityInterface $entity) {
 /**
  * Alter field_attach_preprocess() variables.
  *
- * This hook is invoked while preprocessing the field.tpl.php template file in
+ * This hook is invoked while preprocessing field templates in
  * field_attach_preprocess().
  *
  * @param $variables
diff --git a/core/modules/field/field.form.inc b/core/modules/field/field.form.inc
index 203a112..907e45c 100644
--- a/core/modules/field/field.form.inc
+++ b/core/modules/field/field.form.inc
@@ -8,43 +8,54 @@
 use Drupal\Component\Utility\NestedArray;
 
 /**
- * Returns HTML for an individual form element.
+ * Prepares variables for individual form element templates.
+ *
+ * Default template: field-multiple-value-form.html.twig.
  *
  * Combines multiple values into a table with drag-n-drop reordering.
  *
- * @param $variables
+ * @param array $variables
  *   An associative array containing:
  *   - element: A render element representing the form element.
- *
- * @ingroup themeable
- *
- * @todo Convert to a template.
  */
-function theme_field_multiple_value_form($variables) {
+function template_preprocess_field_multiple_value_form(&$variables) {
   $element = $variables['element'];
-  $output = '';
 
-  if ($element['#cardinality'] > 1 || $element['#cardinality'] == FIELD_CARDINALITY_UNLIMITED) {
+  $variables['multiple_cardinality'] = $element['#cardinality'] > 1 || $element['#cardinality'] == FIELD_CARDINALITY_UNLIMITED;
+
+  if ($variables['multiple_cardinality']) {
     $table_id = drupal_html_id($element['#field_name'] . '_values');
     $order_class = $element['#field_name'] . '-delta-order';
-    $required = !empty($element['#required']) ? theme('form_required_marker', $variables) : '';
 
     $header = array(
       array(
-        'data' => '<h4 class="label">' . t('!title !required', array('!title' => $element['#title'], '!required' => $required)) . "</h4>",
+        'data' => array(
+          '#prefix' => '<h4 class="label">',
+          'title' => array(
+            '#markup' => $element['#title'],
+          ),
+          '#suffix' => '</h4>',
+        ),
         'colspan' => 2,
         'class' => array('field-label'),
       ),
       t('Order'),
     );
+    if (!empty($element['#required'])) {
+      $header[0]['data']['required'] = array(
+        '#theme' => 'form_required_marker',
+        '#element' => $element,
+      );
+    }
     $rows = array();
 
     // Sort items according to '_weight' (needed when the form comes back after
-    // preview or failed validation)
+    // preview or failed validation).
     $items = array();
+    $variables['button'] = array();
     foreach (element_children($element) as $key) {
       if ($key === 'add_more') {
-        $add_more_button = &$element[$key];
+        $variables['button'] = &$element[$key];
       }
       else {
         $items[] = &$element[$key];
@@ -55,10 +66,15 @@ function theme_field_multiple_value_form($variables) {
     // Add the items as table rows.
     foreach ($items as $key => $item) {
       $item['_weight']['#attributes']['class'] = array($order_class);
-      $delta_element = drupal_render($item['_weight']);
+
+      // Remove weight form element from item render array so it can be rendered
+      // in a separate table column.
+      $delta_element = $item['_weight'];
+      unset($item['_weight']);
+
       $cells = array(
         array('data' => '', 'class' => array('field-multiple-drag')),
-        drupal_render($item),
+        array('data' => $item),
         array('data' => $delta_element, 'class' => array('delta-order')),
       );
       $rows[] = array(
@@ -67,21 +83,22 @@ function theme_field_multiple_value_form($variables) {
       );
     }
 
-    $output = '<div class="form-item">';
-    $output .= theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => $table_id, 'class' => array('field-multiple-table'))));
-    $output .= $element['#description'] ? '<div class="description">' . $element['#description'] . '</div>' : '';
-    $output .= '<div class="clearfix">' . drupal_render($add_more_button) . '</div>';
-    $output .= '</div>';
+    $variables['table'] = array(
+      '#theme' => 'table',
+      '#header' => $header,
+      '#rows' => $rows,
+      '#attributes' => array('id' => $table_id, 'class' => array('field-multiple-table')),
+    );
+    $variables['description'] = $element['#description'] ? $element['#description'] : '';
 
     drupal_add_tabledrag($table_id, 'order', 'sibling', $order_class);
   }
   else {
+    $variables['elements'] = array();
     foreach (element_children($element) as $key) {
-      $output .= drupal_render($element[$key]);
+      $variables['elements'][] = $element[$key];
     }
   }
-
-  return $output;
 }
 
 /**
diff --git a/core/modules/field/field.module b/core/modules/field/field.module
index 6cdd628..0ade1cb 100644
--- a/core/modules/field/field.module
+++ b/core/modules/field/field.module
@@ -308,9 +308,12 @@ function field_theme() {
   return array(
     'field' => array(
       'render element' => 'element',
+      'template' => 'field',
     ),
     'field_multiple_value_form' => array(
+      'file' => 'field.form.inc',
       'render element' => 'element',
+      'template' => 'field-multiple-value-form',
     ),
   );
 }
@@ -1107,12 +1110,36 @@ function field_page_build(&$page) {
   $page['#attached']['css'][$path . '/theme/field.css'] = array('every_page' => TRUE);
 }
 
-/**
- * Theme preprocess function for theme_field() and field.tpl.php.
- *
- * @see theme_field()
- * @see field.tpl.php
- */
+ /**
+  * Prepares variables for field templates.
+  *
+  * Default template: field.html.twig.
+  *
+  * To override output, copy the "field.html.twig" from the templates directory
+  * to your theme's directory and customize it, just like customizing other
+  * Drupal templates such as page.html.twig or node.html.twig.
+  *
+  * For example, for a field named 'body' displayed on the 'article'
+  * content type, any of the following templates will override this default
+  * implementation. The first of these templates that exists is used:
+  * - field--body--article.html.twig
+  * - field--article.html.twig
+  * - field--body.html.twig
+  * - field.html.twig
+  *
+  * @param array $variables
+  *   An associative array containing:
+  *   - label_hidden: A boolean indicating whether to show or hide the field
+  *     label.
+  *   - title_attributes: A string containing the attributes for the title.
+  *   - label: The label for the field.
+  *   - content_attributes: A string containing the attributes for the content's
+  *     div.
+  *   - items: An array of field items.
+  *   - item_attributes: An array of attributes for each item.
+  *   - classes: A string containing the classes for the wrapping div.
+  *   - attributes: A string containing the attributes for the wrapping div.
+  */
 function template_preprocess_field(&$variables, $hook) {
   $element = $variables['element'];
 
@@ -1192,89 +1219,6 @@ function template_process_field(&$variables, $hook) {
  */
 
 /**
- * Returns HTML for a field.
- *
- * This is the default theme implementation to display the value of a field.
- * Theme developers who are comfortable with overriding theme functions may do
- * so in order to customize this markup. This function can be overridden with
- * varying levels of specificity. For example, for a field named 'body'
- * displayed on the 'article' content type, any of the following functions will
- * override this default implementation. The first of these functions that
- * exists is used:
- * - THEMENAME_field__body__article()
- * - THEMENAME_field__article()
- * - THEMENAME_field__body()
- * - THEMENAME_field()
- *
- * Theme developers who prefer to customize templates instead of overriding
- * functions may copy the "field.tpl.php" from the "modules/field/theme" folder
- * of the Drupal installation to somewhere within the theme's folder and
- * customize it, just like customizing other Drupal templates such as
- * page.tpl.php or node.tpl.php. However, it takes longer for the server to
- * process templates than to call a function, so for websites with many fields
- * displayed on a page, this can result in a noticeable slowdown of the website.
- * For these websites, developers are discouraged from placing a field.tpl.php
- * file into the theme's folder, but may customize templates for specific
- * fields. For example, for a field named 'body' displayed on the 'article'
- * content type, any of the following templates will override this default
- * implementation. The first of these templates that exists is used:
- * - field--body--article.tpl.php
- * - field--article.tpl.php
- * - field--body.tpl.php
- * - field.tpl.php
- * So, if the body field on the article content type needs customization, a
- * field--body--article.tpl.php file can be added within the theme's folder.
- * Because it's a template, it will result in slightly more time needed to
- * display that field, but it will not impact other fields, and therefore, is
- * unlikely to cause a noticeable change in website performance. A very rough
- * guideline is that if a page is being displayed with more than 100 fields and
- * they are all themed with a template instead of a function, it can add up to
- * 5% to the time it takes to display that page. This is a guideline only and
- * the exact performance impact depends on the server configuration and the
- * details of the website.
- *
- * @param $variables
- *   An associative array containing:
- *   - label_hidden: A boolean indicating whether to show or hide the field
- *     label.
- *   - title_attributes: A string containing the attributes for the title.
- *   - label: The label for the field.
- *   - content_attributes: A string containing the attributes for the content's
- *     div.
- *   - items: An array of field items.
- *   - item_attributes: An array of attributes for each item.
- *   - classes: A string containing the classes for the wrapping div.
- *   - attributes: A string containing the attributes for the wrapping div.
- *
- * @see template_preprocess_field()
- * @see template_process_field()
- * @see field.tpl.php
- *
- * @ingroup themeable
- */
-function theme_field($variables) {
-  $output = '';
-
-  // Render the label, if it's not hidden.
-  if (!$variables['label_hidden']) {
-    $output .= '<div class="field-label"' . $variables['title_attributes'] . '>' . $variables['label'] . '</div>';
-  }
-
-  // Render the items.
-  $output .= '<div class="field-items"' . $variables['content_attributes'] . '>';
-  foreach ($variables['items'] as $delta => $item) {
-    $classes = 'field-item ' . ($delta % 2 ? 'odd' : 'even');
-    $output .= '<div class="' . $classes . '"' . $variables['item_attributes'][$delta] . '>' . drupal_render($item) . '</div>';
-  }
-  $output .= '</div>';
-
-  // Render the top-level DIV.
-  $output = '<div' . $variables['attributes'] . '>' . $output . '</div>';
-
-  return $output;
-}
-
-/**
  * Assembles a partial entity structure with initial IDs.
  *
  * @param stdClass $ids
diff --git a/core/modules/field/lib/Drupal/field/Plugin/views/field/Field.php b/core/modules/field/lib/Drupal/field/Plugin/views/field/Field.php
index 976aa05..4d70c23 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/views/field/Field.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/views/field/Field.php
@@ -373,7 +373,7 @@ public function buildOptionsForm(&$form, &$form_state) {
       '#title' => t('Use field template'),
       '#type' => 'checkbox',
       '#default_value' => $this->options['field_api_classes'],
-      '#description' => t('If checked, field api classes will be added using field.tpl.php (or equivalent). This is not recommended unless your CSS depends upon these classes. If not checked, template will not be used.'),
+      '#description' => t('If checked, field api classes will be added by field templates. This is not recommended unless your CSS depends upon these classes. If not checked, template will not be used.'),
       '#fieldset' => 'style_settings',
       '#weight' => 20,
     );
diff --git a/core/modules/field/templates/field-multiple-value-form.html.twig b/core/modules/field/templates/field-multiple-value-form.html.twig
new file mode 100644
index 0000000..ca2dca1
--- /dev/null
+++ b/core/modules/field/templates/field-multiple-value-form.html.twig
@@ -0,0 +1,34 @@
+{#
+/**
+ * @file
+ * Default theme implementation for an individual form element.
+ *
+ * Available variables for all fields:
+ * - multiple_cardinality: A boolean indicating whether the field is a multiple
+ *   cardinality field.
+ *
+ * Available variables for single cardinality fields:
+ * - elements: Form elements to be rendered.
+ *
+ * Available variables for multiple cardinality fields:
+ * - table: Table of field items for multiple cardinality fields.
+ * - description: Description text for the form field.
+ * - button: "Add more" button.
+ *
+ * @see template_preprocess_field()
+ * @see template_process_field()
+ *
+ * @ingroup themeable
+ */
+#}
+{% if multiple_cardinality %}
+<div class="form-item">
+  {{ table }}
+  {% if description %}<div class="description">{{ description }}</div>{% endif %}
+  {% if button %}<div class="clearfix">{{ button }}</div>{% endif %}
+</div>
+{% else %}
+  {% for i in elements|keys %}
+    {{ elements[i] }}
+  {% endfor %}
+{% endif %}
diff --git a/core/modules/field/templates/field.html.twig b/core/modules/field/templates/field.html.twig
new file mode 100644
index 0000000..812f15f
--- /dev/null
+++ b/core/modules/field/templates/field.html.twig
@@ -0,0 +1,32 @@
+{#
+/**
+ * @file
+ * Default theme implementation for a field.
+ *
+ * Available variables:
+ * - label_hidden: A boolean indicating to show or hide the field label.
+ * - title_attributes: A string containing the attributes for the title.
+ * - label: The label for the field.
+ * - content_attributes: A string containing the attributes for the content's
+ *   div.
+ * - items: An array of field items.
+ * - item_attributes: An array of attributes for each item.
+ * - classes: A string containing the classes for the wrapping div.
+ *
+ * @see template_preprocess_field()
+ * @see template_process_field()
+ *
+ * @ingroup themeable
+ */
+ @todo Remove even/odd striping once http://drupal.org/node/1649780 lands.
+#}
+<div class="{{ attributes.class }}"{{ attributes }}>
+  {% if not label_hidden %}
+    <div class="field-label {{ title_attributes.class }}"{{ title_attributes }}>{{ label }}:</div>
+  {% endif %}
+  <div class="field-items {{ content_attributes.class }}"{{ content_attributes }}>
+    {% for delta, item in items %}
+      <div class="field-item {{ cycle(["even", "odd"], delta) }} {{- item_attributes[delta].class }}" {{- item_attributes[delta] }}>{{ item }}</div>
+    {% endfor %}
+  </div>
+</div>
diff --git a/core/modules/field/templates/field.tpl.php b/core/modules/field/templates/field.tpl.php
deleted file mode 100644
index a8ffe32..0000000
--- a/core/modules/field/templates/field.tpl.php
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-
-/**
- * @file field.tpl.php
- * Default template implementation to display the value of a field.
- *
- * This file is not used and is here as a starting point for customization only.
- * @see theme_field()
- *
- * Available variables:
- * - $items: An array of field values. Use render() to output them.
- * - $label: The item label.
- * - $label_hidden: Whether the label display is set to 'hidden'.
- * - $attributes: An instance of Attributes class that can be manipulated as an
- *    array and printed as a string.
- *    It includes the 'class' information, which includes:
- *   - field: The current template type, i.e., "theming hook".
- *   - field-name-[field_name]: The current field name. For example, if the
- *     field name is "field_description" it would result in
- *     "field-name-field-description".
- *   - field-type-[field_type]: The current field type. For example, if the
- *     field type is "text" it would result in "field-type-text".
- *   - field-label-[label_display]: The current label position. For example, if
- *     the label position is "above" it would result in "field-label-above".
- *
- * Other variables:
- * - $element['#object']: The entity to which the field is attached.
- * - $element['#view_mode']: View mode, e.g. 'full', 'teaser'...
- * - $element['#field_name']: The field name.
- * - $element['#field_type']: The field type.
- * - $element['#field_language']: The field language.
- * - $element['#field_translatable']: Whether the field is translatable or not.
- * - $element['#label_display']: Position of label display, inline, above, or
- *   hidden.
- * - $field_name_css: The css-compatible field name.
- * - $field_type_css: The css-compatible field type.
- *
- * @see template_preprocess_field()
- * @see theme_field()
- *
- * @ingroup themeable
- */
-?>
-<!--
-THIS FILE IS NOT USED AND IS HERE AS A STARTING POINT FOR CUSTOMIZATION ONLY.
-See http://api.drupal.org/api/function/theme_field/8 for details.
-After copying this file to your theme's folder and customizing it, remove this
-HTML comment.
--->
-<div class="<?php print $attributes['class']; ?>"<?php print $attributes; ?>>
-  <?php if (!$label_hidden): ?>
-    <div class="field-label"<?php print $title_attributes; ?>><?php print $label ?>:&nbsp;</div>
-  <?php endif; ?>
-  <div class="field-items"<?php print $content_attributes; ?>>
-    <?php foreach ($items as $delta => $item): ?>
-      <div class="field-item <?php print $delta % 2 ? 'odd' : 'even'; ?>"<?php print $item_attributes[$delta]; ?>><?php print render($item); ?></div>
-    <?php endforeach; ?>
-  </div>
-</div>
