diff --git a/core/modules/file/config/install/system.action.file_delete_action.yml b/core/modules/file/config/install/system.action.file_delete_action.yml
new file mode 100644
index 0000000..ce23591
--- /dev/null
+++ b/core/modules/file/config/install/system.action.file_delete_action.yml
@@ -0,0 +1,9 @@
+id: file_delete_action
+label: 'Delete file'
+status: true
+langcode: en
+type: file
+plugin: file_delete_action
+dependencies:
+  module:
+    - file
diff --git a/core/modules/file/config/install/views.view.files.yml b/core/modules/file/config/install/views.view.files.yml
index 550a9cc..dcd0a2f 100644
--- a/core/modules/file/config/install/views.view.files.yml
+++ b/core/modules/file/config/install/views.view.files.yml
@@ -3,6 +3,7 @@ status: true
 dependencies:
   module:
     - file
+    - system
     - user
 id: files
 label: Files
@@ -74,6 +75,7 @@ display:
           summary: ''
           description: ''
           columns:
+            file_bulk_form: file_bulk_form
             fid: fid
             filename: filename
             filemime: filemime
@@ -83,6 +85,11 @@ display:
             changed: changed
             count: count
           info:
+            file_bulk_form:
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
             fid:
               sortable: false
               default_sort_order: asc
@@ -144,6 +151,56 @@ display:
       row:
         type: fields
       fields:
+        file_bulk_form:
+          id: file_bulk_form
+          table: file_managed
+          field: file_bulk_form
+          relationship: none
+          group_type: group
+          admin_label: ''
+          label: ''
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: ''
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: false
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          entity_type: file
+          plugin_id: bulk_form
         fid:
           id: fid
           table: file_managed
diff --git a/core/modules/file/config/schema/file.schema.yml b/core/modules/file/config/schema/file.schema.yml
index 70bf21f..2a4ecca 100644
--- a/core/modules/file/config/schema/file.schema.yml
+++ b/core/modules/file/config/schema/file.schema.yml
@@ -87,3 +87,7 @@ field.widget.settings.file_generic:
     progress_indicator:
       type: string
       label: 'Progress indicator'
+
+action.configuration.file_delete_action:
+  type: action_configuration_default
+  label: 'Delete file configuration'
diff --git a/core/modules/file/config/schema/file.views.schema.yml b/core/modules/file/config/schema/file.views.schema.yml
index 2f63384..d1a74dc 100644
--- a/core/modules/file/config/schema/file.views.schema.yml
+++ b/core/modules/file/config/schema/file.views.schema.yml
@@ -44,3 +44,7 @@ views.field.file_uri:
 views.filter.file_status:
   type: views.filter.in_operator
   label: 'File status'
+
+views.field.node_bulk_form:
+  type: views_field_bulk_form
+  label: 'Node bulk form'
diff --git a/core/modules/file/file.routing.yml b/core/modules/file/file.routing.yml
index d9d4efa..d456667 100644
--- a/core/modules/file/file.routing.yml
+++ b/core/modules/file/file.routing.yml
@@ -1,3 +1,10 @@
+file.multiple_delete_confirm:
+  path: '/admin/content/file/delete'
+  defaults:
+    _form: '\Drupal\file\Form\FileDeleteMultiple'
+  requirements:
+    _permission: 'administer files'
+
 file.ajax_upload:
   path: '/file/ajax'
   defaults:
