diff --git a/modules/field/modules/list/list.module b/modules/field/modules/list/list.module
index 608679b..3442dcd 100644
--- a/modules/field/modules/list/list.module
+++ b/modules/field/modules/list/list.module
@@ -221,18 +221,25 @@ function list_field_update_field($field, $prior_field, $has_data) {
  *
  * @param $field
  *   The field definition.
+ * @param $context
+ *   Array with the variables that can help implemting modules to decide the
+ *   allowed values:
+ *   - entity_type: The entity type.
+ *   - entity: The entity object.
+ *   - instance: The field instance.
+ *   - langcode: The language code.
  *
  * @return
  *   The array of allowed values. Keys of the array are the raw stored values
  *   (number or text), values of the array are the display labels.
  */
-function list_allowed_values($field) {
+function list_allowed_values($field, $context = array()) {
   $allowed_values = &drupal_static(__FUNCTION__, array());
 
   if (!isset($allowed_values[$field['id']])) {
     $function = $field['settings']['allowed_values_function'];
     if (!empty($function) && function_exists($function)) {
-      $values = $function($field);
+      $values = $function($field, $context);
     }
     else {
       $values = $field['settings']['allowed_values'];
@@ -373,7 +380,13 @@ function _list_values_in_use($field, $values) {
  * - 'list_illegal_value': The value is not part of the list of allowed values.
  */
 function list_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
-  $allowed_values = list_allowed_values($field);
+  $context = array(
+    'entity_type' => $entity_type,
+    'entity' => $entity,
+    'instance' => $instance,
+    'langcode' => $langcode,
+  );
+  $allowed_values = list_allowed_values($field, $context);
   foreach ($items as $delta => $item) {
     if (!empty($item['value'])) {
       if (!empty($allowed_values) && !isset($allowed_values[$item['value']])) {
@@ -419,8 +432,8 @@ function list_field_widget_info_alter(&$info) {
 /**
  * Implements hook_options_list().
  */
-function list_options_list($field) {
-  return list_allowed_values($field);
+function list_options_list($field, $context) {
+  return list_allowed_values($field, $context);
 }
 
 /**
@@ -447,7 +460,13 @@ function list_field_formatter_view($entity_type, $entity, $field, $instance, $la
 
   switch ($display['type']) {
     case 'list_default':
-      $allowed_values = list_allowed_values($field);
+      $context = array(
+        'entity_type' => $entity_type,
+        'entity' => $entity,
+        'instance' => $instance,
+        'langcode' => $langcode,
+      );
+      $allowed_values = list_allowed_values($field, $context);
       foreach ($items as $delta => $item) {
         if (isset($allowed_values[$item['value']])) {
           $output = field_filter_xss($allowed_values[$item['value']]);
diff --git a/modules/field/modules/options/options.api.php b/modules/field/modules/options/options.api.php
index dfbb631..b3a82e9 100644
--- a/modules/field/modules/options/options.api.php
+++ b/modules/field/modules/options/options.api.php
@@ -15,6 +15,13 @@
  *
  * @param $field
  *   The field definition.
+ * @param $context
+ *   Array with the variables that can help implemting modules to decide the
+ *   allowed values:
+ *   - entity_type: The entity type.
+ *   - entity: The entity object.
+ *   - instance: The field instance.
+ *   - langcode: The language code.
  *
  * @return
  *   The array of options for the field. Array keys are the values to be
@@ -25,7 +32,7 @@
  *   widget. The HTML tags defined in _field_filter_xss_allowed_tags() are
  *   allowed, other tags will be filtered.
  */
-function hook_options_list($field) {
+function hook_options_list($field, $context = array()) {
   // Sample structure.
   $options = array(
     0 => t('Zero'),
diff --git a/modules/field/modules/options/options.module b/modules/field/modules/options/options.module
index 385f3f4..97c6d7b 100644
--- a/modules/field/modules/options/options.module
+++ b/modules/field/modules/options/options.module
@@ -80,7 +80,13 @@ function options_field_widget_form(&$form, &$form_state, $field, $instance, $lan
   $properties = _options_properties($type, $multiple, $required, $has_value);
 
   // Prepare the list of options.
-  $options = _options_get_options($field, $instance, $properties);
+  $context = array(
+    'entity_type' => $element['#entity_type'],
+    'entity' => $form_state[$element['#entity_type']],
+    'instance' => $instance,
+    'langcode' => $langcode,
+  );
+  $options = _options_get_options($field, $instance, $properties, $context);
 
   // Put current field values in shape.
   $default_value = _options_storage_to_form($items, $options, $value_key, $properties);
@@ -229,9 +235,9 @@ function _options_properties($type, $multiple, $required, $has_value) {
 /**
  * Collects the options for a field.
  */
-function _options_get_options($field, $instance, $properties) {
+function _options_get_options($field, $instance, $properties, $context = array()) {
   // Get the list of options.
-  $options = (array) module_invoke($field['module'], 'options_list', $field);
+  $options = (array) module_invoke($field['module'], 'options_list', $field, $context);
 
   // Sanitize the options.
   _options_prepare_options($options, $properties);
