diff --git a/context_redirect_reaction.inc b/context_redirect_reaction.inc
index fcf6633..7673610 100644
--- a/context_redirect_reaction.inc
+++ b/context_redirect_reaction.inc
@@ -42,18 +42,30 @@ class context_redirect_reaction extends context_reaction {
               drupal_set_message(t("Context redirect trigger by !name context", array('!name' => $name)));
             }
 
-            //be careful we don't redirect when on URL or we'll get infinite loop
-            if (empty($_SESSION['context_redirect_processed'])) {
-              $_SESSION['context_redirect_processed'] = TRUE;
+            // Don't trigger this reaction more than once per-context or we're
+            // asking for a redirect loop.
+            // @see http://drupal.org/node/1142626
+            if (empty($_SESSION['context_redirect_processed'][$context->name])) {
+              $_SESSION['context_redirect_processed'][$context->name] = TRUE;
               $this->context_redirect_goto($url);
             }
+            // Notify admin that a redirect loop caused by context redirect has
+            // been detected.
             else {
-              unset($_SESSION['context_redirect_processed']);
+              if(user_access('administer site configuration') && module_exists('context_ui')) {
+                drupal_set_message(t('There is a conflict between multiple redirect reactions causing a redirect loop on this page. Please ' . l('review your contexts', 'admin/structure/context') . '.'), 'warning');
+              }
             }
           }
         }
       }
     }
+
+    // Unconditionally remove our session variable. It should only exist while
+    // we're actively chaining redirects.
+    if (isset($_SESSION['context_redirect_processed'])) {
+      unset($_SESSION['context_redirect_processed']);
+    }
   }
 
   /**
