diff --git a/exec/load/dns.js b/exec/load/dns.js
index a34814113bb9348eadcaa1c6343c394b29a40941..4d07df90ec1a73d04f15309a5bcf102fff8ec5b8 100644
--- a/exec/load/dns.js
+++ b/exec/load/dns.js
@@ -587,12 +587,26 @@ DNS.prototype.synchronous_query = function(queries, callback, thisObj, recursive
 		return ret;
 };
 
-DNS.prototype.resolve = function(host, callback, thisObj)
+DNS.prototype.resolveIPv4 = function(host, callback, thisObj) {
+	this.resolveProcess(host, callback, [{query:host, type:'A'}], thisObj);
+}
+
+DNS.prototype.resolveIPv6 = function(host, callback, thisObj) {
+	this.resolveProcess(host, callback, [{query:host, type:'AAAA'}], thisObj);
+}
+
+DNS.prototype.resolve = function(host, callback, thisObj) {
+	this.resolveProcess(host, callback, [{query:host, type:'AAAA'},{query:host, type:'A'}], thisObj);
+}
+
+DNS.prototype.resolveProcess = function(host, callback, dnstype, thisObj)
 {
 	var ctx = {A:{}, AAAA:{}, unique_id:'DNS.prototype.resolve'};
 	var final;
 	var respA;
 	var respAAAA;
+	var queries;
+	var queries_done;
 
 	this.sockets.forEach(function(sock) {
 		ctx.unique_id += '.'+sock.local_port;
@@ -612,12 +626,16 @@ DNS.prototype.resolve = function(host, callback, thisObj)
 
 	ctx.final_callback = function() {
 		this.ret = [];
-		this.AAAA.addrs.forEach(function(addr) {
-			this.ret.push(addr);
-		}, this);
-		this.A.addrs.forEach(function(addr) {
-			this.ret.push(addr);
-		}, this);
+		if (this.AAAA.addrs !== undefined) {
+			this.AAAA.addrs.forEach(function(addr) {
+				this.ret.push(addr);
+			}, this);
+		}
+		if (this.A.addrs !== undefined) {
+			this.A.addrs.forEach(function(addr) {
+				this.ret.push(addr);
+			}, this);
+		}
 		if (this.callback !== undefined) {
 			js.removeEventListener(this.final);
 			js.removeEventListener(this.respA);
@@ -629,8 +647,8 @@ DNS.prototype.resolve = function(host, callback, thisObj)
 		ctx.final = js.addEventListener(ctx.unique_id+'.final', ctx.final_callback);
 
 	ctx.respA_callback = function() {
-		this.A.done = true;
-		if (this.AAAA.done) {
+		this.queries_done++;
+		if (this.queries_done >= this.queries) {
 			if (this.final !== undefined)
 				js.dispatchEvent(this.unique_id + '.final', this);
 			else
@@ -641,8 +659,8 @@ DNS.prototype.resolve = function(host, callback, thisObj)
 		ctx.respA = js.addEventListener(ctx.unique_id+'.respA', ctx.respA_callback);
 
 	ctx.respAAAA_callback = function() {
-		this.AAAA.done = true;
-		if (this.A.done) {
+		this.queries_done++;
+		if (this.queries_done >= this.queries) {
 			if (this.final !== undefined)
 				js.dispatchEvent(this.unique_id + '.final', this);
 			else
@@ -684,7 +702,10 @@ DNS.prototype.resolve = function(host, callback, thisObj)
 			this['resp'+rectype+'_callback']();
 	}
 
-	this.query([{query:host, type:'AAAA'},{query:host, type:'A'}], handle_response, ctx);
+	ctx.queries = dnstype.length;
+	ctx.queries_done = 0;
+
+	this.query(dnstype, handle_response, ctx);
 	return ctx.ret;
 };