diff --git a/geocode.module b/geocode.module
index 8f65861..0fc1d1f 100644
--- a/geocode.module
+++ b/geocode.module
@@ -164,6 +164,14 @@ function geocode_field_widget_settings_form($this_field, $instance) {
     }
   }
 
+  $form['geocode_presave'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Geocode on Save'),
+    '#default_value' => isset($settings['geocode_presave']) ? $settings['geocode_presave']: 0,
+    '#options' => array(0 => t('Geocode only on Form Submission'), 1 => t('Geocode only on Save')),
+    '#description' => t('Select if you want to geocode on any save operation, or only from form submissions.'),
+  );
+
   $form['geocode_field'] = array(
     '#type' => 'select',
     '#title' => t('Geocode from field'),
@@ -185,6 +193,8 @@ function geocode_field_widget_settings_form($this_field, $instance) {
     '#required' => TRUE,
   );
 
+
+
   drupal_add_js(array('geocode_widget_settings' => array('handlers' => $handlers_by_type, 'types' => $field_types)),'setting');
   drupal_add_js(drupal_get_path('module','geocode').'/geocode.admin.js','file');
 
@@ -203,8 +213,10 @@ function geocode_field_widget_form(&$form, &$form_state, $field, $instance, $lan
 
   $element['wkt'] = array(
    '#type' => 'hidden',
-   '#element_validate' => array('geocode_widget_validate'),
   );
+  if (!$instance['widget']['settings']['geocode_presave']) {
+    $element['wkt']['#element_validate'] = array('geocode_widget_validate');
+  }
   $element['geocode_target'] = array(
    '#type' => 'hidden',
    '#value' => $instance['field_name'],
@@ -306,3 +318,63 @@ function geocode_widget_validate_walkthrough(&$field, $form_state, $parent = NUL
     }
   }
 }
+
+
+/**
+ * Implements hook_entity_info_alter().
+ */
+function geocode_entity_info_alter(&$info) {
+
+  // Get our geofield fields, add them to entity properties
+  foreach(field_info_fields() as $field => $field_info) {
+
+    // @TODO: might want to have target field types function
+    // in case future support for another field is needed
+    //if (array_key_exists($field_info['type'], geocode_supported_taget_types())) {
+
+    if ($field_info['type'] == 'geofield') {
+      if(isset($field_info['bundles']) && is_array($field_info['bundles'])) {
+        foreach($field_info['bundles'] as $entity => $bundle) {
+          foreach ($bundle as $bk => $bi) {
+            $info[$entity]['geocode'][$bi] = $field;
+          }
+        }
+      }
+    }
+  }
+}
+/*
+ * Implementes hook_entity_presave().
+ */
+function geocode_entity_presave($entity, $entity_type) {
+
+  $info = entity_get_info($entity_type);
+  list(,, $bundle) = entity_extract_ids($entity_type, $entity);
+
+  if (isset($info['geocode'][$bundle])) {
+    $target_field = $info['geocode'][$bundle];
+    $target_field_type = field_info_field($target_field);
+    $target_field_type = array('type' => $target_field_type['type']);
+    $instance = field_info_instance($entity_type, $target_field, $bundle);
+    $settings = $instance['widget']['settings'];
+
+    if ($settings['geocode_presave'] == TRUE) {
+      $source_field = $settings['geocode_field'];
+      $handler = geocode_get_handler($settings['geocode_handler']);
+      $field_values = field_get_items($entity_type, $entity, $source_field);
+
+      foreach($field_values as $delta => $fi) {
+        try {
+          $geometry = call_user_func($handler['field_callback'], $field_object, $fi);
+        }
+        catch(Exception $e) {
+          drupal_set_message($e->getMessage(),'error');
+          return;
+        }
+        if ($geometry) {
+          $entity->{$target_field}[LANGUAGE_NONE][$delta] = geofield_get_values_from_geometry($geometry);
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
