diff --git a/include/logger.h b/include/logger.h
new file mode 100644
index 0000000000000000000000000000000000000000..c4b28989929b635ecf49fb54d1d9888fa8e47111
--- /dev/null
+++ b/include/logger.h
@@ -0,0 +1,19 @@
+/* 
+ * File:   logger.h
+ * Author: Eckl Máté <ecklm94@gmail.com>
+ *
+ * Created on 2016. május 24., 13:50
+ */
+
+#ifndef LOGGER_H
+#define LOGGER_H
+
+#include <syslog.h>
+
+#define LOGGER_FUNCTION_HEADER(func_name) void (func_name)(int __pri, const char *__fmt, ...)
+
+typedef LOGGER_FUNCTION_HEADER(*logger);
+
+LOGGER_FUNCTION_HEADER(syslog_on_demand);
+LOGGER_FUNCTION_HEADER(stdlog_on_demand);
+#endif /* LOGGER_H */
diff --git a/main.cpp b/main.cpp
index 9aa132aebbd525966b563ba37d121148fbbee2b1..805ed071d55cec2175cad7b167bcb40c8304f437 100644
--- a/main.cpp
+++ b/main.cpp
@@ -5,16 +5,66 @@
  * Created on 2016. április 19., 12:59
  */
 
-#include <stdio.h>
 #include <string.h>
 #include <string>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <pwd.h>
 
 #include "include/general_sockaddr_wp.h"
 #include "include/dns_server.h"
 #include "include/exceptions/db_exception.h"
+#include "include/logger.h"
+
+#define WORKING_DIR "/home/mate/Dokumentumok/Egyetem/Tárgyak/2016 tavasz/Linux programozás/HF/DNS_server"
+
+logger log_on_demand;
+
+bool run_as_daemon = false;
+
+void parse_options(int argc, char *argv[]);
+void print_help();
 
 int main(int argc, char *argv[])
 {
+	parse_options(argc, argv);
+	if(!run_as_daemon)
+	{
+		log_on_demand = stdlog_on_demand;
+	}
+	else
+	{
+		openlog("ecklm-dns", LOG_PID, LOG_DAEMON);
+		log_on_demand = syslog_on_demand;
+#ifdef DEBUG // ezt az egész mókát parancssori paraméterektől kell majd függővé tenni
+		if(daemon(0,1) < 0)
+#else
+		if(daemon(0,0) < 0)
+#endif
+		{
+			log_on_demand(LOG_ERR, "%s: %s\n", "daemon", strerror(errno));
+			exit(EXIT_FAILURE);
+		}
+	}
+	log_on_demand(LOG_INFO, "Server started on pid %d\n", getpid()); // Enélkül nem hajlandó sudo után logolni.
+
+	struct passwd *new_uid = getpwnam("dnsuser");
+
+	if(chroot(WORKING_DIR) < 0)
+	{
+		log_on_demand(LOG_ERR, "%s: %s\n", "chroot", strerror(errno));
+		exit(EXIT_SUCCESS);
+	}
+	log_on_demand(LOG_INFO, "Chrooted to \"%s\"\n", WORKING_DIR);
+	if(chdir("/") < 0)
+	{
+		log_on_demand(LOG_ERR, "%s: %s\n", "chdir", strerror(errno));
+		exit(EXIT_FAILURE);
+	}
+	setgid(new_uid->pw_gid);
+	setuid(new_uid->pw_uid);
+
 // --------------- INIT ---------------------
 	dns_server server;
 	try
@@ -23,12 +73,12 @@ int main(int argc, char *argv[])
 	}
 	catch(db_exception ex)
 	{
-		printf(ex.what());
+		log_on_demand(LOG_ERR, "%s\n", ex.what());
 		exit(EXIT_FAILURE);
 	}
 
 	// Init server
-	struct in6_addr in6_addr_any = IN6ADDR_LOOPBACK_INIT;
+	struct in6_addr in6_addr_any = IN6ADDR_ANY_INIT; //IN6ADDR_LOOPBACK_INIT;
 	struct sockaddr_in6 server_address;
 	memset(&server_address, 0, sizeof(server_address));
 	server_address.sin6_family = AF_INET6;
