diff --git a/features.admin.inc b/features.admin.inc
index 9139a35..5c89760 100644
--- a/features.admin.inc
+++ b/features.admin.inc
@@ -73,6 +73,7 @@ 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']['components'] = array(
     '#title' => t('Edit components'),
@@ -116,7 +117,7 @@ function features_export_form($form, $form_state, $feature = NULL) {
           '#default_value' => features_dom_encode_options($default_value, FALSE),
           '#ajax' => array(
             'callback' => 'features_export_build_form_populate',
-            'wrapper' => 'features-export-contents',
+            'wrapper' => 'features-export-wrapper',
           ),
         );
       }
@@ -143,6 +144,12 @@ 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;
 }
 
@@ -179,26 +186,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');
@@ -263,47 +252,123 @@ 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'];
+}
+
+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();
+
+  // 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) {
     // 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 (!empty($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));
+        $recalculate = TRUE;
+      }
+    }
+  }
 
-  // Render component display
-  $components_rendered = theme('features_components', array('info' => $export, 'sources' => $stub));
-  $form['export']['features']['#markup'] = $components_rendered;
+  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;
 }
 
 /**
diff --git a/features.export.inc b/features.export.inc
index 93d36a3..a6fc264 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);
 
   // Allow other modules to alter the export.
   drupal_alter('features_export', $export, $module_name);
@@ -23,6 +23,8 @@ function features_populate($items, $dependencies, $module_name) {
   }
   ksort($export['features']);
   ksort($export['dependencies']);
+  ksort($export['features_base']);
+  ksort($export['features_exclude']);
 
   return $export;
 }
@@ -40,12 +42,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.
