diff --git a/path_redirect.admin.inc b/path_redirect.admin.inc
index 2cd4146..658f983 100644
--- a/path_redirect.admin.inc
+++ b/path_redirect.admin.inc
@@ -504,6 +504,13 @@ function path_redirect_settings_form() {
     '#title' => t('Allow users to bypass redirects by adding %code to the URL.', array('%code' => variable_get('clean_url', 0) ? '?redirect=no' : '&redirect=no')),
     '#default_value' => variable_get('path_redirect_allow_bypass', 0),
   );
+  $form['path_redirect_retain_query_string'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Include incoming URL query string in redirect'),
+    '#default_value' => variable_get('path_redirect_retain_query_string', FALSE),
+    '#description' => t("Allow query strings on the source URL to carry forward to the redirected URL. If enabled, the query string on an incoming URL is merged with the query string stored with the redirect URL if any (query string components from the incoming URL will be overwritten by saved values)."),
+  );
+
   $form['path_redirect_auto_redirect'] = array(
     '#type' => 'checkbox',
     '#title' => t('Automatically create redirects when URL aliases are changed.'),
diff --git a/path_redirect.module b/path_redirect.module
index ebfd435..cb66990 100644
--- a/path_redirect.module
+++ b/path_redirect.module
@@ -114,6 +114,11 @@ function path_redirect_goto($redirect = NULL) {
   }
 
   if ($redirect) {
+    if (variable_get('path_redirect_retain_query_string', FALSE)) {
+      // Append to query string on redirect URL
+      // Values from the stored redirect will override those specified in the request if they collide.
+      $redirect['query'] = array_merge($query, $redirect['query']);
+    }
     // Create the absolute redirection URL.
     $redirect['redirect_url'] = url($redirect['redirect'], array('query' => $redirect['query'], 'fragment' => $redirect['fragment'], 'absolute' => TRUE));
 
@@ -652,6 +657,7 @@ function path_redirect_get_query_array($query) {
 
 function path_redirect_variables() {
   return array(
+    'path_redirect_retain_query_string' => FALSE,
     'path_redirect_redirect_warning' => 0,
     'path_redirect_allow_bypass' => 0,
     'path_redirect_auto_redirect' => 1,
diff --git a/path_redirect.test b/path_redirect.test
index b0803d0..5f0acbc 100644
--- a/path_redirect.test
+++ b/path_redirect.test
@@ -92,7 +92,7 @@ class PathRedirectUnitTest extends PathRedirectTestHelper {
     }
   }
 
-  function testRedirects() {
+  function testRedirects($options = array()) {
     // Test a basic redirect (with and without a trailing slash requested).
     $this->addRedirect('test', 'node');
     $this->assertRedirect(array('source' => 'test', 'redirect' => 'node'));
@@ -138,6 +138,14 @@ class PathRedirectUnitTest extends PathRedirectTestHelper {
     $this->assertRedirect($redirect2);
     $this->assertRedirect($redirect3);
   }
+
+  function testQueryStrings() {
+    $options = array('query' => 'retain_query_string=test');
+    $retain_query_string = (bool) variable_get('path_redirect_retain_query_string', FALSE);
+    variable_set('path_redirect_retain_query_string', !$retain_query_string);
+    $this->testRedirects($options);
+    variable_set('path_redirect_retain_query_string', $retain_query_string);
+  }
 }
 
 /*class PathRedirectPathautoUnitTest extends PathRedirectTestHelper {
