diff --git a/config/install/redirect.settings.yml b/config/install/redirect.settings.yml
index 65c0e7a..09e9b08 100644
--- a/config/install/redirect.settings.yml
+++ b/config/install/redirect.settings.yml
@@ -3,11 +3,6 @@ auto_redirect: true
 default_status_code: 301
 passthrough_querystring: true
 warning: false
-nonclean_to_clean: true
 ignore_admin_path: false
-frontpage_redirect: true
-deslash: false
 access_check: false
-normalize_aliases: true
 content_location_header: false
-term_path_handler: true
diff --git a/config/schema/redirect.schema.yml b/config/schema/redirect.schema.yml
index 1a521a6..a97def2 100644
--- a/config/schema/redirect.schema.yml
+++ b/config/schema/redirect.schema.yml
@@ -19,30 +19,15 @@ redirect.settings:
     warning:
       type: boolean
       label: 'Display a warning message to users when they are redirected.'
-    nonclean_to_clean:
-      type: boolean
-      label: 'Redirect from non-clean URLs to clean URLs.'
     ignore_admin_path:
       type: boolean
       label: 'Allow redirections on admin paths.'
-    frontpage_redirect:
-      type: boolean
-      label: 'Redirect from paths like index.php and /node to the root directory.'
-    deslash:
-      type: boolean
-      label: 'Remove trailing slashes from paths.'
     trailing_zero:
       type: integer
       label: 'Remove Trailing Zero Argument'
     access_check:
       type: boolean
       label: 'Menu Access Checking'
-    normalize_aliases:
-      type: boolean
-      label: 'Case Sensitive URL Checking'
     content_location_header:
       type: boolean
       label: 'Set Content Location Header'
-    term_path_handler:
-      type: boolean
-      label: 'Taxonomy Term Path Handler'
\ No newline at end of file
diff --git a/redirect.install b/redirect.install
index 4acfd13..4ef1f95 100644
--- a/redirect.install
+++ b/redirect.install
@@ -148,3 +148,17 @@ function redirect_update_8103() {
   }
   return $message;
 }
+
+/**
+ * Removes unnecessary settings from storage.
+ * @see https://www.drupal.org/node/2704213
+ */
+function redirect_update_8104() {
+  $config = \Drupal::configFactory()->getEditable('redirect.settings');
+  $config->clear('term_path_handler');
+  $config->clear('normalize_aliases');
+  $config->clear('deslash');
+  $config->clear('frontpage_redirect');
+  $config->clear('nonclean_to_clean');
+  $config->save();
+}
\ No newline at end of file
diff --git a/redirect.services.yml b/redirect.services.yml
index 2d6a810..8a1366d 100644
--- a/redirect.services.yml
+++ b/redirect.services.yml
@@ -1,3 +1,5 @@
+parameters:
+  route_normalizer_enabled: true
 services:
   redirect.repository:
     class: Drupal\redirect\RedirectRepository
@@ -17,3 +19,8 @@ services:
         arguments: ['@cache_tags.invalidator']
         tags:
           - { name: event_subscriber }
