diff --git a/Knot.files b/Knot.files
index 5c6a988b3bc83a0862f07e0291a8b9bc7d2db566..0e97bd05764ae16f091fd70f0c434c4fb8a6a1d6 100644
--- a/Knot.files
+++ b/Knot.files
@@ -9,6 +9,9 @@ src/common/slab/malloc.h
 src/common/slab/slab.c
 src/common/slab/slab.h
 src/common/slab/alloc-common.h
+src/common/libtap/tap.c
+src/common/libtap/tap.h
+src/common/libtap/tap_unit.h
 src/common/lists.h
 src/common/lists.c
 src/common/base32.h
@@ -72,6 +75,25 @@ src/dnslib/hash/hash-functions.c
 src/dnslib/hash/hash-functions.h
 src/dnslib/hash/universal-system.c
 src/dnslib/hash/universal-system.h
+src/dnslib/tests/dnslib/dname_tests.c
+src/dnslib/tests/dnslib/dname_tests.h
+src/dnslib/tests/dnslib/edns_tests.c
+src/dnslib/tests/dnslib/edns_tests.h
+src/dnslib/tests/dnslib/node_tests.c
+src/dnslib/tests/dnslib/node_tests.h
+src/dnslib/tests/dnslib/rdata_tests.c
+src/dnslib/tests/dnslib/rdata_tests.h
+src/dnslib/tests/dnslib/response_tests.c
+src/dnslib/tests/dnslib/response_tests.h
+src/dnslib/tests/dnslib/rrset_tests.c
+src/dnslib/tests/dnslib/rrset_tests.h
+src/dnslib/tests/dnslib/zone_tests.c
+src/dnslib/tests/dnslib/zone_tests.h
+src/dnslib/tests/dnslib/zonedb_tests.c
+src/dnslib/tests/dnslib/zonedb_tests.h
+src/dnslib/tests/dnslib/cuckoo_tests.c
+src/dnslib/tests/dnslib/cuckoo_tests.h
+src/dnslib/tests/unittests_dnslib.c
 src/zoneparser/zoneparser_main.c
 src/zoneparser/parser-descriptor.h
 src/zoneparser/parser-descriptor.c
@@ -123,35 +145,13 @@ src/tests/common/skiplist_tests.c
 src/tests/common/skiplist_tests.h
 src/tests/common/slab_tests.c
 src/tests/common/slab_tests.h
-src/tests/dnslib/dname_tests.c
-src/tests/dnslib/dname_tests.h
-src/tests/dnslib/edns_tests.c
-src/tests/dnslib/edns_tests.h
-src/tests/dnslib/node_tests.c
-src/tests/dnslib/node_tests.h
-src/tests/dnslib/rdata_tests.c
-src/tests/dnslib/rdata_tests.h
-src/tests/dnslib/response_tests.c
-src/tests/dnslib/response_tests.h
-src/tests/dnslib/rrset_tests.c
-src/tests/dnslib/rrset_tests.h
-src/tests/dnslib/zone_tests.c
-src/tests/dnslib/zone_tests.h
-src/tests/dnslib/zonedb_tests.c
-src/tests/dnslib/zonedb_tests.h
-src/tests/dnslib/cuckoo_tests.c
-src/tests/dnslib/cuckoo_tests.h
 src/tests/knot/dthreads_tests.c
 src/tests/knot/dthreads_tests.h
 src/tests/knot/conf_tests.c
 src/tests/knot/conf_tests.h
 src/tests/knot/server_tests.c
 src/tests/knot/server_tests.h
-src/tests/libtap/tap.c
-src/tests/libtap/tap.h
-src/tests/libtap/tap_unit.h
 src/tests/unittests_main.c
-src/tests/template_tests.c
 tests/querytcp.c
 src/zoneparser/tests/unittests_zp_main.c
 src/zoneparser/tests/zcompile_tests.c
diff --git a/src/Makefile.am b/src/Makefile.am
index a5a334db85bf80651f907f83872ae143ea1a7f49..6dd334919738b384f772648cbf7dd75485b4dc3d 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,6 +1,6 @@
 ACLOCAL_AMFLAGS = -I ../m4
 bin_PROGRAMS = knotc
-libexec_PROGRAMS = knot-zcompile unittests unittests-zcompile
+libexec_PROGRAMS = knot-zcompile unittests unittests-zcompile unittests-dnslib
 sbin_PROGRAMS = knotd
 
 # $(YACC) will generate header file
@@ -12,17 +12,17 @@ libknot_la_LFLAGS = # TODO: reentrant parser, prefix
 LDADD = libknot.la @LIBOBJS@
 
 BUILT_SOURCES =					\
-	tests/dnslib/parsed_data.rc		\
-	tests/dnslib/raw_data_queries.rc	\
-	tests/dnslib/raw_data.rc		\
-	tests/dnslib/parsed_data_queries.rc     \
+	dnslib/tests/parsed_data.rc		\
+	dnslib/tests/raw_data_queries.rc	\
+	dnslib/tests/raw_data.rc		\
+	dnslib/tests/parsed_data_queries.rc     \
 	tests/sample_conf.rc
 
 CLEANFILES =					\
