diff --git a/modules/policy/policy.lua b/modules/policy/policy.lua
index 23cba3dfcfe7e8618dc790ba8b019e24d7b60d5e..c04d4f788c6e75224a54af0d02ca66efaf8329f0 100644
--- a/modules/policy/policy.lua
+++ b/modules/policy/policy.lua
@@ -209,6 +209,22 @@ function policy.FLAGS(opts_set, opts_clear)
 	end
 end
 
+-- Create answer with passed arguments
+function policy.ANSWER(rtype, rdata, ttl)
+	return function(_, req)
+		local qry = req:current()
+		local answer = req.answer
+		ffi.C.kr_pkt_make_auth_header(answer)
+
+		if (rtype == qry.stype) then
+			answer:rcode(kres.rcode.NOERROR)
+			answer:begin(kres.section.ANSWER)
+			answer:put(qry.sname, ttl, qry.sclass, rtype, rdata)
+			return kres.DONE
+		end
+	end
+end
+
 local function mkauth_soa(answer, dname, mname)
 	if mname == nil then
 		mname = dname