+  redirect.route_normalizer_request_subscriber:
+    class: Drupal\redirect\EventSubscriber\RouteNormalizerRequestSubscriber
+    arguments: ['@url_generator', '@path.matcher', '%route_normalizer_enabled%']
+    tags:
+      - { name: event_subscriber }
diff --git a/src/EventSubscriber/RedirectRequestSubscriber.php b/src/EventSubscriber/RedirectRequestSubscriber.php
index cacd951..65b9b66 100644
--- a/src/EventSubscriber/RedirectRequestSubscriber.php
+++ b/src/EventSubscriber/RedirectRequestSubscriber.php
@@ -170,111 +170,6 @@ class RedirectRequestSubscriber implements EventSubscriberInterface {
   }
 
   /**
-   * Detects a q=path/to/page style request and performs a redirect.
-   *
-   * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
-   *   The Event to process.
-   */
-  public function redirectCleanUrls(GetResponseEvent $event) {
-    if (!$this->config->get('nonclean_to_clean') || $event->getRequestType() != HttpKernelInterface::MASTER_REQUEST) {
-      return;
-    }
-
-    $request = $event->getRequest();
-    $uri = $request->getUri();
-    if (strpos($uri, 'index.php')) {
-      $url = str_replace('/index.php', '', $uri);
-      $response = new TrustedRedirectResponse($url, 301);
-      $response->addCacheableDependency(CacheableMetadata::createFromRenderArray([])->addCacheTags(['rendered']));
-      $event->setResponse($response);
-    }
-  }
-
-  /**
-   * Detects a url with an ending slash (/) and removes it.
-   *
-   * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
-   */
-  public function redirectDeslash(GetResponseEvent $event) {
-    if (!$this->config->get('deslash') || $event->getRequestType() != HttpKernelInterface::MASTER_REQUEST) {
-      return;
-    }
-
-    $path_info = $event->getRequest()->getPathInfo();
-    if (($path_info !== '/') && (substr($path_info, -1, 1) === '/')) {
-      $path_info = rtrim($path_info, '/');
-      try {
-        $path_info = $this->aliasManager->getPathByAlias($path_info);
-        $this->setResponse($event, Url::fromUri('internal:' . $path_info));
-      } catch (\Exception $e) {
-        watchdog_exception('redirect', $e, $e->getMessage(), [], RfcLogLevel::WARNING);
-      }
-    }
-  }
-
-  /**
-   * Redirects any path that is set as front page to the site root.
-   *
-   * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
-   */
-  public function redirectFrontPage(GetResponseEvent $event) {
-    if (!$this->config->get('frontpage_redirect') || $event->getRequestType() != HttpKernelInterface::MASTER_REQUEST) {
-      return;
-    }
-
-    $request = $event->getRequest();
-    $path = $request->getPathInfo();
-
-    // Redirect only if the current path is not the root and this is the front
-    // page.
-    if ($this->isFrontPage($path)) {
-      $this->setResponse($event, Url::fromRoute('<front>'));
-    }
-  }
-
-  /**
-   * Normalizes the path aliases.
-   *
-   * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
-   */
-  public function redirectNormalizeAliases(GetResponseEvent $event) {
-    if ($event->getRequestType() != HttpKernelInterface::MASTER_REQUEST || !$this->config->get('normalize_aliases') || !$path = $event->getRequest()->getPathInfo()) {
-      return;
-    }
-
-
-    $system_path = $this->aliasManager->getPathByAlias($path);
-    $alias = $this->aliasManager->getAliasByPath($system_path, $this->languageManager->getCurrentLanguage()
-      ->getId());
-    // If the alias defined in the system is not the same as the one via which
-    // the page has been accessed do a redirect to the one defined in the
-    // system.
-    if ($alias != $path) {
-      if ($url = \Drupal::pathValidator()->getUrlIfValid($alias)) {
-        $this->setResponse($event, $url);
-      }
-    }
-  }
-
-  /**
-   * Redirects forum taxonomy terms to correct forum path.
-   *
-   * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
-   */
-  public function redirectForum(GetResponseEvent $event) {
-    $request = $event->getRequest();
-    if ($event->getRequestType() != HttpKernelInterface::MASTER_REQUEST || !$this->config->get('term_path_handler') || !$this->moduleHandler->moduleExists('forum') || !preg_match('/taxonomy\/term\/([0-9]+)$/', $request->getUri(), $matches)) {
-      return;
-    }
-
-    $term = $this->entityManager->getStorage('taxonomy_term')
-      ->load($matches[1]);
-    if (!empty($term) && $term->url() != $request->getPathInfo()) {
-      $this->setResponse($event, Url::fromUri('entity:taxonomy_term/' . $term->id()));
-    }
-  }
-
-  /**
    * Prior to set the response it check if we can redirect.
    *
    * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
@@ -308,42 +203,7 @@ class RedirectRequestSubscriber implements EventSubscriberInterface {
     // a priority of 32. Otherwise, that aborts the request if no matching
     // route is found.
     $events[KernelEvents::REQUEST][] = array('onKernelRequestCheckRedirect', 33);
-    $events[KernelEvents::REQUEST][] = array('redirectCleanUrls', 34);
-    $events[KernelEvents::REQUEST][] = array('redirectDeslash', 35);
-    $events[KernelEvents::REQUEST][] = array('redirectFrontPage', 36);
-    $events[KernelEvents::REQUEST][] = array(
-      'redirectNormalizeAliases',
-      37,
-    );
-    $events[KernelEvents::REQUEST][] = array('redirectForum', 38);
     return $events;
   }
 
-  /**
-   * Determine if the given path is the site's front page.
-   *
-   * @param string $path
-   *   The path to check.
-   *
-   * @return bool
-   *   Returns TRUE if the path is the site's front page.
-   */
-  protected function isFrontPage($path) {
-    // @todo PathMatcher::isFrontPage() doesn't work here for some reason.
-    $front = \Drupal::config('system.site')->get('page.front');
-
-    // Since deslash runs after the front page redirect, check and deslash here
-    // if enabled.
-    if ($this->config->get('deslash')) {
-      $path = rtrim($path, '/');
-    }
-
-    // This might be an alias.
-    $alias_path = \Drupal::service('path.alias_manager')->getPathByAlias($path);
-
-    return !empty($path)
-    // Path matches front or alias to front.
-    && (($path == $front) || ($alias_path == $front));
-  }
-
 }
