diff --git a/lib/multi.c b/lib/multi.c
index e857392..875e136 100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -1594,6 +1594,8 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
       /* Important: reset the conn pointer so that we don't point to memory
          that could be freed anytime */
       easy->easy_conn = NULL;
+
+      Curl_expire(data, 0); /* stop all timers */
       break;
 
     case CURLM_STATE_MSGSENT:
diff --git a/lib/url.c b/lib/url.c
index 7fe713d..1b65a92 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -481,6 +481,8 @@ CURLcode Curl_close(struct SessionHandle *data)
   }
 #endif
 
+  Curl_expire(data, 0); /* shut off timers */
+
   if(m)
     /* This handle is still part of a multi handle, take care of this first
        and detach this handle from there. */
@@ -2579,7 +2581,6 @@ CURLcode Curl_disconnect(struct connectdata *conn)
                   NULL, Curl_scan_cache_used);
 #endif
 
-  Curl_expire(data, 0); /* shut off timers */
   Curl_hostcache_prune(data); /* kill old DNS cache entries */
 
   {
@@ -5131,8 +5132,6 @@ CURLcode Curl_done(struct connectdata **connp,
   conn = *connp;
   data = conn->data;
 
-  Curl_expire(data, 0); /* stop timer */
-
   if(conn->bits.done)
     /* Stop if Curl_done() has already been called */
     return CURLE_OK;
