diff --git a/config/schema/redirect.schema.yml b/config/schema/redirect.schema.yml
index 1a521a6..5d83391 100644
--- a/config/schema/redirect.schema.yml
+++ b/config/schema/redirect.schema.yml
@@ -45,4 +45,4 @@ 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'
diff --git a/modules/redirect_404/redirect_404.info.yml b/modules/redirect_404/redirect_404.info.yml
new file mode 100644
index 0000000..13b2334
--- /dev/null
+++ b/modules/redirect_404/redirect_404.info.yml
@@ -0,0 +1,7 @@
+name: 'Redirect 404'
+type: module
+description: 'Logs 404 errors and allows users to create redirects for often requested but missing pages.'
+core: 8.x
+
+dependencies:
+ - redirect
diff --git a/modules/redirect_404/redirect_404.install b/modules/redirect_404/redirect_404.install
new file mode 100644
index 0000000..fab44e1
--- /dev/null
+++ b/modules/redirect_404/redirect_404.install
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * Update hooks for the redirect_404 module.
+ */
+
+use Drupal\Core\Language\LanguageInterface;
+
+/**
+ * Implements hook_schema().
+ */
+function redirect_404_schema() {
+  $schema['redirect_404'] = [
+    'description' => 'Stores 404 requests.',
+    'fields' => [
+      'path' => [
+        'type' => 'varchar',
+        'length' => 191,
+        'not null' => TRUE,
+        'description' => 'The path of the request',
+      ],
+      'langcode' => [
+        'description' => 'The language of this request',
+        'type' => 'varchar_ascii',
+        'length' => 12,
+        'not null' => TRUE,
+        'default' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
+      ],
+      'count' => [
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The number of requests with that path and language',
+      ],
+      'timestamp' => [
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The timestamp of the last request with that path and language.',
+      ],
+    ],
+    'primary key' => ['path', 'langcode'],
+  ];
+  return $schema;
+}
diff --git a/modules/redirect_404/redirect_404.routing.yml b/modules/redirect_404/redirect_404.routing.yml
new file mode 100644
index 0000000..b019ae8
--- /dev/null
+++ b/modules/redirect_404/redirect_404.routing.yml
@@ -0,0 +1,7 @@
+redirect.fix_404:
+  path: '/admin/config/search/redirect/404'
+  defaults:
+    _title: 'Fix 404 pages'
+    _form: '\Drupal\redirect_404\Form\RedirectFix404Form'
+  requirements:
+    _permission: 'administer redirects'
diff --git a/modules/redirect_404/redirect_404.services.yml b/modules/redirect_404/redirect_404.services.yml
new file mode 100644
index 0000000..e7970c0
--- /dev/null
+++ b/modules/redirect_404/redirect_404.services.yml
@@ -0,0 +1,11 @@
+services:
+  redirect.404_subscriber:
+    class: Drupal\redirect_404\EventSubscriber\Redirect404Subscriber
+    arguments: ['@path.current', '@language_manager', '@redirect.not_found_storage']
+    tags:
+      - { name: event_subscriber }
+  redirect.not_found_storage:
+    class: Drupal\redirect_404\RedirectNotFoundStorage
+    arguments: ['@database']
+    tags:
+      - { name: backend_overridable }
diff --git a/modules/redirect_404/src/EventSubscriber/Redirect404Subscriber.php b/modules/redirect_404/src/EventSubscriber/Redirect404Subscriber.php
new file mode 100644
index 0000000..7029fdc
--- /dev/null
+++ b/modules/redirect_404/src/EventSubscriber/Redirect404Subscriber.php
@@ -0,0 +1,80 @@
+<?php
+
+namespace Drupal\redirect_404\EventSubscriber;
+
+use Drupal\Core\Language\LanguageManagerInterface;
+use Drupal\Core\Path\CurrentPathStack;
+use Drupal\redirect_404\RedirectNotFoundStorage;
+use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * An EventSubscriber that listens to redirect 404 errors.
+ */
+class Redirect404Subscriber implements EventSubscriberInterface {
+
+  /**
+   * The current path.
+   *
+   * @var \Drupal\Core\Path\CurrentPathStack
+   */
+  protected $currentPath;
+
+  /**
+   * The language manager.
+   *
+   * @var \Drupal\Core\Language\LanguageManagerInterface
+   */
+  protected $languageManager;
+
+  /**
+   * The redirect storage.
+   *
+   * @var \Drupal\redirect_404\RedirectNotFoundStorage
+   */
+  protected $redirectStorage;
+
+  /**
+   * Constructs a new RedirectNotFoundStorage.
+   *
+   * @param \Drupal\Core\Path\CurrentPathStack $current_path
+   *   The current path.
+   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
+   *   The language manager.
+   * @param \Drupal\redirect_404\RedirectNotFoundStorage $redirect_storage
+   *   A redirect storage.
+   */
+  public function __construct(CurrentPathStack $current_path, LanguageManagerInterface $language_manager, RedirectNotFoundStorage $redirect_storage) {
+    $this->currentPath = $current_path;
+    $this->languageManager = $language_manager;
+    $this->redirectStorage = $redirect_storage;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getSubscribedEvents() {
+    $events[KernelEvents::EXCEPTION][] = 'onKernelException';
+    return $events;
+  }
+
+  /**
+   * Logs an exception of 404 Redirect errors.
+   *
+   * @param GetResponseForExceptionEvent $event
+   *   Is given by the event dispatcher.
+   */
+  public function onKernelException(GetResponseForExceptionEvent $event) {
+    // Log 404 only exceptions.
+    if ($event->getException() instanceof NotFoundHttpException) {
+
+      // Write record.
+      $path = $this->currentPath->getPath();
+      $langcode = $this->languageManager->getCurrentLanguage()->getId();
+      $this->redirectStorage->logRequest($path, $langcode);
+    }
+  }
+
+}
diff --git a/modules/redirect_404/src/Form/RedirectFix404Form.php b/modules/redirect_404/src/Form/RedirectFix404Form.php
new file mode 100644
index 0000000..27a4122
--- /dev/null
+++ b/modules/redirect_404/src/Form/RedirectFix404Form.php
@@ -0,0 +1,128 @@
+<?php
+
+namespace Drupal\redirect_404\Form;
+
+use Drupal\Core\Form\FormBase;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Language\LanguageInterface;
+use Drupal\Core\Link;
+use Drupal\Core\Url;
+
+class RedirectFix404Form extends FormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+    return 'redirect_fix_404_form';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, FormStateInterface $form_state) {
+    $destination = $this->getDestinationArray();
+
+    $search = $this->getRequest()->get('search');
+    $form['#attributes'] = array('class' => array('search-form'));
+
+    $form['basic'] = array(
+      '#type' => 'fieldset',
+      '#title' => $this->t('Filter 404s'),
+      '#attributes' => array('class' => array('container-inline')),
+    );
+    $form['basic']['filter'] = array(
+      '#type' => 'textfield',
+      '#title' => '',
+      '#default_value' => $search,
+      '#maxlength' => 128,
+      '#size' => 25,
+    );
+    $form['basic']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => $this->t('Filter'),
+      '#action' => 'filter',
+    );
+    if ($search) {
+      $form['basic']['reset'] = array(
+        '#type' => 'submit',
+        '#value' => $this->t('Reset'),
+        '#action' => 'reset',
+      );
+    }
+
+    $languages = \Drupal::languageManager()->getLanguages(LanguageInterface::STATE_ALL);
+    $multilingual = \Drupal::languageManager()->isMultilingual();
+
+    $header = array(
+      array('data' => $this->t('Path'), 'field' => 'source'),
+      array('data' => $this->t('Count'), 'field' => 'count', 'sort' => 'desc'),
+      array('data' => $this->t('Last accessed'), 'field' => 'timestamp'),
+    );
+    if ($multilingual) {
+      $header[] = array('data' => $this->t('Language'), 'field' => 'language');
+    }
+    $header[] = array('data' => $this->t('Operations'));
+
+    /** @var \Drupal\redirect_404\RedirectNotFoundStorage $redirect_storage */
+    $redirect_storage = \Drupal::service('redirect.not_found_storage');
+    $results = $redirect_storage->listRequests($header, $search);
+
+    $rows = array();
+    foreach ($results as $result) {
+      $path = ltrim($result->path, '/');
+
+      $row = array();
+      $row['source'] = Link::fromTextAndUrl($result->path, Url::fromUri('base:' . $path, array('query' => $destination)));
+      $row['count'] = $result->count;
+      $row['timestamp'] = \Drupal::service('date.formatter')->format($result->timestamp, 'short');
+      if ($multilingual) {
+        if (isset($languages[$result->langcode])) {
+          $row['language'] = $languages[$result->langcode]->getName();
+        }
+        else {
+          $row['language'] = $this->t('Undefined @langcode', array('@langcode' => $result->langcode));
+        }
+      }
+
+      $operations = array();
+      if (\Drupal::entityTypeManager()->getAccessControlHandler('redirect')->createAccess()) {
+        $operations['add'] = array(
+          'title' =>$this->t('Add redirect'),
+          'url' => Url::fromRoute('redirect.add', [], ['query' => array('source' => $path, 'language' => $result->langcode) + $destination]),
+        );
+      }
+      $row['operations'] = array(
+        'data' => array(
+          '#type' => 'operations',
+          '#links' => $operations,
+        ),
+      );
+
+      $rows[] = $row;
+    }
+
+    $form['redirect_404_table']  = array(
+      '#theme' => 'table',
+      '#header' => $header,
+      '#rows' => $rows,
+      '#empty' => $this->t('No 404 pages without redirects found.'),
+    );
+    $form['redirect_404_pager'] = array('#type' => 'pager');
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+
+    if ($form_state->getTriggeringElement()['#action'] == 'filter') {
+      $form_state->setRedirect('redirect.fix_404', array(), array('query' => array('search' => trim($form_state->getValue('filter')))));
+    }
+    else {
+      $form_state->setRedirect('redirect.fix_404');
+    }
+  }
+
+}
diff --git a/modules/redirect_404/src/RedirectNotFoundStorage.php b/modules/redirect_404/src/RedirectNotFoundStorage.php
new file mode 100644
index 0000000..81db6c9
--- /dev/null
+++ b/modules/redirect_404/src/RedirectNotFoundStorage.php
@@ -0,0 +1,83 @@
+<?php
+
+namespace Drupal\redirect_404;
+
+use Drupal\Core\Database\Connection;
+
+/**
+ * Controller class for redirect not found storage.
+ */
+class RedirectNotFoundStorage {
+
+  /**
+   * Active database connection.
+   *
+   * @var \Drupal\Core\Database\Connection
+   */
+  protected $database;
+
+  /**
+   * Constructs a new RedirectNotFoundStorage.
+   *
+   * @param \Drupal\Core\Database\Connection $database
+   *   A Database connection to use for reading and writing database data.
+   */
+  public function __construct(Connection $database) {
+    $this->database = $database;
+  }
+
+  /**
+   * Merges the records to the redirect_404 table.
+   *
+   * @param string $path
+   *   The path of the current request.
+   * @param string $langcode
+   *   The ID of the language code.
+   */
+  public function logRequest($path, $langcode) {
+    $this->database->merge('redirect_404')
+      ->key('path', $path)
+      ->key('langcode', $langcode)
+      ->expression('count', 'count + 1')
+      ->fields([
+        'timestamp' => REQUEST_TIME,
+        'count' => 1,
+      ])
+      ->execute();
+  }
+
+  /**
+   * Returns the 404 request data.
+   *
+   * @param array $header
+   *   An array containing arrays of the redirect_404 fields data.
+   * @param string $search
+   *   The search text.
+   *
+   * @return array
+   *   A list of objects with the properties:
+   *   - path
+   *   - count
+   *   - timestamp
+   *   - langcode
+   */
+  public function listRequests(array $header = [], $search = NULL) {
+    $query = $this->database
+      ->select('redirect_404', 'r404')
+      ->extend('Drupal\Core\Database\Query\TableSortExtender')
+      ->orderByHeader($header)
+      ->extend('Drupal\Core\Database\Query\PagerSelectExtender')
+      ->limit(25)
+      ->fields('r404');
+
+    if ($search) {
+      // Replace wildcards with PDO wildcards.
+      $wildcard = '%' . trim(preg_replace('!\*+!', '%', $this->database->escapeLike($search)), '%') . '%';
+      $query->condition('path', $wildcard, 'LIKE');
+    }
+    $results = $query->execute()->fetchAll();
+
+    return $results;
+  }
+
+}
diff --git a/modules/redirect_404/src/Tests/Fix404RedirectUILanguageTest.php b/modules/redirect_404/src/Tests/Fix404RedirectUILanguageTest.php
new file mode 100644
index 0000000..5d84175
--- /dev/null
+++ b/modules/redirect_404/src/Tests/Fix404RedirectUILanguageTest.php
@@ -0,0 +1,97 @@
+<?php
+
+namespace Drupal\redirect_404\Tests;
+
+use Drupal\Core\Url;
+use Drupal\language\Entity\ConfigurableLanguage;
+use Drupal\redirect\Tests\RedirectUITest;
+
+/**
+ * UI tests for redirect_404 module with language and content translation.
+ *
+ * This runs the exact same tests as Fix404RedirectUITest, but with both
+ * language and content translation modules enabled.
+ *
+ * @group redirect_404
+ */
+class Fix404RedirectUILanguageTest extends RedirectUITest {
+
+  /**
+   * @var \Drupal\Core\Session\AccountInterface
+   */
+  protected $adminUser;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = [
+    'redirect_404',
+    'node',
+    'path',
+    'dblog',
+    'views',
+    'language',
+    'content_translation',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $language = ConfigurableLanguage::createFromLangcode('de');
+    $language->save();
+    $language = ConfigurableLanguage::createFromLangcode('es');
+    $language->save();
+
+    $this->adminUser = $this->drupalCreateUser([
+      'administer redirects',
+      'access site reports',
+      'access content',
+      'bypass node access',
+      'create url aliases',
+      'administer url aliases',
+      'administer languages',
+      'administer taxonomy',
+    ]);
+  }
+
+  public function testFix404RedirectList() {
+    $this->drupalLogin($this->adminUser);
+
+    // Add predefined language.
+    $this->drupalPostForm('admin/config/regional/language/add', ['predefined_langcode' => 'fr'], t('Add language'));
+    $this->assertText('French');
+
+    // Visit a non existing page to have the 404 redirect_error entry.
+    $this->drupalGet('fr/testing');
+
+    $redirect = db_select('redirect_404')->fields('redirect_404')->condition('path', '/testing')->execute()->fetchAll();
+    if (count($redirect) == 0) {
+      $this->fail('No record was added');
+    }
+
+    // Go to the "fix 404" page and check the listing.
+    $this->drupalGet('admin/config/search/redirect/404');
+    $this->assertText('testing');
+    $this->assertText('French');
+    $this->clickLink(t('Add redirect'));
+
+    // Check if we generate correct Add redirect url and if the form is
+    // pre-filled.
+    $destination = Url::fromUri('base:admin/config/search/redirect/404')->toString();
+    $this->assertUrl('admin/config/search/redirect/add', ['query' => ['source' => 'testing', 'language' => 'fr', 'destination' => $destination]]);
+    $this->assertFieldByName('redirect_source[0][path]', 'testing');
+    $this->assertOptionSelected('edit-language-0-value', 'fr');
+
+    // Save the redirect.
+    $this->drupalPostForm(NULL, ['redirect_redirect[0][uri]' => '/node'], t('Save'));
+    $this->assertUrl('admin/config/search/redirect/404');
+
+    // Check if the redirect works as expected.
+    $this->assertRedirect('fr/testing', 'fr/node', 'HTTP/1.1 301 Moved Permanently');
+  }
+
+}
+
diff --git a/modules/redirect_404/src/Tests/Fix404RedirectUITest.php b/modules/redirect_404/src/Tests/Fix404RedirectUITest.php
new file mode 100644
index 0000000..769e03b
--- /dev/null
+++ b/modules/redirect_404/src/Tests/Fix404RedirectUITest.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace Drupal\redirect_404\Tests;
+
+use Drupal\Core\Url;
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * UI tests for redirect_404 module.
+ *
+ * @group redirect_404
+ */
+class Fix404RedirectUITest extends WebTestBase {
+
+  /**
+   * @var \Drupal\Core\Session\AccountInterface
+   */
+  protected $adminUser;
+
+  /**
+   * @var \Drupal\redirect\RedirectRepository
+   */
+  protected $repository;
+
+  /**
+   * @var \Drupal\Core\Entity\Sql\SqlContentEntityStorage
+   */
+  protected $storage;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = [
+    'redirect_404',
+    'node',
+    'path',
+    'dblog',
+    'views',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->drupalCreateContentType(['type' => 'article', 'name' => 'Article']);
+    $this->adminUser = $this->drupalCreateUser([
+      'administer redirects',
+      'access site reports',
+      'access content',
+      'bypass node access',
+      'create url aliases',
+      'administer url aliases',
+    ]);
+
+    $this->repository = \Drupal::service('redirect.repository');
+    $this->storage = $this->container->get('entity.manager')->getStorage('redirect');
+  }
+
+  /**
+   * Tests the fix 404 pages workflow.
+   */
+  public function testFix404Pages() {
+    $this->drupalLogin($this->adminUser);
+
+    // Visit a non existing page to have the 404 redirect_error entry.
+    $this->drupalGet('non-existing');
+
+    // Go to the "fix 404" page and check the listing.
+    $this->drupalGet('admin/config/search/redirect/404');
+    $this->assertText('non-existing');
+    $this->clickLink(t('Add redirect'));
+
+    // Check if we generate correct Add redirect url and if the form is
+    // pre-filled.
+    $destination = Url::fromUri('base:admin/config/search/redirect/404')->toString();
+    $this->assertUrl('admin/config/search/redirect/add', ['query' => ['source' => 'non-existing', 'language' => 'en', 'destination' => $destination]]);
+    $this->assertFieldByName('redirect_source[0][path]', 'non-existing');
+
+    // Save the redirect.
+    $this->drupalPostForm(NULL, ['redirect_redirect[0][uri]' => '/node'], t('Save'));
+    $this->assertUrl('admin/config/search/redirect/404');
+
+    // Check if the redirect works as expected.
+    $this->drupalGet('non-existing');
+    $this->assertUrl('node');
+  }
+
+}
+
diff --git a/redirect.routing.yml b/redirect.routing.yml
index 36b433d..4384701 100644
--- a/redirect.routing.yml
+++ b/redirect.routing.yml
@@ -46,14 +46,6 @@ redirect.settings:
   requirements:
     _permission: 'administer redirects'
 
