diff --git a/ArpON-3.0-ng/src/main.c b/ArpON-3.0-ng/src/main.c
index 7045a13..23d9f0d 100644
--- a/ArpON-3.0-ng/src/main.c
+++ b/ArpON-3.0-ng/src/main.c
@@ -33,6 +33,9 @@
 
 #include <stdio.h>
 #include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <syslog.h>
 
 #include "dmn.h"
 #include "env.h"
@@ -43,12 +46,33 @@
 #include "sig.h"
 #include "thd.h"
 
+int syslog_verbosity;
+
 /*
  * ArpON Main.
  */
 int
 main(int argc, char **argv, char **envp)
 {
+    char* verbosity = getenv("ARPON_SYSLOG_VERBOSITY");
+
+    if (verbosity == NULL)
+      syslog_verbosity = LOG_INFO;
+    else if (strcmp(verbosity, "CRIT") == 0)
+      syslog_verbosity = LOG_CRIT;
+    else if (strcmp(verbosity, "ERR") == 0)
+      syslog_verbosity = LOG_ERR;
+    else if (strcmp(verbosity, "WARNING") == 0)
+      syslog_verbosity = LOG_WARNING;
+    else if (strcmp(verbosity, "INFO") == 0)
+      syslog_verbosity = LOG_INFO;
+    else if (strcmp(verbosity, "DEBUG") == 0)
+      syslog_verbosity = LOG_DEBUG;
+    else
+      syslog_verbosity = LOG_INFO;
+
+    /* Initialize syslog. */
+    openlog("arpon", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_DAEMON);
 
     /* Audit the environment. */
     env_audit(argv, envp);
diff --git a/ArpON-3.0-ng/src/msg.c b/ArpON-3.0-ng/src/msg.c
index 77ee70d..174c6e2 100644
--- a/ArpON-3.0-ng/src/msg.c
+++ b/ArpON-3.0-ng/src/msg.c
@@ -42,6 +42,7 @@
 #include <errno.h>
 #include <assert.h>
 #include <pthread.h>
+#include <syslog.h>
 
 #include "config.h"
 #include "exit.h"
@@ -58,23 +59,12 @@
  */
 #define MSG_MESSAGESIZE     512     /* 512 bytes. */
 
-/*
- * Log file permissions to 640.
- */
-#define MSG_LOGPERMS        S_IRUSR | S_IWUSR | S_IRGRP
+extern int syslog_verbosity;
 
 /*
  * Function prototypes not exported.
  */
-static void msg_init(void);
-static void msg_destroy(void);
 static void msg_gettimestamp(char *ts);
-static void msg_putmessage(FILE *stream, const char *msg);
-
-/*
- * Initialize the log file stream.
- */
-static FILE *log = NULL;
 
 /*
  * Initialize the message mutex.
@@ -82,7 +72,7 @@ static FILE *log = NULL;
 static pthread_mutex_t msg_mtx = PTHREAD_MUTEX_INITIALIZER;
 
 /*
- * Initialize the log file stream and print the message with logging.
+ * Print the message.
  * The syntax of each message is:
  *
  * timestamp1 [log level] message1
@@ -93,21 +83,38 @@ static pthread_mutex_t msg_mtx = PTHREAD_MUTEX_INITIALIZER;
 void
 msg(FILE *stream, const char *level, const char *fmt, ...)
 {
-
     do {
         char ts[MSG_TIMESTAMPSIZE], msg[MSG_MESSAGESIZE];
         va_list ap;
         int len1, len2, tot_len = MSG_MESSAGESIZE;
+        int syslog_lvl;
 
         /* Lock the mutex of the message. */
         if (pthread_mutex_lock(&msg_mtx) != 0)
             break;
 
-        /* Log file stream of the messages already initialized and open? */
-        if (log == NULL) {
-            /* Initialize the log file stream of the messages. */
-            msg_init();
-        }
+        if (strcmp(level, "BUG") == 0)
+          syslog_lvl = LOG_CRIT;
+        else if (strcmp(level, "ERROR") == 0)
+          syslog_lvl = LOG_ERR;
+        else if (strcmp(level, "WARN") == 0)
+          syslog_lvl = LOG_WARNING;
+        else if (strcmp(level, "INFO") == 0)
+          syslog_lvl = LOG_INFO;
+        else if (strcmp(level, "DEBUG") == 0)
+          syslog_lvl = LOG_DEBUG;
+        else
+          syslog_lvl = LOG_NOTICE;
+
+        if (syslog_verbosity < syslog_lvl)
+            return;
+
+        va_start(ap, fmt);
+
+        /* Print the message to syslog. */
+        vsyslog(syslog_lvl, fmt, ap);
+
+        va_end(ap);
 
         /* Get the timestamp of the message. */
         msg_gettimestamp(ts);
@@ -139,125 +146,17 @@ msg(FILE *stream, const char *level, const char *fmt, ...)
         /* No message truncated. */
         assert(tot_len > 0);
 
-        /* Print the message in the log file stream and the file stream. */
-        msg_putmessage(stream, msg);
-
-        /* Unlock the mutex of the message. */
-        if (pthread_mutex_unlock(&msg_mtx) != 0)
-            break;
-
-        return;
-    } while (0);
-
-    ERROR("%s", strerror(errno));
-    exit(EXIT_FAILURE);
-}
-
-/*
- * Initialize the log file stream of the messages.
- */
-static void
-msg_init(void)
-{
-
-    do {
-        struct stat stats;
-        bool UNUSED(logcreate) = false;
-
-        /* Check if the log file exist. */
-        if (stat(LOG_FILE, &stats) < 0) {
-            if (errno == ENOENT) {
-                int fd;
-
-                /* Create and open the log file with the 640 perms. */
-                if ((fd = open(LOG_FILE, O_CREAT, MSG_LOGPERMS)) < 0)
-                    break;
-
-                /* Close the log file descriptor. */
-                if (close(fd) < 0)
-                    break;
-
-                /* Call again. */
-                if (stat(LOG_FILE, &stats) < 0)
-                    break;
-
-#ifndef NDEBUG
-                /* Log file created. */
-                logcreate = true;
-#endif  /* !NDEBUG */
-            } else {
-                break;
-            }
-        }
-
-        /* Check if the log file is a regular file. */
-        if (S_ISREG(stats.st_mode) == 0) {
-            ERROR("%s is not a regular file", LOG_FILE);
-            exit(EXIT_FAILURE);
-        }
-
-        /* Fix the log file perms to 640. */
-        if (chmod(LOG_FILE, MSG_LOGPERMS) < 0)
-            break;
+        /* Print the message in the file stream. */
+        fprintf(stream, "%s", msg);
 
-        /* Open the log file stream to append. */
-        if ((log = fopen(LOG_FILE, "a")) == NULL)
+        /* Flush the file stream. */
+        if (fflush(stream) == EOF)
             break;
 
-#ifndef NDEBUG
         /* Unlock the mutex of the message. */
         if (pthread_mutex_unlock(&msg_mtx) != 0)
             break;
 
-        /* Log file created? */
-        if (logcreate == true)
-            MSG_DEBUG("Create %s with 640 perms successful", LOG_FILE);
-#endif  /* !NDEBUG */
-
-        MSG_DEBUG("Open %s successful", LOG_FILE);
-        MSG_DEBUG("Start logging");
-
-        /* Push msg_destroy() to be called on exit_cleanup(). */
-        exit_push(msg_destroy, "msg_destroy");
-
-#ifndef NDEBUG
-        /* Lock the mutex of the message. */
-        if (pthread_mutex_lock(&msg_mtx) != 0)
-            break;
-#endif  /* !NDEBUG */
-
-        return;
-    } while (0);
-
-    ERROR("%s", strerror(errno));
-    exit(EXIT_FAILURE);
-}
-
-/*
- * Destroy the log file stream of the messages.
- */
-static void
-msg_destroy(void)
-{
-
-    do {
-        /* Unlock the mutex of the message before the destruction. */
-        if (pthread_mutex_unlock(&msg_mtx) != 0)
-            break;
-
-        /* Log file stream of the messages already destroyed and closed? */
-        if (log != NULL) {
-            MSG_DEBUG("End logging");
-            MSG_DEBUG("Close %s successful", LOG_FILE);
-
-            /* Close the log file stream. */
-            if (fclose(log) == EOF)
-                break;
-
-            /* Set the log file stream to NULL. */
-            log = NULL;
-        }
-
         return;
     } while (0);
 
@@ -299,64 +198,6 @@ msg_gettimestamp(char *ts)
     exit(EXIT_FAILURE);
 }
 
