diff --git a/lib/asyn-thread.c b/lib/asyn-thread.c
index 55e0811c5..89ef82237 100644
--- a/lib/asyn-thread.c
+++ b/lib/asyn-thread.c
@@ -79,6 +79,8 @@
 #include "curl_memory.h"
 #include "memdebug.h"
 
+#define INVALID_SOCKET (-1)
+
 struct resdata {
   struct curltime start;
 };
@@ -163,6 +165,9 @@ struct thread_sync_data {
   char *hostname;        /* hostname to resolve, Curl_async.hostname
                             duplicate */
   int port;
+#ifdef HAVE_SOCKETPAIR
+  int sock_pair[2]; /* socket pair */
+#endif
   int sock_error;
   Curl_addrinfo *res;
 #ifdef HAVE_GETADDRINFO
@@ -197,6 +202,16 @@ void destroy_thread_sync_data(struct thread_sync_data * tsd)
   if(tsd->res)
     Curl_freeaddrinfo(tsd->res);
 
+#ifdef HAVE_SOCKETPAIR
+  /* close socket pair */
+  if (tsd->sock_pair[0] != INVALID_SOCKET) {
+    close(tsd->sock_pair[0]);
+  }
+
+  if (tsd->sock_pair[1] != INVALID_SOCKET) {
+    close(tsd->sock_pair[1]);
+  }
+#endif
   memset(tsd, 0, sizeof(*tsd));
 }
 
@@ -230,6 +245,14 @@ int init_thread_sync_data(struct thread_data * td,
 
   Curl_mutex_init(tsd->mtx);
 
+#ifdef HAVE_SOCKETPAIR
+  /* create socket pair */
+  if (socketpair(AF_LOCAL , SOCK_STREAM, 0, &tsd->sock_pair[0]) < 0) {
+      tsd->sock_pair[0] = INVALID_SOCKET;
+      tsd->sock_pair[1] = INVALID_SOCKET;
+      goto err_exit;
+  }
+#endif
   tsd->sock_error = CURL_ASYNC_SUCCESS;
 
   /* Copying hostname string because original can be destroyed by parent
@@ -276,6 +299,7 @@ static unsigned int CURL_STDCALL getaddrinfo_thread(void *arg)
   struct thread_data *td = tsd->td;
   char service[12];
   int rc;
+  int buf[1] = {1};
 
   msnprintf(service, sizeof(service), "%d", tsd->port);
 
@@ -299,6 +323,13 @@ static unsigned int CURL_STDCALL getaddrinfo_thread(void *arg)
   }
   else {
     tsd->done = 1;
+#ifdef HAVE_SOCKETPAIR
+    if (tsd->sock_pair[1] != INVALID_SOCKET) {
+    /* DNS has been resolved, signal client task */
+      write(tsd->sock_pair[1],  buf, sizeof(buf));
+    }
+#endif
+    tsd->done = 1;
     Curl_mutex_release(tsd->mtx);
   }
 
@@ -595,23 +626,38 @@ int Curl_resolver_getsock(struct connectdata *conn,
                           curl_socket_t *socks,
                           int numsocks)
 {
+  int ret_val = 0;
   time_t milli;
   timediff_t ms;
   struct Curl_easy *data = conn->data;
   struct resdata *reslv = (struct resdata *)data->state.resolver;
-  (void)socks;
-  (void)numsocks;
-  ms = Curl_timediff(Curl_now(), reslv->start);
-  if(ms < 3)
-    milli = 0;
-  else if(ms <= 50)
-    milli = ms/3;
-  else if(ms <= 250)
-    milli = 50;
-  else
-    milli = 200;
-  Curl_expire(data, milli, EXPIRE_ASYNC_NAME);
-  return 0;
+  struct thread_data *td = (struct thread_data*)conn->async.os_specific;
+
+#ifdef HAVE_SOCKETPAIR
+  memset(socks, INVALID_SOCKET, sizeof(curl_socket_t) * numsocks);
+  if (td != NULL) {
+    /* return read fd to client for polling the DNS resolution status */
+    socks[0] = td->tsd.sock_pair[0];
+    ret_val = 1;
+  }
+  else {
+#endif
+    ms = Curl_timediff(Curl_now(), reslv->start);
+    if(ms < 3)
+      milli = 0;
+    else if(ms <= 50)
+      milli = ms/3;
+    else if(ms <= 250)
+      milli = 50;
+    else
+      milli = 200;
+    Curl_expire(data, milli, EXPIRE_ASYNC_NAME);
+#ifdef HAVE_SOCKETPAIR
+  }
+#dndif
+
+
+  return (ret_val);
 }
 
 #ifndef HAVE_GETADDRINFO
diff --git a/lib/multi.c b/lib/multi.c
index 2b6b1bc52..d360384cd 100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -1392,14 +1392,19 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
       }
 
       if(!result) {
-        if(async)
-          /* We're now waiting for an asynchronous name lookup */
-          multistate(data, CURLM_STATE_WAITRESOLVE);
-        else {
-          /* after the connect has been sent off, go WAITCONNECT unless the
-             protocol connect is already done and we can go directly to
-             WAITDO or DO! */
-          rc = CURLM_CALL_MULTI_PERFORM;
+          if(async) {
+            /* We're now waiting for an asynchronous name lookup */
+            multistate(data, CURLM_STATE_WAITRESOLVE);
+#ifdef HAVE_SOCKETPAIR
+            /* return CURLM_CALL_MULTI_PERFORM so that client can query read socket fd for polling */
+            rc = CURLM_CALL_MULTI_PERFORM;
+#endif
+          }
+          else {
+            /* after the connect has been sent off, go WAITCONNECT unless the
+               protocol connect is already done and we can go directly to
+               WAITDO or DO! */
+            rc = CURLM_CALL_MULTI_PERFORM;
 
           if(protocol_connect)
             multistate(data, CURLM_STATE_DO);
