diff --git a/conditional_fields.module b/conditional_fields.module
index 34503a6..944b354 100644
--- a/conditional_fields.module
+++ b/conditional_fields.module
@@ -536,11 +536,11 @@ function conditional_fields_form_after_build($form, &$form_state) {
             $handler($dependee_form_field, $dependee_form_state, $options, $state);
           }
         }
-
-        // Add validation callback to element.
-        _conditional_fields_element_add_property($dependent_form_field, '#element_validate', 'conditional_fields_dependent_validate', 'append');
       }
 
+      // 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']])) {
@@ -672,7 +672,36 @@ function conditional_fields_dependent_validate($element, &$form_state, $form) {
   $dependent = $element[$element['#language']];
 
   // Check if this field's dependencies were triggered.
-  if (conditional_fields_evaluate_dependencies($dependent, $form, $form_state)) {
+  $triggered = conditional_fields_evaluate_dependencies($dependent, $form, $form_state);
+
+  if ($evaluated_dependencies = conditional_fields_evaluate_dependencies($dependent, $form, $form_state, FALSE)) {
+    foreach ($evaluated_dependencies[$dependent['#field_name']] as $operator) {
+      foreach ($operator as $state => $result) {
+        if (($result && $state == 'required' && $triggered) || (!$result && $state == '!required' && !$triggered)) {
+          $input_state = drupal_array_get_nested_value($form_state['values'], $dependent['#parents']);
+          $input_state = (is_null($input_state)) ? array() : $input_state;
+          if (isset($dependent['#field_name'])) {
+            $field = field_info_field($dependent['#field_name']);
+            $input_state = _field_filter_items($field, $input_state);
+          }
+          if (empty($input_state)) {
+            $title = '';
+            if (isset($dependent['#title'])) {
+              $title = $dependent['#title'];
+            }
+            else {
+              if (isset($dependent[0]['#title'])) {
+                $title = $dependent[0]['#title'];
+              }
+            }
+            form_error($dependent, t('The !title field is required', array('!title' => $title)));
+          }
+        }
+      }
+    }
+  }
+
+  if ($triggered) {
     return;
   }
 
@@ -683,7 +712,7 @@ function conditional_fields_dependent_validate($element, &$form_state, $form) {
 
   // 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'])) {
+  if (!empty($element['#conditional_fields_reset_if_untriggered']) && !$triggered) {
     $form_state_addition['reset'] = TRUE;
   }
 
@@ -754,10 +783,7 @@ function conditional_fields_form_validate($form, &$form_state) {
       continue;
     }
 
-    if (empty($field['reset'])) {
-      unset($field_values_location[$dependent['#field_name']]);
-    }
-    else {
+    if (!empty($field['reset'])) {
       $dependent_info = field_form_get_state($dependent['#field_parents'], $dependent['#field_name'], $dependent['#language'], $form_state);
       $field_values_location[$dependent['#field_name']][$dependent['#language']] = field_get_default_value($dependent_info['instance']['entity_type'], NULL, $dependent_info['field'], $dependent_info['instance'], $dependent['#language']);
     }
@@ -997,7 +1023,8 @@ function conditional_fields_evaluate_grouping($groups) {
  * @param $dependent
  *   The field form element in the current language.
  */
-function conditional_fields_evaluate_dependencies($dependent, $form, $form_state) {
+function conditional_fields_evaluate_dependencies($dependent, $form, $form_state, $grouping = TRUE) {
+
   $dependencies = $form['#conditional_fields'][$dependent['#field_name']]['dependees'];
   $evaluated_dependees = array();
 
@@ -1019,10 +1046,20 @@ function conditional_fields_evaluate_dependencies($dependent, $form, $form_state
       $values = $values[$dependee_parent[$dependee]['#language']];
     }
 
-    $evaluated_dependees[$dependent['#field_name']][$dependency['options']['grouping']][] = conditional_fields_evaluate_dependency('edit', $values, $dependency['options']);
+    if ($grouping) {
+      $evaluated_dependees[$dependent['#field_name']][$dependency['options']['grouping']][] = conditional_fields_evaluate_dependency('edit', $values, $dependency['options']);
+    }
+    else {
+      $evaluated_dependees[$dependent['#field_name']][$dependency['options']['grouping']][$dependency['options']['state']] = conditional_fields_evaluate_dependency('edit', $values, $dependency['options']);
+    }
+  }
+
+
+  if ($grouping) {
+    return conditional_fields_evaluate_grouping($evaluated_dependees[$dependent['#field_name']]);
   }
 
-  return conditional_fields_evaluate_grouping($evaluated_dependees[$dependent['#field_name']]);
+  return $evaluated_dependees;
 }
 
 /**
@@ -1036,9 +1073,27 @@ function conditional_fields_evaluate_dependency($context, $values, $options) {
   if ($options['values_set'] == CONDITIONAL_FIELDS_DEPENDENCY_VALUES_WIDGET) {
     $dependency_values = $context == 'view' ? $options['value'] : $options['value_form'];
 
+    if($options['condition'] === '!empty'){
+      $values = (isset($values[0]['value'])) ? $values[0]['value'] : $values;
+      $values = ($values === '_none') ? '' : $values;
+      return (!empty($values)) ? TRUE : FALSE;
+    }
+    if($options['condition'] === 'empty'){
+      $values = (isset($values[0]['value'])) ? $values[0]['value'] : $values;
+      $values = ($values === '_none') ? '' : $values;
+      return (empty($values)) ? TRUE : FALSE;
+    }
+
+    // The BooleanList widget provides an empty array as $dependency_values, thus
+    // checking this field requires a different handling in case of 'checked or
+    // '!checked' conditions, where $value has 0 or 1.
+    if ($options['condition'] === 'checked' || $options['condition'] === '!checked') {
+      $dependency_values = (int)($options['condition'] === 'checked');
+    }
+
     // Simple case: both values are strings or integers. Should never happen in
     // view context, but does no harm to check anyway.
-    if (!is_array($values)) {
+    if (!is_array($values) || (is_array($values) && empty($values))) {
       // Options elements consider "_none" value same as empty.
       $values = $values === '_none' ? '' : $values;
 
@@ -1065,7 +1120,10 @@ function conditional_fields_evaluate_dependency($context, $values, $options) {
       // should map to the first key of the first value of $values.
       if (!is_array($dependency_values)) {
         $key = current(array_keys((array) current($values)));
-        $dependency_values = array(array($key => $dependency_values));
+
+        $dependency_values = array(array($key => $options['value'][0][$key]));
+        $temp[][$key] = $values[0][$key];
+        $values = $temp;
       }
 
       // Compare arrays recursively ignoring keys, since multiple select widgets
