diff --git a/util/daemon.php b/util/daemon.php
new file mode 100644
index 0000000000..d1eb70d8b1
--- /dev/null
+++ b/util/daemon.php
@@ -0,0 +1,96 @@
+<?php
+/*
+Run the poller from a daemon.
+This script was taken from http://php.net/manual/en/function.pcntl-fork.php
+*/
+function shutdown() {
+	posix_kill(posix_getpid(), SIGHUP);
+}
+
+if (in_array("start", $_SERVER["argv"])) {
+	$mode = "start";
+}
+
+if (in_array("stop", $_SERVER["argv"])) {
+	$mode = "stop";
+}
+
+if (in_array("status", $_SERVER["argv"])) {
+	$mode = "status";
+}
+
+if (!isset($mode)) {
+	die("Please use either 'start', 'stop' or 'status'.\n");
+}
+
+@include(".htconfig.php");
+
+if (!isset($pidfile)) {
+	die('Please specify a pid file in the variable $pidfile in the .htconfig.php. For example:'."\n".
+		'$pidfile = "/path/to/daemon.pid";'."\n");
+}
+
+if (in_array($mode, array("stop", "status"))) {
+	$pid = @file_get_contents($pidfile);
+
+	if (!$pid) {
+		die("Pidfile wasn't found. Is the daemon running?\n");
+	}
+}
+
+if ($mode == "status") {
+	if (posix_kill($pid, 0)) {
+		die("Daemon process $pid is running.\n");
+	}
+
+	unlink($pidfile);
+
+	die("Daemon process $pid isn't running.\n");
+}
+
+if ($mode == "stop") {
+	posix_kill($pid, SIGTERM);
+
+	unlink($pidfile);
+
+	die("Worker daemon process $pid was killed.\n");
+}
+
+echo "Starting worker daemon.\n";
+
+if (isset($a->config['php_path'])) {
+	$php = $a->config['php_path'];
+} else {
+	$php = "php";
+}
+
+// Switch over to daemon mode.
+if ($pid = pcntl_fork())
+	return;     // Parent
+
+fclose(STDIN);  // Close all of the standard
+fclose(STDOUT); // file descriptors as we
+fclose(STDERR); // are running as a daemon.
+
+register_shutdown_function('shutdown');
+
+if (posix_setsid() < 0)
+	return;
+
+if ($pid = pcntl_fork())
+	return;     // Parent
+
+$pid = getmypid();
+file_put_contents($pidfile, $pid);
+
+// Now running as a daemon.
+while (true) {
+	// Call the poller
+	$cmdline = $php.' include/poller.php';
+
+	exec($cmdline);
+
+	// Now sleep for 5 minutes
+	sleep(300);
+}
+?>