diff --git a/geocoder.widget.inc b/geocoder.widget.inc
index 9e350a6..ff9fd01 100644
--- a/geocoder.widget.inc
+++ b/geocoder.widget.inc
@@ -600,40 +600,13 @@ 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['postal_code']) ? $field_item['postal_code'] : NULL;
-  if (!empty($field_item['country']) && !empty($field_item['administrative_area'])) {
-    module_load_include('inc', 'addressfield', 'addressfield.administrative_areas');
-    $address[] = addressfield_get_administrative_areas($field_item['country'])[$field_item['administrative_area']];
+function geocoder_widget_parse_addressfield($field_item, $hide_street = FALSE) {
+  $format = array('address');
+  if ($hide_street) {
+    $format[] = 'address-hide-street';
   }
-  else {
-    $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;
-    }
-    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']];
-      }
-    }
-    $address[] = $field_item['country'];
-  }
-
-  return implode(',', array_filter($address));
+  $render_array = addressfield_generate($field_item, $format);
+  return str_replace(PHP_EOL, ', ', strip_tags(drupal_render($render_array)));
 }
 
 /**
diff --git a/plugins/geocoder_handler/google.inc b/plugins/geocoder_handler/google.inc
index 1ae0e4c..34250ab 100644
--- a/plugins/geocoder_handler/google.inc
+++ b/plugins/geocoder_handler/google.inc
@@ -200,6 +200,14 @@ function geocoder_google_field($field, $field_item, $options = array()) {
     if(empty($address)) {
       return FALSE;
     }
+    try {
+      return geocoder_google($address, $options);
+    }
+    catch (Exception $e) {
+      // fall-through if exception
+    }
+    // if no location returned, get address without street and try again
+    $address = geocoder_widget_parse_addressfield($field_item, TRUE);
     return geocoder_google($address, $options);
   }
   if ($field['type'] == 'country') {
