diff --git a/RhinoReminds/CompareReminders.cs b/RhinoReminds/CompareReminders.cs
index 85b42eb..8cdfd8d 100644
--- a/RhinoReminds/CompareReminders.cs
+++ b/RhinoReminds/CompareReminders.cs
@@ -11,7 +11,6 @@ namespace RhinoReminds
 
 		public int Compare(Reminder x, Reminder y)
 		{
-			Console.WriteLine($"\t{x} / {y} = {x.Time.CompareTo(y.Time)}");
 			return x.Time.CompareTo(y.Time);
 		}
 	}
diff --git a/RhinoReminds/Program.cs b/RhinoReminds/Program.cs
index 055ab05..1d94fbc 100644
--- a/RhinoReminds/Program.cs
+++ b/RhinoReminds/Program.cs
@@ -4,6 +4,7 @@ using System.Diagnostics;
 using System.IO;
 using System.Reflection;
 using System.Threading.Tasks;
+using RhinoReminds.Utilities;
 using S22.Xmpp;
 using S22.Xmpp.Client;
 using S22.Xmpp.Im;
@@ -20,6 +21,8 @@ namespace RhinoReminds
 		public string AvatarFilepath = string.Empty;
 		public string PidFile = null;
 
+		public bool ExitOnModify = false;
+
 		public string Password = null;
 	}
 
@@ -54,11 +57,12 @@ namespace RhinoReminds
 						Console.WriteLine("    mono RhinoReminds.exe {options}");
 						Console.WriteLine();
 						Console.WriteLine("Options:");
-						Console.WriteLine("    -h  --help    Show this message");
-						Console.WriteLine($"    -f  --file    Specify where to save reminders (default: {settings.Filepath})");
+						Console.WriteLine("    -h  --help       Show this message");
+						Console.WriteLine($"    -f  --file       Specify where to save reminders (default: {settings.Filepath})");
 						Console.WriteLine("        --domain {domain}  Set the domain users are allowed to originate at. Defaults to any domain.");
-						Console.WriteLine("        --avatar  Update the XMPP account's avatar to the specified image. By default the avatar is not updated.");
-						Console.WriteLine("        --pidfile Save our process ID to the specified file, and delete it on exit");
+						Console.WriteLine("        --avatar     Update the XMPP account's avatar to the specified image. By default the avatar is not updated.");
+						Console.WriteLine("        --pidfile    Save our process ID to the specified file, and delete it on exit");
+						Console.WriteLine("        --auto-exit  Watch for changes to the executable on disk and automatically quit with an exit code of 0 if a modification is detected. Useful for integration with a service manager and continuous deployment.");
 						Console.WriteLine();
 						Console.WriteLine("Environment Variables:");
 						Console.WriteLine("    XMPP_JID       The JID to login to");
@@ -83,6 +87,10 @@ namespace RhinoReminds
 						settings.PidFile = args[++i];
 						break;
 
+					case "--auto-exit":
+						settings.ExitOnModify = true;
+						break;
+
 					default:
 						Console.Error.WriteLine($"Error: Unknown argument '{args[i]}'.");
 						return 14;
@@ -135,6 +143,10 @@ namespace RhinoReminds
 			Console.WriteLine("************************************");
 			Console.WriteLine($"[Program] Running {Version}");
 
+			if (settings.ExitOnModify) {
+				ExitWatcher.EnableExitOnModify();
+			}
+
 			ClientListener client = new ClientListener(settings.Jid, settings.Password) {
 				ReminderFilePath = settings.Filepath
 			};
@@ -151,8 +163,7 @@ namespace RhinoReminds
 			}
 			// Connect to the server & start listening
 			// Make sure the program doesn't exit whilst we're connected
