diff --git a/core/modules/file/css/file.generic_file.css b/core/modules/file/css/file.generic_file.css
new file mode 100644
index 0000000..2c14be1
--- /dev/null
+++ b/core/modules/file/css/file.generic_file.css
@@ -0,0 +1,54 @@
+/**
+ * @file
+ * Default style for file module
+ */
+
+/**
+ * File icons
+ */
+.file {
+  padding-left: 20px;
+  padding-bottom: 2px;
+}
+.file.package-x-generic {
+  background: url(../icons/package-x-generic.png) no-repeat;
+}
+.file.office-spreadsheet {
+  background: url(../icons/x-office-spreadsheet.png) no-repeat;
+}
+.file.office-document {
+  background: url(../icons/x-office-document.png) no-repeat;
+}
+.file.office-presentation {
+  background: url(../icons/x-office-presentation.png) no-repeat;
+}
+.file.text-x-script {
+  background: url(../icons/text-x-script.png) no-repeat;
+}
+.file.text-html {
+  background: url(../icons/text-html.png) no-repeat;
+}
+.file.text-plain {
+  background: url(../icons/text-plain.png) no-repeat;
+}
+.file.application-pdf {
+  background: url(../icons/application-pdf.png) no-repeat;
+}
+.file.application-octet-stream {
+  background: url(../icons/application-octet-stream.png) no-repeat;
+}
+.file.application-x-executable {
+  background: url(../icons/application-x-executable.png) no-repeat;
+}
+.file.audio {
+  background: url(../icons/audio-x-generic.png) no-repeat;
+}
+.file.video {
+  background: url(../icons/video-x-generic.png) no-repeat;
+}
+.file.text {
+  background: url(../icons/text-x-generic.png) no-repeat;
+}
+.file.image {
+  background: url(../icons/image-x-generic.png) no-repeat;
+}
diff --git a/core/modules/file/file.libraries.yml b/core/modules/file/file.libraries.yml
index ccc0c3b..c3ba921 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.generic_file.css: {}
   dependencies:
     - core/jquery
     - core/jquery.once
     - core/drupal
     - core/drupalSettings
+
+drupal.file.formatter.generic_file:
+  version: VERSION
+  css:
+    theme:
+      css/file.generic_file.css: {}
diff --git a/core/modules/file/file.module b/core/modules/file/file.module
index e1f4b28..a471324 100644
--- a/core/modules/file/file.module
+++ b/core/modules/file/file.module
@@ -1614,13 +1614,6 @@ function template_preprocess_file_link(&$variables) {
 
   $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'),
-  );
 
   // Set options as per anchor format described at
   // http://microformats.org/wiki/file-format-examples
@@ -1635,80 +1628,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 +1702,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 +1718,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 +1730,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..a947aae 100644
--- a/core/modules/file/src/Plugin/Field/FieldFormatter/GenericFileFormatter.php
+++ b/core/modules/file/src/Plugin/Field/FieldFormatter/GenericFileFormatter.php
@@ -28,6 +28,10 @@ class GenericFileFormatter extends FileFormatterBase {
   public function viewElements(FieldItemListInterface $items) {
     $elements = array();
 
+    $elements['#attached'] = array(
+      'library' => array('file/drupal.file.formatter.generic_file'),
+    );
+
     foreach ($items as $delta => $item) {
       if ($item->isDisplayed() && $item->entity) {
         $elements[$delta] = array(
diff --git a/core/modules/file/templates/file-link.html.twig b/core/modules/file/templates/file-link.html.twig
index fbbf08b..f9e7969 100644
--- a/core/modules/file/templates/file-link.html.twig
+++ b/core/modules/file/templates/file-link.html.twig
@@ -13,4 +13,4 @@
  * @ingroup themeable
  */
 #}
-<span{{ attributes }}>{{ icon }} {{ link }}</span>
+<span{{ attributes }}>{{ link }}</span>
