diff --git a/core/modules/file/css/file.formatter.generic.css b/core/modules/file/css/file.formatter.generic.css
new file mode 100644
index 0000000..b36310a
--- /dev/null
+++ b/core/modules/file/css/file.formatter.generic.css
@@ -0,0 +1,57 @@
+/**
+ * @file
+ * Default style for file module
+ */
+
+/**
+ * File icons
+ */
+.file {
+  padding-left: 20px;
+  display: inline-block;
+  min-height: 16px;
+  background-repeat: no-repeat;
+  background-position: left center;
+}
+.file.package-x-generic {
+  background-image: url(../icons/package-x-generic.png);
+}
+.file.office-spreadsheet {
+  background-image: url(../icons/x-office-spreadsheet.png);
+}
+.file.office-document {
+  background-image: url(../icons/x-office-document.png);
+}
+.file.office-presentation {
+  background-image: url(../icons/x-office-presentation.png);
+}
+.file.text-x-script {
+  background-image: url(../icons/text-x-script.png);
+}
+.file.text-html {
+  background-image: url(../icons/text-html.png);
+}
+.file.text-plain {
+  background-image: url(../icons/text-plain.png);
+}
+.file.application-pdf {
+  background-image: url(../icons/application-pdf.png);
+}
+.file.application-octet-stream {
+  background-image: url(../icons/application-octet-stream.png);
+}
+.file.application-x-executable {
+  background-image: url(../icons/application-x-executable.png);
+}
+.file.audio {
+  background-image: url(../icons/audio-x-generic.png);
+}
+.file.video {
+  background-image: url(../icons/video-x-generic.png);
+}
+.file.text {
+  background-image: url(../icons/text-x-generic.png);
+}
+.file.image {
+  background-image: url(../icons/image-x-generic.png);
+}
diff --git a/core/modules/file/file.libraries.yml b/core/modules/file/file.libraries.yml
index ccc0c3b..4652958 100644
--- a/core/modules/file/file.libraries.yml
+++ b/core/modules/file/file.libraries.yml
@@ -5,8 +5,16 @@ drupal.file:
   css:
     theme:
       css/file.admin.css: {}
+    component:
+      css/file.formatter.generic.css: {}
   dependencies:
     - core/jquery
     - core/jquery.once
     - core/drupal
     - core/drupalSettings
