diff --git a/geocoder.widget.inc b/geocoder.widget.inc
index d5e85b8..7f5e959 100644
--- a/geocoder.widget.inc
+++ b/geocoder.widget.inc
@@ -179,6 +179,7 @@ function geocoder_field_attach_presave($entity_type, $entity) {
  *    - A populated array: assign a new field value.
  */
 function geocoder_widget_get_field_value($entity_type, $field_instance, $entity = NULL, $source_field_values = NULL) {
+  static $cache = array();
   if (!$source_field_values && !$entity) {
     trigger_error('geocoder_widget_get_field_value: You must pass either $source_field_values OR $entity', E_USER_ERROR);
     return FALSE;
@@ -268,6 +269,14 @@ function geocoder_widget_get_field_value($entity_type, $field_instance, $entity
       foreach ($source_field_values as $delta => $item) {
         // Geocode any value from our source field.
         try {
+          // Remove unique field-related properties to prevent them from tripping up cache.
+          unset($item['element_key'], $item['_weight']);
+          $cache_id = $handler['field_callback'] . '_' . md5(serialize(isset($handler_settings) ? array($item, $handler_settings) : array($item)));
+          if (isset($cache[$cache_id])) {
+            $geometries[] = $cache[$cache_id];
+            continue;
+          }
+
           if (isset($handler_settings)) {
             $geometry = call_user_func($handler['field_callback'], $field_info, $item, $handler_settings);
           }
@@ -276,6 +285,8 @@ function geocoder_widget_get_field_value($entity_type, $field_instance, $entity
           }
           if ($geometry instanceof Geometry) {
             $geometries[] = $geometry;
+            // Cache geocoded value.
+            $cache[$cache_id] = $geometry;
           }
           else {
             // An error occured
