diff --git a/src/libknot/rrset.c b/src/libknot/rrset.c
index e0d4de8ff11c5c9462f2c3276a938af1fd1987f4..429fe414fed9aa4bc37eb3761325d98cf927f527 100644
--- a/src/libknot/rrset.c
+++ b/src/libknot/rrset.c
@@ -30,27 +30,46 @@
 /* Non-API functions                                                          */
 /*----------------------------------------------------------------------------*/
 
-size_t rrset_rdata_offset(const knot_rrset_t *rrset,
-                          size_t pos)
+static uint32_t rrset_rdata_size_total(const knot_rrset_t *rrset)
 {
-	if (rrset == NULL || rrset->rdata_indices == NULL) {
+	if (rrset == NULL || rrset->rdata_indices == NULL ||
+	    rrset->rdata_count == 0) {
+		return 0;
+	}
+	
+	/* Last index denotes end of all RRs. */
+	return (rrset->rdata_indices[rrset->rdata_count - 1]);
+}
+
+static size_t rrset_rdata_offset(const knot_rrset_t *rrset,
+                                 size_t pos)
+{
+	if (rrset == NULL || rrset->rdata_indices == NULL ||
+	    pos >= rrset->rdata_count) {
 		return 0;
 	}
 	
 	if (pos == 0) {
 		return 0;
 	} else {
+		assert(rrset->rdata_count >= 2);
 		return rrset->rdata_indices[pos - 1];
 	}
 }
 
-size_t rrset_rdata_item_size(const knot_rrset_t *rrset,
-                             size_t pos)
+static uint32_t rrset_rdata_item_size(const knot_rrset_t *rrset,
+                                      size_t pos)
 {
-	if (rrset == NULL || rrset->rdata_indices || rrset->rdata_count == 0) {
+	if (rrset == NULL || rrset->rdata_indices == NULL ||
+	    rrset->rdata_count == 0) {
 		return 0;
 	}
 	
+	if (rrset->rdata_count == 1) {
+		return rrset_rdata_size_total(rrset);
+	}
+	
+	assert(rrset->rdata_count >= 2);
 	return rrset_rdata_offset(rrset, pos) -
 	                          rrset_rdata_offset(rrset, pos - 1);
 }
@@ -92,19 +111,6 @@ size_t rrset_rdata_naptr_bin_chunk_size(const knot_rrset_t *rrset,
 	return size;
 }
 
-
-static uint32_t rrset_rdata_size_total(const knot_rrset_t *rrset)
-{
-	if (rrset == NULL || rrset->rdata_indices == NULL ||
-	    rrset->rdata_count == 0) {
-		return 0;
-	}
-	
-	/* Last index denotes end of all RRs. */
-	return (rrset->rdata_indices[rrset->rdata_count - 1]);
-}
-
-
 /*----------------------------------------------------------------------------*/
 /* API functions                                                              */
 /*----------------------------------------------------------------------------*/
@@ -1037,20 +1043,25 @@ void knot_rrset_rdata_deep_free_one(knot_rrset_t *rrset, size_t pos,
 		/* Go through the data and free dnames. Pointers can stay. */
 		const rdata_descriptor_t *desc =
 			get_rdata_descriptor(rrset->type);
+		assert(desc);
 		for (int i = 0; desc->block_types[i] != KNOT_RDATA_WF_END;i++) {
 			int item = desc->block_types[i];
 			if (descriptor_item_is_dname(item)) {
-				knot_dname_t *dname =
-					(knot_dname_t *)rdata + offset;
+				knot_dname_t *dname;
+				memcpy(&dname, rdata + offset,
+				       sizeof(knot_dname_t *));
+//				printf("%Freeing dname: %s\n",
+//				       knot_dname_to_str(dname));
 				knot_dname_release(dname);
 				offset += sizeof(knot_dname_t *);
 			} else if (descriptor_item_is_fixed(item)) {
-				offset += desc->block_types[i];
+				offset += item;
 			} else if (!descriptor_item_is_remainder(item)) {
 				assert(rrset->type == KNOT_RRTYPE_NAPTR);
 				/* Skip the binary beginning. */
-				offset += rrset_rdata_naptr_bin_chunk_size(rrset,
-				                                       pos);
+				offset +=
+					rrset_rdata_naptr_bin_chunk_size(rrset,
+				                                         pos);
 				knot_dname_t *dname =
 					(knot_dname_t *)rdata + offset;
 				knot_dname_release(dname);
@@ -1058,10 +1069,6 @@ void knot_rrset_rdata_deep_free_one(knot_rrset_t *rrset, size_t pos,
 		}
 	}
 	
-	free(rrset->rdata);
-	free(rrset->rdata_indices);
-	rrset->rdata_count = 0;
-	
 	return;
 }
 
@@ -1082,6 +1089,9 @@ void knot_rrset_deep_free(knot_rrset_t **rrset, int free_owner,
 	if ((*rrset)->rrsigs != NULL) {
 		knot_rrset_deep_free(&(*rrset)->rrsigs, 0, free_rdata_dnames);
 	}
+	
+	free((*rrset)->rdata);
+	free((*rrset)->rdata_indices);
 
 	if (free_owner) {
 		knot_dname_release((*rrset)->owner);
@@ -1142,8 +1152,6 @@ int knot_rrset_merge(void **r1, void **r2)
 	                    rrset_rdata_size_total(rrset2));
 	if (tmp == NULL) {
 		ERR_ALLOC_FAILED;
-		knot_rrset_dump(rrset1);
-		knot_rrset_dump(rrset2);
 		return KNOT_ENOMEM;
 	} else {
 		rrset1->rdata = tmp;
@@ -1185,8 +1193,6 @@ int knot_rrset_merge(void **r1, void **r2)
 	
 	rrset1->rdata_count += rrset2->rdata_count;
 	
-//	knot_rrset_dump(rrset1);
-	
 	return KNOT_EOK;
 }
 
@@ -1766,19 +1772,25 @@ void knot_rrset_rdata_dump(const knot_rrset_t *rrset, size_t rdata_pos)
 				fprintf(stderr, "DNAME error.\n");
 				return;
 			}
-			fprintf(stderr, "block=%d: DNAME=%s.\n",
-			        i, name);
+			fprintf(stderr, "block=%d: (%p) DNAME=%s.\n",
+			        i, dname, name);
 			free(name);
 			offset += sizeof(knot_dname_t *);
 		} else if (descriptor_item_is_fixed(item)) {
-			fprintf(stderr, "block=%d Raw data:\n",
-			        i);
+			fprintf(stderr, "block=%d Raw data (size=%d):\n",
+			        i, item);
 			hex_print(rdata + offset, item);
 			offset += item;
 		} else if (descriptor_item_is_remainder(item)) {
-			printf("remainder TODO\n");
-			;
+			printf("offset %d\n", offset);
+			fprintf(stderr, "block=%d Remainder (size=%d):\n",
+			        i, rrset_rdata_item_size(rrset,
+			                                 rdata_pos) - offset);
+			hex_print(rdata + offset,
+			          rrset_rdata_item_size(rrset,
+			                                rdata_pos) - offset);
 		} else {
+			fprintf(stderr, "NAPTR, failing miserably\n");
 			assert(rrset->type == KNOT_RRTYPE_NAPTR);
 			assert(0);
 		}
diff --git a/src/zcompile/zcompile.c b/src/zcompile/zcompile.c
index 04007d815d89827b68de44fbdca5dad35f7770fd..b316eb84ce80048c43d8d5017ef96b40798cc692 100644
--- a/src/zcompile/zcompile.c
+++ b/src/zcompile/zcompile.c
@@ -333,6 +333,9 @@ dbg_zp_exec_detail(
 		return ret;
 	}
 	
+	/* RDATA are safely added to RRSet now. */
+	free(rdata);
+	
 	return KNOT_EOK;
 }
 
@@ -666,6 +669,7 @@ int zone_read(const char *name, const char *zonefile, const char *outfile,
 	printf("RRs err=%d\n", err_count);
 	printf("RRs new=%d\n", new_rr_count);
 	printf("DNAMEs new=%d\n", new_dname_count);
+	knot_dname_free(&(my_parser.origin_from_config));
 }
 
 /*! @} */