diff --git a/dns.c b/dns.c
index 5076657..347fbdc 100644
--- a/dns.c
+++ b/dns.c
@@ -46,9 +46,6 @@ uint16_t chunkid;
 
 uint16_t pingid;
 
-int outid;
-int outbuflen;
-char outbuf[64*1024];
 char delayed_q_name[256];
 short delayed_q_type;
 short delayed_q_id;
@@ -425,12 +422,6 @@ host2dns(const char *host, char *buffer, int size)
 	return p - buffer;
 }
 
-int
-dnsd_haspacket()
-{
-	return (outbuflen > 0);
-}
-
 int
 dnsd_hasack()
 {
@@ -438,16 +429,7 @@ dnsd_hasack()
 }
 
 void
-dnsd_queuepacket(const char *buf, const int buflen)
-{
-	memcpy(outbuf, buf, buflen);	
-
-	outbuflen = buflen;
-	outid++;
-}
-
-static void
-dnsd_send(int fd, char *name, short type, short id, struct sockaddr_in from)
+dnsd_send(int fd, char *data, int datalen)
 {
 	int len;
 	char *p;
@@ -459,7 +441,7 @@ dnsd_send(int fd, char *name, short type, short id, struct sockaddr_in from)
 	len = 0;
 	header = (HEADER*)buf;	
 
-	header->id = htons(id);
+	header->id = htons(delayed_q_id);
 	header->qr = 1;
 	header->opcode = 0;
 	header->aa = 1;
@@ -472,35 +454,27 @@ dnsd_send(int fd, char *name, short type, short id, struct sockaddr_in from)
 
 	p = buf + sizeof(HEADER);
 	
-	p += host2dns(name, p, strlen(name));
-	PUTSHORT(type, p);
+	p += host2dns(delayed_q_name, p, strlen(delayed_q_name));
+	PUTSHORT(delayed_q_type, p);
 	PUTSHORT(C_IN, p);
 	
-	p += host2dns(name, p, strlen(name));	
-	PUTSHORT(type, p);
+	p += host2dns(delayed_q_name, p, strlen(delayed_q_name));	
+	PUTSHORT(delayed_q_type, p);
 	PUTSHORT(C_IN, p);
 	PUTLONG(0, p);
 
-	if(outbuflen > 0) {
-		PUTSHORT(outbuflen, p);
-		memcpy(p, outbuf, outbuflen);
-		p += outbuflen;
+	delayed_q_id = 0;
+
+	if(datalen > 0) {
+		PUTSHORT(datalen, p);
+		memcpy(p, data, datalen);
+		p += datalen;
 	} else {
 		PUTSHORT(0, p);
 	}
 
 	len = p - buf;
-//	printf("Responding with %d\n", len);
-	sendto(fd, buf, len, 0, (struct sockaddr*)&from, sizeof(from));
-
-	outbuflen = 0;
-}
-
-void
-dnsd_forceack(int fd)
-{
-	dnsd_send(fd, delayed_q_name, delayed_q_type, delayed_q_id, delayed_q_from);
-	delayed_q_id = 0;
+	sendto(fd, buf, len, 0, (struct sockaddr*)&delayed_q_from, delayed_q_fromlen);
 }
 
 static int
@@ -579,16 +553,12 @@ dnsd_read(int fd, char *buf, int buflen)
 				READSHORT(type, data);
 				READSHORT(class, data);
 
-				if (dnsd_haspacket()) {
-					dnsd_send(fd, name, type, id, from);
-				} else {
-					// Store needed info about delayed response
-					strncpy(delayed_q_name, name, 256);
-					delayed_q_type = type;
-					delayed_q_id = id;
-					delayed_q_fromlen = addrlen;
-					memcpy((struct sockaddr*)&delayed_q_from, (struct sockaddr*)&from, addrlen);
-				}
+				// Store needed info about delayed response
+				strncpy(delayed_q_name, name, 256);
+				delayed_q_type = type;
+				delayed_q_id = id;
+				delayed_q_fromlen = addrlen;
+				memcpy((struct sockaddr*)&delayed_q_from, (struct sockaddr*)&from, addrlen);
 
 				return decodepacket(name, buf, buflen);
 			}
diff --git a/dns.h b/dns.h
index 16b58cb..a3db832 100644
--- a/dns.h
+++ b/dns.h
@@ -35,6 +35,7 @@ int open_dnsd(const char *);
 void close_dnsd(int);
 
 int dnsd_read(int, char *, int);
+void dnsd_send(int, char *, int);
 
 int dnsd_haspacket();
 int dnsd_hasack();
diff --git a/iodined.c b/iodined.c
index 63bbf0e..2899056 100644
--- a/iodined.c
+++ b/iodined.c
@@ -45,6 +45,8 @@ struct packet
 };
 
 struct packet packetbuf;
+struct packet outpacket;
+int outid;
 
 static void
 sigint(int sig) {
@@ -66,14 +68,14 @@ tunnel(int tun_fd, int dns_fd)
 	while (running) {
 		if (dnsd_hasack()) {
 			tv.tv_sec = 0;
-			tv.tv_usec = 50000;
+			tv.tv_usec = 5000;
 		} else {
 			tv.tv_sec = 1;
 			tv.tv_usec = 0;
 		}
 
 		FD_ZERO(&fds);
-		if(!dnsd_haspacket()) 
+		if(outpacket.len == 0)
 			FD_SET(tun_fd, &fds);
 		FD_SET(dns_fd, &fds);
 
@@ -87,7 +89,8 @@ tunnel(int tun_fd, int dns_fd)
 	
 		if (i==0) {	
 			if (dnsd_hasack()) 
-				dnsd_forceack(dns_fd);
+				dnsd_send(dns_fd, outpacket.data, outpacket.len);
+				outpacket.len = 0;
 		} else {
 			if(FD_ISSET(tun_fd, &fds)) {
 				read = read_tun(tun_fd, in, sizeof(in));
@@ -96,7 +99,8 @@ tunnel(int tun_fd, int dns_fd)
 				
 				outlen = sizeof(out);
 				compress2(out, &outlen, in, read, 9);
-				dnsd_queuepacket(out, outlen);
+				memcpy(outpacket.data, out, outlen);
+				outpacket.len = outlen;
 			}
 			if(FD_ISSET(dns_fd, &fds)) {
 				read = dnsd_read(dns_fd, in, sizeof(in));
@@ -105,7 +109,7 @@ tunnel(int tun_fd, int dns_fd)
 
 				if(in[0] == 'H' || in[0] == 'h') {
 					read = snprintf(out, sizeof(out), "%s-%d", "172.30.5.2", 1023);
-					dnsd_queuepacket(out, read);
+					dnsd_send(dns_fd, out, read);
 				} else if((in[0] >= '0' && in[0] <= '9')
 						|| (in[0] >= 'a' && in[0] <= 'f')
 						|| (in[0] >= 'A' && in[0] <= 'F')) {
@@ -128,6 +132,10 @@ tunnel(int tun_fd, int dns_fd)
 
 						packetbuf.len = packetbuf.offset = 0;
 					}
+					if (outpacket.len > 0) {
+						dnsd_send(dns_fd, outpacket.data, outpacket.len);
+						outpacket.len = 0;
+					}
 				}
 			} 
 		}
@@ -185,6 +193,7 @@ main(int argc, char **argv)
 
 	packetbuf.len = 0;
 	packetbuf.offset = 0;
+	outpacket.len = 0;
 	
 	while ((choice = getopt(argc, argv, "vfhu:t:m:")) != -1) {
 		switch(choice) {