diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c
index 6cd462932a1d4243771378b6a1aca9ea858b73d0..b1de024168bf22770358addc638d5fa0f4cb6be7 100644
--- a/src/or/circuitbuild.c
+++ b/src/or/circuitbuild.c
@@ -706,18 +706,24 @@ circuit_build_times_network_circ_success(circuit_build_times_t *cbt)
  * at all, but this circuit was launched back when we thought the network
  * was live, increment the number of "nonlive" circuit timeouts.
  *
- * Also distinguish between whether it failed before the first hop.
+ * Also distinguish between whether it failed before the first hop
+ * and record that in our history for later deciding if the network has
+ * changed.
  */
 static void
 circuit_build_times_network_timeout(circuit_build_times_t *cbt,
                                     int did_onehop, time_t start_time)
 {
-  time_t now = approx_time();
-  /* Only count this as a valid attempt if it was both started before
-   * the network was dead and the network has been dead for at least
-   * a full timeout interval. */
-  if (cbt->liveness.network_last_live <= (now - cbt->timeout_ms/1000.0)
-          && cbt->liveness.network_last_live <= start_time) {
+  time_t now = time(NULL);
+  /*
+   * Check if this is a timeout that was for a circuit that spent its
+   * entire existence during a time where we have had no network activity.
+   *
+   * Also double check that it is a valid timeout after we have possibly
+   * just recently reset cbt->timeout_ms.
+   */
+  if (cbt->liveness.network_last_live <= start_time &&
+          start_time <= (now - cbt->timeout_ms/1000.0)) {
     cbt->liveness.nonlive_timeouts++;
   }
 
diff --git a/src/or/test.c b/src/or/test.c
index c2e34013b3d6406bec08f89ac93e72a8296b9ea2..27ecc4757ee9cd124689f5db552e5043a00ee544 100644
--- a/src/or/test.c
+++ b/src/or/test.c
@@ -3525,11 +3525,13 @@ test_circuit_timeout(void)
     test_assert(!circuit_build_times_network_check_live(&final));
 
     for ( ; i < NETWORK_NONLIVE_DISCARD_COUNT; i++) {
-      if (circuit_build_times_add_timeout(&estimate, 0, approx_time()))
+      if (circuit_build_times_add_timeout(&estimate, 0,
+                  approx_time()-estimate.timeout_ms/1000.0-1))
         estimate.have_computed_timeout = 1;
 
       if (i < NETWORK_NONLIVE_DISCARD_COUNT-1) {
-        if (circuit_build_times_add_timeout(&final, 0, approx_time()))
+        if (circuit_build_times_add_timeout(&final, 0,
+                  approx_time()-final.timeout_ms/1000.0-1))
           final.have_computed_timeout = 1;
       }
     }