+
+drupal.file.formatter.generic:
+  version: VERSION
+  css:
+    theme:
+      css/file.formatter.generic.css: {}
diff --git a/core/modules/file/file.module b/core/modules/file/file.module
index e1f4b28..5d01ba0 100644
--- a/core/modules/file/file.module
+++ b/core/modules/file/file.module
@@ -585,7 +585,7 @@ function file_theme() {
   return array(
     // From file.module.
     'file_link' => array(
-      'variables' => array('file' => NULL, 'icon_directory' => NULL, 'description' => NULL, 'attributes' => array()),
+      'variables' => array('file' => NULL, 'description' => NULL, 'attributes' => array()),
       'template' => 'file-link',
     ),
     'file_managed_file' => array(
@@ -1600,27 +1600,15 @@ function file_managed_file_pre_render($element) {
  * @param array $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.
  *   - description: A description to be displayed instead of the filename.
  *   - attributes: An associative array of attributes to be placed in the a tag.
  */
 function template_preprocess_file_link(&$variables) {
   $file = $variables['file'];
-  $options = array(
-    'attributes' => $variables['attributes'],
-  );
-  $icon_directory = $variables['icon_directory'];
+  $options = array();
 
-  $url = file_create_url($file->getFileUri());
   $file_entity = ($file instanceof File) ? $file : file_load($file->fid);
-  $variables['icon'] = array(
-    '#theme' => 'image__file_icon',
-    '#uri' => file_icon_url($file_entity, $icon_directory),
-    '#alt' => '',
-    '#title' => check_plain($file_entity->getFilename()),
-    '#attributes' => array('class' => 'file-icon'),
-  );
+  $url = file_create_url($file_entity->getFileUri());
 
   // Set options as per anchor format described at
   // http://microformats.org/wiki/file-format-examples
@@ -1635,80 +1623,50 @@ function template_preprocess_file_link(&$variables) {
     $options['attributes']['title'] = String::checkPlain($file_entity->getFilename());
   }
 
-  $variables['link'] = l($link_text, $url, $options);
-  $variables['attributes'] = array('class' => array('file'));
-}
-
-/**
- * Creates a URL to the icon for a file entity.
- *
- * @param \Drupal\file\File $file
- *   A file entity.
- * @param $icon_directory
- *   (optional) A path to a directory of icons to be used for files. Defaults to
- *   the value of the "icon.directory" variable.
- *
- * @return
- *   A URL string to the icon, or FALSE if an appropriate icon cannot be found.
- */
-function file_icon_url(File $file, $icon_directory = NULL) {
-  if ($icon_path = file_icon_path($file, $icon_directory)) {
-    return base_path() . $icon_path;
+  // Set file classes to the options array.
+  if (isset($variables['attributes']['class']) && is_array($variables['attributes']['class'])) {
+    $variables['attributes']['class'] = array_merge($variables['attributes']['class'], file_icon_classes($file));
   }
-  return FALSE;
+  else {
+    $variables['attributes']['class'] = file_icon_classes($file);
+  }
+
+  $variables['link'] = l($link_text, $url, $options);
 }
 
 /**
- * Creates a path to the icon for a file entity.
+ * Creates a list of classes to the icon for a file entity.
  *
  * @param \Drupal\file\File $file
  *   A file entity.
- * @param $icon_directory
- *   (optional) A path to a directory of icons to be used for files. Defaults to
- *   the value of the "icon.directory" variable.
  *
  * @return
- *   A string to the icon as a local path, or FALSE if an appropriate icon could
- *   not be found.
+ *   A array of the classes associated to the file.
  */
-function file_icon_path(File $file, $icon_directory = NULL) {
-  // Use the default set of icons if none specified.
-  if (!isset($icon_directory)) {
-    $icon_directory = \Drupal::config('file.settings')->get('icon.directory');
-  }
-
-  // If there's an icon matching the exact mimetype, go for it.
-  $dashed_mime = strtr($file->getMimeType(), array('/' => '-'));
-  $icon_path = $icon_directory . '/' . $dashed_mime . '.png';
-  if (file_exists($icon_path)) {
-    return $icon_path;
-  }
+function file_icon_classes(File $file) {
+  $classes = array('file');
 
-  // For a few mimetypes, we can "manually" map to a generic icon.
+  // Search for a group with the files MIME type.
   $generic_mime = (string) file_icon_map($file);
-  $icon_path = $icon_directory . '/' . $generic_mime . '.png';
-  if ($generic_mime && file_exists($icon_path)) {
-    return $icon_path;
+  if (!empty($generic_mime)) {
+    $classes[] = $generic_mime;
   }
 
   // Use generic icons for each category that provides such icons.
   foreach (array('audio', 'image', 'text', 'video') as $category) {
-    if (strpos($file->getMimeType(), $category . '/') === 0) {
-      $icon_path = $icon_directory . '/' . $category . '-x-generic.png';
-      if (file_exists($icon_path)) {
-        return $icon_path;
-      }
+    if (strpos($file->getMimeType(), $category) === 0) {
+      $classes[] = $category;
     }
   }
 
-  // Try application-octet-stream as last fallback.
-  $icon_path = $icon_directory . '/application-octet-stream.png';
-  if (file_exists($icon_path)) {
-    return $icon_path;
+  // If there's no generic icon for the type use a specific one.
+  if (count($classes) == 1) {
+    $dashed_mime = strtr($file->getMimeType(), array('/' => '-'));
+    $classes[] = $dashed_mime;
+    $classes[] = 'file-general';
   }
 
-  // No icon can be found.
-  return FALSE;
+  return $classes;
 }
 
 /**
@@ -1739,7 +1697,7 @@ function file_icon_map(File $file) {
     case 'application/x-applix-word':
     case 'application/x-kword':
     case 'application/x-kword-crypt':
-      return 'x-office-document';
+      return 'office-document';
 
     // Spreadsheet document types.
     case 'application/vnd.ms-excel':
@@ -1755,7 +1713,7 @@ function file_icon_map(File $file) {
     case 'application/x-gnumeric':
     case 'application/x-kspread':
     case 'application/x-kspread-crypt':
-      return 'x-office-spreadsheet';
+      return 'office-spreadsheet';
 
     // Presentation document types.
     case 'application/vnd.ms-powerpoint':
@@ -1767,7 +1725,7 @@ function file_icon_map(File $file) {
     case 'application/vnd.sun.xml.impress':
     case 'application/vnd.sun.xml.impress.template':
     case 'application/x-kpresenter':
-      return 'x-office-presentation';
+      return 'office-presentation';
 
     // Compressed archive types.
     case 'application/zip':
diff --git a/core/modules/file/src/Plugin/Field/FieldFormatter/GenericFileFormatter.php b/core/modules/file/src/Plugin/Field/FieldFormatter/GenericFileFormatter.php
index 5d137e0..e37633b 100644
--- a/core/modules/file/src/Plugin/Field/FieldFormatter/GenericFileFormatter.php
+++ b/core/modules/file/src/Plugin/Field/FieldFormatter/GenericFileFormatter.php
@@ -46,6 +46,12 @@ public function viewElements(FieldItemListInterface $items) {
       }
     }
 
+    if (!empty($elements)) {
+      $elements['#attached'] = array(
+        'library' => array('file/drupal.file.formatter.generic'),
+      );
+    }
+
     return $elements;
   }
 
diff --git a/core/modules/file/templates/file-link.html.twig b/core/modules/file/templates/file-link.html.twig
index fbbf08b..44cbd7f 100644
--- a/core/modules/file/templates/file-link.html.twig
+++ b/core/modules/file/templates/file-link.html.twig
@@ -6,11 +6,10 @@
  * Available variables:
  * - attributes: The HTML attributes for the containing element.
  * - link: A link to the file.
- * - icon: The icon image representing the file type.
  *
  * @see template_preprocess_file_link()
  *
  * @ingroup themeable
  */
 #}
-<span{{ attributes }}>{{ icon }} {{ link }}</span>
+<span{{ attributes }}>{{ link }}</span>