-redirect.fix_404:
-  path: '/admin/config/search/redirect/404'
-  defaults:
-    _title: 'Fix 404 pages'
-    _form: '\Drupal\redirect\Form\RedirectFix404Form'
-  requirements:
-    _permission: 'administer redirects'
-
 #redirect.devel_generate:
 #  requirements:
 #    _module_dependencies: 'devel'
diff --git a/src/Form/RedirectFix404Form.php b/src/Form/RedirectFix404Form.php
deleted file mode 100644
index 3dd1dda..0000000
--- a/src/Form/RedirectFix404Form.php
+++ /dev/null
@@ -1,173 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\redirect\Form\RedirectFix404Form
- */
-
-namespace Drupal\redirect\Form;
-
-use Drupal\Component\Utility\SafeMarkup;
-use Drupal\Core\Database\Query\SelectInterface;
-use Drupal\Core\Form\FormBase;
-use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Url;
-use Symfony\Component\HttpFoundation\Request;
-
-class RedirectFix404Form extends FormBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getFormId() {
-    return 'redirect_fix_404_form';
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function buildForm(array $form, FormStateInterface $form_state) {
-    $destination = drupal_get_destination();
-
-    $search = $this->getRequest()->get('search');
-    $form['#attributes'] = array('class' => array('search-form'));
-
-    // The following requires the dblog module. If it's not available, provide a message.
-    if (! \Drupal::moduleHandler()->moduleExists('dblog')) {
-      $form['message'] = [
-        '#type' => 'markup',
-        '#markup' => t('This page requires the Database Logging (dblog) module, which is currently not installed.'),
-      ];
-      return $form;
-    }
-
-    $form['basic'] = array(
-      '#type' => 'fieldset',
-      '#title' => t('Filter 404s'),
-      '#attributes' => array('class' => array('container-inline')),
-    );
-    $form['basic']['filter'] = array(
-      '#type' => 'textfield',
-      '#title' => '',
-      '#default_value' => $search,
-      '#maxlength' => 128,
-      '#size' => 25,
-    );
-    $form['basic']['submit'] = array(
-      '#type' => 'submit',
-      '#value' => t('Filter'),
-      '#action' => 'filter',
-    );
-    if ($search) {
-      $form['basic']['reset'] = array(
-        '#type' => 'submit',
-        '#value' => t('Reset'),
-        '#action' => 'reset',
-      );
-    }
-
-    $header = array(
-      array('data' => t('Page'), 'field' => 'message'),
-      array('data' => t('Count'), 'field' => 'count', 'sort' => 'desc'),
-      array('data' => t('Last accessed'), 'field' => 'timestamp'),
-      array('data' => t('Operations')),
-    );
-
-    $count_query = db_select('watchdog', 'w');
-    $count_query->addExpression('COUNT(DISTINCT(w.message))');
-    $count_query->leftJoin('redirect', 'r', 'w.message = r.redirect_source__path');
-    $count_query->condition('w.type', 'page not found');
-    $count_query->isNull('r.rid');
-    $this->filterQuery($count_query, array('w.message'), $search);
-
-    $query = db_select('watchdog', 'w')
-      ->extend('Drupal\Core\Database\Query\TableSortExtender')->orderByHeader($header)
-      ->extend('Drupal\Core\Database\Query\PagerSelectExtender')->limit(25);
-    $query->fields('w', array('message', 'variables'));
-    $query->addExpression('COUNT(wid)', 'count');
-    $query->addExpression('MAX(timestamp)', 'timestamp');
-    $query->leftJoin('redirect', 'r', 'w.message = r.redirect_source__path');
-    $query->isNull('r.rid');
-    $query->condition('w.type', 'page not found');
-    $query->groupBy('w.message');
-    $query->groupBy('w.variables');
-    $this->filterQuery($query, array('w.message'), $search);
-    $query->setCountQuery($count_query);
-    $results = $query->execute();
-
-    $rows = array();
-    foreach ($results as $result) {
-
-      // @todo Detect the language from the url.
-      $url = SafeMarkup::format($result->message, unserialize($result->variables));
-
-      $request = Request::create($url, 'GET', [], [], [], \Drupal::request()->server->all());
-      $path = ltrim($request->getPathInfo(), '/');
-
-      $row = array();
-      $row['source'] = \Drupal::l($url, Url::fromUri('base:' . $path, array('query' => $destination)));
-      $row['count'] = $result->count;
-      $row['timestamp'] = format_date($result->timestamp, 'short');
-
-      $operations = array();
-      if (\Drupal::entityManager()->getAccessControlHandler('redirect')->createAccess()) {
-        $operations['add'] = array(
-          'title' => t('Add redirect'),
-          'url' => Url::fromRoute('redirect.add', [], ['query' => array('source' => $path) + $destination]),
-        );
-      }
-      $row['operations'] = array(
-        'data' => array(
-          '#theme' => 'links',
-          '#links' => $operations,
-          '#attributes' => array('class' => array('links', 'inline', 'nowrap')),
-        ),
-      );
-
-      $rows[] = $row;
-    }
-
-    $form['redirect_404_table']  = array(
-      '#theme' => 'table',
-      '#header' => $header,
-      '#rows' => $rows,
-      '#empty' => t('No 404 pages without redirects found.'),
-    );
-    $form['redirect_404_pager'] = array('#type' => 'pager');
-    return $form;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function submitForm(array &$form, FormStateInterface $form_state) {
-
-    if ($form_state->getTriggeringElement()['#action'] == 'filter') {
-      $form_state->setRedirect('redirect.fix_404', array(), array('query' => array('search' => trim($form_state->getValue('filter')))));
-    }
-    else {
-      $form_state->setRedirect('redirect.fix_404');
-    }
-  }
-
-  /**
-   * Extends a query object for URL redirect filters.
-   *
-   * @param $query
-   *   Query object that should be filtered.
-   * @param $keys
-   *   The filter string to use.
-   */
-  protected function filterQuery(SelectInterface $query, array $fields, $keys = '') {
-    if ($keys && $fields) {
-      // Replace wildcards with PDO wildcards.
-      $conditions = db_or();
-      $wildcard = '%' . trim(preg_replace('!\*+!', '%', db_like($keys)), '%') . '%';
-      foreach ($fields as $field) {
-        $conditions->condition($field, $wildcard, 'LIKE');
-      }
-      $query->condition($conditions);
-    }
-  }
-
-}
diff --git a/src/RedirectStorageSchema.php b/src/RedirectStorageSchema.php
index acdb1d9..b080c79 100644
--- a/src/RedirectStorageSchema.php
+++ b/src/RedirectStorageSchema.php
@@ -27,9 +27,8 @@ class RedirectStorageSchema extends SqlContentEntityStorageSchema {
     ];
     $schema['redirect']['indexes'] += [
       // Limit length to 191.
-      'source_language' => [['redirect_source__path', 191],'language'],
+      'source_language' => [['redirect_source__path', 191], 'language'],
     ];
-
     return $schema;
   }
 
