diff --git a/adns.c b/adns.c
index f3ae4b3237383cb4149fc3e3ca7757e9555317e3..2159af34feaa09eaec894173088dfd475aa86be4 100644
--- a/adns.c
+++ b/adns.c
@@ -70,13 +70,41 @@ void oop_adns_delete(oop_adapter_adns *a) {
 }
 
 oop_adns_query *oop_adns_submit(
-	oop_adapter_adns *a,
+	oop_adapter_adns *a,int *errcode,
 	const char *owner,adns_rrtype type,adns_queryflags flags,
 	oop_adns_call *call,void *data)
 {
 	oop_adns_query *q = oop_malloc(sizeof(*q));
+	int err;
 	if (NULL == q) return NULL;
-	if (adns_submit(a->state,owner,type,flags,q,&q->query)) {
+
+	err = adns_submit(a->state,owner,type,flags,q,&q->query);
+	if (errcode) *errcode = err;
+	if (err) {
+		oop_free(q);
+		return NULL;
+	}
+
+	q->a = a;
+	q->call = call;
+	q->data = data;
+	++q->a->count;
+	set_select(a);
+	return q;
+}
+
+oop_adns_query *oop_adns_submit_reverse(
+	oop_adapter_adns *a,int *errcode,
+	const struct sockaddr *addr,adns_rrtype type,adns_queryflags flags,
+	oop_adns_call *call,void *data)
+{
+	oop_adns_query *q = oop_malloc(sizeof(*q));
+	int err;
+	if (NULL == q) return NULL;
+
+	err = adns_submit_reverse(a->state,addr,type,flags,q,&q->query)));
+	if (errcode) *errcode = err;
+	if (err) {
 		oop_free(q);
 		return NULL;
 	}
diff --git a/oop-adns.h b/oop-adns.h
index 030875b0774622a33fab4f6fc856d4b7dfb49804..5016a6d3e654c3e8dfd794a2f53b29fb9749a47e 100644
--- a/oop-adns.h
+++ b/oop-adns.h
@@ -26,10 +26,15 @@ void oop_adns_delete(oop_adapter_adns *);
    The returned pointer is valid until the callback occurs or the
    query is cancelled (see below). */
 oop_adns_query *oop_adns_submit(
-	oop_adapter_adns *,
+	oop_adapter_adns *,int *errcode,
 	const char *owner,adns_rrtype type,adns_queryflags flags,
 	oop_adns_call *,void *);
 
+oop_adns_query *oop_adns_submit_reverse(
+	oop_adapter_adns *,int *errcode,
+	const struct sockaddr *addr,adns_rrtype type,adns_queryflags flags,
+	oop_adns_call *,void *);
+
 /* Cancel a running query. */
 void oop_adns_cancel(oop_adns_query *);
 
diff --git a/test-oop.c b/test-oop.c
index c909a91d82cc47b5634dc71e23a5ec58b9df48a7..c1f5281fe3b4306aa2bbdb47d1ed3e0537982b56 100644
--- a/test-oop.c
+++ b/test-oop.c
@@ -251,7 +251,7 @@ static void *on_lookup(oop_adapter_adns *adns,adns_answer *reply,void *data) {
 
 static void get_name(int i,const char *name) {
 	q[i] = oop_adns_submit(
-	       adns,name,adns_r_a,adns_qf_owner,
+	       adns,NULL,name,adns_r_a,adns_qf_owner,
 	       on_lookup,&q[i]);
 }