-	tests/dnslib/parsed_data.rc		\
-	tests/dnslib/raw_data_queries.rc	\
-	tests/dnslib/raw_data.rc		\
-	tests/dnslib/parsed_data_queries.rc     \
+	dnslib/tests/parsed_data.rc		\
+	dnslib/tests/raw_data_queries.rc	\
+	dnslib/tests/raw_data.rc		\
+	dnslib/tests/parsed_data_queries.rc     \
 	tests/sample_conf.rc                    \
 	zparser.h				\
 	zparser.c				\
@@ -46,24 +46,26 @@ knot_zcompile_SOURCES =			\
 	zoneparser/parser-descriptor.c
 
 unittests_SOURCES =				\
-	tests/libtap/tap.c			\
 	tests/common/da_tests.c			\
 	tests/common/skiplist_tests.c		\
 	tests/common/slab_tests.c		\
-	tests/dnslib/cuckoo_tests.c		\
-	tests/dnslib/dname_tests.c		\
-	tests/dnslib/edns_tests.c		\
-	tests/dnslib/node_tests.c		\
-	tests/dnslib/rdata_tests.c		\
-	tests/dnslib/response_tests.c		\
-	tests/dnslib/rrset_tests.c		\
-	tests/dnslib/zone_tests.c		\
-	tests/dnslib/zonedb_tests.c		\
 	tests/knot/conf_tests.c			\
 	tests/knot/dthreads_tests.c		\
 	tests/knot/server_tests.c		\
 	tests/unittests_main.c
 
+unittests_dnslib_SOURCES =			\
+	dnslib/tests/dnslib/cuckoo_tests.c	\
+	dnslib/tests/dnslib/dname_tests.c	\
+	dnslib/tests/dnslib/edns_tests.c	\
+	dnslib/tests/dnslib/node_tests.c	\
+	dnslib/tests/dnslib/rdata_tests.c	\
+	dnslib/tests/dnslib/response_tests.c	\
+	dnslib/tests/dnslib/rrset_tests.c	\
+	dnslib/tests/dnslib/zone_tests.c	\
+	dnslib/tests/dnslib/zonedb_tests.c	\
+	dnslib/tests/unittests_dnslib.c
+
 unittests_zcompile_SOURCES =		\
 	zoneparser/parser-util.h		\
 	zoneparser/parser-descriptor.h		\
@@ -73,14 +75,13 @@ unittests_zcompile_SOURCES =		\
 	zoneparser/zoneparser.c			\
 	zoneparser/parser-util.c		\
 	zoneparser/parser-descriptor.c		\
-	tests/libtap/tap.c			\
 	zoneparser/tests/unittests_zp_main.c
 
 nodist_unittests_SOURCES =			\
-	tests/dnslib/parsed_data.rc		\
-	tests/dnslib/raw_data_queries.rc	\
-	tests/dnslib/raw_data.rc		\
-	tests/dnslib/parsed_data_queries.rc     \
+	dnslib/tests/parsed_data.rc		\
+	dnslib/tests/raw_data_queries.rc	\
+	dnslib/tests/raw_data.rc		\
+	dnslib/tests/parsed_data_queries.rc     \
 	tests/sample_conf.rc
 
 knotd_SOURCES =					\
@@ -92,6 +93,9 @@ libknot_la_SOURCES =				\
 	common/slab/malloc.c				\
 	common/slab/slab.h			        \
 	common/slab/malloc.h				\
+	common/libtap/tap.c			\
+	common/libtap/tap.h			\
+	common/tap_unit.h			\
 	common/lists.c	            		\
 	common/base32.c				\
 	common/lists.h	            		\
@@ -177,25 +181,23 @@ libknot_la_SOURCES =				\
 	knot/server/udp-handler.h			\
 	knot/server/tcp-handler.h			\
 	knot/server/dthreads.h			\
-	knot/server/server.h				\
-	tests/libtap/tap.h			\
-	tests/tap_unit.h
+	knot/server/server.h
 
 libknot_la_LIBADD = @LIBOBJS@
 
 # automake complains on % rules:
 #   `%'-style pattern rules are a GNU make extension
 
-tests/dnslib/parsed_data.rc: tests/files/parsed_data
+dnslib/tests/parsed_data.rc: dnslib/tests/files/parsed_data
 	../resource.sh $< >$@
 
-tests/dnslib/parsed_data_queries.rc: tests/files/parsed_data_queries
+dnslib/tests/parsed_data_queries.rc: dnslib/tests/files/parsed_data_queries
 	../resource.sh $< >$@
 
-tests/dnslib/raw_data_queries.rc: tests/files/raw_data_queries
+dnslib/tests/raw_data_queries.rc: dnslib/tests/files/raw_data_queries
 	../resource.sh $< >$@
 
-tests/dnslib/raw_data.rc: tests/files/raw_data
+dnslib/tests/raw_data.rc: dnslib/tests/files/raw_data
 	../resource.sh $< >$@
 
 tests/sample_conf.rc: tests/files/sample_conf
