diff --git a/geocoder.widget.inc b/geocoder.widget.inc
index 06f9e32..7797208 100644
--- a/geocoder.widget.inc
+++ b/geocoder.widget.inc
@@ -474,35 +474,65 @@ function geocoder_widget_values_from_geometry($geometry, $target_info) {
  * Geocoder Widget - Parse an address field.
  */
 function geocoder_widget_parse_addressfield($field_item) {
-  $address = array();
-
-  $address[] = !empty($field_item['organization']) ? $field_item['organization'] : NULL;
-  $address[] = !empty($field_item['premise']) ? $field_item['premise'] : NULL;
-  $address[] = !empty($field_item['sub_premise']) ? $field_item['sub_premise'] : NULL;
-  $address[] = !empty($field_item['thoroughfare']) ? $field_item['thoroughfare'] : NULL;
-  $address[] = !empty($field_item['locality']) ? $field_item['locality'] : NULL;
-  $address[] = !empty($field_item['administrative_area']) ? $field_item['administrative_area'] : NULL;
-  $address[] = !empty($field_item['sub_administrative_area']) ? $field_item['sub_administrative_area'] : NULL;
-
-  if (!empty($field_item['country'])) {
-    if (module_exists('countries')) {
-      $country = country_load($field_item['country']);
-      $field_item['country'] = $country->name;
+  global $language;
+
+  // Generate the addressfield format.
+  $handlers = array('address');
+  $context = array(
+    'mode' => 'render',
+    'langcode' => $language->language,
+  );
+  $format = addressfield_generate($field_item, $handlers, $context);
+
+  // Prepare addressfield render array.
+  $address = addressfield_render_address($format);
+
+  // Get raw output from render prepared addressfield values.
+  $address['#render_values'] = array();
+  $address['#output'] = array();
+  geocoder_widget_parse_addressfield_render_values($address);
+
+  return implode($address['#output'], ', ');
+}
+
+/**
+ * Helper function to extract an ordered address string.
+ *
+ * The address string is comma separated and ordered by field weight. The weight
+ * is determined by the country specific address format.
+ */
+function geocoder_widget_parse_addressfield_render_values(&$format) {
+  foreach (element_children($format) as $key) {
+    $child = &$format[$key];
+    $child['#render_values'] = array();
+    $child['#output'] = array();
+
+    $weight = isset($child['#weight']) ? $child['#weight'] : 0;
+
+    if (array_key_exists('#children', $child) && is_string($child['#children']) && strlen($child['#children'])) {
+      $format['#render_values'][] = array('value' => $child['#children'], 'weight' => $weight);
     }
-    else {
-      // Convert country code to country name.
-      include_once DRUPAL_ROOT . '/includes/locale.inc';
-      $countries = country_get_list();
-      if (array_key_exists($field_item['country'], $countries)) {
-        $field_item['country'] = $countries[$field_item['country']];
-      }
+
+    // Recurse through the child.
+    geocoder_widget_parse_addressfield_render_values($child);
+    if (!empty($child['#render_values'])) {
+      $format['#render_values'][] = array('value' => $child['#render_values'], 'weight' => $weight);
+    }
+    if (!empty($child['#output'])) {
+      $format['#output'] = array_merge_recursive($format['#output'], $child['#output']);
     }
-    $address[] = $field_item['country'];
   }
 
-  $address[] = !empty($field_item['postal_code']) ? $field_item['postal_code'] : NULL;
+  if (!empty($format['#render_values'])) {
+    // Sort by weight.
+    uasort($format['#render_values'], 'drupal_sort_weight');
 
-  return implode(',', array_filter($address));
+    foreach ($format['#render_values'] as $i => $value) {
+      // Add values to output array.
+      $format['#output'][] = $value['value'];
+      unset($format['#render_values'][$i]);
+    }
+  }
 }
 
 /**