-			try
-			{
+			try {
 				client.Start().Wait();
 			} catch (Exception) {
 				// Ensure we tidy up after ourselves by deleting the PID file
diff --git a/RhinoReminds/RhinoReminds.csproj b/RhinoReminds/RhinoReminds.csproj
index f642a39..2d974cc 100644
--- a/RhinoReminds/RhinoReminds.csproj
+++ b/RhinoReminds/RhinoReminds.csproj
@@ -69,6 +69,7 @@
     <Compile Include="SimpleXmppClient.cs" />
     <Compile Include="CompareReminders.cs" />
     <Compile Include="Utilities\EmbeddedFiles.cs" />
+    <Compile Include="Utilities\ExitWatcher.cs" />
   </ItemGroup>
   <ItemGroup>
     <None Include="packages.config" />
diff --git a/RhinoReminds/Utilities/ExitWatcher.cs b/RhinoReminds/Utilities/ExitWatcher.cs
new file mode 100644
index 0000000..32aa56a
--- /dev/null
+++ b/RhinoReminds/Utilities/ExitWatcher.cs
@@ -0,0 +1,39 @@
+﻿using System;
+using System.IO;
+using System.Reflection;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace RhinoReminds.Utilities
+{
+	public static class ExitWatcher
+	{
+
+		private static int restartDelayMs = 5 * 1000;
+		private static string EntryExecutablePath => Assembly.GetEntryAssembly().Location;
+
+		private static FileSystemWatcher watcher;
+		private static bool exitSequenceStarted = false;
+
+		public static void EnableExitOnModify() {
+			Console.WriteLine("[Program/ExitWatcher] Enabling auto-exit on modification.");
+			watcher = new FileSystemWatcher(Path.GetDirectoryName(EntryExecutablePath), "*.exe");
+			watcher.Changed += (object sender, FileSystemEventArgs e) => doExit();
+
+			watcher.EnableRaisingEvents = true;
+		}
+
+		private static void doExit() {
+			// Don't bother if we're already exiting on a different thread or something else weird
+			if (exitSequenceStarted) return;
+
+			exitSequenceStarted = true;
+			watcher.EnableRaisingEvents = false; // We're only interested in the first event raised
+
+			Console.WriteLine($"[Program/ExitWatcher] Modification detected, waiting {restartDelayMs}ms...");
+			Thread.Sleep(restartDelayMs);
+			Console.WriteLine($"[Program/ExitWatcher] Wait complete, exiting with code 0");
+			Environment.Exit(0);
+		}
+	}
+}
diff --git a/rhinoreminds.service b/rhinoreminds.service
index 64d9338..3a2cc44 100644
--- a/rhinoreminds.service
+++ b/rhinoreminds.service
@@ -14,7 +14,7 @@ PIDFile=/run/rhinoreminds/rhinoreminds.pid
 User=root
 WorkingDirectory=/srv/kraggwapple
 ExecStart=/srv/kraggwapple/start_service.sh
-Restart=on-failure
+Restart=always
 # Other Restart options: or always, on-abort, etc
 # Delay restarts by 60 seconds
 RestartSec=60
diff --git a/start_service.sh b/start_service.sh
index c2c64d6..0eff762 100755
--- a/start_service.sh
+++ b/start_service.sh
@@ -12,4 +12,4 @@ export XMPP_PASSWORD;
 # Create the pidfile directory
 mkdir /run/rhinoreminds; chmod 0700 /run/rhinoreminds; chown rhinoreminds:rhinoreminds /run/rhinoreminds;
 
-sudo -E -u rhinoreminds bash -c '/usr/bin/mono ../bin/RhinoReminds.exe --domain starbeamrainbowlabs.com --avatar avatar.png & echo "$!" >/run/rhinoreminds/rhinoreminds.pid; disown'
+sudo -E -u rhinoreminds bash -c '/usr/bin/mono ../bin/RhinoReminds.exe --auto-exit --domain starbeamrainbowlabs.com --avatar avatar.png & echo "$!" >/run/rhinoreminds/rhinoreminds.pid; disown'
