diff --git a/features.admin.inc b/features.admin.inc
index fd996c5..443292e 100644
--- a/features.admin.inc
+++ b/features.admin.inc
@@ -78,7 +78,25 @@ function features_export_form($form, $form_state, $feature = NULL) {
     '#type' => 'fieldset',
     '#tree' => FALSE,
     '#theme' => 'features_form_export',
+    '#attributes' => array('id' => array('features-export-wrapper')),
   );
+
+  $form['export']['preview'] = array(
+    '#type' => 'submit',
+    '#value' => t('Preview'),
+    '#attributes' => array(
+      'title' => t("Show a preview of what will be exported, including auto detected items."),
+    ),
+    '#weight' => -1,
+    '#limit_validation_errors' => array(array('sources')),
+    '#submit' => array('features_export_form_rebuild'),
+    '#ajax' => array(
+      'callback' => 'features_export_build_form_populate',
+      'wrapper' => 'features-export-wrapper',
+      'effect' => 'fade',
+    ),
+  );
+
   $form['export']['components'] = array(
     '#title' => t('Edit components'),
     '#type' => 'select',
@@ -119,10 +137,6 @@ function features_export_form($form, $form_state, $feature = NULL) {
           '#options' => features_dom_encode_options($options),
           '#title' => $component,
           '#default_value' => features_dom_encode_options($default_value, FALSE),
-          '#ajax' => array(
-            'callback' => 'features_export_build_form_populate',
-            'wrapper' => 'features-export-contents',
-          ),
         );
       }
       else {
@@ -134,11 +148,13 @@ function features_export_form($form, $form_state, $feature = NULL) {
       }
     }
   }
+
+  $base = isset($feature->info['features_base']) ? $feature->info['features_base'] : (isset($feature->info['features']) ? $feature->info['features'] : array());
   $form['export']['features'] = array(
     '#tree' => TRUE,
     '#prefix' => "<div id='features-export-populated'><div id='features-export-contents'>",
     '#suffix' => "</div></div>",
-    '#markup' => !empty($feature->info) ? theme('features_components', array('info' => $feature->info, 'sources' => $feature->info['features'])) : "<div class='placeholder'></div>",
+    '#markup' => !empty($feature->info) ? theme('features_components', array('info' => $feature->info, 'sources' => $base)) : "<div class='placeholder'></div>",
   );
 
   $form['buttons'] = array('#theme' => 'features_form_buttons', '#tree' => FALSE);
@@ -148,9 +164,22 @@ function features_export_form($form, $form_state, $feature = NULL) {
     '#weight' => 10,
     '#submit' => array('features_export_build_form_submit'),
   );
+
+  // Calculate preview or ajax changes.
+  if (isset($form_state['values'])) {
+    features_form_build_feature($form, $form_state);
+  }
+
   return $form;
 }
 
+ /**
+ * Tells the ajax form submission to rebuild form state.
+ */
+function features_export_form_rebuild($form, &$form_state) {
+  $form_state['rebuild'] = TRUE;
+}
+
 /**
  * Validation for project field.
  */
