diff --git a/lib/modules/Protocols.pmod/DNS.pmod b/lib/modules/Protocols.pmod/DNS.pmod
index 6b44adff9e08ffde1b297c1741d0ff5d4039d00e..ffa0b52f26c5136d4c63220eb73fb368d4195402 100644
--- a/lib/modules/Protocols.pmod/DNS.pmod
+++ b/lib/modules/Protocols.pmod/DNS.pmod
@@ -436,6 +436,10 @@ class async_client
   inherit spider.dumUDP : udp;
   int id;
 
+#if constant(thread_create)
+  object lock = Thread.Mutex();
+#endif /* constant(thread_create) */
+
   class Request
   {
     string req;
@@ -478,18 +482,28 @@ class async_client
 		function(string,mapping,mixed...:void) callback,
 		mixed ... args)
   {
+#if constant(thread_create)
+    object key = lock->lock();
+#endif /* constant(thread_create) */
     id++;
     id&=65535;
-    string req=low_mkquery(id,domain,cl,type);
+    int lid = id;
+
+#if constant(thread_create)
+    key = 0;
+#endif /* constant(thread_create) */
 
-    if(requests[id])
+    if(requests[lid])
       throw(({"Cannot find an empty request slot.\n",backtrace()}));
+
+    string req=low_mkquery(lid,domain,cl,type);
+
     object r=Request();
     r->req=req;
     r->domain=domain;
     r->callback=callback;
     r->args=args;
-    requests[id]=r;
+    requests[lid]=r;
     udp::send(nameservers[0],53,r->req);
     call_out(retry,5,r,1);
   }