diff --git a/src/dnslib/packet.c b/src/dnslib/packet.c
index 4195beacf5a0a9a0a51f04f12412154160799cc7..fd6441bfe2905b408518d12084fca72960e900bb 100644
--- a/src/dnslib/packet.c
+++ b/src/dnslib/packet.c
@@ -675,7 +675,6 @@ dnslib_packet_t *dnslib_packet_new(dnslib_packet_prealloc_type_t prealloc)
 int dnslib_packet_parse_from_wire(dnslib_packet_t *packet, uint8_t *wireformat,
                                   size_t size, int question_only)
 {
-	/*! \todo Implement! */
 	if (packet == NULL || wireformat == NULL) {
 		return DNSLIB_EBADARG;
 	}
@@ -819,7 +818,8 @@ const dnslib_rrset_t *dnslib_packet_additional_rrset(
 /*----------------------------------------------------------------------------*/
 
 int dnslib_packet_contains(const dnslib_packet_t *packet,
-                           const dnslib_rrset_t *rrset)
+                           const dnslib_rrset_t *rrset,
+                           dnslib_rrset_compare_type_t cmp)
 {
 	for (int i = 0; i < packet->header.ancount; ++i) {
 		if (packet->answer[i] == rrset) {
diff --git a/src/dnslib/packet.h b/src/dnslib/packet.h
index 5f645ea1a7c3fd166c913e6962062bab2b6de59c..70084385575d44cdd027c91b1837651021038173 100644
--- a/src/dnslib/packet.h
+++ b/src/dnslib/packet.h
@@ -185,8 +185,6 @@ uint16_t dnslib_packet_qtype(const dnslib_packet_t *packet);
  */
 uint16_t dnslib_packet_qclass(const dnslib_packet_t *packet);
 
-//int dnslib_packet_add_rrset_answer(dnslib_packet_t *packet);
-
 /*!
  * \brief Returns number of RRSets in Answer section of the packet.
  *
diff --git a/src/dnslib/rrset.c b/src/dnslib/rrset.c
index 9959d7624e73bdf64d32d638a77ded970eecca87..70dbf38e2055f50fadc95e5670d4bccbe661a377 100644
--- a/src/dnslib/rrset.c
+++ b/src/dnslib/rrset.c
@@ -140,12 +140,32 @@ const dnslib_rrset_t *dnslib_rrset_rrsigs(const dnslib_rrset_t *rrset)
 
 /*----------------------------------------------------------------------------*/
 
-int dnslib_rrset_compare_no_rdata(const dnslib_rrset_t *r1,
-                                  const dnslib_rrset_t *r2)
+int dnslib_rrset_compare(const dnslib_rrset_t *r1,
+                         const dnslib_rrset_t *r2,
+                         dnslib_rrset_compare_type_t cmp)
 {
-	return ((r1->rclass == r2->rclass)
-	        && (r1->type == r2->type)
-	        && dnslib_dname_compare(r1->owner, r2->owner) == 0);
+	if (cmp == DNSLIB_RRSET_COMPARE_PTR) {
+		return (r1 == r2);
+	}
+
+	int res = ((r1->rclass == r2->rclass)
+	           && (r1->type == r2->type)
+	           && dnslib_dname_compare(r1->owner, r2->owner) == 0);
+
+	if (cmp == DNSLIB_RRSET_COMPARE_WHOLE && res) {
+		dnslib_rrtype_descriptor_t *desc =
+			dnslib_rrtype_descriptor_by_type(r1->type);
+
+		if (desc == NULL) {
+			return 0;
+		}
+
+		/*! @todo Implement RDATA comparation */
+		res = res && dnslib_rdata_compare(r1->rdata, r2->rdata,
+		                                  desc->wireformat);
+	}
+
+	return res;
 }
 
 /*----------------------------------------------------------------------------*/
diff --git a/src/dnslib/rrset.h b/src/dnslib/rrset.h
index 9748d8e8daa69a510917f9537995fee1694da7e1..5f4b465919fd2bf918f26b70874f408b58faf48d 100644
--- a/src/dnslib/rrset.h
+++ b/src/dnslib/rrset.h
@@ -46,6 +46,14 @@ struct dnslib_rrset {
 
 typedef struct dnslib_rrset dnslib_rrset_t;
 
+/*----------------------------------------------------------------------------*/
+
+typedef enum {
+	DNSLIB_RRSET_COMPARE_PTR,
+	DNSLIB_RRSET_COMPARE_HEADER,
+	DNSLIB_RRSET_COMPARE_WHOLE
+} dnslib_rrset_compare_type_t;
+
 /*----------------------------------------------------------------------------*/
 /*!
  * \brief Creates a new RRSet with the given properties.
@@ -167,8 +175,9 @@ dnslib_rdata_t *dnslib_rrset_get_rdata(dnslib_rrset_t *rrset);
  */
 const dnslib_rrset_t *dnslib_rrset_rrsigs(const dnslib_rrset_t *rrset);
 
-int dnslib_rrset_compare_no_rdata(const dnslib_rrset_t *r1,
-                                  const dnslib_rrset_t *r2);
+int dnslib_rrset_compare(const dnslib_rrset_t *r1,
+                         const dnslib_rrset_t *r2,
+                         dnslib_rrset_compare_type_t cmp);
 
 /*!
  * \brief Destroys the RRSet structure.
diff --git a/src/knot/server/name-server.h b/src/knot/server/name-server.h
index ad888f02f702a8d4a2bf22f4bfb9046845a6fd49..0a8ecb0c8d22bb8db09226a64a0a26b8c10d204f 100644
--- a/src/knot/server/name-server.h
+++ b/src/knot/server/name-server.h
@@ -170,7 +170,6 @@ int ns_answer_normal(ns_nameserver_t *nameserver, dnslib_response_t *resp,
  * \retval KNOT_ENOMEM
  * \retval KNOT_ERROR
  *
- * \todo Implement.
  * \todo Maybe the place for the wire format should be passed in as in
  *       the ns_answer_request() function...?
  */