diff --git a/src/libknot/rrset.c b/src/libknot/rrset.c
index 03ef0de2bf237753b12e852d1df0cd85eee766a4..7834a9430b703d9036e7824b50e31db2d8ded72d 100644
--- a/src/libknot/rrset.c
+++ b/src/libknot/rrset.c
@@ -80,6 +80,32 @@ static uint8_t *rrset_rdata_pointer(const knot_rrset_t *rrset,
 	return rrset->rdata + rrset_rdata_offset(rrset, pos);
 }
 
+static uint16_t rrset_rdata_naptr_bin_chunk_size(const knot_rrset_t *rrset,
+                                               size_t pos)
+{
+	if (rrset == NULL || rrset->rdata_count >= pos) {
+		return 0;
+	}
+	
+	size_t size = 0;
+	uint8_t *rdata = rrset_rdata_pointer(rrset, pos);
+	assert(rdata);
+	
+	/* Two shorts at the beginning. */
+	size += 4;
+	/* 3 binary TXTs with length in the first byte. */
+	for (int i = 0; i < 3; i++) {
+		size += *(rdata + size);
+	}
+	
+	/* 
+	 * Dname remaning, but we usually want to get to the DNAME, so
+	 * there's no need to include it in the returned size.
+	 */
+	
+	return size;
+}
+
 void knot_rrset_rdata_dump(const knot_rrset_t *rrset, size_t rdata_pos)
 {
 	fprintf(stderr, "      ------- RDATA pos=%zu -------\n", rdata_pos);
@@ -121,39 +147,17 @@ void knot_rrset_rdata_dump(const knot_rrset_t *rrset, size_t rdata_pos)
 			          rrset_rdata_item_size(rrset,
 			                                rdata_pos) - offset);
 		} else {
-			fprintf(stderr, "NAPTR, failing miserably\n");
 			assert(rrset->type == KNOT_RRTYPE_NAPTR);
-			assert(0);
+			uint16_t naptr_chunk_size =
+				rrset_rdata_naptr_bin_chunk_size(rrset, rdata_pos);
+			fprintf(stderr, "NAPTR, REGEXP block (size=%zu):\n",
+			        naptr_chunk_size);
+			hex_print((char *)(rdata + offset), naptr_chunk_size);
+			offset += naptr_chunk_size;
 		}
 	}
 }
 
