diff --git a/includes/Timeline.class.inc b/includes/Timeline.class.inc
index dcd068e..f5d1cf2 100644
--- a/includes/Timeline.class.inc
+++ b/includes/Timeline.class.inc
@@ -125,53 +125,30 @@ class Timeline {
     }
     switch ($option) {
       case 'today':
-        return $this->convertToGregorian(REQUEST_TIME, 'timestamp');
+        return convertToGregorian(REQUEST_TIME, 'timestamp');
       case 'first':
-        return $this->convertToGregorian($this->data['events']['events'][0]['start'], 'iso8601');
+        return convertToGregorian($this->data['events']['events'][0]['start'], 'iso8601');
       case 'last':
-        return $this->convertToGregorian($this->data['events']['events'][count($this->data['events']['events']) - 1]['start'], 'iso8601');
+        return convertToGregorian($this->data['events']['events'][count($this->data['events']['events']) - 1]['start'], 'iso8601');
       case 'middle':
-        $end = $this->convertToTimestamp($this->data['events']['events'][count($this->data['events']['events']) - 1]['start'], 'iso8601');
-        $start = $this->convertToTimestamp($this->data['events']['events'][0]['start'], 'iso8601');
+        $end = convertToTimestamp($this->data['events']['events'][count($this->data['events']['events']) - 1]['start'], 'iso8601');
+        $start = convertToTimestamp($this->data['events']['events'][0]['start'], 'iso8601');
         $middle = ($start + $end) / 2;
-        return $this->convertToGregorian($middle, 'timestamp');
+        return convertToGregorian($middle, 'timestamp');
       case 'median':
         foreach ($this->data['events']['events'] as $date) {
-          $t[] = $this->convertToTimestamp($date['start'], 'iso8601');
+          $t[] = convertToTimestamp($date['start'], 'iso8601');
         }
         sort($t);
-        return $this->convertToGregorian($t[round(count($t)/2)], 'timestamp');
+        return convertToGregorian($t[round(count($t)/2)], 'timestamp');
       case 'custom':
         if ($options_field != '') {
-          return $this->convertToGregorian(strtotime($options_field), 'timestamp');
+          return convertToGregorian(strtotime($options_field), 'timestamp');
         }
     }
     return FALSE;
   }
 
