diff --git a/core/modules/file/file.field.inc b/core/modules/file/file.field.inc
index 9d58d1d..184605d 100644
--- a/core/modules/file/file.field.inc
+++ b/core/modules/file/file.field.inc
@@ -579,184 +579,6 @@ function file_field_widget_submit($form, &$form_state) {
 }
 
 /**
- * Returns HTML for an individual file upload widget.
- *
- * @param $variables
- *   An associative array containing:
- *   - element: A render element representing the widget.
- *
- * @ingroup themeable
- */
-function theme_file_widget($variables) {
-  $element = $variables['element'];
-  $output = '';
-
-  // The "form-managed-file" class is required for proper Ajax functionality.
-  $output .= '<div class="file-widget form-managed-file clearfix">';
-  if ($element['fid']['#value'] != 0) {
-    // Add the file size after the file name.
-    $element['filename']['#markup'] .= ' <span class="file-size">(' . format_size($element['#file']->filesize) . ')</span> ';
-  }
-  $output .= drupal_render_children($element);
-  $output .= '</div>';
-
-  return $output;
-}
-
-/**
- * Returns HTML for a group of file upload widgets.
- *
- * @param $variables
- *   An associative array containing:
- *   - element: A render element representing the widgets.
- *
- * @ingroup themeable
- */
-function theme_file_widget_multiple($variables) {
-  $element = $variables['element'];
-
-  // Special ID and classes for draggable tables.
-  $weight_class = $element['#id'] . '-weight';
-  $table_id = $element['#id'] . '-table';
-
-  // Build up a table of applicable fields.
-  $headers = array();
-  $headers[] = t('File information');
-  if ($element['#display_field']) {
-    $headers[] = array(
-      'data' => t('Display'),
-      'class' => array('checkbox'),
-    );
-  }
-  $headers[] = t('Weight');
-  $headers[] = t('Operations');
-
-  // Get our list of widgets in order (needed when the form comes back after
-  // preview or failed validation).
-  $widgets = array();
-  foreach (element_children($element) as $key) {
-    $widgets[] = &$element[$key];
-  }
-  usort($widgets, '_field_sort_items_value_helper');
-
-  $rows = array();
-  foreach ($widgets as $key => &$widget) {
-    // Save the uploading row for last.
-    if ($widget['#file'] == FALSE) {
-      $widget['#title'] = $element['#file_upload_title'];
-      $widget['#description'] = $element['#file_upload_description'];
-      continue;
-    }
-
-    // Delay rendering of the buttons, so that they can be rendered later in the
-    // "operations" column.
-    $operations_elements = array();
-    foreach (element_children($widget) as $sub_key) {
-      if (isset($widget[$sub_key]['#type']) && $widget[$sub_key]['#type'] == 'submit') {
-        hide($widget[$sub_key]);
-        $operations_elements[] = &$widget[$sub_key];
-      }
-    }
-
-    // Delay rendering of the "Display" option and the weight selector, so that
-    // each can be rendered later in its own column.
-    if ($element['#display_field']) {
-      hide($widget['display']);
-    }
-    hide($widget['_weight']);
-
-    // Render everything else together in a column, without the normal wrappers.
-    $widget['#theme_wrappers'] = array();
-    $information = drupal_render($widget);
-
-    // Render the previously hidden elements, using render() instead of
-    // drupal_render(), to undo the earlier hide().
-    $operations = '';
-    foreach ($operations_elements as $operation_element) {
-      $operations .= render($operation_element);
-    }
-    $display = '';
-    if ($element['#display_field']) {
-      unset($widget['display']['#title']);
-      $display = array(
-        'data' => render($widget['display']),
-        'class' => array('checkbox'),
-      );
-    }
-    $widget['_weight']['#attributes']['class'] = array($weight_class);
-    $weight = render($widget['_weight']);
-
-    // Arrange the row with all of the rendered columns.
-    $row = array();
-    $row[] = $information;
-    if ($element['#display_field']) {
-      $row[] = $display;
-    }
-    $row[] = $weight;
-    $row[] = $operations;
-    $rows[] = array(
-      'data' => $row,
-      'class' => isset($widget['#attributes']['class']) ? array_merge($widget['#attributes']['class'], array('draggable')) : array('draggable'),
-    );
-  }
-
-  drupal_add_tabledrag($table_id, 'order', 'sibling', $weight_class);
-
-  $output = '';
-  $output = empty($rows) ? '' : theme('table', array('header' => $headers, 'rows' => $rows, 'attributes' => array('id' => $table_id)));
-  $output .= drupal_render_children($element);
-  return $output;
-}
-
-
-/**
- * Returns HTML for help text based on file upload validators.
- *
- * @param $variables
- *   An associative array containing:
- *   - description: The normal description for this field, specified by the
- *     user.
- *   - upload_validators: An array of upload validators as used in
- *     $element['#upload_validators'].
- *
- * @ingroup themeable
- */
-function theme_file_upload_help($variables) {
-  $description = $variables['description'];
-  $upload_validators = $variables['upload_validators'];
-
-  $descriptions = array();
-
-  if (strlen($description)) {
-    $descriptions[] = $description;
-  }
-  if (isset($upload_validators['file_validate_size'])) {
-    $descriptions[] = t('Files must be less than !size.', array('!size' => '<strong>' . format_size($upload_validators['file_validate_size'][0]) . '</strong>'));
-  }
-  if (isset($upload_validators['file_validate_extensions'])) {
-    $descriptions[] = t('Allowed file types: !extensions.', array('!extensions' => '<strong>' . check_plain($upload_validators['file_validate_extensions'][0]) . '</strong>'));
-  }
-  if (isset($upload_validators['file_validate_image_resolution'])) {
-    $max = $upload_validators['file_validate_image_resolution'][0];
-    $min = $upload_validators['file_validate_image_resolution'][1];
-    if ($min && $max && $min == $max) {
-      $descriptions[] = t('Images must be exactly !size pixels.', array('!size' => '<strong>' . $max . '</strong>'));
-    }
-    elseif ($min && $max) {
-      $descriptions[] = t('Images must be between !min and !max pixels.', array('!min' => '<strong>' . $min . '</strong>', '!max' => '<strong>' . $max . '</strong>'));
-    }
-    elseif ($min) {
-      $descriptions[] = t('Images must be larger than !min pixels.', array('!min' => '<strong>' . $min . '</strong>'));
-    }
-    elseif ($max) {
-      $descriptions[] = t('Images must be smaller than !max pixels.', array('!max' => '<strong>' . $max . '</strong>'));
-    }
-  }
-
-  return implode('<br />', $descriptions);
-}
-
-/**
  * Determine whether a field references files stored in {file_managed}.
  *
  * @param array $field
@@ -778,25 +600,3 @@ function file_field_find_file_reference_column($field) {
   }
   return FALSE;
 }
-
-/**
- * Returns HTML for a file attachments table.
- *
- * @param $variables
- *   An associative array containing:
- *   - items: An array of file attachments.
- *
- * @ingroup themeable
- */
-function theme_file_formatter_table($variables) {
-  $header = array(t('Attachment'), t('Size'));
-  $rows = array();
-  foreach ($variables['items'] as $delta => $item) {
-    $rows[] = array(
-      theme('file_link', array('file' => (object) $item)),
-      format_size($item['filesize']),
-    );
-  }
-
-  return empty($rows) ? '' : theme('table', array('header' => $header, 'rows' => $rows));
-}
diff --git a/core/modules/file/file.module b/core/modules/file/file.module
index 75c4f84..fdae7df 100644
--- a/core/modules/file/file.module
+++ b/core/modules/file/file.module
@@ -588,29 +588,33 @@ function file_get_content_headers(File $file) {
  */
 function file_theme() {
   return array(
-    // file.module.
     'file_link' => array(
       'variables' => array('file' => NULL, 'icon_directory' => NULL),
+      'template' => 'file-link',
     ),
     'file_icon' => array(
       'variables' => array('file' => NULL, 'icon_directory' => NULL),
+      'template' => 'file-icon',
     ),
     'file_managed_file' => array(
       'render element' => 'element',
+      'template' => 'file-managed-file',
     ),
-
-    // file.field.inc.
     'file_widget' => array(
       'render element' => 'element',
+      'template' => 'file-widget',
     ),
     'file_widget_multiple' => array(
       'render element' => 'element',
+      'template' => 'file-widget-multiple'
     ),
     'file_formatter_table' => array(
       'variables' => array('items' => NULL),
+      'template' => 'file-formatter-table',
     ),
     'file_upload_help' => array(
       'variables' => array('description' => NULL, 'upload_validators' => NULL),
+      'template' => 'file-upload-help',
     ),
   );
 }
@@ -1167,15 +1171,210 @@ function file_managed_file_save_upload($element) {
 }
 
 /**
- * Returns HTML for a managed file element.
+ * Preprocess variables to display a help text for file form field.
+ *
+ * $variables
+ *   An associative array containing:
+ *   - element: A render element representing the file.
+ *
+ * @see file-upload-help.html.twig
+ */
+function template_preprocess_file_upload_help(&$variables) {
+  $description = $variables['description'];
+  $upload_validators = $variables['upload_validators'];
+
+  $descriptions = array();
+
+  if (strlen($description)) {
+    $descriptions[] = $description;
+  }
+  if (isset($upload_validators['file_validate_size'])) {
+    $descriptions[] = format_string('Files must be less than !size.', array('!size' => '<strong>' . format_size($upload_validators['file_validate_size'][0]) . '</strong>'));
+  }
+  if (isset($upload_validators['file_validate_extensions'])) {
+    $descriptions[] = format_string('Allowed file types: !extensions.', array('!extensions' => '<strong>' . check_plain($upload_validators['file_validate_extensions'][0]) . '</strong>'));
+  }
+
+  if (isset($upload_validators['file_validate_image_resolution'])) {
+    $max = $upload_validators['file_validate_image_resolution'][0];
+    $min = $upload_validators['file_validate_image_resolution'][1];
+    if ($min && $max && $min == $max) {
+      $descriptions[] = format_string('Images must be exactly !size pixels.', array('!size' => '<strong>' . $max . '</strong>'));
+    }
+    elseif ($min && $max) {
+      $descriptions[] = format_string('Images must be between !min and !max pixels.', array('!min' => '<strong>' . $min . '</strong>', '!max' => '<strong>' . $max . '</strong>'));
+    }
+    elseif ($min) {
+      $descriptions[] = format_string('Images must be larger than !min pixels.', array('!min' => '<strong>' . $min . '</strong>'));
+    }
+    elseif ($max) {
+      $descriptions[] = format_string('Images must be smaller than !max pixels.', array('!max' => '<strong>' . $max . '</strong>'));
+    }
+  }
+
+  $variables['descriptions'] = $descriptions;
+}
+
+/**
+ * Preprocess variables to display a multi file form widget.
+ *
+ * $variables
+ *   An associative array containing:
+ *   - element: A render element representing the file.
+ *
+ * @see file-widget-multiple.html.twig
+ */
+function template_preprocess_file_widget_multiple(&$variables) {
+  $element = $variables['element'];
+
+  // Special ID and classes for draggable tables.
+  $weight_class = $element['#id'] . '-weight';
+  $table_id = $element['#id'] . '-table';
+
+  // Build up a table of applicable fields.
+  $headers = array();
+  $headers[] = t('File information');
+  if ($element['#display_field']) {
+    $headers[] = array(
+      'data' => t('Display'),
+      'class' => array('checkbox'),
+    );
+  }
+  $headers[] = t('Weight');
+  $headers[] = t('Operations');
+
+  // Get our list of widgets in order (needed when the form comes back after
+  // preview or failed validation).
+  $widgets = array();
+  foreach (element_children($element) as $key) {
+    $widgets[] = &$element[$key];
+  }
+  usort($widgets, '_field_sort_items_value_helper');
+
+  $rows = array();
+  foreach ($widgets as $key => &$widget) {
+    // Save the uploading row for last.
+    if ($widget['#file'] == FALSE) {
+      $widget['#title'] = $element['#file_upload_title'];
+      $widget['#description'] = $element['#file_upload_description'];
+      continue;
+    }
+
+    // Delay rendering of the buttons, so that they can be rendered later in the
+    // "operations" column.
+    $operations_elements = array();
+    foreach (element_children($widget) as $sub_key) {
+      if (isset($widget[$sub_key]['#type']) && $widget[$sub_key]['#type'] == 'submit') {
+        hide($widget[$sub_key]);
+        $operations_elements[] = &$widget[$sub_key];
+      }
+    }
+
+    // Delay rendering of the "Display" option and the weight selector, so that
+    // each can be rendered later in its own column.
+    if ($element['#display_field']) {
+      hide($widget['display']);
+    }
+    hide($widget['_weight']);
+
+    // Render everything else together in a column, without the normal wrappers.
+    $widget['#theme_wrappers'] = array();
+    $information = drupal_render($widget);
+
+    // Render the previously hidden elements, using render() instead of
+    // drupal_render(), to undo the earlier hide().
+    $operations = '';
+    foreach ($operations_elements as $operation_element) {
+      $operations .= render($operation_element);
+    }
+    $display = '';
+    if ($element['#display_field']) {
+      unset($widget['display']['#title']);
+      $display = array(
+        'data' => render($widget['display']),
+        'class' => array('checkbox'),
+      );
+    }
+    $widget['_weight']['#attributes']['class'] = array($weight_class);
+    $weight = render($widget['_weight']);
+
+    // Arrange the row with all of the rendered columns.
+    $row = array();
+    $row[] = $information;
+    if ($element['#display_field']) {
+      $row[] = $display;
+    }
+    $row[] = $weight;
+    $row[] = $operations;
+
+    $rows[] = array(
+      'data' => $row,
+      'class' => isset($widget['#attributes']['class']) ? array_merge($widget['#attributes']['class'], array('draggable')) : array('draggable'),
+    );
+  }
+
+  drupal_add_tabledrag($table_id, 'order', 'sibling', $weight_class);
+
+  $content = '';
+  $content = empty($rows) ? '' : theme('table', array('header' => $headers, 'rows' => $rows, 'attributes' => array('id' => $table_id)));
+  $content .= drupal_render_children($element);
+  $variables['content'] = $content;
+}
+
+/**
+ * Preprocess variables to display a file form widget.
+ *
+ * $variables
+ *   An associative array containing:
+ *   - element: A render element representing the file.
+ *   - element_attributes: An Array of HTML attributes.
+ *
+ * @see file-managed-file.html.twig
+ */
+function template_preprocess_file_widget(&$variables) {
+  $element = $variables['element'];
+  // The "form-managed-file" class is required for proper Ajax functionality.
+  if ($element['fid']['#value'] != 0) {
+    // Add the file size after the file name.
+    $element['filename']['#markup'] .= ' <span ' . new Attribute(array('class' => array('file-size'))) . '>(' . format_size($element['#file']->filesize) . ')</span> ';
+  }
+  $variables['element'] = drupal_render_children($element);
+  $variables['element_attributes'] = new Attribute(array('class' => array('file-widget', 'form-managed-file', 'clearfix')));
+}
+
+/**
+ * Preprocess variables to display a file attachments table.
+ *
+ * $variables
+ *   An associative array containing:
+ *   - items: An array of file attachments.
+ *
+ * @see file-formatter-table.html.twig
+ */
+function template_preprocess_file_formatter_table(&$variables) {
+  $header = array(t('Attachment'), t('Size'));
+  $rows = array();
+  foreach ($variables['items'] as $delta => $item) {
+    $rows[] = array(
+      theme('file_link', array('file' => (object) $item)),
+      format_size($item['filesize']),
+    );
+  }
+
+  $variables['content'] = empty($rows) ? '' : theme('table', array('header' => $header, 'rows' => $rows));
+}
+
+/**
+ * Preprocess variables to display a file form widget.
  *
  * @param $variables
  *   An associative array containing:
  *   - element: A render element representing the file.
+ *   - element_attributes: An Array of HTML attributes.
  *
- * @ingroup themeable
+ * @see file-managed-file.html.twig
  */
-function theme_file_managed_file($variables) {
+function template_preprocess_file_managed_file(&$variables) {
   $element = $variables['element'];
 
   $attributes = array();
@@ -1187,12 +1386,8 @@ function theme_file_managed_file($variables) {
   }
   $attributes['class'][] = 'form-managed-file';
 
-  // This wrapper is required to apply JS behaviors and CSS styling.
-  $output = '';
-  $output .= '<div' . new Attribute($attributes) . '>';
-  $output .= drupal_render_children($element);
-  $output .= '</div>';
-  return $output;
+  $variables['attributes'] = new Attribute($attributes);
+  $variables['element'] = drupal_render_children($element);
 }
 
 /**
@@ -1230,24 +1425,17 @@ function file_managed_file_pre_render($element) {
 }
 
 /**
- * Returns HTML for a link to a file.
+ * Preprocess variables for a link to a file.
  *
- * @param $variables
- *   An associative array containing:
- *   - file: A file object to which the link will be created.
- *   - icon_directory: (optional) A path to a directory of icons to be used for
- *     files. Defaults to the value of the "icon.directory"
- *     variable.
- *
- * @ingroup themeable
+ * @see file-link.html.twig
  */
-function theme_file_link($variables) {
+function template_preprocess_file_link(&$variables) {
   $file = $variables['file'];
   $icon_directory = $variables['icon_directory'];
 
   $url = file_create_url($file->uri);
   // theme_file_icon() requires a file entity, make sure it gets one.
-  $icon = theme('file_icon', array('file' => ($file instanceof File) ? $file : file_load($file->fid), 'icon_directory' => $icon_directory));
+  $variables['icon'] = theme('file_icon', array('file' => ($file instanceof File) ? $file : file_load($file->fid), 'icon_directory' => $icon_directory));
 
   // Set options as per anchor format described at
   // http://microformats.org/wiki/file-format-examples
@@ -1266,28 +1454,21 @@ function theme_file_link($variables) {
     $options['attributes']['title'] = check_plain($file->filename);
   }
 
-  return '<span class="file">' . $icon . ' ' . l($link_text, $url, $options) . '</span>';
+  $variables['link'] = l($link_text, $url, $options);
+  $variables['attributes'] = new Attribute(array('class' => array('file')));
 }
 
 /**
- * Returns HTML for an image with an appropriate icon for the given file.
- *
- * @param $variables
- *   An associative array containing:
- *   - file: A file entity for which to make an icon.
- *   - icon_directory: (optional) A path to a directory of icons to be used for
- *     files. Defaults to the value of the "icon.directory"
- *     variable.
+ * Preprocess variables for file_icon theme.
  *
- * @ingroup themeable
+ * @see file-icon.html.twig
  */
-function theme_file_icon($variables) {
+function template_preprocess_file_icon(&$variables) {
   $file = $variables['file'];
   $icon_directory = $variables['icon_directory'];
 
-  $mime = check_plain($file->filemime);
-  $icon_url = file_icon_url($file, $icon_directory);
-  return '<img class="file-icon" alt="" title="' . $mime . '" src="' . $icon_url . '" />';
+  $variables['mime'] = check_plain($file->filename);
+  $variables['icon_url'] = file_icon_url($file, $icon_directory);
 }
 
 /**
diff --git a/core/modules/file/templates/file-formatter-table.html.twig b/core/modules/file/templates/file-formatter-table.html.twig
new file mode 100644
index 0000000..58a0f5a
--- /dev/null
+++ b/core/modules/file/templates/file-formatter-table.html.twig
@@ -0,0 +1,15 @@
+{#
+/**
+* @file
+* Default theme implementation to display a file attachments table.
+*
+* Available variables:
+* - content: file form element html.
+*
+* @see template_preprocess()
+* @see template_preprocess_file_formatter_table()
+*
+* @ingroup themeable
+*/
+#}
+{{ content }}
diff --git a/core/modules/file/templates/file-icon.html.twig b/core/modules/file/templates/file-icon.html.twig
new file mode 100755
index 0000000..9921b7e
--- /dev/null
+++ b/core/modules/file/templates/file-icon.html.twig
@@ -0,0 +1,18 @@
+{#
+/**
+ * @file
+ * Default theme implementation for an image with an appropriate icon for the given file.
+ *
+ * Available variables:
+ * - file: A file entity for which to make an icon.
+ * - icon_directory: (optional) A path to a directory of icons to be used for
+ *   files. Defaults to the value of the "file_icon_directory" variable.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_file_icon()
+ *
+ * @ingroup themeable
+ */
+ @todo: rename icon_url to src in preprocess as per http://drupal.org/node/1820688.
+ #}
+<img class="file-icon" alt="" title="{{ mime }}" src="{{ icon_url }}"/>
diff --git a/core/modules/file/templates/file-link.html.twig b/core/modules/file/templates/file-link.html.twig
new file mode 100644
index 0000000..d8cc625
--- /dev/null
+++ b/core/modules/file/templates/file-link.html.twig
@@ -0,0 +1,17 @@
+{#
+/**
+ * @file
+ * Default theme implementation for a link to a file.
+ *
+ * Available variables:
+ * - attributes:  An associative array containing attributes of an element.
+ * - icon: A icon themed by file-icon.html.twig
+ * - link: A rendered hyperlink.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_file_link()
+ *
+ * @ingroup themeable
+ */
+#}
+<span class="{{ attributes.class }}"{{ attributes }}>{{ icon }} {{ link }}</span>
diff --git a/core/modules/file/templates/file-managed-file.html.twig b/core/modules/file/templates/file-managed-file.html.twig
new file mode 100644
index 0000000..9f886f3
--- /dev/null
+++ b/core/modules/file/templates/file-managed-file.html.twig
@@ -0,0 +1,16 @@
+{#
+/**
+* @file
+* Default theme implementation to display a file form widget.
+*
+* Available variables:
+* - element: file form element html.
+* - attributes: Remaining HTML attributes for the containing element.
+*
+* @see template_preprocess()
+* @see template_preprocess_file_managed_file()
+*
+* @ingroup themeable
+*/
+#}
+<div class="{{ attributes.class }}"{{ attributes }}>{{ element }}</div>
diff --git a/core/modules/file/templates/file-upload-help.html.twig b/core/modules/file/templates/file-upload-help.html.twig
new file mode 100644
index 0000000..6edd16a
--- /dev/null
+++ b/core/modules/file/templates/file-upload-help.html.twig
@@ -0,0 +1,17 @@
+{#
+/**
+* @file
+* Default theme implementation to display a help text for file form field.
+*
+* Available variables:
+* - descriptions: An array contains file field helper texts.
+*
+* @see template_preprocess()
+* @see template_preprocess_file_upload_help()
+*
+* @ingroup themeable
+*/
+#}
+{% for description in descriptions %}
+  {{ description | t }} <br />
+{% endfor %}
diff --git a/core/modules/file/templates/file-widget-multiple.html.twig b/core/modules/file/templates/file-widget-multiple.html.twig
new file mode 100644
index 0000000..38c3d5d
--- /dev/null
+++ b/core/modules/file/templates/file-widget-multiple.html.twig
@@ -0,0 +1,15 @@
+{#
+/**
+* @file
+* Default theme implementation to display a multi file form widget.
+*
+* Available variables:
+* - content: file form element html.
+*
+* @see template_preprocess()
+* @see template_preprocess_file_widget_multiple()
+*
+* @ingroup themeable
+*/
+#}
+{{ content }}
diff --git a/core/modules/file/templates/file-widget.html.twig b/core/modules/file/templates/file-widget.html.twig
new file mode 100644
index 0000000..c3d4192
--- /dev/null
+++ b/core/modules/file/templates/file-widget.html.twig
@@ -0,0 +1,18 @@
+{#
+/**
+* @file
+* Default theme implementation to display a file widget.
+*
+* Available variables:
+* - element: file form element html.
+* - element_attributes: Remaining HTML attributes for the containing element.
+*
+* @see template_preprocess()
+* @see template_preprocess_file_widget()
+*
+* @ingroup themeable
+*/
+#}
+<div{{ element_attributes }}>
+  {{ element }}
+</div>