@@ -37,17 +87,65 @@ int main(int argc, char *argv[])
 #ifdef DEBUG
 	static char addr[INET6_ADDRSTRLEN];
 	inet_ntop(server_address.sin6_family, &server_address.sin6_addr, addr, INET6_ADDRSTRLEN);
-	printf("%s\n",addr);
+	log_on_demand(LOG_DEBUG, "Server started serving on: %s\n",addr);
 #endif
 	server.init(general_sockaddr_wp((sockaddr *) &server_address, sizeof(server_address)));
 // ----------------- INIT END --------------------------
 
 // ------------------ SERVE ----------------------------
 	server.serve_one_request();
-// ------------------ SERVE END -------------------------
+// ---------------- SERVE END -------------------------
 
 // ------------------- SHUTDOWN -------------------------
 	server.shutdown();
 // ----------------- SHUTDOWN END -----------------------
 	exit(EXIT_SUCCESS);
 }
+
+void parse_options(int argc, char *argv[]) {
+	int o;
+	while((o = getopt (argc, argv, "dmskvh")) != -1)
+	{
+		switch(o)
+		{
+			case 'd':
+				run_as_daemon = true;
+				break;
+			case 'm':
+				throw "Not implemented";
+				break;
+			case 's':
+				throw "Not implemented";
+				break;
+			case 'k':
+				throw "Not implemented";
+				break;
+			case 'v':
+				throw "Not implemented";
+				break;
+			case 'h':
+				print_help();
+				exit(EXIT_SUCCESS);
+			case '?':
+				print_help();
+				exit(EXIT_FAILURE);
+				break;
+			default:
+				break;
+		}
+	}
+}
+
+void print_help() {
+	printf(R"(Usage: Runs in foreground mode by default.
+For more info look at the man page.
+
+Options:
+	-d Run as daemon
+	-m Monitor daemon
+	-s Statistics from daemon
+	-k Kill daemon
+	-v Verbose
+	-h help
+)");
+}
diff --git a/nbproject/Makefile-Debug.mk b/nbproject/Makefile-Debug.mk
index 1ac0a6a39740c6163dd900386610344410f7adbf..aac2278f7be95696e1df5b823c2b480069a4ec21 100644
--- a/nbproject/Makefile-Debug.mk
+++ b/nbproject/Makefile-Debug.mk
@@ -43,6 +43,7 @@ OBJECTFILES= \
 	${OBJECTDIR}/src/dns_server.o \
 	${OBJECTDIR}/src/dns_types.o \
 	${OBJECTDIR}/src/general_sockaddr_wp.o \
+	${OBJECTDIR}/src/logger.o \
 	${OBJECTDIR}/src/udp_packet_wp.o \
 	${OBJECTDIR}/src/udp_socket_wp.o
 
@@ -74,52 +75,57 @@ ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/dns_server: ${OBJECTFILES}
 ${OBJECTDIR}/main.o: main.cpp 
 	${MKDIR} -p ${OBJECTDIR}
 	${RM} "$@.d"
-	$(COMPILE.cc) -g -Wall -DDEBUG -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/main.o main.cpp
+	$(COMPILE.cc) -g -Wall -DDEBUG -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/main.o main.cpp
 
 ${OBJECTDIR}/src/dns_answer.o: src/dns_answer.cpp 
 	${MKDIR} -p ${OBJECTDIR}/src
 	${RM} "$@.d"
-	$(COMPILE.cc) -g -Wall -DDEBUG -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_answer.o src/dns_answer.cpp
+	$(COMPILE.cc) -g -Wall -DDEBUG -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_answer.o src/dns_answer.cpp
 
 ${OBJECTDIR}/src/dns_db.o: src/dns_db.cpp 
 	${MKDIR} -p ${OBJECTDIR}/src
 	${RM} "$@.d"
