diff --git a/src/knot/include/module.h b/src/knot/include/module.h
index ed5a06cd6204a359578cf27b59e7b9d9ae803d93..5f888997ce1e3ca4dc23abbe268287038b33ef9b 100644
--- a/src/knot/include/module.h
+++ b/src/knot/include/module.h
@@ -465,6 +465,15 @@ const knot_dname_t *knotd_qdata_zone_name(knotd_qdata_t *qdata);
  */
 knot_rrset_t knotd_qdata_zone_apex_rrset(knotd_qdata_t *qdata, uint16_t type);
 
+/*!
+ * Gets the original QNAME of the query, before downcasing.
+ *
+ * \param[in] qdata  Query data.
+ *
+ * \return Original QNAME or NULL if error.
+ */
+const knot_dname_t *knotd_qdata_orig_qname(knotd_qdata_t *qdata);
+
 /*! General query processing states. */
 typedef enum {
 	KNOTD_STATE_NOOP  = 0, /*!< No response. */
diff --git a/src/knot/modules/dnstap/dnstap.c b/src/knot/modules/dnstap/dnstap.c
index eef68bd3d35e7be0947eb9cebddbd66edaef9e08..60a4eb6cacaaaf9c9e54e59ee04cfd89de2530a8 100644
--- a/src/knot/modules/dnstap/dnstap.c
+++ b/src/knot/modules/dnstap/dnstap.c
@@ -61,6 +61,30 @@ typedef struct {
 	bool with_queries;
 } dnstap_ctx_t;
 
+static void msg_query_qname_restore(Dnstap__Message *msg, knotd_qdata_t *qdata)
+{
+	if (msg->query_message.data == NULL) {
+		return;
+	}
+
+	const knot_dname_t *orig_qname = knotd_qdata_orig_qname(qdata);
+	if (orig_qname == NULL) {
+		return;
+	}
+
+	memcpy(msg->query_message.data + KNOT_WIRE_HEADER_SIZE,
+	       orig_qname, qdata->query->qname_size);
+}
+
+static void msg_query_qname_case_lower(Dnstap__Message *msg)
+{
+	if (msg->query_message.data == NULL) {
+		return;
+	}
+
+	knot_dname_to_lower(msg->query_message.data + KNOT_WIRE_HEADER_SIZE);
+}
+
 static knotd_state_t log_message(knotd_state_t state, const knot_pkt_t *pkt,
                                  knotd_qdata_t *qdata, knotd_mod_t *mod)
 {
@@ -132,7 +156,9 @@ static knotd_state_t log_message(knotd_state_t state, const knot_pkt_t *pkt,
 	/* Pack the message. */
 	uint8_t *frame = NULL;
 	size_t size = 0;
+	msg_query_qname_restore(&msg, qdata);
 	dt_pack(&dnstap, &frame, &size);
+	msg_query_qname_case_lower(&msg);
 	if (frame == NULL) {
 		return state;
 	}
diff --git a/src/knot/nameserver/query_module.c b/src/knot/nameserver/query_module.c
index 0effefe524004a462340c2aabdcd742a9fe47e9d..976b0576d22869108d852854b664ae333c7e8709 100644
--- a/src/knot/nameserver/query_module.c
+++ b/src/knot/nameserver/query_module.c
@@ -681,6 +681,16 @@ knot_rrset_t knotd_qdata_zone_apex_rrset(knotd_qdata_t *qdata, uint16_t type)
 	return node_rrset(qdata->extra->contents->apex, type);
 }
 
+_public_
+const knot_dname_t *knotd_qdata_orig_qname(knotd_qdata_t *qdata)
+{
+	if (qdata == NULL) {
+		return NULL;
+	}
+
+	return qdata->extra->orig_qname;
+}
+
 _public_
 int knotd_mod_dnssec_init(knotd_mod_t *mod)
 {