diff --git a/config/install/system.action.redirect_delete_action.yml b/config/install/system.action.redirect_delete_action.yml
new file mode 100644
index 0000000..dccf94c
--- /dev/null
+++ b/config/install/system.action.redirect_delete_action.yml
@@ -0,0 +1,11 @@
+langcode: en
+status: true
+dependencies:
+  enforced:
+    module:
+      - redirect
+id: redirect_delete_action
+label: 'Delete redirect'
+type: redirect
+plugin: redirect_delete_action
+configuration: {  }
diff --git a/config/install/views.view.redirect.yml b/config/install/views.view.redirect.yml
index 1059934..8a2829a 100644
--- a/config/install/views.view.redirect.yml
+++ b/config/install/views.view.redirect.yml
@@ -132,6 +132,59 @@ display:
       row:
         type: fields
       fields:
+        redirect_bulk_form:
+          id: redirect_bulk_form
+          table: redirect
+          field: redirect_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: 0
+            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
+          action_title: 'With selection'
+          include_exclude: exclude
+          selected_actions: {  }
+          entity_type: redirect
+          plugin_id: redirect_bulk_form
         redirect_source__path:
           id: redirect_source__path
           table: redirect
diff --git a/config/schema/redirect.schema.yml b/config/schema/redirect.schema.yml
index 1a521a6..2b10769 100644
--- a/config/schema/redirect.schema.yml
+++ b/config/schema/redirect.schema.yml
@@ -45,4 +45,8 @@ redirect.settings:
       label: 'Set Content Location Header'
     term_path_handler:
       type: boolean
-      label: 'Taxonomy Term Path Handler'
\ No newline at end of file
+      label: 'Taxonomy Term Path Handler'
+
+action.configuration.redirect_delete_action:
+  type: action_configuration_default
+  label: 'Delete redirect configuration'
diff --git a/config/schema/redirect.views.schema.yml b/config/schema/redirect.views.schema.yml
index c7a2996..59a565c 100644
--- a/config/schema/redirect.views.schema.yml
+++ b/config/schema/redirect.views.schema.yml
@@ -13,3 +13,7 @@ field.formatter.settings.redirect_source:
   type: mapping
   label: 'Redirect Source formatter'
   mapping: { }
+
+views.field.redirect_bulk_form:
+  type: views_field_bulk_form
+  label: 'Redirect bulk form'
diff --git a/redirect.install b/redirect.install
index 4acfd13..04d0de4 100644
--- a/redirect.install
+++ b/redirect.install
@@ -8,6 +8,8 @@ use Drupal\redirect\Entity\Redirect;
 use Drupal\Core\Database\Database;
 use Drupal\views\Entity\View;
 use Symfony\Component\Yaml\Yaml;
+use Drupal\Core\Config\InstallStorage;
+use Drupal\Core\Config\FileStorage;
 
 /**
  * Rehash redirects to account for case insensitivity.
@@ -148,3 +150,19 @@ function redirect_update_8103() {
   }
   return $message;
 }
+
+/**
+ * Save the bulk delete action to config.
+ */
+function redirect_update_8002() {
+  $entity_type_manager = \Drupal::entityTypeManager();
+  $module_handler = \Drupal::moduleHandler();
+
+  // Save the bulk delete action to config.
+  $config_install_path = $module_handler->getModule('redirect')->getPath() . '/' . InstallStorage::CONFIG_INSTALL_DIRECTORY;
+  $storage = new FileStorage($config_install_path);
+  $entity_type_manager
+    ->getStorage('action')
+    ->create($storage->read('system.action.redirect_delete_action'))
+    ->save();
+}
diff --git a/redirect.routing.yml b/redirect.routing.yml
index 36b433d..adf86a0 100644
--- a/redirect.routing.yml
+++ b/redirect.routing.yml
@@ -38,6 +38,13 @@ entity.redirect.delete_form:
   requirements:
     _entity_access: 'redirect.delete'
 
+entity.redirect.multiple_delete_confirm:
+  path: '/admin/config/search/redirect/delete'
+  defaults:
+    _form: '\Drupal\redirect\Form\DeleteMultiple'
+  requirements:
+    _permission: 'administer redirects'
+
 redirect.settings:
   path: '/admin/config/search/redirect/settings'
   defaults:
