diff --git a/includes/backend.inc b/includes/backend.inc
index 6a491a9..4e8d878 100644
--- a/includes/backend.inc
+++ b/includes/backend.inc
@@ -203,7 +203,7 @@ function drush_backend_output_discard($string) {
  *  A boolean indicating whether the command was output.
  */
 function drush_backend_packet($packet, $data) {
-  if (drush_get_context('DRUSH_BACKEND')) {
+  if (drush_get_context('DRUSH_BACKEND') && drush_backend_check_output()) {
     $data['packet'] = $packet;
     $data = json_encode($data);
     drush_print(sprintf(DRUSH_BACKEND_PACKET_PATTERN, $data), 0, STDERR);
@@ -839,10 +839,14 @@ function _drush_backend_invoke($cmds, $common_backend_options = array(), $contex
   foreach ($cmds as $cmd) {
     drush_log(dt('Backend invoke: !cmd', array('!cmd' => $cmd['cmd'])), 'command');
   }
-  if (array_key_exists('interactive', $common_backend_options)) {
+  if (array_key_exists('interactive', $common_backend_options) || array_key_exists('fork', $common_backend_options)) {
     foreach ($cmds as $cmd) {
-      drush_log(dt("executing !cmd", array('!cmd' => $cmd['cmd'])));
-      $ret = drush_shell_proc_open($cmd['cmd']);
+      $exec_cmd = $cmd['cmd'];
+      if (array_key_exists('fork', $common_backend_options)) {
+        $exec_cmd .= ' --backend-fork &';
+      }
+      drush_log(dt("executing !cmd", array('!cmd' => $exec_cmd)));
+      $ret = drush_shell_proc_open($exec_cmd);
     }
     return $ret;
   }
@@ -1129,3 +1133,17 @@ function _drush_backend_get_stdin() {
   }
   return FALSE;
 }
+
+/**
+ * Helper function to test backend-fork, verbose and debug flags to see if
+ * output should printed to stdout.
+ *
+ * @return
+ *  A boolean indicating whether to output to stdout.
+ */
+function drush_backend_check_output() {
+  if (drush_get_option('backend-fork', FALSE) && !drush_get_option(array('verbose', 'debug'), FALSE)) {
+    return FALSE;
+  }
+  return TRUE;
+}
diff --git a/includes/bootstrap.inc b/includes/bootstrap.inc
index 95fc732..cacdcbd 100644
--- a/includes/bootstrap.inc
+++ b/includes/bootstrap.inc
@@ -1080,7 +1080,9 @@ function drush_shutdown() {
   }
 
   if (drush_get_context('DRUSH_BACKEND', FALSE)) {
-    drush_backend_output();
+    if (drush_backend_check_output()) {
+      drush_backend_output();
+    }
   }
   elseif (drush_get_context('DRUSH_QUIET', FALSE)) {
     ob_end_clean();
diff --git a/tests/backendTest.php b/tests/backendTest.php
index 4868271..ce666e5 100644
--- a/tests/backendTest.php
+++ b/tests/backendTest.php
@@ -149,3 +149,34 @@ class backendCase extends Drush_CommandTestCase {
 )", var_export($parsed['object'], TRUE));
   }
 }
+
+class backendUnitCase extends Drush_UnitTestCase {
+
+  /**
+   * Covers the following target responsibilities.
+   *   - Insures that drush_invoke_process called with fork backend set is able
+   *     to invoke a non-blocking process.
+   */
+  function testBackendFork() {
+    // Need to set DRUSH_COMMAND so that drush will be called and not phpunit
+    define('DRUSH_COMMAND', UNISH_DRUSH);
+
+    // Ensure that file that will be created by forked process does not exist
+    // before invocation. The current working directory is a sandbox created by
+    // PHPUnit.
+    $test_file = getcwd() . '/fork_test.txt';
+    if (file_exists($test_file)) {
+      unlink($test_file);
+    }
+
+    $ev_php = "sleep(1);fopen('$test_file','a');";
+    drush_invoke_process("@none", "ev", array($ev_php), array(), array("fork" => TRUE));
+
+    // Test file does not exist immediate after process forked
+    $this->assertEquals(file_exists($test_file), FALSE);
+
+    sleep(2);
+    // Test file exists after waiting long enough
+    $this->assertEquals(file_exists($test_file), TRUE);
+  }
+}
