diff --git a/Knot.files b/Knot.files
index 9eaabd1629fea207aaa2fcbefd6be572a2aa5c80..65c64a1e26880bcac18ac006cf30ea3408be2bb4 100644
--- a/Knot.files
+++ b/Knot.files
@@ -6,62 +6,62 @@ Doxyfile.devel
 configure.ac
 tests/querytcp.c
 libknot/Makefile.am
+libknot/libknot.h
 libknot/common.h
 libknot/dname.h
 libknot/dname.c
 libknot/rrset.h
 libknot/rrset.c
-libknot/error.c
-libknot/error.h
 libknot/rdata.h
 libknot/rdata.c
-libknot/node.h
-libknot/node.c
-libknot/consts.h
-libknot/descriptor.h
-libknot/descriptor.c
-libknot/zone.h
-libknot/zone.c
-libknot/packet.h
-libknot/packet.c
-libknot/query.h
-libknot/query.c
-libknot/response2.h
-libknot/response2.c
-libknot/response.h
-libknot/wire.h
-libknot/response.c
 libknot/edns.h
 libknot/edns.c
-libknot/utils.h
-libknot/utils.c
-libknot/zonedb.h
-libknot/zonedb.c
-libknot/debug.h
-libknot/debug.c
-libknot/libknot.h
-libknot/tolower.h
-libknot/tolower.c
 libknot/nsec3.h
 libknot/nsec3.c
-libknot/changesets.h
-libknot/changesets.c
-libknot/zone-contents.c
-libknot/zone-contents.h
-libknot/zone-tree.h
-libknot/zone-tree.c
-libknot/xfr-in.h
-libknot/xfr-in.c
-libknot/name-server.c
-libknot/name-server.h
-libknot/dname-table.h
-libknot/dname-table.c
+libknot/consts.h
 libknot/hash/cuckoo-hash-table.c
 libknot/hash/cuckoo-hash-table.h
 libknot/hash/hash-functions.c
 libknot/hash/hash-functions.h
 libknot/hash/universal-system.c
 libknot/hash/universal-system.h
+libknot/nameserver/name-server.c
+libknot/nameserver/name-server.h
+libknot/packet/packet.h
+libknot/packet/packet.c
+libknot/packet/query.h
+libknot/packet/query.c
+libknot/packet/response2.h
+libknot/packet/response2.c
+libknot/packet/response.h
+libknot/packet/response.c
+libknot/updates/changesets.h
+libknot/updates/changesets.c
+libknot/updates/xfr-in.h
+libknot/updates/xfr-in.c
+libknot/util/wire.h
+libknot/util/debug.h
+libknot/util/debug.c
+libknot/util/tolower.h
+libknot/util/tolower.c
+libknot/util/utils.h
+libknot/util/utils.c
+libknot/util/descriptor.h
+libknot/util/descriptor.c
+libknot/util/error.c
+libknot/util/error.h
+libknot/zone/zonedb.h
+libknot/zone/zonedb.c
+libknot/zone/node.h
+libknot/zone/node.c
+libknot/zone/zone.h
+libknot/zone/zone.c
+libknot/zone/zone-contents.c
+libknot/zone/zone-contents.h
+libknot/zone/zone-tree.h
+libknot/zone/zone-tree.c
+libknot/zone/dname-table.h
+libknot/zone/dname-table.c
 src/Makefile.am
 src/common/slab/malloc.c
 src/common/slab/malloc.h
diff --git a/libknot/Makefile.am b/libknot/Makefile.am
index b449f5a1383df565bdba39a8767513db0f460738..2afb6bbf39c7655042b1f9ca3632becad78e3ad3 100644
--- a/libknot/Makefile.am
+++ b/libknot/Makefile.am
@@ -43,59 +43,59 @@ libknot_common_SOURCES = \
 	common/errors.h				\
 	common/errors.c
 
-libknot_la_SOURCES =			\
-	$(libknot_common_SOURCES)	\
+libknot_la_SOURCES =				\
+	$(libknot_common_SOURCES)		\
+	util/error.c				\
+	util/utils.c				\
+	util/debug.c				\
+	util/debug.h				\
+	util/utils.h				\
+	util/descriptor.c			\
+	util/tolower.h				\
+	util/tolower.c				\
+	util/descriptor.h			\
+	util/wire.h				\
+	packet/query.c				\
+	packet/response2.c			\
+	packet/response.c			\
+	packet/packet.c				\
+	packet/packet.h				\
+	packet/query.h				\
+	packet/response2.h			\
+	packet/response.h			\
+	zone/zone.c				\
+	zone/zone-contents.c			\
+	zone/zone-tree.c			\
+	zone/zone-tree.h			\
+	zone/node.h				\
+	zone/zone.h				\
+	zone/zone-contents.h			\
+	zone/zonedb.c				\
+	zone/zonedb.h				\
+	zone/node.c				\
+	zone/dname-table.h			\
+	zone/dname-table.c			\
+	hash/hash-functions.c			\
+	hash/cuckoo-hash-table.c		\
+	hash/universal-system.c			\
+	hash/universal-system.h			\
+	hash/cuckoo-hash-table.h		\
+	hash/hash-functions.h			\
+	nameserver/name-server.h		\
+	nameserver/name-server.c		\
+	updates/changesets.h			\
+	updates/changesets.c			\
+	updates/xfr-in.h			\
+	updates/xfr-in.c			\
 	edns.c				\
-	error.c				\
-	utils.c				\
 	rrset.c				\
 	dname.c				\
-	node.c				\
-	packet.c			\
-	query.c				\
-	response2.c			\
-	response.c			\
-	zone.c				\
-	zone-contents.c			\
-	zonedb.c			\
-	debug.c				\
-	zone-tree.c			\
-	zone-tree.h			\
 	rdata.c				\
-	descriptor.c			\
 	nsec3.c				\
-	dname-table.c			\
-	hash/hash-functions.c		\
-	hash/cuckoo-hash-table.c	\
-	hash/universal-system.c		\
-	hash/universal-system.h		\
-	hash/cuckoo-hash-table.h	\
-	hash/hash-functions.h		\
-	zonedb.h			\
 	consts.h			\
-	node.h				\
 	edns.h				\
-	zone.h				\
-	zone-contents.h			\
 	rdata.h				\
-	descriptor.h			\
 	libknot.h			\
-	tolower.h			\
-	tolower.c			\
 	dname.h				\
-	packet.h			\
-	query.h				\
-	response2.h			\
-	response.h			\
 	rrset.h				\
-	utils.h				\
-	wire.h				\
-	debug.h				\
-	nsec3.h				\
-	changesets.h			\
-	changesets.c			\
-	xfr-in.h			\
-	xfr-in.c			\
-	name-server.h			\
-	name-server.c			\
-	dname-table.h
+	nsec3.h				
diff --git a/libknot/consts.h b/libknot/consts.h
index cbf00b55edff42eea168a12381702b6f2f284164..cc9f0c161f85ffc0115e2b77e100621090ee708b 100644
--- a/libknot/consts.h
+++ b/libknot/consts.h
@@ -29,7 +29,7 @@
 #define _KNOT_CONSTS_H_
 
 #include <stdint.h>
