diff --git a/src/knot/server/udp-handler.c b/src/knot/server/udp-handler.c
index bb7a5b387f8a2e2c27cb4317a30f07f564503073..22bae78909fd83ac7e06bb4a84d9ea4ed52ee536 100644
--- a/src/knot/server/udp-handler.c
+++ b/src/knot/server/udp-handler.c
@@ -143,6 +143,9 @@ int udp_handle(ns_proc_context_t *query_ctx, int fd, sockaddr_t *addr,
 	        strfrom, sockaddr_portnum(addr));
 #endif
 
+	/* Create query processing context. */
+	ns_proc_begin(query_ctx, NS_PROC_QUERY);
+
 	/* Input packet. */
 	uint16_t tx_len = tx->iov_len;
 	int state = ns_proc_in(rx->iov_base, rx->iov_len, query_ctx);
@@ -165,7 +168,7 @@ int udp_handle(ns_proc_context_t *query_ctx, int fd, sockaddr_t *addr,
 	}
 
 	/* Reset context. */
-	ns_proc_reset(query_ctx);
+	ns_proc_finish(query_ctx);
 
 	return KNOT_EOK;
 
@@ -507,9 +510,6 @@ int udp_reader(iohandler_t *h, dthread_t *thread)
 	query_ctx.flags |= NS_QUERY_NO_AXFR;
 	query_ctx.flags |= NS_QUERY_NO_IXFR;
 
-	/* Create query processing context. */
-	ns_proc_begin(&query_ctx, NS_PROC_QUERY);
-
 	/* Chose select as epoll/kqueue has larger overhead for a
 	 * single or handful of sockets. */
 	fd_set fds;
@@ -571,9 +571,6 @@ int udp_reader(iohandler_t *h, dthread_t *thread)
 		}
 	}
 
-	/* Close query processing context. */
-	ns_proc_finish(&query_ctx);
-
 	_udp_deinit(rq);
 	ref_release((ref_t *)ref);
 	mp_delete(query_ctx.mm.ctx);