diff --git a/src/server/main.c b/src/server/main.c
index 83c8e06da763aa24e5d91df6f6b4cf3801c686d1..d6fefbc61438f1f0a98f09517d162e3c5c9d9ccc 100644
--- a/src/server/main.c
+++ b/src/server/main.c
@@ -25,6 +25,7 @@
 extern void	Init_Handlers(void);
 extern void	Load_Itemlist(void);
 extern void	Server_Start(void);
+extern int	gbServer_RunInBackground;
 extern int	giServer_Port;
 extern char	*gsItemListFile;
 extern char	*gsCoke_SerialPort;
@@ -85,6 +86,9 @@ int main(int argc, char *argv[])
 				if( i + 1 >= argc )	return -1;
 				giDebugLevel = atoi(argv[++i]);
 				break;
+			case 'D':
+				gbServer_RunInBackground = 1;
+				return -1;
 			default:
 				// Usage Error?
 				PrintUsage(argv[0]);
@@ -116,12 +120,18 @@ int main(int argc, char *argv[])
 				}
 				fgets(buf, sizeof buf, fp);
 				fclose(fp);
-				gsDoor_Password = strdup(buf);;
+				gsDoor_Password = strdup(buf);
 			}
 			else if( strcmp(arg, "--cokebank") == 0 ) {
 				if( i + 1 >= argc )	return -1;
 				gsCokebankPath = argv[++i];
 			}
+			else if( strcmp(arg, "--daemonise") == 0 ) {
+				gbServer_RunInBackground = 1;
+			}
+			else if( strcmp(arg, "--dont-daemonise") == 0 ) {
+				gbServer_RunInBackground = 1;
+			}
 			else {
 				// Usage error?
 				PrintUsage(argv[0]);
diff --git a/src/server/server.c b/src/server/server.c
index dd8a29432b3c2cb88660854ca07a68273cfb3cc2..4dec980a580f81cef3fe7b7eed5ca1a145959e92 100644
--- a/src/server/server.c
+++ b/src/server/server.c
@@ -14,6 +14,7 @@
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <unistd.h>
+#include <fcntl.h>	// O_*
 #include <string.h>
 #include <limits.h>
 #include <stdarg.h>
@@ -147,9 +148,10 @@ void Server_Start(void)
 		return ;
 	}
 
-#if 0
+	// 
 	if( gbServer_RunInBackground )
 	{
+		int newin, newout, newerr;
 		int pid = fork();
 		if( pid == -1 ) {
 			fprintf(stderr, "ERROR: Unable to fork\n");
@@ -160,12 +162,15 @@ void Server_Start(void)
 			// Parent, quit
 			exit(0);
 		}
-		// In child, sort out stdin/stdout
-		reopen(0, "/dev/null", O_READ);
-		reopen(1, gsServer_LogFile, O_CREAT|O_APPEND);
-		reopen(2, gsServer_ErrorLog, O_CREAT|O_APPEND);
+		// In child
+		// - Sort out stdin/stdout
+		newin  = open("/dev/null", O_RDONLY);
+		newout = open(gsServer_LogFile, O_CREAT|O_APPEND, 0644);
+		newerr = open(gsServer_ErrorLog, O_CREAT|O_APPEND, 0644);
+		dup2(newin, 0);
+		dup2(newout, 1);
+		dup2(newerr, 2);
 	}
-#endif
 	
 	// Listen
 	if( listen(giServer_Socket, MAX_CONNECTION_QUEUE) < 0 ) {