diff --git a/entityreference.info b/entityreference.info
index 8db2655..10827e6 100644
--- a/entityreference.info
+++ b/entityreference.info
@@ -12,6 +12,7 @@ files[] = entityreference.migrate.inc
 files[] = plugins/selection/abstract.inc
 files[] = plugins/selection/base.inc
 files[] = plugins/behavior/abstract.inc
+files[] = plugins/behavior/base.inc
 
 ; Tests.
 files[] = tests/entityreference.handlers.test
diff --git a/entityreference.module b/entityreference.module
index d1c1177..90bd45c 100644
--- a/entityreference.module
+++ b/entityreference.module
@@ -14,11 +14,23 @@ function entityreference_ctools_plugin_directory($module, $plugin) {
  */
 function entityreference_ctools_plugin_type() {
   $plugins['selection'] = array();
-  $plugins['behavior'] = array();
+  $plugins['behavior'] = array('process' => 'entityreference_behavior_plugin_process');
   return $plugins;
 }
 
 /**
+ * CTools callback; Process the behavoir plugins.
+ */
+function entityreference_behavior_plugin_process(&$plugin, $info) {
+  $plugin += array(
+    'description' => '',
+    'settings level' => 'field',
+    'access callback' => FALSE,
+    'force enabled' => FALSE,
+  );
+}
+
+/**
  * Implementation of hook_field_info().
  */
 function entityreference_field_info() {
@@ -26,7 +38,7 @@ function entityreference_field_info() {
     'label' => t('Entity Reference'),
     'description' => t('This field reference another entity.'),
     'settings' => array(
-      // Default to the core target entity type node. 
+      // Default to the core target entity type node.
       'target_type' => 'node',
       // The handler for this field.
       'handler' => 'base',
@@ -72,34 +84,63 @@ function entityreference_field_is_empty($item, $field) {
   return !isset($item['target_id']) || !is_numeric($item['target_id']);
 }
 
+
 /**
  * Get the behavior handlers for a given entityreference field.
  */
-function entityreference_get_behavior_handlers($field) {
+function entityreference_get_behavior_handlers($field, $instance = NULL) {
   $object_cache = drupal_static(__FUNCTION__);
+  $identifier = $field['field_name'];
+  if (!empty($instance)) {
+    $identifier .= ':' . $instance['entity_type'] . ':' . $instance['bundle'];
+  }
 
-  if (!isset($object_cache[$field['field_name']])) {
-    ctools_include('plugins');
+  if (!isset($object_cache[$identifier])) {
+    $object_cache[$identifier] = array();
 
     // Merge in defaults.
     $field['settings'] += array('behaviors' => array());
 
     $object_cache[$field['field_name']] = array();
-    foreach ($field['settings']['behaviors'] as $behavior) {
-      // Merge in defaults.
-      $behavior += array(
-        'plugin' => '',
-        'settings' => array(),
-      );
-
-      $class = ctools_plugin_load_class('entityreference', 'behavior', $behavior['plugin'], 'class');
-      if (class_exists($class)) {
-        $object_cache[$field['field_name']][$plugin_name] = new $class($behavior['settings'], $field);
+    $behaviors = !empty($field['settings']['handler_settings']['behaviors']) ? $field['settings']['handler_settings']['behaviors'] : array();
+    if (!empty($instance['settings']['behaviors'])) {
+      $behaviors = array_merge($behaviors, $instance['settings']['behaviors']);
+    }
+    foreach ($behaviors as $behavior => $settings) {
+      if (empty($settings['status'])) {
+        // Behavior is not enabled.
+        continue;
       }
+
+      $object_cache[$identifier][] = entityreference_get_behavior_handler($behavior, $field, $instance);
     }
   }
 
-  return $object_cache[$field['field_name']];
+  return $object_cache[$identifier];
+}
+
+/**
+ * Get the behavior handler for a given entityreference field and instance.
+ *
+ * @param $handler
+ *   The behavior handler name.
+ */
+function entityreference_get_behavior_handler($behavior, $field, $instance = NULL) {
+  $object_cache = drupal_static(__FUNCTION__);
+
+  if (!isset($object_cache[$behavior])) {
+    ctools_include('plugins');
+    $class = ctools_plugin_load_class('entityreference', 'behavior', $behavior, 'class');
+
+    if (class_exists($class)) {
+      $object_cache[$behavior] = new $class($behavior, $field, $instance);
+    }
+    else {
+      // TODO: Create a behavior broken.
+    }
+  }
+
+  return $object_cache[$behavior];
 }
 
 /**
@@ -107,19 +148,23 @@ function entityreference_get_behavior_handlers($field) {
  *
  * The handler contains most of the business logic of the field.
  */
-function entityreference_get_selection_handler($field) {
+function entityreference_get_selection_handler($field, $instance = NULL) {
   $object_cache = drupal_static(__FUNCTION__);
 
   if (!isset($object_cache[$field['field_name']])) {
     ctools_include('plugins');
+
+    // Get all seletion plugins, as there seems to be an issue with
+    // ctools_plugin_load_class() not caching correctly.
+    ctools_get_plugins('entityreference', 'selection');
     $handler = $field['settings']['handler'];
     $class = ctools_plugin_load_class('entityreference', 'selection', $handler, 'class');
 
     if (class_exists($class)) {
-      $object_cache[$field['field_name']] = call_user_func(array($class, 'getInstance'), $field);
+      $object_cache[$field['field_name']] = call_user_func(array($class, 'getInstance'), $field, $instance);
     }
     else {
-      $object_cache[$field['field_name']] = EntityReference_SelectionHandler_Broken::getInstance($field);
+      $object_cache[$field['field_name']] = EntityReference_SelectionHandler_Broken::getInstance($field, $instance);
     }
   }
 
@@ -147,7 +192,7 @@ function entityreference_field_validate($entity_type, $entity, $field, $instance
     }
   }
 
-  $valid_ids = entityreference_get_selection_handler($field)->validateReferencableEntities(array_keys($ids));
+  $valid_ids = entityreference_get_selection_handler($field, $instance)->validateReferencableEntities(array_keys($ids));
 
   $invalid_entities = array_diff_key($ids, array_flip($valid_ids));
   if ($invalid_entities) {
@@ -160,7 +205,7 @@ function entityreference_field_validate($entity_type, $entity, $field, $instance
   }
 
   // Invoke the behaviors.
-  foreach (entityreference_get_behavior_handlers($field) as $handler) {
+  foreach (entityreference_get_behavior_handlers($field, $instance) as $handler) {
     $handler->validate($entity_type, $entity, $field, $instance, $langcode, $items, $errors);
   }
 }
@@ -176,7 +221,7 @@ function entityreference_field_presave($entity_type, $entity, $field, $instance,
   }
 
   // Invoke the behaviors.
-  foreach (entityreference_get_behavior_handlers($field) as $handler) {
+  foreach (entityreference_get_behavior_handlers($field, $instance) as $handler) {
     $handler->presave($entity_type, $entity, $field, $instance, $langcode, $items);
   }
 }
@@ -186,7 +231,7 @@ function entityreference_field_presave($entity_type, $entity, $field, $instance,
  */
 function entityreference_field_insert($entity_type, $entity, $field, $instance, $langcode, &$items) {
   // Invoke the behaviors.
-  foreach (entityreference_get_behavior_handlers($field) as $handler) {
+  foreach (entityreference_get_behavior_handlers($field, $instance) as $handler) {
     $handler->insert($entity_type, $entity, $field, $instance, $langcode, $items);
   }
 }
@@ -196,7 +241,7 @@ function entityreference_field_insert($entity_type, $entity, $field, $instance,
  */
 function entityreference_field_update($entity_type, $entity, $field, $instance, $langcode, &$items) {
   // Invoke the behaviors.
-  foreach (entityreference_get_behavior_handlers($field) as $handler) {
+  foreach (entityreference_get_behavior_handlers($field, $instance) as $handler) {
     $handler->update($entity_type, $entity, $field, $instance, $langcode, $items);
   }
 }
@@ -206,7 +251,7 @@ function entityreference_field_update($entity_type, $entity, $field, $instance,
  */
 function entityreference_field_delete($entity_type, $entity, $field, $instance, $langcode, &$items) {
   // Invoke the behaviors.
-  foreach (entityreference_get_behavior_handlers($field) as $handler) {
+  foreach (entityreference_get_behavior_handlers($field, $instance) as $handler) {
     $handler->delete($entity_type, $entity, $field, $instance, $langcode, $items);
   }
 }
@@ -216,6 +261,7 @@ function entityreference_field_delete($entity_type, $entity, $field, $instance,
  */
 function entityreference_field_settings_form($field, $instance, $has_data) {
   $settings = $field['settings'];
+  $settings += array('handler' => 'base');
 
   // Select the target entity type.
   $entity_type_options = array();
@@ -282,6 +328,22 @@ function entityreference_field_settings_form($field, $instance, $has_data) {
 }
 
 /**
+ * Implements hook_field_instance_settings_form().
+ */
+function entityreference_field_instance_settings_form($field, $instance) {
+  $settings = $instance['settings'];
+  ctools_include('plugins');
+  $class = ctools_plugin_load_class('entityreference', 'selection', $field['settings']['handler'], 'class');
+  if (!class_exists($class)) {
+    $class = 'EntityReference_SelectionHandler_Broken';
+  }
+
+  entityreference_get_behavior_elements($form, $class, $field, $instance, 'instance');
+
+  return $form;
+}
+
+/**
  * #process callback: generates the handler settings form.
  *
  * @see entityreference_field_settings_form()
@@ -295,7 +357,7 @@ function entityreference_render_settings($element, $form_state) {
   ctools_include('plugins');
   $class = ctools_plugin_load_class('entityreference', 'selection', $handler, 'class');
   if (!class_exists($class)) {
-    $class = 'EntityReferenceHandler_broken';
+    $class = 'EntityReference_SelectionHandler_Broken';
   }
 
   // Rebuild the field configuration based on the submitted structure.
@@ -305,11 +367,80 @@ function entityreference_render_settings($element, $form_state) {
     $field['settings'] = $form_state['values']['field']['settings'] + $field['settings'];
   }
 
+  entityreference_get_behavior_elements($element, $class, $field, $instance, 'field');
+
   $element += call_user_func(array($class, 'settingsForm'), $field, $instance);
   return $element;
 }
 
 /**
+ * Get the field or instance elements for the field configuration.
+ */
+function entityreference_get_behavior_elements(&$element, $class, $field, $instance, $level) {
+   // Add the accessible behavior handlers.
+  $behavior_plugins = entityreference_get_accessible_behavior_plugins($class, $field, $instance);
+
+  if ($behavior_plugins[$level]) {
+    $element['behaviors'] = array();
+
+    foreach ($behavior_plugins[$level] as $name => $plugin) {
+      if ($level == 'field') {
+        $settings = !empty($field['settings']['handler_settings']['behaviors'][$name]) ? $field['settings']['handler_settings']['behaviors'][$name] : array();
+      }
+      else {
+        $settings = !empty($instance['settings']['behaviors'][$name]) ? $instance['settings']['behaviors'][$name] : array();
+      }
+      $settings += array('status' => $plugin['force enabled']);
+      $element['behaviors'][$name] = array(
+        '#type' => 'fieldset',
+        '#title' => $plugin['title'],
+        '#default_value' => $settings['status'],
+      );
+      $element['behaviors'][$name]['status'] = array(
+        '#type' => 'checkbox',
+        '#title' => t('Enable %title', array('%title' => $plugin['title'])),
+        '#default_value' => $settings['status'],
+        '#disabled' => $plugin['force enabled'],
+      );
+
+      $behavior_class = ctools_plugin_load_class('entityreference', 'behavior', $name, 'class');
+      if ($behavior_elements = call_user_func(array($behavior_class, 'settingsForm'))) {
+        $enable_element = $level == 'field' ? 'field[settings][handler_settings][behaviors]' : 'instance[settings][behaviors]';
+        foreach ($behavior_elements as $key => &$behavior_element) {
+          $behavior_element += array(
+            '#default_value' => !empty($settings[$key]) ? $settings[$key] : NULL,
+            '#states' => array(
+              'visible' => array(
+                ':input[name="' . $enable_element . '[' . $name . '][status]"]' => array('checked' => TRUE),
+              ),
+            ),
+          );
+        }
+
+        // Get the behavior settings.
+        $element['behaviors'][$name] += $behavior_elements;
+      }
+    }
+  }
+}
+
+/**
+ * Get all accessible behavior plugins.
+ */
+function entityreference_get_accessible_behavior_plugins($select_class, $field, $instance) {
+  ctools_include('plugins');
+  $plugins = array('field' => array(), 'instance' => array());
+  foreach (ctools_get_plugins('entityreference', 'behavior') as $name => $plugin) {
+    $handler = entityreference_get_behavior_handler($name, $field, $instance);
+    $level = $plugin['settings level'];
+    if ($handler->access($select_class)) {
+      $plugins[$level][$name] = $plugin;
+    }
+  }
+  return $plugins;
+}
+
+/**
  * Ajax callback for the handler settings form.
  *
  * @see entityreference_field_settings_form()
@@ -430,22 +561,24 @@ function entityreference_field_widget_settings_form($field, $instance) {
 /**
  * Implements hook_options_list().
  */
-function entityreference_options_list($field) {
-  return entityreference_get_selection_handler($field)->getReferencableEntities();
+function entityreference_options_list($field, $instance = NULL) {
+  return entityreference_get_selection_handler($field, $instance)->getReferencableEntities();
 }
 
 /**
  * Implements hook_query_TAG_alter().
  */
 function entityreference_query_entityreference_alter(QueryAlterableInterface $query) {
-  entityreference_get_selection_handler($query->getMetadata('field'))->entityFieldQueryAlter($query);
+  $field = $query->getMetadata('field');
+  $instance = $query->getMetadata('instance');
+  entityreference_get_selection_handler($field, $instance)->entityFieldQueryAlter($query);
 }
 
 /**
  * Implements hook_field_widget_form().
  */
 function entityreference_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
-  $handler = entityreference_get_selection_handler($field);
+  $handler = entityreference_get_selection_handler($field, $instance);
 
   if ($instance['widget']['type'] == 'entityreference_autocomplete' || $instance['widget']['type'] == 'entityreference_autocomplete_tags') {
 
@@ -561,7 +694,7 @@ function entityreference_autocomplete_callback($type, $field_name, $entity_type,
     return MENU_ACCESS_DENIED;
   }
 
-  $handler = entityreference_get_selection_handler($field);
+  $handler = entityreference_get_selection_handler($field, $instance);
 
   if ($type == 'tags') {
     // The user enters a comma-separated list of tags. We only autocomplete the last tag.
@@ -726,7 +859,7 @@ function entityreference_field_formatter_view($entity_type, $entity, $field, $in
 
   switch ($display['type']) {
     case 'entityreference_label':
-      $handler = entityreference_get_selection_handler($field);
+      $handler = entityreference_get_selection_handler($field, $instance);
 
       foreach ($items as $delta => $item) {
         $label = $handler->getLabel($item['entity']);
diff --git a/examples/entityreference_behavior_example/plugins/behavior/test_behavior.inc b/examples/entityreference_behavior_example/plugins/behavior/test_behavior.inc
deleted file mode 100644
index 52d44a7..0000000
--- a/examples/entityreference_behavior_example/plugins/behavior/test_behavior.inc
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-$plugin = array(
-  'title' => t('Test behavior'),
-  'class' => 'EntityReferenceBehaviorExample',
-  'weight' => 10,
-);
-
-class EntityReferenceBehaviorExample implements EntityReference_BehaviorHandler {
-  public function __construct(array $settings, array $field) {
-    $this->settings = $settings;
-    $this->field = $field;
-  }
-
-  public function load($entity_type, $entities, $field, $instances, $langcode, &$items) {
-    drupal_set_message('Do something on load!');
-  }
-
-  public function validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
-    
-  }
-
-  public function presave($entity_type, $entity, $field, $instance, $langcode, &$items) {
-    
-  }
-
-  public function insert($entity_type, $entity, $field, $instance, $langcode, &$items) {
-    drupal_set_message('Do something on insert!');
-  }
-
-  public function update($entity_type, $entity, $field, $instance, $langcode, &$items) {
-    drupal_set_message('Do something on update!');
-  }
-
-  public function delete($entity_type, $entity, $field, $instance, $langcode, &$items) {
-    drupal_set_message('Do something on delete!');
-  }
-}
diff --git a/examples/entityreference_behavior_example/plugins/behavior/test_field_behavior.inc b/examples/entityreference_behavior_example/plugins/behavior/test_field_behavior.inc
new file mode 100644
index 0000000..864608b
--- /dev/null
+++ b/examples/entityreference_behavior_example/plugins/behavior/test_field_behavior.inc
@@ -0,0 +1,38 @@
+<?php
+
+$plugin = array(
+  'title' => t('Test behavior'),
+  'class' => 'EntityReferenceFieldBehaviorExample',
+  'weight' => 10,
+  'settings level' => 'field',
+);
+
+class EntityReferenceFieldBehaviorExample extends EntityReference_BehaviorHandler_Generic {
+
+  public function load($entity_type, $entities, $field, $instances, $langcode, &$items) {
+    drupal_set_message('Do something on load!');
+  }
+
+  public function insert($entity_type, $entity, $field, $instance, $langcode, &$items) {
+    drupal_set_message('Do something on insert!');
+  }
+
+  public function update($entity_type, $entity, $field, $instance, $langcode, &$items) {
+    drupal_set_message('Do something on update!');
+  }
+
+  public function delete($entity_type, $entity, $field, $instance, $langcode, &$items) {
+    drupal_set_message('Do something on delete!');
+  }
+
+  /**
+   * Generate a settings form for this handler.
+   */
+  public function settingsForm() {
+    $form['test_field'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Field behavoir setting'),
+    );
+    return $form;
+  }
+}
diff --git a/examples/entityreference_behavior_example/plugins/behavior/test_instance_behavior.inc b/examples/entityreference_behavior_example/plugins/behavior/test_instance_behavior.inc
new file mode 100644
index 0000000..55cf95f
--- /dev/null
+++ b/examples/entityreference_behavior_example/plugins/behavior/test_instance_behavior.inc
@@ -0,0 +1,38 @@
+<?php
+
+$plugin = array(
+  'title' => t('Test instance behavior'),
+  'class' => 'EntityReferenceInstanceBehaviorExample',
+  'weight' => 10,
+  'settings level' => 'instance',
+);
+
+class EntityReferenceInstanceBehaviorExample extends EntityReference_BehaviorHandler_Generic {
+
+  public function load($entity_type, $entities, $field, $instances, $langcode, &$items) {
+    drupal_set_message('Do something on load, on the instance level!');
+  }
+
+  public function insert($entity_type, $entity, $field, $instance, $langcode, &$items) {
+    drupal_set_message('Do something on insert, on the instance level!');
+  }
+
+  public function update($entity_type, $entity, $field, $instance, $langcode, &$items) {
+    drupal_set_message('Do something on update, on the instance level!');
+  }
+
+  public function delete($entity_type, $entity, $field, $instance, $langcode, &$items) {
+    drupal_set_message('Do something on delete, on the instance level!');
+  }
+
+  /**
+   * Generate a settings form for this handler.
+   */
+  public function settingsForm() {
+    $form['test_instance'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Instance behavoir setting'),
+    );
+    return $form;
+  }
+}
\ No newline at end of file
diff --git a/plugins/behavior/abstract.inc b/plugins/behavior/abstract.inc
index 77f0f7d..47c14f0 100644
--- a/plugins/behavior/abstract.inc
+++ b/plugins/behavior/abstract.inc
@@ -7,10 +7,11 @@
  * register it using CTools' plugin system.
  */
 interface EntityReference_BehaviorHandler {
+
   /**
    * @TODO: document.
    */
-  public function __construct(array $settings, array $field);
+  public function __construct($behavior, array $field, array $instance = NULL);
 
   /**
    * @TODO: document.
@@ -41,4 +42,15 @@ interface EntityReference_BehaviorHandler {
    * @TODO: document.
    */
   public function delete($entity_type, $entity, $field, $instance, $langcode, &$items);
+
+  /**
+   * Generate a settings form for this handler.
+   */
+  public function settingsForm();
+
+  /**
+   * Determine if handler should appear.
+   */
+  public function access($selection_class);
 }
+
diff --git a/plugins/behavior/base.inc b/plugins/behavior/base.inc
new file mode 100644
index 0000000..22440fd
--- /dev/null
+++ b/plugins/behavior/base.inc
@@ -0,0 +1,41 @@
+<?php
+
+class EntityReference_BehaviorHandler_Generic implements EntityReference_BehaviorHandler {
+
+  public function __construct($behavior, array $field, array $instance = NULL) {
+    ctools_include('plugins');
+    $plugin = ctools_get_plugins('entityreference', 'behavior', $behavior);
+    $this->plugin = $plugin;
+
+    if ($plugin['settings level'] == 'field') {
+      $this->settings = !empty($field['settings']['handler_settings']['behavior']) ? $field['settings']['handler_settings']['behavior'] : array();
+    }
+    else {
+      $this->settings = !empty($instance['settings']['behavior']) ? $instance['settings']['behavior'] : array();
+    }
+
+    $this->status = !empty($settings['status']) ? $settings['status'] : FALSE;
+    unset($this->settings['status']);
+
+    $this->field = $field;
+    $this->instance = $instance;
+  }
+
+  public function load($entity_type, $entities, $field, $instances, $langcode, &$items) {}
+
+  public function validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {}
+
+  public function presave($entity_type, $entity, $field, $instance, $langcode, &$items) {}
+
+  public function insert($entity_type, $entity, $field, $instance, $langcode, &$items) {}
+
+  public function update($entity_type, $entity, $field, $instance, $langcode, &$items) {}
+
+  public function delete($entity_type, $entity, $field, $instance, $langcode, &$items) {}
+
+  public function settingsForm() {}
+
+  public function access($selection_class) {
+    return TRUE;
+  }
+}
diff --git a/plugins/selection/abstract.inc b/plugins/selection/abstract.inc
index 071af17..eafd1c7 100644
--- a/plugins/selection/abstract.inc
+++ b/plugins/selection/abstract.inc
@@ -14,7 +14,7 @@ interface EntityReference_SelectionHandler {
    *   A field datastructure.
    * @return EntityReferenceHandler
    */
-  public static function getInstance($field);
+  public static function getInstance($field, $instance);
 
   /**
    * Return a list of referencable entities.
@@ -54,12 +54,13 @@ interface EntityReference_SelectionHandler {
  * A null implementation of EntityReference_SelectionHandler.
  */
 class EntityReference_SelectionHandler_Broken implements EntityReference_SelectionHandler {
-  public static function getInstance($field) {
-    return new EntityReference_SelectionHandler_Broken($field);
+  public static function getInstance($field, $instance) {
+    return new EntityReference_SelectionHandler_Broken($field, $instance);
   }
 
-  protected function __construct($field) {
+  protected function __construct($field, $instance) {
     $this->field = $field;
+    $this->instance = $instance;
   }
 
   public static function settingsForm($field, $instance) {
diff --git a/plugins/selection/base.inc b/plugins/selection/base.inc
index d8ae568..11efcb6 100644
--- a/plugins/selection/base.inc
+++ b/plugins/selection/base.inc
@@ -17,18 +17,19 @@ class EntityReference_SelectionHandler_Generic implements EntityReference_Select
   /**
    * Implements EntityReferenceHandler::getInstance().
    */
-  public static function getInstance($field) {
+  public static function getInstance($field, $instance) {
     $entity_type = $field['settings']['target_type'];
     if (class_exists($class_name = 'EntityReference_SelectionHandler_Generic_' . $entity_type)) {
-      return new $class_name($field);
+      return new $class_name($field, $instance);
     }
     else {
-      return new EntityReference_SelectionHandler_Generic($field);
+      return new EntityReference_SelectionHandler_Generic($field, $instance);
     }
   }
 
-  protected function __construct($field) {
+  protected function __construct($field, $instance) {
     $this->field = $field;
+    $this->instance = $instance;
   }
 
   /**
@@ -182,7 +183,7 @@ class EntityReference_SelectionHandler_Generic implements EntityReference_Select
     }
 
     // Add a generic entity access tag to the query.
-    $query->addTag($this->field['settings']['target_type'] . '_access');
+    $query->addTag('entity_field_access');
     $query->addTag('entityreference');
     $query->addMetaData('field', $this->field);
 
