diff --git a/Doxy.page.h b/Doxy.page.h
new file mode 100644
index 0000000000000000000000000000000000000000..6823ef05afa29c17b12642955940b663d24877db
--- /dev/null
+++ b/Doxy.page.h
@@ -0,0 +1,49 @@
+/*!
+
+\defgroup data_structures   Data structures.
+\defgroup debugging         Project debugging API.
+\defgroup hashing           Hashing functions.
+\defgroup logging           Logging API.
+\defgroup server            Server API.
+\defgroup network           Networking.
+\defgroup query_processing  DNS query processing.
+\defgroup zonedb            Zone database.
+\defgroup statistics        Statistics module (optional).
+\defgroup utils             Utilities, constants and macros.
+\defgroup tests             Unit tests.
+
+
+\mainpage CuteDNS API documentation.
+
+CuteDNS is an open-source, high-performace, purely authoritative DNS server.
+- Multi-threaded architecture
+- Supports all important DNS protocols
+  - Full and incremental zone transfers
+  - Dynamic zone updates
+  - EDNS0 and DNSSEC compliant (including NSEC3)
+
+<h2>Requirements</h2>
+- ldns (at least 1.6.4): http://www.nlnetlabs.nl/projects/ldns/
+- liburcu (at least 0.4.5): http://lttng.org/urcu
+
+<h2>Installation</h2>
+
+\code
+make
+bin/cutedns samples/example.com.zone
+\endcode
+
+<h2>API modules</h2>
+- \ref data_structures
+- \ref debugging
+- \ref hashing
+- \ref logging
+- \ref server
+- \ref network
+- \ref query_processing
+- \ref zonedb
+- \ref statistics
+- \ref utils
+- \ref tests
+
+ */
diff --git a/Doxyfile b/Doxyfile
index 82d966dde90b0d027f8bec201664aee569a93548..49eff37737424483db6679551c0771dbb37a98a8 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -115,7 +115,7 @@ INLINE_INHERITED_MEMB  = NO
 # path before files name in the file list and in the header files. If set 
 # to NO the shortest path that makes the file name unique will be used.
 
-FULL_PATH_NAMES        = YES
+FULL_PATH_NAMES        = NO
 
 # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
 # can be used to strip a user-defined part of the path. Stripping is 
@@ -312,25 +312,25 @@ EXTRACT_ALL            = YES
 # If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
 # will be included in the documentation.
 
-EXTRACT_PRIVATE        = YES
+EXTRACT_PRIVATE        = NO
 
 # If the EXTRACT_STATIC tag is set to YES all static members of a file 
 # will be included in the documentation.
 
-EXTRACT_STATIC         = YES
+EXTRACT_STATIC         = NO
 
 # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
 # defined locally in source files will be included in the documentation. 
 # If set to NO only classes defined in header files are included.
 
-EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_CLASSES  = NO
 
 # This flag is only useful for Objective-C code. When set to YES local 
 # methods, which are defined in the implementation section but not in 
 # the interface are included in the documentation. 
 # If set to NO (the default) only methods in the interface are included.
 
-EXTRACT_LOCAL_METHODS  = YES
+EXTRACT_LOCAL_METHODS  = NO
 
 # If this flag is set to YES, the members of anonymous namespaces will be 
 # extracted and appear in the documentation as a namespace called 
@@ -520,7 +520,7 @@ LAYOUT_FILE            =
 # The QUIET tag can be used to turn on/off the messages that are generated 
 # by doxygen. Possible values are YES and NO. If left blank NO is used.
 
-QUIET                  = NO
+QUIET                  = YES
 
 # The WARNINGS tag can be used to turn on/off the warning messages that are 
 # generated by doxygen. Possible values are YES and NO. If left blank 
@@ -547,7 +547,7 @@ WARN_IF_DOC_ERROR      = YES
 # wrong or incomplete parameter documentation, but not about the absence of 
 # documentation.
 
-WARN_NO_PARAMDOC       = NO
+WARN_NO_PARAMDOC       = YES
 
 # The WARN_FORMAT tag determines the format of the warning messages that 
 # doxygen can produce. The string should contain the $file, $line, and $text 
@@ -573,7 +573,7 @@ WARN_LOGFILE           =
 # directories like "/usr/src/myproject". Separate the files or directories 
 # with spaces.
 
-INPUT                  = src/
+INPUT                  = src/ Doxy.page.h
 
 # This tag can be used to specify the character encoding of the source files 
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is 
diff --git a/Makefile b/Makefile
index 3833cf5d4d4306d197ac48689e005cec4b85aa97..d00d197a2de87a0c52e0b6ef79e07affee6d9e47 100644
--- a/Makefile
+++ b/Makefile
@@ -59,9 +59,12 @@ $(OBJ_DIR)%.o : %.c
 	@echo "$(COL_WHITE)Compiling $(COL_CYAN)$@: $(COL_BLUE)$< $(COL_END)"
 	@$(CC) $(CFLAGS) $(addprefix -I ,$(INC_DIRS)) -c -o $@ $<
 
-### Cleaning ###
-.PHONY: clean
+### Cleaning and documentation ###
+.PHONY: clean doc
 clean:
 	@echo "$(COL_WHITE)Cleaning object files...$(COL_RED)"
 	@rm -vf ${OBJ_DIR}/*.o
 	@echo "$(COL_WHITE)done$(COL_END)"
+
+doc:
+	@doxygen "Doxyfile"