diff --git a/features.admin.inc b/features.admin.inc
index a4203a0..4c17258 100644
--- a/features.admin.inc
+++ b/features.admin.inc
@@ -88,6 +88,12 @@ function features_settings_form($form, $form_state) {
     '#default_value' => variable_get('features_rebuild_on_flush', TRUE),
     '#description' => t('If you have a large site with many features, you may experience lag on full cache clear. If disabled, features will rebuild only when viewing the features list or saving the modules list.'),
   );
+  $form['general']['features_manage_use_caching'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Use caching for Manage Features page'),
+    '#default_value' => variable_get('features_manage_use_caching', TRUE),
+    '#description' => t('If you have a large site with many features, you may experience long page loads on Manage Features page - this checkbox provides caching of that list and adds button to rebuild the cache to the form.'),
+  );
 
   return system_settings_form($form);
 }
@@ -203,7 +209,7 @@ function features_export_form($form, $form_state, $feature = NULL) {
     $form['advanced']['generate'] = array(
       '#type' => 'submit',
       '#value' => t('Generate feature'),
-      '#submit' => array('features_export_build_form_submit'),
+      '#submit' => array('features_export_build_form_submit', 'features_form_rebuild'),
     );
   }
   // build the Component Listing panel on the right
@@ -239,7 +245,7 @@ function features_export_form($form, $form_state, $feature = NULL) {
     '#type' => 'submit',
     '#value' => t('Download feature'),
     '#weight' => 10,
-    '#submit' => array('features_export_build_form_submit'),
+    '#submit' => array('features_export_build_form_submit', 'features_form_rebuild'),
   );
 
   $form['#attached']['library'][] = array('system', 'ui.dialog');
@@ -973,28 +979,14 @@ function features_filter_hidden($module) {
  * Form constructor for the features configuration form.
  */
 function features_admin_form($form, $form_state) {
-  // Load export functions to use in comparison.
-  module_load_include('inc', 'features', 'features.export');
-
-  // Clear & rebuild key caches
-  features_get_info(NULL, NULL, TRUE);
-  features_rebuild();
-
+  $features = _features_get_features();
   $modules = array_filter(features_get_modules(), 'features_filter_hidden');
-  $features = array_filter(features_get_features(), 'features_filter_hidden');
   $conflicts = features_get_conflicts();
 
-  foreach ($modules as $key => $module) {
-    if ($module->status && !empty($module->info['dependencies'])) {
-      foreach ($module->info['dependencies'] as $dependent) {
-        if (isset($features[$dependent])) {
-          $features[$dependent]->dependents[$key] = $module->info['name'];
-        }
-      }
-    }
-  }
+  // Load export functions to use in comparison.
+  module_load_include('inc', 'features', 'features.export');
 
-  if ( empty($features) ) {
+  if (empty($features) ) {
     $form['no_features'] = array(
       '#markup' => t('No Features were found. Please use the !create_link link to create
       a new Feature module, or upload an existing Feature to your modules directory.',
@@ -1124,6 +1116,23 @@ function features_admin_form($form, $form_state) {
   }
   ksort($form);
 
+  // Rebuild caches button.
+  if (variable_get('features_manage_use_caching', TRUE)) {
+    $form['rebuild'] = array(
+      '#weight' => -10,
+      '#type' => 'fieldset',
+    );
+    $form['rebuild']['description'] = array(
+      '#markup' => t('Caching of the Features on this form is turned on. You can rebuild the caches when necessary or turn off this setting on the !settings page.',
+          array('!settings' => l(t('settings'), 'admin/structure/features/settings'))) . '<br />',
+    );
+    $form['rebuild']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Rebuild Features List'),
+      '#submit' => array('features_form_rebuild'),
+    );
+  }
+
   // As of 7.0 beta 2 it matters where the "vertical_tabs" element lives on the
   // the array. We add it late, but at the beginning of the array because that
   // keeps us away from trouble.
@@ -1329,6 +1338,13 @@ function features_form_submit(&$form, &$form_state) {
 }
 
 /**
+ * Submit handler for the 'manage features' form rebuild button.
+ */
+function features_form_rebuild() {
+  cache_clear_all('features:features_list', 'cache');
+}
+
+/**
  * Form for clearing cache after enabling a feature.
  */
 function features_cleanup_form($form, $form_state, $cache_clear = FALSE) {
@@ -1588,3 +1604,45 @@ function _features_get_used($module_name = NULL) {
   $features_ignore_conflicts = $old_value;
   return $conflicts;
 }
+
+/**
+ * Retrieves the array of features as expected on the Manage Features form.
+ * Uses caching for performance reasons if caching is enabled.
+ *
+ * @internal - This function might return cached result with outdated data,
+ * use with caution.
+ */
+function _features_get_features() {
+  $use_caching = variable_get('features_manage_use_caching', TRUE);
+  $features = array();
+
+  if ($use_caching) {
+    $cache = cache_get('features:features_list');
+    $features = $cache->data;
+  }
+
+  if (!$use_caching || empty($features)) {
+    // Clear & rebuild key caches
+    features_get_info(NULL, NULL, TRUE);
+    features_rebuild();
+
+    $modules = array_filter(features_get_modules(), 'features_filter_hidden');
+    $features = array_filter(features_get_features(), 'features_filter_hidden');
+
+    foreach ($modules as $key => $module) {
+      if ($module->status && !empty($module->info['dependencies'])) {
+        foreach ($module->info['dependencies'] as $dependent) {
+          if (isset($features[$dependent])) {
+            $features[$dependent]->dependents[$key] = $module->info['name'];
+          }
+        }
+      }
+    }
+
+    if ($use_caching) {
+      cache_set('features:features_list', $features);
+    }
+  }
+
+  return $features;
+}
\ No newline at end of file
