diff --git a/modules/openlayers_geofield/openlayers_geofield.module b/modules/openlayers_geofield/openlayers_geofield.module
index d36d72e..e9ba886 100644
--- a/modules/openlayers_geofield/openlayers_geofield.module
+++ b/modules/openlayers_geofield/openlayers_geofield.module
@@ -503,7 +503,7 @@ function openlayers_geofield_field_widget_form(&$form, &$form_state, $field, $in
       // of the geocoder field.
       '#limit_validation_errors' => array(),
       '#ajax' => array(
-        'callback' => 'openlayers_widget_geocode',
+        'callback' => 'openlayers_geofield_geocode_ajax_callback',
         'wrapper' => $wrapper_id,
         'effect' => 'fade',
       ),
@@ -560,6 +560,29 @@ function openlayers_openlayers_use_geocoder_submit($form, &$form_state) {
 }
 
 /**
+ * Return the altered form element from an AJAX request.
+ *
+ * @see openlayers_geofield_field_widget_form()
+ */
+function openlayers_geofield_geocode_ajax_callback($form, $form_state) {
+  $button = $form_state['triggering_element'];
+
+  // Go one level up in the form, to the widgets container.
+  $element = drupal_array_get_nested_value($form, array_slice($button['#array_parents'], 0, -1));
+  $field_name = $element['#field_name'];
+  $langcode = $element['#language'];
+  $delta = $element['#delta'];
+  $parents = $element['#field_parents'];
+
+  $value = drupal_array_get_nested_value($form_state, array_merge(array('values'), $parents, array($field_name)));
+  $element['geom']['#value'] = $value[$langcode][$delta]['geom'];
+  // Return the map, but remove the '_weight' element inserted
+  // by the field API.
+  unset($element['_weight']);
+  return $element;
+}
+
+/**
  * Implements hook_geocoder_geocode_values_alter().
  */
 function openlayers_geofield_geocoder_geocode_values_alter(&$source_field_values, &$field_info, $handler_settings, $field_instance) {
