diff --git a/geocoder.module b/geocoder.module
index 41c5981..048c2f3 100644
--- a/geocoder.module
+++ b/geocoder.module
@@ -295,6 +295,13 @@ function geocoder_service_check_request($handler, $format, $check_ac = TRUE) {
 }
 
 /**
+ * Include a handler's file, to expose its callbacks.
+ */
+function geocoder_include_handler(array $handler) {
+  require_once $handler['path'] . '/' . $handler['file'];
+}
+
+/**
  * Create a unified cache id from relevant cache data.
  */
 function _geocoder_cache_cid($data) {
diff --git a/geocoder.widget.inc b/geocoder.widget.inc
index a6a8400..528a977 100644
--- a/geocoder.widget.inc
+++ b/geocoder.widget.inc
@@ -142,6 +142,7 @@ function geocoder_field_widget_settings_form($this_field, $instance) {
       }
 
       if (isset($handler['settings_callback'])) {
+        geocoder_include_handler($handler);
         $settings_callback = $handler['settings_callback'];
         $form['handler_settings'][$handler_id] = array_merge($form['handler_settings'][$handler_id], $settings_callback($default_values));
       }
@@ -327,6 +328,7 @@ function geocoder_widget_get_field_value($entity_type, $field_instance, $entity
         if ($geometry === NULL) {
           // Geocode any value from our source field.
           try {
+            geocoder_include_handler($handler);
             $geometry = call_user_func($handler['field_callback'], $field_info, $item, $handler_settings);
 
             // Save result persistently.
