diff --git a/features.admin.inc b/features.admin.inc
index 2dea423..94be1a9 100644
--- a/features.admin.inc
+++ b/features.admin.inc
@@ -608,13 +608,12 @@ function _features_export_build($feature, &$form_state) {
       $exported_components = !empty($exported_features_info[$component]) ? $exported_features_info[$component] : array();
       $new_components = !empty($new_features_info[$component]) ? $new_features_info[$component] : array();
 
-      // Find all default components that are not provided by this feature and
+      // Find all default components that are provided by other features and
       // strip them out of the possible options.
-      if ($map = features_get_default_map($component)) {
-        foreach ($map as $k => $v) {
-          if (isset($options[$k]) && (!isset($feature->name) || $v !== $feature->name)) {
-            unset($options[$k]);
-          }
+      $map = features_get_conflict_map($component);
+      foreach ($map as $k => $v) {
+        if ($v && (!isset($feature->name) || !in_array($feature->name, $v))) {
+          unset($options[$k]);
         }
       }
       foreach ($options as $key => $value) {
diff --git a/features.export.inc b/features.export.inc
index 5045b13..eb25e71 100644
--- a/features.export.inc
+++ b/features.export.inc
@@ -843,6 +843,24 @@ function features_get_default($component, $module_name = NULL, $alter = TRUE, $r
 }
 
 /**
+ * Get a map of components to their providing features.
+ */
+function features_get_conflict_map($component_type) {
+  if (!empty($GLOBALS['features_ignore_conflict'])) {
+    return array();
+  }
+
+  $map = &drupal_static(__FUNCTION__, array());
+  if (!isset($map[$component_type])) {
+    $map[$component_type] = array();
+    foreach (features_get_component_map($component_type) as $component => $modules) {
+      $map[$component_type] = array_filter($modules, 'module_exists');
+    }
+  }
+  return $map[$component_type];
+}
+
+/**
  * Get a map of components to their providing modules.
  *
  * @param string $component
diff --git a/features.module b/features.module
index 14fc3f9..560b774 100644
--- a/features.module
+++ b/features.module
@@ -1093,6 +1093,44 @@ function features_hook_info() {
 }
 
 /**
+ * Implements hook_ctools_plugin_api_alter().
+ *
+ * Force features default hooks to be executed after non-feature default hooks.
+ * So features can override module-provided defaults.
+ */
+function features_ctools_plugin_api_alter(&$modules, $owner, $api) {
+  // A datastructure for finding feature components based on $owner and $api.
+  features_include();
+  $components = _ctools_features_get_info();
+  $apis = [];
+  foreach ($components as $name => $c) {
+    $c['component'] = $name;
+    $apis[$c['module']][$c['api']] = $c;
+  }
+
+  if (isset($apis[$owner][$api])) {
+    // Split $modules into features and non-features based on whether the
+    // matching features component is declared in the modules .info file.
+    $component = $apis[$owner][$api]['component'];
+    $module_data = features_get_info();
+
+    $new_modules = array();
+    $features = array();
+
+    foreach ($modules as $name => $plugin) {
+      if (!empty($module_data[$name]->components) && in_array($component, $module_data[$name]->components)) {
+        $features[$name] = $plugin;
+      }
+      else {
+        $new_modules[$name] = $plugin;
+      }
+    }
+    // Non-features will be executed before features.
+    $modules = array_merge($new_modules, $features);
+  }
+}
+
+/**
  * Change vocabularies permission, from vocab id to machine name and vice versa.
  */
 function _user_features_change_term_permission(&$perm, $type = 'vid') {
