diff --git a/mongoose.c b/mongoose.c
index b5078b25120a3c9fd91c008b929a0d3d359154f5..a96c38fb70fdaa2ebb9729f73864c6b3f25ba781 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -84,11 +84,12 @@ typedef struct _stati64 file_stat_t;
 #define __func__ __FILE__ ":" STR(__LINE__)
 #endif
 #else
-#include <inttypes.h>
 #include <dirent.h>
-#include <unistd.h>
+#include <inttypes.h>
 #include <pthread.h>
+#include <pwd.h>
 #include <signal.h>
+#include <unistd.h>
 #include <arpa/inet.h>  // For inet_pton() when USE_IPV6 is defined
 #include <netinet/in.h>
 #include <sys/socket.h>
@@ -3298,6 +3299,17 @@ const char *mg_set_option(struct mg_server *server, const char *name,
       } else {
         set_non_blocking_mode(server->listening_sock);
       }
+    } else if (ind == RUN_AS_USER) {
+#ifndef _WIN32
+      struct passwd *pw;
+      if ((pw = getpwnam(value)) == NULL) {
+        error_msg = "Unknown user";
+      } else if (setgid(pw->pw_gid) != 0) {
+        error_msg = "setgid() failed";
+      } else if (setuid(pw->pw_uid) != 0) {
+        error_msg = "setuid() failed";
+      }
+#endif
     }
   }