diff --git a/src/knot/ctl/remote.c b/src/knot/ctl/remote.c
index 95b9f40f5a00aa8f7f427103fe1309d418595fab..95941e5a32ae0bb0df3e978ebee38796306974b8 100644
--- a/src/knot/ctl/remote.c
+++ b/src/knot/ctl/remote.c
@@ -849,8 +849,9 @@ int remote_print_txt(const knot_rrset_t *rr, uint16_t i)
 	/* Packet parser should have already checked the packet validity. */
 	char buf[256];
 	uint16_t parsed = 0;
-	uint16_t rlen = knot_rrset_rr_size(rr, i);
-	uint8_t *p = knot_rrset_rr_rdata(rr, i);
+	const knot_rdata_t *rdata = knot_rdataset_at(&rr->rrs, i);
+	uint8_t *p = knot_rdata_data(rdata);
+	uint16_t rlen = knot_rdata_rdlen(rdata);
 	while (parsed < rlen) {
 		memcpy(buf, (const char*)(p+1), *p);
 		buf[*p] = '\0';
diff --git a/src/knot/dnssec/zone-sign.c b/src/knot/dnssec/zone-sign.c
index 230d0558949f73d08b5367d538f21e7a20782e16..7ce245c12a39b0423cac024cd972a7b129353ed5 100644
--- a/src/knot/dnssec/zone-sign.c
+++ b/src/knot/dnssec/zone-sign.c
@@ -698,8 +698,9 @@ static bool dnskey_exists_in_zone(const knot_rrset_t *dnskeys,
 
 	uint16_t dnskeys_rdata_count = dnskeys->rrs.rr_count;
 	for (uint16_t i = 0; i < dnskeys_rdata_count; i++) {
-		uint8_t *rdata = knot_rrset_rr_rdata(dnskeys, i);
-		uint16_t rdata_size = knot_rrset_rr_size(dnskeys, i);
+		const knot_rdata_t *rr = knot_rdataset_at(&dnskeys->rrs, i);
+		uint8_t *rdata = knot_rdata_data(rr);
+		uint16_t rdata_size = knot_rdata_rdlen(rr);
 		if (dnskey_rdata_match(key, rdata, rdata_size)) {
 			return true;
 		}
@@ -759,8 +760,9 @@ static int remove_invalid_dnskeys(const knot_rrset_t *soa,
 
 	uint16_t dnskeys_rdata_count = dnskeys->rrs.rr_count;
 	for (uint16_t i = 0; i < dnskeys_rdata_count; i++) {
-		uint8_t *rdata = knot_rrset_rr_rdata(dnskeys, i);
-		uint16_t rdata_size = knot_rrset_rr_size(dnskeys, i);
+		const knot_rdata_t *rr = knot_rdataset_at(&dnskeys->rrs, i);
+		uint8_t *rdata = knot_rdata_data(rr);
+		uint16_t rdata_size = knot_rdata_rdlen(rr);
 		uint16_t keytag = knot_keytag(rdata, rdata_size);
 		const knot_zone_key_t *key = knot_get_zone_key(zone_keys, keytag);
 		if (key == NULL) {
@@ -923,8 +925,9 @@ static int update_dnskeys_rrsigs(const knot_rrset_t *dnskeys,
 	// add unknown keys from zone
 	uint16_t dnskeys_rdata_count = dnskeys->rrs.rr_count;
 	for (uint16_t i = 0; i < dnskeys_rdata_count; i++) {
-		uint8_t *rdata = knot_rrset_rr_rdata(dnskeys, i);
-		uint16_t rdata_size = knot_rrset_rr_size(dnskeys, i);
+		const knot_rdata_t *rr = knot_rdataset_at(&dnskeys->rrs, i);
+		uint8_t *rdata = knot_rdata_data(rr);
+		uint16_t rdata_size = knot_rdata_rdlen(rr);
 		uint16_t keytag = knot_keytag(rdata, rdata_size);
 		if (knot_get_zone_key(zone_keys, keytag) != NULL) {
 			continue;
diff --git a/src/knot/nameserver/internet.c b/src/knot/nameserver/internet.c
index b49164315a78c851bbdde431292282d1adf9e6fc..e31f6888d5645a078c15e0ae0798fc128c6d85d1 100644
--- a/src/knot/nameserver/internet.c
+++ b/src/knot/nameserver/internet.c
@@ -267,7 +267,8 @@ static int put_authority_soa(knot_pkt_t *pkt, struct query_data *qdata,
 			knot_dname_free(&dname_cpy, &pkt->mm);
 			return ret;
 		}
-		knot_rrset_rr_set_ttl(&copy, 0, min);
+		knot_rdata_t *soa_rr = knot_rdataset_at(&copy.rrs, 0);
+		knot_rdata_set_ttl(soa_rr, min);
 
 		flags |= KNOT_PF_FREE;
 		soa_rrset = copy;
diff --git a/src/knot/updates/ddns.c b/src/knot/updates/ddns.c
index c2042c2068e99c810e1e1bb084a245c65a6e5479..79456925adcb936179f701f83fb5bbb275907737 100644
--- a/src/knot/updates/ddns.c
+++ b/src/knot/updates/ddns.c
@@ -199,7 +199,8 @@ static bool rrset_empty(const knot_rrset_t *rrset)
 		return true;
 	}
 	if (rr_count == 1) {
-		return knot_rrset_rr_size(rrset, 0) == 0;
+		const knot_rdata_t *rr = knot_rdataset_at(&rrset->rrs, 0);
+		return knot_rdata_rdlen(rr) == 0;
 	}
 	return false;
 }
diff --git a/src/knot/zone/semantic-check.c b/src/knot/zone/semantic-check.c
index 6df43036dbf278c5b41b18147aebcee11d5c6d71..56fc1dfcb67a78caf4180082d3dd9898936e0d6b 100644
--- a/src/knot/zone/semantic-check.c
+++ b/src/knot/zone/semantic-check.c
@@ -264,9 +264,8 @@ static int check_dnskey_rdata(const knot_rrset_t *rrset, size_t rdata_pos)
 	/* check that Zone key bit it set - position 7 in net order */
 	const uint16_t mask = 1 << 8; //0b0000000100000000;
 
-	uint16_t flags =
-		knot_wire_read_u16(knot_rrset_rr_rdata(rrset, rdata_pos));
-
+	const knot_rdata_t *rr = knot_rdataset_at(&rrset->rrs, rdata_pos);
+	uint16_t flags = knot_wire_read_u16(knot_rdata_data(rr));
 	if (flags & mask) {
 		return KNOT_EOK;
 	} else {
@@ -382,9 +381,9 @@ static int check_rrsig_rdata(err_handler_t *handler,
 		}
 
 		/* Calculate keytag. */
+		const knot_rdata_t *rr = knot_rdataset_at(&dnskey_rrset->rrs, i);
 		uint16_t dnskey_key_tag =
-			knot_keytag(knot_rrset_rr_rdata(dnskey_rrset, i),
-		                    knot_rrset_rr_size(dnskey_rrset, i));
+			knot_keytag(knot_rdata_data(rr), knot_rdata_rdlen(rr));
 		if (key_tag_rrsig != dnskey_key_tag) {
 			continue;
 		}
diff --git a/src/libknot/dnssec/rrset-sign.c b/src/libknot/dnssec/rrset-sign.c
index 161cb4c6a25b620222d346469ac28790c912aaab..0b1635568e2780ffae51f57a4e3b5277bb455172 100644
--- a/src/libknot/dnssec/rrset-sign.c
+++ b/src/libknot/dnssec/rrset-sign.c
@@ -336,7 +336,8 @@ int knot_is_valid_signature(const knot_rrset_t *covered,
 
 	// identify fields in the signature being validated
 
-	uint8_t *rdata = knot_rrset_rr_rdata(rrsigs, pos);
+	const knot_rdata_t *rr = knot_rdataset_at(&rrsigs->rrs, pos);
+	uint8_t *rdata = knot_rdata_data(rr);
 	if (!rdata) {
 		return KNOT_EINVAL;
 	}
diff --git a/src/libknot/dnssec/sig0.c b/src/libknot/dnssec/sig0.c
index c16cc6a73c94cc5806d0fcbdb1fb162375279470..a8df423d77eeb412e0bc1de478d07495c694c81b 100644
--- a/src/libknot/dnssec/sig0.c
+++ b/src/libknot/dnssec/sig0.c
@@ -74,7 +74,8 @@ static uint8_t *sig0_create_rdata(knot_rrset_t *rrset, knot_dnssec_key_t *key)
 		return NULL;
 	}
 
-	return knot_rrset_rr_rdata(rrset, 0);
+	const knot_rdata_t *rr = knot_rdataset_at(&rrset->rrs, 0);
+	return knot_rdata_data(rr);
 }
 
 /*!
diff --git a/src/libknot/edns.c b/src/libknot/edns.c
index 855d51d54a32766b49c27283fcce7484af2caf04..fefdf746f3dfa5913897110eb9f9427633725cb8 100644
--- a/src/libknot/edns.c
+++ b/src/libknot/edns.c
@@ -86,9 +86,10 @@ int knot_edns_new_from_rr(knot_opt_rr_t *opt_rr, const knot_rrset_t *rrset)
 
 	int rc = 0;
 	dbg_edns_verb("Parsing options.\n");
-	uint16_t size = knot_rrset_rr_size(rrset, 0);
+	const knot_rdata_t *rr = knot_rdataset_at(&rrset->rrs, 0);
+	uint16_t size = knot_rdata_rdlen(rr);
 	if (size > 0) {
-		uint8_t *raw = knot_rrset_rr_rdata(rrset, 0);
+		uint8_t *raw = knot_rdata_data(rr);
 		size_t pos = 0;
 		while (pos < size) {
 			// ensure there is enough data to parse the OPTION CODE
diff --git a/src/libknot/rdata/tsig.c b/src/libknot/rdata/tsig.c
index 0f8832ccd88c7d1886f070ad4d6076e2aeac31dc..ccc86d4b286966d2efd64872a75d1b830749c5b5 100644
--- a/src/libknot/rdata/tsig.c
+++ b/src/libknot/rdata/tsig.c
@@ -57,14 +57,15 @@ typedef enum tsig_off_t {
  */
 static uint8_t* tsig_rdata_seek(const knot_rrset_t *rr, tsig_off_t id, size_t nb)
 {
-	uint8_t *rd = knot_rrset_rr_rdata(rr, 0);
+	const knot_rdata_t *rdata = knot_rdataset_at(&rr->rrs, 0);
+	uint8_t *rd = knot_rdata_data(rdata);
 	if (rd == NULL) {
 		return NULL;
 	}
 
 	/* TSIG RR names should be already sanitized on parse. */
 	int alg_len = knot_dname_size(rd);
-	uint16_t lim = knot_rrset_rr_size(rr, 0);
+	uint16_t lim = knot_rdata_rdlen(rdata);
 	if (lim < alg_len + 5 * sizeof(uint16_t)) {
 		dbg_tsig("TSIG: rdata: not enough items "
 		         "(has %"PRIu16", min %zu).\n",
@@ -224,7 +225,8 @@ int tsig_rdata_set_other_data(knot_rrset_t *tsig, uint16_t len,
 
 const knot_dname_t *tsig_rdata_alg_name(const knot_rrset_t *tsig)
 {
-	return knot_rrset_rr_rdata(tsig, 0);
+	const knot_rdata_t *rr = knot_rdataset_at(&tsig->rrs, 0);
+	return knot_rdata_data(rr);
 }
 
 knot_tsig_algorithm_t tsig_rdata_alg(const knot_rrset_t *tsig)
@@ -467,8 +469,9 @@ size_t tsig_wire_actsize(const knot_rrset_t *tsig)
 int tsig_rdata_is_ok(const knot_rrset_t *tsig)
 {
 	/*! \todo Check size, needs to check variable-length fields. */
+	const knot_rdata_t *rr = knot_rdataset_at(&tsig->rrs, 0);
 	return (tsig
-	        && knot_rrset_rr_rdata(tsig, 0) != NULL
+	        && knot_rdata_data(rr) != NULL
 	        && tsig_rdata_seek(tsig, TSIG_OTHER_O, 0) != NULL
 	        && tsig_rdata_alg_name(tsig) != NULL
 	        && tsig_rdata_time_signed(tsig) != 0);
diff --git a/src/libknot/rrset-dump.c b/src/libknot/rrset-dump.c
index d8ec8ac8c2044189b5158fe31a3fa392d0aa4dd6..257dd0148719abade672dcadbc5f94f4513f2513 100644
--- a/src/libknot/rrset-dump.c
+++ b/src/libknot/rrset-dump.c
@@ -1792,8 +1792,9 @@ int knot_rrset_txt_dump_data(const knot_rrset_t      *rrset,
 		return KNOT_EINVAL;
 	}
 
-	uint8_t   *data = knot_rrset_rr_rdata(rrset, pos);
-	uint16_t  data_len = knot_rrset_rr_size(rrset, pos);
+	const knot_rdata_t *rr = knot_rdataset_at(&rrset->rrs, pos);
+	uint8_t *data = knot_rdata_data(rr);
+	uint16_t data_len = knot_rdata_rdlen(rr);
 
 	int ret = 0;
 
diff --git a/src/libknot/rrset.c b/src/libknot/rrset.c
index fea075576533023085375cdb9e39104ea842d933..cb34e7d8fae5428a9104f7db4b95d9e7aaad944f 100644
--- a/src/libknot/rrset.c
+++ b/src/libknot/rrset.c
@@ -41,7 +41,8 @@ static uint16_t rrset_rdata_naptr_bin_chunk_size(const knot_rrset_t *rrset,
 	}
 
 	size_t size = 0;
-	uint8_t *rdata = knot_rrset_rr_rdata(rrset, pos);
+	const knot_rdata_t *rr = knot_rdataset_at(&rrset->rrs, pos);
+	uint8_t *rdata = knot_rdata_data(rr);
 	assert(rdata);
 
 	/* Two shorts at the beginning. */
@@ -60,10 +61,10 @@ static uint16_t rrset_rdata_naptr_bin_chunk_size(const knot_rrset_t *rrset,
 }
 
 static size_t rrset_rdata_remainder_size(const knot_rrset_t *rrset,
-                                         size_t offset, size_t pos)
+                                         uint16_t offset, size_t pos)
 {
-	size_t ret = knot_rrset_rr_size(rrset, pos) - offset;
-	return ret;
+	const knot_rdata_t *rr = knot_rdataset_at(&rrset->rrs, pos);
+	return knot_rdata_rdlen(rr) - offset;
 }
 
 static int knot_rrset_header_to_wire(const knot_rrset_t *rrset, uint32_t ttl,
@@ -167,7 +168,8 @@ static int knot_rrset_rdata_to_wire_one(const knot_rrset_t *rrset,
 	}
 
 	/* Get pointer into RDATA array. */
-	uint8_t *rdata = knot_rrset_rr_rdata(rrset, rdata_pos);
+	const knot_rdata_t *rr = knot_rdataset_at(&rrset->rrs, rdata_pos);
+	uint8_t *rdata = knot_rdata_data(rr);
 	assert(rdata);
 	/* Offset into one RDATA array. */
 	size_t offset = 0;
@@ -416,26 +418,6 @@ void knot_rrset_clear(knot_rrset_t *rrset, mm_ctx_t *mm)
 	}
 }
 
-uint8_t *knot_rrset_rr_rdata(const knot_rrset_t *rrset, size_t pos)
-{
-	knot_rdata_t *rr = knot_rdataset_at(&rrset->rrs, pos);
-	if (rr) {
-		return knot_rdata_data(rr);
-	} else {
-		return NULL;
-	}
-}
-
-uint16_t knot_rrset_rr_size(const knot_rrset_t *rrset, size_t pos)
-{
-	const knot_rdata_t *rr = knot_rdataset_at(&rrset->rrs, pos);
-	if (rr) {
-		return knot_rdata_rdlen(rr);
-	} else {
-		return 0;
-	}
-}
-
 uint32_t knot_rrset_rr_ttl(const knot_rrset_t *rrset, size_t pos)
 {
 	const knot_rdata_t *rr = knot_rdataset_at(&rrset->rrs, pos);
@@ -446,14 +428,6 @@ uint32_t knot_rrset_rr_ttl(const knot_rrset_t *rrset, size_t pos)
 	}
 }
 
-void knot_rrset_rr_set_ttl(const knot_rrset_t *rrset, size_t pos, uint32_t ttl)
-{
-	knot_rdata_t *rr = knot_rdataset_at(&rrset->rrs, pos);
-	if (rr) {
-		knot_rdata_set_ttl(rr, ttl);
-	}
-}
-
 int knot_rrset_to_wire(const knot_rrset_t *rrset, uint8_t *wire, size_t *size,
                        size_t max_size, uint16_t *rr_count, knot_compr_t *compr)
 {
diff --git a/src/libknot/rrset.h b/src/libknot/rrset.h
index 5f4572578e7ad07f5e9ba6a3144768e06a5f316d..db4fd2651c1b071a219cfc4550ab47fb9206557e 100644
--- a/src/libknot/rrset.h
+++ b/src/libknot/rrset.h
@@ -127,27 +127,6 @@ void knot_rrset_clear(knot_rrset_t *rrset, mm_ctx_t *mm);
 
 /* ----------- Getters / Setters (legacy, functionality in rdata_t) ------------ */
 
-/*!
- * \brief Returns RDATA of RR on given position.
- *
- * \param rrset  RRSet to get the RDATA from.
- * \param pos    Position of RR to get.
- *
- * \retval  NULL if no RDATA on rdata_pos exist.
- * \retval  Pointer to RDATA on given position if successfull.
- */
-uint8_t *knot_rrset_rr_rdata(const knot_rrset_t *rrset, size_t pos);
-
-/*!
- * \brief Returns size of an RR RDATA on a given position.
- *
- * \param rrset  RRSet holding RR RDATA.
- * \param pos    RR position.
- *
- * \return Item size.
- */
-uint16_t knot_rrset_rr_size(const knot_rrset_t *rrset, size_t pos);
-
 /*!
  * \brief Returns TTL of an RR on a given position.
  *
@@ -158,15 +137,6 @@ uint16_t knot_rrset_rr_size(const knot_rrset_t *rrset, size_t pos);
  */
 uint32_t knot_rrset_rr_ttl(const knot_rrset_t *rrset, size_t pos);
 
-/*!
- * \brief Sets TTL for RR on a given position.
- *
- * \param rrset  RRSet containing RR.
- * \param pos    RR position.
- * \param ttl    TTL to be set.
- */
-void knot_rrset_rr_set_ttl(const knot_rrset_t *rrset, size_t pos, uint32_t ttl);
-
 /* ---------- Wire conversions (legacy, to be done in knot_pkt_t) ----------- */
 
 /*!