diff --git a/project_dependency.drupal.inc b/project_dependency.drupal.inc
index ebcfc0d..e02a6a4 100644
--- a/project_dependency.drupal.inc
+++ b/project_dependency.drupal.inc
@@ -85,16 +85,16 @@ function project_dependency_info_parse(array $info_files, $tag) {
  * guaranteed uniqueness of a submodule name. So we're just preferring the
  * most recent release node (highest nid).
  *
- * @param string $component
- *   Component name.
+ * @param string $parsed_component
+ *   Parsed component array.
  * @param int $api_tid
  *   Core API compatibility tid.
  *
  * @return object
  *   Release node object or FALSE if no release is found.
  */
-function project_dependency_select_release($component, $api_tid) {
-
+function project_dependency_select_release($parsed_component, $api_tid) {
+  $component = $parsed_component['name'];
   $sql = 'SELECT DISTINCT release_nid FROM {project_dependency_component}
     WHERE name = :cname';
   $project_release_nids = db_query($sql, array(':cname' => $component))
@@ -105,46 +105,89 @@ function project_dependency_select_release($component, $api_tid) {
   // Select only supported releases of the right version.
   // Prefer recommended releases, highest major version and
   // most recent release (highest nid).
-  $recommended = db_select('project_release_supported_versions', 'supported')
+  $sql = db_select('project_release_supported_versions', 'supported')
     ->fields('supported', array('recommended_release'))
     ->condition('supported.tid', $api_tid)
     ->condition('supported.supported', 1)
     ->condition('supported.recommended_release', $project_release_nids, 'IN')
     ->orderBy('recommended', 'DESC')
     ->orderBy('major', 'DESC')
-    ->orderBy('nid', 'DESC')
-    ->range(0, 1)
-    ->execute()
-    ->fetchField();
-  if ($recommended) {
-    // Do we need to do any checks before accepting?
-    // Create a function project_dependency_validate_release()?
-    $release = node_load($recommended);
-    return $release;
+    ->orderBy('nid', 'DESC');
+  if (isset($parsed_component['versions'])) {
+    $items = $sql->execute();
+    foreach ($items as $item) {
+      $release = node_load($item->recommended_release);
+      $version = project_dependency_release_version($release);
+      $result = drupal_check_incompatibility($parsed_component, $version);
+      if (is_null($result)) {
+        return $release;
+      }
+      else {
+        $project_release_nids = array_diff($project_release_nids,
+          array($item->recommended_release));
+      }
+    }
+  }
+  else {
+    $recommended = $sql->range(0, 1)
+      ->execute()
+      ->fetchField();
+    if ($recommended) {
+      $release = node_load($recommended);
+      return $release;
+    }
   }
 
-  // Currently this just retrieves the most recent release.
   $query = new EntityFieldQuery();
-  $project_releases = $query->entityCondition('entity_type', 'node')
+  $query->entityCondition('entity_type', 'node')
     ->entityCondition('bundle', 'project_release')
     ->fieldCondition('taxonomy_vocabulary_6', 'tid', $api_tid)
     ->propertyCondition('nid', $project_release_nids)
-    ->propertyOrderBy('nid', 'DESC')
-    ->range(0, 1)
-    ->execute();
-
-  if (!empty($project_releases['node'])) {
-    $project_release = current($project_releases['node']);
-    $release_node = node_load($project_release->nid);
-    // Do we need to do any checks before accepting?
-    // Create a function project_dependency_validate_release()?
-    return $release_node;
+    ->propertyOrderBy('nid', 'DESC');
+  if (isset($parsed_component['versions'])) {
+    $project_releases = $query->execute();
+    if (!empty($project_releases['node'])) {
+      foreach ($project_releases['node'] as $project_release) {
+        $release = node_load($project_release->nid);
+        $version = project_dependency_release_version($release);
+        $result = drupal_check_incompatibility($parsed_component, $version);
+        if (is_null($result)) {
+          return $release;
+        }
+      }
+    }
+  }
+  else {
+    $project_releases = $query->range(0, 1)
+      ->execute();
+    if (!empty($project_releases['node'])) {
+      $project_release = current($project_releases['node']);
+      $release_node = node_load($project_release->nid);
+      return $release_node;
+    }
   }
 
   return FALSE;
 }
 
 /**
+ * Return version without the Drupal version prefix.
+ *
+ * @param array $release
+ *   Release node.
+ *
+ * @return string
+ *   Return version
+ */
+function project_dependency_release_version($release) {
+  $version = project_dependency_field_value($release, 'field_release_version');
+  $version = explode('-', $version);
+  unset($version[0]);
+  $version = implode('-', $version);
+  return $version;
+}
+
+/**
  * Attempt to determine the Drupal core API term.
  *
  * @param $node
@@ -442,8 +485,8 @@ function project_dependency_get_external_component_dependencies($release_node,
       // We could hope that it would only be in one package/rid,
       // but there are probably cases (refactoring) where that is not
       // the case.
-      $release = project_dependency_select_release($dependency_component,
-        $api_term->tid);
+      $api_tid = $api_term->tid;
+      $release = project_dependency_select_release($parsed_component, $api_tid);
       // In the case we found no possible release, we must halt processing and
       // continue to the next item
       if (empty($release)) {