diff --git a/src/Form/DeleteMultiple.php b/src/Form/DeleteMultiple.php
new file mode 100644
index 0000000..b4f1a2a
--- /dev/null
+++ b/src/Form/DeleteMultiple.php
@@ -0,0 +1,140 @@
+<?php
+
+namespace Drupal\redirect\Form;
+
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Form\ConfirmFormBase;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Url;
+use Drupal\user\PrivateTempStoreFactory;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\RedirectResponse;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\Core\StringTranslation\TranslationInterface;
+
+/**
+ * Provides a redirect deletion confirmation form.
+ */
+class DeleteMultiple extends ConfirmFormBase {
+
+  /**
+   * The array of redirects to delete.
+   *
+   * @var string[][]
+   */
+  protected $redirects = array();
+
+  /**
+   * The tempstore factory.
+   *
+   * @var \Drupal\user\PrivateTempStoreFactory
+   */
+  protected $privateTempStoreFactory;
+
+  /**
+   * The redirect storage.
+   *
+   * @var \Drupal\Core\Entity\EntityStorageInterface
+   */
+  protected $storage;
+
+  /**
+   * The current user.
+   *
+   * @var \Drupal\Core\Session\AccountInterface
+   */
+  protected $account;
+
+  /**
+   * Constructs a DeleteMultiple form object.
+   *
+   * @param \Drupal\user\PrivateTempStoreFactory $temp_store_factory
+   *   The tempstore factory.
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manager.
+   * @param \Drupal\Core\Session\AccountInterface $account
+   *   The current user.
+   * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
+   *   The String translation.
+   */
+  public function __construct(PrivateTempStoreFactory $temp_store_factory, EntityTypeManagerInterface $entity_type_manager, AccountInterface $account, TranslationInterface $string_translation) {
+    $this->privateTempStoreFactory = $temp_store_factory;
+    $this->storage = $entity_type_manager->getStorage('redirect');
+    $this->account = $account;
+    $this->setStringTranslation($string_translation);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('user.private_tempstore'),
+      $container->get('entity_type.manager'),
+      $container->get('current_user'),
+      $container->get('string_translation')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+    return 'redirect_multiple_delete_confirm';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getQuestion() {
+    return $this->formatPlural(count($this->redirects), 'Are you sure you want to delete this redirect?', 'Are you sure you want to delete these redirects?');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCancelUrl() {
+    return new Url('redirect.list');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getConfirmText() {
+    return t('Delete');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, FormStateInterface $form_state) {
+    $this->redirects = $this->privateTempStoreFactory->get('redirect_multiple_delete_confirm')->get($this->account->id());
+    if (empty($this->redirects)) {
+      return new RedirectResponse($this->getCancelUrl()->setAbsolute()->toString());
+    }
+
+    $form['redirects'] = [
+      '#theme' => 'item_list',
+      '#items' => array_map(function ($redirect) {
+        return $redirect->label();
+      }, $this->redirects),
+    ];
+    return parent::buildForm($form, $form_state);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+
+    if ($form_state->getValue('confirm') && !empty($this->redirects)) {
+      $this->storage->delete($this->redirects);
+      $this->privateTempStoreFactory->get('redirect_multiple_delete_confirm')->delete($this->account->id());
+      $count = count($this->redirects);
+      $this->logger('redirect')->notice('Deleted @count redirects.', ['@count' => $count]);
+      drupal_set_message($this->stringTranslation->formatPlural($count, 'Deleted 1 redirect.', 'Deleted @count redirects.'));
+    }
+    $form_state->setRedirect('redirect.list');
+  }
+
+}
diff --git a/src/Plugin/Action/DeleteRedirect.php b/src/Plugin/Action/DeleteRedirect.php
new file mode 100644
index 0000000..920244a
--- /dev/null
+++ b/src/Plugin/Action/DeleteRedirect.php
@@ -0,0 +1,92 @@
+<?php
+
+namespace Drupal\redirect\Plugin\Action;
+
+use Drupal\Core\Action\ActionBase;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\user\PrivateTempStoreFactory;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Redirects to a redirect deletion form.
+ *
+ * @Action(
+ *   id = "redirect_delete_action",
+ *   label = @Translation("Delete redirect"),
+ *   type = "redirect",
+ *   confirm_form_route_name = "entity.redirect.multiple_delete_confirm"
+ * )
+ */
+class DeleteRedirect extends ActionBase implements ContainerFactoryPluginInterface {
+
+  /**
+   * The tempstore object.
+   *
+   * @var \Drupal\user\SharedTempStore
+   */
+  protected $privateTempStore;
+
+  /**
+   * The current user.
+   *
+   * @var \Drupal\Core\Session\AccountInterface
+   */
+  protected $currentUser;
+
+  /**
+   * Constructs a new DeleteRedirect 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\PrivateTempStoreFactory $temp_store_factory
+   *   The tempstore factory.
+   * @param AccountInterface $current_user
+   *   Current user.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, PrivateTempStoreFactory $temp_store_factory, AccountInterface $current_user) {
+    $this->currentUser = $current_user;
+    $this->privateTempStore = $temp_store_factory->get('redirect_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.private_tempstore'),
+      $container->get('current_user')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function executeMultiple(array $entities) {
+    $this->privateTempStore->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) {
+    return $object->access('delete', $account, $return_as_object);
+  }
+
+}
diff --git a/src/Tests/RedirectUITest.php b/src/Tests/RedirectUITest.php
index e2ace54..09e360e 100644
--- a/src/Tests/RedirectUITest.php
+++ b/src/Tests/RedirectUITest.php
@@ -213,20 +213,29 @@ class RedirectUITest extends WebTestBase {
     // Check if the list has 2 rows.
     $this->assertTrue(count($rows) == 2);
 
-    // Finally test the delete action.
+    // Test the plural form of the bulk delete action.
     $this->drupalGet('admin/config/search/redirect');
+    $edit = [
+      'redirect_bulk_form[0]' => TRUE,
+      'redirect_bulk_form[1]' => TRUE,
+    ];
+    $this->drupalPostForm(NULL, $edit, t('Apply'));
+    $this->assertText('Are you sure you want to delete these redirects?');
+    $this->clickLink('Cancel');
+
+    // Test the delete action.
     $this->clickLink(t('Delete'));
     $this->assertRaw(t('Are you sure you want to delete the URL redirect from %source to %redirect?',
       array('%source' => Url::fromUri('base:non-existing', ['query' => ['key' => 'value']])->toString(), '%redirect' => Url::fromUri('base:node')->toString())));
     $this->drupalPostForm(NULL, array(), t('Delete'));
 
-    // Delete the other redirect.
-    $this->clickLink(t('Delete'));
-    $this->drupalPostForm(NULL, array(), t('Delete'));
+    // Test the bulk delete action.
+    $this->drupalPostForm(NULL, ['redirect_bulk_form[0]' => TRUE], t('Apply'));
+    $this->assertText('Are you sure you want to delete this redirect?');
+    $this->assertText('test27');
+    $this->drupalPostForm(NULL, [], t('Delete'));
 
-    $this->assertUrl('admin/config/search/redirect');
     $this->assertText(t('There is no redirect yet.'));
-
   }
 
   /**
