diff --git a/conditional_fields.css b/conditional_fields.css
index 62bcbcc..d223bbb 100644
--- a/conditional_fields.css
+++ b/conditional_fields.css
@@ -1,24 +1,22 @@
 /* Dependencies overview */
-
 table.conditional-fields-overview .add-new-placeholder {
   font-weight: bold;
   padding-bottom: .5em;
 }
-
+table.conditional-fields-overview .form-item-dependent .form-select,
+table.conditional-fields-overview .form-item-dependee .form-select {
+  max-width: 25em;
+}
 table.conditional-fields-overview .form-submit {
   margin-top: 1em;
 }
-
 table.conditional-fields-overview .description-select .form-type-select {
   display: inline;
 }
-
 /* Dependency edit */
-
 #conditional-fields-dependency-edit-form .form-item-state .description {
   clear: both;
 }
-
 #conditional-fields-dependency-edit-form .form-item-state .ajax-progress {
   width: 120px;
-}
\ No newline at end of file
+}
diff --git a/conditional_fields.module b/conditional_fields.module
index 60167ad..48a0a09 100644
--- a/conditional_fields.module
+++ b/conditional_fields.module
@@ -266,7 +266,7 @@ function conditional_fields_element_after_build($element, &$form_state) {
     return $element;
   }
 
