diff --git a/date.field.inc b/date.field.inc
index 7acd7ef..daecfba 100644
--- a/date.field.inc
+++ b/date.field.inc
@@ -161,7 +161,7 @@ function date_field_formatter_view($entity_type, $entity, $field, $instance, $la
  */
 function date_field_is_empty($item, $field) {
   // Sometimes a $item is a date object.
-  // Coming from repeating dates. Why?? 
+  // Coming from repeating dates. Why??
   if (!is_array($item)) {
     return FALSE;
   }
@@ -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 {
@@ -309,12 +309,11 @@ function date_field_validate($entity_type, $entity, $field, $instance, $langcode
               'error' => 'value2',
               'message' => t("An 'End date' is required for field %field #%delta.", array('%delta' => $field['cardinality'] ? intval($delta + 1) : '', '%field' => t($instance['label']))),
             );
-          }            
-        }       
+          }
+        }
       }
     }
   }
-
 }
 
 /**
@@ -348,8 +347,8 @@ function date_field_update($entity_type, $entity, $field, $instance, $langcode,
       $items[$delta]['timezone'] = date_get_timezone($field['settings']['tz_handling'], $timezone);
       $items[$delta]['timezone_db'] = date_get_timezone_db($field['settings']['tz_handling']);
       $items[$delta]['date_type'] = $field['type'];
-    }  
-  }  
+    }
+  }
   $entity->{$field['field_name']}[$langcode] = $items;
 
   foreach ($values as $delta => $item) {
@@ -362,7 +361,7 @@ function date_field_update($entity_type, $entity, $field, $instance, $langcode,
         if ($field['settings']['todate']) {
           //$items[$delta]['value2'] = date_limit_value($items[$delta]['value2'], date_granularity($field), $field['type']);
         }
-      }  
+      }
     }
   }
   $entity->{$field['field_name']}[$langcode] = $items;
@@ -389,12 +388,12 @@ function date_field_settings_form($field, $instance, $has_data) {
 
 /**
  * Implements hook_content_migrate_field_alter().
- * 
+ *
  * Use this to tweak the conversion of field settings
  * from the D6 style to the D7 style for specific
  * situations not handled by basic conversion,
  * as when field types or settings are changed.
- * 
+ *
  * $field_value['widget_type'] is available to
  * see what widget type was originally used.
  */
