diff --git a/features.admin.inc b/features.admin.inc
index 9139a35..765a00b 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',
           ),
         );
       }
@@ -195,10 +196,11 @@ function features_export_build_form_submit($form, &$form_state) {
       $stub[$component] = $form['#feature']->info['features'][$component];
     }
   }
+  $exclude = isset($_SESSION['features_exclude'][$form['form_build_id']['#value']]) ? $_SESSION['features_exclude'][$form['form_build_id']['#value']] : (isset($form['#feature']->info['exclude']) ? $form['#feature']->info['exclude'] : array());
 
   // Generate populated feature
   $module_name = $form_state['values']['module_name'];
-  $export = features_populate($stub, $form_state['values']['sources']['dependencies'], $module_name);
+  $export = features_populate($stub, array('dependencies' => $dependencies, 'exclude' => $exclude), $module_name);
 
   // Directly copy the following attributes
   $attr = array('name', 'description');
@@ -265,26 +267,45 @@ function features_export_build_form_submit($form, &$form_state) {
 function features_export_build_form_populate($form, $form_state) {
   module_load_include('inc', 'features', 'features.export');
   features_include();
+
   $stub = array();
   $submitted = $form_state['values'];
+  $autodetected = !empty($_SESSION['features_autodetected'][$form['form_build_id']['#value']]) ? $_SESSION['features_autodetected'][$form['form_build_id']['#value']] : array();
 
   // Assemble the combined component list
   $components = array_keys(features_get_components());
+  $clicked_component_type = $form_state['triggering_element']['#parents'][1];
+  $clicked_component_id = $form_state['triggering_element']['#parents'][2];
   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]));
+      // 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])) {
+    elseif (!empty($form['export']['sources'][$component]) && !empty($form['#feature']->info['features'][$component])) {
       $stub[$component] = $form['#feature']->info['features'][$component];
     }
+    if (!empty($stub[$component]) && !empty($autodetected[$component])) {
+      foreach ($stub[$component] as $key => $id) {
+        if (!empty($autodetected[$component][$id]) && !($clicked_component_type == $component && $id == $clicked_component_id)) {
+          unset($stub[$component][$key]);
+        }
+      }
+      if (empty($stub[$component])) {
+        unset($stub[$component]);
+      }
+    }
+  }
+
+  $exclude = isset($_SESSION['features_exclude'][$form['form_build_id']['#value']]) ? $_SESSION['features_exclude'][$form['form_build_id']['#value']] : (isset($form['#feature']->info['exclude']) ? $form['#feature']->info['exclude'] : array());
+
+  if (empty($form_state['triggering_element']['#value'])) {
+    $exclude[$clicked_component_type][] = $clicked_component_id;
+  }
+  elseif (!empty($exclude[$clicked_component_type]) && in_array($clicked_component_id, $exclude[$clicked_component_type])) {
+    $search = array_search($clicked_component_id, $exclude[$clicked_component_type]);
+    unset($exclude[$clicked_component_type][$search]);
   }
 
   // Assemble dependencies
@@ -292,7 +313,7 @@ function features_export_build_form_populate($form, $form_state) {
 
   // Generate populated feature
   $module_name = isset($form['#feature'], $form['#feature']->name) ? $form['#feature']->name : '';
-  $export = features_populate($stub, $dependencies, $module_name);
+  $export = features_populate($stub, array('dependencies' => $dependencies, 'exclude' => $exclude), $module_name);
 
   // Render component display
   $components_rendered = theme('features_components', array('info' => $export, 'sources' => $stub));
@@ -303,7 +324,30 @@ function features_export_build_form_populate($form, $form_state) {
   // values are preserved for the user.
   // form_set_cache($submitted['form_build_id'], $form, $form_state);
 
-  return $form['export']['features'];
+  // Need to update the values of the form
+  $set_value = $export['features'];
+  $set_value['dependencies'] = $export['dependencies'];
+  $autodetected = array();
+  foreach (features_get_components() as $component => $info) {
+    if (empty($stub[$component]) && !empty($set_value[$component])) {
+      $autodetected[$component] = $set_value[$component];
+    }
+    if (isset($form['export']['sources'][$component])) {
+      $form['export']['sources'][$component]['#value'] = isset($set_value[$component]) ? $set_value[$component] : array();
+      foreach ($form['export']['sources'][$component]['#options'] as $key => $title) {
+        if (!empty($set_value[$component][$key]) && empty($stub[$component][$key])) {
+          $autodetected[$component][$key] = $key;
+        }
+        $isset = isset($set_value[$component]) ? in_array($key, $set_value[$component]) : FALSE;
+        $form['export']['sources'][$component][$key]['#value'] = $isset? $key : FALSE;
+        $form['export']['sources'][$component][$key]['#checked'] = $isset;
+      }
+    }
+  }
+  $_SESSION['features_exclude'][$form['form_build_id']['#value']] = $exclude;
+  $_SESSION['features_autodetected'][$form['form_build_id']['#value']] = $autodetected;
+
+  return $form['export'];
 }
 
 /**
diff --git a/features.export.inc b/features.export.inc
index 93d36a3..7d71f76 100644
--- a/features.export.inc
+++ b/features.export.inc
@@ -5,13 +5,13 @@
  * @param $module_name
  * @return
  */
-function features_populate($items, $dependencies, $module_name) {
+function features_populate($items, $info) {
   // 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());
+  $stub = array('features' => array(), 'dependencies' => array(), 'conflicts' => array()) + $info;
   $export = _features_populate($items, $stub, $module_name);
 
   // Allow other modules to alter the export.
@@ -46,6 +46,10 @@ function _features_populate($pipe, &$export, $module_name = '') {
     static $processed = array();
     // Convert already defined items to dependencies.
     _features_resolve_dependencies($data, $export, $module_name, $component);
+    // Remove any excluded items.
+    if (!empty($export['exclude'][$component])) {
+      $data = array_diff($data, $export['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.
