diff --git a/features.api.php b/features.api.php
index 5861fc5..249f679 100644
--- a/features.api.php
+++ b/features.api.php
@@ -48,6 +48,9 @@
  *
  *   'alter_hook': What the name of the alter hook for this component is.
  *    Do not include the '_alter' part. Defaults to 'default_hook'.
+ *
+ *   'weight': An optional weight for this component. Use this to set the order
+ *   in which operations on components will run. Defaults to 0.
  */
 function hook_features_api() {
   return array(
diff --git a/features.module b/features.module
index 6d731ec..954f5a6 100644
--- a/features.module
+++ b/features.module
@@ -559,6 +559,8 @@ function features_get_components($component = NULL, $key = NULL, $reset = FALSE)
     else {
       $components = module_invoke_all('features_api');
       drupal_alter('features_api', $components);
+      // Sort component types by weight.
+      uasort($components, 'drupal_sort_weight');
       cache_set('features_api', $components, 'cache_features');
     }
 
@@ -678,6 +680,7 @@ function features_get_info($type = 'module', $name = NULL, $reset = FALSE) {
       'module' => array(),
     );
     $ignored = variable_get('features_ignored_orphans', array());
+    $all_components = array_keys(features_get_components());
     $files = system_rebuild_module_data();
 
     foreach ($files as $row) {
@@ -718,10 +721,14 @@ function features_get_info($type = 'module', $name = NULL, $reset = FALSE) {
           }
         }
         $data['feature'][$row->name] = $row;
-        $data['feature'][$row->name]->components = array_keys($row->info['features']);
+        $components = array_keys($row->info['features']);
         if (!empty($row->info['dependencies'])) {
-          $data['feature'][$row->name]->components[] = 'dependencies';
+          $components[] = 'dependencies';
         }
+        // Sort $components by component weight using array_intersect() because
+        // $all_to preserve is already ordered in features_get_components().
+        // @see features_get_components()
+        $data['feature'][$row->name]->components = array_intersect($all_components, $components);
       }
       $data['module'][$row->name] = $row;
     }
diff --git a/includes/features.ctools.inc b/includes/features.ctools.inc
index 387cece..1e719db 100644
--- a/includes/features.ctools.inc
+++ b/includes/features.ctools.inc
@@ -234,7 +234,7 @@ function _ctools_features_get_info($identifier = NULL, $reset = FALSE) {
   static $components;
   if (!isset($components) || $reset) {
     $components = array();
-    $modules = features_get_info();
+    $modules = system_rebuild_module_data();
     ctools_include('export');
     drupal_static('ctools_export_get_schemas', NULL, $reset);
     foreach (ctools_export_get_schemas_by_module() as $module => $schemas) {
diff --git a/includes/features.features.inc b/includes/features.features.inc
index c657bc8..9874775 100644
--- a/includes/features.features.inc
+++ b/includes/features.features.inc
@@ -9,6 +9,7 @@ function features_features_api() {
       'name' => 'Dependencies',
       'feature_source' => TRUE,
       'duplicates' => FEATURES_DUPLICATES_ALLOWED,
+      'weight' => -10,
     ),
   );
 }