-  $dependencies = conditional_fields_load_dependencies($entity_type, $bundle);
+  $dependencies = conditional_fields_load_dependencies($entity_type, $bundle, FALSE);
 
   if (!$dependencies) {
     return $element;
@@ -275,7 +275,7 @@ function conditional_fields_element_after_build($element, &$form_state) {
   $field_parents_key = conditional_fields_flatten_array($field['#field_parents']);
 
   if (isset($dependencies['dependents'][$field['#field_name']])) {
-  // Attach dependent.
+    // Attach dependent.
     foreach ($dependencies['dependents'][$field['#field_name']] as $id => $dependency) {
       if (!isset($form['#conditional_fields'][$field_parents_key][$field['#field_name']]['dependees'][$id])) {
         conditional_fields_attach_dependency($form, array('#field_name' => $dependency['dependee']), $field, $dependency['options'], $field_parents_key, $id);
@@ -290,7 +290,7 @@ function conditional_fields_element_after_build($element, &$form_state) {
   if (isset($dependencies['dependees'][$field['#field_name']])) {
     foreach ($dependencies['dependees'][$field['#field_name']] as $id => $dependency) {
       if (!isset($form['#conditional_fields'][$field_parents_key][$field['#field_name']]['dependents'][$id])) {
-+        conditional_fields_attach_dependency($form, $field, array('#field_name' => $dependency['dependent']), $dependency['options'], $field_parents_key, $id);
+        conditional_fields_attach_dependency($form, $field, array('#field_name' => $dependency['dependent']), $dependency['options'], $field_parents_key, $id);
       }
     }
   }
@@ -446,32 +446,37 @@ function conditional_fields_form_after_build($form, &$form_state) {
   foreach ($form['#conditional_fields'] as $parent_dependent_key => $parent_dependent_info) {
     foreach ($parent_dependent_info as $dependent => $dependent_info) {
       $states = array();
-  
+
       if (empty($dependent_info['dependees'])) {
         continue;
       }
       $dependent_location = array_merge($dependent_info['field_parents'], array($dependent));
       $dependent_form_field = drupal_array_get_nested_value($form, $dependent_location);
-  
+
       // Cycle the dependant's dependees.
-      foreach ($dependent_info['dependees'] as $dependency) {
+      foreach ($dependent_info['dependees'] as $dependee_id => $dependency) {
         $dependee = $dependency['dependee'];
-  
-        if (empty($form['#conditional_fields'][$parent_dependent_key][$dependee])) {
-          continue;
+
+        $parent_dependee_key = $parent_dependent_key;
+        if (empty($form['#conditional_fields'][$parent_dependee_key][$dependee])) {
+          $parent_dependee_key = _conditional_fields_find_parent_dependee_key($form['#conditional_fields'], $dependee_id, $dependee);
+
+          if (!$parent_dependee_key) {
+            continue;
+          }
         }
-  
-        $dependee_info = $form['#conditional_fields'][$parent_dependent_key][$dependee];
+
+        $dependee_info = $form['#conditional_fields'][$parent_dependee_key][$dependee];
         $dependee_form_field = drupal_array_get_nested_value($form, $dependee_info['parents']);
         $options = $dependency['options'];
-  
+
         // Load field edit behaviors.
         // If this dependent has multiple dependees, only the logic of the first
         // dependency will be taken into account.
         if (!isset($behaviors)) {
           $behaviors = conditional_fields_field_behaviors('edit', $options);
         }
-  
+
         // Determine if the dependee is in the form.
         if (empty($dependee_form_field) || (isset($dependee_form_field['#access']) && $dependee_form_field['#access'] == FALSE)) {
           // Apply orphan dependent behaviors.
@@ -479,7 +484,7 @@ function conditional_fields_form_after_build($form, &$form_state) {
           if (in_array(CONDITIONAL_FIELDS_FIELD_EDIT_HIDE_UNTRIGGERED_ORPHAN, $behaviors)) {
             // TODO
             $is_triggered = TRUE;
-  
+
             if ($is_orphan && !$is_triggered) {
               $form[$dependent]['#access'] = FALSE;
             }
@@ -503,7 +508,7 @@ function conditional_fields_form_after_build($form, &$form_state) {
           // Replace the language placeholder in the selector with current language.
           $options['selector'] = str_replace('%lang', $dependee_form_field['#language'], $options['selector']);
         }
-  
+
         if ($options['condition'] != 'value') {
           // Conditions different than "value" are always evaluated against TRUE.
           $state = array($options['state'] => array($options['selector'] => array($options['condition'] => TRUE)));
@@ -511,7 +516,7 @@ function conditional_fields_form_after_build($form, &$form_state) {
         else {
           // Build the values that trigger the dependency.
           $values = array();
-  
+
           if ($options['values_set'] == CONDITIONAL_FIELDS_DEPENDENCY_VALUES_WIDGET) {
             $values[$options['condition']] = $options['value_form'];
           }
@@ -530,7 +535,7 @@ function conditional_fields_form_after_build($form, &$form_state) {
               // NOT behaves like OR with switched state.
               $options['state'] = strpos($options['state'], '!') === 0 ? drupal_substr($options['state'], 1) : '!' . $options['state'];
             }
-  
+
             // OR, NOT and XOR conditions are obtained with a nested array.
             foreach ($options['values'] as $value) {
               $values[] = array($options['condition'] => $value);
@@ -539,7 +544,7 @@ function conditional_fields_form_after_build($form, &$form_state) {
 
           $state = array($options['state'] => array($options['selector'] => $values));
           $dependee_form_state = isset($dependee_form_field['#field_parents'], $dependee_form_field['#field_name'], $dependee_form_field['#language']) ? field_form_get_state($dependee_form_field['#field_parents'], $dependee_form_field['#field_name'], $dependee_form_field['#language'], $form_state) : NULL;
-  
+
           // Execute special handler for fields that need further processing.
           // The handler has no return value. Modify the $state parameter by
           // reference if needed.
@@ -552,7 +557,7 @@ function conditional_fields_form_after_build($form, &$form_state) {
 
         // Add validation callback to element.
         _conditional_fields_element_add_property($dependent_form_field, '#element_validate', 'conditional_fields_dependent_validate', 'append');
-  
+
         // Add the $state into the correct logic group in $states.
         foreach ($state as $key => $constraints) {
           if (empty($states[$key][$options['grouping']])) {
@@ -578,7 +583,7 @@ function conditional_fields_form_after_build($form, &$form_state) {
             'options' => $options['effect_options'],
           );
         }
-  
+
         // Apply reset dependent to default if untriggered behavior.
         if (in_array(CONDITIONAL_FIELDS_FIELD_EDIT_RESET_UNTRIGGERED, $behaviors)) {
           // Add property to element so conditional_fields_dependent_validate() can
@@ -588,14 +593,14 @@ function conditional_fields_form_after_build($form, &$form_state) {
         }
       }
       unset($behaviors);
-  
+
       if (empty($states)) {
         continue;
       }
-  
+
       // Save the modified field back into the form.
       drupal_array_set_nested_value($form, $dependent_location, $dependent_form_field);
-  
+
       // Map the states based on the conjunctions.
       $states_new = array();
       foreach ($states as $state_key => $value) {
@@ -611,7 +616,7 @@ function conditional_fields_form_after_build($form, &$form_state) {
           foreach ($states[$state_key]['OR'] as $constraint_key => $constraint_value) {
             $or[] = array($constraint_key => $constraint_value);
           }
-          // '1' as a string so that we get an object (which means logic groups 
+          // '1' as a string so that we get an object (which means logic groups
           // are ANDed together).
           $states_new[$state_key]['1'] = $or;
         }
@@ -625,10 +630,10 @@ function conditional_fields_form_after_build($form, &$form_state) {
         }
       }
       $states = $states_new;
-  
+
       // Add the #states property to the dependent field.
       drupal_array_set_nested_value($form, array_merge($dependent_location, array('#states')), $states);
-  
+
       $has_states = TRUE;
     }
   }
@@ -685,7 +690,6 @@ function conditional_fields_dependent_validate($element, &$form_state, $form) {
   // have been validated to avoid collision between dependencies.
   $form_state_addition['parents'] = $dependent['#array_parents'];
 
-
   // Optional behavior: reset the field to its default values.
   // Default values are always valid, so it's safe to skip validation.
   if (!empty($element['#conditional_fields_reset_if_untriggered'])) {
@@ -834,23 +838,38 @@ function _conditional_fields_element_add_property(&$element, $property, $value,
 }
 
 /**
+ * Implements hook_entity_view().
+ */
+function conditional_fields_entity_view($entity, $type, $view_mode, $langcode) {
+  $entity->content['#conditional_fields_entity'] = $entity;
+}
+
+/**
  * Implements hook_entity_view_alter().
  *
  * Applies entity view logic to conditional fields.
  */
 function conditional_fields_entity_view_alter(&$build, $type) {
-  if (!(isset($build['#entity_type'], $build['#bundle']) && $dependencies = conditional_fields_load_dependencies($build['#entity_type'], $build['#bundle']))) {
+  if (!(isset($build['#entity_type'], $build['#bundle'], $build['#conditional_fields_entity']))) {
+    // Required elements not found.
+    return;
+  }
+  elseif (!$dependencies = conditional_fields_load_dependencies($build['#entity_type'], $build['#bundle'])) {
+    // No dependencies found.
     return;
   }
 
   $evaluated_dependents = array();
 
+  // Load the dependee entities.
+  $dependee_entities = conditional_fields_load_dependee_entities($build['#entity_type'], $build['#conditional_fields_entity']);
+
   foreach ($dependencies['dependents'] as $dependent => $dependency) {
     if (empty($build[$dependent]['#access'])) {
       continue;
     }
 
-    foreach ($dependency as $dependency_options) {
+    foreach ($dependency as $dependency_id => $dependency_options) {
       $dependee = $dependency_options['dependee'];
       $options = $dependency_options['options'];
 
@@ -866,51 +885,47 @@ function conditional_fields_entity_view_alter(&$build, $type) {
         $behaviors = conditional_fields_field_behaviors('view', $options);
       }
 
+      // Get the dependent entity.
+      $dependee_entity = NULL;
+      if (isset($dependee_entities[$dependent][$dependency_id])) {
+        $dependee_entity = $dependee_entities[$dependent][$dependency_id];
+      }
+
       // Manage orphan fields (dependents with no dependees).
       $evaluate = in_array(CONDITIONAL_FIELDS_FIELD_VIEW_EVALUATE, $behaviors);
       $hide_orphan = in_array(CONDITIONAL_FIELDS_FIELD_VIEW_HIDE_ORPHAN, $behaviors);
       $hide_untriggered_orphan = in_array(CONDITIONAL_FIELDS_FIELD_VIEW_HIDE_UNTRIGGERED_ORPHAN, $behaviors);
-      $is_orphan = empty($build[$dependee]['#access']);
+      $is_orphan = (empty($build[$dependee]['#access']) && !$dependee_entity);
+
       if ($is_orphan) {
         // Hide the dependent. No need to evaluate the dependency.
         if ($hide_orphan) {
           $build[$dependent]['#access'] = FALSE;
           continue;
         }
+
         if ($hide_untriggered_orphan) {
           $evaluate = TRUE;
         }
+
         if ($evaluate) {
-          // We have to look for the dependee in the entity object.
-          // TODO: Is it possible to avoid hardcoding this?
-          switch ($type) {
-            case 'node':
-              $entity_property = '#node';
-              break;
-            case 'user':
-              $entity_property = '#account';
-              break;
-            case 'term':
-              $entity_property = '#term';
-              break;
-            case 'field_collection_item':
-            case 'profile2':
-            default:
-              $entity_property = '#entity';
-          }
-          // If we didn't find the field, there is nothing more we can do.
-          if (!isset($build[$entity_property]->$dependee)) {
-            continue;
-          }
-          $items = $build[$entity_property]->$dependee;
-          // Values are keyed by language here, remove it.
-          $items = array_shift($items);
+          // Get the field items.
+          $items = field_get_items($build['#entity_type'], $build['#conditional_fields_entity'], $dependee);
         }
       }
+      elseif ($dependee_entity) {
+        // Get the field items from the dependee entity.
+        $items = field_get_items($dependee_entity['entity_type'], $dependee_entity['entity'], $dependee);
+      }
       else {
         $items = $build[$dependee]['#items'];
       }
 
+      // If we didn't find the field items, so there's nothing more we can do.
+      if (!$items) {
+        continue;
+      }
+
       if ($evaluate) {
         $evaluated_dependents[$dependent][$options['grouping']][] = conditional_fields_evaluate_dependency('view', $items, $options);
       }
@@ -1007,7 +1022,14 @@ function conditional_fields_evaluate_dependencies($dependent, $form, $form_state
   foreach ($dependencies as $dependency_id => $dependency) {
     // Extract field values from submitted values.
     $dependee = $dependency['dependee'];
-    $dependee_parents = $form['#conditional_fields'][$dependent_field_key][$dependee]['parents'];
+
+    // Check and correct the parent dependee key.
+    $parent_dependee_key = $dependent_field_key;
+    if (empty($form['#conditional_fields'][$parent_dependee_key][$dependee])) {
+      $parent_dependee_key = _conditional_fields_find_parent_dependee_key($form['#conditional_fields'], $dependency_id, $dependee);
+    }
+
+    $dependee_parents = $form['#conditional_fields'][$parent_dependee_key][$dependee]['parents'];
 
     // We have the parents of the field, but depending on the entity type and
     // the widget type, they may include additional elements that are actually
@@ -1245,9 +1267,18 @@ function conditional_fields_dependency_default_options() {
 /**
  * Loads all dependencies from the database.
  *
- * The result can be filtered by providing an entity type and a bundle name.
+ * @param $entity_type
+ *   Filter by this entity type.
+ * @param $bundle
+ *   Filter by this bundle.
+ * @param $by_dependent
+ *   Use only the dependent to load from teh database, set to FALSE to include
+ *   "remote" dependencies from other entities.
+ *
+ * @return
+ *    List of dependencies.
  */
-function conditional_fields_load_dependencies($entity_type = NULL, $bundle = NULL) {
+function conditional_fields_load_dependencies($entity_type = NULL, $bundle = NULL, $by_dependent = TRUE) {
   // Use the advanced drupal_static() pattern.
   static $dependencies;
   if (!isset($dependencies)) {
@@ -1258,36 +1289,82 @@ function conditional_fields_load_dependencies($entity_type = NULL, $bundle = NUL
     $dependencies = array();
   }
 
-  if (!isset($dependencies[$entity_type][$bundle])) {
+  if (!isset($dependencies[$by_dependent][$entity_type][$bundle])) {
     if (!empty($entity_type) && !empty($bundle)) {
-      $dependencies[$entity_type][$bundle] = array();
+      $dependencies[$by_dependent][$entity_type][$bundle] = array();
     }
     $default_options = conditional_fields_dependency_default_options();
 
     $select = db_select('conditional_fields', 'cf')
       ->fields('cf', array('id', 'options'))
       ->orderBy('cf.dependent');
+    $select->addField('cf', 'dependee', 'dependee_id');
+    $select->addField('cf', 'dependent', 'dependent_id');
     $fci_depende = $select->join('field_config_instance', 'fci_dependee', 'cf.dependee = fci_dependee.id');
     $fci_dependent = $select->join('field_config_instance', 'fci_dependent', 'cf.dependent = fci_dependent.id');
     $select->addField($fci_depende, 'field_name', 'dependee');
     $select->addField($fci_dependent, 'field_name', 'dependent');
-    $select->addField($fci_depende, 'entity_type');
-    $select->addField($fci_depende, 'bundle');
+    $select->addField($fci_dependent, 'entity_type');
+    $select->addField($fci_dependent, 'bundle');
 
     if ($entity_type) {
-      $select->condition(
-        db_and()
-          ->condition('fci_dependee.entity_type', $entity_type)
-          ->condition('fci_dependent.entity_type', $entity_type)
-      );
+      if ($bundle) {
+        // Filter by entity type and bundle.
+        if ($by_dependent) {
+          // Filter only by dependent.
+          $select->condition(
+            db_and()
+              ->condition('fci_dependent.entity_type', $entity_type)
+              ->condition('fci_dependent.bundle', $bundle)
+          );
+        }
+        else {
+          // Filter by dependee and dependent.
+          $select->condition(
+            db_or()
+              ->condition(
+                db_and()
+                  ->condition('fci_dependee.entity_type', $entity_type)
+                  ->condition('fci_dependee.bundle', $bundle)
+              )
+              ->condition(
+                db_and()
+                  ->condition('fci_dependent.entity_type', $entity_type)
+                  ->condition('fci_dependent.bundle', $bundle)
+              )
+          );
+        }
+      }
+      else {
+        // Filter by entity type.
+        if ($by_dependent) {
+          // Filter only by dependent.
+          $select->condition('fci_dependent.entity_type', $entity_type);
+        }
+        else {
+          // Filter by dependee and dependent.
+          $select->condition(
+            db_or()
+              ->condition('fci_dependee.entity_type', $entity_type)
+              ->condition('fci_dependent.entity_type', $entity_type)
+          );
+        }
+      }
     }
-
-    if ($bundle) {
-      $select->condition(
-        db_and()
-          ->condition('fci_dependee.bundle', $bundle)
-          ->condition('fci_dependent.bundle', $bundle)
-      );
+    elseif ($bundle) {
+      // Filter by bundle.
+      if ($by_dependent) {
+        // Filter only by dependent.
+        $select->condition('fci_dependent.bundle', $bundle);
+      }
+      else {
+        // Filter by dependee and dependent.
+        $select->condition(
+          db_or()
+            ->condition('fci_dependee.bundle', $bundle)
+            ->condition('fci_dependent.bundle', $bundle)
+        );
+      }
     }
 
     $result = $select->execute();
@@ -1299,27 +1376,29 @@ function conditional_fields_load_dependencies($entity_type = NULL, $bundle = NUL
       $options = unserialize($dependency->options);
       $options += $default_options;
 
-      $dependencies[$result_entity_type][$result_bundle]['dependents'][$dependency->dependent][$dependency->id] = array(
+      $dependencies[$by_dependent][$result_entity_type][$result_bundle]['dependents'][$dependency->dependent][$dependency->id] = array(
         'dependee' => $dependency->dependee,
+        'dependee_id' => $dependency->dependee_id,
         'options'  => $options,
       );
 
-      $dependencies[$result_entity_type][$result_bundle]['dependees'][$dependency->dependee][$dependency->id] = array(
+      $dependencies[$by_dependent][$result_entity_type][$result_bundle]['dependees'][$dependency->dependee][$dependency->id] = array(
         'dependent' => $dependency->dependent,
+        'dependent_id' => $dependency->dependent_id,
         'options'  => $options,
       );
     }
   }
 
-  if ($entity_type && isset($dependencies[$entity_type])) {
-    if ($bundle && isset($dependencies[$entity_type][$bundle])) {
-      return $dependencies[$entity_type][$bundle];
+  if ($entity_type && isset($dependencies[$by_dependent][$entity_type])) {
+    if ($bundle && isset($dependencies[$by_dependent][$entity_type][$bundle])) {
+      return $dependencies[$by_dependent][$entity_type][$bundle];
     }
 
-    return $dependencies[$entity_type];
+    return $dependencies[$by_dependent][$entity_type];
   }
 
-  return $dependencies;
+  return $dependencies[$by_dependent];
 }
 
 /**
@@ -1388,6 +1467,20 @@ function conditional_fields_dependency_delete($dependency_ids) {
 }
 
 /**
+ * Implements hook_field_create_instance().
+ */
+function conditional_fields_field_create_instance($instance) {
+  _conditional_fields_clear_cache();
+}
+
+/**
+ * Implements hook_field_update_instance().
+ */
+function conditional_fields_field_update_instance($instance, $prior_instance) {
+  _conditional_fields_clear_cache();
+}
+
+/**
  * Implements hook_field_delete_instance().
  *
  * Delete any dependency associated with the deleted instance.
@@ -1399,6 +1492,8 @@ function conditional_fields_field_delete_instance($instance) {
         ->condition('dependee', $instance['id'])
         ->condition('dependent', $instance['id']))
     ->execute();
+
+  _conditional_fields_clear_cache();
 }
 
 /**
@@ -1910,16 +2005,36 @@ function conditional_fields_dependency_description($dependee_name, $dependent_na
         }
         $values = implode(', ', $value_array);
       case CONDITIONAL_FIELDS_DEPENDENCY_VALUES_AND:
-        $description = '%dependent_name is !state when %dependee_name has all the values: @values.';
+        return t('%dependent_name is !state when %dependee_name has all the values: @values.', array(
+          '%dependent_name' => $dependent_name,
+          '!state' => drupal_strtolower($states[$options['state']]),
+          '%dependee_name' => $dependee_name,
+          '@values' => $values,
+        ));
         break;
       case CONDITIONAL_FIELDS_DEPENDENCY_VALUES_OR:
-        $description = '%dependent_name is !state when %dependee_name has at least one of the values: @values.';
+        return t('%dependent_name is !state when %dependee_name has at least one of the values: @values.', array(
+          '%dependent_name' => $dependent_name,
+          '!state' => drupal_strtolower($states[$options['state']]),
+          '%dependee_name' => $dependee_name,
+          '@values' => $values,
+        ));
         break;
       case CONDITIONAL_FIELDS_DEPENDENCY_VALUES_XOR:
-        $description = '%dependent_name is !state when %dependee_name has only one of the values: @values.';
+        return t('%dependent_name is !state when %dependee_name has only one of the values: @values.', array(
+          '%dependent_name' => $dependent_name,
+          '!state' => drupal_strtolower($states[$options['state']]),
+          '%dependee_name' => $dependee_name,
+          '@values' => $values,
+        ));
         break;
       case CONDITIONAL_FIELDS_DEPENDENCY_VALUES_NOT:
-        $description = '%dependent_name is !state when %dependee_name has none of the values: @values.';
+        return t('%dependent_name is !state when %dependee_name has none of the values: @values.', array(
+          '%dependent_name' => $dependent_name,
+          '!state' => drupal_strtolower($states[$options['state']]),
+          '%dependee_name' => $dependee_name,
+          '@values' => $values,
+        ));
         break;
       case CONDITIONAL_FIELDS_DEPENDENCY_VALUES_REGEX:
         return t('%dependent_name is !state when %dependee_name values match the regular expression: @regex.', array(
@@ -1930,13 +2045,6 @@ function conditional_fields_dependency_description($dependee_name, $dependent_na
         ));
         break;
     }
-
-    return t($description, array(
-      '%dependent_name' => $dependent_name,
-      '!state' => drupal_strtolower($states[$options['state']]),
-      '%dependee_name' => $dependee_name,
-      '@values' => $values,
-    ));
   }
   else {
     $conditions = conditional_fields_conditions();
@@ -1984,7 +2092,6 @@ function conditional_fields_features_api() {
   );
 }
 
-
 /**
  * Flatten a one-dimensional array.
  */
@@ -2001,3 +2108,319 @@ function conditional_fields_flatten_array($array, $delta = 0, $separator = ':')
   return $array_string;
 }
 
+/**
+ * Search for the parent dependee key in the conditions array.
+ *
+ * @param $array
+ *   Conditions array.
+ * @param $dependee_id
+ *   Dependee field instance id.
+ * @param $dependee_name
+ *   Dependee name.
+ *
+ * @return
+ *   Parent dependee key.
+ */
+function _conditional_fields_find_parent_dependee_key($array, $dependee_id, $dependee_name) {
+  foreach ($array as $parent_dependee_key => $info) {
+    if (isset($info[$dependee_name]['dependents'][$dependee_id])) {
+      return $parent_dependee_key;
+    }
+  }
+
+  return FALSE;
+}
+
+/**
+ * Returns a reference to the field instance tree.
+ *
+ * @return
+ *   Field instance tree.
+ */
+function &_conditional_fields_instance_tree() {
+  $tree = &drupal_static(__FUNCTION__);
+
+
+  if (!isset($tree)) {
+    $cache_key = 'conditional_fields::instance_tree';
+
+    // Try to load the tree from the cache.
+    if ($cache = cache_get($cache_key)) {
+      $tree = $cache->data;
+    }
+    else {
+      // We have to build it.
+      $tree = array();
+
+      // Collect all direct child fields (= fields that don't need a parent to be found),
+      // start by looping over the entities.
+      foreach (field_info_instances() as $entity_type => $field_bundles) {
+        // Loop over the bundles.
+        foreach ($field_bundles as $bundle => $field_instances) {
+          // Loop over the field instances.
+          foreach ($field_instances as $field_name => $field_instance) {
+            // Add the instances to the tree.
+            _conditional_fields_instance_tree_add($entity_type, $bundle, $field_name, $field_instance);
+          }
+        }
+      }
+
+      // Add the field references that must pass via a parent to get to the field.
+      do {
+        $added = 0;
+
+        // Loop over the field instances.
+        foreach ($tree as $field_instance_id => $field_instance_ref) {
+          // Loop over the references.
+          foreach ($field_instance_ref as $via_key => $info) {
+            // Only continue if this reference is via a parent.
+            if ($parent_count = count($info['parents'])) {
+              // Build the refernce key we're about to create.
+              $via_key_2 = $info['entity_type'] . '|' . $info['bundle'];
+
+              // The extra parents should be in reverse order.
+              $parents = array_reverse($info['parents']);
+
+              // Loop again over the field instances tree.
+              foreach ($tree as $field_instance_id_2 => $field_instance_ref_2) {
+                // Check if the existing reference exists here as well and add the
+                // new reference if that one doesn't exist yet.
+                if ($field_instance_id != $field_instance_id_2 && isset($field_instance_ref_2[$via_key]) && !isset($field_instance_ref_2[$via_key_2])) {
+                  // Copy and update the reference info.
+                  $info_2 = $field_instance_ref_2[$via_key];
+                  $info_2['parents'] = array_merge($parents, $info_2['parents']);
+                  $info_2['trail'] = ' > ' . $info_2['trail'];
+
+                  // Loop over the new parents, update them and add them to the trail.
+                  for ($i = ($parent_count - 1); $i >= 0; $i--) {
+                    $info_2['parents'][$i]['is_child'] = FALSE;
+                    $info_2['trail'] = ' >> ' . $info_2['parents'][$i]['bundle'] . ' ' . $info_2['parents'][$i]['entity_type'] . $info_2['trail'];
+                  }
+
+                  $info_2['trail'] = 'entity' . $info_2['trail'];
+
+                  // Add the reference.
+                  $tree[$field_instance_id_2][$via_key_2] = $info_2;
+
+                  // Just to keep us looping :-)
+                  $added++;
+                }
+              }
+            }
+          }
+        }
+      } while($added);
+
+      // Save in cache.
+      cache_set($cache_key, $tree);
+    }
+  }
+
+  return $tree;
+}
+
+/**
+ * Adds a field instance to the tree.
+ *
+ * @param $entity_type
+ *   Type of entity this field is added for.
+ * @param $bundle
+ *   Entity bundle this field is added for.
+ * @param $name
+ *   Field name.
+ * @param $instance
+ *   Field instance info array as returned by field_info_instances().
+ * @param $parents
+ *   Array of parent fields.
+ */
+function _conditional_fields_instance_tree_add($entity_type, $bundle, $name, $instance, $parents = array()) {
+  $tree = &_conditional_fields_instance_tree();
+
+  $field = field_info_field($name);
+  $child_entity_type = NULL;
+  $child_bundle = NULL;
+  $child_column = NULL;
+
+  switch ($field['type']) {
+    case 'entityreference':
+      if (isset($field['settings']['handler_settings']['target_bundles'])) {
+        if (count($field['settings']['handler_settings']['target_bundles']) == 1) {
+          $child_entity_type = $field['settings']['target_type'];
+          $child_bundle = reset($field['settings']['handler_settings']['target_bundles']);
+          $child_column = 'target_id';
+        }
+      }
+      break;
+    case 'field_collection':
+      $child_entity_type = 'field_collection_item';
+      $child_bundle = $name;
+      $child_column = 'value';
+      break;
+    case 'markup':
+      break;
+    default:
+      // Collect the parts of the instance trail.
+      $trail = array_map('_conditional_fields_instance_parent_field', $parents);
+      $trail[] = $name;
+
+      // Add the instance to the tree.
+      $tree[$instance['id']][$entity_type . '|' . $bundle] = array(
+        'entity_type' => $instance['entity_type'],
+        'bundle' => $instance['bundle'],
+        'field' => $name,
+        'parents' => $parents,
+        'trail' => implode(' > ', $trail),
+        'label' => $instance['label'],
+      );
+      break;
+  }
+
+  // Add the fields of the referenced entity.
+  if ($child_entity_type && $child_bundle) {
+    // Add the current field as parent.
+    $parents[] = array(
+      'entity_type' => $instance['entity_type'],
+      'bundle' => $instance['bundle'],
+      'field' => $name,
+      'column' => $child_column,
+      'is_child' => TRUE,
+    );
+
+    // Loop over the field instances of the specified entity and bundle.
+    foreach (field_info_instances($child_entity_type, $child_bundle) as $field_name => $field_instance) {
+      _conditional_fields_instance_tree_add($entity_type, $bundle, $field_name, $field_instance, $parents);
+    }
+  }
+}
+
+/**
+ * Returns the field name from a "parent" element in the field instance tree.
+ *
+ * @param $parent
+ *   A single field instance parent.
+ *
+ * @return
+ *   Field name.
+ */
+function _conditional_fields_instance_parent_field($parent) {
+  return $parent['field'];
+}
+
+/**
+ * Clear our our module cache.
+ */
+function _conditional_fields_clear_cache() {
+  cache_clear_all('conditional_fields::*', 'cache', TRUE);
+  drupal_static_reset('_conditional_fields_instance_tree');
+}
+
+/**
+ * Load all entities that are needed to render the remote field (dependee)
+ * conditions of an entity. Note that unresolved references won't be included
+ * in the resulting array.
+ *
+ * @param $entity_type
+ *   Entity type.
+ * @param $entity
+ *   Entity with conditional fields that have a remote dependee.
+ *
+ * @result
+ *   A 3 dimensional array keyed by dependent id, then by dependency id.
+ *   The last array has 2 keys: entity_type and entity.
+ */
+function conditional_fields_load_dependee_entities($entity_type, $entity) {
+  // Get the entity id and bundle.
+  list($entity_id, , $bundle) = entity_extract_ids($entity_type, $entity);
+
+  // Load the field instance tree and existing dependencies.
+  $tree = _conditional_fields_instance_tree();
+  $dependencies = conditional_fields_load_dependencies($entity_type, $bundle);
+
+  // Prepare some values.
+  $entities = array();
+  $cache = array();
+  $tree_key = $entity_type . '|' . $bundle;
+
+  foreach ($dependencies['dependents'] as $dependency_name => $dependees) {
+    foreach ($dependees as $dependency_id => $dependency) {
+      $dependee_id = $dependency['dependee_id'];
+
+      if (isset($tree[$dependee_id][$tree_key])) {
+        $info = $tree[$dependee_id][$tree_key];
+
+        // Check if there are any parent, e.a. do we need to load any
+        // other entities for this condittion?
+        if (!empty($info['parents'])) {
+          // Set the base entity as current entity.
+          $current_entity_type = $entity_type;
+          $current_entity = $entity;
+          $current_entity_id = $entity_id;
+
+          // Start with an empty cache key.
+          $cache_key = '';
+
+          foreach ($info['parents'] as $parent) {
+            // Update the cache key.
+            $cache_key .= '#' . $parent['entity_type'] . '|' . $parent['bundle'] . '|' . $parent['field'] . '|' . (int) $parent['is_child'];
+
+            // Check if we have this entity cached.
+            if (isset($cache[$cache_key])) {
+              // Extract the "current_" values and continue.
+              extract($cache[$cache_key]);
+              continue;
+            }
+
+            // Check if the parent is a child or real parent.
+            if ($parent['is_child']) {
+              // Get, through the field, the id of the referenced entity.
+              $items = field_get_items($current_entity_type, $current_entity, $parent['field_name']);
+
+              if ($current_entity_id = reset($items)) {
+                // Load that entity.
+                $current_entity_type = $parent['entity_type'];
+                $current_entity = entity_load_single($current_entity_type, $current_entity_id);
+              }
+            }
+            else {
+              // Search for the entity that references our entity.
+              $query = new EntityFieldQuery();
+              $result = $query->entityCondition('entity_type', $parent['entity_type'])
+                ->entityCondition('bundle', $parent['bundle'])
+                ->fieldCondition($parent['field'], $parent['column'], $current_entity_id)
+                ->range(0, 1)
+                ->execute();
+
+              $current_entity = NULL;
+              if (!empty($result[$parent['entity_type']])) {
+                // If an entity id was found we load that entity.
+                $current_entity_type = $parent['entity_type'];
+                $current_entity_id = key(array_keys($result[$current_entity_type]));
+                $current_entity = entity_load_single($current_entity_type, $current_entity_id);
+              }
+            }
+
+            // Leave if no valid entity was found.
+            if (!$current_entity_id || !$current_entity) {
+              break 2;
+            }
+
+            // Put this result in the cache.
+            $cache[$cache_key] = array(
+              'current_entity_type' => $current_entity_type,
+              'current_entity_id' => $current_entity_id,
+              'current_entity' => $current_entity,
+            );
+          }
+
+          // Add to the result.
+          $entities[$dependency_name][$dependency_id] = array(
+            'entity_type' => $current_entity_type,
+            'entity' => $current_entity,
+          );
+        }
+      }
+    }
+  }
+
+  return $entities;
+}
diff --git a/includes/conditional_fields.admin.inc b/includes/conditional_fields.admin.inc
index 5cba6e3..2c66378 100644
--- a/includes/conditional_fields.admin.inc
+++ b/includes/conditional_fields.admin.inc
@@ -47,8 +47,6 @@ function conditional_fields_dependencies_overview_page($bundle_name = NULL, $ent
       continue;
     }
 
-    $items = array();
-
     if ($entity_type) {
       $build[$entity_name] = array();
     }
@@ -106,10 +104,11 @@ function conditional_fields_dependencies_overview_page($bundle_name = NULL, $ent
 function conditional_fields_dependency_add_form($form, &$form_state, $entity_type, $bundle_name) {
   $form = array();
   $instances = field_info_instances($entity_type, $bundle_name);
+  $available_dependees = conditional_fields_get_dependee_options($entity_type, $bundle_name);
 
-  if (count($instances) < 2) {
+  if (!count($instances) || count($available_dependees) < 2) {
     $form['no_fields'] = array(
-      '#markup' => t('Add at least two fields to enable dependencies.'),
+      '#markup' => '<p>' . t('Add at least two fields or reference this entity from another entity to enable dependencies.') . '</p>',
     );
 
     return $form;
@@ -124,7 +123,7 @@ function conditional_fields_dependency_add_form($form, &$form_state, $entity_typ
     '#header' => array(
       t('Dependent'),
       t('Dependees'),
-      array('data' => t('Description'), 'colspan' => 2),
+      array('data' => t('Description'), 'colspan' => 3),
       array('data' => t('Operations'), 'colspan' => 2),
     ),
     '#attributes' => array(
@@ -141,46 +140,82 @@ function conditional_fields_dependency_add_form($form, &$form_state, $entity_typ
     foreach ($dependencies['dependents'] as $dependent => $dependees) {
       uasort($dependees, '_conditional_fields_sort_dependees');
 
-      $first_row = TRUE;
-      $show_AND = $show_OR = $show_XOR = TRUE;
+      // Count the dependendees per group.
+      $dependee_count = array('AND' => 0, 'OR' => 0, 'XOR' => 0);
+      foreach ($dependees as $dependency) {
+        $dependee_count[$dependency['options']['grouping']]++;
+      }
+
+      // Check if there are multiple groups.
+      $has_multiple_groups = (count(array_filter($dependee_count)) > 1);
 
+      // Add a total count.
+      $dependee_count['total'] = count($dependees);
+
+      $first_row = TRUE;
       foreach ($dependees as $id => $dependency) {
         $form['table']['dependencies'][$id] = array();
-        $dependee_count = count($dependees);
 
         // Dependencies come ordered by dependent, so by adding it only to the
         // first row they will appear grouped.
-        if ($first_row == TRUE) {
+        if ($first_row) {
           $form['table']['dependencies'][$id]['dependent'] = array(
             '#markup' => check_plain($instances[$dependent]['label']) . ' (' . $dependent . ')',
-            '#rowspan' => $dependee_count,
+            '#rowspan' => $dependee_count['total'],
           );
+        }
 
-          $first_row = FALSE;
+        // Get the dependee label.
+        if (isset($instances[$dependency['dependee']]['label'])) {
+          $label = $instances[$dependency['dependee']]['label'] . ' (' . $dependency['dependee'] . ')';
+        }
+        else {
+          $label = $available_dependees[$dependency['dependee_id']];
         }
 
+        // Add the dependee.
         $row = array(
           'dependee' => array(
-            '#markup' => check_plain($instances[$dependency['dependee']]['label']) . ' (' . $dependency['dependee'] . ')',
+            '#markup' => check_plain($label),
           ),
         );
 
-        // To avoid clutter, collect information about groupings so we can show each
-        // operator once per dependent.
-        if ($dependee_count > 1) {
-          if (${'show_' . $dependency['options']['grouping']}) {
-            $row['group'] = array(
+        // Group multiple groups with an AND.
+        if ($first_row && $has_multiple_groups) {
+          $row['group1'] = array(
+            '#markup' => 'AND',
+            '#rowspan' => $dependee_count['total'],
+          );
+        }
+
+        // Group per group, we remove the group count afterwards to indicate that
+        // the grouping for that group was already done.
+        $grouping = $dependency['options']['grouping'];
+        if ($has_multiple_groups || (isset($dependee_count[$grouping]) && $dependee_count[$grouping] > 1)) {
+          if (isset($dependee_count[$grouping])) {
+            $row['group2'] = array(
               '#markup' => $dependency['options']['grouping'],
-              '#rowspan' => $dependee_count,
+              '#rowspan' => $dependee_count[$grouping],
             );
-            ${'show_' . $dependency['options']['grouping']} = FALSE;
+
+            unset($dependee_count[$grouping]);
           }
+
+          $row['description']['#colspan'] = ($has_multiple_groups ? 1 : 2);
         }
         else {
-          $row['description']['#colspan'] = 2;
+          $row['description']['#colspan'] = ($has_multiple_groups ? 2 : 3);
         }
 
-        $row['description']['#markup'] = conditional_fields_dependency_description($instances[$dependency['dependee']]['label'], $instances[$dependent]['label'], $dependency['options']);
+        // Strip the dependee trail so only the label is kept.
+        if (!isset($instances[$dependency['dependee']]['label'])) {
+          // Get the label by stripping of the trail.
+          $label = explode('(', $label);
+          array_pop($label);
+          $label = trim(implode('(', $label));
+        }
+
+        $row['description']['#markup'] = conditional_fields_dependency_description($label, $instances[$dependent]['label'], $dependency['options']);
 
         $row['edit'] = array(
           '#type' => 'link',
@@ -197,18 +232,18 @@ function conditional_fields_dependency_add_form($form, &$form_state, $entity_typ
         );
 
         $form['table']['dependencies'][$id] += $row;
+        $first_row = FALSE;
       }
     }
   }
 
-  // Build list of available fields.
-  $fields = array();
-
+  // Build list of available dependents.
+  $dependents = array();
   foreach ($instances as $field) {
-    $fields[$field['id']] = check_plain($field['label'] . ' (' . $field['field_name'] . ')');
+    $dependents[$field['id']] = check_plain($field['label']);
   }
 
-  asort($fields);
+  asort($dependents);
 
   // Build list of states.
   $states = array_map('drupal_strtolower', conditional_fields_states());
@@ -225,7 +260,7 @@ function conditional_fields_dependency_add_form($form, &$form_state, $entity_typ
       '#title' => t('Dependent'),
       '#title_display' => 'invisible',
       '#description' => t('Dependent'),
-      '#options' => $fields,
+      '#options' => $dependents,
       '#prefix' => '<div class="add-new-placeholder">' . t('Add new dependency') . '</div>',
     ),
     'dependee' => array(
@@ -233,7 +268,7 @@ function conditional_fields_dependency_add_form($form, &$form_state, $entity_typ
       '#title' => t('Dependee'),
       '#title_display' => 'invisible',
       '#description' => t('Dependee'),
-      '#options' => $fields,
+      '#options' => $available_dependees,
       '#prefix' => '<div class="add-new-placeholder">&nbsp;</div>',
     ),
     'state' => array(
@@ -343,7 +378,7 @@ function theme_conditional_fields_table($variables) {
     drupal_render($elements['add_new_dependency']['dependee']),
     array(
       'data' => drupal_render($elements['add_new_dependency']['state']) . drupal_render($elements['add_new_dependency']['condition']),
-      'colspan' => 2,
+      'colspan' => 3,
     ),
     array(
       'data' => drupal_render($elements['add_new_dependency']['actions']),
@@ -828,6 +863,100 @@ function conditional_fields_dependency_delete_form_submit($form, &$form_state) {
 }
 
 /**
+ * Get a list of possible dependee options, ready for usage as select options.
+ *
+ * @param $entity_type
+ *   Entity type.
+ * @param $bundle
+ *   Entity bundle.
+ *
+ * @return
+ *   Possible dependees, keyed by field istance id and their label as value.
+ */
+function conditional_fields_get_dependee_options($entity_type, $bundle) {
+  $cache_key = 'conditional_fields::dependees::' . $entity_type . '::' . $bundle;
+
+  if ($cache = cache_get($cache_key)) {
+    $dependees = $cache->data;
+  }
+  else {
+    // Load the field instance tree.
+    $tree = _conditional_fields_instance_tree();
+
+    // Build the dependees list.
+    $dependees = array();
+    foreach ($tree as $id => $instances) {
+      $key = $entity_type . '|' . $bundle;
+
+      if (isset($instances[$key])) {
+        $dependees[$id] = $instances[$key];
+      }
+    }
+
+    // Sort the dependees.
+    uasort($dependees, '_conditional_fields_sort_dependee_options');
+
+    // We only need the labels.
+    foreach ($dependees as &$item) {
+      $item = $item['label'] . ' (' . $item['trail'] . ')';
+    }
+
+    // Cache it this will kill our site (peformance-wise).
+    cache_set($cache_key, $dependees);
+  }
+
+  return $dependees;
+}
+
+/**
+ * Sorting callback, used to sort the dependee select options.
+ *
+ * @param $a
+ *   Dependee 1, as returned by conditional_fields_get_available_dependees().
+ * @param $b
+ *   Dependee 2, as returned by conditional_fields_get_available_dependees().
+ *
+ * @return
+ *   0 if equal, < 0 if $a < $b and > 0 if $a > $b.
+ */
+function _conditional_fields_sort_dependee_options($a, $b) {
+  if (!empty($a['parents']) || !empty($b['parents'])) {
+    // By parent location (parents of parents come last).
+    $parents_a = reset($a['parents']);
+    $parents_b = reset($b['parents']);
+
+    if ((isset($parents_a['is_child']) && !$parents_a['is_child']) xor (isset($parents_b['is_child']) && !$parents_b['is_child'])) {
+      if (isset($parents_a['is_child']) && !$parents_a['is_child']) {
+        return 1;
+      }
+      else {
+        return -1;
+      }
+    }
+
+    // By number of parents.
+    $parents_a = count($a['parents']);
+    $parents_b = count($b['parents']);
+
+    if ($parents_a != $parents_b) {
+      return $parents_a - $parents_b;
+    }
+
+    // By parent name.
+    $parents_a = implode('-', array_map('_conditional_fields_instance_parent_field', $a['parents']));
+    $parents_b = implode('-', array_map('_conditional_fields_instance_parent_field', $b['parents']));
+    $compare = strcmp($parents_a, $parents_b);
+
+    if ($compare != 0) {
+      return $compare;
+    }
+  }
+
+  // By label.
+  return strcmp($a['trail'], $b['trail']);
+}
+
+/**
  * Uasort callback; sorts dependencies by group operator and dependee name.
  */
 function _conditional_fields_sort_dependees($a, $b) {
