diff --git a/date.field.inc b/date.field.inc
index 46ea317..9947178 100644
--- a/date.field.inc
+++ b/date.field.inc
@@ -320,7 +320,6 @@ function date_field_widget_info() {
  * Implements hook_field_load().
  */
 function date_field_load($entity_type, $entities, $field, $instances, $langcode, &$items, $age) {
-  $timezone_db = date_get_timezone_db($field['settings']['tz_handling']);
   $db_format = date_type_format($field['type']);
   $process = date_process_values($field);
   foreach ($entities as $id => $entity) {
@@ -328,7 +327,7 @@ function date_field_load($entity_type, $entities, $field, $instances, $langcode,
       // If the file does not exist, mark the entire item as empty.
       if (is_array($item)) {
         $timezone = isset($item['timezone']) ? $item['timezone'] : '';
-        $item['timezone'] = date_get_timezone($field['settings']['tz_handling'], $timezone);
+        $timezone_db = date_get_timezone_db($field['settings']['tz_handling'], $timezone);
         $item['timezone_db'] = $timezone_db;
         $item['date_type'] = $field['type'];
         if (!empty($field['settings']['cache_enabled']) && ($delta < $field['settings']['cache_count'] || $field['settings']['cache_count'] == 0)) {
@@ -405,7 +404,7 @@ function date_field_presave($entity_type, $entity, $field, $instance, $langcode,
     $timezone = isset($item['timezone']) ? $item['timezone'] : '';
     if (is_array($item)) {
       $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]['timezone_db'] = date_get_timezone_db($field['settings']['tz_handling'], $timezone);
       $items[$delta]['date_type'] = $field['type'];
     }
   }
diff --git a/date.module b/date.module
index 91c0b65..089534b 100644
--- a/date.module
+++ b/date.module
@@ -210,8 +210,9 @@ function date_formatter_process($formatter, $entity_type, $entity, $field, $inst
   $field_name = $field['field_name'];
   $format = date_formatter_format($formatter, $settings, $granularity, $langcode);
   $timezone = isset($item['timezone']) ? $item['timezone'] : '';
-  $timezone = date_get_timezone($field['settings']['tz_handling'], $timezone);
-  $timezone_db = date_get_timezone_db($field['settings']['tz_handling']);
+  $timezone = date_get_timezone($field['settings']['tz_handling']);
+  $timezone_db = isset($item['timezone_db']) ? $item['timezone_db'] : '';
+  $timezone_db = date_get_timezone_db($field['settings']['tz_handling'], $timezone_db);
   $db_format = date_type_format($field['type']);
   $process = date_process_values($field);
   foreach ($process as $processed) {
diff --git a/date_admin.inc b/date_admin.inc
index 0e32fc5..23b229d 100644
--- a/date_admin.inc
+++ b/date_admin.inc
@@ -553,7 +553,7 @@ function date_field_settings_validate(&$form, &$form_state) {
     form_set_value($form['timezone_db'], '', $form_state);
   }
   else {
-    form_set_value($form['timezone_db'], date_get_timezone_db($field['settings']['tz_handling']), $form_state);
+    form_set_value($form['timezone_db'], date_get_timezone_db($field['settings']['tz_handling'], $form['timezone_db']), $form_state);
   }
 
   if ($field['settings']['tz_handling'] != 'none' && !in_array('hour', array_filter($field['settings']['granularity']))) {
diff --git a/date_elements.inc b/date_elements.inc
index 6908d96..d55a3ec 100644
--- a/date_elements.inc
+++ b/date_elements.inc
@@ -158,7 +158,7 @@ function date_local_date($item, $timezone, $field, $instance, $part = 'value') {
   }
   */
 
-  $date = new DateObject($value, date_get_timezone_db($field['settings']['tz_handling']));
+  $date = new DateObject($value, date_get_timezone_db($field['settings']['tz_handling'], $timezone));
   $date->limitGranularity($field['settings']['granularity']);
   if (empty($date)) {
     return NULL;
@@ -525,7 +525,7 @@ function date_combo_validate($element, &$form_state) {
   elseif (!form_get_errors()) {
 
     $timezone = !empty($item[$tz_field]) ? $item[$tz_field] : $element['#date_timezone'];
-    $timezone_db = date_get_timezone_db($field['settings']['tz_handling']);
+    $timezone_db = date_get_timezone_db($field['settings']['tz_handling'], $timezone);
     $element[$from_field]['#date_timezone'] = $timezone;
     $from_date = date_input_date($field, $instance, $element[$from_field], $posted[$from_field]);
 