diff --git a/src/tests/libtap/README b/src/common/libtap/README
similarity index 100%
rename from src/tests/libtap/README
rename to src/common/libtap/README
diff --git a/src/tests/libtap/tap.c b/src/common/libtap/tap.c
similarity index 100%
rename from src/tests/libtap/tap.c
rename to src/common/libtap/tap.c
diff --git a/src/tests/libtap/tap.h b/src/common/libtap/tap.h
similarity index 100%
rename from src/tests/libtap/tap.h
rename to src/common/libtap/tap.h
diff --git a/src/common/libtap/tap_unit.h b/src/common/libtap/tap_unit.h
new file mode 100644
index 0000000000000000000000000000000000000000..0a008ce7c7e296cf752dc172618eb94e9680eef1
--- /dev/null
+++ b/src/common/libtap/tap_unit.h
@@ -0,0 +1,79 @@
+/*!
+ * \file tap_unit.h
+ * \author Marek Vavrusa <marek.vavusa@nic.cz>
+ *
+ * \brief libtap test unit.
+ *
+ * Contains description of a single test unit API.
+ *
+ * Export unit_api in each module header file,
+ * and set function pointer to according test routines.
+ *
+ * <b>Example code for myunit.h</b>
+ * \code
+ * #ifndef MYUNIT_TEST_H
+ * #define MYUNIT_TEST_H
+ *
+ * // Export unittest symbol
+ * unit_api mymodule;
+ *
+ * #endif // MYUNIT_TEST_H
+ * \endcode
+ *
+ * <b>Example code for myunit.c</b>
+ * \code
+ * #include "myunit.h"
+ *
+ * // Function to return unit test count
+ * int myunit_count(int argc, char *argv[]) {
+ *     return 1; // Number of tests in this unit
+ * }
+ *
+ * // Function to perform tests
+ * int myunit_run(int argc, char *argv[]) {
+ *     // 1. test
+ *     ok(1 == 1, "test OK");
+ *     return 0;
+ * }
+ *
+ * // Declare module API
+ * unit_api mymodule = {
+ *     "My module",
+ *     &myunit_count,
+ *     &myunit_run
+ * };
+ * \endcode
+ *
+ * To incorporate test, add it to unit tests main().
+ *
+ * See https://github.com/zorgnax/libtap for libtap API reference.
+ *
+ * \addtogroup tests
+ * @{
+ */
+
+#ifndef _TAP_UNIT_H_
+#define _TAP_UNIT_H_
+
+#include "common/libtap/tap.h"
+
+/*! \brief Pointer to function for unit_api. */
+typedef int(unitapi_f)(int, char*[]);
+
+
+/*!
+ * \brief Basic Unit APIs.
+ *
+ * Each unit should have one global variable with
+ * an initialized instance of unit_api.
+ */
+typedef struct {
+	const char *name;  /*!< Test unit name. */
+	unitapi_f  *count; /*!< Function to calculate number of tests. */
+	unitapi_f  *run;   /*!< Function to run unit tests. */
+} unit_api;
+
+#endif // _TAP_UNIT_H_
+
+/*! @} */
+
diff --git a/src/tests/dnslib/cuckoo_tests.c b/src/dnslib/tests/dnslib/cuckoo_tests.c
similarity index 99%
rename from src/tests/dnslib/cuckoo_tests.c
rename to src/dnslib/tests/dnslib/cuckoo_tests.c
index d09409106e5a4d01e507bfcc48221d2243700831..f46118376997fc7f01103f0e4b5be81ced32db83 100644
--- a/src/tests/dnslib/cuckoo_tests.c
+++ b/src/dnslib/tests/dnslib/cuckoo_tests.c
@@ -1,7 +1,7 @@
 #include <time.h>
 #include <assert.h>
 
-#include "tests/dnslib/cuckoo_tests.h"
+#include "dnslib/tests/dnslib/cuckoo_tests.h"
 #include "dnslib/hash/cuckoo-hash-table.h"
 
 #define CT_TEST_REHASH
diff --git a/src/tests/dnslib/cuckoo_tests.h b/src/dnslib/tests/dnslib/cuckoo_tests.h
similarity index 79%
rename from src/tests/dnslib/cuckoo_tests.h
rename to src/dnslib/tests/dnslib/cuckoo_tests.h
index 7b1b846320b974e452f6776a009c36f6dfd70959..56400ba164f74b3580fd37f263f22163c7b8043b 100644
--- a/src/tests/dnslib/cuckoo_tests.h
+++ b/src/dnslib/tests/dnslib/cuckoo_tests.h
@@ -1,7 +1,7 @@
 #ifndef _KNOT_CUCKOO_TESTS_H_
 #define _KNOT_CUCKOO_TESTS_H_
 
-#include "tests/libtap/tap_unit.h"
+#include "common/libtap/tap_unit.h"
 
 /* Unit API. */
 unit_api cuckoo_tests_api;
diff --git a/src/tests/dnslib/dname_tests.c b/src/dnslib/tests/dnslib/dname_tests.c
similarity index 99%
rename from src/tests/dnslib/dname_tests.c
rename to src/dnslib/tests/dnslib/dname_tests.c
index 8f98d385c8cb81c394fc06a6038aa862f74434ad..6115ae410a8010ae86bfcbf6a0fe733a894c5992 100644
--- a/src/tests/dnslib/dname_tests.c
+++ b/src/dnslib/tests/dnslib/dname_tests.c
@@ -1,7 +1,7 @@
 #include <string.h>
 #include <assert.h>
 
-#include "tests/dnslib/dname_tests.h"
+#include "dnslib/tests/dnslib/dname_tests.h"
 #include "dnslib/dname.h"
 #include "dnslib/node.h"
 