-static size_t rrset_rdata_naptr_bin_chunk_size(const knot_rrset_t *rrset,
-                                               size_t pos)
-{
-	if (rrset == NULL || rrset->rdata_count >= pos) {
-		return 0;
-	}
-	
-	size_t size = 0;
-	uint8_t *rdata = rrset_rdata_pointer(rrset, pos);
-	assert(rdata);
-	
-	/* Two shorts at the beginning. */
-	size += 4;
-	/* 3 binary TXTs with length in the first byte. */
-	for (int i = 0; i < 3; i++) {
-		size += *(rdata + size);
-	}
-	
-	/* 
-	 * Dname remaning, but we usually want to get to the DNAME, so
-	 * there's no need to include it in the returned size.
-	 */
-	
-	return size;
-}
-
 static size_t rrset_rdata_remainder_size(const knot_rrset_t *rrset,
                                          size_t offset, size_t pos)
 {
@@ -210,9 +214,9 @@ static int rrset_rdata_compare_one(const knot_rrset_t *rrset1,
 			assert(desc->block_types[i + 1] == KNOT_RDATA_WF_END);
 		} else {
 			assert(rrset1->type == KNOT_RRTYPE_NAPTR);
-			size_t naptr_chunk_size1 =
+			uint16_t naptr_chunk_size1 =
 				rrset_rdata_naptr_bin_chunk_size(rrset1, pos1);
-			size_t naptr_chunk_size2 =
+			uint16_t naptr_chunk_size2 =
 				rrset_rdata_naptr_bin_chunk_size(rrset2, pos2);
 			cmp = memcmp(r1, r2,
 			             naptr_chunk_size1 <= naptr_chunk_size2 ?
@@ -220,16 +224,9 @@ static int rrset_rdata_compare_one(const knot_rrset_t *rrset1,
 			if (cmp != 0) {
 				return cmp;
 			}
-		
 			/* Binary part was equal, we have to compare DNAMEs. */
 			assert(naptr_chunk_size1 == naptr_chunk_size2);
 			offset += naptr_chunk_size1;
-			knot_dname_t *dname1 = NULL;
-			memcpy(&dname1, r1 + offset, sizeof(knot_dname_t *));
-			knot_dname_t *dname2 = NULL;
-			memcpy(&dname2, r2 + offset, sizeof(knot_dname_t *));
-			cmp = knot_dname_compare(dname1, dname2);
-			offset += sizeof(knot_dname_t *);
 		}
 
 		if (cmp != 0) {
@@ -400,7 +397,7 @@ dbg_rrset_exec_detail(
 		} else {
 			assert(rrset->type == KNOT_RRTYPE_NAPTR);
 			/* Store the binary chunk. */
-			size_t chunk_size =
+			uint16_t chunk_size =
 			rrset_rdata_naptr_bin_chunk_size(rrset, rdata_pos);
 			if (size + rdlength + chunk_size > max_size) {
 				dbg_rrset("rr: to_wire: NAPTR chunk does not "
@@ -420,15 +417,6 @@ dbg_rrset_exec_detail(
 				          "fit to wire.\n");
 				return KNOT_ESPACE;
 			}
-
-			// save whole domain name
-			memcpy(*pos, knot_dname_name(dname), 
-			       knot_dname_size(dname));
-			dbg_rrset_detail("Uncompressed dname size: %d\n",
-			                 knot_dname_size(dname));
-			*pos += knot_dname_size(dname);
-			rdlength += knot_dname_size(dname);
-			offset += sizeof(knot_dname_t *);
 		}
 	}
 	
@@ -570,18 +558,6 @@ knot_rrset_t *knot_rrset_new(knot_dname_t *owner, uint16_t type,
 	return ret;
 }
 
-/*----------------------------------------------------------------------------*/
-/* [code-review] not in header file  */
-int knot_rrset_add_rdata_single(knot_rrset_t *rrset, const uint8_t *rdata,
-                                uint32_t size)
-{
-	rrset->rdata_indices = xmalloc(sizeof(uint32_t));
-	rrset->rdata_indices[0] = size;
-	rrset->rdata = rdata;
-	rrset->rdata_count = 1;
-	return KNOT_EOK;
-}
-
 int knot_rrset_add_rdata(knot_rrset_t *rrset,
                          const uint8_t *rdata, uint16_t size)
 {
@@ -1045,16 +1021,6 @@ dbg_rrset_exec_detail(
 				}
 				offset += txt_size + 1;
 			}
-			
-			/* Dname remaining. No need to note read size. */
-			knot_dname_t *dname =
-				knot_dname_parse_from_wire(
-					wire, pos, total_size, NULL, NULL);
-			if (dname == NULL) {
-				return KNOT_ERROR;
-			}
-			*((knot_dname_t **)rdata_buffer + offset) = dname;
-			offset += sizeof(knot_dname_t *);
 		}
 	}
 	
@@ -1285,9 +1251,6 @@ void knot_rrset_rdata_deep_free_one(knot_rrset_t *rrset, size_t pos,
 				offset +=
 					rrset_rdata_naptr_bin_chunk_size(rrset,
 				                                         pos);
-				knot_dname_t *dname =
-					(knot_dname_t *)rdata + offset;
-				knot_dname_release(dname);
 			}
 		}
 	}
@@ -1967,11 +1930,10 @@ knot_dname_t **knot_rrset_get_next_rr_dname(const knot_rrset_t *rrset,
 			} else if (descriptor_item_is_fixed(desc->block_types[i])) {
 				offset += desc->block_types[i];
 			} else if (!descriptor_item_is_remainder(desc->block_types[i])) {
+				assert(rrset->type == KNOT_RRTYPE_NAPTR);
 				offset +=
 					rrset_rdata_naptr_bin_chunk_size(rrset,
 				                                         rr_pos);
-				assert(rrset->type == KNOT_RRTYPE_NAPTR);
-				return (knot_dname_t **)(rdata + offset);
 			}
 		}
 	}
