diff --git a/SickBeard.py b/SickBeard.py
index f4fc9493b4cca2c66a437f5eb028c1309b2806ef..34ef84fe775a58ee981dc3860096362ecd6df7cc 100755
--- a/SickBeard.py
+++ b/SickBeard.py
@@ -231,6 +231,11 @@ def main():
     # stay alive while my threads do the work
     while (True):
 
+        if sickbeard.invoked_command:
+            logger.log(u"Executing invoked command: "+repr(sickbeard.invoked_command))
+            sickbeard.invoked_command()
+            sickbeard.invoked_command = None
+
         time.sleep(1)
 
     return
diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py
index fa762a166c27ba79cc5725e2f77e4e4cd7bbe7c3..3266451cb4a5ecc14443f5ff331359c9761215e5 100644
--- a/sickbeard/__init__.py
+++ b/sickbeard/__init__.py
@@ -42,6 +42,8 @@ from sickbeard.databases import mainDB
 
 from lib.configobj import ConfigObj
 
+invoked_command = None
+
 SOCKET_TIMEOUT = 30
 
 PID = None
@@ -745,7 +747,6 @@ def halt ():
 def sig_handler(signum=None, frame=None):
     if type(signum) != type(None):
         logger.log(u"Signal %i caught, saving and exiting..." % int(signum))
-        cherrypy.engine.exit()
         saveAndShutdown()
 
 
@@ -795,6 +796,19 @@ def saveAndShutdown(restart=False):
     os._exit(0)
 
 
+def invoke_command(to_call, *args, **kwargs):
+    def delegate():
+        to_call(*args, **kwargs)
+    sickbeard.invoked_command = delegate
+    logger.log(u"Placed invoked command: "+repr(sickbeard.invoked_command)+" for "+repr(to_call)+" with "+repr(args)+" and "+repr(kwargs), logger.DEBUG)
+
+def invoke_restart(soft=True):
+    invoke_command(sickbeard.restart, soft=soft)
+
+def invoke_shutdown():
+    invoke_command(sickbeard.saveAndShutdown)
+
+
 def restart(soft=True):
 
     if soft:
diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py
index 166604522ecab7705e67eba678f463f9f13e699b..3501c5a997c4ef7f85266378ec61bba8bdbe2dba 100644
--- a/sickbeard/webserve.py
+++ b/sickbeard/webserve.py
@@ -1779,7 +1779,7 @@ class Home:
     @cherrypy.expose
     def shutdown(self):
 
-        threading.Timer(2, sickbeard.saveAndShutdown).start()
+        threading.Timer(2, sickbeard.invoke_shutdown).start()
 
         title = "Shutting down"
         message = "Sick Beard is shutting down..."
@@ -1793,7 +1793,7 @@ class Home:
             redirect("/home")
 
         # do a soft restart
-        threading.Timer(2, sickbeard.restart, [False]).start()
+        threading.Timer(2, sickbeard.invoke_restart, [False]).start()
 
         title = "Restarting"
         message = "Sick Beard is restarting, refresh in 30 seconds."
@@ -1810,7 +1810,7 @@ class Home:
 
         if updated:
             # do a hard restart
-            threading.Timer(2, sickbeard.restart, [False]).start()
+            threading.Timer(2, sickbeard.invoke_restart, [False]).start()
             return "Sick Beard is restarting, refresh in 30 seconds."
         else:
             return _genericMessage("Update Failed","Update wasn't successful, not restarting. Check your log for more information.")