diff --git a/geocoder.widget.inc b/geocoder.widget.inc
index 8fe8e51..14cb75a 100644
--- a/geocoder.widget.inc
+++ b/geocoder.widget.inc
@@ -13,6 +13,14 @@ function geocoder_field_widget_info() {
         'default value' => FIELD_BEHAVIOR_NONE,
       ),
     ),
+    'geocoder_manual' => array(
+      'label' => t('Geocode from another field with option to manually enter lat/lon'),
+      'field types' => array('geofield'),
+      'behaviors' => array(
+        'multiple values' => FIELD_BEHAVIOR_CUSTOM,
+        //'default value' => FIELD_BEHAVIOR_NONE,
+      ),
+    ),
   );
 }

@@ -138,9 +146,73 @@ function geocoder_field_widget_settings_form($this_field, $instance) {
   drupal_add_js(array('geocoder_widget_settings' => array('handlers' => $handlers_by_type, 'types' => $field_types)), 'setting');
   drupal_add_js(drupal_get_path('module', 'geocoder') . '/geocoder.admin.js', 'file');

+  // Add the manual method select.
+  if (module_exists('geofield') && $instance['widget']['type'] == 'geocoder_manual') {
+    module_load_include('inc', 'geofield', 'geofield.widgets');
+    $options = array();
+    foreach (geofield_field_widget_info() as $key => $info) {
+      $options[$key] = $info['label'];
+    }
+    $form['manual_widget'] = array(
+      '#type' => 'select',
+      '#title' => t('Wiget to use for manually entry'),
+      '#default_value' => isset($settings['manual_widget']) ? $settings['manual_widget']: 'geofield_latlon',
+      '#options' => $options,
+      '#required' => TRUE,
+    );
+  }
+
   return $form;
 }

+
+/**
+ * Implements hook_field_widget_form().
+ */
+function geocoder_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $base) {
+  // We only need to output something if the manual option is selected
+  if ($instance['widget']['type'] == 'geocoder_manual') {
+    $element = array();
+
+    // Add the manual checkbox
+    $element['geocoder_manual']['#title'] = 'Manually enter coordinates';
+    $element['geocoder_manual']['#type'] = 'checkbox';
+    $element['geocoder_manual']['#weight'] = -100;
+    $element['geocoder_manual']['#default_value'] = (bool) ($items[0]['source'] == 'manual');
+
+    // Add the manual fields from geofield.
+    $instance['widget']['type'] = $instance['widget']['settings']['manual_widget'];
+    $element['geocoder_manual_fieldset'] = geofield_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $base);
+    $element['geocoder_manual_fieldset']['#type'] = 'fieldset';
+    $element['geocoder_manual_fieldset']['#states'] = array(
+      'invisible' => array(
+        ':input[name="' . $instance['field_name'] . '[und][geocoder_manual]"]' => array('checked' => FALSE),
+      ),
+    );
+    $instance['widget']['type'] = 'geocoder_manual';
+
+    // Add a custom validate callback to move the geocoder_manual field into
+    // the geofield source attribute
+    $element['#element_validate'] = array('geocoder_manual_field_element_validate');
+
+    // Allow this element form array to be altered.
+    drupal_alter('field_geocoder_manual_widget', $element, $form, $instance);
+
+    return $element;
+  }
+}
+
+
+/**
+ * Field validate function to move the geocoder_manual field into the
+ * geofield source attribute
+ */
+function geocoder_manual_field_element_validate($element, &$form_state) {
+  $form_state['values'][$element['#field_name']][LANGUAGE_NONE]['geocoder_manual_fieldset']['source'] = $form_state['values'][$element['#field_name']][LANGUAGE_NONE]['geocoder_manual'] ? 'manual' : NULL;
+  unset($form_state['values'][$element['#field_name']][LANGUAGE_NONE]['geocoder_manual']);
+}
+
+
 /**
  * Implements hook_field_attach_presave().
  *
@@ -152,7 +224,10 @@ function geocoder_field_attach_presave($entity_type, $entity) {
   $entity_info = entity_get_info($entity_type);
   $bundle_name = empty($entity_info['entity keys']['bundle']) ? $entity_type : $entity->{$entity_info['entity keys']['bundle']};
   foreach (field_info_instances($entity_type, $bundle_name) as $field_instance) {
-    if ($field_instance['widget']['type'] === 'geocoder') {
+    if (
+      $field_instance['widget']['type'] === 'geocoder' ||
+      ($field_instance['widget']['type'] === 'geocoder_manual' && $entity->{$field_instance['field_name']}[LANGUAGE_NONE][0]['source'] != 'manual')
+    ) {
       if (($field_value = geocoder_widget_get_field_value($entity_type, $field_instance, $entity)) !== FALSE) {
         $entity->{$field_instance['field_name']} = $field_value;
       }