@@ -184,26 +213,8 @@ function features_export_form_validate_field($element, &$form_state) {
  * Submit handler for features_export_form_build().
  */
 function features_export_build_form_submit($form, &$form_state) {
-  module_load_include('inc', 'features', 'features.export');
-  features_include();
-
-  // Assemble the combined component list
-  $stub = array();
-  $components = array_keys(features_get_components());
-  foreach ($components as $component) {
-    // User-selected components take precedence.
-    if (!empty($form_state['values']['sources'][$component])) {
-      $stub[$component] = features_dom_decode_options(array_filter($form_state['values']['sources'][$component]));
-    }
-    // Only fallback to an existing feature's values if there are no export options for the component.
-    else if (!empty($form['#feature']->info['features'][$component])) {
-      $stub[$component] = $form['#feature']->info['features'][$component];
-    }
-  }
-
-  // Generate populated feature
+  $export = features_form_build_feature($form, $form_state, FALSE);
   $module_name = $form_state['values']['module_name'];
-  $export = features_populate($stub, $form_state['values']['sources']['dependencies'], $module_name);
 
   // Directly copy the following attributes
   $attr = array('name', 'description', 'package');
@@ -268,47 +279,132 @@ function features_export_build_form_submit($form, &$form_state) {
  * AHAH handler for features_export_form_build().
  */
 function features_export_build_form_populate($form, $form_state) {
+  // @TODO: Reimplement this for D7.
+  // Re-cache form. This ensures that if the form fails to validate, selected
+  // values are preserved for the user.
+  // form_set_cache($submitted['form_build_id'], $form, $form_state);
+  // Change
+
+  // Set the changed values for the form.
+  foreach (features_get_components() as $component => $info) {
+    if (isset($form['export']['sources'][$component])) {
+      $form['export']['sources'][$component]['#value'] = isset($form_state['features_export'][$component]) ? $form_state['features_export'][$component] : array();
+      foreach ($form['export']['sources'][$component]['#options'] as $key => $title) {
+         $isset = isset($form_state['features_export'][$component]) ? in_array($key, $form_state['features_export'][$component]) : FALSE;
+        $form['export']['sources'][$component][$key]['#value'] = $isset? $key : FALSE;
+        $form['export']['sources'][$component][$key]['#checked'] = $isset;
+      }
+    }
+  }
+
+  return $form['export'];
+}
+
+/**
+ * Calculates the new export and adds preview.
+ */
+function features_form_build_feature(&$form, &$form_state, $render_preview = TRUE) {
   module_load_include('inc', 'features', 'features.export');
   features_include();
-  $stub = array();
-  $submitted = $form_state['values'];
 
-  // Assemble the combined component list
+  // All possible components.
   $components = array_keys(features_get_components());
+
+  $submitted = isset($form_state['values']) ? $form_state['values'] : array();
+
+  $exported_features_info = !empty($form['#feature']->info['features']) ? $form['#feature']->info['features'] : array();
+  $exported_features_info['dependencies'] = !empty($form['#feature']->info['dependencies']) ? $form['#feature']->info['dependencies'] : array();
+
+  // This is base user selection from which autoadditions are added.
+  $base = !empty($form_state['features_base']) ? $form_state['features_base'] : (isset($form['#feature']->info['features_base']) ? $form['#feature']->info['features_base'] : $exported_features_info);
+
+  // This is the last calculated full export.
+  $old_export = !empty($form_state['features_export']) ? $form_state['features_export'] : $exported_features_info;
+
+  // This is items excluded from the export.
+  $exclude = isset($form_state['features_exclude']) ? $form_state['features_exclude'] : (isset($form['#feature']->info['features_exclude']) ? $form['#feature']->info['features_exclude'] : array());
+
+  // Finds what items have since been added or removed from export by comparing
+  // last export to current values.
+  $deletions = array();
   foreach ($components as $component) {
+    $new_component_export = FALSE;
     // User-selected components take precedence.
-    if (!empty($submitted['sources'][$component])) {
-      // Validate and set the default value for each selected option. This
-      foreach ($submitted['sources'][$component] as $key => $value) {
-        if (isset($form['export']['sources'][$component]['#options'][$key])) {
-          $form['export']['sources'][$component]['#default_value'][$key] = $value;
-        }
-      }
-      $stub[$component] = features_dom_decode_options(array_filter($submitted['sources'][$component]));
+    if (isset($submitted['sources'][$component])) {
+      $new_component_export = features_dom_decode_options(array_filter($submitted['sources'][$component]));
+      // Remove any autodetected items. They should be redetected.
     }
     // Only fallback to an existing feature's values if there are no export options for the component.
-    else if (!empty($form['export']['sources'][$component]) && !empty($form['#feature']->info['features'][$component])) {
-      $stub[$component] = $form['#feature']->info['features'][$component];
+    elseif (!empty($form['export']['sources'][$component]) && !empty($form['#feature']->info['features'][$component])) {
+      $new_component_export = $form['#feature']->info['features'][$component];
+    }
+
+    if ($new_component_export && !empty($old_export[$component])) {
+      if ($added_items = array_diff($new_component_export, $old_export[$component])) {
+        $base[$component] = isset($base[$component]) ? $base[$component] : array();
+        $base[$component] = array_merge($added_items, $base[$component]);
+      }
+      if ($deleted_items = array_diff($old_export[$component], $new_component_export)) {
+        $deletions[$component] = $deleted_items;
+      }
+    }
+    elseif (!empty($new_component_export)) {
+      $base[$component] = isset($base[$component]) ? $base[$component] : array();
+      $base[$component] = array_merge($new_component_export, $base[$component]);
+    }
+    elseif (!empty($old_export[$component])) {
+      $deletions[$component] = $old_export[$component];
+    }
+
+    // Need to clear out exclude if component readded.
+    if (!empty($exclude[$component]) && !empty($base[$component])) {
+      $exclude[$component] = array_diff($exclude[$component], $base[$component]);
     }
   }
 
   // Assemble dependencies
-  $dependencies = isset($submitted['sources']['dependencies']) ? $submitted['sources']['dependencies'] : array();
+  $dependencies = isset($base['dependencies']) ? $base['dependencies'] : array();
+  $module_name = isset($form['#feature'], $form['#feature']->name) ? $form['#feature']->name : '';
 
   // Generate populated feature
-  $module_name = isset($form['#feature'], $form['#feature']->name) ? $form['#feature']->name : '';
-  $export = features_populate($stub, $dependencies, $module_name);
+  $export = features_populate($base, array('dependencies' => $dependencies, 'features_exclude' => $exclude), $module_name);
+
+  $export_features = $export['features'];
+  $export_features['dependencies'] = $export['dependencies'];
+
+  // If any the removed items were readded, need to add them to exclude.
+  $recalculate = FALSE;
+  if (!empty($deletions)) {
+    foreach ($deletions as $component => $deleted_items) {
+      if (!empty($export_features[$component]) && ($new_excluded_items = array_intersect($deleted_items, $export_features[$component]))) {
+        $exclude[$component] = isset($exclude[$component]) ? $exclude[$component] : array();
+        $exclude[$component] = array_unique(array_merge($exclude[$component], $new_excluded_items));
+        if (isset($base[$component])) {
+          $base[$component] = array_diff($base[$component], $exclude[$component]);
+        }
+        $recalculate = TRUE;
+      }
+    }
+  }
 
-  // Render component display
-  $components_rendered = theme('features_components', array('info' => $export, 'sources' => $stub));
-  $form['export']['features']['#markup'] = $components_rendered;
+  // If new excluded items, need to recalculate export.
+  if ($recalculate) {
+    $export = features_populate($base, array('dependencies' => $dependencies, 'features_exclude' => $exclude), $module_name);
+    $export_features = $export['features'];
+    $export_features['dependencies'] = $export['dependencies'];
+  }
 
-  // @TODO: Reimplement this for D7.
-  // Re-cache form. This ensures that if the form fails to validate, selected
-  // values are preserved for the user.
-  // form_set_cache($submitted['form_build_id'], $form, $form_state);
+  // Render component display
+  if ($render_preview) {
+    $components_rendered = theme('features_components', array('info' => $export, 'sources' => $base));
+    $form['export']['features']['#markup'] = $components_rendered;
+  }
 
-  return $form['export']['features'];
+  // Store information for next ajax call.
+  $form_state['features_exclude'] = $exclude;
+  $form_state['features_base'] = $base;
+  $form_state['features_export'] = $export_features;
+  return $export;
 }
 
 /**
@@ -332,7 +428,7 @@ function features_admin_form($form, $form_state) {
   $modules = array_filter(features_get_modules(), 'features_filter_hidden');
   $features = array_filter(features_get_features(), 'features_filter_hidden');
   $conflicts = features_get_conflicts();
-    
+
   foreach ($modules as $key => $module) {
     if ($module->status && !empty($module->info['dependencies'])) {
       foreach ($module->info['dependencies'] as $dependent) {
@@ -346,7 +442,7 @@ function features_admin_form($form, $form_state) {
   if ( empty($features) ) {
     $form['no_features'] = array(
       '#markup' => t('No Features were found. Please use the !create_link link to create
-      a new Feature module, or upload an existing Feature to your modules directory.', 
+      a new Feature module, or upload an existing Feature to your modules directory.',
       array('!create_link' => l(t('Create Feature'), 'admin/structure/features/create'))),
     );
     return $form ;
@@ -523,7 +619,7 @@ function features_admin_components($form, $form_state, $feature) {
   $form['#conflicts'] = $conflicts;
 
   $review = $revert = FALSE;
-    
+
   // Iterate over components and retrieve status for display
   $states = features_get_component_states(array($feature->name), FALSE);
   $form['revert']['#tree'] = TRUE;
@@ -549,7 +645,7 @@ function features_admin_components($form, $form_state, $feature) {
     else {
       $path = NULL;
     }
-      
+
     $storage = FEATURES_DEFAULT;
     if (array_key_exists($component, $states[$feature->name])) {
       $storage = $states[$feature->name][$component];
@@ -778,7 +874,7 @@ function features_feature_diff($feature, $component = NULL) {
 
     module_load_include('inc', 'diff', 'diff.engine');
     $formatter = new DrupalDiffFormatter();
-    
+
     $rows = array();
     foreach ($overrides as $component => $items) {
       $rows[] = array(array('data' => $component, 'colspan' => 4, 'header' => TRUE));
diff --git a/features.drush.inc b/features.drush.inc
index a9658ad..0a78212 100644
--- a/features.drush.inc
+++ b/features.drush.inc
@@ -423,7 +423,7 @@ function drush_features_export() {
     if (($feature = feature_load($module, TRUE)) && module_exists($module)) {
       module_load_include('inc', 'features', 'features.export');
       _features_populate($items, $feature->info, $feature->name);
-      _drush_features_export($feature->info['features'], $feature->info['dependencies'], $feature->name, dirname($feature->filename));
+      _drush_features_export($feature->info['features'], $feature->info, $feature->name, dirname($feature->filename));
     }
     elseif ($feature) {
       _features_drush_set_error($module, 'FEATURES_FEATURE_NOT_ENABLED');
@@ -464,7 +464,7 @@ function drush_features_update() {
   if ($args = func_get_args()) {
     foreach ($args as $module) {
       if (($feature = feature_load($module, TRUE)) && module_exists($module)) {
-        _drush_features_export($feature->info['features'], $feature->info['dependencies'], $feature->name, dirname($feature->filename));
+        _drush_features_export($feature->info['features'], $feature->info, $feature->name, dirname($feature->filename));
       }
       else if ($feature) {
         _features_drush_set_error($module, 'FEATURES_FEATURE_NOT_ENABLED');
@@ -515,7 +515,7 @@ function drush_features_update_all() {
  * @param $module_name
  *  Optional. The name for the exported module.
  */
-function _drush_features_export($stub, $dependencies, $module_name = NULL, $directory = NULL) {
+function _drush_features_export($stub, $info, $module_name = NULL, $directory = NULL) {
   $root = drush_get_option(array('r', 'root'), drush_locate_root());
   if ($root) {
     $destination = drush_get_option(array('destination'), 'sites/all/modules');
@@ -532,7 +532,7 @@ function _drush_features_export($stub, $dependencies, $module_name = NULL, $dire
     if (is_dir($directory)) {
       drupal_flush_all_caches();
       module_load_include('inc', 'features', 'features.export');
-      $export = features_populate($stub, $dependencies, $module_name);
+      $export = features_populate($stub, $info, $module_name);
       if (!feature_load($module_name)) {
         $export['name'] = $module_name;
       }
diff --git a/features.export.inc b/features.export.inc
index 68c2da2..c5d0b72 100644
--- a/features.export.inc
+++ b/features.export.inc
@@ -5,14 +5,14 @@
  * @param $module_name
  * @return
  */
-function features_populate($items, $dependencies, $module_name) {
+function features_populate($items, $info, $module_name) {
   // Sanitize items.
   $items = array_filter($items);
-  $items['dependencies'] = drupal_map_assoc(array_filter($dependencies));
+  $items['dependencies'] = !empty($info['dependencies']) ? drupal_map_assoc(array_filter($info['dependencies'])) : array();
 
   // Populate stub
-  $stub = array('features' => array(), 'dependencies' => array(), 'conflicts' => array());
-  $export = _features_populate($items, $stub, $module_name);
+  $stub = array('features' => array(), 'dependencies' => array(), 'conflicts' => array(), 'features_base' => $items) + $info + array('features_exclude' => array());
+  $export = _features_populate($items, $stub, $module_name, TRUE);
 
   // Add Features API version. Any module with this entry in the .info file
   // will be treated as a Feature and included in the admin/build/features UI.
@@ -27,6 +27,8 @@ function features_populate($items, $dependencies, $module_name) {
   }
   ksort($export['features']);
   ksort($export['dependencies']);
+  ksort($export['features_base']);
+  ksort($export['features_exclude']);
 
   return $export;
 }
@@ -44,12 +46,22 @@ function features_populate($items, $dependencies, $module_name) {
  *
  * @return fully populated $export array.
  */
-function _features_populate($pipe, &$export, $module_name = '') {
+function _features_populate($pipe, &$export, $module_name = '', $reset = FALSE) {
+  static $processed = array();
   features_include();
+  if ($reset) {
+    $processed = array();
+  }
   foreach ($pipe as $component => $data) {
-    static $processed = array();
     // Convert already defined items to dependencies.
     _features_resolve_dependencies($data, $export, $module_name, $component);
+    // Remove any excluded items.
+    if (!empty($export['features_exclude'][$component])) {
+      $data = array_diff($data, $export['features_exclude'][$component]);
+      if ($component == 'dependencies' && !empty($export['dependencies'])) {
+        $export['dependencies'] = array_diff($export['dependencies'], $export['features_exclude'][$component]);
+      }
+    }
     if (!empty($data) && $function = features_hook($component, 'features_export')) {
       // Pass module-specific data and export array.
       // We don't use features_invoke() here since we need to pass $export by reference.
@@ -319,7 +331,7 @@ function features_detect_overrides($module) {
   }
   if (!isset($cache[$module->name])) {
     // Rebuild feature from .info file description and prepare an export from current DB state.
-    $export = features_populate($module->info['features'], $module->info['dependencies'], $module->name);
+    $export = features_populate($module->info['features'], $module->info, $module->name);
     $export = features_export_prepare($export, $module->name);
 
     $overridden = array();
diff --git a/features.js b/features.js
index 520e98e..5aeace3 100644
--- a/features.js
+++ b/features.js
@@ -28,7 +28,7 @@
             $('div.features-select').hide();
             $('div.features-select-' + target).show();
             return false;
-        });
+        }).trigger('change');
       });
 
       // Export form machine-readable JS
diff --git a/theme/theme.inc b/theme/theme.inc
index 36021c8..b5e90cf 100644
--- a/theme/theme.inc
+++ b/theme/theme.inc
@@ -228,7 +228,7 @@ function theme_features_form_export(&$vars) {
   $output = '';
   $output .= "<div class='clearfix features-components'>";
   $output .= "<div class='column'>" . drupal_render($vars['form']['components']) . drupal_render($vars['form']['sources']) . "</div>";
-  $output .= "<div class='column'>" . drupal_render($vars['form']['features']) . "</div>";
+  $output .= "<div class='column'>" . drupal_render($vars['form']['preview']) . drupal_render($vars['form']['features']) . "</div>";
   $output .= "</div>";
   $output .= drupal_render_children($vars['form']);
   return $output;
