diff --git a/src/libknot/packet/pkt.c b/src/libknot/packet/pkt.c
index d870260b64a3b6987ee1c60c195ba6a9239da695..fe8a5c46bce713c8879d562a4be6ec07031f9836 100644
--- a/src/libknot/packet/pkt.c
+++ b/src/libknot/packet/pkt.c
@@ -183,7 +183,8 @@ static int pkt_init(knot_pkt_t *pkt, void *wire, uint16_t len, knot_mm_t *mm)
 {
 	assert(pkt);
 
-	memset(pkt, 0, sizeof(knot_pkt_t));
+	memset(pkt, 0, offsetof(knot_pkt_t, lower_qname));
+	pkt->lower_qname[0] = '\0';
 
 	/* No data to free, set memory context. */
 	memcpy(&pkt->mm, mm, sizeof(knot_mm_t));
@@ -316,9 +317,8 @@ static void payload_clear(knot_pkt_t *pkt)
 	pkt->tsig_wire.pos = NULL;
 	pkt->tsig_wire.len = 0;
 
-	/* Free lowercased QNAME. */
-	mm_free(&pkt->mm, pkt->lower_qname);
-	pkt->lower_qname = NULL;
+	/* Initialize lowercased QNAME. */
+	pkt->lower_qname[0] = '\0';
 }
 
 _public_
@@ -358,12 +358,6 @@ int knot_pkt_init_response(knot_pkt_t *pkt, const knot_pkt_t *query)
 	/* Clear payload. */
 	payload_clear(pkt);
 
-	/* Allocate lower_qname field. */
-	pkt->lower_qname = mm_alloc(&pkt->mm, pkt->qname_size);
-	if (pkt->lower_qname == NULL) {
-		return KNOT_ENOMEM;
-	}
-
 	/* Copy QNAME and canonicalize to lowercase. */
 	memcpy(pkt->lower_qname,
 	       pkt->wire + KNOT_WIRE_HEADER_SIZE,
@@ -486,12 +480,6 @@ int knot_pkt_put_question(knot_pkt_t *pkt, const knot_dname_t *qname, uint16_t q
 	}
 	wire_ctx_skip(&wire, qname_len);
 
-	/* Allocate lower_qname field. */
-	pkt->lower_qname = mm_alloc(&pkt->mm, qname_len);
-	if (pkt->lower_qname == NULL) {
-		return KNOT_ENOMEM;
-	}
-
 	/* Copy QNAME and canonicalize to lowercase. */
 	memcpy(pkt->lower_qname, qname, qname_len);
 	knot_dname_to_lower(pkt->lower_qname);
@@ -630,12 +618,6 @@ int knot_pkt_parse_question(knot_pkt_t *pkt)
 	pkt->parsed += question_size;
 	pkt->qname_size = len;
 
-	/* Allocate lower_qname field. */
-	pkt->lower_qname = mm_alloc(&pkt->mm, pkt->qname_size);
-	if (pkt->lower_qname == NULL) {
-		return KNOT_ENOMEM;
-	}
-
 	/* Copy QNAME and canonicalize to lowercase. */
 	memcpy(pkt->lower_qname, pkt->wire + KNOT_WIRE_HEADER_SIZE, pkt->qname_size);
 	knot_dname_to_lower(pkt->lower_qname);
diff --git a/src/libknot/packet/pkt.h b/src/libknot/packet/pkt.h
index c1b56f01c1d179b639fe76e0f288c3d7ef47e74d..f5e218fc73fdbf66b540d73c20ec743428f5c66f 100644
--- a/src/libknot/packet/pkt.h
+++ b/src/libknot/packet/pkt.h
@@ -83,9 +83,6 @@ struct knot_pkt {
 	knot_rrset_t *opt_rr;   /*!< OPT RR included in the packet. */
 	knot_rrset_t *tsig_rr;  /*!< TSIG RR stored in the packet. */
 
-	/*! Lowercased QNAME. */
-	knot_dname_t *lower_qname;
-
 	/*! EDNS option positions in the wire (if parsed from wire). */
 	knot_edns_options_t *edns_opts;
 
@@ -107,6 +104,9 @@ struct knot_pkt {
 	knot_mm_t mm; /*!< Memory allocation context. */
 
 	knot_compr_t compr; /*!< Compression context. */
+
+	/*! Lowercased QNAME. MUST BE LAST ITEM! */
+	knot_dname_storage_t lower_qname;
 };
 
 /*!