diff --git a/core/modules/file/src/FileViewsData.php b/core/modules/file/src/FileViewsData.php
index 5a977a2..d666e90 100644
--- a/core/modules/file/src/FileViewsData.php
+++ b/core/modules/file/src/FileViewsData.php
@@ -66,6 +66,14 @@ public function getViewsData() {
     $data['file_managed']['uid']['relationship']['title'] = t('User who uploaded');
     $data['file_managed']['uid']['relationship']['label'] = t('User who uploaded');
 
+    $data['file_managed']['file_bulk_form'] = array(
+      'title' => t('File operations bulk form'),
+      'help' => t('Add a form element that lets you run operations on multiple files.'),
+      'field' => array(
+        'id' => 'bulk_form',
+      ),
+    );
+
     $data['file_usage']['table']['group']  = t('File Usage');
 
     // Provide field-type-things to several base tables; on the core files table
diff --git a/core/modules/file/src/Form/FileDeleteMultiple.php b/core/modules/file/src/Form/FileDeleteMultiple.php
new file mode 100644
index 0000000..d79e62a
--- /dev/null
+++ b/core/modules/file/src/Form/FileDeleteMultiple.php
@@ -0,0 +1,140 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\file\Form\FileDeleteMultiple.
+ */
+
+namespace Drupal\file\Form;
+
+use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Form\ConfirmFormBase;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\Core\Url;
+use Drupal\Component\Utility\String;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\user\TempStoreFactory;
+use Symfony\Component\HttpFoundation\RedirectResponse;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Provides a file deletion confirmation form.
+ */
+class FileDeleteMultiple extends ConfirmFormBase {
+
+  /**
+   * The array of files to delete.
+   *
+   * @var array
+   */
+  protected $files = array();
+
+  /**
+   * The tempstore factory.
+   *
+   * @var \Drupal\user\TempStoreFactory
+   */
+  protected $tempStoreFactory;
+
+  /**
+   * The file storage.
+   *
+   * @var \Drupal\Core\Entity\EntityStorageInterface
+   */
+  protected $manager;
+
+  /**
+   * The current user.
+   *
+   * @var \Drupal\Core\Session\AccountInterface
+   */
+  protected $currentUser;
+
+  /**
+   * Constructs a DeleteMultiple form object.
+   *
+   * @param \Drupal\user\TempStoreFactory $temp_store_factory
+   *   The tempstore factory.
+   * @param \Drupal\Core\Entity\EntityManagerInterface $manager
+   *   The entity manager.
+   */
+  public function __construct(TempStoreFactory $temp_store_factory, EntityManagerInterface $manager, AccountInterface $current_user) {
+    $this->tempStoreFactory = $temp_store_factory;
+    $this->storage = $manager->getStorage('file');
+    $this->currentUser = $current_user;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('user.tempstore'),
+      $container->get('entity.manager'),
+      $container->get('current_user')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+    return 'file_multiple_delete_confirm';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getQuestion() {
+    return $this->formatPlural(count($this->files), 'Are you sure you want to delete this item?', 'Are you sure you want to delete these items?');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCancelUrl() {
+    return new Url('view.files.page_1');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getConfirmText() {
+    return t('Delete');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, FormStateInterface $form_state) {
+    $this->files = $this->tempStoreFactory->get('file_multiple_delete_confirm')->get($this->currentUser->id());
+    if (empty($this->files)) {
+      return new RedirectResponse($this->getCancelUrl()->setAbsolute()->toString());
+    }
+
+    $form['files'] = array(
+      '#theme' => 'item_list',
+      '#items' => array_map(function ($file) {
+        return String::checkPlain($file->label());
+      }, $this->files),
+    );
+    $form = parent::buildForm($form, $form_state);
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    if ($form_state->getValue('confirm') && !empty($this->files)) {
+      $this->storage->delete($this->files);
+      $this->tempStoreFactory->get('file_multiple_delete_confirm')->delete($this->currentUser->id());
+      $count = count($this->files);
+      $this->logger('file')->notice('Deleted @count posts.', array('@count' => $count));
+      drupal_set_message($this->formatPlural($count, 'Deleted 1 file.', 'Deleted @count files.'));
+    }
+    $form_state->setRedirect('view.files.page_1');
+  }
+
+}
diff --git a/core/modules/file/src/Plugin/Action/DeleteFile.php b/core/modules/file/src/Plugin/Action/DeleteFile.php
new file mode 100644
index 0000000..96ed6ae
--- /dev/null
+++ b/core/modules/file/src/Plugin/Action/DeleteFile.php
@@ -0,0 +1,98 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\file\Plugin\Action\DeleteFile.
+ */
+
+namespace Drupal\file\Plugin\Action;
+
+use Drupal\Core\Action\ActionBase;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\user\TempStoreFactory;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Redirects to a file deletion form.
+ *
+ * @Action(
+ *   id = "file_delete_action",
+ *   label = @Translation("Delete file"),
+ *   type = "file",
+ *   confirm_form_route_name = "file.multiple_delete_confirm"
+ * )
+ */
+class DeleteFile extends ActionBase implements ContainerFactoryPluginInterface {
+
+  /**
+   * The tempstore object.
+   *
+   * @var \Drupal\user\TempStore
+   */
+  protected $tempStore;
+
+  /**
+   * The current user.
+   *
+   * @var \Drupal\Core\Session\AccountInterface
+   */
+  protected $currentUser;
+
+  /**
+   * Constructs a new DeleteFile object.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin ID for the plugin instance.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\user\TempStoreFactory $temp_store_factory
+   *   The tempstore factory.
+   * @param AccountInterface $current_user
+   *   Current user.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, TempStoreFactory $temp_store_factory, AccountInterface $current_user) {
+    $this->currentUser = $current_user;
+    $this->tempStore = $temp_store_factory->get('file_multiple_delete_confirm');
+
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('user.tempstore'),
+      $container->get('current_user')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function executeMultiple(array $entities) {
+    $this->tempStore->set($this->currentUser->id(), $entities);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function execute($object = NULL) {
+    $this->executeMultiple(array($object));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function access($object, AccountInterface $account = NULL, $return_as_object = FALSE) {
+    /** @var \Drupal\file\FileInterface $object */
+    return $object->access('delete', $account, $return_as_object);
+  }
+
+}
diff --git a/core/modules/file/src/Tests/FileListingTest.php b/core/modules/file/src/Tests/FileListingTest.php
index 25b170e..b786ed0 100644
--- a/core/modules/file/src/Tests/FileListingTest.php
+++ b/core/modules/file/src/Tests/FileListingTest.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\file\Tests;
 
+use Drupal\Core\Url;
 use Drupal\node\Entity\Node;
 
 /**
@@ -139,6 +140,21 @@ function testFileListingPages() {
       }
       $this->assertLinkByHref('node/' . $node->id(), 0, 'Link to registering entity found on usage page.');
     }
+
+    // Delete both the files to check bulk form.
+    $edit = array(
+      'file_bulk_form[0]' => 1,
+      'file_bulk_form[1]' => 1,
+    );
+    $this->drupalPost('admin/content/files', $edit, t('Apply'));
+    $this->assertUrl(Url::fromRoute('file.multiple_delete_confirm'));
+    $this->assertLinkByHref('admin/content/files');
+    $this->clickLink(t('Cancel'));
+    $this->assertUrl('admin/content/files');
+    $this->drupalPost(NULL, $edit, t('Apply'));
+    $this->assertText('Are you sure you want to delete these items?');
+    $this->drupalPost(NULL, array(), t('Delete'));
+    $this->assertText('Deleted 2 files.');
   }
 
   /**