diff --git a/src/tests/dnslib/dname_tests.h b/src/dnslib/tests/dnslib/dname_tests.h
similarity index 79%
rename from src/tests/dnslib/dname_tests.h
rename to src/dnslib/tests/dnslib/dname_tests.h
index 7fd008ff7e98d779d74d8d46efdaacc5ed234e37..6f1281792808279b20ac7c082ebc447db30e015d 100644
--- a/src/tests/dnslib/dname_tests.h
+++ b/src/dnslib/tests/dnslib/dname_tests.h
@@ -1,7 +1,7 @@
 #ifndef _KNOT_DNAME_TESTS_H_
 #define _KNOT_DNAME_TESTS_H_
 
-#include "tests/libtap/tap_unit.h"
+#include "common/libtap/tap_unit.h"
 
 /* Unit API. */
 unit_api dname_tests_api;
diff --git a/src/tests/dnslib/edns_tests.c b/src/dnslib/tests/dnslib/edns_tests.c
similarity index 99%
rename from src/tests/dnslib/edns_tests.c
rename to src/dnslib/tests/dnslib/edns_tests.c
index cb8fdfa9b9b262b78cf17dd819da13ced523aca4..ba69517e01b068b45e3f59506154eb7284d4a6c7 100644
--- a/src/tests/dnslib/edns_tests.c
+++ b/src/dnslib/tests/dnslib/edns_tests.c
@@ -1,6 +1,6 @@
 #include <assert.h>
 
-#include "tests/dnslib/edns_tests.h"
+#include "dnslib/tests/dnslib/edns_tests.h"
 #include "dnslib/dnslib-common.h"
 #include "dnslib/edns.h"
 
diff --git a/src/tests/dnslib/edns_tests.h b/src/dnslib/tests/dnslib/edns_tests.h
similarity index 89%
rename from src/tests/dnslib/edns_tests.h
rename to src/dnslib/tests/dnslib/edns_tests.h
index c61f1f85bf379761faf8097dde5bbbf8133e474d..d79cae57072ca730825e17a2d57970d93fc8373c 100644
--- a/src/tests/dnslib/edns_tests.h
+++ b/src/dnslib/tests/dnslib/edns_tests.h
@@ -11,7 +11,7 @@
 #ifndef _KNOT_EDNS_TESTS_H_
 #define _KNOT_EDNS_TESTS_H_
 
-#include "tests/libtap/tap_unit.h"
+#include "common/libtap/tap_unit.h"
 
 /* Unit API. */
 unit_api edns_tests_api;
diff --git a/src/tests/dnslib/node_tests.c b/src/dnslib/tests/dnslib/node_tests.c
similarity index 99%
rename from src/tests/dnslib/node_tests.c
rename to src/dnslib/tests/dnslib/node_tests.c
index fc49d9bbec1298348d19e0440aed8a2c9dfdecf0..c62bec0f09ea5d678fb6e32d23eb768b7cbc5183 100644
--- a/src/tests/dnslib/node_tests.c
+++ b/src/dnslib/tests/dnslib/node_tests.c
@@ -1,4 +1,4 @@
-#include "tests/dnslib/node_tests.h"
+#include "dnslib/tests/dnslib/node_tests.h"
 #include "dnslib/dname.h"
 #include "dnslib/node.h"
 #include "dnslib/descriptor.h"
diff --git a/src/tests/dnslib/node_tests.h b/src/dnslib/tests/dnslib/node_tests.h
similarity index 78%
rename from src/tests/dnslib/node_tests.h
rename to src/dnslib/tests/dnslib/node_tests.h
index a4b4af01fabe00a831bb062ec2007dee2a2ea368..eebaf6934b8c040a8740111b92561f45c4b09b95 100644
--- a/src/tests/dnslib/node_tests.h
+++ b/src/dnslib/tests/dnslib/node_tests.h
@@ -1,7 +1,7 @@
 #ifndef _KNOT_NODE_TESTS_H_
 #define _KNOT_NODE_TESTS_H_
 
-#include "tests/libtap/tap_unit.h"
+#include "common/libtap/tap_unit.h"
 
 /* Unit API. */
 unit_api node_tests_api;
diff --git a/src/tests/dnslib/rdata_tests.c b/src/dnslib/tests/dnslib/rdata_tests.c
similarity index 99%
rename from src/tests/dnslib/rdata_tests.c
rename to src/dnslib/tests/dnslib/rdata_tests.c
index a0beda9b863db66889c36bc298c05cebf69342a9..340ca441b58d3bd3789fe8f1faebb38457042683 100644
--- a/src/tests/dnslib/rdata_tests.c
+++ b/src/dnslib/tests/dnslib/rdata_tests.c
@@ -1,7 +1,7 @@
 #include <stdlib.h>
 #include <assert.h>
 
-#include "tests/dnslib/rdata_tests.h"
+#include "dnslib/tests/dnslib/rdata_tests.h"
 #include "dnslib/dnslib-common.h"
 #include "dnslib/rdata.h"
 #include "dnslib/descriptor.h"
diff --git a/src/tests/dnslib/rdata_tests.h b/src/dnslib/tests/dnslib/rdata_tests.h
similarity index 97%
rename from src/tests/dnslib/rdata_tests.h
rename to src/dnslib/tests/dnslib/rdata_tests.h
index c409b81829f93188ba38a62fe87e2a9f88a00d4f..a3930cab0db985ddda2659ca3d8896febf4d1e48 100644
--- a/src/tests/dnslib/rdata_tests.h
+++ b/src/dnslib/tests/dnslib/rdata_tests.h
@@ -29,7 +29,7 @@
 #ifndef _KNOT_RDATA_TESTS_H_
 #define _KNOT_RDATA_TESTS_H_
 
