diff --git a/pift.extended_file_field.inc b/pift.extended_file_field.inc
index a9857b8..df967b9 100644
--- a/pift.extended_file_field.inc
+++ b/pift.extended_file_field.inc
@@ -205,3 +205,10 @@ function pift_generate_view_link($test_id) {
 function pift_generate_retest_link($test_id) {
   return l(t('Retest'), 'pift/retest/' . check_plain($test_id));
 }
+
+/**
+ * Generates the 'Delete' link for a given test_id.
+ */
+function pift_generate_delete_link($test_id) {
+  return l(t('Delete'), 'pift/delete/' . check_plain($test_id));
+}
diff --git a/pift.module b/pift.module
index 6c68f92..1ad41d0 100644
--- a/pift.module
+++ b/pift.module
@@ -74,18 +74,22 @@ module_load_include('extended_file_field.inc', 'pift');
  */
 function pift_permission() {
   return array(
-    'pift re-test files' => array(
-      'title' => t('pift re-test files'),
-      'description' => t('Request a file to be re-tested'),
-    ),
-    'pift enable project testing' => array(
-      'title' => t('pift enable project testing'),
-      'description' => t('Enable testing on a project'),
-    ),
-    'pift access project testing tab' => array(
+    'access pift project testing tab' => array(
       'title' => t('pift access project testing tab'),
       'description' => t('Access the testing tab on projects'),
     ),
+    'access pift settings for all projects' => array(
+      'title' => t('access pift settings for all projects'),
+      'description' => t('Access per-project testing settings for all projects'),
+    ),
+    'access pift settings for own projects' => array(
+      'title' => t('access pift settings for own projects'),
+      'description' => t('Access per-project testing settings for own projects'),
+    ),
+    'pift re-test files' => array(
+      'title' => t('pift re-test files'),
+      'description' => t('Request re-testing of a file test'),
+    ),
   );
 }
 
@@ -119,12 +123,12 @@ function pift_menu() {
     'file' => 'pift.pages.inc',
     'type' => MENU_CALLBACK,
   );
-  $items['node/%node/qa-settings'] = array(
+  $items['node/%node/qa'] = array(
     'title' => t('Automated Testing'),
     'access callback' => 'pift_results_visibility',
     'access arguments' => array(1),
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('pift_pages_project_issue_settings', 1),
+    'page callback' => 'pift_pages_project_testing_tab',
+    'page arguments' => array(1),
     'file' => 'pift.pages.inc',
     'weight' => '5',
     'type' => MENU_LOCAL_TASK,
@@ -146,9 +150,9 @@ function pift_menu() {
 function pift_results_visibility($node) {
   // Only display the tab on projects with releases
   if (project_node_is_project($node)) {
-    if ($node->field_project_has_releases[LANGUAGE_NONE][0]['value']) {
+    if (!empty($node->field_project_has_releases[$node->language][0]['value'])) {
       // Ensure user has the 'access project testing tab' permission
-      if (user_access('pift access project testing tab')) {
+      if (user_access('access pift project testing tab')) {
         return TRUE;
       }
     }
@@ -493,23 +497,6 @@ function pift_rekey_by_value(&$array, $key) {
 }
 
 /**
- * Filters a multidimensional array by a given element subkey value.
- *
- * TODO: Not currently used.  If not leveraged on the branch test result page,
- * remove this code.
- */
-/*
-function pift_filter_by_value(&$array, $subkey, $value) {
-  foreach ($array as $key => $item) {
-    if ($item[$subkey] == $value) {
-      $items[$key] = $item;
-    }
-  }
-  $array = isset($items) ? $items : array();
-}
-*/
-
-/**
  * Returns the values of a specific key from within a multi-dimensional array.
  *
  * @param $array
@@ -528,65 +515,33 @@ function pift_extract_key($array, $key) {
 /**
  * Helper fuction to build a list of releases for this project's repository.
  *
- * TODO: Not currently used.  If not leveraged on the branch test result page,
- * remove this code.
+ * @param $project_node
+ *   The fully loaded project's node object
+ * @param $quiet
+ *   Flag indicating whether to silence error messages
  *
- * @param $node The project node object
- * @param $quiet Silence error messages
- * @return array List of available labels with corresponding release nodes
+ * @return array
+ *   An array of available labels with corresponding release nodes
  */
-/*
-function pift_get_releases($node, $quiet = FALSE) {
-  $valid = pift_valid_prefix_list();
-  $branches = array();
-  $topbranches = array();
-  if (project_node_is_project($node)) {
-    $result = db_query("Select b.name from {versioncontrol_release_labels} a
-       join {versioncontrol_labels} b on a.label_id = b.label_id
-       where a.project_nid = :nid", array(':nid' => $node->nid));
-    foreach ($result as $data) {
-      // Filter out any branches < 6 (not accepted by PIFT)
-      // Move '.x' releases to the top
-      if (in_array(substr($data->name, 0, 3), $valid)) {
-        if (substr($data->name, strlen($data->name) - 2, 2) == '.x') {
-          $topbranches[$data->name] = $data->name;
-        }
-        else {
-          $branches[$data->name] = $data->name;
-        }
-      }
-    }
-    // Sort to get the highest branch on top
-    uasort($branches, 'version_compare');
-    uasort($topbranches, 'version_compare');
-    $branches = array_merge($branches, $topbranches);
-    $branches = array_reverse($branches, TRUE);
-
-    if (empty($branches) && !$quiet) {
-      drupal_set_message(t('No releases found for the given project.'), 'error', FALSE);
-    }
+function pift_get_compatible_branches($project_node) {
+  if (empty($project_node->versioncontrol_project['repo'])) {
+    return array();
   }
-  return $branches;
-}
-*/
-
-/**
- * Returns a listing of valid project release prefixes (ie. 6.x, 7.x, 8.x)
- *
- * TODO: Not currently used.  If not leveraged on the branch test result page,
- * remove this code.
- */
-/*
-function pift_valid_prefix_list() {
-  $terms = array();
-  $tids = variable_get('pift_core', array());
-  foreach ($tids as $key => $value) {
-    if (!empty($tids[$key])) {
-      $term = taxonomy_term_load($key);
-      $terms[$key] = $term->name;
+  $repo = $project_node->versioncontrol_project['repo'];
+  $api_tids = pift_core_api_versions();
+  $compatible_branches = array();
+  $branches = $repo->loadBranches(array(), array(), array('callback' => 'versioncontrol_release_attach_release_label_query_alter'));
+
+  foreach ($branches as $label_id => $branch) {
+    $version = versioncontrol_release_get_version_from_branch($branch->name, $project_node);
+    if (!empty($version) && in_array($version->version_api_tid, $api_tids)) {
+      $compatible_branches[$label_id] = array(
+        'name' => $branch->name,
+        'label_id' => $label_id,
+        'release_nid' => $branch['release_nid'],
+      );
     }
   }
-  return $terms;
-}
-*/
 
+  return $compatible_branches;
+}
diff --git a/pift.pages.inc b/pift.pages.inc
index d29fd7e..5f659b9 100644
--- a/pift.pages.inc
+++ b/pift.pages.inc
@@ -6,6 +6,163 @@
  */
 
 /**
+ * Menu page callback: Generates the 'Automated Testing' tab on project nodes.
+ *
+ * @param $node
+ *   The fully loaded project node object.
+ *
+ * @return $content
+ *   A render array representing the output for this page.
+ */
+function pift_pages_project_testing_tab($node) {
+
+  // Generate the introductory banner for the page.
+  $content['banner'] = array(
+    '#value' => t("This page provides information regarding automated testing status for this project's releases."),
+  );
+
+  // Generate the project_issue_testing_settings form.
+  $content['settings'] = drupal_get_form('pift_pages_project_testing_settings', $node);
+
+  // Generate the project_issue_testing_results table.
+  $content['results'] = pift_pages_project_testing_results($node);
+
+  return $content;
+}
+
+/**
+ * Generate a table of test results for the current project node.
+ *
+ * @param $node
+ *   The fully loaded project node object.
+ *
+ * @return $content
+ *   A render array defining the test results table for this project.
+ */
+function pift_pages_project_testing_results($node) {
+  // Load an array of branches available in this project's repository.
+  // We know we will have at least one branch, due to the 'has releases' check
+  // in the access function for this callback.
+  $branches = pift_get_compatible_branches($node);
+
+  // Get the vcs label_ids from the branches.
+  $label_ids = array_keys($branches);
+
+  // Use the label_ids to retrieve an array of test results.
+  $test_ids = pift_test_get_test_ids($label_ids, PIFT_TYPE_BRANCH);
+  $test_results = pift_test_get_summary_multiple($test_ids, 'branch');
+
+  // Determine list of branches with releases but without tests.
+  $no_results = array_diff($label_ids, array_keys($test_ids));
+  $versions = array();
+  foreach($no_results as $label_id) {
+    if (!empty($branches[$label_id]['release_nid'])) {
+      $versions[$label_id] = $branches[$label_id];
+    }
+  }
+
+  $content['results_table_header'] = array(
+    '#value' => '<h3>' . t('Branch Test Results') . '</h3>',
+  );
+
+  // Assemble the test results table render array.
+  if (!empty($test_results)) {
+    $content['results_table'] = array(
+      '#type' => 'table',
+      '#header' => array(t('Version'), t('Status'), t('Result'), t('Last Tested'), t('Operations')),
+      '#rows' => pift_pages_project_testing_rows($test_results, $branches),
+    );
+  }
+  else {
+    $content['results_table'] = array(
+      '#value' => t("No test results available.  Please use the 'Test Additional Branches' form below to trigger a new test."),
+    );
+  }
+
+  // Generate the 'Test Additional Branches' form.
+  if (!empty($versions) && pift_pages_project_testing_settings_access($node)) {
+    $content['testing_form'] = drupal_get_form('pift_pages_project_testing_form', $node, $versions);
+  }
+
+  return $content;
+}
+
+/**
+ * Generate the results table #rows array for a given project node.
+ *
+ * @param array $test_results
+ *   A nested array of test result arrays.
+ * @param string $branches
+ *   An array of branch information, keyed by label id, as provided by
+ *   pift_get_compatible_branches().
+ *
+ *  @return array $rows
+ *    A nested array of table rows, suitable for feeding directly into the
+ *    '#rows' property of theme_table().
+ */
+function pift_pages_project_testing_rows($test_results, $branches) {
+  foreach ($test_results as $test_id => $test_result) {
+    $rows[] = pift_pages_project_testing_row($test_result, $branches[$test_result['id']]['name']);
+  }
+  return $rows;
+}
+
+/**
+ * Generates a single row of test results for the results table #rows array.
+ *
+ * @param array $test_result
+ *   The test result array for a single test_id.
+ * @param string $version
+ *   The human-readable version string for this particular branch.
+ *
+ *  @return $output
+ *    An assembled table row element.
+ */
+function pift_pages_project_testing_row($test_result, $version) {
+  if (!empty($test)) {
+    $options = array('1' => 'Queued', '2' => 'Sent', '3' => 'Failed', '4' => 'Passed');
+    $rowclass = array('1' => 'pift-queue', '2' => 'pift-retest', '3' => 'pift-fail', '4' => 'pift-pass');
+    $operations = array();
+
+    // A first-time queued test will not have a test_id, so hide links
+    if ($test['test_id'] > 0) {
+      $operations = array(
+        pift_generate_view_link($test['test_id']),
+      );
+      if (user_access('pift re-test files') && $test['status'] > PIFT_STATUS_SENT) {
+        $operations[] = pift_generate_retest_link($test['test_id']);
+      }
+      if (user_access('pift re-test files') && $test['status'] == PIFT_STATUS_SENT) {
+        $operations[] = pift_generate_delete_link($test['test_id']);
+      }
+    }
+
+    // Prepend 'queued' message to previous results if new test queued/sent
+    if ($test['status'] <= PIFT_STATUS_SENT) {
+      if (!empty($test['message'])) {
+        $message = t('Waiting for results.') . "<br />";
+        $message .= t('Previous test result: ') . $test['message'];
+        $test['message'] = $message;
+      }
+      else {
+        $test['message'] = t('Waiting for results.');
+      }
+    }
+
+    // Format 'Last Tested' value
+    $test['last_tested'] = $test['last_tested'] > 0 ? format_date($test['last_tested'], 'small') : 'never';
+
+    // Assemble the row
+    $row = array(
+      'data' => array(check_plain($version), $options[$test['status']], $test['message'], $test['last_tested'], implode(" | ", $operations)),
+      'class' => $rowclass[$test['status']],
+    );
+    return $row;
+  }
+  return array();
+}
+
+/**
  * Add additional description to file attachment form on issues.
  *
  * Invoked from within pift_form_project_issue_node_form_alter(), to modify the
@@ -32,14 +189,14 @@ function pift_pages_upload_description_add(&$form, $form_state, $form_id) {
  *
  * @see pift_pages_project_issue_settings_submit().
  */
-function pift_pages_project_issue_settings($form, &$form_state, $node) {
+function pift_pages_project_testing_settings($form, &$form_state, $node) {
   $form = array();
   $form['testing'] = array(
     '#type' => 'fieldset',
     '#title' => t('Testing'),
     '#collapsible' => TRUE,
     '#weight' => -9,
-    '#access' => user_access('pift enable project testing'),
+    '#access' => pift_pages_project_testing_settings_access($node),
   );
 
   // Build an array of core capatible version strings (ie 6.x, 7.x, etc).
@@ -68,11 +225,20 @@ function pift_pages_project_issue_settings($form, &$form_state, $node) {
 }
 
 /**
- * Form submission handler for the pift_pages_project_issue_settings() form.
+ * Access callback for the project testing settings form on each project.
+ */
+function pift_pages_project_testing_settings_access($node) {
+  return (user_access('access pift settings for all projects') ||
+    (user_access('access pift settings for own projects')
+     && array_key_exists($user->uid, $node->project['maintainers']))
+   );
+}
+/**
+ * Form submission handler for the pift_pages_project_testing_settings() form.
  *
  * Enables or disables testing for a given project.
  */
-function pift_pages_project_issue_settings_submit($form, &$form_state) {
+function pift_pages_project_testing_settings_submit($form, &$form_state) {
   $enabled = pift_project_enabled($form_state['values']['pid']);
   if ($form_state['values']['pift_enable'] && !$enabled) {
     pift_project_enable_testing($form_state['values']['pid']);
@@ -85,6 +251,76 @@ function pift_pages_project_issue_settings_submit($form, &$form_state) {
 }
 
 /**
+ * Form constructor for the 'Test Additional Branches' form.
+ */
+function pift_pages_project_testing_form($form, &$form_state, $node, $versions) {
+  $form = array();
+  // Store the project node and branches for use during submission processing.
+  $form['project_node'] = array(
+    '#type' => 'value',
+    '#value' => $node,
+  );
+  $form['branches'] = array(
+    '#type' => 'value',
+    '#value' => $versions
+  );
+  // Form container
+  $description = '<strong>' . t('Note: Automated tests are typically run on ".x" branches.') . '</strong><br />';
+  $description .= t('Core examples: 6.x, 7.x, 8.x') . '<br />';
+  $description .= t('Contrib examples: 6.x-1.x, 7.x-2.x, 8.x-1.x') . '<br />';
+  $description = t('Marking a branch for testing will add it to the list of branch/patch requests sent to the automated testing infrastructure. ');
+  $description .= t('Once the tests complete, the results will be passed back to drupal.org and reflected on this page. ');
+  $description .= '<br />';
+
+  $form['additional'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Test Additional Branches'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+    '#prefix' => '<div>',
+    '#suffix' => '</div>',
+    '#description' => $description,
+  );
+  foreach ($versions as $label_id => $version) {
+    $options[$label_id] = $version['name'];
+  }
+  $form['additional']['version'] = array(
+    '#type' => 'select',
+    '#title' => t('Select a branch to queue for testing'),
+    '#options' => $options,
+    '#required' => TRUE,
+  );
+  $form['additional']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Queue Test'),
+  );
+  return $form;
+}
+
+/**
+ * Form validation handler for the 'pift_pages_project_testing_form' form.
+ */
+function pift_pages_project_testing_form_validate($form, &$form_state) {
+  // Ensure required values have been passed.
+  if (empty($form_state['values']['pid']) || empty($form_state['values']['version'])) {
+    form_set_error('form', t('Error: Unable to determine project branch.'));
+  }
+}
+
+/**
+ * Form submission handler for the 'pift_pages_project_testing_form' form.
+ */
+function pift_pages_project_testing_form_submit($form, &$form_state) {
+  $project_node = $form_state['values']['project_node'];
+  $branches = $form_state['values']['branches'];
+  $label_id = $form_state['values']['version'];
+  $release_nid = $branches[$label_id]['release_nid'];
+  // Queue the test.
+  pift_test_add(PIFT_TYPE_BRANCH, $label_id, $release_nid);
+  drupal_set_message(t("The %version project branch has been queued for testing."), array('%version' => $branches[$label_id]['name']));
+}
+
+/**
  * Form confirmation page for the 're-test' link associated with a file.
  *
  * @param integer $test_id
