diff --git a/daemon/lua/kres.lua b/daemon/lua/kres.lua
index 8578b057b535fa7dfddff88824461f5639ca5562..216911975f5ca84f06aa948b6c281d2001415c32 100644
--- a/daemon/lua/kres.lua
+++ b/daemon/lua/kres.lua
@@ -454,7 +454,12 @@ ffi.metatype( knot_pkt_t, {
 			if ret ~= 0 then return nil, knot_strerror(ret) end
 			return true
 		end,
-		clear = function (pkt) return C.kr_pkt_recycle(pkt) end,
+		recycle = function (pkt)
+			assert(pkt ~= nil)
+			local ret = C.kr_pkt_recycle(pkt)
+			if ret ~= 0 then return nil, knot_strerror(ret) end
+			return true
+		end,
 		question = function(pkt, qname, qclass, qtype)
 			assert(pkt ~= nil)
 			assert(qclass ~= nil, string.format('invalid class: %s', qclass))
diff --git a/lib/README.rst b/lib/README.rst
index 0e844669a70883f043bdd02f988825b2b94ef251..267931bcaf16c97f809077977057f4cf98372abc 100644
--- a/lib/README.rst
+++ b/lib/README.rst
@@ -227,7 +227,7 @@ e.g. you can't write to ANSWER after writing AUTHORITY, it's like stages where y
 
 		pkt:rcode(kres.rcode.NXDOMAIN)
 		-- Clear answer and write QUESTION
-		pkt:clear()
+		pkt:recycle()
 		pkt:question('\7blocked', kres.class.IN, kres.type.SOA)
 		-- Start writing data
 		pkt:begin(kres.section.ANSWER)
diff --git a/modules/renumber/renumber.lua b/modules/renumber/renumber.lua
index a44f10111fdc0fd9f1ea282d0f6a354fcc919e12..457e06f4bc99c9a01fc8a7cf248f9da156dd331f 100644
--- a/modules/renumber/renumber.lua
+++ b/modules/renumber/renumber.lua
@@ -88,7 +88,7 @@ local function rule()
 		local qname = pkt:qname()
 		local qclass = pkt:qclass()
 		local qtype = pkt:qtype()
-		pkt:clear()
+		pkt:recycle()
 		pkt:question(qname, qclass, qtype)
 		for i = 1, ancount do
 			local rr = records[i]
diff --git a/tests/config/basic_test.lua b/tests/config/basic_test.lua
index df4fff71089ebb9cffb0c7661c91b982e7a79150..6dca8bcbbffbcc80bb6ec547805cf85c3ba23ab3 100644
--- a/tests/config/basic_test.lua
+++ b/tests/config/basic_test.lua
@@ -87,6 +87,11 @@ local function test_packet_functions()
 	same(parsed:id(), pkt:id(), 'parsed packet has same MSGID')
 	same(parsed:ancount(), pkt:ancount(), 'parsed packet has same answer count')
 	same(parsed:tostring(), pkt:tostring(), 'parsed packet is equal to source packet')
+	-- Test recycling of packets
+	ok(pkt:recycle(), 'recycle() works')
+	is(pkt:ancount(), 0, 'recycle() clears records')
+	is(pkt:qname(), nil, 'recycle() clears question')
+	is(#pkt:towire(), 12, 'recycle() clears the packet wireformat')
 end
 
 return {