-#include "tests/libtap/tap_unit.h"
+#include "common/libtap/tap_unit.h"
 
 /* Unit API. */
 unit_api rdata_tests_api;
diff --git a/src/tests/dnslib/response_tests.c b/src/dnslib/tests/dnslib/response_tests.c
similarity index 99%
rename from src/tests/dnslib/response_tests.c
rename to src/dnslib/tests/dnslib/response_tests.c
index 44a96074eb70422567e11ae8aaf172867ad60f4d..25d8151f2eab20ba46698855ab88f53173062ca2 100644
--- a/src/tests/dnslib/response_tests.c
+++ b/src/dnslib/tests/dnslib/response_tests.c
@@ -6,7 +6,7 @@
 #endif
 
 //#define RESP_TEST_DEBUG
-#include "tests/dnslib/response_tests.h"
+#include "dnslib/tests/dnslib/response_tests.h"
 #include "dnslib/dnslib-common.h"
 #include "dnslib/response.h"
 #include "dnslib/rdata.h"
@@ -20,10 +20,10 @@
  * Resources
  * \note .rc files are generated on compile-time.
  */
-#include "tests/dnslib/parsed_data_queries.rc"
-#include "tests/dnslib/parsed_data.rc"
-#include "tests/dnslib/raw_data_queries.rc"
-#include "tests/dnslib/raw_data.rc"
+#include "dnslib/tests/parsed_data_queries.rc"
+#include "dnslib/tests/parsed_data.rc"
+#include "dnslib/tests/raw_data_queries.rc"
+#include "dnslib/tests/raw_data.rc"
 
 static int dnslib_response_tests_count(int argc, char *argv[]);
 static int dnslib_response_tests_run(int argc, char *argv[]);
diff --git a/src/tests/dnslib/response_tests.h b/src/dnslib/tests/dnslib/response_tests.h
similarity index 91%
rename from src/tests/dnslib/response_tests.h
rename to src/dnslib/tests/dnslib/response_tests.h
index 3d11996432fb58616274e91f07d2223c8d1c8f0b..24c62cba2d492edfc0dc88215b326df8742b0309 100644
--- a/src/tests/dnslib/response_tests.h
+++ b/src/dnslib/tests/dnslib/response_tests.h
@@ -12,7 +12,7 @@
 #ifndef _KNOT_RESPONSE_TESTS_H_
 #define _KNOT_RESPONSE_TESTS_H_
 
-#include "tests/libtap/tap_unit.h"
+#include "common/libtap/tap_unit.h"
 
 /* Unit API. */
 unit_api response_tests_api;
diff --git a/src/tests/dnslib/rrset_tests.c b/src/dnslib/tests/dnslib/rrset_tests.c
similarity index 99%
rename from src/tests/dnslib/rrset_tests.c
rename to src/dnslib/tests/dnslib/rrset_tests.c
index f1f9a3be3a3dc12339d31cbb9e1fa383d905dfa2..1ee13d555e8fc8b96b9c7e1c60c1482b1ca771bb 100644
--- a/src/tests/dnslib/rrset_tests.c
+++ b/src/dnslib/tests/dnslib/rrset_tests.c
@@ -1,6 +1,6 @@
 #include <assert.h>
 
-#include "tests/dnslib/rrset_tests.h"
+#include "dnslib/tests/dnslib/rrset_tests.h"
 #include "dnslib/dnslib-common.h"
 #include "dnslib/descriptor.h"
 #include "dnslib/rrset.h"
diff --git a/src/tests/dnslib/rrset_tests.h b/src/dnslib/tests/dnslib/rrset_tests.h
similarity index 89%
rename from src/tests/dnslib/rrset_tests.h
rename to src/dnslib/tests/dnslib/rrset_tests.h
index 1c69c5c2b857ec431a643a28b8292d81ddf0174e..7491efaef4c1fdc4cf65d94039901544dc3597dd 100644
--- a/src/tests/dnslib/rrset_tests.h
+++ b/src/dnslib/tests/dnslib/rrset_tests.h
@@ -11,7 +11,7 @@
 #ifndef _KNOT_RRSET_TESTS_H_
 #define _KNOT_RRSET_TESTS_H_
 
-#include "tests/libtap/tap_unit.h"
+#include "common/libtap/tap_unit.h"
 
 /* Unit API. */
 unit_api rrset_tests_api;
diff --git a/src/tests/dnslib/zone_tests.c b/src/dnslib/tests/dnslib/zone_tests.c
similarity index 99%
rename from src/tests/dnslib/zone_tests.c
rename to src/dnslib/tests/dnslib/zone_tests.c
index 1544e1e4b41ef3cfa2b80e9c6a12e797a51161e5..0e43be32d8d4298e535cbb6968a2d9c65ccf8579 100644
--- a/src/tests/dnslib/zone_tests.c
+++ b/src/dnslib/tests/dnslib/zone_tests.c
@@ -1,6 +1,6 @@
 #include <assert.h>
 
