diff --git a/includes/flag.admin.inc b/includes/flag.admin.inc
index 4ab59d6..926a993 100644
--- a/includes/flag.admin.inc
+++ b/includes/flag.admin.inc
@@ -668,7 +668,7 @@ function flag_form_submit($form, &$form_state) {
   $flag->enable();
   drupal_set_message(t('Flag @title has been saved.', array('@title' => $flag->get_title())));
   // We clear caches more vigorously if the flag was new.
-  _flag_clear_cache(!empty($flag->is_new));
+  _flag_clear_cache($flag->entity_type, !empty($flag->is_new));
 
   // Save permissions.
   // This needs to be done after the flag cache has been cleared, so that
@@ -753,7 +753,7 @@ function flag_delete_confirm_submit($form, &$form_state) {
   if ($form_state['values']['confirm']) {
     $flag->delete();
     $flag->disable();
-    _flag_clear_cache(TRUE);
+    _flag_clear_cache($flag->entity_type, TRUE);
   }
   drupal_set_message(t('Flag @name has been deleted.', array('@name' => $flag->get_title())));
   $form_state['redirect'] = FLAG_ADMIN_PATH;
@@ -771,26 +771,44 @@ function flag_check_link_types($element) {
 }
 
 /**
- * Clears various caches when a flag is modified.
+ * Clears various caches when one or more flags are modified.
  *
- * @param $clear_entity_info
- *  Whether to also clear the entity info cache. This is needed when adding or
- *  deleting a flag, as this changes the bundles on the flagging entity. In
+ * @param $entity_types
+ *  The entity types for the flags. May be a single value or an array.
+ * @param $is_insert_or_delete
+ *  Whether the modified flag is being inserted (saved for the first time) or
+ *  deleted. This results in a more vigorous clearing of caches. In
  *  particular, when no flags exist yet, no Field admin UI paths exist and these
  *  need to be created.
  */
-function _flag_clear_cache($clear_entity_info = FALSE) {
+function _flag_clear_cache($entity_types, $is_insert_or_delete = FALSE) {
+  if (!is_array($entity_types)) {
+    $entity_types = array($entity_types);
+  }
+
   // Reset our flags cache, thereby making the following code aware of the
   // modifications.
   drupal_static_reset('flag_get_flags');
 
-  if ($clear_entity_info) {
+  if ($is_insert_or_delete) {
+    // A new or deleted flag means we are changing bundles on the Flagging
+    // entity, and thus need to clear the entity info cache.
     entity_info_cache_clear();
   }
 
+  // Clear FieldAPI's field_extra cache, so our changes to pseudofields are
+  // noticed. It's rather too much effort to both a) check whether the
+  // pseudofield setting has changed either way, and b) specifically clear just
+  // the bundles that are (or were!!) affected, so we just clear for all bundles
+  // on our entity type regardlesss.
+  foreach ($entity_types as $entity_type) {
+    cache_clear_all("field_info:bundle_extra:$entity_type:", 'cache_field', TRUE);
+  }
+
   if (module_exists('views')) {
     views_invalidate_cache();
   }
+
   // The title of a flag may appear in the menu (indirectly, via our "default
   // views"), so we need to clear the menu cache. This call also clears the
   // page cache, which is desirable too because the flag labels may have
diff --git a/includes/flag.export.inc b/includes/flag.export.inc
index 5053c67..b44cb68 100644
--- a/includes/flag.export.inc
+++ b/includes/flag.export.inc
@@ -141,6 +141,10 @@ function flag_import_form_validate($form, &$form_state) {
 function flag_import_form_submit($form, &$form_state) {
   module_load_include('inc', 'flag', 'includes/flag.admin');
 
+  // Build up values for the cache clear.
+  $entity_types = array();
+  $new = FALSE;
+
   foreach ($form_state['flags'] as $flag) {
     $flag->save();
     if (!empty($flag->status)) {
@@ -148,12 +152,14 @@ function flag_import_form_submit($form, &$form_state) {
     }
     if ($flag->is_new) {
       drupal_set_message(t('Flag @name has been imported.', array('@name' => $flag->name)));
+      $new = TRUE;
     }
     else {
       drupal_set_message(t('Flag @name has been updated.', array('@name' => $flag->name)));
     }
+    $entity_types[] = $flag->entity_type;
   }
-  _flag_clear_cache();
+  _flag_clear_cache($entity_types, $new);
 
   $form_state['redirect'] = FLAG_ADMIN_PATH;
 }
diff --git a/includes/flag.features.inc b/includes/flag.features.inc
index f1fb30e..c61dc1b 100644
--- a/includes/flag.features.inc
+++ b/includes/flag.features.inc
@@ -80,6 +80,9 @@ function flag_features_revert($module = NULL) {
     module_load_include('inc', 'flag', '/includes/flag.admin');
     $default_flags = module_invoke($module, 'flag_default_flags');
 
+    // Build up values for the cache clear.
+    $entity_types = array();
+
     // Revert flags that are defined in code.
     foreach ($default_flags as $flag_name => $flag_info) {
       if (is_numeric($flag_name)) {
@@ -90,8 +93,10 @@ function flag_features_revert($module = NULL) {
       if ($flag && $flag->revert() === FALSE) {
         drupal_set_message(t('Could not revert flag %flag-name to the state described in your code: Your flag was created by a different version of the Flag module than is now being used.', array('%flag-name' => $flag->name)), 'error');
       }
+
+      $entity_types[] = $flag->entity_type;
     }
-    _flag_clear_cache();
+    _flag_clear_cache($entity_types);
   }
 }
 
