diff --git a/src/libknot/nameserver/axfr.c b/src/libknot/nameserver/axfr.c
index 17868b808ce88449eef67eb71ac3b1081b8a21ce..4fe0e820efd7c30b6847bbb09081b417c0ee3471 100644
--- a/src/libknot/nameserver/axfr.c
+++ b/src/libknot/nameserver/axfr.c
@@ -54,8 +54,9 @@ static int answer_put_nodes(knot_pkt_t *pkt, struct axfr_proc *state)
 {
 	/* Put responses. */
 	int ret = KNOT_EOK;
+	knot_node_t *node = NULL;
 	while(!hattrie_iter_finished(state->i)) {
-		knot_node_t *node = (knot_node_t *)*hattrie_iter_val(state->i);
+		node = (knot_node_t *)*hattrie_iter_val(state->i);
 		ret = put_rrsets(pkt, node, state);
 		if (ret != KNOT_EOK) {
 			break;
@@ -142,7 +143,6 @@ int axfr_answer(knot_pkt_t *pkt, knot_nameserver_t *ns, struct query_data *qdata
 		qdata->rcode = KNOT_RCODE_NOTAUTH;
 		return NS_PROC_FAIL;
 	default:
-		qdata->rcode = KNOT_RCODE_SERVFAIL;
 		return NS_PROC_FAIL;
 	}
 
@@ -155,7 +155,6 @@ int axfr_answer(knot_pkt_t *pkt, knot_nameserver_t *ns, struct query_data *qdata
 		break;
 	default:          /* Generic error. */
 		dbg_ns("%s: answered with ret = %s\n", __func__, knot_strerror(ret));
-		qdata->rcode = KNOT_RCODE_SERVFAIL;
 		return NS_PROC_FAIL;
 	}
 
diff --git a/src/libknot/nameserver/internet.c b/src/libknot/nameserver/internet.c
index 33ed7279a2a6b813641950a070bb9bf36ee4486c..fed072c8075e39245ee1184c2a42850a0ec5e68f 100644
--- a/src/libknot/nameserver/internet.c
+++ b/src/libknot/nameserver/internet.c
@@ -51,7 +51,6 @@ static int follow_cname(knot_pkt_t *pkt, const knot_dname_t **name, struct query
 
 		/* Put to wildcard node list. */
 		if (ptrlist_add(&qdata->wildcards, cname_node, qdata->mm) == NULL) {
-			qdata->rcode = KNOT_RCODE_SERVFAIL;
 			return ERROR;
 		}
 
@@ -74,7 +73,6 @@ static int follow_cname(knot_pkt_t *pkt, const knot_dname_t **name, struct query
 		if (rr_to_add != cname_rr) {
 			knot_rrset_deep_free(&rr_to_add, 1);
 		}
-		qdata->rcode = KNOT_RCODE_SERVFAIL;
 		return ERROR;
 	} else {
 		/* Check if RR count increased. */
@@ -91,7 +89,6 @@ static int follow_cname(knot_pkt_t *pkt, const knot_dname_t **name, struct query
 	if (ret != KNOT_EOK) {
 		dbg_ns("%s: couldn't add rrsigs for CNAME RRSet %p\n",
 		       __func__, cname_rr);
-		qdata->rcode = KNOT_RCODE_SERVFAIL;
 		return ERROR;
 	}
 
@@ -150,7 +147,6 @@ static int name_found(knot_pkt_t *pkt, const knot_dname_t **name,
 	    && (qtype == KNOT_RRTYPE_SOA || qtype == KNOT_RRTYPE_NS)) {
 		ret = ns_add_dnskey(qdata->node, pkt);
 		if (ret != KNOT_EOK) {
-			qdata->rcode = KNOT_RCODE_SERVFAIL;
 			return ERROR;
 		}
 	}
@@ -185,7 +181,6 @@ static int name_not_found(knot_pkt_t *pkt, const knot_dname_t **name,
 		dbg_ns("%s: solving DNAME for name %p\n", __func__, *name);
 		int ret = ns_process_dname(dname_rrset, name, pkt);
 		if (ret != KNOT_EOK) {
-			qdata->rcode = KNOT_RCODE_SERVFAIL;
 			return ERROR;
 		}
 
@@ -272,7 +267,6 @@ static int solve_authority(int state, const knot_dname_t **qname,
 		dbg_ns("%s: invalid state after qname processing = %d\n",
 		       __func__, state);
 		assert(0);
-		qdata->rcode = KNOT_RCODE_SERVFAIL;
 		break;
 	}
 
@@ -294,7 +288,6 @@ int internet_answer(knot_pkt_t *response, struct query_data *qdata)
 		qdata->rcode = KNOT_RCODE_REFUSED;
 		return NS_PROC_FAIL;
 	default:
-		qdata->rcode = KNOT_RCODE_SERVFAIL;
 		return NS_PROC_FAIL;
 	}
 
@@ -395,7 +388,6 @@ int internet_notify(knot_pkt_t *pkt, knot_nameserver_t *ns, struct query_data *q
 		qdata->rcode = KNOT_RCODE_NOTAUTH;
 		return NS_PROC_FAIL;
 	default:
-		qdata->rcode = KNOT_RCODE_SERVFAIL;
 		return NS_PROC_FAIL;
 	}
 
diff --git a/src/libknot/nameserver/ns_proc_query.c b/src/libknot/nameserver/ns_proc_query.c
index cf38b2a7f571b9d9f9a63a731e3d8826f8b187cc..3930eadb9cf3465982bb81667824bdf848200642 100644
--- a/src/libknot/nameserver/ns_proc_query.c
+++ b/src/libknot/nameserver/ns_proc_query.c
@@ -150,6 +150,11 @@ int ns_proc_query_out(knot_pkt_t *pkt, ns_proc_context_t *ctx)
 		break;
 	}
 
+	/* Default RCODE is SERVFAIL if not specified otherwise. */
+	if (next_state == NS_PROC_FAIL && data->rcode == KNOT_RCODE_NOERROR) {
+		data->rcode = KNOT_RCODE_SERVFAIL;
+	}
+
 	rcu_read_unlock();
 	return next_state;
 }
@@ -218,8 +223,6 @@ int query_internet(knot_pkt_t *pkt, ns_proc_context_t *ctx)
 		break;
 	default:
 		assert(0); /* Should be caught earlier. */
-		data->rcode = KNOT_RCODE_SERVFAIL;
-		next_state = KNOT_ERROR;
 		break;
 	}