diff --git a/bean.api.php b/bean.api.php
index 4094cdd..f8d1b93 100644
--- a/bean.api.php
+++ b/bean.api.php
@@ -64,3 +64,11 @@ function hook_bean_access($bean, $op, $account) {
 function hook_bean_form_submit($form, $form_state) {
 
 }
+
+/**
+ * Implements hook_bean_cache_clear().
+ */
+function hook_bean_cache_clear() {
+
+}
+
diff --git a/bean.module b/bean.module
index 0bdeaf6..6973836 100644
--- a/bean.module
+++ b/bean.module
@@ -291,29 +291,38 @@ function bean_fetch_plugin_info($plugin = NULL) {
 }
 
 /**
- * Reset the static variables and caches
+ * Reset the static variables and caches.
  */
 function bean_reset() {
-  ctools_include('plugins');
   // Clear ctools cache.
+  ctools_include('plugins');
   ctools_get_plugins_reset();
-  drupal_static_reset('ctools_plugins');
-  drupal_static_reset('ctools_plugin_type_info_loaded');
-  drupal_static_reset('ctools_plugin_type_info');
+  cache_clear_all('plugins:bean:types', 'cache');
+  cache_clear_all('ctools_plugin_files', 'cache', TRUE);
 
-  // Clear the bean cache.
+  // Invoke modules to clear their caches.
+  foreach (module_implements('bean_cache_clear') as $module) {
+    module_invoke($module, 'bean_cache_clear');
+  }
+
+  // Rebuild ctools plugin types and the menu.
+  ctools_plugin_get_plugin_type_info(TRUE);
+  menu_rebuild();
+}
+
+/**
+ * Implements hook_bean_cache_clear().
+ */
+function bean_bean_cache_clear() {
+  // Clear static variables.
+  drupal_static_reset('bean_access');
+  drupal_static_reset('bean_get_types');
+  drupal_static_reset('bean_get_all_beans');
   drupal_static_reset('bean_fetch_plugin_info');
   drupal_static_reset('bean_load_plugin_class');
 
-  // Flush plugin caches and rebuild the menu
+  // Flush caches.
   cache_clear_all('bean_plugins', 'cache');
-  cache_clear_all('ctools_plugin_type_info', 'cache');
-  cache_clear_all('ctools_plugin_files', 'cache', TRUE);
-  cache_clear_all('plugins', 'cache', TRUE);
-  cache_clear_all('bean_types', 'cache');
-  cache_clear_all('entity_info', 'cache', TRUE);
-
-  menu_rebuild();
 }
 
 /**
diff --git a/bean_admin_ui/bean_admin_ui.info b/bean_admin_ui/bean_admin_ui.info
index 2ae3191..a9c3842 100644
--- a/bean_admin_ui/bean_admin_ui.info
+++ b/bean_admin_ui/bean_admin_ui.info
@@ -4,6 +4,5 @@ core = 7.x
 files[] = bean_admin_ui.module
 dependencies[] = bean
 files[] = plugins/custom.inc
-files[] = includes/features.inc
 configure = admin/structure/block-types
 package = Bean
diff --git a/bean_admin_ui/bean_admin_ui.module b/bean_admin_ui/bean_admin_ui.module
index 0fc472e..c42370d 100644
--- a/bean_admin_ui/bean_admin_ui.module
+++ b/bean_admin_ui/bean_admin_ui.module
@@ -5,6 +5,8 @@
  * Bean Admin UI
  */
 
+module_load_include('inc', 'bean_admin_ui', 'includes/features');
+
 /**
  * Implements hook_menu().
  */
@@ -80,9 +82,8 @@ function bean_admin_ui_bean_types_api_info() {
 function bean_admin_ui_bean_types() {
   $plugins = array();
 
-
   // Add in the types defined in the UI.
-  $bean_types = bean_admin_ui_get_types();
+  $bean_types = ctools_export_load_object('bean_type');
 
   foreach ($bean_types as $bean_type) {
     $plugins[$bean_type->name] = array(
@@ -99,34 +100,14 @@ function bean_admin_ui_bean_types() {
 }
 
 /**
- * Get The Bean Types
+ * Implements hook_bean_cache_clear().
  */
-function bean_admin_ui_get_types() {
-  $bean_types = &drupal_static(__FUNCTION__);
-
-  if (empty($bean_types)) {
-    $cache = cache_get('bean_types');
-    if (empty($cache->data)) {
-      // In install profiles, this function can get called before Drupal's created
-      // our database tables (see http://drupal.org/node/1179420), so don't crash
-      // Drupal installation by trying to get bean types; if we did, we'd query a
-      // nonexistent table.
-      if (defined('MAINTENANCE_MODE') && MAINTENANCE_MODE == 'install' &&
-        drupal_get_installed_schema_version('bean_admin_ui', TRUE) == SCHEMA_UNINSTALLED) {
-        $bean_types = array();
-      }
-      else {
-        ctools_include('export');
-        $bean_types = ctools_export_load_object('bean_type');
-        cache_set('bean_types', $bean_types);
-      }
-    }
-    else {
-      $bean_types = $cache->data;
-    }
-  }
+function bean_admin_ui_bean_cache_clear() {
+  // Clear ctools cache.
+  ctools_export_load_object_reset('bean_type');
 
-  return $bean_types;
+  // Flush caches.
+  cache_clear_all('bean_types', 'cache');
 }
 
 /**
diff --git a/bean_admin_ui/includes/features.inc b/bean_admin_ui/includes/features.inc
index 858b552..3dce3ec 100644
--- a/bean_admin_ui/includes/features.inc
+++ b/bean_admin_ui/includes/features.inc
@@ -18,3 +18,11 @@ function bean_admin_ui_features_pipe_bean_type_alter(&$pipe, $data, $export) {
     }
   }
 }
+
+/**
+ * Implements {component}_features_revert().
+ */
+function bean_type_features_revert($module, $component) {
+  ctools_component_features_revert($component, $module);
+  bean_reset();
+}
diff --git a/bean_admin_ui/plugins/custom.inc b/bean_admin_ui/plugins/custom.inc
index 4af6294..d8c417c 100644
--- a/bean_admin_ui/plugins/custom.inc
+++ b/bean_admin_ui/plugins/custom.inc
@@ -39,7 +39,6 @@ class BeanCustom extends BeanPlugin {
 
     $primary_key = $new == FALSE ? 'name' : array();
     drupal_write_record('bean_type', $bean_type, $primary_key);
-    drupal_static_reset('bean_admin_ui_get_types');
 
     bean_reset();
   }
