diff -durp addresses/addresses.module addresses_customize/addresses.module
--- addresses/addresses.module	2010-01-29 15:49:32.000000000 -0500
+++ addresses_customize/addresses.module	2010-07-06 19:26:47.745685900 -0400
@@ -188,9 +188,10 @@ function addresses_elements() {
  *   Array. Form fields
  */
 function addresses_elements_process($element, $edit, $form_state, $form) {
+  $settings = empty($form['#field_info'][$element['#field_name']]) ? variable_get('addresses_user_settings', array()) : $form['#field_info'][$element['#field_name']];
   $fields = $element['#fields'];
   $values = $element['#default_value'];
-
+    
   // Reset the required fields based on the general required value
   if (empty($element['#required'])) {
     foreach ($fields as $field => $required) {
@@ -216,13 +217,30 @@ function addresses_elements_process($ele
 
   // Include the main module file
   module_load_include('inc', 'addresses');
+  
+  // Update the $fields array to reflect element visibility settings per the
+  // new global settings options.  It would be cleaner to simply update the
+  // form generation function, but this method will be compatible with extra
+  // contrib fields.
+  foreach(array_keys($fields) as $ftype) {
+    if (!empty($settings[$ftype . '_select'])) {
+      $fields[$ftype] = $settings[$ftype . '_select'];
+    }
+  }
+  
+  // Invoke addressfieldapi to allow modules to add their own addresses fields.
+  // Then update these fields with the global settings for each field instance.
+  $extra = module_invoke_all('addressesfieldapi', 'form', $fields, $values);
+  foreach (element_children($extra) as $eName) {
+    $extra[$eName]['#title'] = t($settings[$eName . '_label']);
+    $extra[$eName]['#description'] = t($settings[$eName . '_desc']);
+    if ('textfield' == $extra[$eName]['#type']) {
+      $extra[$eName]['#size'] = $settings[$eName . '_size'];
+    }
+  }
 
-  // Get other fields from hook_addressesfieldsapi
-  $element = array_merge(
-    $element,
-    module_invoke_all('addressesfieldapi', 'form', $fields, $values)
-  );
-
+  // Add the extra fields to the element and return it.
+  $element = array_merge($element, $extra);
   return $element;
 }
 
diff -durp addresses/addresses.settings.inc addresses_customize/addresses.settings.inc
--- addresses/addresses.settings.inc	2010-02-09 18:18:40.000000000 -0500
+++ addresses_customize/addresses.settings.inc	2010-07-06 17:25:19.000000000 -0400
@@ -14,7 +14,7 @@
  */
 function _addresses_addressesfieldapi_form($fields = array(), $values = array()) {
   $field_weights = variable_get('addresses_field_weight', array());
-
+  
   // Let users select if the address is the primary
   if (!empty($fields['is_primary'])) {
     $form['is_primary'] = array(
@@ -484,20 +484,41 @@ function _addresses_settings(&$form_stat
  */
 function _addresses_settings_fields($field_values = array()) {
   $ftypes = module_invoke_all('addressesfieldapi', 'fields');
-
+  
   foreach ($ftypes as $ftype => $field) {
-    // List of address fields
-    $form['addresses'][$ftype] = array(
-      '#default_value'  => !isset($field_values[$ftype]) ? $field['display'] : $field_values[$ftype],
+    // List of address fields    
+    $form['addresses'][$ftype][$ftype . '_select'] = array(
+      '#type' => 'select',
       '#options' => array(
-        ADDRESSES_FIELD_NONE      => '',
-        ADDRESSES_FIELD_SHOW      => '',
-        ADDRESSES_FIELD_REQUIRED  => '',
-        ADDRESSES_FIELD_HIDDEN    => '',
+        ADDRESSES_FIELD_NONE      => 'None',
+        ADDRESSES_FIELD_SHOW      => 'Normal',
+        ADDRESSES_FIELD_REQUIRED  => 'Required',
+        ADDRESSES_FIELD_HIDDEN    => 'Hidden',
       ),
-      '#title' => $field['title'],
-      '#type' => 'radios',
+      '#default_value'  => !isset($field_values[$ftype . '_select']) ? $field['display'] : $field_values[$ftype . '_select'],
+    );
+    
+    // Add form elements to allow the customization of field element labels
+    // descriptions, and sizes.
+    $form['addresses'][$ftype][$ftype . '_label'] = array(
+      '#type' => 'textfield',
+      '#size' => 20,
+      '#maxlength' => 255,
+      '#default_value' => !isset($field_values[$ftype . '_label']) ? $field['title'] : $field_values[$ftype . '_label'],
+    );
+    $form['addresses'][$ftype][$ftype . '_desc'] = array(
+      '#type' => 'textfield',
+      '#size' => 60,
+      '#maxlength' => 255,
+      '#default_value' => !isset($field_values[$ftype . '_desc']) ? $field['description'] : $field_values[$ftype . '_desc'],
+    );
+    $form['addresses'][$ftype][$ftype . '_size'] = array(
+      '#type' => 'textfield',
+      '#size' => 2,
+      '#maxlength' => 3,
+      '#default_value' => !isset($field_values[$ftype . '_size']) ? $field['length'] : $field_values[$ftype . '_size'],
     );
+    $form['addresses'][$ftype]['#title'] = $field['title'];
   }
 
   $form['addresses']['#theme'] = 'addresses_settings_fields';
@@ -593,18 +614,17 @@ function theme_addresses_elements($eleme
  */
 function theme_addresses_settings_fields($form) {
   foreach (element_children($form) as $ftype) {
-    $field = $form[$ftype];
     $rows[] = array(
-      $field['#title'],
-      drupal_render($field[0]),
-      drupal_render($field[1]),
-      drupal_render($field[2]),
-      drupal_render($field[3]),
+      $form[$ftype]['#title'],
+      drupal_render($form[$ftype][$ftype . '_select']),
+      drupal_render($form[$ftype][$ftype . '_size']),
+      drupal_render($form[$ftype][$ftype . '_label']),
+      drupal_render($form[$ftype][$ftype . '_desc']),
     );
     unset($form[$ftype]);
   }
 
-  $header = array(t('Field'), t('None'), t('Normal'), t('Required'), t('Hidden'));
+  $header = array(t('Field'), t('Visibility'), t('Size'), t('Label'), t('Help text'));
   $output = theme('table', $header, $rows);
 
   $output .= drupal_render($form);
diff -durp addresses/addresses_cck/addresses_cck.module addresses_customize/addresses_cck/addresses_cck.module
--- addresses/addresses_cck/addresses_cck.module	2010-01-30 18:44:12.000000000 -0500
+++ addresses_customize/addresses_cck/addresses_cck.module	2010-07-02 12:50:19.000000000 -0400
@@ -142,8 +142,10 @@ function addresses_cck_field_settings($o
       // With the fields and their values correctly assigned,
       // its time to recover only the field name and its value
       // and save it
-      foreach (array_keys($form['addresses']) as $field) {
-        $fields[] = $field;
+      foreach (array_keys($form['addresses']) as $ftype) {
+        foreach(element_children($form['addresses'][$ftype]) as $field) {
+          $fields[] = $field;
+        }
       }
       return $fields;
 
@@ -191,7 +193,7 @@ function addresses_cck_field_settings($o
  */
 function _addresses_cck_field_validate(&$form, &$form_state) {
   foreach (array_keys($form_state['values']['columns']) as $ftype) {
-    if ($form_state['values'][$ftype] == ADDRESSES_FIELD_REQUIRED) {
+    if ($form_state['values'][$ftype . '_select'] == ADDRESSES_FIELD_REQUIRED) {
       form_set_value($form['field']['required'], TRUE, $form_state);
       return;
     }
diff -durp addresses/addresses_user/addresses_user.module addresses_customize/addresses_user/addresses_user.module
--- addresses/addresses_user/addresses_user.module	2010-01-29 15:39:36.000000000 -0500
+++ addresses_customize/addresses_user/addresses_user.module	2010-07-06 19:35:40.273144700 -0400
@@ -30,7 +30,7 @@ function _addresses_user_access($account
  */
 function addresses_user_form__addresses_settings_alter(&$form, &$form_state) {
   module_load_include('settings.inc', 'addresses');
-  $form += _addresses_settings_fields(variable_get('addresses_user', array()));
+  $form += _addresses_settings_fields(variable_get('addresses_user_settings', array()));
 
   // Set the 'addresses' as a fieldset
   $form['addresses_user'] = array(
@@ -65,6 +65,13 @@ function addresses_user_form__addresses_
     '#tree'           => FALSE,
     '#type'           => 'checkbox',
   );
+  
+  // Even though this form will be passed through to system_settings_form, we
+  // will still need a custom submit handler so that we can save the field settings 
+  // in a compatible format.  This is because the fieldset added here applies 
+  // the #tree attribute to the rest of the form elements, which changes the shape
+  // of the data returned on submit.
+  $form['#submit'][] = '_addresses_user_settings_submit';
 }
 
 /**
@@ -144,6 +151,28 @@ function _addresses_user_form_submit($fo
 }
 
 /**
+ * Submit the settings
+ *
+ * @ingroup form
+ */
+function _addresses_user_settings_submit($form, &$form_state) {
+  $ftypes = $form_state['values']['addresses_user'];
+  $fields = array();
+  $settings = array();
+  
+  foreach($ftypes as $ftype => $elements) {
+    $fields[$ftype] = $elements[$ftype . '_select'];
+    foreach($elements as $name => $value) {
+      $settings[$name] = $value;
+    }  
+  }
+  
+  variable_set('addresses_user', $fields);
+  variable_set('addresses_user_settings', $settings);
+  unset($form_state['addresses_user']);
+}
+
+/**
  * Implementation of hook_menu().
  */
 function addresses_user_menu() {