-#include "tests/dnslib/zone_tests.h"
+#include "dnslib/tests/dnslib/zone_tests.h"
 #include "dnslib/dnslib-common.h"
 #include "dnslib/zone.h"
 #include "dnslib/node.h"
diff --git a/src/tests/dnslib/zone_tests.h b/src/dnslib/tests/dnslib/zone_tests.h
similarity index 78%
rename from src/tests/dnslib/zone_tests.h
rename to src/dnslib/tests/dnslib/zone_tests.h
index 98ccd420845d68f9d226168a65e62b85f3e3100b..6b57dc7ec8e3022ef87dd4998e9bc98d87b4c48a 100644
--- a/src/tests/dnslib/zone_tests.h
+++ b/src/dnslib/tests/dnslib/zone_tests.h
@@ -1,7 +1,7 @@
 #ifndef _KNOT_ZONE_TESTS_H_
 #define _KNOT_ZONE_TESTS_H_
 
-#include "tests/libtap/tap_unit.h"
+#include "common/libtap/tap_unit.h"
 
 /* Unit API. */
 unit_api zone_tests_api;
diff --git a/src/tests/dnslib/zonedb_tests.c b/src/dnslib/tests/dnslib/zonedb_tests.c
similarity index 92%
rename from src/tests/dnslib/zonedb_tests.c
rename to src/dnslib/tests/dnslib/zonedb_tests.c
index 18f4fe45f810bc2826ef37a153eaa0cd9e32f2e0..cab5c43a67c284e0a56fa4302a78670f2b391969 100644
--- a/src/tests/dnslib/zonedb_tests.c
+++ b/src/dnslib/tests/dnslib/zonedb_tests.c
@@ -1,4 +1,4 @@
-#include "tests/dnslib/zonedb_tests.h"
+#include "dnslib/tests/dnslib/zonedb_tests.h"
 
 
 static int zonedb_tests_count(int argc, char *argv[]);
diff --git a/src/tests/dnslib/zonedb_tests.h b/src/dnslib/tests/dnslib/zonedb_tests.h
similarity index 79%
rename from src/tests/dnslib/zonedb_tests.h
rename to src/dnslib/tests/dnslib/zonedb_tests.h
index 16affd55f3f88eeb7ab8d1643792cb1ab3da6dc7..2499dad25edf412c158b56f747e1f18816ef0624 100644
--- a/src/tests/dnslib/zonedb_tests.h
+++ b/src/dnslib/tests/dnslib/zonedb_tests.h
@@ -1,7 +1,7 @@
 #ifndef _KNOT_ZONEDB_TESTS_H_
 #define _KNOT_ZONEDB_TESTS_H_
 
-#include "tests/libtap/tap_unit.h"
+#include "common/libtap/tap_unit.h"
 
 /* Unit API. */
 unit_api zonedb_tests_api;
diff --git a/src/tests/files/parsed_data b/src/dnslib/tests/files/parsed_data
similarity index 100%
rename from src/tests/files/parsed_data
rename to src/dnslib/tests/files/parsed_data
diff --git a/src/tests/files/parsed_data_queries b/src/dnslib/tests/files/parsed_data_queries
similarity index 100%
rename from src/tests/files/parsed_data_queries
rename to src/dnslib/tests/files/parsed_data_queries
diff --git a/src/tests/files/raw_data b/src/dnslib/tests/files/raw_data
similarity index 100%
rename from src/tests/files/raw_data
rename to src/dnslib/tests/files/raw_data
diff --git a/src/tests/files/raw_data_queries b/src/dnslib/tests/files/raw_data_queries
similarity index 100%
rename from src/tests/files/raw_data_queries
rename to src/dnslib/tests/files/raw_data_queries
diff --git a/src/dnslib/tests/unittests_dnslib.c b/src/dnslib/tests/unittests_dnslib.c
new file mode 100644
index 0000000000000000000000000000000000000000..7f3067dcb5cc898d185f827908d877ed9d6e4726
--- /dev/null
+++ b/src/dnslib/tests/unittests_dnslib.c
@@ -0,0 +1,63 @@
+#include <config.h>
+#include "knot/common.h"
+#include "common/libtap/tap_unit.h"
+
+// Units to test
+#include "dnslib/cuckoo_tests.h"
+#include "dnslib/dname_tests.h"
+#include "dnslib/edns_tests.h"
+#include "dnslib/node_tests.h"
+#include "dnslib/rdata_tests.h"
+#include "dnslib/response_tests.h"
+#include "dnslib/rrset_tests.h"
+#include "dnslib/zone_tests.h"
+#include "dnslib/zonedb_tests.h"
+
+// Run all loaded units
+int main(int argc, char *argv[])
+{
+	// Open log
+	log_init(LOG_UPTO(LOG_ERR), LOG_MASK(LOG_ERR) | LOG_MASK(LOG_WARNING));
+
+	// Build test set
+	unit_api *tests[] = {
+
+		/* DNS units */
+		&cuckoo_tests_api,   //! Cuckoo hashing unit
+		&dname_tests_api,    //! DNS library (dname) unit
+		&edns_tests_api,     //! DNS library (EDNS0) unit
+		&node_tests_api,     //! DNS library (node) unit
+		&rdata_tests_api,    //! DNS library (rdata) unit
+		&response_tests_api, //! DNS library (response) unit
+		&rrset_tests_api,    //! DNS library (rrset) unit
+		&zone_tests_api,     //! DNS library (zone) unit
+		&zonedb_tests_api,   //! DNS library (zonedb) unit
+	};
+
+	// Plan number of tests
+	int id = 0;
+	int test_count = 0;
+	note("Units:");
+	while (tests[id] != NULL) {
+		note("- %s : %d tests", tests[id]->name,
+		     tests[id]->count(argc, argv));
+		test_count += tests[id]->count(argc, argv);
+		++id;
+	}
+
+	plan(test_count);
+
+	// Run tests
+	id = 0;
+	while (tests[id] != NULL) {
+		diag("Testing unit: %s", tests[id]->name);
+		tests[id]->run(argc, argv);
+		++id;
+	}
+
+	log_close();
+
+	// Evaluate
+	return exit_status();
+}
+
diff --git a/src/tests/common/da_tests.h b/src/tests/common/da_tests.h
index de6a3ecaee549dcf27f3ce9a2229d230f019aa5a..5237ce20155e0b18b5eff9e5e5284f545a6765c1 100644
--- a/src/tests/common/da_tests.h
+++ b/src/tests/common/da_tests.h
@@ -1,7 +1,7 @@
 #ifndef _KNOT_DA_TESTS_H_
 #define _KNOT_DA_TESTS_H_
 
