diff --git a/features.drush.inc b/features.drush.inc
index 0faa08f..39cad08 100644
--- a/features.drush.inc
+++ b/features.drush.inc
@@ -168,7 +168,7 @@ function drush_features_export() {
     }
   }
   elseif (count($args) > 1) {
-    // Assume that the user intends to create a new module based on a list of 
+    // Assume that the user intends to create a new module based on a list of
     // components. First argument is assumed to be the name.
     $name = array_shift($args);
     $stub = array();
diff --git a/features.export.inc b/features.export.inc
index 396bb0f..ed86238 100644
--- a/features.export.inc
+++ b/features.export.inc
@@ -236,7 +236,16 @@ function features_export_render($export, $module_name, $reset = FALSE) {
     }
 
     foreach ($hooks as $hook_name => $hook_code) {
-      $code[$file['name']][$hook_name] = features_export_render_defaults($module_name, $hook_name, $hook_code);
+      if (is_array($hook_code) && !empty($hook_code['#code'])) {
+        $code[$file['name']][$hook_name] = features_export_render_defaults($module_name, $hook_name, $hook_code['#code']);
+        if (!empty($hook_code['#files']) && is_array($hook_code['#files'])) {
+          foreach ($hook_code['#files'] as $machine_name => $small_code) {
+            $code[$component . '.' . $machine_name ] = array($small_code);
+          }
+        }
+      } else {
+        $code[$file['name']][$hook_name] = features_export_render_defaults($module_name, $hook_name, $hook_code);
+      }
     }
   }
 
@@ -604,7 +613,15 @@ function features_get_normal($component, $module_name, $reset = FALSE) {
       $default_hook = features_get_default_hooks($component);
       if ($module && $default_hook && isset($module->info['features'][$component]) && features_hook($component, 'features_export_render')) {
         $code = features_invoke($component, 'features_export_render', $module_name, $module->info['features'][$component], NULL);
-        $cache[$module_name][$component] = isset($code[$default_hook]) ? eval($code[$default_hook]) : FALSE;
+
+        // This isn't working properly
+        if (is_array($code[$default_hook]) && !empty($code[$default_hook]['#code'])) {
+          $code_export = $code[$default_hook]['#code'];
+        }
+        else {
+          $code_export = $code[$default_hook];
+        }
+        $cache[$module_name][$component] = isset($code[$code_export]) ? eval($code_export) : FALSE;
       }
     }
 
diff --git a/includes/features.ctools.inc b/includes/features.ctools.inc
index 08b9321..8024433 100644
--- a/includes/features.ctools.inc
+++ b/includes/features.ctools.inc
@@ -84,10 +84,10 @@ function ctools_features_export_render($module, $data) {
     $plugin_api_hook_name = ctools_plugin_api_get_hook($info['module'], $info['api']);
 
     if (key_exists($plugin_api_hook_name, $component_exports)) {
-        $component_exports[$plugin_api_hook_name] .= "\n" . implode("\n", $code);
+        $component_exports[$plugin_api_hook_name]['#code'] .= " \n" . implode("\n", $code);
     }
     else {
-        $component_exports[$plugin_api_hook_name] = implode("\n", $code);
+        $component_exports[$plugin_api_hook_name]['#code'] = implode("\n", $code);
     }
   }
 
@@ -167,6 +167,7 @@ function ctools_component_features_export($component, $data, &$export, $module_n
 function ctools_component_features_export_render($component, $module, $data) {
   ctools_include('export');
   $schema = ctools_export_get_schema($component);
+  $identifier = $schema['export']['identifier'];
 
   if (function_exists($schema['export']['to hook code callback'])) {
     $export = $schema['export']['to hook code callback']($data, $module);
@@ -178,17 +179,50 @@ function ctools_component_features_export_render($component, $module, $data) {
   }
   else {
     $code = '  $export = array();'."\n\n";
+    $files = array();
     foreach ($data as $object_name) {
+
+      $exportable = '';
       if ($object = _ctools_features_export_crud_load($component, $object_name)) {
-        $identifier = $schema['export']['identifier'];
-        $code .= _ctools_features_export_crud_export($component, $object, '  ');
-        $code .= "  \$export[" . ctools_var_export($object_name) . "] = \${$identifier};\n\n";
+        $exportable = _ctools_features_export_crud_export($component, $object, '  ');
+        if (variable_get('features_separate_files', TRUE)) {
+          $files[$object_name] = $exportable;
+        } else {
+          $code .= $exportable;
+          $code .= "  \$export[" . ctools_var_export($object_name) . "] = \${$identifier};\n\n";
+        }
       }
     }
+
+    if (variable_get('features_separate_files', TRUE) && is_array($data)) {
+
+      $code .= "  \$machine_names = array(\n";
+        foreach ($data as $object_name) {
+          $code .= "    '$object_name',\n";
+        }
+      $code .= "  );\n";
+
+      // Write the foreach loop.
+      $code .= "
+  foreach (\$machine_names as \$machine_name) {
+    \$path  = drupal_get_path('module', '$module') . '/$module.$component.' . \$machine_name . '.inc';
+    require \$path;
+
+    if (isset(\${$identifier})) {
+      \$export[ctools_var_export(\$machine_name)] = \${$identifier};
+    }
+  }\n\n";
+    }
+
     $code .= '  return $export;';
   }
 
-  return array($schema['export']['default hook'] => $code);
+  $return_array = array('#code' => $code);
+  if (!empty($files)) {
+    $return_array['#files'] = $files;
+  }
+
+  return array($schema['export']['default hook'] => $return_array);
 }
 
 /**
@@ -245,7 +279,7 @@ function _ctools_features_get_info($identifier = NULL, $reset = FALSE) {
       return $components[$identifier];
     }
     // New API identifier. Allows non-exportables related CTools APIs to be
-    // supported by an explicit `module:api:current_version` key. 
+    // supported by an explicit `module:api:current_version` key.
     else if (substr_count($identifier, ':') === 2) {
       list($module, $api, $current_version) = explode(':', $identifier);
       // If a schema component matches the provided identifier, provide that
