diff --git a/features.export.inc b/features.export.inc
index 740a58a..bbef2c1 100644
--- a/features.export.inc
+++ b/features.export.inc
@@ -337,11 +337,13 @@ function features_get_default_hooks($component = NULL, $reset = FALSE) {
  * Return a code string representing an implementation of a defaults module hook.
  */
 function features_export_render_defaults($module, $hook, $code) {
+  // add argument for _alter functions
+  $args = (strrpos($hook,'_alter') === strlen($hook)-6) ? '&$data' : '';
   $output = array();
   $output[] = "/**";
   $output[] = " * Implements hook_{$hook}().";
   $output[] = " */";
-  $output[] = "function {$module}_{$hook}() {";
+  $output[] = "function {$module}_{$hook}({$args}) {";
   $output[] = $code;
   $output[] = "}";
   return implode("\n", $output);
diff --git a/features.module b/features.module
index c2a5c1e..e8edd8a 100644
--- a/features.module
+++ b/features.module
@@ -317,6 +317,7 @@ function features_include($reset = FALSE) {
 
     // Clear static cache, since we've now included new implementers.
     module_implements('features_api', FALSE, TRUE);
+    features_include_overrides();
   }
 }
 
@@ -345,7 +346,7 @@ function features_include_defaults($components = NULL, $reset = FALSE) {
   }
   // Use all include components if none are explicitly specified.
   else {
-    $components = $include_components;
+    $components = array_keys($include_components);
   }
   foreach ($components as $component) {
     if (isset($include_components[$component]) && (!isset($included[$component]) || $reset)) {
@@ -374,6 +375,28 @@ function features_include_defaults($components = NULL, $reset = FALSE) {
 }
 
 /**
+ * Load features includes for all components that always require includes 
+ */
+function features_include_overrides($reset = FALSE) {
+  static $included = array();
+  static $include_components;
+  if (!isset($include_components) || $reset) {
+    $include_components = features_get_components();
+  }
+  foreach ($include_components as $component => $info) {
+    if ((!isset($included[$component]) || $reset) && ($info['include_file'])) {
+      $features = isset($features) ? $features : features_get_features(NULL, $reset);
+      foreach ($features as $feature) {
+        if (isset($feature->info['features'][$component])) {
+          module_load_include('inc', $feature->name, "{$feature->name}.features.{$component}");
+        }
+      }
+    $included[$component] = TRUE;
+    }
+  }
+}
+
+/**
  * Feature object loader.
  */
 function feature_load($name, $reset = FALSE) {
@@ -868,3 +891,10 @@ function features_hook_info() {
   );
   return $hooks;
 }
+
+/** 
+ * called by various exportables to allow other modules to alter the data
+ */
+function features_alter_component(&$data, $component, $hook = '') {
+  drupal_alter('features_'.$component, $data);
+}
diff --git a/includes/features.field.inc b/includes/features.field.inc
index 96b22b4..172a746 100644
--- a/includes/features.field.inc
+++ b/includes/features.field.inc
@@ -123,6 +123,9 @@ function field_features_export_render($module, $data, $export = NULL) {
   if (!empty($translatables)) {
     $code[] = features_translatables_export($translatables, '  ');
   }
+  
+  // call alter hooks for fields data
+  $code[] = "  features_alter_component(\$fields, 'field');";
   $code[] = '  return $fields;';
   $code = implode("\n", $code);
   return array('field_default_fields' => $code);
@@ -156,7 +159,9 @@ function field_features_revert($module) {
  * Rebuilds fields from code defaults.
  */
 function field_features_rebuild($module) {
-  if ($fields = features_get_default('field', $module)) {
+  // make sure we are using the most current code
+  // call features_get_default with reset=TRUE to use new code and not cached
+  if ($fields = features_get_default('field', $module, TRUE, TRUE)) {
     field_info_cache_clear();
 
     foreach ($fields as $field) {