-#include "tests/libtap/tap_unit.h"
+#include "common/libtap/tap_unit.h"
 
 /* Unit API. */
 unit_api da_tests_api;
diff --git a/src/tests/common/skiplist_tests.h b/src/tests/common/skiplist_tests.h
index 676cf771261b58b30ccaa87478fd1fb5ab391dcb..e18ff80bf4869e443545c9209507040715fd8f98 100644
--- a/src/tests/common/skiplist_tests.h
+++ b/src/tests/common/skiplist_tests.h
@@ -1,7 +1,7 @@
 #ifndef _KNOT_SKIPLIST_TESTS_H_
 #define _KNOT_SKIPLIST_TESTS_H_
 
-#include "tests/libtap/tap_unit.h"
+#include "common/libtap/tap_unit.h"
 
 /* Unit API. */
 unit_api skiplist_tests_api;
diff --git a/src/tests/common/slab_tests.h b/src/tests/common/slab_tests.h
index c6a8721d97db3d2211caa4e4dea38b880f7c5447..d8cb23089a31e859f4bc3183ef09314c82ad24b2 100644
--- a/src/tests/common/slab_tests.h
+++ b/src/tests/common/slab_tests.h
@@ -1,7 +1,7 @@
 #ifndef _KNOT_SLAB_TESTS_H_
 #define _KNOT_SLAB_TESTS_H_
 
-#include "tests/libtap/tap_unit.h"
+#include "common/libtap/tap_unit.h"
 
 /* Unit API. */
 unit_api slab_tests_api;
diff --git a/src/tests/knot/conf_tests.h b/src/tests/knot/conf_tests.h
index 7982751eae8f1a0141769a0a95f0eed866edad38..7069dd7dd60f8ef3e403fc7639c8e4a9cb2a532b 100644
--- a/src/tests/knot/conf_tests.h
+++ b/src/tests/knot/conf_tests.h
@@ -1,7 +1,7 @@
 #ifndef _KNOT_CONF_TESTS_H_
 #define _KNOT_CONF_TESTS_H_
 
-#include "tests/libtap/tap_unit.h"
+#include "common/libtap/tap_unit.h"
 
 /* Unit API. */
 unit_api conf_tests_api;
diff --git a/src/tests/knot/dthreads_tests.h b/src/tests/knot/dthreads_tests.h
index 11b9db890205c0bcec32e82e566309d8cd4aee98..933700261f9831b507e9489aac5f10cf8a2efff1 100644
--- a/src/tests/knot/dthreads_tests.h
+++ b/src/tests/knot/dthreads_tests.h
@@ -1,7 +1,7 @@
 #ifndef _KNOT_DTHREADS_TESTS_H_
 #define _KNOT_DTHREADS_TESTS_H_
 
-#include "tests/libtap/tap_unit.h"
+#include "common/libtap/tap_unit.h"
 
 /* Unit API. */
 unit_api dthreads_tests_api;
diff --git a/src/tests/knot/server_tests.h b/src/tests/knot/server_tests.h
index 13e091fbc0b23b01f756149a05cef1074485aa2b..41f639e727de39668f5c7a20de635da92b5a4353 100644
--- a/src/tests/knot/server_tests.h
+++ b/src/tests/knot/server_tests.h
@@ -1,7 +1,7 @@
 #ifndef _KNOT_SERVER_TESTS_H_
 #define _KNOT_SERVER_TESTS_H_
 
-#include "tests/libtap/tap_unit.h"
+#include "common/libtap/tap_unit.h"
 
 /* Unit API. */
 unit_api server_tests_api;
