diff --git a/src/dnstap/message.c b/src/dnstap/message.c
index 5aadfb02d23dc3f22d88b1adfc89c40ef11dab66..bd3ff2daeb070c2e0dd2f16d84d93c5394ddc65d 100644
--- a/src/dnstap/message.c
+++ b/src/dnstap/message.c
@@ -22,6 +22,7 @@
 
 #include "common/errcode.h"
 
+#include "dnstap/convert.h"
 #include "dnstap/message.h"
 
 static void set_address(const struct sockaddr *sockaddr,
@@ -58,44 +59,11 @@ static int get_family(const struct sockaddr *query_sa,
 	              const struct sockaddr *response_sa)
 {
 	const struct sockaddr *source = query_sa ? query_sa : response_sa;
-
 	if (source == NULL) {
 		return 0;
 	}
 
-	switch (source->sa_family) {
-	case AF_INET:
-		return DNSTAP__SOCKET_FAMILY__INET;
-	case AF_INET6:
-		return DNSTAP__SOCKET_FAMILY__INET6;
-	default:
-		return 0;
-	}
-}
-
-static bool is_query(Dnstap__Message__Type type)
-{
-	switch (type) {
-	case DNSTAP__MESSAGE__TYPE__STUB_QUERY:
-	case DNSTAP__MESSAGE__TYPE__CLIENT_QUERY:
-	case DNSTAP__MESSAGE__TYPE__RESOLVER_QUERY:
-	case DNSTAP__MESSAGE__TYPE__AUTH_QUERY:
-		return true;
-	default:
-		return false;
-	}
-}
-
-static bool is_response(Dnstap__Message__Type type)
-{
-	switch (type) {
-	case DNSTAP__MESSAGE__TYPE__STUB_RESPONSE:
-	case DNSTAP__MESSAGE__TYPE__CLIENT_RESPONSE:
-	case DNSTAP__MESSAGE__TYPE__RESOLVER_RESPONSE:
-	case DNSTAP__MESSAGE__TYPE__AUTH_RESPONSE:
-	default:
-		return false;
-	}
+	return dt_family_encode(source->sa_family);
 }
 
 int dt_message_fill(Dnstap__Message             *m,
@@ -124,13 +92,7 @@ int dt_message_fill(Dnstap__Message             *m,
 	m->has_socket_family = m->socket_family != 0;
 
 	// Message.socket_protocol
-	if (protocol == IPPROTO_UDP) {
-		m->socket_protocol = DNSTAP__SOCKET_PROTOCOL__UDP;
-	} else if (protocol == IPPROTO_TCP) {
-		m->socket_protocol = DNSTAP__SOCKET_PROTOCOL__TCP;
-	} else {
-		m->socket_protocol = 0;
-	}
+	m->socket_protocol = dt_protocol_encode(protocol);
 	m->has_socket_protocol = m->socket_protocol != 0;
 
 	// Message addresses
@@ -139,12 +101,12 @@ int dt_message_fill(Dnstap__Message             *m,
 	set_address(response_sa, &m->response_address, &m->has_response_address,
 	            &m->response_port, &m->has_response_port);
 
-	if (is_query(type)) {
+	if (dt_message_type_is_query(type)) {
 		// Message.query_message
 		m->query_message.len = len_wire;
 		m->query_message.data = (uint8_t *)wire;
 		m->has_query_message = 1;
-	} else if (is_response(type)) {
+	} else if (dt_message_type_is_response(type)) {
 		// Message.response_message
 		m->response_message.len = len_wire;
 		m->response_message.data = (uint8_t *)wire;
diff --git a/src/utils/dig/dig_exec.c b/src/utils/dig/dig_exec.c
index 03586cbec6c88223cca54877fbeedbc2f7935f68..6e600c9453e0e1e9bac87f0cb6352f90de1749a4 100644
--- a/src/utils/dig/dig_exec.c
+++ b/src/utils/dig/dig_exec.c
@@ -32,6 +32,7 @@
 #include "utils/common/exec.h"		// print_packet
 
 #if USE_DNSTAP
+# include "dnstap/convert.h"
 # include "dnstap/message.h"
 # include "dnstap/writer.h"
 
@@ -57,7 +58,7 @@ static int write_dnstap(dt_writer_t          *writer,
 	                       : DNSTAP__MESSAGE__TYPE__TOOL_QUERY;
 
 	ret = dt_message_fill(&msg, msg_type, net->local_info->ai_addr,
-	                      net->srv->ai_addr, net->local_info->ai_protocol,
+	                      net->srv->ai_addr, net->srv->ai_protocol,
 			      wire, wire_len, qtime, rtime);
 	if (ret != KNOT_EOK) {
 		return ret;
@@ -160,35 +161,21 @@ static void process_dnstap(const query_t *query)
 			    message->has_socket_family &&
 			    message->has_socket_protocol) {
 				struct sockaddr_storage ss;
-				int    family = AF_UNSPEC, proto = 0;
-
-				switch (message->socket_family) {
-				case DNSTAP__SOCKET_FAMILY__INET:
-					family = AF_INET;
-					break;
-				case DNSTAP__SOCKET_FAMILY__INET6:
-					family = AF_INET6;
-					break;
-				default:
-					break;
-				}
-
-				switch (message->socket_protocol) {
-				case DNSTAP__SOCKET_PROTOCOL__UDP:
-					proto = SOCK_DGRAM;
-					break;
-				case DNSTAP__SOCKET_PROTOCOL__TCP:
-					proto = SOCK_STREAM;
-					break;
-				default:
-					break;
+				int family, proto, sock_type;
+
+				family = dt_family_decode(message->socket_family);
+				proto = dt_protocol_decode(message->socket_protocol);
+				switch (proto) {
+				case IPPROTO_TCP: sock_type = SOCK_STREAM; break;
+				case IPPROTO_UDP: sock_type = SOCK_DGRAM; break;
+				default: sock_type = 0; break;
 				}
 
 				sockaddr_set_raw(&ss, family,
 				                 message->response_address.data,
 				                 message->response_address.len);
 				sockaddr_port_set(&ss, message->response_port);
-				get_addr_str(&ss, proto, &net_ctx.remote_str);
+				get_addr_str(&ss, sock_type, &net_ctx.remote_str);
 			}
 
 			print_packet(pkt, &net_ctx, pkt->size, query_time,