-#include "descriptor.h"
+#include "util/descriptor.h"
 
 /*
  * OPCODEs
diff --git a/libknot/dname.c b/libknot/dname.c
index 8ab83fd6f8aea20765375e2fc7271f3bb12169d6..d9ded162dc19452ce3da9c588df34d724f3c820a 100644
--- a/libknot/dname.c
+++ b/libknot/dname.c
@@ -22,13 +22,13 @@
 #include <ctype.h>	// tolower()
 
 #include "common.h"
-#include "error.h"
+#include "util/error.h"
 #include "dname.h"
 #include "consts.h"
-#include "tolower.h"
-#include "debug.h"
-#include "utils.h"
-#include "wire.h"
+#include "util/tolower.h"
+#include "util/debug.h"
+#include "util/utils.h"
+#include "util/wire.h"
 
 /*! \todo dnames allocated from TLS cache will be discarded after thread
  *        termination. This shouldn't happpen.
diff --git a/libknot/edns.c b/libknot/edns.c
index 0066806e93a7738f04133d7d9d6831c1547df4b6..334c29d43139c0f1a4f251924a5751167bbff827 100644
--- a/libknot/edns.c
+++ b/libknot/edns.c
@@ -20,9 +20,9 @@
 
 #include "edns.h"
 #include "common.h"
-#include "descriptor.h"
-#include "debug.h"
-#include "error.h"
+#include "util/descriptor.h"
+#include "util/debug.h"
+#include "util/error.h"
 
 /*! \brief Various EDNS constatns. */
 enum knot_edns_consts {
diff --git a/libknot/edns.h b/libknot/edns.h
index 60b9b7d8c2b734db64c532e8f4791f7568df554e..4b786cdfacb7c4196ebe54e743d9a13fc26b8515 100644
--- a/libknot/edns.h
+++ b/libknot/edns.h
@@ -29,7 +29,7 @@
 
 #include <stdint.h>
 
-#include "utils.h"
+#include "util/utils.h"
 #include "rrset.h"
 
 /*----------------------------------------------------------------------------*/
diff --git a/libknot/hash/cuckoo-hash-table.c b/libknot/hash/cuckoo-hash-table.c
index 35e70727a1f518efe59f19178f1962c47fd552fd..7fa0fa592abe07b783b64ce000ad04e3326709dd 100644
--- a/libknot/hash/cuckoo-hash-table.c
+++ b/libknot/hash/cuckoo-hash-table.c
@@ -24,9 +24,9 @@
 
 #include <urcu.h>
 
-#include "utils.h"
+#include "util/utils.h"
 #include "common.h"
-#include "debug.h"
+#include "util/debug.h"
 #include "hash/cuckoo-hash-table.h"
 #include "hash/hash-functions.h"
 #include "common/dynamic-array.h"
diff --git a/libknot/hash/universal-system.c b/libknot/hash/universal-system.c
index 4d15018af7294348bdf914dd7c45e3414c259997..16809f1e081f0e2daad11f61f7f17c80010bd01c 100644
--- a/libknot/hash/universal-system.c
+++ b/libknot/hash/universal-system.c
@@ -23,7 +23,7 @@
 #include <assert.h>
 
 #include "universal-system.h"
-#include "utils.h"
+#include "util/utils.h"
 
 /*----------------------------------------------------------------------------*/
 
diff --git a/libknot/libknot.h b/libknot/libknot.h
index c0a27ffacc59c6b9736d9fa784abe485170deaab..96f064567cfbfc8dfa7711f07027e059835f5a8e 100644
--- a/libknot/libknot.h
+++ b/libknot/libknot.h
@@ -28,20 +28,20 @@
 #define _KNOT_LIBKNOT_H_
 
 #include "consts.h"
-#include "descriptor.h"
+#include "util/descriptor.h"
 #include "dname.h"
 #include "edns.h"
-#include "node.h"
+#include "zone/node.h"
 #include "nsec3.h"
-#include "wire.h"
+#include "util/wire.h"
 #include "rdata.h"
-#include "response2.h"
+#include "packet/response2.h"
 #include "rrset.h"
-#include "tolower.h"
-#include "utils.h"
-#include "zone.h"
-#include "zonedb.h"
-#include "error.h"
+#include "util/tolower.h"
+#include "util/utils.h"
+#include "zone/zone.h"
+#include "zone/zonedb.h"
+#include "util/error.h"
 
 #endif
 
diff --git a/libknot/name-server.c b/libknot/nameserver/name-server.c
similarity index 99%
rename from libknot/name-server.c
rename to libknot/nameserver/name-server.c
index e7288601a6dcbbb6b24f6b79cf6994fb17c32a4a..c1ca4b5d26b373bcf03d704d4b329507e6a63544 100644
--- a/libknot/name-server.c
+++ b/libknot/nameserver/name-server.c
@@ -21,19 +21,19 @@
 
 #include <urcu.h>
 
-#include "name-server.h"
-#include "xfr-in.h"
+#include "nameserver/name-server.h"
+#include "updates/xfr-in.h"
 
-#include "error.h"
+#include "util/error.h"
 #include "libknot.h"
-#include "debug.h"
-#include "packet.h"
-#include "response2.h"
-#include "query.h"
+#include "util/debug.h"
+#include "packet/packet.h"
+#include "packet/response2.h"
+#include "packet/query.h"
 #include "consts.h"
 // #include "knot/zone/zone-dump-text.h"
 // #include "knot/zone/zone-dump.h"
-#include "changesets.h"
+#include "updates/changesets.h"
 
 /*----------------------------------------------------------------------------*/
 
diff --git a/libknot/name-server.h b/libknot/nameserver/name-server.h
similarity index 99%
rename from libknot/name-server.h
rename to libknot/nameserver/name-server.h
index 75f431adae3ebc5733b2b7ba3882ab29c9defbba..2a9120fb46401b414358d2241457a38fc7103898 100644
--- a/libknot/name-server.h
+++ b/libknot/nameserver/name-server.h
@@ -38,11 +38,10 @@
 #include <stdint.h>
 #include <string.h>
 
-#include "zonedb.h"
+#include "zone/zonedb.h"
 #include "edns.h"
-//#include "response.h"
 #include "consts.h"
-#include "packet.h"
+#include "packet/packet.h"
 #include "common/sockaddr.h"
 
 struct conf_t;
diff --git a/libknot/nsec3.c b/libknot/nsec3.c
index 3b30b60cf067c8aa4ab039ac9fa02bb27814eec0..a92b366d47675db44a58fe36b322d99830c12540 100644
--- a/libknot/nsec3.c
+++ b/libknot/nsec3.c
@@ -24,11 +24,11 @@
 
 #include "nsec3.h"
 #include "common.h"
-#include "descriptor.h"
-#include "utils.h"
-#include "tolower.h"
-#include "error.h"
-#include "debug.h"
+#include "util/descriptor.h"
+#include "util/utils.h"
+#include "util/tolower.h"
+#include "util/error.h"
+#include "util/debug.h"
 
 /*----------------------------------------------------------------------------*/
 
diff --git a/libknot/packet.c b/libknot/packet/packet.c
similarity index 99%
rename from libknot/packet.c
rename to libknot/packet/packet.c
index dbfce0f0f2fa58725bd67a8bd34b511186aa2ddb..82947355d8bd2a3d1b9aab9e468ed2363de3680f 100644
--- a/libknot/packet.c
+++ b/libknot/packet/packet.c
@@ -16,12 +16,12 @@
 
 #include <assert.h>
 
-#include "packet.h"
-#include "error.h"
-#include "debug.h"
+#include "packet/packet.h"
+#include "util/error.h"
+#include "util/debug.h"
 #include "common.h"
-#include "descriptor.h"
-#include "wire.h"
+#include "util/descriptor.h"
+#include "util/wire.h"
 
 /*----------------------------------------------------------------------------*/
 
diff --git a/libknot/packet.h b/libknot/packet/packet.h
similarity index 99%
rename from libknot/packet.h
rename to libknot/packet/packet.h
index 9674b43f9202651b40566a2c7597165302b082b8..fd3d55f8283ba95c38e33eb3ec9a4af315ff110c 100644
--- a/libknot/packet.h
+++ b/libknot/packet/packet.h
@@ -33,7 +33,6 @@
 #include "dname.h"
 #include "rrset.h"
 #include "edns.h"
-//#include "response.h"
 
 /*----------------------------------------------------------------------------*/
 /*!
diff --git a/libknot/query.c b/libknot/packet/query.c
similarity index 97%
rename from libknot/query.c
rename to libknot/packet/query.c
index 342d07853a38847ed6627b7b8df91059cc0461fa..43044c5a7f7a7ee64d8a1312dab372288e3bf050 100644
--- a/libknot/query.c
+++ b/libknot/packet/query.c
@@ -14,10 +14,10 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "query.h"
+#include "packet/query.h"
 
-#include "error.h"
-#include "wire.h"
+#include "util/error.h"
+#include "util/wire.h"
 
 /*----------------------------------------------------------------------------*/
 
diff --git a/libknot/query.h b/libknot/packet/query.h
similarity index 98%
rename from libknot/query.h
rename to libknot/packet/query.h
index d96804aa834b3dd5238ac2d573a87bad7b843c3c..35a5ba527505fe83a8230855430fb1732ab9e36f 100644
--- a/libknot/query.h
+++ b/libknot/packet/query.h
@@ -30,7 +30,7 @@
 #include <stdint.h>
 #include <string.h>
 
-#include "packet.h"
+#include "packet/packet.h"
 #include "dname.h"
 #include "rrset.h"
 #include "edns.h"
diff --git a/libknot/response.c b/libknot/packet/response.c
similarity index 99%
rename from libknot/response.c
rename to libknot/packet/response.c
index 832f9339110ab2d73bd1106891c7d9df4d4a465a..4137a0eba565b4d2366b60f3864053547db2929a 100644
--- a/libknot/response.c
+++ b/libknot/packet/response.c
@@ -20,15 +20,15 @@
 #include <assert.h>
 
 #include "common.h"
-#include "response.h"
+#include "packet/response.h"
 #include "rrset.h"
-#include "wire.h"
-#include "descriptor.h"
+#include "util/wire.h"
+#include "util/descriptor.h"
 #include "edns.h"
-#include "utils.h"
-#include "node.h"
-#include "error.h"
-#include "debug.h"
+#include "util/utils.h"
+#include "zone/node.h"
+#include "util/error.h"
+#include "util/debug.h"
 
 /*!
  * \brief Default maximum DNS response size
diff --git a/libknot/response.h b/libknot/packet/response.h
similarity index 100%
rename from libknot/response.h
rename to libknot/packet/response.h
diff --git a/libknot/response2.c b/libknot/packet/response2.c
similarity index 99%
rename from libknot/response2.c
rename to libknot/packet/response2.c
index d44e69e3bd86b2fa89c16cbb9e6ebafc5ad2ba06..8ab7759c2f33d5b95f94a3ed4954fe8c10ad7fac 100644
--- a/libknot/response2.c
+++ b/libknot/packet/response2.c
@@ -16,13 +16,13 @@
 
 #include <stdlib.h>
 
-#include "response2.h"
-#include "wire.h"
-#include "descriptor.h"
+#include "packet/response2.h"
+#include "util/wire.h"
+#include "util/descriptor.h"
 #include "common.h"
-#include "error.h"
-#include "debug.h"
-#include "packet.h"
+#include "util/error.h"
+#include "util/debug.h"
+#include "packet/packet.h"
 
 /*----------------------------------------------------------------------------*/
 /*!
diff --git a/libknot/response2.h b/libknot/packet/response2.h
similarity index 99%
rename from libknot/response2.h
rename to libknot/packet/response2.h
index 6435d3977abf0b11bf99f0ebfdfab11d47172aa5..f6cd28d519703064e90e21b39a4f6897f3137c85 100644
--- a/libknot/response2.h
+++ b/libknot/packet/response2.h
@@ -30,7 +30,7 @@
 #include <stdint.h>
 #include <string.h>
 
-#include "packet.h"
+#include "packet/packet.h"
 
 #include "dname.h"
 #include "rrset.h"
diff --git a/libknot/rdata.c b/libknot/rdata.c
index d66c9484abe8224ae535f3a6ff90fabcfd2fe2f9..1d17674a9aed04c004dbd82e789c11eaa569abab 100644
--- a/libknot/rdata.c
+++ b/libknot/rdata.c
@@ -23,12 +23,12 @@
 
 #include "common.h"
 #include "rdata.h"
-#include "descriptor.h"
+#include "util/descriptor.h"
 #include "dname.h"
-#include "error.h"
-#include "node.h"
-#include "utils.h"
-#include "debug.h"
+#include "util/error.h"
+#include "zone/node.h"
+#include "util/utils.h"
+#include "util/debug.h"
 
 /*----------------------------------------------------------------------------*/
 /* Non-API functions                                                          */
diff --git a/libknot/rdata.h b/libknot/rdata.h
index 1804309ed6c52741af88eaf75a59cd16523f9b82..9d3d7eae11cca4bce3e5503dc9bb364af0cb1c90 100644
--- a/libknot/rdata.h
+++ b/libknot/rdata.h
@@ -32,7 +32,7 @@
 #include <string.h>
 
 #include "dname.h"
-#include "descriptor.h"
+#include "util/descriptor.h"
 
 /*----------------------------------------------------------------------------*/
 /*!
diff --git a/libknot/rrset.c b/libknot/rrset.c
index 524fe08fa5e608eba699839b1711884dd02805b8..41f4e5a1abec08d1c2790559fa3d0aa92faac7a6 100644
--- a/libknot/rrset.c
+++ b/libknot/rrset.c
@@ -22,8 +22,8 @@
 
 #include "common.h"
 #include "rrset.h"
-#include "descriptor.h"
-#include "error.h"
+#include "util/descriptor.h"
+#include "util/error.h"
 
 /*----------------------------------------------------------------------------*/
 /* Non-API functions                                                          */
diff --git a/libknot/changesets.c b/libknot/updates/changesets.c
similarity index 99%
rename from libknot/changesets.c
rename to libknot/updates/changesets.c
index bc005b57f98037f7a700c3569579482b6596fdb0..2d26f5e952bbae33b640171840f29660f60762dc 100644
--- a/libknot/changesets.c
+++ b/libknot/updates/changesets.c
@@ -18,10 +18,10 @@
 #include <stdlib.h>
 #include <assert.h>
 
-#include "changesets.h"
+#include "updates/changesets.h"
 
 #include "rrset.h"
-#include "error.h"
+#include "util/error.h"
 
 static const size_t KNOT_CHANGESET_COUNT = 5;
 static const size_t KNOT_CHANGESET_STEP = 5;
diff --git a/libknot/changesets.h b/libknot/updates/changesets.h
similarity index 100%
rename from libknot/changesets.h
rename to libknot/updates/changesets.h
diff --git a/libknot/xfr-in.c b/libknot/updates/xfr-in.c
similarity index 99%
rename from libknot/xfr-in.c
rename to libknot/updates/xfr-in.c
index 454d0f0c1d638dd54765364f17322d9d517c2f54..6fdd6799d3d8175444681eb1f7641b4f1eb61501 100644
--- a/libknot/xfr-in.c
+++ b/libknot/updates/xfr-in.c
@@ -17,18 +17,18 @@
 #include <assert.h>
 #include <urcu.h>
 
-#include "xfr-in.h"
+#include "updates/xfr-in.h"
 
-#include "name-server.h"
-#include "debug.h"
+#include "nameserver/name-server.h"
+#include "util/debug.h"
 // #include "knot/zone/zone-dump.h"
 // #include "knot/zone/zone-load.h"
-#include "packet.h"
+#include "packet/packet.h"
 #include "dname.h"
-#include "zone.h"
-#include "query.h"
-#include "error.h"
-#include "changesets.h"
+#include "zone/zone.h"
+#include "packet/query.h"
+#include "util/error.h"
+#include "updates/changesets.h"
 
 /*----------------------------------------------------------------------------*/
 /* Non-API functions                                                          */
diff --git a/libknot/xfr-in.h b/libknot/updates/xfr-in.h
similarity index 97%
rename from libknot/xfr-in.h
rename to libknot/updates/xfr-in.h
index e6ba4f58f00f24c16889e09bed03513b4f657301..a350df87b677a562360c02e15d59ef38bd4264f4 100644
--- a/libknot/xfr-in.h
+++ b/libknot/updates/xfr-in.h
@@ -31,10 +31,10 @@
 #include <string.h>
 
 #include "dname.h"
-#include "zone.h"
-#include "packet.h"
-#include "name-server.h"
-#include "changesets.h"
+#include "zone/zone.h"
+#include "packet/packet.h"
+#include "nameserver/name-server.h"
+#include "updates/changesets.h"
 
 /*!
  * \brief Creates normal query for the given zone name and the SOA type.
diff --git a/libknot/debug.c b/libknot/util/debug.c
similarity index 99%
rename from libknot/debug.c
rename to libknot/util/debug.c
index fb59fb2a2ecc74ae02abad3e74d52abc8ff33198..87eefc2c754b9315501f899be4775f9ee9950717 100644
--- a/libknot/debug.c
+++ b/libknot/util/debug.c
@@ -20,8 +20,8 @@
 #include <assert.h>
 #include <stdlib.h>
 
-#include "utils.h"
-#include "debug.h"
+#include "util/utils.h"
+#include "util/debug.h"
 #include "libknot.h"
 #include "common/print.h"
 
diff --git a/libknot/debug.h b/libknot/util/debug.h
similarity index 98%
rename from libknot/debug.h
rename to libknot/util/debug.h
index f2a6916cc8e495ad91c97bdd0488ae10b4fc324e..e660210b413537bfad6bf42ea4caa783dc7fe8b4 100644
--- a/libknot/debug.h
+++ b/libknot/util/debug.h
@@ -32,9 +32,9 @@
 #include <stdio.h>
 #include "rdata.h"
 #include "rrset.h"
-#include "node.h"
-#include "zone.h"
-#include "utils.h"
+#include "zone/node.h"
+#include "zone/zone.h"
+#include "util/utils.h"
 #include "common/print.h"
 
 /*!
diff --git a/libknot/descriptor.c b/libknot/util/descriptor.c
similarity index 100%
rename from libknot/descriptor.c
rename to libknot/util/descriptor.c
diff --git a/libknot/descriptor.h b/libknot/util/descriptor.h
similarity index 100%
rename from libknot/descriptor.h
rename to libknot/util/descriptor.h
diff --git a/libknot/error.c b/libknot/util/error.c
similarity index 97%
rename from libknot/error.c
rename to libknot/util/error.c
index 248819dec6872a42166a620b2ccec020be36e4d0..148439a2631b03b76b690470034ca99ddba28675 100644
--- a/libknot/error.c
+++ b/libknot/util/error.c
@@ -14,8 +14,8 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "error.h"
-#include "utils.h"
+#include "util/error.h"
+#include "util/utils.h"
 
 #include "common/errors.h"
 
diff --git a/libknot/error.h b/libknot/util/error.h
similarity index 100%
rename from libknot/error.h
rename to libknot/util/error.h
diff --git a/libknot/tolower.c b/libknot/util/tolower.c
similarity index 99%
rename from libknot/tolower.c
rename to libknot/util/tolower.c
index f826a4ab8d62f86463ff4b581643d94cd9bf31ef..eff923162369ff8414823e65c6f3e52d202067ea 100644
--- a/libknot/tolower.c
+++ b/libknot/util/tolower.c
@@ -14,7 +14,7 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "tolower.h"
+#include "util/tolower.h"
 
 const uint8_t char_table[CHAR_TABLE_SIZE] = {
 	'\x00',
diff --git a/libknot/tolower.h b/libknot/util/tolower.h
similarity index 100%
rename from libknot/tolower.h
rename to libknot/util/tolower.h
diff --git a/libknot/utils.c b/libknot/util/utils.c
similarity index 99%
rename from libknot/utils.c
rename to libknot/util/utils.c
index c9edf04f56046b81d759b26f47687db334026584..cf4bf1f0e545eab4878098ac6a9e16afc40f53f9 100644
--- a/libknot/utils.c
+++ b/libknot/util/utils.c
@@ -19,7 +19,7 @@
 #include <pthread.h>
 
 #include "common.h"
-#include "utils.h"
+#include "util/utils.h"
 
 /*----------------------------------------------------------------------------*/
 
diff --git a/libknot/utils.h b/libknot/util/utils.h
similarity index 100%
rename from libknot/utils.h
rename to libknot/util/utils.h
diff --git a/libknot/wire.h b/libknot/util/wire.h
similarity index 99%
rename from libknot/wire.h
rename to libknot/util/wire.h
index 3cca4ff393710224aee7df3ddfc6630042f64dc2..989102e199ede585f2e73d540453d650b588f895 100644
--- a/libknot/wire.h
+++ b/libknot/util/wire.h
@@ -30,7 +30,7 @@
 #include <stdint.h>
 #include <assert.h>
 
-#include "utils.h"
+#include "util/utils.h"
 
 /*! \brief Offset of DNS header fields in wireformat. */
 enum knot_wire_offsets {
diff --git a/libknot/dname-table.c b/libknot/zone/dname-table.c
similarity index 99%
rename from libknot/dname-table.c
rename to libknot/zone/dname-table.c
index b8a8998f830b54547d495944c96c1e5d24d88f7e..d7ca96f5184dc3d43654a8c1610123cd2a5f84ce 100644
--- a/libknot/dname-table.c
+++ b/libknot/zone/dname-table.c
@@ -19,8 +19,8 @@
 #include <stdlib.h>
 #include <stdio.h>
 
-#include "dname-table.h"
-#include "error.h"
+#include "zone/dname-table.h"
+#include "util/error.h"
 
 /*!< Tree functions. */
 TREE_DEFINE(dname_table_node, avl);
diff --git a/libknot/dname-table.h b/libknot/zone/dname-table.h
similarity index 100%
rename from libknot/dname-table.h
rename to libknot/zone/dname-table.h
diff --git a/libknot/node.c b/libknot/zone/node.c
similarity index 99%
rename from libknot/node.c
rename to libknot/zone/node.c
index 46797cd0b00220a4d7d9221360414423b0165e3e..f276580d782049e56534a01f762c65cc16dd782f 100644
--- a/libknot/node.c
+++ b/libknot/zone/node.c
@@ -22,12 +22,12 @@
 #include <urcu.h>
 
 #include "common.h"
-#include "node.h"
+#include "zone/node.h"
 #include "rrset.h"
-#include "error.h"
+#include "util/error.h"
 #include "common/skip-list.h"
 #include "common/tree.h"
-#include "debug.h"
+#include "util/debug.h"
 
 /*----------------------------------------------------------------------------*/
 /* Non-API functions                                                          */
diff --git a/libknot/node.h b/libknot/zone/node.h
similarity index 100%
rename from libknot/node.h
rename to libknot/zone/node.h
diff --git a/libknot/zone-contents.c b/libknot/zone/zone-contents.c
similarity index 99%
rename from libknot/zone-contents.c
rename to libknot/zone/zone-contents.c
index a34a15c82c7098107f03e9dc822450642dfe6e85..5b8ca73065ed30227dff3853f2d0bea5940f1302 100644
--- a/libknot/zone-contents.c
+++ b/libknot/zone/zone-contents.c
@@ -16,9 +16,9 @@
 
 #include <assert.h>
 
-#include "zone-contents.h"
-#include "error.h"
-#include "debug.h"
+#include "zone/zone-contents.h"
+#include "util/error.h"
+#include "util/debug.h"
 #include "common/base32hex.h"
 
 /*----------------------------------------------------------------------------*/
diff --git a/libknot/zone-contents.h b/libknot/zone/zone-contents.h
similarity index 99%
rename from libknot/zone-contents.h
rename to libknot/zone/zone-contents.h
index 6489379af92c545888cfa92f01ea26ef164cc5ad..a586372368553150c6bbab65f1b46bfa575a7683 100644
--- a/libknot/zone-contents.h
+++ b/libknot/zone/zone-contents.h
@@ -29,10 +29,10 @@
 
 //#include <time.h>
 
-#include "node.h"
+#include "zone/node.h"
 #include "dname.h"
 #include "nsec3.h"
-#include "dname-table.h"
+#include "zone/dname-table.h"
 #include "common/tree.h"
 #include "hash/cuckoo-hash-table.h"
 
diff --git a/libknot/zone-tree.c b/libknot/zone/zone-tree.c
similarity index 99%
rename from libknot/zone-tree.c
rename to libknot/zone/zone-tree.c
index b3ef55908e77ff31a0e6c44736001f2e07771059..6545bad4bcdd2d909b2dc8e76eda680c3cbd5b96 100644
--- a/libknot/zone-tree.c
+++ b/libknot/zone/zone-tree.c
@@ -19,8 +19,8 @@
 #include <stdio.h>
 
 #include "zone-tree.h"
-#include "node.h"
-#include "error.h"
+#include "zone/node.h"
+#include "util/error.h"
 
 /*----------------------------------------------------------------------------*/
 /* Non-API functions                                                          */
diff --git a/libknot/zone-tree.h b/libknot/zone/zone-tree.h
similarity index 99%
rename from libknot/zone-tree.h
rename to libknot/zone/zone-tree.h
index f7774e6c975ba91f65ec301423ecf6988887ec8b..f7c6b1cf7bdba0c6420b3157b5473e5f643fed71 100644
--- a/libknot/zone-tree.h
+++ b/libknot/zone/zone-tree.h
@@ -30,7 +30,7 @@
 #define _KNOT_ZONE_TREE_H_
 
 #include "common/tree.h"
-#include "node.h"
+#include "zone/node.h"
 
 /*----------------------------------------------------------------------------*/
 
diff --git a/libknot/zone.c b/libknot/zone/zone.c
similarity index 96%
rename from libknot/zone.c
rename to libknot/zone/zone.c
index 5708ee04424a4493d95dc9962436c164bc6ea669..d19b2ca18a92e49479664a2f4c9edb11787c3673 100644
--- a/libknot/zone.c
+++ b/libknot/zone/zone.c
@@ -22,19 +22,19 @@
 #include <urcu.h>
 
 #include "common.h"
-#include "zone.h"
-#include "node.h"
+#include "zone/zone.h"
+#include "zone/node.h"
 #include "dname.h"
 #include "consts.h"
-#include "descriptor.h"
+#include "util/descriptor.h"
 #include "nsec3.h"
-#include "error.h"
-#include "debug.h"
-#include "utils.h"
+#include "util/error.h"
+#include "util/debug.h"
+#include "util/utils.h"
 #include "common/tree.h"
 #include "common/base32hex.h"
 #include "hash/cuckoo-hash-table.h"
-#include "zone-contents.h"
+#include "zone/zone-contents.h"
 
 /*----------------------------------------------------------------------------*/
 /* API functions                                                              */
diff --git a/libknot/zone.h b/libknot/zone/zone.h
similarity index 97%
rename from libknot/zone.h
rename to libknot/zone/zone.h
index ee8f95f868dd1a47f99939cced0b6dba23502007..fd12824e1318b5a77500d0945bd27e55ec12d603 100644
--- a/libknot/zone.h
+++ b/libknot/zone/zone.h
@@ -29,16 +29,16 @@
 
 #include <time.h>
 
-#include "node.h"
+#include "zone/node.h"
 #include "dname.h"
 #include "nsec3.h"
-#include "dname-table.h"
+#include "zone/dname-table.h"
 #include "common/tree.h"
 #include "hash/cuckoo-hash-table.h"
 
 #include "zone-tree.h"
 
-#include "zone-contents.h"
+#include "zone/zone-contents.h"
 
 /*----------------------------------------------------------------------------*/
 
diff --git a/libknot/zonedb.c b/libknot/zone/zonedb.c
similarity index 98%
rename from libknot/zonedb.c
rename to libknot/zone/zonedb.c
index 1c0bc784f5bd9d92e97981751742ddd1c879fe89..9b9392001cb448b8d2c8980d745f6055334f52d8 100644
--- a/libknot/zonedb.c
+++ b/libknot/zone/zonedb.c
@@ -21,12 +21,12 @@
 #include <urcu.h>
 
 #include "common.h"
-#include "zone.h"
-#include "zonedb.h"
+#include "zone/zone.h"
+#include "zone/zonedb.h"
 #include "dname.h"
-#include "node.h"
-#include "error.h"
-#include "debug.h"
+#include "zone/node.h"
+#include "util/error.h"
+#include "util/debug.h"
 #include "common/general-tree.h"
 
 /*----------------------------------------------------------------------------*/
diff --git a/libknot/zonedb.h b/libknot/zone/zonedb.h
similarity index 98%
rename from libknot/zonedb.h
rename to libknot/zone/zonedb.h
index 068f4c11afed29b769801c27693644d7e8cfa2ca..09edd9f39c70b23c0f2b90b1653d3c9a7616a845 100644
--- a/libknot/zonedb.h
+++ b/libknot/zone/zonedb.h
@@ -31,8 +31,8 @@
 #define _KNOT_ZONEDB_H_
 
 #include "common/general-tree.h"
-#include "zone.h"
-#include "node.h"
+#include "zone/zone.h"
+#include "zone/node.h"
 #include "dname.h"
 
 /*!
diff --git a/src/knot/conf/conf.h b/src/knot/conf/conf.h
index a0211d8f7d59e70f3ebaa75abf42aa336e26ce9e..90fddf4672e01712fdaf90120c8e2f3b3b309942 100644
--- a/src/knot/conf/conf.h
+++ b/src/knot/conf/conf.h
@@ -18,7 +18,7 @@
 
 #include <urcu.h>
 
-#include "libknot/descriptor.h"
+#include "libknot/util/descriptor.h"
 #include "common/lists.h"
 #include "knot/other/log.h"
 
diff --git a/src/knot/server/notify.c b/src/knot/server/notify.c
index 58c78157fad6365d7d8d835c5cdf617a53b14410..2ae29332d96e7f9a991f935ad31668ef21f39769 100644
--- a/src/knot/server/notify.c
+++ b/src/knot/server/notify.c
@@ -3,15 +3,15 @@
 #include "knot/server/notify.h"
 
 #include "libknot/dname.h"
-#include "libknot/packet.h"
+#include "libknot/packet/packet.h"
 #include "libknot/rrset.h"
-#include "libknot/response2.h"
-#include "libknot/query.h"
+#include "libknot/packet/response2.h"
+#include "libknot/packet/query.h"
 #include "libknot/consts.h"
 #include "knot/other/error.h"
-#include "libknot/zonedb.h"
+#include "libknot/zone/zonedb.h"
 #include "libknot/common.h"
-#include "libknot/error.h"
+#include "libknot/util/error.h"
 #include "knot/server/zones.h"
 #include "common/acl.h"
 #include "common/evsched.h"
diff --git a/src/knot/server/notify.h b/src/knot/server/notify.h
index 7db91b45ca0c61efba827e9e3238d448394a8460..330cf7238e8bfb8b551a31d28fcd8a9c4d3604c6 100644
--- a/src/knot/server/notify.h
+++ b/src/knot/server/notify.h
@@ -15,12 +15,12 @@
 #include <stdint.h>
 #include <string.h>
 
-#include "libknot/zone.h"
-#include "libknot/packet.h"
-#include "libknot/zonedb.h"
+#include "libknot/zone/zone.h"
+#include "libknot/packet/packet.h"
+#include "libknot/zone/zonedb.h"
 #include "common/lists.h"
 #include "common/sockaddr.h"
-#include "libknot/name-server.h"
+#include "libknot/nameserver/name-server.h"
 
 /*!
  * \brief Pending NOTIFY event.
diff --git a/src/knot/server/server.c b/src/knot/server/server.c
index 7ca444b308bbb6f57565e2cec6f765fde5aa3231..306ee4ac88fcc394bfd0bd961e1f209ac40739ae 100644
--- a/src/knot/server/server.c
+++ b/src/knot/server/server.c
@@ -13,11 +13,11 @@
 #include "knot/server/udp-handler.h"
 #include "knot/server/tcp-handler.h"
 #include "knot/server/xfr-handler.h"
-#include "libknot/name-server.h"
+#include "libknot/nameserver/name-server.h"
 #include "knot/stat/stat.h"
-#include "libknot/zonedb.h"
+#include "libknot/zone/zonedb.h"
 #include "knot/zone/zone-load.h"
-#include "libknot/debug.h"
+#include "libknot/util/debug.h"
 #include "libknot/dname.h"
 #include "knot/conf/conf.h"
 #include "knot/server/zones.h"
diff --git a/src/knot/server/server.h b/src/knot/server/server.h
index 2e71e17c5801020f9508d72da42c95c4b2ee6d62..be57b1598c3561074046bf08966805a7009fdf39 100644
--- a/src/knot/server/server.h
+++ b/src/knot/server/server.h
@@ -22,11 +22,11 @@
 #define _KNOTDSERVER_H_
 
 #include "knot/common.h"
-#include "libknot/name-server.h"
+#include "libknot/nameserver/name-server.h"
 #include "knot/server/xfr-handler.h"
 #include "knot/server/socket.h"
 #include "knot/server/dthreads.h"
-#include "libknot/zonedb.h"
+#include "libknot/zone/zonedb.h"
 #include "common/evsched.h"
 #include "common/lists.h"
 
diff --git a/src/knot/server/tcp-handler.c b/src/knot/server/tcp-handler.c
index 5a1436348201cc266faccbcc17892896059e4810..b4594f426251cb5fc72afd12472237d542038158 100644
--- a/src/knot/server/tcp-handler.c
+++ b/src/knot/server/tcp-handler.c
@@ -16,10 +16,10 @@
 #include "knot/common.h"
 #include "knot/server/tcp-handler.h"
 #include "knot/server/xfr-handler.h"
-#include "libknot/name-server.h"
+#include "libknot/nameserver/name-server.h"
 #include "knot/other/error.h"
 #include "knot/stat/stat.h"
-#include "libknot/wire.h"
+#include "libknot/util/wire.h"
 #include "knot/server/zones.h"
 
 /*! \brief TCP watcher. */
diff --git a/src/knot/server/udp-handler.c b/src/knot/server/udp-handler.c
index 24ce19763b33f6849ef4fb83ae9a6ba18beca431..8e89a4df20b72d9502ba61a053356c84eafe3a4b 100644
--- a/src/knot/server/udp-handler.c
+++ b/src/knot/server/udp-handler.c
@@ -13,12 +13,12 @@
 #include "knot/common.h"
 #include "knot/other/error.h"
 #include "knot/server/udp-handler.h"
-#include "libknot/name-server.h"
+#include "libknot/nameserver/name-server.h"
 #include "knot/stat/stat.h"
 #include "knot/server/server.h"
-#include "libknot/wire.h"
+#include "libknot/util/wire.h"
 #include "libknot/consts.h"
-#include "libknot/packet.h"
+#include "libknot/packet/packet.h"
 #include "knot/server/zones.h"
 #include "knot/server/notify.h"
 
diff --git a/src/knot/server/xfr-handler.c b/src/knot/server/xfr-handler.c
index 9bf7d8003fdcf4de8fe8e511ba52c6b800997c33..ad5510e9c92d52fed5956ad0a8e3803519bd9470 100644
--- a/src/knot/server/xfr-handler.c
+++ b/src/knot/server/xfr-handler.c
@@ -14,13 +14,13 @@
 
 #include "knot/common.h"
 #include "knot/server/xfr-handler.h"
-#include "libknot/name-server.h"
+#include "libknot/nameserver/name-server.h"
 #include "knot/other/error.h"
 #include "knot/server/socket.h"
 #include "knot/server/tcp-handler.h"
-#include "libknot/xfr-in.h"
+#include "libknot/updates/xfr-in.h"
 #include "knot/server/zones.h"
-#include "libknot/error.h"
+#include "libknot/util/error.h"
 
 /*! \brief XFR event wrapper for libev. */
 struct xfr_io_t
diff --git a/src/knot/server/xfr-handler.h b/src/knot/server/xfr-handler.h
index 6f0aebca0d5074b8271da315da10c25d8a98254c..40dad4caa02159d7f8f4fd63c8b73d544745298b 100644
--- a/src/knot/server/xfr-handler.h
+++ b/src/knot/server/xfr-handler.h
@@ -15,7 +15,7 @@
 #include <ev.h>
 
 #include "knot/server/dthreads.h"
-#include "libknot/name-server.h"
+#include "libknot/nameserver/name-server.h"
 #include "common/evqueue.h"
 
 /*!
diff --git a/src/knot/server/zones.c b/src/knot/server/zones.c
index aa8b12181a9a9c3d887ddb48b6589f2358529ce4..55e9529ec51744dd0f3e0ca61df9d1ea1af4c97b 100644
--- a/src/knot/server/zones.c
+++ b/src/knot/server/zones.c
@@ -1,25 +1,25 @@
 #include <sys/stat.h>
 
 #include "common/lists.h"
-#include "libknot/debug.h"
+#include "libknot/util/debug.h"
 #include "libknot/dname.h"
-#include "libknot/wire.h"
+#include "libknot/util/wire.h"
 #include "knot/zone/zone-dump-text.h"
 #include "knot/zone/zone-load.h"
-#include "libknot/zone.h"
-#include "libknot/zonedb.h"
+#include "libknot/zone/zone.h"
+#include "libknot/zone/zonedb.h"
 #include "knot/conf/conf.h"
 #include "knot/other/debug.h"
 #include "knot/other/error.h"
 #include "knot/other/log.h"
 #include "knot/server/notify.h"
 #include "knot/server/server.h"
-#include "libknot/xfr-in.h"
+#include "libknot/updates/xfr-in.h"
 #include "knot/server/zones.h"
-#include "libknot/error.h"
+#include "libknot/util/error.h"
 #include "knot/zone/zone-dump.h"
-#include "libknot/name-server.h"
-#include "libknot/changesets.h"
+#include "libknot/nameserver/name-server.h"
+#include "libknot/updates/changesets.h"
 
 static const size_t XFRIN_CHANGESET_BINARY_SIZE = 100;
 static const size_t XFRIN_CHANGESET_BINARY_STEP = 100;
diff --git a/src/knot/server/zones.h b/src/knot/server/zones.h
index 804b1638e21567603814b842eff9fb238374b83a..c5a06c2d13150e808ad20ef17c27794f045f4085 100644
--- a/src/knot/server/zones.h
+++ b/src/knot/server/zones.h
@@ -14,12 +14,12 @@
 
 #include "common/lists.h"
 #include "common/acl.h"
-#include "libknot/name-server.h"
-#include "libknot/zonedb.h"
+#include "libknot/nameserver/name-server.h"
+#include "libknot/zone/zonedb.h"
 #include "knot/conf/conf.h"
 #include "knot/server/journal.h"
-#include "libknot/zone.h"
-#include "libknot/xfr-in.h"
+#include "libknot/zone/zone.h"
+#include "libknot/updates/xfr-in.h"
 
 /* Constants. */
 #define IXFR_DBSYNC_TIMEOUT (60*1000) /*!< Database sync timeout = 60s. */
diff --git a/src/knot/zone/zone-dump-text.h b/src/knot/zone/zone-dump-text.h
index 6572b8e989a408428bce6d0da61903342b214d11..4e7605bcdff8be1616742d02e1156d616cf91b0e 100644
--- a/src/knot/zone/zone-dump-text.h
+++ b/src/knot/zone/zone-dump-text.h
@@ -12,8 +12,8 @@
 #ifndef _KNOT_ZONE_DUMP_TEXT_H_
 #define _KNOT_ZONE_DUMP_TEXT_H_
 
-#include "libknot/descriptor.h"
-#include "libknot/zone.h"
+#include "libknot/util/descriptor.h"
+#include "libknot/zone/zone.h"
 
 /*!
  * \brief Dumps given zone to text (BIND-like) file.
diff --git a/src/knot/zone/zone-dump.c b/src/knot/zone/zone-dump.c
index 82c2a9069626265c22517b15eadcdce9bf8295ed..0287138096adfab501b554d54dd51e72f2a68c69 100644
--- a/src/knot/zone/zone-dump.c
+++ b/src/knot/zone/zone-dump.c
@@ -7,11 +7,11 @@
 #include "libknot/common.h"
 #include "knot/zone/zone-dump.h"
 #include "libknot/libknot.h"
-#include "libknot/debug.h"
+#include "libknot/util/debug.h"
 #include "common/skip-list.h"
 #include "common/base32hex.h"
 #include "common/crc.h"
-#include "libknot/error.h"
+#include "libknot/util/error.h"
 
 #define ZONECHECKS_VERBOSE
 
diff --git a/src/knot/zone/zone-dump.h b/src/knot/zone/zone-dump.h
index 52404cc5cbd74178b250334707cab81e6c7216f6..0820756852187bef26f66500d237e238aabfca32 100644
--- a/src/knot/zone/zone-dump.h
+++ b/src/knot/zone/zone-dump.h
@@ -12,7 +12,7 @@
 #ifndef _KNOT_ZONEDUMP_H_
 #define _KNOT_ZONEDUMP_H_
 
-#include "libknot/zone.h"
+#include "libknot/zone/zone.h"
 
 /*!
  * \brief Zone loader enums.
diff --git a/src/knot/zone/zone-load.c b/src/knot/zone/zone-load.c
index 735f68164e880f3aa9f3d2cf11e179319e0e8f31..c84437815d06f4e410c54a82707f07b4e075fb6d 100644
--- a/src/knot/zone/zone-load.c
+++ b/src/knot/zone/zone-load.c
@@ -12,7 +12,7 @@
 #include "knot/zone/zone-load.h"
 #include "knot/zone/zone-dump.h"
 #include "libknot/libknot.h"
-#include "libknot/debug.h"
+#include "libknot/util/debug.h"
 
 /*!
  * \brief Compares two time_t values.
diff --git a/src/knot/zone/zone-load.h b/src/knot/zone/zone-load.h
index f03884e7c6f1e7473cc08cc65196237e8ab92410..58e124c900e5342351b600e163573f922283c0b3 100644
--- a/src/knot/zone/zone-load.h
+++ b/src/knot/zone/zone-load.h
@@ -14,7 +14,7 @@
 
 #include <stdio.h>
 
-#include "libknot/zone.h"
+#include "libknot/zone/zone.h"
 
 /*!
  * \brief Zone loader structure.
diff --git a/src/tests/libknot/libknot/dname_table_tests.c b/src/tests/libknot/libknot/dname_table_tests.c
index be768a57ccc91754ba7c5589cde62f1a45ee8a2f..d3a0573ed153ec076bab7eaeda36debc4960f532 100644
--- a/src/tests/libknot/libknot/dname_table_tests.c
+++ b/src/tests/libknot/libknot/dname_table_tests.c
@@ -3,8 +3,8 @@
 #include <assert.h>
 
 #include "dname_table_tests.h"
-#include "libknot/error.h"
-#include "libknot/dname-table.h"
+#include "libknot/util/error.h"
+#include "libknot/zone/dname-table.h"
 /* *test_t structures */
 #include "tests/libknot/realdata/libknot_tests_loader_realdata.h"
 
diff --git a/src/tests/libknot/libknot/dname_tests.c b/src/tests/libknot/libknot/dname_tests.c
index 1b6ba8366627de1f900f932a5517c5a2641f859e..5f9fb094f177d99d28f8da04ebf8f4834f8be358 100644
--- a/src/tests/libknot/libknot/dname_tests.c
+++ b/src/tests/libknot/libknot/dname_tests.c
@@ -3,7 +3,7 @@
 
 #include "tests/libknot/libknot/dname_tests.h"
 #include "libknot/dname.h"
-#include "libknot/node.h"
+#include "libknot/zone/node.h"
 
 static int knot_dname_tests_count(int argc, char *argv[]);
 static int knot_dname_tests_run(int argc, char *argv[]);
diff --git a/src/tests/libknot/libknot/node_tests.c b/src/tests/libknot/libknot/node_tests.c
index 793c0829f7a1e1225bf9c15fd075d16c7b871365..4764224d5929d120e518d15cba44499bc651310d 100644
--- a/src/tests/libknot/libknot/node_tests.c
+++ b/src/tests/libknot/libknot/node_tests.c
@@ -1,7 +1,7 @@
 #include "tests/libknot/libknot/node_tests.h"
 #include "libknot/dname.h"
-#include "libknot/node.h"
-#include "libknot/descriptor.h"
+#include "libknot/zone/node.h"
+#include "libknot/util/descriptor.h"
 
 static int knot_node_tests_count(int argc, char *argv[]);
 static int knot_node_tests_run(int argc, char *argv[]);
diff --git a/src/tests/libknot/libknot/nsec3_tests.c b/src/tests/libknot/libknot/nsec3_tests.c
index f217dd88f0dfd089f0560761a7ceb9b7fca72cc7..dc03ad153929eb3aed5d050c2f3dedefb645d9ef 100644
--- a/src/tests/libknot/libknot/nsec3_tests.c
+++ b/src/tests/libknot/libknot/nsec3_tests.c
@@ -3,9 +3,9 @@
 #include <assert.h>
 
 #include "libknot/common.h"
-#include "libknot/error.h"
+#include "libknot/util/error.h"
 #include "libknot/nsec3.h"
-#include "libknot/utils.h"
+#include "libknot/util/utils.h"
 #include "common/base32hex.h"
 #include "nsec3_tests.h"
 
diff --git a/src/tests/libknot/libknot/packet_tests.c b/src/tests/libknot/libknot/packet_tests.c
index 963631022a26c047888e59432158973aadd4ebd0..b5b5fc157cfba4df8264b09f74c6e62d4a244da9 100644
--- a/src/tests/libknot/libknot/packet_tests.c
+++ b/src/tests/libknot/libknot/packet_tests.c
@@ -4,9 +4,9 @@
 #include <stdint.h>
 
 #include "packet_tests.h"
-#include "libknot/error.h"
-#include "libknot/packet.h"
-#include "libknot/wire.h"
+#include "libknot/util/error.h"
+#include "libknot/packet/packet.h"
+#include "libknot/util/wire.h"
 /* *test_t structures */
 #include "tests/libknot/realdata/libknot_tests_loader_realdata.h"
 
diff --git a/src/tests/libknot/libknot/query_tests.c b/src/tests/libknot/libknot/query_tests.c
index 9b59741ee1a3f0528afbd11dcd6419846b6c9eb5..c0793482f7216083df2efdd6061b6b78adbff271 100644
--- a/src/tests/libknot/libknot/query_tests.c
+++ b/src/tests/libknot/libknot/query_tests.c
@@ -4,10 +4,10 @@
 #include <stdint.h>
 
 #include "packet_tests.h"
-#include "libknot/error.h"
-#include "libknot/packet.h"
-#include "libknot/wire.h"
-#include "libknot/query.h"
+#include "libknot/util/error.h"
+#include "libknot/packet/packet.h"
+#include "libknot/util/wire.h"
+#include "libknot/packet/query.h"
 /* *test_t structures */
 #include "tests/libknot/realdata/libknot_tests_loader_realdata.h"
 
diff --git a/src/tests/libknot/libknot/rdata_tests.c b/src/tests/libknot/libknot/rdata_tests.c
index 94dc3803882ef294ce2dd834b7137f73110c2a51..c132beba037b4a4768edf6403d2717a0db039aae 100644
--- a/src/tests/libknot/libknot/rdata_tests.c
+++ b/src/tests/libknot/libknot/rdata_tests.c
@@ -4,9 +4,9 @@
 #include "tests/libknot/libknot/rdata_tests.h"
 #include "libknot/common.h"
 #include "libknot/rdata.h"
-#include "libknot/descriptor.h"
-#include "libknot/utils.h"
-#include "libknot/error.h"
+#include "libknot/util/descriptor.h"
+#include "libknot/util/utils.h"
+#include "libknot/util/error.h"
 
 enum { TEST_DOMAINS_OK = 8 };
 
diff --git a/src/tests/libknot/libknot/response2_tests.c b/src/tests/libknot/libknot/response2_tests.c
index d11c1d9918399933d645e56d2ce671e3e997c30a..d76cd1ca394d737e83a45f8d3461519a91340bd7 100644
--- a/src/tests/libknot/libknot/response2_tests.c
+++ b/src/tests/libknot/libknot/response2_tests.c
@@ -6,13 +6,13 @@
 #include "tests/libknot/libknot/response2_tests.h"
 #include "common/lists.h"
 #include "libknot/common.h"
-#include "libknot/error.h"
-#include "libknot/response2.h"
+#include "libknot/util/error.h"
+#include "libknot/packet/response2.h"
 #include "libknot/rdata.h"
 #include "libknot/rrset.h"
 #include "libknot/dname.h"
-#include "libknot/wire.h"
-#include "libknot/descriptor.h"
+#include "libknot/util/wire.h"
+#include "libknot/util/descriptor.h"
 #include "libknot/edns.h"
 
 #ifdef TEST_WITH_LDNS
diff --git a/src/tests/libknot/libknot/response_tests.c b/src/tests/libknot/libknot/response_tests.c
index e2369d17ab4ade035e4e9dba689a974578981d96..5b6c90476d030d6243995d3663a2ddf96c3d723e 100644
--- a/src/tests/libknot/libknot/response_tests.c
+++ b/src/tests/libknot/libknot/response_tests.c
@@ -4,12 +4,12 @@
 //#define RESP_TEST_DEBUG
 #include "tests/libknot/libknot/response_tests.h"
 #include "libknot/common.h"
-#include "libknot/response.h"
+#include "libknot/packet/response.h"
 #include "libknot/rdata.h"
 #include "libknot/rrset.h"
 #include "libknot/dname.h"
-#include "libknot/wire.h"
-#include "libknot/descriptor.h"
+#include "libknot/util/wire.h"
+#include "libknot/util/descriptor.h"
 #include "libknot/edns.h"
 
 #ifdef TEST_WITH_LDNS
diff --git a/src/tests/libknot/libknot/rrset_tests.c b/src/tests/libknot/libknot/rrset_tests.c
index 20506141300df6cc5a7f4fedbf0beb30fb021b2c..461d80eb3c416393756194e0ce5028f99a8597ae 100644
--- a/src/tests/libknot/libknot/rrset_tests.c
+++ b/src/tests/libknot/libknot/rrset_tests.c
@@ -2,13 +2,13 @@
 
 #include "tests/libknot/libknot/rrset_tests.h"
 #include "libknot/common.h"
-#include "libknot/descriptor.h"
+#include "libknot/util/descriptor.h"
 #include "libknot/rrset.h"
 #include "libknot/dname.h"
 #include "libknot/rdata.h"
-#include "libknot/utils.h"
-#include "libknot/node.h"
-#include "libknot/debug.h"
+#include "libknot/util/utils.h"
+#include "libknot/zone/node.h"
+#include "libknot/util/debug.h"
 
 static int knot_rrset_tests_count(int argc, char *argv[]);
 static int knot_rrset_tests_run(int argc, char *argv[]);
diff --git a/src/tests/libknot/libknot/zone_tests.c b/src/tests/libknot/libknot/zone_tests.c
index cce6bb5e1dc9c0ef35071c31a31b97eea7007d8d..f4182704751a36e7612f28dd5d79fd2330c01824 100644
--- a/src/tests/libknot/libknot/zone_tests.c
+++ b/src/tests/libknot/libknot/zone_tests.c
@@ -2,10 +2,10 @@
 
 #include "tests/libknot/libknot/zone_tests.h"
 #include "libknot/common.h"
-#include "libknot/dname-table.h"
-#include "libknot/zone.h"
-#include "libknot/error.h"
-#include "libknot/node.h"
+#include "libknot/zone/dname-table.h"
+#include "libknot/zone/zone.h"
+#include "libknot/util/error.h"
+#include "libknot/zone/node.h"
 
 static int knot_zone_tests_count(int argc, char *argv[]);
 static int knot_zone_tests_run(int argc, char *argv[]);
diff --git a/src/tests/libknot/realdata/libknot/node_tests_realdata.c b/src/tests/libknot/realdata/libknot/node_tests_realdata.c
index 46b8ebbc733fdaa0851711ec9a55b3e77b1f7e95..75f595cf3955186c5d61d176a872cf3b66ea32e1 100644
--- a/src/tests/libknot/realdata/libknot/node_tests_realdata.c
+++ b/src/tests/libknot/realdata/libknot/node_tests_realdata.c
@@ -3,8 +3,8 @@
 #include "tests/libknot/realdata/libknot/node_tests_realdata.h"
 #include "tests/libknot/realdata/libknot_tests_loader_realdata.h"
 #include "libknot/dname.h"
-#include "libknot/node.h"
-#include "libknot/descriptor.h"
+#include "libknot/zone/node.h"
+#include "libknot/util/descriptor.h"
 
 static int knot_node_tests_count(int argc, char *argv[]);
 static int knot_node_tests_run(int argc, char *argv[]);
diff --git a/src/tests/libknot/realdata/libknot/packet_tests_realdata.c b/src/tests/libknot/realdata/libknot/packet_tests_realdata.c
index 0b7e59233a83b4c305cb3a4b8bf31d24da3bc61c..6770655b66de57ef378f0fa1bb1cb1b4b6095c33 100644
--- a/src/tests/libknot/realdata/libknot/packet_tests_realdata.c
+++ b/src/tests/libknot/realdata/libknot/packet_tests_realdata.c
@@ -3,9 +3,9 @@
 #include <assert.h>
 
 #include "packet_tests_realdata.h"
-#include "libknot/error.h"
-#include "libknot/packet.h"
-#include "libknot/response2.h"
+#include "libknot/util/error.h"
+#include "libknot/packet/packet.h"
+#include "libknot/packet/response2.h"
 /* *test_t structures */
 #include "tests/libknot/realdata/libknot_tests_loader_realdata.h"
 #ifdef TEST_WITH_LDNS
diff --git a/src/tests/libknot/realdata/libknot/rdata_tests_realdata.c b/src/tests/libknot/realdata/libknot/rdata_tests_realdata.c
index 9e5314246ce6bedd21bafbbd1f6384a7b538dd07..19654a7b99b997b80430d09e500a98a763496c18 100644
--- a/src/tests/libknot/realdata/libknot/rdata_tests_realdata.c
+++ b/src/tests/libknot/realdata/libknot/rdata_tests_realdata.c
@@ -5,9 +5,9 @@
 #include "tests/libknot/realdata/libknot_tests_loader_realdata.h"
 #include "libknot/common.h"
 #include "libknot/rdata.h"
-#include "libknot/descriptor.h"
-#include "libknot/utils.h"
-#include "libknot/error.h"
+#include "libknot/util/descriptor.h"
+#include "libknot/util/utils.h"
+#include "libknot/util/error.h"
 
 static int knot_rdata_tests_count(int argc, char *argv[]);
 static int knot_rdata_tests_run(int argc, char *argv[]);
diff --git a/src/tests/libknot/realdata/libknot/response2_tests_realdata.c b/src/tests/libknot/realdata/libknot/response2_tests_realdata.c
index 53b6c991d710c284a711dc9eb4c5b037c09f259d..d1450a60145ff5bc8b1ca3ca61410b6a7e48ed86 100644
--- a/src/tests/libknot/realdata/libknot/response2_tests_realdata.c
+++ b/src/tests/libknot/realdata/libknot/response2_tests_realdata.c
@@ -3,9 +3,9 @@
 #include <assert.h>
 
 #include "packet_tests_realdata.h"
-#include "libknot/error.h"
-#include "libknot/packet.h"
-#include "libknot/response2.h"
+#include "libknot/util/error.h"
+#include "libknot/packet/packet.h"
+#include "libknot/packet/response2.h"
 /* *test_t structures */
 #include "tests/libknot/realdata/libknot_tests_loader_realdata.h"
 #ifdef TEST_WITH_LDNS
diff --git a/src/tests/libknot/realdata/libknot/response_tests_realdata.c b/src/tests/libknot/realdata/libknot/response_tests_realdata.c
index 88ba921ed9d58759603cc1e70043c58f95f5ca4c..2892406b28c6375a828fa63315a94562b0b7cd7c 100644
--- a/src/tests/libknot/realdata/libknot/response_tests_realdata.c
+++ b/src/tests/libknot/realdata/libknot/response_tests_realdata.c
@@ -5,11 +5,11 @@
 #include "tests/libknot/realdata/libknot/response_tests_realdata.h"
 #include "tests/libknot/realdata/libknot_tests_loader_realdata.h"
 #include "libknot/common.h"
-#include "libknot/response.h"
+#include "libknot/packet/response.h"
 #include "libknot/rdata.h"
 #include "libknot/rrset.h"
 #include "libknot/dname.h"
-#include "libknot/descriptor.h"
+#include "libknot/util/descriptor.h"
 #include "libknot/edns.h"
 #include "common/lists.h"
 
diff --git a/src/tests/libknot/realdata/libknot/rrset_tests_realdata.c b/src/tests/libknot/realdata/libknot/rrset_tests_realdata.c
index e3d4f176bd561acd0d51ed4e7fdac7614ce4d41f..1b56a36faea96a163da13786c5a3231500f4679d 100644
--- a/src/tests/libknot/realdata/libknot/rrset_tests_realdata.c
+++ b/src/tests/libknot/realdata/libknot/rrset_tests_realdata.c
@@ -3,13 +3,13 @@
 #include "tests/libknot/realdata/libknot/rrset_tests_realdata.h"
 #include "tests/libknot/realdata/libknot_tests_loader_realdata.h"
 #include "libknot/common.h"
-#include "libknot/descriptor.h"
+#include "libknot/util/descriptor.h"
 #include "libknot/rrset.h"
 #include "libknot/dname.h"
 #include "libknot/rdata.h"
-#include "libknot/utils.h"
-#include "libknot/node.h"
-#include "libknot/debug.h"
+#include "libknot/util/utils.h"
+#include "libknot/zone/node.h"
+#include "libknot/util/debug.h"
 
 static int knot_rrset_tests_count(int argc, char *argv[]);
 static int knot_rrset_tests_run(int argc, char *argv[]);
diff --git a/src/tests/libknot/realdata/libknot/zone_tests_realdata.c b/src/tests/libknot/realdata/libknot/zone_tests_realdata.c
index b9afa163959129d466a84c577a85046e7763135b..0b813fb82f0986017fffdc23c88004a665733f0d 100644
--- a/src/tests/libknot/realdata/libknot/zone_tests_realdata.c
+++ b/src/tests/libknot/realdata/libknot/zone_tests_realdata.c
@@ -3,9 +3,9 @@
 #include "tests/libknot/realdata/libknot/zone_tests_realdata.h"
 #include "tests/libknot/realdata/libknot_tests_loader_realdata.h"
 #include "libknot/common.h"
-#include "libknot/zone.h"
-#include "libknot/error.h"
-#include "libknot/node.h"
+#include "libknot/zone/zone.h"
+#include "libknot/util/error.h"
+#include "libknot/zone/node.h"
 
 static int knot_zone_tests_count(int argc, char *argv[]);
 static int knot_zone_tests_run(int argc, char *argv[]);
diff --git a/src/tests/libknot/realdata/libknot_tests_loader_realdata.c b/src/tests/libknot/realdata/libknot_tests_loader_realdata.c
index 1ac9fb7c3dec5903452c10f942a1ddcff3d1fdaa..44cc86327f8bd0ef3bf258d458185e7c1230de03 100644
--- a/src/tests/libknot/realdata/libknot_tests_loader_realdata.c
+++ b/src/tests/libknot/realdata/libknot_tests_loader_realdata.c
@@ -4,7 +4,7 @@
 
 #include "common/libtap/tap.h"
 #include "tests/libknot/realdata/libknot_tests_loader_realdata.h"
-#include "libknot/descriptor.h"
+#include "libknot/util/descriptor.h"
 
 #include "tests/libknot/realdata/parsed_data.rc"
 #include "tests/libknot/realdata/raw_data.rc"
diff --git a/src/zcompile/parser-descriptor.h b/src/zcompile/parser-descriptor.h
index 51f8d772208580607904a39f35e5593b690bdc2f..7d46904377202af442c81bdccc5f293c541d653e 100644
--- a/src/zcompile/parser-descriptor.h
+++ b/src/zcompile/parser-descriptor.h
@@ -15,7 +15,7 @@
 #include <stdint.h>
 #include <stdbool.h>
 
-#include "libknot/utils.h"
+#include "libknot/util/utils.h"
 
 enum parser_mxrdtln {
 	PARSER_MAX_RDATA_ITEMS = 64,
diff --git a/src/zcompile/parser-util.c b/src/zcompile/parser-util.c
index f049788d4f275d3adf25b07a9a9546b6b904a1d3..a44cb6040be0a6c0d9d6efa7a03ac1e4c762e1ee 100644
--- a/src/zcompile/parser-util.c
+++ b/src/zcompile/parser-util.c
@@ -29,8 +29,8 @@
 //#include "common.h"
 #include "zcompile/parser-util.h"
 #include "zcompile/zcompile.h"
-#include "libknot/descriptor.h"
-#include "libknot/utils.h"
+#include "libknot/util/descriptor.h"
+#include "libknot/util/utils.h"
 
 #define IP6ADDRLEN	(128/8)
 #define	NS_INT16SZ	2
diff --git a/src/zcompile/parser-util.h b/src/zcompile/parser-util.h
index 5b2605d1c7291e5e27ea68416dc8829f35272d3c..7c19860625e22c4477f276455937c308138c5ec4 100644
--- a/src/zcompile/parser-util.h
+++ b/src/zcompile/parser-util.h
@@ -28,7 +28,7 @@
 #include <netdb.h>
 
 #include "zcompile/zcompile.h"
-#include "libknot/descriptor.h"
+#include "libknot/util/descriptor.h"
 
 int inet_pton4(const char *src, uint8_t *dst);
 int inet_pton6(const char *src, uint8_t *dst);
diff --git a/src/zcompile/tests/zcompile_tests.c b/src/zcompile/tests/zcompile_tests.c
index 2c870d5cf249de7825734b96f0c7e67d8ea2fdf5..b34b948ad0201cb66ea4b26661a40ae1d417bb5f 100644
--- a/src/zcompile/tests/zcompile_tests.c
+++ b/src/zcompile/tests/zcompile_tests.c
@@ -1,9 +1,9 @@
 #include <assert.h>
 
-#include "libknot/zone.h"
+#include "libknot/zone/zone.h"
 #include "knot/zone/zone-load.h"
 #include "libknot/rrset.h"
-#include "libknot/descriptor.h"
+#include "libknot/util/descriptor.h"
 #include "zcompile/zcompile.h"
 
 #ifdef TEST_WITH_LDNS
diff --git a/src/zcompile/zcompile.h b/src/zcompile/zcompile.h
index ec9f4cf1fe9d980b720bb9a4a99a93b9bc9bbf94..2c4c068cca76270227bf60a4dbb3270ce687e299 100644
--- a/src/zcompile/zcompile.h
+++ b/src/zcompile/zcompile.h
@@ -19,11 +19,11 @@
 
 #include "libknot/dname.h"
 #include "libknot/rrset.h"
-#include "libknot/node.h"
+#include "libknot/zone/node.h"
 #include "libknot/rdata.h"
-#include "libknot/zone.h"
-#include "libknot/dname-table.h"
-#include "libknot/dname-table.h"
+#include "libknot/zone/zone.h"
+#include "libknot/zone/dname-table.h"
+#include "libknot/zone/dname-table.h"
 #include "common/slab/slab.h"
 
 #define MAXRDATALEN	64	/*!< Maximum number of RDATA items. */
diff --git a/src/zcompile/zparser.y b/src/zcompile/zparser.y
index 3650aab7cb674788142afe692bfc8b741b9ca65e..8f14b9d825e214396d1a4ba8947740ae4c937ba9 100644
--- a/src/zcompile/zparser.y
+++ b/src/zcompile/zparser.y
@@ -23,7 +23,7 @@
 #include "zcompile/parser-util.h"
 
 #include "libknot/dname.h"
-#include "libknot/zone.h"
+#include "libknot/zone/zone.h"
 #include "zcompile/zcompile.h"
 #include "zcompile/parser-descriptor.h"
 #include "zcompile/zcompile-error.h"