diff --git a/src/tests/libtap/tap_unit.h b/src/tests/libtap/tap_unit.h
deleted file mode 100644
index bad329931fa9f0a4e4ca20acc4069b3536d25d28..0000000000000000000000000000000000000000
--- a/src/tests/libtap/tap_unit.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*!
- * \file tap_unit.h
- * \author Marek Vavrusa <marek.vavusa@nic.cz>
- *
- * \brief libtap test unit.
- *
- * Contains description of a single test unit API.
- *
- * \addtogroup tests
- * @{
- */
-
-#ifndef _KNOT_TAP_UNIT_H_
-#define _KNOT_TAP_UNIT_H_
-
-#include "tests/libtap/tap.h"
-
-/*! \brief Pointer to function for unit_api. */
-typedef int(unitapi_f)(int, char*[]);
-
-
-/*!
- * \brief Basic Unit APIs.
- *
- * Each unit should have one global variable with
- * an initialized instance of unit_api.
- */
-typedef struct {
-	const char *name;  /*!< Test unit name. */
-	unitapi_f  *count; /*!< Function to calculate number of tests. */
-	unitapi_f  *run;   /*!< Function to run unit tests. */
-} unit_api;
-
-#endif // _KNOT_TAP_UNIT_H_
-
-/*! @} */
-
diff --git a/src/tests/template_tests.c b/src/tests/template_tests.c
deleted file mode 100644
index ba5f5ae6df941cc7be64412aefd183e6db527982..0000000000000000000000000000000000000000
--- a/src/tests/template_tests.c
+++ /dev/null
@@ -1,41 +0,0 @@
-#include "tests/tap_unit.h"
-
-/*
-   This is unit test template.
-   Implement two mandatory functions below,
-   name them accordingly and export unit API
-   via global variable of "unit_api".
-
-   Add the exported variable into the list
-   "unit_api* tests[]" in src/tests/main.c
-
-   There is no header file, all modules *.c files
-   are included directly into src/tests/main.c
-
-   See https://github.com/zorgnax/libtap for libtap API reference.
-
- */
-
-/*! \brief Report the number of scheduled tests for given parameters. */
-static int TEMPLATE_tests_count(int argc, char *argv[])
-{
-	return 1;
-}
-
-/*! \brief  Run all scheduled tests for given parameters. */
-static int TEMPLATE_tests_run(int argc, char *argv[])
-{
-	ok(1 == 1, "dummy test");
-	return 0;
-}
-
-/*!
- * \brief Exported unit API for later incorporation.
- *
- * Name must be unique for each module.
- */
-unit_api TEMPLATE_tests_api = {
-	"TEMPLATE unit",        /*!< Unit name. */
-	&TEMPLATE_tests_count,  /*!< Count scheduled tests. */
-	&TEMPLATE_tests_run     /*!< Run scheduled tests. */
-};
diff --git a/src/tests/unittests_main.c b/src/tests/unittests_main.c
index 0b8472f5a508fecb83dcb1c2258374220185e4ce..5d6c14bae51356481786438cbf6bc832145575ad 100644
--- a/src/tests/unittests_main.c
+++ b/src/tests/unittests_main.c
@@ -1,20 +1,11 @@
 #include <config.h>
 #include "knot/common.h"
-#include "tests/libtap/tap_unit.h"
+#include "common/libtap/tap_unit.h"
 
 // Units to test
 #include "tests/common/slab_tests.h"
 #include "tests/common/skiplist_tests.h"
 #include "tests/common/da_tests.h"
-#include "tests/dnslib/cuckoo_tests.h"
-#include "tests/dnslib/dname_tests.h"
-#include "tests/dnslib/edns_tests.h"
-#include "tests/dnslib/node_tests.h"
-#include "tests/dnslib/rdata_tests.h"
-#include "tests/dnslib/response_tests.h"
-#include "tests/dnslib/rrset_tests.h"
-#include "tests/dnslib/zone_tests.h"
-#include "tests/dnslib/zonedb_tests.h"
 #include "tests/knot/dthreads_tests.h"
 #include "tests/knot/server_tests.h"
 #include "tests/knot/conf_tests.h"
@@ -33,17 +24,6 @@ int main(int argc, char *argv[])
 		&dthreads_tests_api, //! DThreads testing unit
 		&da_tests_api,       //! Dynamic array unit
 
-		/* DNS units */
-		&cuckoo_tests_api,   //! Cuckoo hashing unit
-		&dname_tests_api,    //! DNS library (dname) unit
-		&edns_tests_api,     //! DNS library (EDNS0) unit
-		&node_tests_api,     //! DNS library (node) unit
-		&rdata_tests_api,    //! DNS library (rdata) unit
-		&response_tests_api, //! DNS library (response) unit
-		&rrset_tests_api,    //! DNS library (rrset) unit
-		&zone_tests_api,     //! DNS library (zone) unit
-		&zonedb_tests_api,   //! DNS library (zonedb) unit
-
 		/* Server parts. */
 		&conf_tests_api,     //! Configuration parser tests
 		&server_tests_api,   //! Server unit
diff --git a/src/zoneparser/tests/unittests_zp_main.c b/src/zoneparser/tests/unittests_zp_main.c
index 9bd38c421cb884cdf71f5d9c7a92204d50a7fe0d..0f8d71b268e5d5cf4598361b8b730b9af573896b 100644
--- a/src/zoneparser/tests/unittests_zp_main.c
+++ b/src/zoneparser/tests/unittests_zp_main.c
@@ -1,6 +1,6 @@
 #include <config.h>
 #include "knot/common.h"
-#include "tests/libtap/tap_unit.h"
+#include "common/libtap/tap_unit.h"
 
 // Units to test
 #include "zcompile_tests.c"