diff --git a/components/date.inc b/components/date.inc
index 6b47a84..f60c5e5 100644
--- a/components/date.inc
+++ b/components/date.inc
@@ -66,7 +66,7 @@ function _webform_edit_date($component) {
     '#default_value' => empty($component['extra']['timezone']) ? 'user' : $component['extra']['timezone'],
     '#description' => t('If using relative dates for a default value (e.g. "today") base the current day on this timezone.'),
     '#options' => array('user' => t('User timezone'), 'site' => t('Website timezone')),
-    '#weight' => 1,
+    '#weight' => 2,
     '#access' => variable_get('configurable_timezones', 1) && module_exists('date_timezone'),
   );
 
@@ -128,7 +128,7 @@ function _webform_render_date($component, $value = NULL, $filter = TRUE) {
     '#year_end' => $component['extra']['year_end'],
     '#year_textfield' => $component['extra']['year_textfield'],
     '#default_value' => $component['value'],
-    '#default_timezone' => $component['extra']['timezone'],
+    '#timezone' => $component['extra']['timezone'],
     '#process' => array('webform_expand_date'),
     '#theme' => 'webform_date',
     '#theme_wrappers' => array('webform_element_wrapper'),
@@ -157,7 +157,7 @@ function _webform_render_date($component, $value = NULL, $filter = TRUE) {
 function webform_expand_date($element) {
   // Accept a string or array value for #default_value.
   if (isset($element['#default_value']) && is_string($element['#default_value'])) {
-    $timezone = $element['#default_timezone'] != 'user' ? NULL : 'user';
+    $timezone = $element['#timezone'] != 'user' ? NULL : 'user';
     $timestring = webform_strtodate('c', $element['#default_value'], $timezone);
     $element['#default_value'] = webform_date_array($timestring, 'date');
   }
@@ -203,7 +203,7 @@ function webform_expand_date($element) {
   foreach (array('year_start', 'year_end') as $start_end) {
     $year = $element['#' . $start_end];
     if (strpos($year, '-') === 0 || strpos($year, '+') === 0) {
-      $timezone = $element['#default_timezone'] != 'user' ? NULL : 'user';
+      $timezone = $element['#timezone'] != 'user' ? NULL : 'user';
       $element['#' . $start_end] = webform_strtodate('Y', $year . ' years', $timezone);
     }
   }
diff --git a/components/time.inc b/components/time.inc
index ddafcdd..1f567b8 100644
--- a/components/time.inc
+++ b/components/time.inc
@@ -60,9 +60,9 @@ function _webform_edit_time($component) {
     '#type' => 'radios',
     '#title' => t('Timezone'),
     '#default_value' => empty($component['extra']['timezone']) ? 'user' : $component['extra']['timezone'],
-    '#description' => t('Adjust the default time value according to a specific timezone.'),
+    '#description' => t('If using relative dates for a default value (e.g. "now") base the current time on this timezone.'),
     '#options' => array('user' => t('User timezone'), 'site' => t('Website timezone')),
-    '#weight' => 0,
+    '#weight' => 2,
     '#access' => variable_get('configurable_timezones', 1) && module_exists('date_timezone'),
   );
   $form['display']['hourformat'] = array(
@@ -82,6 +82,7 @@ function _webform_edit_time($component) {
  */
 function _webform_render_time($component, $value = NULL, $filter = TRUE) {
   $element = array(
+    '#type' => 'webform_time',
     '#title' => $filter ? _webform_filter_xss($component['name']) : $component['name'],
     '#title_display' => $component['extra']['title_display'] ? $component['extra']['title_display'] : 'before',
     '#required' => $component['mandatory'],
@@ -89,7 +90,9 @@ function _webform_render_time($component, $value = NULL, $filter = TRUE) {
     '#description' => $filter ? _webform_filter_descriptions($component['extra']['description']) : $component['extra']['description'],
     '#element_validate' => array('webform_validate_time'),
     '#hourformat' => $component['extra']['hourformat'],
-    '#after_build' => array('webform_expand_time'),
+    '#default_value' => $component['value'],
+    '#timezone' => $component['extra']['timezone'],
+    '#process' => array('webform_expand_time'),
     '#theme' => 'webform_time',
     '#theme_wrappers' => array('webform_element_wrapper'),
     '#pre_render' => array('webform_element_title_display'),
@@ -97,10 +100,23 @@ function _webform_render_time($component, $value = NULL, $filter = TRUE) {
     '#webform_component' => $component,
   );
 
-  if (drupal_strlen($component['value']) > 0) {
+  // Set the value from Webform if available.
+  if (!empty($value[0])) {
+    $element['#default_value'] = $value[0];
+  }
+
+  return $element;
+}
+
+/**
+ * Form API #process function for Webform time fields.
+ */
+function webform_expand_time($element) {
+  // Expand the default value from a string into an array.
+  if (!empty($element['#default_value'])) {
     // Adjust the time based on the user or site timezone.
     // The "timezone_name" variable is provided by DateAPI in Drupal 6.
-    if (variable_get('configurable_timezones', 1) && $component['extra']['timezone'] == 'user') {
+    if (variable_get('configurable_timezones', 1) && $element['#timezone'] == 'user') {
       $timezone_name = isset($GLOBALS['user']->timezone_name) ? $GLOBALS['user']->timezone_name : NULL;
     }
     else {
@@ -109,11 +125,11 @@ function _webform_render_time($component, $value = NULL, $filter = TRUE) {
 
     if (isset($timezone_name) && class_exists('DateTimeZone')) {
       $timezone = new DateTimeZone($timezone_name);
-      $datetime = new DateTime($component['value'], $timezone);
+      $datetime = new DateTime($element['#default_value'], $timezone);
       $default_values = webform_date_array($datetime->format('c'), 'time');
     }
     else {
-      $default_values = webform_date_array(date('c', strtotime($component['value'])), 'time');
+      $default_values = webform_date_array(date('c', strtotime($element['#default_value'])), 'time');
     }
   }
   else {
@@ -124,13 +140,9 @@ function _webform_render_time($component, $value = NULL, $filter = TRUE) {
     );
   }
 
-  if (!empty($value[0])) {
-    $default_values = webform_date_array($value[0], 'time');
-  }
-
   $first_hour = 0;
   $last_hour = 23;
-  if ($component['extra']['hourformat'] == '12-hour') {
+  if ($element['#hourformat'] == '12-hour') {
     $first_hour = 1;
     $last_hour = 12;
     $default_values = webform_time_convert($default_values, '12-hour');
@@ -156,7 +168,7 @@ function _webform_render_time($component, $value = NULL, $filter = TRUE) {
     '#default_value' => $default_values['minute'],
     '#options' => $minutes,
   );
-  if ($component['extra']['hourformat'] == '12-hour') {
+  if (strcmp($element['#hourformat'], '12-hour') == 0) {
     $element['ampm'] = array(
       '#type' => 'radios',
       '#default_value' => $default_values['ampm'],
@@ -173,25 +185,6 @@ function _webform_render_time($component, $value = NULL, $filter = TRUE) {
 }
 
 /**
- * Form API #after_build function for Webform time fields.
- *
- * Note that a #process function will not work on time fields, since they are
- * not actual FAPI elements. We use this function to set the proper default
- * values for the time fields.
- */
-function webform_expand_time($element) {
-  if (array_key_exists('#default_value', $element)) {
-    $time_value = webform_date_array($element['#default_value'], 'time');
-
-    foreach ($time_value as $key => $value) {
-      $element[$key]['#value'] = $value;
-    }
-  }
-
-  return $element;
-}
-
-/**
  * Theme a webform time element.
  */
 function theme_webform_time($element) {
diff --git a/webform.module b/webform.module
index d5b9144..3cbaac8 100644
--- a/webform.module
+++ b/webform.module
@@ -657,6 +657,19 @@ function webform_theme() {
 }
 
 /**
+ * Implementation of hook_elements().
+ */
+function webform_elements() {
+  // A few of our components need to be defined here because Drupal does not
+  // provide these components natively. Because this hook fires on every page
+  // load (even on non-webform pages), we don't put this in the component .inc
+  // files because of the unnecessary loading that it would require.
+  $elements['webform_time'] = array('#input' => 'TRUE');
+  $elements['webform_grid'] = array('#input' => 'TRUE');
+  return $elements;
+}
+
+/**
  * Implementation of hook_webform_component_info().
  */
 function webform_webform_component_info() {
