diff --git a/src/utils/common/exec.c b/src/utils/common/exec.c
index 3b925cf7099218162cb42ad2b81a66f403aa1c98..91b746c54486b03a2ceebb6c36e0ee92df293e2e 100644
--- a/src/utils/common/exec.c
+++ b/src/utils/common/exec.c
@@ -22,6 +22,7 @@
 
 #include <arpa/inet.h>			// inet_ntop
 #include <sys/socket.h>                 // AF_INET
+ #include <netinet/in.h>
 
 #include "common/lists.h"		// list
 #include "common/errcode.h"		// KNOT_EOK
diff --git a/src/utils/common/params.c b/src/utils/common/params.c
index e4c632c480813049ada99e3c642702795ae983a7..bc6b3e5543c8645d07b020fe1c831c3c6f5889f8 100644
--- a/src/utils/common/params.c
+++ b/src/utils/common/params.c
@@ -18,6 +18,8 @@
 
 #include <stdlib.h>			// free
 #include <netinet/in.h>                 // in_addr
+#include <arpa/inet.h>
+#include <sys/socket.h>
 
 #include "common/errcode.h"		// KNOT_EOK
 #include "libknot/util/descriptor.h"	// KNOT_RRTYPE
diff --git a/src/utils/nsupdate/nsupdate_exec.c b/src/utils/nsupdate/nsupdate_exec.c
index 3dfcb415e1990205a73abf95da7ea80cc9aa0ebd..e5df4ac3a4907f0b58a75c6b9b15385e3233e483 100644
--- a/src/utils/nsupdate/nsupdate_exec.c
+++ b/src/utils/nsupdate/nsupdate_exec.c
@@ -24,6 +24,7 @@
 #include <ctype.h>
 #include <assert.h>
 #include <stdlib.h>
+#include <sys/socket.h>
 
 #include "utils/nsupdate/nsupdate_exec.h"
 #include "utils/common/msg.h"
@@ -375,6 +376,22 @@ static int pkt_append(params_t *p, int sect)
 	return ret;
 }
 
+static int pkt_sendrecv(params_t *params, server_t *srv,
+                        uint8_t *qwire, size_t qlen,
+                        uint8_t *rwire, size_t rlen)
+{
+	int sock = send_msg(params, KNOT_RRTYPE_SOA, srv, qwire, qlen);
+	DBG("%s: send_msg = %d\n", __func__, sock);
+	if (sock < 0) return sock;
+	
+	/* Wait for reception. */
+	int rb = receive_msg(params, KNOT_RRTYPE_SOA, sock, rwire, rlen);
+	DBG("%s: receive_msg = %d\n", __func__, rb);
+	shutdown(sock, SHUT_RDWR);
+	
+	return rb;
+}
+
 /*!
  * \brief Scan for matching token described by a match table.
  *
@@ -716,25 +733,16 @@ int cmd_send(const char* lp, params_t *params)
 	if (EMPTY_LIST(params->servers)) return KNOT_EINVAL;
 	server_t *srv = TAIL(params->servers);
 	
-	/* Create query helper. */
-	int sock = send_msg(params, KNOT_RRTYPE_SOA, srv, wire, len);
-	DBG("%s: send_msg = %d\n", __func__, sock);
-	if (sock < 0) {
-		ERR("failed to send query\n");
-		return KNOT_ERROR;
-	}
-	
-	/*! \todo TCP fallback. */
-	
-	/* Wait for reception. */
+	/* Send/recv message (N retries). */
 	uint8_t	rwire[MAX_PACKET_SIZE]; 
-	int rb = receive_msg(params, KNOT_RRTYPE_SOA, sock, rwire,
-	                     sizeof(rwire));
-	DBG("%s: receive_msg = %d\n", __func__, rb);
-	shutdown(sock, SHUT_RDWR);
-	if (rb < 0) {
-		ERR("failed to receive reply\n");
-		return rb;
+	int retries = params->retries;
+	if (params->protocol == PROTO_TCP) {
+		retries = 1; /* No retries for TCP. */
+	}
+	int rb = 0;
+	for (; retries > 0; --retries) {
+		rb = pkt_sendrecv(params, srv, wire, len, rwire, sizeof(rwire));
+		if (rb > 0) break;
 	}
 	
 	knot_packet_t *resp = knot_packet_new(KNOT_PACKET_PREALLOC_RESPONSE);
@@ -753,6 +761,8 @@ int cmd_send(const char* lp, params_t *params)
 		ERR("update failed: %s\n", rc_errtable[rc]);
 	}
 	
+	/*! \todo Should we check TC bit? */
+	
 	/* Free created rrsets. */
 	knot_packet_free_rrsets(npar->pkt);
 	knot_packet_free(&npar->pkt);