-	$(COMPILE.cc) -g -Wall -DDEBUG -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_db.o src/dns_db.cpp
+	$(COMPILE.cc) -g -Wall -DDEBUG -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_db.o src/dns_db.cpp
 
 ${OBJECTDIR}/src/dns_message.o: src/dns_message.cpp 
 	${MKDIR} -p ${OBJECTDIR}/src
 	${RM} "$@.d"
-	$(COMPILE.cc) -g -Wall -DDEBUG -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_message.o src/dns_message.cpp
+	$(COMPILE.cc) -g -Wall -DDEBUG -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_message.o src/dns_message.cpp
 
 ${OBJECTDIR}/src/dns_question.o: src/dns_question.cpp 
 	${MKDIR} -p ${OBJECTDIR}/src
 	${RM} "$@.d"
-	$(COMPILE.cc) -g -Wall -DDEBUG -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_question.o src/dns_question.cpp
+	$(COMPILE.cc) -g -Wall -DDEBUG -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_question.o src/dns_question.cpp
 
 ${OBJECTDIR}/src/dns_server.o: src/dns_server.cpp 
 	${MKDIR} -p ${OBJECTDIR}/src
 	${RM} "$@.d"
-	$(COMPILE.cc) -g -Wall -DDEBUG -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_server.o src/dns_server.cpp
+	$(COMPILE.cc) -g -Wall -DDEBUG -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_server.o src/dns_server.cpp
 
 ${OBJECTDIR}/src/dns_types.o: src/dns_types.cpp 
 	${MKDIR} -p ${OBJECTDIR}/src
 	${RM} "$@.d"
-	$(COMPILE.cc) -g -Wall -DDEBUG -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_types.o src/dns_types.cpp
+	$(COMPILE.cc) -g -Wall -DDEBUG -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_types.o src/dns_types.cpp
 
 ${OBJECTDIR}/src/general_sockaddr_wp.o: src/general_sockaddr_wp.cpp 
 	${MKDIR} -p ${OBJECTDIR}/src
 	${RM} "$@.d"
-	$(COMPILE.cc) -g -Wall -DDEBUG -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/general_sockaddr_wp.o src/general_sockaddr_wp.cpp
+	$(COMPILE.cc) -g -Wall -DDEBUG -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/general_sockaddr_wp.o src/general_sockaddr_wp.cpp
+
+${OBJECTDIR}/src/logger.o: src/logger.cpp 
+	${MKDIR} -p ${OBJECTDIR}/src
+	${RM} "$@.d"
+	$(COMPILE.cc) -g -Wall -DDEBUG -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/logger.o src/logger.cpp
 
 ${OBJECTDIR}/src/udp_packet_wp.o: src/udp_packet_wp.cpp 
 	${MKDIR} -p ${OBJECTDIR}/src
 	${RM} "$@.d"
-	$(COMPILE.cc) -g -Wall -DDEBUG -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/udp_packet_wp.o src/udp_packet_wp.cpp
+	$(COMPILE.cc) -g -Wall -DDEBUG -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/udp_packet_wp.o src/udp_packet_wp.cpp
 
 ${OBJECTDIR}/src/udp_socket_wp.o: src/udp_socket_wp.cpp 
 	${MKDIR} -p ${OBJECTDIR}/src
 	${RM} "$@.d"
-	$(COMPILE.cc) -g -Wall -DDEBUG -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/udp_socket_wp.o src/udp_socket_wp.cpp
+	$(COMPILE.cc) -g -Wall -DDEBUG -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/udp_socket_wp.o src/udp_socket_wp.cpp
 
 # Subprojects
 .build-subprojects:
diff --git a/nbproject/Makefile-Release.mk b/nbproject/Makefile-Release.mk
index 3d303271de39de10cdf03b969ee5e7691e25dd70..2f2dbcb807fdb495da55266d559448a4fcddff45 100644
--- a/nbproject/Makefile-Release.mk
+++ b/nbproject/Makefile-Release.mk
@@ -43,6 +43,7 @@ OBJECTFILES= \
 	${OBJECTDIR}/src/dns_server.o \
 	${OBJECTDIR}/src/dns_types.o \
 	${OBJECTDIR}/src/general_sockaddr_wp.o \
