diff --git a/modules/openstack_project/files/gerrit/hideci.js b/modules/openstack_project/files/gerrit/hideci.js
index 4634ca9d5e..233896f009 100644
--- a/modules/openstack_project/files/gerrit/hideci.js
+++ b/modules/openstack_project/files/gerrit/hideci.js
@@ -28,7 +28,7 @@ var pipelineNameRegex = /Build \w+ \((\w+) pipeline\)/;
 // The url to full status information on running jobs
 var zuulStatusURL = 'http://status.openstack.org/zuul';
 // The json URL to check for running jobs
-var zuulStatusJSON = 'https://zuul.openstack.org/status.json';
+var zuulStatusJSON = 'https://zuul.openstack.org/status/change/';
 
 // This is a variable to determine if we're in debugging mode, which
 // lets you globally set it to see what's going on in the flow.
@@ -449,18 +449,6 @@ var ci_zuul_process_changes = function(data, change_psnum) {
     }
 };
 
-var ci_zuul_inner_loop = function(change_psnum) {
-    var current = ci_current_change();
-    if (current && change_psnum.indexOf(current) != 0) {
-        // window url is dead
-        return;
-    }
-    $.getJSON(zuulStatusJSON, function(data) {
-        ci_zuul_process_changes(data, change_psnum);
-    });
-    setTimeout(function() {ci_zuul_inner_loop(change_psnum);}, 10000);
-};
-
 var ci_zuul_for_change = function(comments) {
     if (!comments) {
         comments = ci_parse_comments();
@@ -468,9 +456,57 @@ var ci_zuul_for_change = function(comments) {
     var change = ci_current_change();
     var psnum = ci_latest_patchset(comments);
     var change_psnum = change + "," + psnum;
-    ci_zuul_inner_loop(change_psnum);
+
+    // do the loop recursively in ajax
+    (function poll() {
+        $.ajax({
+            url: zuulStatusJSON + change_psnum,
+            type: "GET",
+            success: function(data) {
+                dbg("Found zuul data for " + change_psnum, data);
+                ci_zuul_process_changes(data, change_psnum);
+            },
+            dataType: "json",
+            complete: setTimeout(function() {
+                // once we are done with this cycle in the loop we
+                // schedule ourselves again in the future with
+                // setTimeout. However, by the time the function
+                // actually gets called, other things might have
+                // happened, and we may want to just dump the data
+                // instead.
+                //
+                // the UI might have gone hidden (user was bored,
+                // switched to another tab / window).
+                //
+                // the user may have navigated to another review url,
+                // so the data returned is not relevant.
+                //
+                // both cases are recoverable when the user navigates
+                // around, because a new "thread" gets started on
+                // ci_page_load.
+                //
+                // BUG(sdague): there is the possibility that the user
+                // navigates away from a page and back fast enough
+                // that the first "thread" is not dead, and a second
+                // one is started. greghaynes totally said he'd come
+                // up with a way to fix that.
+                if (window.zuul_enable_status_updates == false) {
+                    return;
+                }
+                var current = ci_current_change();
+                if (current && change_psnum.indexOf(current) != 0) {
+                    // window url is dead, so don't schedule any more future
+                    // updates for this url.
+                    return;
+                }
+                poll();
+            }, 15000),
+            timeout: 5000
+        });
+    })();
 };
 
+
 window.onload = function() {
     var input = document.createElement("input");
     input.id = "toggleci";
@@ -501,4 +537,14 @@ window.onload = function() {
         subtree: true,
         attributes: true
     });
+
+    $(document).on({
+        'show.visibility': function() {
+            window.zuul_enable_status_updates = true;
+            ci_page_loaded();
+        },
+        'hide.visibility': function() {
+            window.zuul_enable_status_updates = false;
+        }
+    });
 };