-/*
- * Put the message in the log file stream and the file stream.
- */
-static void
-msg_putmessage(FILE *stream, const char *msg)
-{
-
-    do {
-        struct stat stats;
-
-        /* Check if the log file exist. */
-        if (stat(LOG_FILE, &stats) < 0) {
-            if (errno == ENOENT) {
-                /* Close the log file stream. */
-                if (fclose(log) == EOF)
-                    break;
-
-                /* Set the log file stream to NULL. */
-                log = NULL;
-
-                /* Re-initialize the log file stream. */
-                msg_init();
-
-                /* Call again. */
-                if (stat(LOG_FILE, &stats) < 0)
-                    break;
-            } else {
-                break;
-            }
-        }
-
-        /* Check if the log file is a regular file. */
-        if (S_ISREG(stats.st_mode) == 0) {
-            ERROR("%s is not a regular file", LOG_FILE);
-            exit(EXIT_FAILURE);
-        }
-
-        /* Print the message in the log file stream. */
-        fprintf(log, "%s", msg);
-
-        /* Flush the log file stream. */
-        if (fflush(log) == EOF)
-            break;
-
-        /* Print the message in the file stream. */
-        fprintf(stream, "%s", msg);
-
-        /* Flush the file stream. */
-        if (fflush(stream) == EOF)
-            break;
-
-        return;
-    } while (0);
-
-    ERROR("%s", strerror(errno));
-    exit(EXIT_FAILURE);
-}
-
 /*
  * EOF
  *