+	${OBJECTDIR}/src/logger.o \
 	${OBJECTDIR}/src/udp_packet_wp.o \
 	${OBJECTDIR}/src/udp_socket_wp.o
 
@@ -74,52 +75,57 @@ ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/dns_server: ${OBJECTFILES}
 ${OBJECTDIR}/main.o: main.cpp 
 	${MKDIR} -p ${OBJECTDIR}
 	${RM} "$@.d"
-	$(COMPILE.cc) -O2 -w -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/main.o main.cpp
+	$(COMPILE.cc) -O2 -w -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/main.o main.cpp
 
 ${OBJECTDIR}/src/dns_answer.o: src/dns_answer.cpp 
 	${MKDIR} -p ${OBJECTDIR}/src
 	${RM} "$@.d"
-	$(COMPILE.cc) -O2 -w -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_answer.o src/dns_answer.cpp
+	$(COMPILE.cc) -O2 -w -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_answer.o src/dns_answer.cpp
 
 ${OBJECTDIR}/src/dns_db.o: src/dns_db.cpp 
 	${MKDIR} -p ${OBJECTDIR}/src
 	${RM} "$@.d"
-	$(COMPILE.cc) -O2 -w -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_db.o src/dns_db.cpp
+	$(COMPILE.cc) -O2 -w -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_db.o src/dns_db.cpp
 
 ${OBJECTDIR}/src/dns_message.o: src/dns_message.cpp 
 	${MKDIR} -p ${OBJECTDIR}/src
 	${RM} "$@.d"
-	$(COMPILE.cc) -O2 -w -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_message.o src/dns_message.cpp
+	$(COMPILE.cc) -O2 -w -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_message.o src/dns_message.cpp
 
 ${OBJECTDIR}/src/dns_question.o: src/dns_question.cpp 
 	${MKDIR} -p ${OBJECTDIR}/src
 	${RM} "$@.d"
-	$(COMPILE.cc) -O2 -w -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_question.o src/dns_question.cpp
+	$(COMPILE.cc) -O2 -w -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_question.o src/dns_question.cpp
 
 ${OBJECTDIR}/src/dns_server.o: src/dns_server.cpp 
 	${MKDIR} -p ${OBJECTDIR}/src
 	${RM} "$@.d"
-	$(COMPILE.cc) -O2 -w -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_server.o src/dns_server.cpp
+	$(COMPILE.cc) -O2 -w -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_server.o src/dns_server.cpp
 
 ${OBJECTDIR}/src/dns_types.o: src/dns_types.cpp 
 	${MKDIR} -p ${OBJECTDIR}/src
 	${RM} "$@.d"
-	$(COMPILE.cc) -O2 -w -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_types.o src/dns_types.cpp
+	$(COMPILE.cc) -O2 -w -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_types.o src/dns_types.cpp
 
 ${OBJECTDIR}/src/general_sockaddr_wp.o: src/general_sockaddr_wp.cpp 
 	${MKDIR} -p ${OBJECTDIR}/src
 	${RM} "$@.d"
-	$(COMPILE.cc) -O2 -w -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/general_sockaddr_wp.o src/general_sockaddr_wp.cpp
+	$(COMPILE.cc) -O2 -w -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/general_sockaddr_wp.o src/general_sockaddr_wp.cpp
+
+${OBJECTDIR}/src/logger.o: src/logger.cpp 
+	${MKDIR} -p ${OBJECTDIR}/src
+	${RM} "$@.d"
+	$(COMPILE.cc) -O2 -w -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/logger.o src/logger.cpp
 
 ${OBJECTDIR}/src/udp_packet_wp.o: src/udp_packet_wp.cpp 
 	${MKDIR} -p ${OBJECTDIR}/src
 	${RM} "$@.d"
-	$(COMPILE.cc) -O2 -w -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/udp_packet_wp.o src/udp_packet_wp.cpp
+	$(COMPILE.cc) -O2 -w -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/udp_packet_wp.o src/udp_packet_wp.cpp
 
 ${OBJECTDIR}/src/udp_socket_wp.o: src/udp_socket_wp.cpp 
 	${MKDIR} -p ${OBJECTDIR}/src
 	${RM} "$@.d"
