diff --git a/common/utils/T/tracer/view/time.c b/common/utils/T/tracer/view/time.c
index 9d6607b32b7f7e3368ffe953b9d116d6e3e361f4..efa0f61c5262f95d911580eaf3b80e147937bc75 100644
--- a/common/utils/T/tracer/view/time.c
+++ b/common/utils/T/tracer/view/time.c
@@ -97,6 +97,7 @@ static void *time_thread(void *_this)
   struct timespec tstart;
   struct timespec tnext;
   struct plot *p;
+  int64_t pixel_length;
 
   while (1) {
     if (pthread_mutex_lock(&this->lock)) abort();
@@ -106,14 +107,17 @@ static void *time_thread(void *_this)
 
     /* TODO: optimize/cleanup */
 
+    /* use rounded pixel_length */
+    pixel_length = this->pixel_length;
+
     tnext = time_add(this->latest_time,(struct timespec){tv_sec:0,tv_nsec:1});
-    tstart = time_sub(tnext, nano_to_time(this->pixel_length * width));
+    tstart = time_sub(tnext, nano_to_time(pixel_length * width));
 
     for (l = 0; l < this->subcount; l++) {
       for (i = 0; i < width; i++) {
         struct timespec tick_start, tick_end;
-        tick_start = time_add(tstart, nano_to_time(this->pixel_length * i));
-        tick_end = time_add(tick_start, nano_to_time(this->pixel_length-1));
+        tick_start = time_add(tstart, nano_to_time(pixel_length * i));
+        tick_end = time_add(tick_start, nano_to_time(pixel_length-1));
         /* look for a nano between tick_start and tick_end */
         /* TODO: optimize */
         for (t = 0; t < this->tsize; t++) {
@@ -131,7 +135,7 @@ static void *time_thread(void *_this)
             struct timespec nano =
                 (struct timespec){tv_sec:current_second,tv_nsec:p->nano[n]};
             if (time_cmp(tick_start, nano) <= 0 &&
-                time_cmp(nano, tick_end) < 0)
+                time_cmp(nano, tick_end) <= 0)
               goto gotit;
           }
         }
@@ -157,11 +161,15 @@ static void scroll(void *private, gui *g,
   struct time *this = private;
   double mul = 1.2;
   double pixel_length;
+  int64_t old_px_len_rounded;
 
   if (pthread_mutex_lock(&this->lock)) abort();
 
+  old_px_len_rounded = this->pixel_length;
+
   if (!strcmp(notification, "scrollup")) mul = 1 / mul;
 
+again:
   pixel_length = this->pixel_length * mul;
   if (pixel_length < 1) pixel_length = 1;
   if (pixel_length > (double)3600 * 1000000000)
@@ -169,6 +177,16 @@ static void scroll(void *private, gui *g,
 
   this->pixel_length = pixel_length;
 
+  /* due to rounding, we may need to zoom by more than 1.2 with
+   * very close lookup, otherwise the user zooming command won't
+   * be visible (say length is 2.7, zoom in, new length is 2.25,
+   * and rounding is 2, same value, no change, no feedback to user => bad)
+   * TODO: make all this cleaner
+   */
+  if (pixel_length != 1 && pixel_length != (double)3600 * 1000000000 &&
+      (int64_t)pixel_length == old_px_len_rounded)
+    goto again;
+
   if (pthread_mutex_unlock(&this->lock)) abort();
 }