diff --git a/lib/asyn-thread.c b/lib/asyn-thread.c
index bd47d5a..702a563 100644
--- a/lib/asyn-thread.c
+++ b/lib/asyn-thread.c
@@ -155,6 +155,7 @@ static bool init_resolve_thread(struct connectdata *conn,
 struct thread_sync_data {
   curl_mutex_t * mtx;
   int done;
+  int pipe[2];            /* To push updates to the parent */
 
   char * hostname;        /* hostname to resolve, Curl_async.hostname
                              duplicate */
@@ -291,6 +292,7 @@ static unsigned int CURL_STDCALL getaddrinfo_thread (void *arg)
   else {
     tsd->done = 1;
     Curl_mutex_release(tsd->mtx);
+    size_t ignore = write(tsd->pipe[1], "\n", 1);
   }
 
   return 0;
@@ -365,6 +367,12 @@ static void destroy_async_data (struct Curl_async *async)
 
   free(async->hostname);
   async->hostname = NULL;
+
+  if (async->pipe) {
+    close(async->pipe[0]);
+    close(async->pipe[1]);
+    async->pipe=NULL;
+  }
 }
 
 /*
diff --git a/lib/multi.c b/lib/multi.c
index 235b5b4..b72c50e 100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -842,6 +842,12 @@ CURLMcode curl_multi_wait(CURLM *multi_handle,
       }
     }
 
+#ifdef CURLRES_ASYNCH
+    if (data->easy_conn && data->easy_conn->async.pipe) {
+      ++nfds;
+    }
+#endif
+
     data = data->next; /* check next handle */
   }
 
@@ -884,6 +890,14 @@ CURLMcode curl_multi_wait(CURLM *multi_handle,
         }
       }
 
+#ifdef CURLRES_ASYNCH
+      if (data->easy_conn && data->easy_conn->async.pipe) {
+	ufds[nfds].fd = data->easy_conn->async.pipe[0];
+	ufds[nfds].events = POLLIN;
+	++nfds;
+      }
+#endif 
+
       data = data->next; /* check next handle */
     }
   }
diff --git a/lib/urldata.h b/lib/urldata.h
index b1b1a67..311b0bb 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -575,6 +575,7 @@ struct Curl_async {
   bool done;  /* set TRUE when the lookup is complete */
   int status; /* if done is TRUE, this is the status from the callback */
   void *os_specific;  /* 'struct thread_data' for Windows */
+  int *pipe;
 };
 #endif
 
