diff --git a/lib/modules/Protocols.pmod/DNS.pmod b/lib/modules/Protocols.pmod/DNS.pmod
index 86bcd9f1292c3744e6bd796c96104890a892e623..48faa23520906f0d92ef2ee3c49b26fbf18d87b0 100644
--- a/lib/modules/Protocols.pmod/DNS.pmod
+++ b/lib/modules/Protocols.pmod/DNS.pmod
@@ -477,13 +477,8 @@ class async_client
 {
   inherit client;
   inherit spider.dumUDP : udp;
-  int id;
   async_client next_client;
 
-#if constant(thread_create)
-  static private inherit Thread.Mutex : lock;
-#endif /* constant(thread_create) */
-
   class Request
   {
     string req;
@@ -526,68 +521,34 @@ class async_client
 		function(string,mapping,mixed...:void) callback,
 		mixed ... args)
   {
-    int lid;
-#if constant(thread_create)
-    object key=lock::lock();
-#endif /* constant(thread_create) */
-    for(int e=next_client ? 5 : 1024;e>=0;e--)
+    for(int e=next_client ? 5 : 256;e>=0;e--)
     {
-      id++;
-      id&=65535;
-      lid=id;
-      
-      if(requests[lid])
+      int lid = random(65536);
+      if(!catch { requests[lid]++; })
       {
-	if(time() - requests[lid]->timestamp > GIVE_UP_DELAY)
-	{
-#if constant(thread_create)
-	  // We need to unlock the lock for the remove operation...
-	  destruct(key);
-#endif /* constant(thread_create) */
-	  remove(requests[lid]);
-#if constant(thread_create)
-	  key=lock::lock();
-#endif /* constant(thread_create) */
-	  if(requests[lid]) continue;	/* Another thread has stolen lid */
-	}else{
-	  continue;
-	}
-      }
-      break;
-    }
-
-    if(requests[lid])
-    {
-      /* We failed miserably to find a request id to use,
-       * so we create a second UDP port to be able to have more 
-       * requests 'in the air'. /Hubbe
-       */
-      if(!next_client)
-      {
-	next_client=async_client(nameservers,domains);
-	next_client->nameservers=nameservers;
-	next_client->domains=domains;
+	string req=low_mkquery(lid,domain,cl,type);
+	
+	object r=Request();
+	r->req=req;
+	r->domain=domain;
+	r->callback=callback;
+	r->args=args;
+	r->timestamp=time();
+	requests[lid]=r;
+	udp::send(nameservers[0],53,r->req);
+	call_out(retry,RETRY_DELAY,r,1);
+	return;
       }
-
-#if constant(thread_create)
-      key=0;
-#endif /* constant(thread_create) */
-
-      next_client->do_query(domain, cl, type, callback, @args);
-      return;
     }
-
-    string req=low_mkquery(lid,domain,cl,type);
-
-    object r=Request();
-    r->req=req;
-    r->domain=domain;
-    r->callback=callback;
-    r->args=args;
-    r->timestamp=time();
-    requests[lid]=r;
-    udp::send(nameservers[0],53,r->req);
-    call_out(retry,RETRY_DELAY,r,1);
+    
+    /* We failed miserably to find a request id to use,
+     * so we create a second UDP port to be able to have more 
+     * requests 'in the air'. /Hubbe
+     */
+    if(!next_client)
+      next_client=async_client(nameservers,domains);
+    
+    next_client->do_query(domain, cl, type, callback, @args);
   }
 
   static private void rec_data()