diff --git a/src/Plugin/Field/FieldFormatter/RedirectSourceFormatter.php b/src/Plugin/Field/FieldFormatter/RedirectSourceFormatter.php
index 7ef400d..b8821ed 100644
--- a/src/Plugin/Field/FieldFormatter/RedirectSourceFormatter.php
+++ b/src/Plugin/Field/FieldFormatter/RedirectSourceFormatter.php
@@ -26,7 +26,7 @@ class RedirectSourceFormatter extends FormatterBase {
 
     foreach ($items as $delta => $item) {
       $elements[$delta] = array(
-        '#markup' => urldecode($item->getUrl()->toString()),
+        '#markup' => str_replace('/%2A', '/*', $item->getUrl()->toString()),
       );
     }
 
diff --git a/src/Plugin/Field/FieldWidget/RedirectSourceWidget.php b/src/Plugin/Field/FieldWidget/RedirectSourceWidget.php
index 729abe4..84b563a 100644
--- a/src/Plugin/Field/FieldWidget/RedirectSourceWidget.php
+++ b/src/Plugin/Field/FieldWidget/RedirectSourceWidget.php
@@ -46,6 +46,9 @@ class RedirectSourceWidget extends WidgetBase {
       '#required' => $element['#required'],
       '#field_prefix' => Url::fromRoute('<front>', array(), array('absolute' => TRUE))->toString(),
       '#attributes' => array('data-disable-refocus' => 'true'),
+      '#description' => $this->t("Specify pages by using their paths. Enter one path per line. The '*' character is a wildcard. An example path is %user-wildcard for every user page.", [
+        '%user-wildcard' => '/user/*',
+      ]),
     );
 
     // If creating new URL add checks.
diff --git a/src/RedirectRepository.php b/src/RedirectRepository.php
index f8a1cea..bac6255 100644
--- a/src/RedirectRepository.php
+++ b/src/RedirectRepository.php
@@ -64,16 +64,28 @@ class RedirectRepository {
    */
   public function findMatchingRedirect($source_path, array $query = [], $language = Language::LANGCODE_NOT_SPECIFIED) {
     $source_path = ltrim($source_path, '/');
-    $hashes = [Redirect::generateHash($source_path, $query, $language)];
-    if ($language != Language::LANGCODE_NOT_SPECIFIED) {
-      $hashes[] = Redirect::generateHash($source_path, $query, Language::LANGCODE_NOT_SPECIFIED);
+    $lookup_paths = [$source_path];
+
+    // Add suitable wildcards to lookup paths.
+    $source_path_exploded = explode('/', $source_path);
+    while (array_pop($source_path_exploded)) {
+      $lookup_paths[] = implode('/', array_merge($source_path_exploded, ['*']));
     }
 
-    // Add a hash without the query string if using passthrough querystrings.
-    if (!empty($query) && $this->config->get('passthrough_querystring')) {
-      $hashes[] = Redirect::generateHash($source_path, [], $language);
+    $hashes = [];
+    foreach ($lookup_paths as $lookup_path) {
+      $hashes[] = Redirect::generateHash($lookup_path, $query, $language);
+
       if ($language != Language::LANGCODE_NOT_SPECIFIED) {
-        $hashes[] = Redirect::generateHash($source_path, [], Language::LANGCODE_NOT_SPECIFIED);
+        $hashes[] = Redirect::generateHash($lookup_path, $query, Language::LANGCODE_NOT_SPECIFIED);
+      }
+
+      // Add a hash without the query string if using passthrough querystrings.
+      if (!empty($query) && $this->config->get('passthrough_querystring')) {
+        $hashes[] = Redirect::generateHash($lookup_path, [], $language);
+        if ($language != Language::LANGCODE_NOT_SPECIFIED) {
+          $hashes[] = Redirect::generateHash($lookup_path, [], Language::LANGCODE_NOT_SPECIFIED);
+        }
       }
     }
 
