diff --git a/man/knsupdate.8in b/man/knsupdate.8in
index c0ab1d13a6d5f3f520ea03747b51fd20f7b1dc10..0e78dd3b959144419e150be3b8f3cc900b1cd716 100644
--- a/man/knsupdate.8in
+++ b/man/knsupdate.8in
@@ -21,10 +21,10 @@ Use TCP protocol.
 Set the default port.
 .TP
 .BI -t \ timeout
-The query timeout.
+The query timeout (default 300 seconds).
 .TP
 .BI -r \ retries
-The number of UDP retries.
+The number of UDP retries (default 3).
 .TP
 .BI -y \ \fR[\fIhmac:\fR]\fIname:key\fR]
 Use TSIG.
diff --git a/src/utils/nsupdate/nsupdate_exec.c b/src/utils/nsupdate/nsupdate_exec.c
index bdc88535a27d786bc9f6a9256825912836d10609..a24ceaf0c1f1b6eb36c45f2c681930915db51095 100644
--- a/src/utils/nsupdate/nsupdate_exec.c
+++ b/src/utils/nsupdate/nsupdate_exec.c
@@ -799,14 +799,11 @@ int cmd_send(const char* lp, nsupdate_params_t *params)
 			return ret;
 		}
 	}
-	
-	/* Send/recv message (N retries). */
-	int retries = params->retries;
-	if (params->protocol == PROTO_TCP) {
-		retries = 1; /* No retries for TCP. */
-	}
+
 	int rb = 0;
-	for (; retries > 0; --retries) {
+	/* Send/recv message (1 try + N retries). */
+	int tries = 1 + params->retries;
+	for (; tries > 0; --tries) {
 		memset(params->rwire, 0, MAX_PACKET_SIZE);
 		rb = pkt_sendrecv(params, wire, len,
 		                  params->rwire, MAX_PACKET_SIZE);
diff --git a/src/utils/nsupdate/nsupdate_params.c b/src/utils/nsupdate/nsupdate_params.c
index afd9dc334f0b96f1df1e2175120c9f7d3791763f..34b85db1141dca72e9ef88b36f2b0201cfb7f11e 100644
--- a/src/utils/nsupdate/nsupdate_params.c
+++ b/src/utils/nsupdate/nsupdate_params.c
@@ -28,7 +28,7 @@
 #include "libknot/libknot.h"
 
 #define DEFAULT_RETRIES_NSUPDATE	3
-#define DEFAULT_TIMEOUT_NSUPDATE	1
+#define DEFAULT_TIMEOUT_NSUPDATE	300
 
 static const style_t DEFAULT_STYLE_NSUPDATE = {
 	.format = FORMAT_NSUPDATE,
@@ -194,6 +194,18 @@ int nsupdate_parse(nsupdate_params_t *params, int argc, char *argv[])
 		}
 	}
 
+	/* No retries for TCP. */
+	if (params->protocol == PROTO_TCP) {
+		params->retries = 0;
+	} else {
+		/* If wait/tries < 1 s, set 1 second for each try. */
+		if (params->wait > 0 && params->wait < ( 1 + params->retries)) {
+			params->wait = 1;
+		} else {
+			params->wait /= (1 + params->retries);
+		}
+	}
+
 	/* Process non-option parameters. */
 	for (; optind < argc; ++optind) {
 		strnode_t *n = malloc(sizeof(strnode_t));