-
-  function convertToGregorian($value, $date_format) {
-    switch ($date_format) {
-      case 'timestamp':
-        return format_date($value + timeline_get_timezone(), 'custom', 'M d Y G:i:s', '0', 'en');
-      case 'iso8601':
-        if (module_exists('date_api') && variable_get('date_api_version', 0) >= 5.2) {
-          return format_date(date_convert($value, DATE_ISO, DATE_UNIX) + timeline_get_timezone(), 'custom', 'M d Y G:i:s', '0', 'en');
-        }
-        else {
-          return format_date(strtotime($value) + timeline_get_timezone(), 'custom', 'M d Y G:i:s', '0', 'en');
-        }
-    }
-  }
-
-  function convertToTimestamp($value, $date_format) {
-    switch ($date_format) {
-      case 'iso8601':
-        return date_convert($date, DATE_ISO, DATE_UNIX) + timeline_get_timezone();
-    }
-  }
-
-
   function getColor() {
     $colors = array(
       '#0A3FAC',
diff --git a/plugins/date_sources/date_field.inc b/plugins/date_sources/date_field.inc
index ad009e6..22df258 100644
--- a/plugins/date_sources/date_field.inc
+++ b/plugins/date_sources/date_field.inc
@@ -26,44 +26,12 @@ $plugin = array(
 function timeline_date_source_date_field_conversion($date, $output_format, $options = array()) {
 
   $input_format = $options['field']['date format'];
-
-  switch ($input_format) {
-    case 'date':
-      switch ($output_format) {
-        case 'iso8601':
-          return date_convert(date_convert($date, DATE_ISO, DATE_UNIX), DATE_UNIX, DATE_ISO, date_get_timezone('date')) . 'Z';
-        case 'gregorian':
-          if (module_exists('date_api') && variable_get('date_api_version', 0) >= 5.2) {
-            return format_date(date_convert($date, DATE_ISO, DATE_UNIX) + timeline_get_timezone(), 'custom', 'M d Y G:i:s', '0', 'en');
-          }
-          else {
-            return format_date(strtotime($date) + timeline_get_timezone(), 'custom', 'M d Y G:i:s', '0', 'en');
-          }
-        case 'timestamp':
-          return date_convert($date, DATE_ISO, DATE_UNIX) + timeline_get_timezone();
-      }
-    case 'datetime':
-      switch ($output_format) {
-        case 'iso8601':
-          return date_convert(date_convert($date, DATE_DATETIME, DATE_UNIX), DATE_UNIX, DATE_ISO, date_get_timezone('date')) . 'Z';
-        case 'gregorian':
-          return format_date(date_convert($date, DATE_DATETIME, DATE_UNIX)  + timeline_get_timezone(), 'custom', 'M d Y G:i:s', '0', 'en');
-        case 'timestamp':
-          return date_convert($date, DATE_DATETIME, DATE_UNIX) + timeline_get_timezone();
-      }
-    case 'datestamp':
-      switch ($output_format) {
-        case 'iso8601':
-          if (module_exists('date_api') && variable_get('date_api_version', 0) >= 5.2) {
-            return date_convert($date, DATE_UNIX, DATE_ISO, date_get_timezone('date')) . 'Z';
-          }
-          else {
-            return format_date($date + timeline_get_timezone(), 'custom', 'Y-m-d\TH:i:s\Z', '0', 'en');
-          }
-        case 'gregorian':
-          return format_date($date + timeline_get_timezone(), 'custom', 'M d Y G:i:s', '0', 'en');
-        case 'timestamp':
-          return $date + timeline_get_timezone();
-      }
+  switch ($output_format) {
+    case 'iso8601':
+      return convertToIso($date, $input_format);
+    case 'gregorian':
+      return convertToGregorian($date, $input_format);
+    case 'timestamp':
+      return convertToTimestamp($date, $input_format);
   }
 }
diff --git a/plugins/date_sources/post_date.inc b/plugins/date_sources/post_date.inc
index 95047f6..202dd34 100644
--- a/plugins/date_sources/post_date.inc
+++ b/plugins/date_sources/post_date.inc
@@ -17,16 +17,11 @@ function timeline_date_source_post_date_conversion($date, $output_format, $optio
   $input_format = 'timestamp';
   switch ($output_format) {
     case 'iso8601':
-      if (module_exists('date_api') && variable_get('date_api_version', 0) >= 5.2) {
-        return date_convert($date, DATE_UNIX, DATE_ISO, date_get_timezone('date')) . 'Z';
-      }
-      else {
-        return format_date($date + timeline_get_timezone(), 'custom', 'Y-m-d\TH:i:s\Z', '0', 'en');
-      }
+      return convertToISO($date, $input_format);
     case 'gregorian':
-      return format_date($date + timeline_get_timezone(), 'custom', 'M d Y G:i:s', '0', 'en');
+      return convertToGregorian($date, $input_format);
     case 'timestamp':
-      return $date + timeline_get_timezone();
+      return convertToTimestamp($date, $input_format);
   }
 }
 
diff --git a/timeline.module b/timeline.module
index 1cf79d7..d412e08 100644
--- a/timeline.module
+++ b/timeline.module
@@ -109,14 +109,59 @@ function timeline_plugins_get_callback($handler_name, $plugin_type) {
 
 
 /**
- * Returns the currently logged-in user's timezone, in seconds from GMT.
+ * Returns the currently logged-in user's timezone.
  *
- * @return an integer representation of a timezone
+ * @return the name of a timezone
  */
-function timeline_get_timezone($unit = 'seconds') {
+function timeline_get_timezone() {
   global $user;
   return (variable_get('configurable_timezones', 1) && $user->uid && drupal_strlen($user->timezone)) ?
-    (integer)$user->timezone : (integer)variable_get('date_default_timezone', 0);
+    $user->timezone : variable_get('date_default_timezone', NULL);
+}
+
+function convertToGregorian($value, $date_format) {
+  $timezone = new DateTimezone(timeline_get_timezone());
+  $db_timezone = new DateTimezone('UTC');
+  switch ($date_format) {
+    case 'timestamp':
+      $date = new DateTime("@$value", $db_timezone);
+      break;
+    default:
+      $date = new DateTime("$value", $db_timezone);
+      break;
+  }
+  $date->setTimezone($timezone);
+  return $date->format('M d Y G:i:s');
+}
+
+function convertToISO($value, $date_format) {
+  $timezone = new DateTimezone(timeline_get_timezone());
+  $db_timezone = new DateTimezone('UTC');
+  switch ($date_format) {
+    case 'timestamp':
+      $date = new DateTime("@$value", $db_timezone);
+      break;
+    default:
+      $date = new DateTime("$value", $db_timezone);
+      break;
+  }
+  $date->setTimezone($timezone);
+  return $date->format('Y-m-d\TH:i:s\Z');
+}
+
+function convertToTimestamp($value, $date_format) {
+  $timezone = new DateTimezone(timeline_get_timezone());
+  $db_timezone = new DateTimezone('UTC');
+  switch ($date_format) {
+    case 'timestamp':
+      $date = new DateTime("@$value", $db_timezone);
+      break;
+    default:
+      $date = new DateTime("$value", $db_timezone);
+      break;
+  }
+  $date->setTimezone($timezone);
+  return $date->format('U');
 }
 
 
