diff --git a/date.field.inc b/date.field.inc
index 7acd7ef..5de3a33 100644
--- a/date.field.inc
+++ b/date.field.inc
@@ -288,7 +288,7 @@ function date_field_validate($entity_type, $entity, $field, $instance, $langcode
       if (is_array($item) && isset($item['value'])) {
         $process = date_process_values($field, $instance);
         $date1 = new DateObject($item['value'], $item['timezone'], date_type_format($field['type']));
-        if (empty($item['value2']) && $item['value2'] !== 0) {
+        if (!isset($item['value2'])) {
           $date2 = clone($date1);
         }
         else {
@@ -314,7 +314,6 @@ function date_field_validate($entity_type, $entity, $field, $instance, $langcode
       }
     }
   }
-
 }
 
 /**
diff --git a/date_api/date_api_elements.inc b/date_api/date_api_elements.inc
index b79baca..be7e24c 100644
--- a/date_api/date_api_elements.inc
+++ b/date_api/date_api_elements.inc
@@ -321,7 +321,7 @@ function date_text_validate($element, &$form_state) {
     return;
   }
   $input_exists = NULL;
-  $input = drupal_array_get_nested_value($form_state['input'], $element['#parents'], $input_exists);
+  $input = drupal_array_get_nested_value($form_state['values'], $element['#parents'], $input_exists);
 
   $label = !empty($element['#date_title']) ? $element['#date_title'] : (!empty($element['#title']) ? $element['#title'] : '');
   $date = date_text_input_date($element, $input);
@@ -410,7 +410,7 @@ function date_select_element_process($element, $form_state, $form) {
   $granularity = date_format_order($element['#date_format']);
 
   $input_exists = NULL;
-  $input = drupal_array_get_nested_value($form_state['input'], $element['#parents'], $input_exists);
+  $input = drupal_array_get_nested_value($form_state['values'], $element['#parents'], $input_exists);
 
   if (is_array($element['#default_value'])) {
     $date = date_select_input_date($element, $element['#default_value']);
@@ -626,7 +626,7 @@ function date_select_validate($element, &$form_state) {
   }
 
   $input_exists = NULL;
-  $input = drupal_array_get_nested_value($form_state['input'], $element['#parents'], $input_exists);
+  $input = drupal_array_get_nested_value($form_state['values'], $element['#parents'], $input_exists);
   // Strip field labels out of the results.
   foreach ($element['#value'] as $field => $field_value) {
     if (substr($field_value, 0, 1) == '-') {
diff --git a/date_elements.inc b/date_elements.inc
index 3e702cd..ed3042e 100644
--- a/date_elements.inc
+++ b/date_elements.inc
@@ -122,7 +122,7 @@ function date_field_widget_form(&$form, &$form_state, $field, $instance, $langco
 
 function date_combo_value_callback($element, $input = FALSE, &$form_state) {
   if (!$input) {
-    return array();
+    return NULL;
   }
 }
 
@@ -217,8 +217,19 @@ function date_local_date($form, $form_state, $delta, $item, $timezone, $field, $
  */
 function date_combo_element_process($element, &$form_state, $form) {
   if (isset($element['#access']) && empty($element['#access'])) {
+    // Make sure the db ready default value is set.
+    // @TODO This is ugly - is there a better way to deal with this: http://drupal.org/node/1178716
+    foreach ($element['#columns'] as $value_key) {
+      if (!empty($element['#value'][$value_key])) {
+        $date = new DateObject($element['#value'][$value_key], new DateTimeZone($element['#value']['timezone']));
+        $date->setTimezone(new DateTimeZone($element['#value']['timezone_db']));
+        $element['#default_value'][$value_key] = $element['#value'][$value_key] = $date->format(date_type_format($element['#value']['date_type']));
+      }
+    }
+    form_set_value($element, $element['#default_value'], $form_state);
     return $element;
   }
+
   $field_name = $element['#field_name'];
   $delta = $element['#delta'];
   $bundle = $element['#bundle'];
@@ -399,7 +410,7 @@ function date_combo_validate($element, &$form_state) {
   $langcode = $element['#language'];
 
   // If the whole field is empty and that's OK, stop now.
-  if (empty($form_input[$field_name]) && !$element['#required']) {
+  if (empty($form_input[$field_name][$langcode][$delta]) && !$element['#required']) {
     return;
   }
 
diff --git a/date_popup/date_popup.module b/date_popup/date_popup.module
index a9d6392..67a4d84 100644
--- a/date_popup/date_popup.module
+++ b/date_popup/date_popup.module
@@ -446,7 +446,7 @@ function date_popup_validate($element, &$form_state) {
   $label = t($label);
 
   $input_exists = NULL;
-  $input = drupal_array_get_nested_value($form_state['input'], $element['#parents'], $input_exists);
+  $input = drupal_array_get_nested_value($form_state['values'], $element['#parents'], $input_exists);
 
   // If we have an all day flag on this date and the time is empty,
   // change the format to match the input value so we don't get validation errors.
diff --git a/date_repeat.inc b/date_repeat.inc
index d500629..248d939 100644
--- a/date_repeat.inc
+++ b/date_repeat.inc
@@ -61,7 +61,7 @@ function _date_repeat_widget_validate($element, &$form_state) {
 
   $form_values = $form_state['values'];
   $item = $form_values;
-  $input = $form_state['input'];
+  $input = $form_state['values'];
   foreach ($element['#parents'] as $key) {
     $item = $item[$key];
     $input = $input[$key];
