diff --git a/features.module b/features.module
index 6d731ec..f815e5b 100644
--- a/features.module
+++ b/features.module
@@ -1088,6 +1088,7 @@ function features_hook_info() {
     'features_pipe_alter',
     'features_export_alter',
     'features_export_options_alter',
+    'features_pre_restore',
   );
   return array_fill_keys($hooks, array('group' => 'features'));
 }
diff --git a/includes/features.features.inc b/includes/features.features.inc
index c657bc8..d393229 100644
--- a/includes/features.features.inc
+++ b/includes/features.features.inc
@@ -71,3 +71,28 @@ function dependencies_features_rebuild($module) {
     }
   }
 }
+
+/**
+ * Implements hook_features_pre_restore().
+ *
+ * Ensure that dependencies are installed and ready before rebuilding/reverting
+ * a feature's components. For example: a new field type requires its own module
+ * to be installed before it is rebuilt/reverted.
+ */
+function features_features_pre_restore($op, $items) {
+  switch ($op) {
+    case 'rebuild':
+    case 'revert':
+      $dependencies = array();
+      foreach ($items as $module => $components) {
+        $feature = features_load_feature($module, TRUE);
+        if (!empty($feature->info['dependencies'])) {
+          $dependencies = array_merge($dependencies, $feature->info['dependencies']);
+        }
+      }
+      if ($dependencies = array_unique($dependencies)) {
+        features_install_modules($dependencies);
+      }
+      break;
+  }
+}