diff --git a/src/EventSubscriber/RouteNormalizerRequestSubscriber.php b/src/EventSubscriber/RouteNormalizerRequestSubscriber.php
new file mode 100644
index 0000000..fcd211d
--- /dev/null
+++ b/src/EventSubscriber/RouteNormalizerRequestSubscriber.php
@@ -0,0 +1,140 @@
+<?php
+
+namespace Drupal\redirect\EventSubscriber;
+
+use Drupal\Core\Path\PathMatcherInterface;
+use Drupal\Core\Routing\RequestHelper;
+use Drupal\Core\Routing\UrlGeneratorInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpFoundation\RedirectResponse;
+use Drupal\Core\Routing\RouteMatch;
+
+/**
+ * Normalizes GET requests performing a redirect if required.
+ *
+ * Not every but most of GET requests are processed. All conditions can be found
+ * in shouldRedirect() method.
+ *
+ * The normalization can be disabled by setting the "_disable_route_normalizer"
+ * request parameter to TRUE. However, this should be done before
+ * onKernelRequestRedirect() method is executed.
+ */
+class RouteNormalizerRequestSubscriber implements EventSubscriberInterface {
+
+  /**
+   * The URL generator service.
+   *
+   * @var \Drupal\Core\Routing\UrlGeneratorInterface
+   */
+  protected $urlGenerator;
+
+  /**
+   * The path matcher service.
+   *
+   * @var \Drupal\Core\Path\PathMatcherInterface
+   */
+  protected $pathMatcher;
+
+  /**
+   * The value of the route_normalizer_enabled container parameter.
+   *
+   * @var bool
+   */
+  protected $routeNormalizerEnabled;
+
+  /**
+   * Constructs a RouteNormalizerRequestSubscriber object.
+   *
+   * @param \Drupal\Core\Routing\UrlGeneratorInterface $url_generator
+   *   The URL generator service.
+   * @param \Drupal\Core\Path\PathMatcherInterface $path_matcher
+   *   The path matcher service.
+   * @param bool $route_normalizer_enabled
+   *   The value of the route_normalizer_enabled container parameter.
+   */
+  public function __construct(UrlGeneratorInterface $url_generator, PathMatcherInterface $path_matcher, $route_normalizer_enabled) {
+    $this->urlGenerator = $url_generator;
+    $this->pathMatcher = $path_matcher;
+    $this->routeNormalizerEnabled = $route_normalizer_enabled;
+  }
+
+  /**
+   * Performs a redirect if the URL changes in routing.
+   *
+   * The redirect happens if a URL constructed from the current route is
+   * different from the requested one. Examples:
+   * - Language negotiation system detected a language to use, and that language
+   *   has a path prefix: perform a redirect to the language prefixed URL.
+   * - A route that's set as the front page is requested: redirect to the front
+   *   page.
+   * - Requested path has an alias: redirect to alias.
+   *
+   * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
+   *   The Event to process.
+   */
+  public function onKernelRequestRedirect(GetResponseEvent $event) {
+    if ($this->shouldRedirect($event)) {
+      $request = $event->getRequest();
+      // The "<current>" placeholder can be used for all routes except the front
+      // page because it's not a real route.
+      $route_name = $this->pathMatcher->isFrontPage() ? '<front>' : '<current>';
+      $options = [
+        'query' => $request->query->all(),
+        'absolute' => TRUE,
+      ];
+      $redirect_uri = $this->urlGenerator->generateFromRoute($route_name, [], $options);
+
+      // Remove /index.php from redirect uri the hard way.
+      if (!RequestHelper::isCleanUrl($request)) {
+        // This needs to be fixed differently.
+        $redirect_uri = str_replace('/index.php', '', $redirect_uri);
+      }
+
+      $original_uri = $request->getSchemeAndHttpHost() . $request->getRequestUri();
+      if ($redirect_uri != $original_uri) {
+        $response = new RedirectResponse($redirect_uri, 301);
+        $response->headers->set('X-Drupal-Route-Normalizer', 1);
+        $event->setResponse($response);
+      }
+    }
+  }
+
+  /**
+   * Detects if a redirect can be performed during the current request.
+   *
+   * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
+   *   The Event to process.
+   *
+   * @return bool
+   */
+  protected function shouldRedirect(GetResponseEvent $event) {
+    if ($request = $event->getRequest()) {
+      $routeMatch = RouteMatch::createFromRequest($request);
+      $routeName = $routeMatch->getRouteName();
+      $route = $routeMatch->getRouteObject();
+
+      return $this->routeNormalizerEnabled
+        && $routeName !== 'image.style_public'
+        && $event->isMasterRequest()
+        && ($request->isMethod('GET') || $request->isMethod('HEAD'))
+        && !$request->query->has('destination')
+        && !$request->attributes->get('_disable_route_normalizer')
+        && (!\Drupal::config('redirect.settings')->get('ignore_admin_path') || !\Drupal::service('router.admin_context')->isAdminRoute($route));
+    }
+    else {
+      return false;
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  static function getSubscribedEvents() {
+    $events[KernelEvents::REQUEST][] = array('onKernelRequestRedirect', 30);
+    return $events;
+  }
+
+}
diff --git a/src/Form/RedirectSettingsForm.php b/src/Form/RedirectSettingsForm.php
index 1cd8e12..a804f19 100644
--- a/src/Form/RedirectSettingsForm.php
+++ b/src/Form/RedirectSettingsForm.php
@@ -60,28 +60,11 @@ class RedirectSettingsForm extends ConfigFormBase {
       '#title' => $this->t('Global redirects'),
       '#description' => $this->t('(formerly Global Redirect features)'),
     );
-    $form['globals']['redirect_frontpage_redirect'] = array(
-      '#type' => 'checkbox',
-      '#title' => $this->t('Redirect from paths like index.php and /node to the root directory.'),
-      '#default_value' => $config->get('frontpage_redirect'),
-    );
-    $form['globals']['redirect_nonclean_to_clean'] = array(
-      '#type' => 'checkbox',
-      '#title' => $this->t('Redirect from non-clean URLs to clean URLs.'),
-      '#default_value' => $config->get('nonclean_to_clean'),
-      // @todo - does still apply? See https://drupal.org/node/1659580
-      //'#disabled' => !variable_get('clean_url', 0),
-    );
     $form['globals']['redirect_canonical'] = array(
       '#type' => 'checkbox',
       '#title' => $this->t('Redirect from non-canonical URLs to the canonical URLs.'),
       '#default_value' => $config->get('canonical'),
     );
-    $form['globals']['redirect_deslash'] = array(
-      '#type' => 'checkbox',
-      '#title' => $this->t('Remove trailing slashes from paths.'),
-      '#default_value' => $config->get('deslash'),
-    );
     $form['globals']['redirect_ignore_admin_path'] = array(
       '#type' => 'checkbox',
       '#title' => $this->t('Allow redirections on admin paths.'),
@@ -94,13 +77,6 @@ class RedirectSettingsForm extends ConfigFormBase {
       '#default_value' => $config->get('access_check'),
     );
 
-    $form['globals']['redirect_normalize_aliases'] = array(
-      '#type' => 'checkbox',
-      '#title' => $this->t('Normalize aliases'),
-      '#description' => $this->t('Will check if for the given path an alias exists or if the used alias is in correct case and will redirect to the appropriate alias form.'),
-      '#default_value' => $config->get('normalize_aliases'),
-    );
-
     $form['globals']['redirect_content_location_header'] = array(
       '#type' => 'checkbox',
       '#title' => $this->t('Set Content Location Header'),
@@ -108,13 +84,6 @@ class RedirectSettingsForm extends ConfigFormBase {
       '#default_value' => $config->get('content_location_header'),
     );
 
-    $form['global']['redirect_term_path_handler'] = array(
-      '#type' => 'checkbox',
-      '#title' => $this->t('Taxonomy Term Path Handler'),
-      '#description' => $this->t('If enabled, any request to a taxonomy/term/[tid] page will check that the correct path is being used for the term\'s vocabulary.'),
-      '#default_value' => $config->get('term_path_handler'),
-    );
-
     return parent::buildForm($form, $form_state);
   }
 
diff --git a/src/Tests/GlobalRedirectTest.php b/src/Tests/GlobalRedirectTest.php
index 782b88b..a122bbb 100644
--- a/src/Tests/GlobalRedirectTest.php
+++ b/src/Tests/GlobalRedirectTest.php
@@ -9,6 +9,7 @@ namespace Drupal\redirect\Tests;
 use Drupal\Component\Utility\SafeMarkup;
 use Drupal\Core\Language\Language;
 use Drupal\simpletest\WebTestBase;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Global redirect test cases.
@@ -22,7 +23,16 @@ class GlobalRedirectTest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = array('path', 'node', 'redirect', 'taxonomy', 'forum', 'views');
+  public static $modules = [
+    'path',
+    'node',
+    'redirect',
+    'taxonomy',
+    'forum',
+    'views',
+    'language',
+    'content_translation'
+  ];
 
   /**
    * @var \Drupal\Core\Session\AccountInterface
@@ -75,6 +85,12 @@ class GlobalRedirectTest extends WebTestBase {
     $this->adminUser = $this->drupalCreateUser([
       'administer site configuration',
       'access administration pages',
+      'administer languages',
+      'administer content types',
+      'administer content translation',
+      'create page content',
+      'edit own page content',
+      'create content translations',
     ]);
 
     // Save the node.
@@ -122,23 +138,17 @@ class GlobalRedirectTest extends WebTestBase {
   public function testRedirects() {
 
     // Test alias normalization.
-    $this->config->set('normalize_aliases', TRUE)->save();
     $this->assertRedirect('node/' . $this->node->id(), 'test-node');
     $this->assertRedirect('Test-node', 'test-node');
 
-    $this->config->set('normalize_aliases', FALSE)->save();
-    $this->assertRedirect('node/' . $this->node->id(), NULL, 'HTTP/1.1 200 OK');
-    $this->assertRedirect('Test-node', NULL, 'HTTP/1.1 200 OK');
+    // Test redirects for non-clean urls.
+    $this->assertRedirect('index.php/node/' . $this->node->id(), 'test-node');
+    $this->assertRedirect('index.php/test-node', 'test-node');
 
     // Test deslashing.
-    $this->config->set('deslash', TRUE)->save();
     $this->assertRedirect('test-node/', 'test-node');
 
-    $this->config->set('deslash', FALSE)->save();
-    $this->assertRedirect('test-node/', NULL, 'HTTP/1.1 200 OK');
-
     // Test front page redirects.
-    $this->config->set('frontpage_redirect', TRUE)->save();
     $this->config('system.site')->set('page.front', '/node')->save();
     $this->assertRedirect('node', '<front>');
 
@@ -146,19 +156,12 @@ class GlobalRedirectTest extends WebTestBase {
     \Drupal::service('path.alias_storage')->save('/node', '/node-alias');
     $this->assertRedirect('node-alias', '<front>');
 
-    $this->config->set('frontpage_redirect', FALSE)->save();
-
-    $this->assertRedirect('node', NULL, 'HTTP/1.1 200 OK');
-    $this->assertRedirect('node-alias', NULL, 'HTTP/1.1 200 OK');
-
     // Test post request.
-    $this->config->set('normalize_aliases', TRUE)->save();
     $this->drupalPost('Test-node', 'application/json', array());
     // Does not do a redirect, stays in the same path.
     $this->assertEqual(basename($this->getUrl()), 'Test-node');
 
     // Test the access checking.
-    $this->config->set('normalize_aliases', TRUE)->save();
     $this->config->set('access_check', TRUE)->save();
     $this->assertRedirect('admin/config/system/site-information', NULL, 'HTTP/1.1 403 Forbidden');
 
@@ -174,8 +177,49 @@ class GlobalRedirectTest extends WebTestBase {
     $this->config->set('ignore_admin_path', FALSE)->save();
     $this->assertRedirect('admin/config/system/site-information', 'site-info');
 
+    // Test alias normalization again with ignore_admin_path false.
+    $this->assertRedirect('Test-node', 'test-node');
+
     $this->config->set('ignore_admin_path', TRUE)->save();
     $this->assertRedirect('admin/config/system/site-information', NULL, 'HTTP/1.1 200 OK');
+
+    // Test alias normalization again with ignore_admin_path true.
+    $this->assertRedirect('Test-node', 'test-node');
+  }
+
+  /**
+   * Test that redirects work properly with content_translation enabled.
+   */
+  public function testLanguageRedirects() {
+    $this->drupalLogin($this->adminUser);
+
+    // Add a new language.
+    ConfigurableLanguage::createFromLangcode('es')
+      ->save();
+
+    // Enable URL language detection and selection.
+    $edit = ['language_interface[enabled][language-url]' => '1'];
+    $this->drupalPostForm('admin/config/regional/language/detection', $edit, t('Save settings'));
+
+    // Set page content type to use multilingual support.
+    $edit = [
+      'language_configuration[language_alterable]' => TRUE,
+      'language_configuration[content_translation]' => TRUE,
+    ];
+    $this->drupalPostForm('admin/structure/types/manage/page', $edit, t('Save content type'));
+    $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Page')), 'Basic page content type has been updated.');
+
+    $spanish_node = $this->drupalCreateNode([
+      'type' => 'page',
+      'title' => 'Spanish Test Page Node',
+      'path' => ['alias' => '/spanish-test-node'],
+      'langcode' => 'es',
+    ]);
+
+    $this->drupalGet('es/node/' . $spanish_node->id() . '/edit');
+
+    // Test multilingual redirect.
+    $this->assertRedirect('es/node/' . $spanish_node->id(), 'es/spanish-test-node');
   }
 
   /**
diff --git a/src/Tests/RedirectUITest.php b/src/Tests/RedirectUITest.php
index e2ace54..72ca2de 100644
--- a/src/Tests/RedirectUITest.php
+++ b/src/Tests/RedirectUITest.php
@@ -482,9 +482,6 @@ class RedirectUITest extends WebTestBase {
     $redirect->save();
     $this->assertRedirect('a-path', 'https://www.example.org');
     $this->drupalLogin($this->adminUser);
-    $this->drupalPostForm('admin/config/search/redirect/settings', ['redirect_deslash' => 1], t('Save configuration'));
-    $this->drupalGet('/2015/10/10/');
-    $this->assertResponse(404);
   }
 
 }
diff --git a/tests/src/Kernel/RedirectAPITest.php b/tests/src/Kernel/RedirectAPITest.php
index 30328dd..02ef0cc 100644
--- a/tests/src/Kernel/RedirectAPITest.php
+++ b/tests/src/Kernel/RedirectAPITest.php
@@ -60,7 +60,7 @@ class RedirectAPITest extends KernelTestBase {
     $redirect->setRedirect('node');
 
     $redirect->save();
-    $this->assertEqual(Redirect::generateHash('some-url', array('key' => 'val'), Language::LANGCODE_NOT_SPECIFIED), $redirect->getHash());
+    $this->assertEquals(Redirect::generateHash('some-url', array('key' => 'val'), Language::LANGCODE_NOT_SPECIFIED), $redirect->getHash());
     // Update the redirect source query and check if hash has been updated as
     // expected.
     $redirect->setSource('some-url', array('key1' => 'val1'));