-	$(COMPILE.cc) -O2 -w -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/udp_socket_wp.o src/udp_socket_wp.cpp
+	$(COMPILE.cc) -O2 -w -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/udp_socket_wp.o src/udp_socket_wp.cpp
 
 # Subprojects
 .build-subprojects:
diff --git a/src/dns_db.cpp b/src/dns_db.cpp
index 66f28265818c2b4a477c6e3ddf88d99f7ca29805..31062449b5c480a0c7047bb933ef1183ddf8f2de 100644
--- a/src/dns_db.cpp
+++ b/src/dns_db.cpp
@@ -9,10 +9,13 @@
 #include "../include/dns_types.h"
 #include "../include/exceptions/db_exception.h"
 #include "../include/exceptions/dns_exception.h"
+#include "../include/logger.h"
 
 #include <string.h>
 #include <string>
 
+extern logger log_on_demand;
+
 using namespace std;
 bool dns_db::map_initialized = false;
 map<uint16_t, const char*> dns_db::readable_DNS_types;
@@ -87,9 +90,9 @@ static int callback(void *param, int argc, char **argv, char **azColName) {
 	strncpy(ret->content, argv[2], sizeof(ret->content));
 	ret->ttl = atoi(argv[3]);
 #ifdef DEBUG
+	log_on_demand(LOG_DEBUG, "Database hit:\n");
 	for(int i=0;i<argc;i++)
-		printf("%s = %s\n", azColName[i], argv[i]);
-	printf("\n");
+		log_on_demand(LOG_DEBUG, "%s = %s\n", azColName[i], argv[i]);
 #endif
 	return 0;
 }
diff --git a/src/dns_server.cpp b/src/dns_server.cpp
index a4efeb47bebe4331878caf032561812ab12135ed..bbdc969bab76dd57eeb6295805b49e668a62a1a8 100644
--- a/src/dns_server.cpp
+++ b/src/dns_server.cpp
@@ -9,6 +9,9 @@
 #include "../include/dns_types.h"
 #include "../include/exceptions/db_exception.h"
 #include "../include/exceptions/dns_exception.h"
+#include "../include/logger.h"
+
+extern logger log_on_demand;
 
 dns_server::dns_server(const general_sockaddr_wp& addr) {
 	init(addr);
@@ -52,7 +55,7 @@ void dns_server::serve_one_request() {
 #ifdef DEBUG
 	static char buf[INET6_ADDRSTRLEN];
 	dns_label_sequence_to_str(query.question_body.get_name(), buf, INET6_ADDRSTRLEN);
-	printf("%s\n", buf);
+	log_on_demand(LOG_DEBUG, "DNS query received from %s\n", buf);
 #endif
 
 	//dns response
@@ -73,7 +76,7 @@ void dns_server::serve_one_request() {
 	}
 	catch(db_exception ex)
 	{
-		printf("%s\n", ex.what());
+		log_on_demand(LOG_ERR, "%s\n", ex.what());
 	}
 	//---
 
diff --git a/src/logger.cpp b/src/logger.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..63866cb4a2f1e95ef6779f455390866899e3cc95
--- /dev/null
+++ b/src/logger.cpp
@@ -0,0 +1,25 @@
+#include "../include/logger.h"
+#include <stdarg.h>
+#include <stdio.h>
+
+LOGGER_FUNCTION_HEADER(syslog_on_demand) {
+	va_list args;
+	va_start(args, __fmt);
+	vsyslog(__pri, __fmt, args);
+	va_end(args);
+}
+
+LOGGER_FUNCTION_HEADER(stdlog_on_demand) {
+	va_list args;
+	va_start(args, __fmt);
+	switch(__pri)
+	{
+		case LOG_INFO:
+		case LOG_DEBUG:
+			vprintf(__fmt, args);
+			break;
+		default:
+			vfprintf(stderr, __fmt, args);
+	}
+	va_end(args);
+}
\ No newline at end of file