diff --git a/skinr.module b/skinr.module
index eef2dd00e7b6fdb7a0b20dc7026f9a9aa7030051..9d6a6ef316074398e2ce6c42993324496175054d 100644
--- a/skinr.module
+++ b/skinr.module
@@ -221,6 +221,16 @@ function skinr_implements_api() {
           $cache[$module]['include file'] = $file;
         }
       }
+      else {
+        // If there is a $module.skinr.inc in the module's root, it gets
+        // auto-loaded for any hooks. But if a skin defined thering contains a
+        // custom 'form callback' function, we'll need to load it manually. So
+        // store the file's info.
+        $file = drupal_get_path('module', $module) . '/' . $module . '.skinr.inc';
+        if (file_exists(DRUPAL_ROOT . '/' . $file)) {
+          $cache[$module]['include file'] = $file;
+        }
+      }
       // Populate defaults.
       $cache[$module] += array(
         'path' => drupal_get_path('module', $module),
@@ -1070,10 +1080,11 @@ function skinr_get_skin_info() {
         // The base path for plugins is the directory defined by the extension.
         $dir = $extension['path'] . '/' . $extension['directory'];
         foreach ($files as $plugin => $file) {
+          $path = $dir . '/' . basename(dirname($file->uri));
           $hooks["{$name}_skinr_skin_{$plugin}_info"] = array(
             // The source path for a plugin is the plugin directory.
-            'path' => $dir . '/' . basename(dirname($file->uri)),
-            'filename' => $file->filename,
+            'path' => $path,
+            'include file' => $path . '/' . $file->filename,
           ) + $extension;
         }
       }
@@ -1127,10 +1138,11 @@ function skinr_get_group_info() {
         // The base path for plugins is the directory defined by the extension.
         $dir = $extension['path'] . '/' . $extension['directory'];
         foreach ($files as $plugin => $file) {
+          $path = $dir . '/' . basename(dirname($file->uri));
           $hooks["{$name}_skinr_group_{$plugin}_info"] = array(
             // The source path for a plugin is the plugin directory.
-            'path' => $dir . '/' . basename(dirname($file->uri)),
-            'filename' => $file->filename,
+            'path' => $path,
+            'include file' => $path . '/' . $file->filename,
           ) + $extension;
         }
       }
diff --git a/skinr_ui.module b/skinr_ui.module
index 058cfe2343c0b6d72a51d97ee1fd9a6fd09ffc00..e8ac6233bb68587cb3412e6e013dfd8800155565 100755
--- a/skinr_ui.module
+++ b/skinr_ui.module
@@ -434,8 +434,8 @@ function skinr_ui_form_alter(&$form, $form_state, $form_id) {
         // Process custom form callbacks.
 
         // Load include file.
-        if (!empty($skin_info['source']['filename'])) {
-          skinr_load_include($skin_info['source']['path'] . '/' . $skin_info['source']['filename']);
+        if (!empty($skin_info['source']['include file'])) {
+          skinr_load_include($skin_info['source']['include file']);
         }
 
         // Execute form callback.
diff --git a/tests/skinr.test b/tests/skinr.test
index c44798736e1c968a2001bb361a87ee046f267e8f..50823bdd101aa4630020f6170fb905d686b04b9c 100644
--- a/tests/skinr.test
+++ b/tests/skinr.test
@@ -176,7 +176,9 @@ class SkinrApiTestCase extends SkinrWebTestCase {
     // The expected extensions and their specific properties, if any.
     $all_expected = array(
       // Skinr is always expected.
-      'skinr' => array(),
+      'skinr' => array(
+        'include file' => drupal_get_path('module', 'skinr') . '/skinr.skinr.inc',
+      ),
       // System and node are required core modules, so always expected.
       'system' => array (
         'version' => VERSION,
@@ -191,6 +193,7 @@ class SkinrApiTestCase extends SkinrWebTestCase {
       // skinr_test has been installed.
       'skinr_test' => array(
         'directory' => 'skins',
+        'include file' => drupal_get_path('module', 'skinr_test') . '/skinr_test.skinr.inc',
       ),
       'skinr_test_basetheme' => array(
         'type' => 'theme',
