diff --git a/includes/form_builder.api.inc b/includes/form_builder.api.inc
index 4dc84cf..9672e68 100644
--- a/includes/form_builder.api.inc
+++ b/includes/form_builder.api.inc
@@ -17,7 +17,9 @@ function form_builder_get_properties($form_type, $reset = FALSE) {
 
   if (!isset($properties[$form_type])) {
     // Get the list of all properties for all elements.
-    $properties = module_invoke_all('form_builder_properties', $form_type);
+    foreach (module_implements('form_builder_properties') as $module) {
+      $properties = array_merge($properties, module_invoke($module, 'form_builder_properties', $form_type));
+    }
     drupal_alter('form_builder_properties', $properties, $form_type);
   }
 
@@ -88,6 +90,7 @@ function form_builder_get_form_type($form_type = NULL, $reset = FALSE) {
 function form_builder_get_element_properties($form_type, $element_type) {
   // Get the list of all properties for this type.
   $properties = form_builder_get_properties($form_type);
+
   // Get the list of supported properties per field in this form type.
   $form_type = form_builder_get_form_type($form_type);
 
diff --git a/modules/webform/form_builder_webform.components.inc b/modules/webform/form_builder_webform.components.inc
index 597d6b1..4a4bdb9 100644
--- a/modules/webform/form_builder_webform.components.inc
+++ b/modules/webform/form_builder_webform.components.inc
@@ -40,79 +40,44 @@ function _form_builder_webform_form_builder_types_date() {
 }
 
 /**
- * Implements _form_builder_webform_form_builder_properties_component().
+ * Implements _form_builder_webform_form_builder_map_component().
  */
-function _form_builder_webform_form_builder_properties_date() {
+function _form_builder_webform_form_builder_map_date() {
   return array(
-    'timezone' => array(
-      'form' => 'form_builder_webform_property_date_timezone_form',
-    ),
-    'year_start' => array(
-      'form' => 'form_builder_webform_property_date_year_start_form',
-    ),
-    'year_end' => array(
-      'form' => 'form_builder_webform_property_date_year_end_form',
-    ),
-    'year_textfield' => array(
-      'form' => 'form_builder_webform_property_date_year_textfield_form',
-    ),
-    'datepicker' => array(
-      'form' => 'form_builder_webform_property_date_datepicker_form',
+    'form_builder_type' => 'date',
+    'properties' => array(
+      'description' => array(
+        'storage_parents' => array('extra', 'description'),
+      ),
+      'title_display' => array(
+        'form_parents' => array('display', 'title_display'),
+        'storage_parents' => array('extra', 'title_display'),
+      ),
+      'timezone' => array(
+        'form_parents' => array('default', 'timezone'),
+        'storage_parents' => array('extra', 'timezone'),
+      ),
+      'year_start' => array(
+        'form_parents' => array('validation', 'year_start'),
+        'storage_parents' => array('extra', 'year_start'),
+      ),
+      'year_end' => array(
+        'form_parents' => array('validation', 'year_end'),
+        'storage_parents' => array('extra', 'year_end'),
+      ),
+      'year_textfield' => array(
+        'form_parents' => array('display', 'year_textfield'),
+        'storage_parents' => array('extra', 'year_textfield'),
+      ),
+      'datepicker' => array(
+        'form_parents' => array('display', 'datepicker'),
+        'storage_parents' => array('extra', 'datepicker'),
+      ),
     ),
   );
 }
 
 /**
- * Implements _form_builder_webform_form_builder_save_component().
- */
-function _form_builder_webform_form_builder_save_date($component, $form_element) {
-  $component['extra']['description'] = isset($form_element['#description']) ? $form_element['#description'] : NULL;
-  $component['extra']['disabled'] = isset($form_element['#disabled']) ? $form_element['#disabled'] : FALSE;
-  $component['extra']['title_display'] = isset($form_element['#title_display']) ? $form_element['#title_display'] : 'before';
-  $component['extra']['timezone'] = isset($form_element['#timezone']) ? $form_element['#timezone'] : 'user';
-  $component['extra']['year_start'] = isset($form_element['#year_start']) ? $form_element['#year_start'] : '-2';
-  $component['extra']['year_end'] = isset($form_element['#year_end']) ? $form_element['#year_end'] : '+2';
-  $component['extra']['year_textfield'] = isset($form_element['#year_textfield']) ? $form_element['#year_textfield'] : FALSE;
-  $component['extra']['datepicker'] = isset($form_element['#datepicker']) ? $form_element['#datepicker'] : FALSE;
-  return $component;
-}
-
-/**
- * Configuration form for the "timezone" property.
- */
-function form_builder_webform_property_date_timezone_form(&$form_state, $form_type, $element) {
-  return _form_builder_webform_build_edit_form('date', $element, 'timezone', NULL, array('extra', 'timezone'), array('extra', 'timezone'));
-}
-
-/**
- * Configuration form for the "year_start" property.
- */
-function form_builder_webform_property_date_year_start_form(&$form_state, $form_type, $element) {
-  return _form_builder_webform_build_edit_form('date', $element, 'year_start', 'validation', array('validation', 'year_start'), array('extra', 'year_start'));
-}
-
-/**
- * Configuration form for the "year_end" property.
- */
-function form_builder_webform_property_date_year_end_form(&$form_state, $form_type, $element) {
-  return _form_builder_webform_build_edit_form('date', $element, 'year_end', 'validation', array('validation', 'year_end'), array('extra', 'year_end'));
-}
-
-/**
- * Configuration form for the "year_textfield" property.
- */
-function form_builder_webform_property_date_year_textfield_form(&$form_state, $form_type, $element) {
-  return _form_builder_webform_build_edit_form('date', $element, 'year_textfield', 'display', array('display', 'year_textfield'), array('extra', 'year_textfield'));
-}
-
-/**
- * Configuration form for the "datepicker" property.
- */
-function form_builder_webform_property_date_datepicker_form(&$form_state, $form_type, $element) {
-  return _form_builder_webform_build_edit_form('date', $element, 'datepicker', 'display', array('display', 'datepicker'), array('extra', 'datepicker'));
-}
-
-/**
  * @} End of "defgroup form-builder-webform-date-callbacks"
  */
 
@@ -141,34 +106,33 @@ function _form_builder_webform_form_builder_types_email() {
     ),
   );
   $fields['email']['default'] = _form_builder_webform_default('email');
-  $fields['email']['default'] = _form_builder_webform_form_builder_load_email($fields['email']['default']);
-
   $fields['email']['default']['#title'] = t('New e-mail');
 
   return $fields;
 }
 
 /**
- * Implements _form_builder_webform_form_builder_load_component().
- */
-function _form_builder_webform_form_builder_load_email($form_element) {
-  if (isset($form_element['#webform_component']['type']) && $form_element['#webform_component']['type'] == 'email') {
-    // Elements of type "webform_email" are known to Form Builder as simply an
-    // "email" field. This makes it so that we use the generic email icon.
-    $form_element['#form_builder']['element_type'] = 'email';
-  }
-  return $form_element;
-}
-
-/**
- * Implements _form_builder_webform_form_builder_save_component().
+ * Implements _form_builder_webform_form_builder_map_component().
  */
-function _form_builder_webform_form_builder_save_email($component, $form_element) {
-  $component['extra']['width'] = isset($form_element['#size']) ? $form_element['#size'] : NULL;
-  $component['extra']['description'] = isset($form_element['#description']) ? $form_element['#description'] : NULL;
-  $component['extra']['disabled'] = isset($form_element['#disabled']) ? $form_element['#disabled'] : FALSE;
-  $component['extra']['title_display'] = isset($form_element['#title_display']) ? $form_element['#title_display'] : 'before';
-  return $component;
+function _form_builder_webform_form_builder_map_email() {
+  return array(
+    'form_builder_type' => 'email',
+    'properties' => array(
+      'size' => array(
+        'storage_parents' => array('extra', 'width'),
+      ),
+      'description' => array(
+        'storage_parents' => array('extra', 'description'),
+      ),
+      'title_display' => array(
+        'form_parents' => array('display', 'title_display'),
+        'storage_parents' => array('extra', 'title_display'),
+      ),
+      'disabled' => array(
+        'storage_parents' => array('extra', 'disabled'),
+      ),
+    ),
+  );
 }
 
 /**
@@ -203,13 +167,23 @@ function _form_builder_webform_form_builder_types_fieldset() {
 }
 
 /**
- * Implements _form_builder_webform_form_builder_save_component().
+ * Implements _form_builder_webform_form_builder_map_component().
  */
-function _form_builder_webform_form_builder_save_fieldset($component, $form_element) {
-  $component['extra']['collapsible'] = isset($form_element['#collapsible']) ? $form_element['#collapsible'] : NULL;
-  $component['extra']['collapsed'] = isset($form_element['#collapsed']) ? $form_element['#collapsed'] : NULL;
-  $component['extra']['description'] = isset($form_element['#description']) ? $form_element['#description'] : '';
-  return $component;
+function _form_builder_webform_form_builder_map_fieldset() {
+  return array(
+    'form_builder_type' => 'fieldset',
+    'properties' => array(
+      'collapsible' => array(
+        'storage_parents' => array('extra', 'collapsible'),
+      ),
+      'collapsed' => array(
+        'storage_parents' => array('extra', 'collapsed'),
+      ),
+      'description' => array(
+        'storage_parents' => array('extra', 'description'),
+      ),
+    ),
+  );
 }
 
 /**
@@ -237,7 +211,7 @@ function _form_builder_webform_form_builder_types_file() {
       'title_display',
       'webform_file_filtering',
       'webform_file_savelocation',
-      'webform_file_width',
+      'size',
     ),
   );
   $file_element = _form_builder_webform_default('file');
@@ -248,18 +222,30 @@ function _form_builder_webform_form_builder_types_file() {
 }
 
 /**
- * Implements _form_builder_webform_form_builder_properties_component().
+ * Implements _form_builder_webform_form_builder_map_component().
  */
-function _form_builder_webform_form_builder_properties_file() {
+function _form_builder_webform_form_builder_map_file() {
   return array(
-    'webform_file_filtering' => array(
-      'form' => 'form_builder_webform_property_webform_file_filtering_form',
-    ),
-    'webform_file_savelocation' => array(
-      'form' => 'form_builder_webform_property_webform_file_savelocation_form',
-    ),
-    'webform_file_width' => array(
-      'form' => 'form_builder_webform_property_webform_file_width_form',
+    'form_builder_type' => 'file',
+    'properties' => array(
+      'description' => array(
+        'storage_parents' => array('extra', 'description'),
+      ),
+      'title_display' => array(
+        'form_parents' => array('display', 'title_display'),
+        'storage_parents' => array('extra', 'title_display'),
+      ),
+      'webform_file_filtering' => array(
+        'form_parents' => array('validation', 'filtering'),
+        'storage_parents' => array('extra', 'filtering'),
+      ),
+      'webform_file_savelocation' => array(
+        'form_parents' => array('extra', 'savelocation'),
+        'storage_parents' => array('extra', 'savelocation'),
+      ),
+      'size' => array(
+        'storage_parents' => array('extra', 'width'),
+      ),
     ),
   );
 }
@@ -272,74 +258,19 @@ function _form_builder_webform_form_builder_load_file($form_element) {
   // structure (including several element children) that we don't want here.
   // Instead, we need the element itself to represent the file component
   // directly.
-  if (isset($form_element['#webform_component']['type']) && $form_element['#webform_component']['type'] == 'file') {
-    $form_element['#type'] = 'file';
-    unset($form_element['#theme']);
-    foreach (element_children($form_element) as $key) {
-      unset($form_element[$key]);
-    }
-    // Set the custom webform file properties based on the values stored with
-    // the webform component.
-    if (isset($form_element['#webform_component']['extra']['filtering'])) {
-      $form_element['#webform_file_filtering'] = $form_element['#webform_component']['extra']['filtering'];
-    }
-    if (isset($form_element['#webform_component']['extra']['savelocation'])) {
-      $form_element['#webform_file_savelocation'] = $form_element['#webform_component']['extra']['savelocation'];
-    }
-    if (isset($form_element['#webform_component']['extra']['width'])) {
-      $form_element['#webform_file_width'] = $form_element['#webform_component']['extra']['width'];
-    }
+  $form_element['#type'] = 'file';
+  unset($form_element['#theme']);
+  $element_key = reset(element_children($form_element));
+  $form_element = array_merge($form_element, $form_element[$element_key]);
+  foreach (element_children($form_element) as $key) {
+    unset($form_element[$key]);
   }
+  $form_element['#required'] = !empty($form_element['#webform_required']);
 
   return $form_element;
 }
 
 /**
- * Implements _form_builder_webform_form_builder_preview_alter_component().
- */
-function _form_builder_webform_form_builder_preview_alter_file($form_element) {
-  // Map our pseudo-property to the visible "size" property.
-  $form_element['#size'] = $form_element['#webform_file_width'];
-
-  return $form_element;
-}
-
-/**
- * Implements _form_builder_webform_form_builder_save_component().
- */
-function _form_builder_webform_form_builder_save_file($component, $form_element) {
-  $component['extra']['description'] = isset($form_element['#description']) ? $form_element['#description'] : NULL;
-  $component['extra']['disabled'] = isset($form_element['#disabled']) ? $form_element['#disabled'] : FALSE;
-  $component['extra']['title_display'] = isset($form_element['#title_display']) ? $form_element['#title_display'] : 'before';
-  $component['extra']['filtering'] = isset($form_element['#webform_file_filtering']) ? $form_element['#webform_file_filtering'] : array();
-  $component['extra']['savelocation'] = isset($form_element['#webform_file_savelocation']) ? $form_element['#webform_file_savelocation'] : NULL;
-  $component['extra']['width'] = isset($form_element['#webform_file_width']) ? $form_element['#webform_file_width'] : NULL;
-
-  return $component;
-}
-
-/**
- * Configuration form for the "webform_file_filtering" property.
- */
-function form_builder_webform_property_webform_file_filtering_form(&$form_state, $form_type, $element) {
-  return _form_builder_webform_build_edit_form('file', $element, 'webform_file_filtering', 'validation', array('validation', 'filtering'), array('extra', 'filtering'));
-}
-
-/**
- * Configuration form for the "webform_file_savelocation" property.
- */
-function form_builder_webform_property_webform_file_savelocation_form(&$form_state, $form_type, $element) {
-  return _form_builder_webform_build_edit_form('file', $element, 'webform_file_savelocation', 'default', array('extra', 'savelocation'), array('extra', 'savelocation'));
-}
-
-/**
- * Configuration form for the "webform_file_width" property.
- */
-function form_builder_webform_property_webform_file_width_form(&$form_state, $form_type, $element) {
-  return _form_builder_webform_build_edit_form('file', $element, 'webform_file_width', 'display', array('display', 'width'), array('extra', 'width'));
-}
-
-/**
  * @} End of "defgroup form-builder-webform-file-callbacks"
  */
 
@@ -380,6 +311,32 @@ function _form_builder_webform_form_builder_types_grid() {
 }
 
 /**
+ * Implements _form_builder_webform_form_builder_map_component().
+ */
+function _form_builder_webform_form_builder_map_grid() {
+  return array(
+    'form_builder_type' => 'grid',
+    'properties' => array(
+      'description' => array(
+        'storage_parents' => array('extra', 'description'),
+      ),
+      'title_display' => array(
+        'form_parents' => array('display', 'title_display'),
+        'storage_parents' => array('extra', 'title_display'),
+      ),
+      'optrand' => array(
+        'form_parents' => array('display', 'optrand'),
+        'storage_parents' => array('extra', 'optrand'),
+      ),
+      'qrand' => array(
+        'form_parents' => array('display', 'qrand'),
+        'storage_parents' => array('extra', 'qrand'),
+      ),
+    ),
+  );
+}
+
+/**
  * Implements _form_builder_webform_form_builder_properties_component().
  */
 function _form_builder_webform_form_builder_properties_grid() {
@@ -392,12 +349,6 @@ function _form_builder_webform_form_builder_properties_grid() {
       'form' => 'form_builder_webform_property_grid_questions_form',
       'submit' => array('form_builder_webform_property_grid_form_submit'),
     ),
-    'optrand' => array(
-      'form' => 'form_builder_webform_property_grid_optrand_form'
-    ),
-    'qrand' => array(
-      'form' => 'form_builder_webform_property_grid_qrand_form'
-    ),
   );
 }
 
@@ -405,15 +356,10 @@ function _form_builder_webform_form_builder_properties_grid() {
  * Implements _form_builder_webform_form_builder_load_component().
  */
 function _form_builder_webform_form_builder_load_grid($element) {
-  if (isset($element['#type']) && $element['#type'] == 'webform_grid') {
-    // Elements of type "webform_grid" are known to Form Builder as simply a
-    // "grid" field. This makes it so that we use the generic grid icon.
-    $element['#form_builder']['element_type'] = 'grid';
-
-    // Convert properties used only in Form Builder.
-    $element['#custom_grid_option_keys'] = !empty($element['#webform_component']['extra']['custom_option_keys']);
-    $element['#custom_grid_question_keys'] = !empty($element['#webform_component']['extra']['custom_question_keys']);
-  }
+  // Convert properties used only in Form Builder.
+  $element['#custom_grid_option_keys'] = !empty($element['#webform_component']['extra']['custom_option_keys']);
+  $element['#custom_grid_question_keys'] = !empty($element['#webform_component']['extra']['custom_question_keys']);
+
   return $element;
 }
 
@@ -432,14 +378,10 @@ function _form_builder_webform_form_builder_save_grid($component, $form_element)
     $questions .= $key . '|' . $question_value . "\n";
   }
 
-  $component['extra']['description'] = isset($form_element['#description']) ? $form_element['#description'] : NULL;
-  $component['extra']['title_display'] = isset($form_element['#title_display']) ? $form_element['#title_display'] : 'before';
   $component['extra']['options'] = $options;
   $component['extra']['questions'] = $questions;
   $component['extra']['custom_option_keys'] = isset($form_element['#custom_grid_option_keys']) ? $form_element['#custom_grid_option_keys'] : FALSE;
   $component['extra']['custom_question_keys'] =  isset($form_element['#custom_grid_question_keys']) ? $form_element['#custom_grid_question_keys'] : FALSE;
-  $component['extra']['optrand'] = !empty($form_element['#optrand']);
-  $component['extra']['qrand'] = !empty($form_element['#qrand']);
 
   return $component;
 }
@@ -484,20 +426,6 @@ function form_builder_webform_property_grid_form_submit(&$form, &$form_state) {
 }
 
 /**
- * Configuration form for the "optrand" property.
- */
-function form_builder_webform_property_grid_optrand_form(&$form_state, $form_type, $element) {
-  return _form_builder_webform_build_edit_form('grid', $element, 'optrand', 'display', array('display', 'optrand'), array('extra', 'optrand'));
-}
-
-/**
- * Configuration form for the "qrand" property.
- */
-function form_builder_webform_property_grid_qrand_form(&$form_state, $form_type, $element) {
-  return _form_builder_webform_build_edit_form('grid', $element, 'qrand', 'display', array('display', 'qrand'), array('extra', 'qrand'));
-}
-
-/**
  * @} End of "defgroup form-builder-webform-time-callbacks"
  */
 
@@ -577,13 +505,17 @@ function _form_builder_webform_form_builder_types_markup() {
 }
 
 /**
- * Implements _form_builder_webform_form_builder_save_component().
+ * Implements _form_builder_webform_form_builder_map_component().
  */
-function _form_builder_webform_form_builder_save_markup($component, $form_element) {
-  $component['value'] = $form_element['#markup'];
-  $component['extra']['format'] = isset($form_element['#input_format']) ? $form_element['#input_format'] : variable_get('filter_default_format', 1);
-  $component['extra']['title_display'] = isset($form_element['#title_display']) ? $form_element['#title_display'] : 'before';
-  return $component;
+function _form_builder_webform_form_builder_map_markup() {
+  return array(
+    'form_builder_type' => 'markup',
+    'properties' => array(
+      'format' => array(
+        'storage_parents' => array('extra', 'format'),
+      ),
+    ),
+  );
 }
 
 /**
@@ -655,8 +587,12 @@ function _form_builder_webform_form_builder_map_number() {
   return array(
     'form_builder_type' => 'number',
     'properties' => array(
-      'maxlength' => array(
-        'storage_parents' => array('extra', 'maxlength'),
+      'description' => array(
+        'storage_parents' => array('extra', 'description'),
+      ),
+      'title_display' => array(
+        'form_parents' => array('display', 'title_display'),
+        'storage_parents' => array('extra', 'title_display'),
       ),
       'field_prefix' => array(
         'storage_parents' => array('extra', 'field_prefix'),
@@ -795,7 +731,6 @@ function _form_builder_webform_form_builder_types_select() {
   $fields['select']['default']['#options'] = array(t('one'), t('two'), t('three'));
   $fields['select']['default']['#default_value'] = 0;
   $fields['select']['default']['#title'] = t('New select');
-  $fields['select']['default']['#webform'] = array('type' => 'select');
 
   $fields['checkboxes'] = array(
     'title' => t('Checkboxes'),
@@ -814,7 +749,6 @@ function _form_builder_webform_form_builder_types_select() {
   $fields['checkboxes']['default']['#options'] = array(t('one'), t('two'), t('three'));
   $fields['checkboxes']['default']['#default_value'] = array(0, 1);
   $fields['checkboxes']['default']['#title'] = t('New checkboxes');
-  $fields['checkboxes']['default']['#webform'] = array('type' => 'select');
 
   $fields['radios'] = array(
     'title' => t('Radios'),
@@ -832,22 +766,26 @@ function _form_builder_webform_form_builder_types_select() {
   $fields['radios']['default']['#options'] = array(t('one'), t('two'), t('three'));
   $fields['radios']['default']['#default_value'] = 0;
   $fields['radios']['default']['#title'] = t('New radios');
-  $fields['radios']['default']['#webform'] = array('type' => 'select');
 
   return $fields;
 }
 
+
 /**
- * Implements _form_builder_webform_form_builder_load_component().
+ * Implements _form_builder_webform_form_builder_map_component().
  */
-function _form_builder_webform_form_builder_load_select($form_element) {
-  if (in_array($form_element['#type'], array('radios', 'checkboxes', 'select'))) {
-    $form_element['#webform']['type'] = 'select';
-    if ($form_element['#type'] == 'checkboxes') {
-      $form_element['#multiple'] = TRUE;
-    }
-    return $form_element;
-  }
+function _form_builder_webform_form_builder_map_select() {
+  return array(
+    'properties' => array(
+      'description' => array(
+        'storage_parents' => array('extra', 'description'),
+      ),
+      'title_display' => array(
+        'form_parents' => array('display', 'title_display'),
+        'storage_parents' => array('extra', 'title_display'),
+      ),
+    ),
+  );
 }
 
 /**
@@ -863,8 +801,7 @@ function _form_builder_webform_form_builder_save_select($component, $form_elemen
   $component['extra']['items'] = $options;
   $component['extra']['multiple'] = $form_element['#form_builder']['element_type'] == 'checkboxes';
   $component['extra']['aslist'] = $form_element['#form_builder']['element_type'] == 'select';
-  $component['extra']['description'] = isset($form_element['#description']) ? $form_element['#description'] : '';
-  $component['extra']['title_display'] = isset($form_element['#title_display']) ? $form_element['#title_display'] : 'before';
+
   return $component;
 }
 
@@ -903,15 +840,30 @@ function _form_builder_webform_form_builder_types_textarea() {
 }
 
 /**
- * Implements _form_builder_webform_form_builder_save_component().
+ * Implements _form_builder_webform_form_builder_map_component().
  */
-function _form_builder_webform_form_builder_save_textarea($component, $form_element) {
-  $component['extra']['description'] = $form_element['#description'];
-  $component['extra']['cols'] = $form_element['#cols'];
-  $component['extra']['rows'] = $form_element['#rows'];
-  $component['extra']['disabled'] = empty($form_element['#disabled']) ? NULL : TRUE;
-  $component['extra']['title_display'] = isset($form_element['#title_display']) ? $form_element['#title_display'] : 'before';
-  return $component;
+function _form_builder_webform_form_builder_map_textarea() {
+  return array(
+    'form_builder_type' => 'textarea',
+    'properties' => array(
+      'description' => array(
+        'storage_parents' => array('extra', 'description'),
+      ),
+      'title_display' => array(
+        'form_parents' => array('display', 'title_display'),
+        'storage_parents' => array('extra', 'title_display'),
+      ),
+      'cols' => array(
+        'storage_parents' => array('extra', 'cols'),
+      ),
+      'rows' => array(
+        'storage_parents' => array('extra', 'rows'),
+      ),
+      'disabled' => array(
+        'storage_parents' => array('extra', 'disabled'),
+      ),
+    ),
+  );
 }
 
 /**
@@ -951,17 +903,36 @@ function _form_builder_webform_form_builder_types_textfield() {
 }
 
 /**
- * Implements _form_builder_webform_form_builder_save_component().
+ * Implements _form_builder_webform_form_builder_map_component().
  */
-function _form_builder_webform_form_builder_save_textfield($component, $form_element) {
-  $component['extra']['width'] = isset($form_element['#size']) ? $form_element['#size'] : NULL;
-  $component['extra']['maxlength'] = isset($form_element['#maxlength']) ? $form_element['#maxlength'] : NULL;
-  $component['extra']['field_prefix'] = isset($form_element['#field_prefix']) ? $form_element['#field_prefix'] : NULL;
-  $component['extra']['field_suffix'] = isset($form_element['#field_suffix']) ? $form_element['#field_suffix'] : NULL;
-  $component['extra']['description'] = isset($form_element['#description']) ? $form_element['#description'] : NULL;
-  $component['extra']['disabled'] = isset($form_element['#disabled']) ? $form_element['#disabled'] : FALSE;
-  $component['extra']['title_display'] = isset($form_element['#title_display']) ? $form_element['#title_display'] : 'before';
-  return $component;
+function _form_builder_webform_form_builder_map_textfield() {
+  return array(
+    'form_builder_type' => 'textfield',
+    'properties' => array(
+      'description' => array(
+        'storage_parents' => array('extra', 'description'),
+      ),
+      'title_display' => array(
+        'form_parents' => array('display', 'title_display'),
+        'storage_parents' => array('extra', 'title_display'),
+      ),
+      'size' => array(
+        'storage_parents' => array('extra', 'width'),
+      ),
+      'maxlength' => array(
+        'storage_parents' => array('extra', 'maxlength'),
+      ),
+      'field_prefix' => array(
+        'storage_parents' => array('extra', 'field_prefix'),
+      ),
+      'field_suffix' => array(
+        'storage_parents' => array('extra', 'field_suffix'),
+      ),
+      'disabled' => array(
+        'storage_parents' => array('extra', 'disabled'),
+      ),
+    ),
+  );
 }
 
 /**
@@ -999,59 +970,34 @@ function _form_builder_webform_form_builder_types_time() {
   return $fields;
 }
 
+
 /**
- * Implements _form_builder_webform_form_builder_properties_component().
+ * Implements _form_builder_webform_form_builder_map_component().
  */
-function _form_builder_webform_form_builder_properties_time() {
+function _form_builder_webform_form_builder_map_time() {
   return array(
-    'timezone' => array(
-      'form' => 'form_builder_webform_property_time_timezone_form',
-    ),
-    'hourformat' => array(
-      'form' => 'form_builder_webform_property_time_hourformat_form',
+    'form_builder_type' => 'time',
+    'properties' => array(
+      'description' => array(
+        'storage_parents' => array('extra', 'description'),
+      ),
+      'title_display' => array(
+        'form_parents' => array('display', 'title_display'),
+        'storage_parents' => array('extra', 'title_display'),
+      ),
+      'timezone' => array(
+        'form_parents' => array('extra', 'timezone'),
+        'storage_parents' => array('extra', 'timezone'),
+      ),
+      'hourformat' => array(
+        'storage_parents' => array('display', 'hourformat'),
+        'storage_parents' => array('extra', 'hourformat'),
+      ),
     ),
   );
 }
 
 /**
- * Implements _form_builder_webform_form_builder_load_component().
- */
-function _form_builder_webform_form_builder_load_time($element) {
-  if (isset($element['#type']) && $element['#type'] == 'webform_time') {
-    // Elements of type "webform_time" are known to Form Builder as simply a
-    // "time" field. This makes it so that we use the generic time icon.
-    $element['#form_builder']['element_type'] = 'time';
-  }
-  return $element;
-}
-
-/**
- * Implements _form_builder_webform_form_builder_save_component().
- */
-function _form_builder_webform_form_builder_save_time($component, $form_element) {
-  $component['extra']['description'] = isset($form_element['#description']) ? $form_element['#description'] : NULL;
-  $component['extra']['disabled'] = isset($form_element['#disabled']) ? $form_element['#disabled'] : FALSE;
-  $component['extra']['title_display'] = isset($form_element['#title_display']) ? $form_element['#title_display'] : 'before';
-  $component['extra']['timezone'] = isset($form_element['#timezone']) ? $form_element['#timezone'] : 'user';
-  $component['extra']['hourformat'] = isset($form_element['#hourformat']) ? $form_element['#hourformat'] : '12-hour';
-  return $component;
-}
-
-/**
- * Configuration form for the "timezone" property.
- */
-function form_builder_webform_property_time_timezone_form(&$form_state, $form_type, $element) {
-  return _form_builder_webform_build_edit_form('time', $element, 'timezone', NULL, array('extra', 'timezone'), array('extra', 'timezone'));
-}
-
-/**
- * Configuration form for the "hourformat" property.
- */
-function form_builder_webform_property_time_hourformat_form(&$form_state, $form_type, $element) {
-  return _form_builder_webform_build_edit_form('time', $element, 'hourformat', 'display', array('display', 'hourformat'), array('extra', 'hourformat'));
-}
-
-/**
  * @} End of "defgroup form-builder-webform-time-callbacks"
  */
 
@@ -1118,6 +1064,7 @@ function _form_builder_webform_default($component_type, $merge_extras = array())
   $default_element = webform_component_invoke($component_type, 'render', $default_component, NULL, FALSE);
 
   // Set a bare-minimum component for identification of the component type.
+  $default_element['#webform_component'] = $default_component;
   $default_element['#webform_component']['type'] = $component_type;
 
   // Call the loading function to make sure that the default element gets the
@@ -1165,6 +1112,8 @@ function _form_builder_webform_default($component_type, $merge_extras = array())
  *   component represented by $element.
  */
 function _form_builder_webform_build_edit_form($component_type, $element, $property, $form_builder_property_group, $form_nested_keys, $component_nested_keys) {
+  module_load_include('inc', 'webform', 'includes/webform.components');
+
   // The Webform module stores existing component data as part of the passed-in
   // element. If the component doesn't exist yet, initialize a default
   // component.
@@ -1186,8 +1135,10 @@ function _form_builder_webform_build_edit_form($component_type, $element, $prope
 
   // Build the entire _webform_edit_file() form based on the current state of
   // the component, and obtain the slice of it that we want.
-  $edit_function = '_webform_edit_' . $component_type;
-  $form = $edit_function($component);
+  $empty_form_state = array();
+  $node = (object) array('nid' => NULL);
+  $form = webform_component_edit_form($empty_form_state, $node, $component);
+
   // Obtain the slice using code based on drupal_array_set_nested_value() in
   // Drupal 7.
   $ref = &$form;
diff --git a/modules/webform/form_builder_webform.module b/modules/webform/form_builder_webform.module
index 64d45c1..2d442f9 100644
--- a/modules/webform/form_builder_webform.module
+++ b/modules/webform/form_builder_webform.module
@@ -110,7 +110,7 @@ function form_builder_webform_save_component($node, $element_id, $form) {
   module_load_include('inc', 'form_builder_webform', 'form_builder_webform.components');
 
   $element = form_builder_get_element($form, $element_id);
-  $type = isset($element['#webform']['type']) ? $element['#webform']['type'] : $element['#form_builder']['element_type'];
+  $type = isset($element['#webform_component']['type']) ? $element['#webform_component']['type'] : $element['#form_builder']['element_type'];
 
   // Check for existing components.
   $cid = substr($element_id, 4);
@@ -118,7 +118,7 @@ function form_builder_webform_save_component($node, $element_id, $form) {
     $component = $node->webform['components'][$cid];
   }
   // Populate a new default component.
-  elseif (isset($element['#webform']['is_new'])) {
+  elseif (isset($element['#webform_component']['is_new'])) {
     if ($component = webform_component_invoke($type, 'defaults')) {
       $component['type'] = $type;
     }
@@ -146,7 +146,7 @@ function form_builder_webform_save_component($node, $element_id, $form) {
   $parent = form_builder_get_element($form, $element['#form_builder']['parent_id']);
   if ($parent) {
     // If the parent is new, the database must be queried for the cid of the parent.
-    if (isset($parent['#webform']['is_new']) && $parent['#webform']['is_new']) {
+    if (isset($parent['#webform_component']['is_new']) && $parent['#webform_component']['is_new']) {
       $results = db_query("SELECT cid, form_key FROM {webform_component} WHERE form_key = '%s' AND nid = %d", $element['#form_builder']['parent_id'], $node->nid);
       while ($result = db_fetch_object($results)) {
         $component['pid'] = $result->cid;
@@ -165,7 +165,7 @@ function form_builder_webform_save_component($node, $element_id, $form) {
   if (isset($element['#default_value'])) {
     $component['value'] = is_array($element['#default_value']) ? implode(',', $element['#default_value']) : $element['#default_value'];
   }
-  elseif (empty($element['#webform']['is_new'])) {
+  elseif (empty($element['#webform_component']['is_new'])) {
     $component['value'] = NULL;
   }
 
@@ -289,6 +289,7 @@ function form_builder_webform_form_builder_load($form_builder_type, $form_builde
     // Change 'pagebreak' components back, as described above.
     foreach ($pagebreak_component_keys as $key) {
       $form['submitted'][$key]['#type'] = 'pagebreak';
+      $form['submitted'][$key]['#webform_component']['type'] = 'pagebreak';
     }
 
     // Perform final processing of the form, and return it.
@@ -333,7 +334,7 @@ function form_builder_webform_load_process(&$form, $node, $pid = 0) {
  */
 function form_builder_webform_form_builder_add_element_alter(&$element, $form_type, $form_id) {
   if ($form_type == 'webform') {
-    $element['#webform']['is_new'] = TRUE;
+    $element['#webform_component']['is_new'] = TRUE;
   }
 }
 
@@ -355,12 +356,8 @@ function form_builder_webform_form_builder_preview_alter(&$element, $form_type,
       $element['#value'] = _webform_filter_values($element['#default_value'], NULL, NULL, NULL, FALSE);
     }
 
-    // Add info to the #webform_component array so that theme_webform_element will
-    // work properly.
-    $element['#webform_component']['type'] = $element['#form_builder']['element_type'];
-
     // Let components do any extra filtering if needed.
-    $type = isset($element['#webform']['type']) ? $element['#webform']['type'] : $element['#form_builder']['element_type'];
+    $type = isset($element['#webform_component']['type']) ? $element['#webform_component']['type'] : $element['#form_builder']['element_type'];
     if ($new_element = form_builder_webform_component_invoke($type, 'form_builder_preview_alter', $element)) {
       $element = $new_element;
     }
