diff --git a/src/libknot/rrset.c b/src/libknot/rrset.c
index 3bf2dd9a95af0d6127142750cd6b68ca1f94868f..70b6ce9e9b2e1d34bee4d4a8a2923ecbfc4ab2d7 100644
--- a/src/libknot/rrset.c
+++ b/src/libknot/rrset.c
@@ -163,57 +163,6 @@ static int write_fixed_header(const knot_rrset_t *rrset, uint16_t rrset_index,
 	return KNOT_EOK;
 }
 
-/*!
- * \brief Write RDATA DNAME to wire.
- */
-static int write_rdata_dname(const uint8_t **src, size_t *src_avail,
-                             uint8_t **wire, size_t *capacity,
-                             knot_compr_t *compr, int compr_hint, bool compress,
-                             knot_rrset_wire_flags_t flags)
-{
-	assert(src && *src);
-	assert(src_avail);
-	assert(wire && *wire);
-	assert(capacity);
-
-	/* Source domain name */
-
-	const knot_dname_t *dname = *src;
-	size_t dname_size = knot_dname_size(dname);
-
-	/* Output domain name */
-
-	int written = knot_compr_put_dname(dname, *wire, dname_max(*capacity),
-	                                   compress ? compr : NULL);
-	if (written < 0) {
-		assert(written == KNOT_ESPACE);
-		return written;
-	}
-
-	/* Post-processing */
-
-	if (flags & KNOT_RRSET_WIRE_CANONICAL) {
-		assert(compr == NULL);
-		knot_dname_to_lower(*wire);
-	}
-
-	/* Update compression hints */
-
-	if (compr_get_ptr(compr, compr_hint) == 0) {
-		compr_set_ptr(compr, compr_hint, *wire, written);
-	}
-
-	/* Update buffers */
-
-	*wire += written;
-	*capacity -= written;
-
-	*src += dname_size;
-	*src_avail -= dname_size;
-
-	return KNOT_EOK;
-}
-
 /*!
  * \brief Write a fixed block of binary data to wire.
  */
@@ -252,15 +201,12 @@ static int write_rdata_fixed(const uint8_t **src, size_t *src_avail,
 }
 
 /*!
- * \brief Write RDATA NAPTR header to wire.
+ * \brief Count size of NAPTR RDATA header.
  */
-static int write_rdata_naptr(const uint8_t **src, size_t *src_avail,
-                             uint8_t **wire, size_t *capacity)
+static int naptr_header_size(const uint8_t **src, size_t *src_avail)
 {
 	assert(src && *src);
 	assert(src_avail);
-	assert(wire && *wire);
-	assert(capacity);
 
 	size_t size = 0;
 
@@ -279,9 +225,7 @@ static int write_rdata_naptr(const uint8_t **src, size_t *src_avail,
 		size += 1 + *len_ptr;
 	}
 
-	/* Copy result */
-
-	return write_rdata_fixed(src, src_avail, wire, capacity, size);
+	return size;
 }
 
 static int compress_dname(const uint8_t **src, size_t *src_avail,
@@ -290,12 +234,50 @@ static int compress_dname(const uint8_t **src, size_t *src_avail,
                           knot_rrset_wire_flags_t flags,
                           const uint8_t *pkt_wire)
 {
+	assert(src && *src);
+	assert(src_avail);
+	assert(dst && *dst);
+	assert(dst_avail);
+	UNUSED(pkt_wire);
+
 	bool compress = (type == KNOT_RDATA_WF_COMPRESSIBLE_DNAME);
 
-	UNUSED(pkt_wire);
+	/* Source domain name */
 
-	return write_rdata_dname(src, src_avail, dst, dst_avail, compr,
-	                         compr_hint, compress, flags);
+	const knot_dname_t *dname = *src;
+	size_t dname_size = knot_dname_size(dname);
+
+	/* Output domain name */
+
+	int written = knot_compr_put_dname(dname, *dst, dname_max(*dst_avail),
+	                                   compress ? compr : NULL);
+	if (written < 0) {
+		assert(written == KNOT_ESPACE);
+		return written;
+	}
+
+	/* Post-processing */
+
+	if (flags & KNOT_RRSET_WIRE_CANONICAL) {
+		assert(compr == NULL);
+		knot_dname_to_lower(*dst);
+	}
+
+	/* Update compression hints */
+
+	if (compr_get_ptr(compr, compr_hint) == 0) {
+		compr_set_ptr(compr, compr_hint, *dst, written);
+	}
+
+	/* Update buffers */
+
+	*dst += written;
+	*dst_avail -= written;
+
+	*src += dname_size;
+	*src_avail -= dname_size;
+
+	return KNOT_EOK;
 }
 
 static int decompress_dname(const uint8_t **src, size_t *src_avail,
@@ -304,6 +286,11 @@ static int decompress_dname(const uint8_t **src, size_t *src_avail,
                             knot_rrset_wire_flags_t flags,
                             const uint8_t *pkt_wire)
 {
+	assert(src && *src);
+	assert(src_avail);
+	assert(dst && *dst);
+	assert(dst_avail);
+
 	UNUSED(compr);
 	UNUSED(compr_hint);
 
@@ -361,6 +348,7 @@ static int traverse_rdata(const rdata_descriptor_t *desc, const uint8_t **src,
 
 	for (int i = 0; desc->block_types[i] != KNOT_RDATA_WF_END; i++) {
 		int type = desc->block_types[i];
+		size_t to_copy = 0;
 
 		switch (type) {
 		case KNOT_RDATA_WF_COMPRESSIBLE_DNAME:
@@ -371,22 +359,22 @@ static int traverse_rdata(const rdata_descriptor_t *desc, const uint8_t **src,
 			                     pkt_wire);
 			break;
 		case KNOT_RDATA_WF_NAPTR_HEADER:
-			ret = write_rdata_naptr(src, src_avail, wire, capacity);
+			ret = naptr_header_size(src, src_avail);
+			to_copy = ret;
 			break;
 		case KNOT_RDATA_WF_REMAINDER:
-			ret = write_rdata_fixed(src, src_avail, wire, capacity,
-			                        *src_avail);
+			to_copy = *src_avail;
 			break;
 		default:
 			/* Fixed size block */
 			assert(type > 0);
-			ret = write_rdata_fixed(src, src_avail, wire, capacity,
-			                        type);
+			to_copy = type;
 		}
 
-		/* TODO: unify the write_rdata_... functions - do the copying
-		 * after the switch, before that just count the size.
-		 */
+		if (to_copy > 0) {
+			ret = write_rdata_fixed(src, src_avail, wire, capacity,
+			                        to_copy);
+		}
 
 		if (ret != KNOT_EOK) {
 			return ret;
@@ -622,7 +610,6 @@ int knot_rrset_rdata_from_wire_one(knot_rrset_t *rrset,
 	uint8_t rdata_buffer[dst_avail];
 	memset(rdata_buffer, 0, dst_avail);
 
-	/* TODO: resolve the consts. */
 	const uint8_t *src = wire + *pos;
 	size_t src_avail = rdlength;
 	uint8_t *dst = rdata_buffer;