diff --git a/hosting_queue_runner.admin.inc b/hosting_queue_runner.admin.inc
index bc4ff1c..1b1de9d 100644
--- a/hosting_queue_runner.admin.inc
+++ b/hosting_queue_runner.admin.inc
@@ -28,6 +28,13 @@ function hosting_queue_runner_settings_form() {
     ) + drupal_map_assoc(range(1, 60), '_hosting_queue_runner_settings_form_delay_callback'),
   );
 
+  $form['hosting_queue_runner_autorestart'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Automatically restart'),
+    '#description' => t('If this is enabled, the queue runner will automatically restart after the timeout. Do *NOT* enable if you are running the dispatcher under "supervisord" or a similar daemon.'),
+    '#default_value' => variable_get('hosting_queue_runner_autorestart', FALSE),
+  );
+
   return system_settings_form($form);
 }
 
diff --git a/hosting_queue_runner.drush.inc b/hosting_queue_runner.drush.inc
index 2ebcafd..e659ea3 100644
--- a/hosting_queue_runner.drush.inc
+++ b/hosting_queue_runner.drush.inc
@@ -72,4 +72,19 @@ function drush_hosting_queue_runner() {
     }
   }
 
+  // restart the dispatcher if we hit the timeout and if we're configured for non-external restarts
+  if (variable_get('hosting_queue_runner_autorestart', FALSE)) {
+    if (function_exists('pcntl_exec')) {
+      // this would usually be:
+      // _drush_backend_generate_command_sitealias(drush_sitealias_get_record(d()->name), 'hosting-queue-runner', array(), $data);
+      // but that generates --backend or > `tty` (if #interactive) which are both wrong
+      $parts = explode(' ', DRUSH_COMMAND);
+      $command = array_shift($parts);
+      array_push($args, '@' . d()->name, 'hosting-queue-runner');
+      drush_log(dt('Restarting queue runner with @drush @args', array('@drush' => $command, '@args' => implode(" ", $args))));
+      pcntl_exec($command, $args);
+      /* NOTREACHED */
+    }
+  }
+
 }