diff --git a/src/Tests/RedirectUITest.php b/src/Tests/RedirectUITest.php
index e2ace54..bae2e0d 100644
--- a/src/Tests/RedirectUITest.php
+++ b/src/Tests/RedirectUITest.php
@@ -230,35 +230,6 @@ class RedirectUITest extends WebTestBase {
   }
 
   /**
-   * Tests the fix 404 pages workflow.
-   */
-  public function testFix404Pages() {
-    $this->drupalLogin($this->adminUser);
-
-    // Visit a non existing page to have the 404 watchdog entry.
-    $this->drupalGet('non-existing');
-
-    // Go to the "fix 404" page and check the listing.
-    $this->drupalGet('admin/config/search/redirect/404');
-    $this->assertText('non-existing');
-    $this->clickLink(t('Add redirect'));
-
-    // Check if we generate correct Add redirect url and if the form is
-    // pre-filled.
-    $destination = Url::fromUri('base:admin/config/search/redirect/404')->toString();
-    $this->assertUrl('admin/config/search/redirect/add', ['query' => ['source' => 'non-existing', 'destination' => $destination]]);
-    $this->assertFieldByName('redirect_source[0][path]', 'non-existing');
-
-    // Save the redirect.
-    $this->drupalPostForm(NULL, array('redirect_redirect[0][uri]' => '/node'), t('Save'));
-    $this->assertUrl('admin/config/search/redirect/404');
-
-    // Check if the redirect works as expected.
-    $this->drupalGet('non-existing');
-    $this->assertUrl('node');
-  }
-
-  /**
    * Tests redirects being automatically created upon path alias change.
    */
   public function testAutomaticRedirects() {
