diff --git a/lib/progress.c b/lib/progress.c
index 8a8a78f0e79c2c6bc219e4d99c7b4e9b37fab003..79ba1b59ddb4eef7f31407be1f243f756ba4863f 100644
--- a/lib/progress.c
+++ b/lib/progress.c
@@ -124,14 +124,24 @@ void pgrsTime(struct UrlData *data, timerid timer)
   case TIMER_NONE:
     /* mistake filter */
     break;
+  case TIMER_STARTSINGLE:
+    /* This is set at the start of a single fetch, there may be several
+       fetches within an operation, why we add all other times relative
+       to this one */
+    data->progress.t_startsingle = tvnow();
+    break;
+
   case TIMER_NAMELOOKUP:
-    data->progress.t_nslookup = tvnow();
+    data->progress.t_nslookup += tvdiff(tvnow(),
+                                        data->progress.t_startsingle);
     break;
   case TIMER_CONNECT:
-    data->progress.t_connect = tvnow();
+    data->progress.t_connect += tvdiff(tvnow(),
+                                       data->progress.t_startsingle);
     break;
   case TIMER_PRETRANSFER:
-    data->progress.t_pretransfer = tvnow();
+    data->progress.t_pretransfer += tvdiff(tvnow(),
+                                           data->progress.t_startsingle);
     break;
   case TIMER_POSTRANSFER:
     /* this is the normal end-of-transfer thing */
diff --git a/lib/progress.h b/lib/progress.h
index a85b46df5988272b11357bc32812fef4c914a314..f289ff0e882c37363c7f78d798271e67c8ff2622 100644
--- a/lib/progress.h
+++ b/lib/progress.h
@@ -49,6 +49,7 @@ typedef enum {
   TIMER_CONNECT,
   TIMER_PRETRANSFER,
   TIMER_POSTRANSFER,
+  TIMER_STARTSINGLE,
   TIMER_LAST /* must be last */
 } timerid;