diff --git a/redirect.module b/redirect.module
index 26e78bc..c1d17ea 100644
--- a/redirect.module
+++ b/redirect.module
@@ -328,7 +328,10 @@ function redirect_path_update(array $path) {
     $redirect->source = $path['original']['alias'];
     $redirect->redirect = $path['source'];
     $redirect->language = $path['original']['language'];
-    redirect_save($redirect);
+    // Check if the redirect exists before saving.
+    if (!redirect_check_duplicate_by_hash($redirect)) {
+      redirect_save($redirect);
+    }
   }
 }
 
@@ -1474,3 +1477,37 @@ function redirect_redirect_operations() {
   );
   return $operations;
 }
+
+/**
+ * Check if a duplicate of the redirect already exists based on the hash.
+ *
+ * @param $redirect
+ *   The URL redirect object.
+ *
+ * @return bool
+ *   TRUE if the redirect already exists and FALSE otherwise.
+ */
+function redirect_check_duplicate_by_hash($redirect) {
+
+  // We are attaching properties to generate a proper hash. We do not want these
+  // to leak outside this function.
+  $redirect = clone $redirect;
+
+  // Build up additional data that needs to be on redirect object for hash
+  // generation.
+  if (!empty($redirect->rid) && !isset($redirect->original)) {
+    $redirect->original = entity_load_unchanged('redirect', $redirect->rid);
+  }
+
+  if (!isset($redirect->is_new)) {
+    $redirect->is_new = empty($redirect->rid);
+  }
+
+  $hash = redirect_hash($redirect);
+
+  if (redirect_load_by_hash($hash)) {
+    return TRUE;
+  }
+
+  return FALSE;
+}
