diff --git a/server/pifr_server.log.inc b/server/pifr_server.log.inc
index edf81a9..6da8e53 100644
--- a/server/pifr_server.log.inc
+++ b/server/pifr_server.log.inc
@@ -24,6 +24,9 @@ define('PIFR_SERVER_LOG_CLIENT_RESULT', 9);
 define('PIFR_SERVER_LOG_CLIENT_RETRIEVE', 10);
 
 define('PIFR_SERVER_LOG_TEST_REQUEST_RETEST', 11);
+define('PIFR_SERVER_LOG_TEST_REQUEST_CANCEL', 12);
+
+define('PIFR_SERVER_LOG_CLIENT_RESEND_RESULT', 13);
 
 /**
  * Log an event that occurred to a test.
@@ -35,7 +38,7 @@ define('PIFR_SERVER_LOG_TEST_REQUEST_RETEST', 11);
  */
 function pifr_server_log($test_id, $client_id, $code) {
   // Check for an invalid event code.
-  if ($code < 1 || $code > 11) {
+  if ($code < 1 || $code > 13) {
     trigger_error('Invalid log event code.', E_USER_ERROR);
   }
 
@@ -96,12 +99,16 @@ function pifr_server_log_code($code, $client_id = 0) {
       return t('Re-test request ignored because test is already queued.');
     case PIFR_SERVER_LOG_TEST_REQUEST_RETEST:
       return t('Re-test request allowed for previously queued branch.');
+    case PIFR_SERVER_LOG_TEST_REQUEST_CANCEL:
+      return t('Test cancelled and removed rom queue by administrator.');
     case PIFR_SERVER_LOG_CLIENT_REQUEST:
       return t('Requested by test client #@client_id.', array('@client_id' => $client_id));
     case PIFR_SERVER_LOG_CLIENT_RESET:
       return t('Test reset by client request.');
     case PIFR_SERVER_LOG_CLIENT_RESULT:
       return t('Result received from test client #@client_id.', array('@client_id' => $client_id));
+    case PIFR_SERVER_LOG_CLIENT_RESEND_RESULT:
+      return t('Result queued for retrieval by project client.');
     case PIFR_SERVER_LOG_CLIENT_RETRIEVE:
       return t('Result retrieved by project client.');
     default:
diff --git a/server/pifr_server.test.inc b/server/pifr_server.test.inc
index c2f41e3..168c8d8 100644
--- a/server/pifr_server.test.inc
+++ b/server/pifr_server.test.inc
@@ -304,6 +304,44 @@ function pifr_server_test_queue(array $test) {
 }
 
 /**
+ * Remove test from testing queue.
+ *
+ * Update test status and last received, set 'cancelled' result message, and
+ * update environment status.
+ *
+ * @param array $test Test information.
+ */
+function pifr_server_test_unqueue($test) {
+  // Update test status and last tested timestamp.
+  $test['status'] = PIFR_SERVER_TEST_STATUS_RESULT;
+  $test['last_requested'] = time();
+  $test['last_tested'] = time();
+  pifr_server_test_save($test);
+
+  // Update test results
+  $environments = pifr_server_environment_test_get_all($test['test_id']);
+  foreach ($environments as $environment) {
+    $result = array(
+      'test_id' => $test['test_id'],
+      'environment_id' => $environment['environment_id'],
+      'code' => 1,
+      'details' => array(
+        '@reason' => t('Test cancelled prior to completion.'),
+      ),
+      'log' => NULL,
+    );
+    pifr_server_result_save($result);
+  }
+
+  // No environments should be sent, but clear them in case of race conditions.
+  pifr_server_environment_status_clear_all($test['test_id']);
+
+  // Update log
+  pifr_server_log($test['test_id'], 0, PIFR_SERVER_LOG_TEST_REQUEST_CANCEL);
+
+}
+
+/**
  * Perform test sent event operations.
  *
  * @param array $test Test information.
@@ -716,6 +754,39 @@ function pifr_server_test_tools_form(&$form_state, $test_id) {
       '#value' => t('Re-test'),
     );
 
+    // Only allow reporting to PIFT if the test has results.
+    if ($test['status'] == 4 && in_array($test['type'], array(PIFR_SERVER_TEST_TYPE_BRANCH, PIFR_SERVER_TEST_TYPE_FILE))) {
+      $form['tools']['report'] = array(
+        '#type' => 'tabpage',
+        '#title' => t('Report'),
+      );
+      $form['tools']['report']['fieldset'] = array(
+        '#type' => 'fieldset',
+        '#description' => t('Manually request the test results be reported to PIFT.'),
+      );
+      $form['tools']['report']['fieldset']['op'] = array(
+        '#type' => 'submit',
+        '#value' => t('Report'),
+      );
+    }
+
+    // Only allow removing a file from the queue if no environments have been
+    // sent to a testbot.
+    if (in_array($test['status'], array(2,3)) && in_array($test['type'], array(PIFR_SERVER_TEST_TYPE_BRANCH, PIFR_SERVER_TEST_TYPE_FILE))) {
+      $form['tools']['remove'] = array(
+        '#type' => 'tabpage',
+        '#title' => t('Remove'),
+      );
+      $form['tools']['remove']['fieldset'] = array(
+        '#type' => 'fieldset',
+        '#description' => t('Manually remove a pending test from the queue.'),
+      );
+      $form['tools']['remove']['fieldset']['op'] = array(
+        '#type' => 'submit',
+        '#value' => t('Remove from queue'),
+      );
+    }
+
     $form['tools']['xmlrpc'] = array(
       '#type' => 'tabpage',
       '#title' => t('XML-RPC'),
@@ -768,9 +839,13 @@ function pifr_server_test_tools_form(&$form_state, $test_id) {
  * Perform requested operation.
  */
 function pifr_server_test_tools_form_submit($form, &$form_state) {
-  if ($form_state['values']['op'] == t('Re-test')) {
-    $test = pifr_server_test_get($form_state['values']['test_id']);
+  $test = pifr_server_test_get($form_state['values']['test_id']);
+  if (!test) {
+    drupal_set_message("Unable to retrieve test.  Operation cancelled.");
+    return;
+  }
 
+  if ($form_state['values']['op'] == t('Re-test')) {
     if ($test['type'] == PIFR_SERVER_TEST_TYPE_CLIENT) {
       $client = pifr_server_client_get_test($test['test_id']);
       pifr_server_client_confirmation_init($client);
@@ -789,6 +864,35 @@ function pifr_server_test_tools_form_submit($form, &$form_state) {
       drupal_set_message(t('Removed result and queued %title.', array('%title' => $test['title'])));
     }
   }
+  elseif ($form_state['values']['op'] == t('Report')) {
+    if ($test['status'] == 4 && in_array($test['type'], array(PIFR_SERVER_TEST_TYPE_BRANCH, PIFR_SERVER_TEST_TYPE_FILE))) {
+      $report = variable_get('pifr_test_report', array());
+      $report[] = $test['id'];
+      variable_set('pifr_test_report', $report);
+      pifr_server_log($test['test_id'], 0, PIFR_SERVER_LOG_CLIENT_RESEND_RESULT);
+    }
+  }
+  elseif ($form_state['values']['op'] == t('Remove')) {
+    // Initialize flag to track 'sent' status
+    $testsent = FALSE;
+    if (in_array($test['status'], array(2,3)) && in_array($test['type'], array(PIFR_SERVER_TEST_TYPE_BRANCH, PIFR_SERVER_TEST_TYPE_FILE))) {
+      // Check that test has not been sent to a testbot yet
+      $environments = pifr_server_environment_test_get_all($test['test_id']);
+      foreach ($environments as $environment) {
+        // Retrieve the status for this environment
+        $status = pifr_server_environment_status_get($environment_id, $test_id);
+        if ($status['status'] == 'sent') {
+          $testsent = TRUE;
+        }
+      }
+      if ($testsent) {
+        drupal_set_message(t('Unable to remove test from queue, as it has already been sent to a testbot.'));
+      }
+      else {
+        pifr_server_test_unqueue($test);
+      }
+    }
+  }
 }
 
 function pifr_server_test_type($test_type) {
diff --git a/server/pifr_server.xmlrpc.inc b/server/pifr_server.xmlrpc.inc
index 1460c12..df764fa 100644
--- a/server/pifr_server.xmlrpc.inc
+++ b/server/pifr_server.xmlrpc.inc
@@ -433,6 +433,17 @@ function pifr_server_xmlrpc_retrieve($client_key, $since) {
 
     $since = pifr_server_xmlrpc_time_local($since);
     $tests = pifr_server_test_get_since($since, PIFR_SERVER_BATCH_MAX_COUNT + 1);
+
+    // Add any tests which an admin has manually marked for reporting
+    foreach (variable_get('pifr_test_report', array()) as $test_id) {
+      // Ensure the test has a valid result
+      $addtest = pifr_server_test_get($test_id);
+      if ($addtest['status'] == 4) {
+        $tests[] = $addtest;
+      }
+    }
+    variable_del('pifr_test_report');
+
     foreach ($tests as $test) {
       $batch['results'][] = array(
         'test_id' => $test['test_id'],
