diff --git a/filefield_sources.api.php b/filefield_sources.api.php
index 44deeb8..7f13b58 100644
--- a/filefield_sources.api.php
+++ b/filefield_sources.api.php
@@ -46,6 +46,10 @@ function hook_filefield_sources_info() {
     // file locally. For an example, see filefield_source_remote_value().
     'value' => 'mymodule_filefield_source_flickr_value',
     'weight' => 3,
+    // This optional setting will ensure that your code is included when needed
+    // if your value, process, or other callbacks are located in a file other
+    // than your .module file.
+    'file' => 'include/mymodule.flickr_source.inc',
   );
   return $sources;
 }
diff --git a/filefield_sources.module b/filefield_sources.module
index d37d81f..db43c96 100644
--- a/filefield_sources.module
+++ b/filefield_sources.module
@@ -57,10 +57,10 @@ function filefield_sources_form_field_ui_field_edit_form_alter(&$form, &$form_st
   $instance = $form['#instance'];
   if (in_array($instance['widget']['type'], module_invoke_all('filefield_sources_widgets'))) {
     if (!empty($form['instance']['widget']['settings'])) {
-      $form['instance']['widget']['settings'] += filefield_sources_form($instance);
+      $form['instance']['widget']['settings'] += filefield_sources_form($instance, $form_state);
     }
     else {
-      $form['instance']['widget']['settings'] = filefield_sources_form($instance);
+      $form['instance']['widget']['settings'] = filefield_sources_form($instance, $form_state);
     }
   }
 }
@@ -84,7 +84,7 @@ function filefield_sources_field_widget_info_alter(&$info) {
 /**
  * Configuration form for editing FileField Sources settings for a widget.
  */
-function filefield_sources_form($instance) {
+function filefield_sources_form($instance, &$form_state) {
   $settings = $instance['widget']['settings']['filefield_sources'];
 
   // Backward compatibility: auto-enable 'upload'.
@@ -107,6 +107,14 @@ function filefield_sources_form($instance) {
     '#description' => t('Select the available locations from which this widget may select files.'),
   );
 
+  // Make sure all includes are loaded for multistep forms.
+  $sources_info = filefield_sources_info(FALSE);
+  foreach ($sources_info as $source_name => $source) {
+    if (isset($source['file'])) {
+      _filefield_sources_form_include($source['module'], $source['file'], $form_state);
+    }
+  }
+
   $params = array('form', $instance);
   $form['filefield_sources'] = array_merge($form['filefield_sources'], filefield_sources_invoke_all('settings', $params));
 
@@ -135,9 +143,14 @@ function filefield_sources_field_process($element, &$form_state, $form) {
     if (empty($enabled_sources[$source_name])) {
       unset($sources[$source_name]);
     }
-    elseif (isset($source['process'])) {
-      $function = $source['process'];
-      $element = $function($element, $form_state, $form);
+    else {
+      if (isset($source['process'])) {
+        $function = $source['process'];
+        $element = $function($element, $form_state, $form);
+      }
+      if (isset($source['file'])) {
+        _filefield_sources_form_include($source['module'], $source['file'], $form_state);
+      }
     }
   }
   $element['#filefield_sources'] = $sources;
@@ -322,7 +335,16 @@ function filefield_sources_info($include_default = TRUE) {
       'description' => t('Upload a file from your computer.'),
       'weight' => -10,
     );
-    $cache += module_invoke_all('filefield_sources_info');
+
+    // Add the providing module name to each source.
+    foreach (module_implements('filefield_sources_info') as $module) {
+      $function = $module . '_filefield_sources_info';
+      $additions = $function();
+      foreach ($additions as $source_name => $source_info) {
+        $additions[$source_name]['module'] = $module;
+      }
+      $cache += $additions;
+    }
 
     drupal_alter('filefield_sources_info', $cache);
     uasort($cache, '_filefield_sources_sort');
@@ -638,6 +660,16 @@ function _filefield_sources_sort($a, $b) {
 }
 
 /**
+ * Ensure that a source include file is loaded into $form_state.
+ */
+function _filefield_sources_form_include($module, $filepath, &$form_state) {
+  $last_dot = strrpos($filepath, '.');
+  $path = substr($filepath, 0, $last_dot);
+  $extension = substr($filepath, $last_dot + 1);
+  form_load_include($form_state, $extension, $module, $path);
+}
+
+/**
  * Helper to return enabled sources for a field
  *
  * This provides backward compatibility for 'upload' type.
diff --git a/sources/attach.inc b/sources/attach.inc
index cbe3fd9..6ee5dfd 100644
--- a/sources/attach.inc
+++ b/sources/attach.inc
@@ -21,6 +21,7 @@ function filefield_source_attach_info() {
     'process' => 'filefield_source_attach_process',
     'value' => 'filefield_source_attach_value',
     'weight' => 3,
+    'file' => 'includes/attach.inc',
   );
   return $source;
 }
diff --git a/sources/clipboard.inc b/sources/clipboard.inc
index d74dca9..f6528fc 100644
--- a/sources/clipboard.inc
+++ b/sources/clipboard.inc
@@ -21,6 +21,7 @@ function filefield_source_clipboard_info() {
     'process' => 'filefield_source_clipboard_process',
     'value' => 'filefield_source_clipboard_value',
     'weight' => 1,
+    'file' => 'includes/clipboard.inc',
   );
   return $source;
 }
diff --git a/sources/imce.inc b/sources/imce.inc
index 4d8cb11..27edb7a 100644
--- a/sources/imce.inc
+++ b/sources/imce.inc
@@ -26,6 +26,7 @@ function filefield_source_imce_info() {
     'process' => 'filefield_source_imce_process',
     'value' => 'filefield_source_imce_value',
     'weight' => -1,
+    'file' => 'includes/imce.inc',
   );
   return $source;
 }
diff --git a/sources/reference.inc b/sources/reference.inc
index b01de1e..b41000a 100644
--- a/sources/reference.inc
+++ b/sources/reference.inc
@@ -23,6 +23,7 @@ function filefield_source_reference_info() {
     'process' => 'filefield_source_reference_process',
     'value' => 'filefield_source_reference_value',
     'weight' => 1,
+    'file' => 'includes/reference.inc',
   );
   return $source;
 }
diff --git a/sources/remote.inc b/sources/remote.inc
index 0818553..aa890a8 100644
--- a/sources/remote.inc
+++ b/sources/remote.inc
@@ -22,6 +22,7 @@ function filefield_source_remote_info() {
     'description' => t('Download a file from a remote server.'),
     'process' => 'filefield_source_remote_process',
     'value' => 'filefield_source_remote_value',
+    'file' => 'includes/remote.inc',
   );
   return $source;
 }
