diff --git a/entityreference.module b/entityreference.module
index e0bc51d..ebfe1bc 100644
--- a/entityreference.module
+++ b/entityreference.module
@@ -172,16 +172,41 @@ function _entityreference_get_behavior_handler($behavior) {
  * Get the selection handler for a given entityreference field.
  */
 function entityreference_get_selection_handler($field, $instance = NULL, $entity_type = NULL, $entity = NULL) {
-  ctools_include('plugins');
-  $handler = $field['settings']['handler'];
-  $class = ctools_plugin_load_class('entityreference', 'selection', $handler, 'class');
+  $object_cache = drupal_static(__FUNCTION__);
 
-  if (class_exists($class)) {
-    return call_user_func(array($class, 'getInstance'), $field, $instance, $entity_type, $entity);
+  // Build the unique identifier of the object cache.
+  $identifier[] = $field['field_name'];
+  if (!empty($instance)) {
+    $identifier[] = $instance['entity_type'];
+    $identifier[] = $instance['bundle'];
   }
-  else {
-    return EntityReference_SelectionHandler_Broken::getInstance($field, $instance, $entity_type, $entity);
+
+  if (!empty($entity_type)) {
+    $identifier[] = $entity_type;
+  }
+
+  if (!empty($entity)) {
+    list($id) = entity_extract_ids($entity_type, $entity);
+    if ($id) {
+      $identifier[] = $id;
+    }
+  }
+
+  $identifier = implode(':', $identifier);
+
+  if (!isset($object_cache[$identifier])) {
+    ctools_include('plugins');
+    $handler = $field['settings']['handler'];
+    $class = ctools_plugin_load_class('entityreference', 'selection', $handler, 'class');
+
+    if (class_exists($class)) {
+      $object_cache[$identifier] = call_user_func(array($class, 'getInstance'), $field, $instance, $entity_type, $entity);
+    }
+    else {
+      $object_cache[$identifier] = EntityReference_SelectionHandler_Broken::getInstance($field, $instance, $entity_type, $entity);
+    }
   }
+  return $object_cache[$identifier];
 }
 
 /**
