diff --git a/dependency_overrides.js b/dependency_overrides.js
new file mode 100644
index 0000000..e2a4e53
--- /dev/null
+++ b/dependency_overrides.js
@@ -0,0 +1,7 @@
+Drupal.behaviors.project_dependency = function(context) {
+  // Hide the Retrieve versions button if Javascript is enabled.
+  $('#edit-retrieve-versions').css('display', 'none');
+  $('.dependent-project').change(function() {
+    $('#edit-retrieve-versions').trigger('click');
+  });
+};
diff --git a/project_dependency.drupal.inc b/project_dependency.drupal.inc
index 0404ec2..efef779 100644
--- a/project_dependency.drupal.inc
+++ b/project_dependency.drupal.inc
@@ -381,8 +381,10 @@ function project_dependency_process_release($shortname, $version) {
  * This is a recursive, accumulative function, gathering the results we need in
  * $dependency_releases.
  *
+ * @param $orig_release_nid
+ *   nid of the release node.  This parameter retains the parent release nid.
  * @param $release_nid
- *   nid of the release node.
+ *   nid of the release node. This parameter changes in the recursion.
  * @param $depending_components
  *   an array of component names, like
  *   array('views_ui', 'token', 'page_manager')
@@ -394,7 +396,7 @@ function project_dependency_process_release($shortname, $version) {
  *
  * Same as  project_dependency_info_process_dependencies($rid, $modules[$module], $dependencies);
  */
-function project_dependency_get_external_component_dependencies($release_nid, $depending_components, &$dependency_releases, $recursion_level = 0) {
+function project_dependency_get_external_component_dependencies($orig_release_nid, $release_nid, $depending_components, &$dependency_releases, $recursion_level = 0) {
   // Limit this to 4 levels for now, as we probably don't know of anything
   // that needs recursion_level > 2.
   if ($recursion_level > 4) {
@@ -440,37 +442,70 @@ function project_dependency_get_external_component_dependencies($release_nid, $d
     foreach ($external_dependencies as $component_info) {
       $dependency_component = $component_info['dependency'];
 
-      // Find the releases that component was shipped in.
-      // We could hope that it would only be in one package/rid,
-      // but there are probably cases (refactoring) where that is not
-      // the case.
-      $possible_dependent_releases = project_dependency_info_releases_for_component_get($dependency_component, $api_term->tid);
-      // We choose to use the project of the most recently created release
-      // node. This is not guaranteed, but is a heuristic. Is there another?
-      $first_dependent_release = reset($possible_dependent_releases);
-      $dependent_pid = $first_dependent_release['pid'];
-      $recommended_release = project_release_get_current_recommended($dependent_pid, $api_term->tid);
-
-      // If we found a recommended release for this project and that release
-      // also contains this component, accept it.
-      if (!empty($recommended_release) && !empty($possible_dependent_releases[$recommended_release->nid])) {
-        // Accept the recommended release for the project used.
-        $release = $possible_dependent_releases[$recommended_release->nid];
-      }
-      else {
-        // The recommended release does not contain the component, so just
-        // punt and accept the first release that was found.
-        $release = $first_dependent_release;
-      }
+      $possible_dependent_releases = project_dependency_info_releases_for_component_get( $dependency_component, $api_term->tid);
+      $release = project_dependency_get_release_version($orig_release_nid, $possible_dependent_releases, $api_term->tid);
       $release['component'] = $dependency_component;
+
       $dependency_releases[$dependency_component] = $release;
       // Recurse to find dependencies of the discovered dependency, but only
       // for the component which discovered the dependent release.
-      project_dependency_get_external_component_dependencies($release['release_nid'], array($dependency_component), $dependency_releases, $recursion_level + 1);
+      project_dependency_get_external_component_dependencies($orig_release_nid, $release['release_nid'], array($dependency_component), $dependency_releases, $recursion_level + 1);
     }
   }
 }
 
+/*
+ * Retrieve the release version of a project.
+ *
+ * Retrieve the release version of a project by first checking for a specific
+ * override request, then looking for a recommended release and then the most
+ * recently created release.
+ *
+ * @param int $orig_release_nid
+ *   The release nid for the project being tested.
+ * @param array $possible_dependent_releases
+ *   An array of information about release nodes to be considered.
+ * @param int $tid
+ *   The term id for the release category.
+ *
+ * @return array $release
+ *   An array containing information about the selected release.
+ */
+function project_dependency_get_release_version($orig_release_nid, $possible_dependent_releases, $tid) {
+  // We choose to use the project of the most recently created release
+  // node. This is not guaranteed, but is a heuristic. Is there another?
+  $first_dependent_release = reset($possible_dependent_releases);
+  $sql = 'SELECT version FROM {project_dependency_overrides} WHERE id=%d AND project="%s"';
+  $version = db_result(db_query($sql, $orig_release_nid,
+             $first_dependent_release['uri']));
+  if ($version) {
+    // Check for a dependency override.
+    foreach ($possible_dependent_releases as $dependent_release) {
+      if ($dependent_release['tag']==$version) {
+        $release = $dependent_release;
+        return $release;
+      }
+    }
+  }
+  if (!isset($release)) {
+    $dependent_pid = $first_dependent_release['pid'];
+    $recommended_release = project_release_get_current_recommended($dependent_pid, $tid);
+
+    // If we found a recommended release for this project and that release
+    // also contains this component, accept it.
+    if (!empty($recommended_release) && !empty($possible_dependent_releases[$recommended_release->nid])) {
+      // Accept the recommended release for the project used.
+      $release = $possible_dependent_releases[$recommended_release->nid];
+    }
+    else {
+      // The recommended release does not contain the component, so just
+      // punt and accept the first release that was found.
+      $release = $first_dependent_release;
+    }
+  }
+
+  return $release;
+}
 
 /**
  * Given a release nid and component name, find all external dependencies for
diff --git a/project_dependency.install b/project_dependency.install
index 1f6469a..8e290aa 100644
--- a/project_dependency.install
+++ b/project_dependency.install
@@ -116,5 +116,82 @@ function project_dependency_schema() {
     'indexes' => array('component_dependency' => array('component_id', 'dependency')),
   );
 
+  $schema['project_dependency_overrides'] = array(
+    'description' => t('Stores test project dependency overrides.'),
+    'fields' => array(
+      'id' => array(
+        'description' => t('Related test detail record ID, either rid, or fid.'),
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'project' => array(
+        'description' => t('Dependent project name.'),
+        'type' => 'varchar',
+        'length' => 60,
+        'default' => '',
+        'not null' => TRUE,
+      ),
+      'version' => array(
+        'description' => t('Requested version for this test.'),
+        'type' => 'varchar',
+        'length' => 60,
+        'default' => '',
+        'not null' => TRUE,
+      ),
+      'components' => array(
+        'description' => t('Dependent components.'),
+        'type' => 'text',
+        'size' => 'normal',
+        'default' => '',
+        'not null' => TRUE,
+      ),
+    ),
+    'primary key' => array('id', 'project'),
+  );
+
   return $schema;
 }
+
+/**
+ * Add table for dependency overrides
+ */
+function project_dependency_update_6200() {
+  $ret = array();
+  $schema['project_dependency_overrides'] = array(
+    'description' => t('Stores test project dependency overrides.'),
+    'fields' => array(
+      'id' => array(
+        'description' => t('Related test detail record ID, either rid, or fid.'),
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'project' => array(
+        'description' => t('Dependent project name.'),
+        'type' => 'varchar',
+        'length' => 60,
+        'default' => '',
+        'not null' => TRUE,
+      ),
+      'version' => array(
+        'description' => t('Requested version for this test.'),
+        'type' => 'varchar',
+        'length' => 60,
+        'default' => '',
+        'not null' => TRUE,
+      ),
+      'components' => array(
+        'description' => t('Dependent components.'),
+        'type' => 'text',
+        'size' => 'normal',
+        'default' => '',
+        'not null' => TRUE,
+      ),
+    ),
+    'primary key' => array('id', 'project'),
+  );
+  db_create_table($ret, 'project_dependency_overrides',
+                  $schema['project_dependency_overrides']);
+  return $ret;
+}
diff --git a/project_dependency.module b/project_dependency.module
index c6e9773..90b1571 100644
--- a/project_dependency.module
+++ b/project_dependency.module
@@ -10,6 +10,21 @@ define('PROJECT_DEPENDENCY_DEPENDENCY_REQUIRED', 0);
 define('PROJECT_DEPENDENCY_DEPENDENCY_RECOMMENDED', 1);
 
 /**
+ * Implements hook_menu().
+ */
+function project_dependency_menu() {
+  $items = array();
+
+  $items['project_dependency/projects'] = array(
+    'type' => MENU_CALLBACK,
+    'page callback' => 'project_dependency_projects',
+    'access callback' => TRUE,
+  );
+
+  return $items;
+}
+
+/**
  * Implements hook_project_release_create_package().
  *
  * When a release node is created, we build the dependencies.
@@ -166,7 +181,45 @@ function project_dependency_get_external_release_dependencies($depending_release
   $excluded_dependencies[] = $uri;
 
   $component_dependencies = array();
-  project_dependency_get_external_component_dependencies($depending_release_nid, $depending_components, $component_dependencies);
+  project_dependency_get_external_component_dependencies($depending_release_nid, $depending_release_nid, $depending_components, $component_dependencies);
+
+  $release_node = node_load($depending_release_nid);
+  if (!($api_term = project_dependency_info_core_api($release_node))) {
+    watchdog('project_dependency', 'ERROR: No core release API term found for release nid=%nid', array('%nid' => $depending_release_nid));
+    return;
+  }
+  $sql = 'SELECT project, components FROM {project_dependency_overrides} WHERE id=%d';
+  $results = db_query($sql, $depending_release_nid);
+  while ($project = db_fetch_object($results)) {
+    $versions = project_dependency_versions($project->project,
+      $release_node->project_release['version']);
+    $possible_dependent_releases = array();
+    foreach ($versions as $version) {
+      $sql = 'SELECT pp.uri AS uri, prn.pid AS pid, prn.nid AS release_nid,
+          prn.version AS version, prn.tag AS tag,
+          prn.version_major AS version_major
+        FROM {project_release_nodes} prn
+        LEFT JOIN {project_projects} pp ON prn.pid=pp.nid
+        WHERE pp.uri="%s" AND prn.tag="%s"';
+      $result = db_query($sql, $project->project, $version);
+      if ($item = db_fetch_array($result)) {
+        $possible_dependent_releases[$item['release_nid']] = $item;
+      }
+    }
+    $release = project_dependency_get_release_version($depending_release_nid, $possible_dependent_releases, $api_term->tid);
+    if (project_dependency_missing_dependency($release, $component_dependencies)) {
+      $component_dependencies[$key] = $release;
+    }
+    $components = unserialize($project->components);
+    $dependencies = array();
+    project_dependency_get_external_component_dependencies($depending_release_nid, $release['release_nid'], $components, $dependencies);
+    foreach ($dependencies as $key => $dependency) {
+      if (project_dependency_missing_dependency($dependency, $component_dependencies)) {
+        $component_dependencies[$key] = $dependency;
+      }
+    }
+  }
+
   $release_dependencies = array();
   foreach ($component_dependencies as $component => $component_info) {
     if (!in_array($component_info['uri'], $excluded_dependencies)) {
@@ -177,5 +230,270 @@ function project_dependency_get_external_release_dependencies($depending_release
       );
     }
   }
+
   return $release_dependencies;
 }
+
+/**
+ * Checks to see if the component needs to be added to the dependencies.
+ *
+ * @param $component
+ *   Name of the component.
+ * @param $release_dependencies
+ *  Array of component dependencies.
+ *
+ * @return
+ *   FALSE if the component already is included in the release dependencies;
+ *   otherwise, FALSE
+ */
+function project_dependency_missing_dependency($component, $dependencies) {
+  foreach ($dependencies as $key => $dependency) {
+    if ($component==$key) {
+      return FALSE;
+    }
+  }
+  return TRUE;
+}
+
+/**
+ * Retrieve the projects starting with the search string.
+ *
+ * @param string $search
+ *   The beginning characters of a project.
+ * @return array of project objects.
+ */
+function project_dependency_projects($search='') {
+  $sql = 'SELECT uri FROM {project_projects} WHERE uri LIKE "%s%"';
+  $result = db_query($sql, $search);
+  $matches = array();
+  while ($item = db_fetch_object($result)) {
+    $matches[$item->uri] = $item->uri;
+  }
+  drupal_json($matches);
+}
+
+/**
+ *
+ */
+function project_dependency_form_pift_results_test_branch_form_alter(&$form, $form_state) {
+  if (isset($form_state['storage']['number'])) {
+    $form['additional']['#collapsed'] =  FALSE;
+  }
+  else {
+    $form['additional']['#collapsed'] =  TRUE;
+  }
+  if (!empty($form_state['values']['version'])) {
+    $version = $form_state['values']['version'];
+  }
+  else {
+    reset($versions);
+    $temp = each($versions);
+    $version = $temp['value'];
+  }
+  $form['additional']['overrides']['#default_value'] = $version;
+
+  $form['additional']['overrides'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Override project dependencies'),
+    '#collapsible' => TRUE,
+    '#collapsed' => FALSE,
+  );
+
+  $number = (isset($form_state['storage']['number'])) ?
+              $form_state['storage']['number'] : 1;
+
+  for ($i=1; $i<=$number; $i++) {
+    $form['additional']['overrides']['dependency-' . $i] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Dependency #') . $i,
+      '#collapsible' => TRUE,
+      '#collapsed' => FALSE,
+    );
+
+    $project = !empty($form_state['values']['project-' . $i]) ? $form_state['values']['project-' . $i] : '';
+    $form['additional']['overrides']['dependency-' . $i]['project-' . $i] = array(
+      '#type' => 'textfield',
+      '#title' => t('Dependency #') . $i,
+      '#attributes' => array('class' => 'dependent-project'),
+      '#default_value' => $project,
+      '#autocomplete_path' => 'project_dependency/projects',
+    );
+
+    $options = array('' => 'Default');
+    if ($project!='') {
+      $options = project_dependency_versions($project, $version, $options);
+    }
+    $form['additional']['overrides']['dependency-' . $i]['project-version-' . $i] = array(
+      '#title' => '<br />' . t('Version'),
+      '#type' => 'select',
+      '#options' => $options,
+      '#default_value' => !empty($form_state['values']['project-version-' . $i]) ? $form_state['values']['project-version-' . $i] : '',
+    );
+
+    $components = !empty($form_state['values']['components-' . $i]) ? $form_state['values']['components-' . $i] : '';
+    $form['additional']['overrides']['dependency-' . $i]['components-' . $i] = array(
+      '#type' => 'textfield',
+      '#title' => '<br />' . t('Components'),
+      '#default_value' => $components,
+      '#description' => '<br />' . t('Some projects have multiple component modules.  List required components separated by commas for the project; leave blank to include dependencies for all component modules.'),
+    );
+  }
+
+  unset($form['additional'][0]);
+  $form['additional']['queue'] = array(
+    '#type' => 'submit',
+    '#value' => 'Queue test',
+  );
+  $form['additional']['clear'] = array(
+    '#type' => 'submit',
+    '#value' => 'Reset form',
+    '#validate' => array('project_dependency_results_test_branch_clear'),
+  );
+  $form['additional']['add_project'] = array(
+    '#type' => 'submit',
+    '#value' => 'Add another project',
+    '#validate' => array('project_dependency_results_test_branch_add_project'),
+  );
+  $form['additional']['retrieve_versions'] = array(
+    '#type' => 'submit',
+    '#value' => 'Retrieve versions',
+    '#validate' => array('project_dependency_results_test_branch_retrieve_versions'),
+  );
+  // Reorder the submit functions so the overrides are done first.
+  $form['#submit'][] = $form['#submit'][0];
+  $form['#submit'][0] = 'project_dependency_overrides_submit';
+
+  drupal_add_js(drupal_get_path('module', 'project_dependency') .
+                '/dependency_overrides.js');
+}
+
+/**
+ * Function for incrementing the number of projects in the
+ * pift_results_test_branch_form.
+ */
+function project_dependency_results_test_branch_add_project($form, &$form_state) {
+  if (!isset($form_state['storage']['number'])) {
+    $form_state['storage']['number'] = 2;
+  }
+  else {
+    $form_state['storage']['number'] += 1;
+  }
+  // Setting $form_state['rebuild'] = TRUE causes the default submit
+  // function to be skipped and the form to be rebuilt.
+  $form_state['rebuild'] = TRUE;
+}
+
+/**
+ * Function for retrieving versions of projects in the
+ * pift_results_test_branch_form.
+ */
+function project_dependency_results_test_branch_retrieve_versions($form, &$form_state) {
+  if (!isset($form_state['storage']['number'])) {
+    $form_state['storage']['number'] = 1;
+  }
+  // Setting $form_state['rebuild'] = TRUE causes the default submit
+  // function to be skipped and the form to be rebuilt.
+  $form_state['rebuild'] = TRUE;
+}
+
+/**
+ * Function for resetting the pift_results_test_branch_form.
+ */
+function project_dependency_results_test_branch_clear($form, &$form_state) {
+  // Ensures fields are blank after the reset button is clicked.
+  unset($form_state['values']);
+  // Ensures the reset button removes the add_project button.
+  unset($form_state['storage']);
+  // Setting $form_state['rebuild'] = TRUE causes the default submit
+  // function to be skipped and the form to be rebuilt.
+
+  $form_state['rebuild'] = TRUE;
+}
+
+/**
+ * Process the submitted pift_results_test_branch_form form.
+ *
+ * Saves the dependency overrides.
+ * @param $form form to submit
+ * @param $form_state A keyed array containing the current state of the form.
+ */
+function project_dependency_overrides_submit($form, &$form_state) {
+  $overrides = array();
+  foreach ($form_state['values'] as $key => $value) {
+    $project = explode('-', $key);
+    if ($project[0]=='project') {
+      if ($project[1]=='version') {
+        $overrides[$project[2]]['version'] = $value;
+      }
+      else {
+        $overrides[$project[1]]['project'] = $value;
+      }
+    }    else if ($project[0]=='components') {
+      if ($value!='') {
+        $components = explode(',', $value);
+        foreach ($components as &$component) {
+          $component = trim($component);
+        }
+        $overrides[$project[1]]['components'] = $components;
+      }
+      else {
+        $overrides[$project[1]]['components'] = array();
+      }
+    }
+  }
+  // Remove blank projects.
+  foreach ($overrides as $key => $value) {
+    if ($value['project'] == '') {
+      unset($overrides[$key]);
+    }
+  }
+
+  $nid = $form_state['values']['nid'];
+  $version = $form_state['values']['version'];
+
+  // Get the repo_id for the project
+  $repo_id = db_result(db_query("SELECT repo_id FROM {versioncontrol_project_projects} WHERE nid = %d", $nid));
+
+  // Get the label_id for the passed version
+  $label_id = db_result(db_query("SELECT label_id FROM {versioncontrol_labels} WHERE repo_id = %d AND name = '%s'", $repo_id, $version));
+
+  $release_nid = db_result(db_query("SELECT release_nid FROM {versioncontrol_release_labels} WHERE label_id = %d AND project_nid = %d", $label_id, $nid));
+  if ($release_nid) {
+    // Remove any existing overrides.
+    db_query('DELETE FROM {project_dependency_overrides} WHERE id=%d',
+             $release_nid);
+    foreach ($overrides as $override) {
+      $sql = 'INSERT INTO {project_dependency_overrides} VALUES (%d, "%s", "%s", "%s")';
+      db_query($sql, $release_nid, $override['project'], $override['version'],
+               serialize($override['components']));
+    }
+  }
+}
+
+/**
+ * Retrieve the versions of a project compatible with a project being tested.
+ *
+ * Finds all the available versions that match the project being tested.
+ *
+ * @param string $project
+ *   The project name.
+ * @param string $version
+ *   The version of the project being tested.
+ * @param array $results
+ *   The results array if the versions are to be added to it.
+ * @return array of available versions along with the elements passed in.
+ */
+function project_dependency_versions($project, $version, $results=array()) {
+  $sql = 'SELECT nid FROM {project_projects} WHERE uri="%s"';
+  $nid = db_result(db_query($sql, $project));
+  $node = node_load($nid);
+  $major = explode('-', $version);
+  $versions = pift_get_releases($node, TRUE);
+  foreach ($versions as $item) {
+    $item_major = explode('-', $item);
+    if ($major[0] == $item_major[0]) {
+      $results[$item] = $item;
+    }
+  }
+  return $results;
+}