@@ -2037,7 +1999,6 @@ knot_dname_t **knot_rrset_get_next_dname(const knot_rrset_t *rrset,
 				offset +=
 					rrset_rdata_naptr_bin_chunk_size(rrset,
 				                                         pos);
-				return (knot_dname_t **)(rdata + offset);
 			}
 		}
 	}
@@ -2111,13 +2072,14 @@ static size_t rrset_binary_size_one(const knot_rrset_t *rrset,
 			        offset;
 		} else {
 			assert(rrset->type == KNOT_RRTYPE_NAPTR);
-			size_t naptr_chunk_size =
+			uint16_t naptr_chunk_size =
 				rrset_rdata_naptr_bin_chunk_size(rrset, rdata_pos);
-			size += naptr_chunk_size;
+			/*
+			 * Regular expressions in NAPTR are TXT's, so they
+			 * can be upto 64k long.
+			 */
+			size += naptr_chunk_size + 2;
 			offset += naptr_chunk_size;
-			const knot_dname_t *dname =
-				*((const knot_dname_t **)(rdata + offset));
-			size += knot_dname_size(dname) + 1; // extra 1 - we need a size
 		}
 	}
 	
@@ -2183,8 +2145,12 @@ static void rrset_serialize_rr(const knot_rrset_t *rrset, size_t rdata_pos,
 			/* Copy static chunk. */
 			uint16_t naptr_chunk_size =
 				rrset_rdata_naptr_bin_chunk_size(rrset, rdata_pos);
+			/* We need a length. */
+			memcpy(stream + *size, &naptr_chunk_size,
+			       sizeof(uint16_t));
+			*size += sizeof(uint16_t);
+			/* Write data. */
 			memcpy(stream + *size, rdata + offset, naptr_chunk_size);
-			assert(0);
 		}
 	}
 	
@@ -2198,7 +2164,7 @@ int rrset_serialize(const knot_rrset_t *rrset, uint8_t *stream, size_t *size)
 	}
 	
 	uint64_t rrset_length = rrset_binary_size(rrset);
-	dbg_rrset_detail("rr: serialize: Binary size=%d\n", rrset_length);
+	dbg_rrset_detail("rr: serialize: Binary size=%llu\n", rrset_length);
 	memcpy(stream, &rrset_length, sizeof(uint64_t));
 	
 	size_t offset = sizeof(uint64_t);
@@ -2303,7 +2269,15 @@ static int rrset_deserialize_rr(knot_rrset_t *rrset, size_t rdata_pos,
 			stream_offset += remainder_size;
 		} else {
 			assert(rrset->type == KNOT_RRTYPE_NAPTR);
-			assert(0);
+			/* Read size. */
+			uint16_t naptr_chunk_size;
+			memcpy(&naptr_chunk_size, stream + stream_offset,
+			       sizeof(uint16_t));
+			stream_offset += sizeof(uint16_t);
+			memcpy(rdata + rdata_offset, stream + stream_offset,
+			       naptr_chunk_size);
+			stream_offset += naptr_chunk_size;
+			rdata_offset += rdata_offset;
 		}
 	}
 	*read = stream_offset;
@@ -2321,7 +2295,7 @@ int rrset_deserialize(uint8_t *stream, size_t *stream_size,
 	memcpy(&rrset_length, stream, sizeof(uint64_t));
 	if (rrset_length > *stream_size) {
 		dbg_rrset("rr: deserialize: No space for whole RRSet. "
-		          "(given=%d needed=%d)\n", *stream_size,
+		          "(given=%zu needed=%llu)\n", *stream_size,
 		          rrset_length);
 		return KNOT_ESPACE;
 	}