@@ -406,13 +405,13 @@ function date_content_migrate_field_alter(&$field_value, $instance_value) {
       // level.
       unset($field_value['settings']['default_format']);
       unset($field_value['settings']['repeat_collapsed']);
-      break; 
+      break;
   }
 }
 
 /**
  * Implements hook_content_migrate_instance_alter().
- * 
+ *
  * Use this to tweak the conversion of instance or widget settings
  * from the D6 style to the D7 style for specific
  * situations not handled by basic conversion, as when
@@ -440,7 +439,7 @@ function date_content_migrate_instance_alter(&$instance_value, $field_value) {
         if ($display['type'] == 'format_interval') {
 
         }
-        else {      
+        else {
           $old_settings = date_old_formatter_get_settings($instance_value['field_name'], $instance_value['bundle'], $context);
           $display['settings'] = array_merge($display['settings'], $old_settings);
           // If the formatter was the 'default', then use the old 'default_format'
@@ -462,6 +461,6 @@ function date_old_formatter_get_settings($field_name, $type_name, $context) {
   $options['multiple_number'] = variable_get($value .'_multiple_number', '');
   $options['multiple_from'] = variable_get($value .'_multiple_from', '');
   $options['multiple_to'] = variable_get($value .'_multiple_to', '');
-  $options['fromto'] = variable_get($value .'_fromto', 'both');  
+  $options['fromto'] = variable_get($value .'_fromto', 'both');
   return $options;
 }
diff --git a/date_api/date_api_elements.inc b/date_api/date_api_elements.inc
index b79baca..513b6df 100644
--- a/date_api/date_api_elements.inc
+++ b/date_api/date_api_elements.inc
@@ -133,7 +133,7 @@ function date_default_date($element) {
   if (is_object($date)) {
     $date->limitGranularity($granularity);
     if ($date->validGranularity($granularity, $element['#date_flexible'])) {
-      date_increment_round($date, $element['#date_increment']); 
+      date_increment_round($date, $element['#date_increment']);
     }
     return $date;
   }
@@ -205,7 +205,7 @@ function date_year_range_validate(&$element, &$form_state) {
  * Element value callback for date_timezone element.
  */
 function date_timezone_element_value_callback($element, $input = FALSE, &$form_state) {
-  $return = ''; 
+  $return = '';
   if ($input !== FALSE) {
     $return = $input;
   }
@@ -257,11 +257,11 @@ function date_timezone_validate($element, &$form_state) {
  * Element value callback for date_text element.
  */
 function date_text_element_value_callback($element, $input = FALSE, &$form_state) {
-  $return = array('date' => ''); 
+  $return = array('date' => '');
   $date = NULL;
   if ($input !== FALSE) {
     $return = $input;
-    $date = date_text_input_date($element, $input);  
+    $date = date_text_input_date($element, $input);
   }
   elseif (!empty($element['#default_value'])) {
     $date = date_default_date($element);
@@ -279,7 +279,7 @@ function date_text_element_value_callback($element, $input = FALSE, &$form_state
  *
  * The exact parts displayed in the field are those in #date_granularity.
  * The display of each part comes from #date_format.
- * 
+ *
  */
 function date_text_element_process($element, $form_state, $form) {
 
@@ -310,18 +310,18 @@ function date_text_element_process($element, $form_state, $form) {
 
 /**
  *  Validation for text input.
- * 
+ *
  * When used as a Views widget, the validation step always gets triggered,
  * even with no form submission. Before form submission $element['#value']
  * contains a string, after submission it contains an array.
- * 
+ *
  */
 function date_text_validate($element, &$form_state) {
   if (is_string($element['#value'])) {
     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);
@@ -339,12 +339,12 @@ function date_text_validate($element, &$form_state) {
     }
     if (!empty($element['#required'])) {
       $message = t('A valid date is required for %title.', array('%title' => $label));
-      form_set_error($error_field, $message); 
+      form_set_error($error_field, $message);
       return;
     }
     // Fall through, some other error.
     if (!empty($input['date'])) {
-      form_error($element, t('%title is invalid.', array('%title' => $label))); 
+      form_error($element, t('%title is invalid.', array('%title' => $label)));
       return;
     }
   }
@@ -358,14 +358,14 @@ function date_text_validate($element, &$form_state) {
 function date_text_input_date($element, $input) {
   if (empty($input) || !is_array($input) || !array_key_exists('date', $input) || empty($input['date'])) {
     return NULL;
-  }  
+  }
   $granularity = date_format_order($element['#date_format']);
   $date = new DateObject($input['date'], $element['#date_timezone'], $element['#date_format']);
   if (is_object($date)) {
     $date->limitGranularity($granularity);
     if ($date->validGranularity($granularity, $element['#date_flexible'])){
-      date_increment_round($date, $element['#date_increment']); 
-    }  
+      date_increment_round($date, $element['#date_increment']);
+    }
     return $date;
   }
   return NULL;
@@ -375,11 +375,11 @@ function date_text_input_date($element, $input) {
  * Element value callback for date_select element.
  */
 function date_select_element_value_callback($element, $input = FALSE, &$form_state) {
-  $return = array('year' => '', 'month' => '', 'day' => '', 'hour' => '', 'minute' => '', 'second' => ''); 
+  $return = array('year' => '', 'month' => '', 'day' => '', 'hour' => '', 'minute' => '', 'second' => '');
   $date = NULL;
   if ($input !== FALSE) {
     $return = $input;
-    $date = date_select_input_date($element, $input);  
+    $date = date_select_input_date($element, $input);
   }
   elseif (!empty($element['#default_value'])) {
     $date = date_default_date($element);
@@ -403,14 +403,14 @@ function date_select_element_value_callback($element, $input = FALSE, &$form_sta
  *
  * The exact parts displayed in the field are those in #date_granularity.
  * The display of each part comes from ['#date_settings']['format'].
- * 
+ *
  */
 function date_select_element_process($element, $form_state, $form) {
   $date = NULL;
   $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']);
@@ -474,7 +474,7 @@ function date_parts_element($element, $date, $format) {
   $all_day_id = !empty($element['#date_all_day_id']) ? $element['#date_all_day_id'] : '';
 
   foreach ($granularity as $field) {
-    // Allow empty value as option if date is not required 
+    // Allow empty value as option if date is not required
     // or if empty value was provided as a starting point.
     $part_required = ($element['#required'] && is_object($date)) ? TRUE : FALSE;
     $part_type = in_array($field, $element['#date_text_parts']) ? 'textfield' : 'select';
@@ -614,11 +614,11 @@ function date_parts_element($element, $date, $format) {
 
 /**
  *  Validation function for date selector.
- * 
+ *
  * When used as a Views widget, the validation step always gets triggered,
  * even with no form submission. Before form submission $element['#value']
  * contains a string, after submission it contains an array.
- * 
+ *
  */
 function date_select_validate($element, &$form_state) {
   if (is_string($element['#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) == '-') {
@@ -659,7 +659,7 @@ function date_select_validate($element, &$form_state) {
     }
     if ($element['#required']) {
       $message = t('A valid date is required for %title.', array('%title' => $label));
-      form_set_error($error_field, $message); 
+      form_set_error($error_field, $message);
       return;
     }
     if (!empty($input['year'])) {
@@ -678,7 +678,7 @@ function date_select_validate($element, &$form_state) {
 function date_select_input_date($element, $input) {
   if (empty($input) || !is_array($input) || !array_key_exists('year', $input) || empty($input['year'])) {
     return NULL;
-  }  
+  }
   $granularity = date_format_order($element['#date_format']);
   if (isset($input['ampm'])) {
     if ($input['ampm'] == 'pm' && $input['hour'] < 12) {
@@ -693,7 +693,7 @@ function date_select_input_date($element, $input) {
   if (is_object($date)) {
     $date->limitGranularity($granularity);
     if ($date->validGranularity($granularity, $element['#date_flexible'])) {
-      date_increment_round($date, $element['#date_increment']); 
+      date_increment_round($date, $element['#date_increment']);
     }
     return $date;
   }
diff --git a/date_elements.inc b/date_elements.inc
index 3e702cd..c90c7c7 100644
--- a/date_elements.inc
+++ b/date_elements.inc
@@ -60,7 +60,7 @@ function date_field_widget_form(&$form, &$form_state, $field, $instance, $langco
     }
   }
 
-  module_load_include('inc', 'date_api', 'date_api_elements');  
+  module_load_include('inc', 'date_api', 'date_api_elements');
   $timezone = date_get_timezone($field['settings']['tz_handling'], isset($items[0]['timezone']) ? $items[0]['timezone'] : date_default_timezone());
 
   // TODO see if there's a way to keep the timezone element from ever being
@@ -107,12 +107,12 @@ function date_field_widget_form(&$form, &$form_state, $field, $instance, $langco
       '#weight' => $instance['widget']['weight'] + 1,
       '#attributes' => array('class' => array('date-no-float')),
       '#date_label_position' => $instance['widget']['settings']['label_position'],
-      );  
+      );
   }
 
   // Add a date repeat form element, if needed.
   if (module_exists('date_repeat') && date_is_repeat_field($field, $instance)) {
-    module_load_include('inc', 'date', 'date_repeat');    
+    module_load_include('inc', 'date', 'date_repeat');
     _date_repeat_widget($element, $field, $instance, $items, $delta);
     $element['rrule']['#weight'] = $instance['widget']['weight'] + .4;
   }
@@ -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,17 @@ 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 (array('value', 'value2') as $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'];
@@ -240,8 +249,8 @@ function date_combo_element_process($element, &$form_state, $form) {
   $offset_field = 'offset';
   $offset_field2 = 'offset2';
 
-  if ($field['settings']['todate'] != 'required' 
-  && !empty($element['#default_value'][$to_field]) 
+  if ($field['settings']['todate'] != 'required'
+  && !empty($element['#default_value'][$to_field])
   && $element['#default_value'][$to_field] == $element['#default_value'][$from_field]) {
     unset($element['#default_value'][$to_field]);
   }
@@ -309,7 +318,7 @@ function date_combo_element_process($element, &$form_state, $form) {
     '#date_all_day_id'  => $all_day_id,
     );
 
-  $description =  !empty($instance['description']) ? t($instance['description']) : ''; 
+  $description =  !empty($instance['description']) ? t($instance['description']) : '';
 
   // Give this element the right type, using a Date API
   // or a Date Popup element type.
@@ -337,7 +346,7 @@ function date_combo_element_process($element, &$form_state, $form) {
   // is the 'Start' and which is the 'End' .
 
   if (!empty($field['settings']['todate'])) {
-    // Add class to allow date parts to float together on the same line. 
+    // Add class to allow date parts to float together on the same line.
     $element[$from_field]['#title']  = ''; // The title is in the fieldset.
     $element[$to_field] = $element[$from_field];
     $element[$to_field]['#default_value'] = isset($element['#default_value'][$to_field]) ? $element['#default_value'][$to_field] : '';
@@ -399,7 +408,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;
   }
 
@@ -457,7 +466,7 @@ function date_combo_validate($element, &$form_state) {
     }
   }
 
-  // If the user chose the option to not show the end date, just swap in the 
+  // If the user chose the option to not show the end date, just swap in the
   // start date as that value so the start and end dates are the same.
   if ($field['settings']['todate'] == 'optional' && empty($item['show_todate'])) {
     $item[$to_field] = $item[$from_field];
@@ -504,10 +513,10 @@ function date_combo_validate($element, &$form_state) {
         }
       }
 
-      // If all date values were empty and a date is required, throw 
-      // an error on the first element. We don't want to create 
-      // duplicate messages on every date part, so the error will 
-      // only go on the first.  
+      // If all date values were empty and a date is required, throw
+      // an error on the first element. We don't want to create
+      // duplicate messages on every date part, so the error will
+      // only go on the first.
       if ($to_date_empty && $field['settings']['todate'] == 'required') {
         $errors[] = t('Some value must be entered in the End date.');
       }
@@ -574,7 +583,7 @@ function date_combo_validate($element, &$form_state) {
       // and we are using a date with time granularity,
       // test a roundtrip back to the original timezone to catch
       // invalid dates, like 2AM on the day that spring daylight savings
-      // time begins in the US.  
+      // time begins in the US.
       $granularity = date_format_order($element[$from_field]['#date_format']);
       if ($timezone != $timezone_db && date_has_time($granularity)) {
         date_timezone_set($from_date, timezone_open($timezone));
@@ -597,7 +606,7 @@ function date_combo_validate($element, &$form_state) {
       form_set_error($error_field, t('There are errors in @field_name value #@delta:', array('@field_name' => $instance['label'], '@delta' => $delta + 1)) . theme('item_list', array('items' => $errors)));
     }
     else {
-      form_set_error($error_field, t('There are errors in @field_name:', array('@field_name' => $instance['label'])) . theme('item_list', array('items' => $errors)));      
+      form_set_error($error_field, t('There are errors in @field_name:', array('@field_name' => $instance['label'])) . theme('item_list', array('items' => $errors)));
     }
   }
 }
diff --git a/date_popup/date_popup.module b/date_popup/date_popup.module
index a9d6392..5d677c3 100644
--- a/date_popup/date_popup.module
+++ b/date_popup/date_popup.module
@@ -388,7 +388,7 @@ function date_popup_process_time_part(&$element) {
 
   // Create a unique id for each set of custom settings.
   $id = date_popup_js_settings_id($element['#id'], $func, $settings);
-  
+
   // Manually build this element and set the value - this will prevent corrupting
   // the parent value
   $parents = array_merge($element['#parents'], array('time'));
@@ -413,7 +413,7 @@ function date_popup_process_time_part(&$element) {
   }
 
   $sub_element['#value'] = $sub_element['#default_value'];
-  
+
   // TODO, figure out exactly when we want this description. In many places it is not desired.
   $example_date = date_now();
   date_increment_round($example_date, $element['#date_increment']);
@@ -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.
@@ -474,7 +474,7 @@ function date_popup_validate($element, &$form_state) {
     }
     if ($element['#required']) {
       $message = t('A valid date is required for %title.', array('%title' => $label));
-      form_set_error($error_field, $message); 
+      form_set_error($error_field, $message);
       return;
     }
   }
diff --git a/date_repeat.inc b/date_repeat.inc
index d500629..9e2ea3e 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];
@@ -110,7 +110,7 @@ function _date_repeat_widget_validate($element, &$form_state) {
       if (empty($item[$key])) {
         $item[$key] = '';
       }
-    }    
+    }
     $value = date_repeat_build_dates($rrule, $rrule_values, $field, $item);
     // Unset the delta value of the parents.
     array_pop($element['#parents']);
@@ -121,7 +121,7 @@ function _date_repeat_widget_validate($element, &$form_state) {
 
 /**
  * Helper function to build repeating dates from a $node_field.
- * 
+ *
  * Pass in either the RRULE or the $form_values array for the RRULE,
  * whichever is missing will be created when needed.
  */
@@ -136,7 +136,7 @@ function date_repeat_build_dates($rrule = NULL, $rrule_values = NULL, $field, $i
     $rrule_values = date_ical_parse_rrule(NULL, $rrule);
   }
 
-  // By the time we get here, the start and end dates have been 
+  // By the time we get here, the start and end dates have been
   // adjusted back to UTC, but we want localtime dates to do
   // things like '+1 Tuesday', so adjust back to localtime.
   $timezone = date_get_timezone($field['settings']['tz_handling'], $item['timezone']);
@@ -185,8 +185,8 @@ function date_repeat_build_dates($rrule = NULL, $rrule_values = NULL, $field, $i
     // not necessarily $field['type'] dates.
     // Convert returned dates back to db timezone before storing.
     $date_start = new DateObject($date, $timezone, DATE_FORMAT_DATETIME);
-    $date_start->limitGranularity($field['settings']['granularity']);  
-    date_timezone_set($date_start, timezone_open($timezone_db));    
+    $date_start->limitGranularity($field['settings']['granularity']);
+    date_timezone_set($date_start, timezone_open($timezone_db));
     $date_end = clone($date_start);
     date_modify($date_end, '+' . $duration . ' seconds');
     $value[$delta] = array(
@@ -198,5 +198,5 @@ function date_repeat_build_dates($rrule = NULL, $rrule_values = NULL, $field, $i
       'rrule' => $rrule,
       );
   }
-  return $value;  
+  return $value;
 }
