diff --git a/core/lib/Drupal/Core/TypedData/AllowedValuesInterface.php b/core/lib/Drupal/Core/Field/AllowedValuesProviderInterface.php
similarity index 61%
copy from core/lib/Drupal/Core/TypedData/AllowedValuesInterface.php
copy to core/lib/Drupal/Core/Field/AllowedValuesProviderInterface.php
index 5c782ae..27b6ec8 100644
--- a/core/lib/Drupal/Core/TypedData/AllowedValuesInterface.php
+++ b/core/lib/Drupal/Core/Field/AllowedValuesProviderInterface.php
@@ -2,36 +2,21 @@
 
 /**
  * @file
- * Contains \Drupal\Core\TypedData\AllowedValuesInterface.
+ * Contains \Drupal\Core\Field\AllowedValuesProviderInterface.
  */
 
-namespace Drupal\Core\TypedData;
+namespace Drupal\Core\Field;
 
 use Drupal\Core\Session\AccountInterface;
+use Drupal\Core\TypedData\AllowedValuesProviderInterface as TypedDataAllowedValuesProviderInterface;
 
 /**
- * Interface for retrieving all possible and settable values.
+ * Allowed values provider for field definitions.
  *
- * While possible values specify which values existing data might have, settable
- * values define the values that are allowed to be set by a user.
- *
- * For example, in an workflow scenario, the settable values for a state field
- * might depend on the currently set state, while possible values are all
- * states. Thus settable values would be used in an editing context, while
- * possible values would be used for presenting filtering options in a search.
- *
- * For convenience, lists of both settable and possible values are also provided
- * as structured options arrays that can be used in an Options widget such as a
- * select box or checkboxes.
- *
- * Note that this interface is mostly applicable for primitive data values, but
- * can be used on complex data structures if a (primitive) main property is
- * specified. In that case, the allowed values and options apply to the main
- * property only.
- *
- * @see \Drupal\options\Plugin\Field\FieldWidget\OptionsWidgetBase
+ * @todo: Decouple from type data allowed values interface as part of
+ * https://drupal.org/node/2268049.
  */
-interface AllowedValuesInterface {
+interface AllowedValuesProviderInterface extends TypedDataAllowedValuesProviderInterface {
 
   /**
    * Returns an array of possible values.
@@ -39,7 +24,7 @@
    * If the optional $account parameter is passed, then the array is filtered to
    * values viewable by the account.
    *
-   * @param \Drupal\Core\Session\AccountInterface $account
+   * @param \Drupal\Core\Session\AccountInterface|null $account
    *   (optional) The user account for which to filter the possible values. If
    *   omitted, all possible values are returned.
    *
@@ -54,7 +39,7 @@ public function getPossibleValues(AccountInterface $account = NULL);
    * If the optional $account parameter is passed, then the array is filtered to
    * values viewable by the account.
    *
-   * @param \Drupal\Core\Session\AccountInterface $account
+   * @param \Drupal\Core\Session\AccountInterface|null $account
    *   (optional) The user account for which to filter the possible options.
    *   If omitted, all possible options are returned.
    *
@@ -73,14 +58,20 @@ public function getPossibleOptions(AccountInterface $account = NULL);
    * If the optional $account parameter is passed, then the array is filtered to
    * values settable by the account.
    *
-   * @param \Drupal\Core\Session\AccountInterface $account
+   * @param \Drupal\Core\Field\FieldItemInterface
+   *   The field on which to set the value.
+   * @param \Drupal\Core\Session\AccountInterface|null $account
    *   (optional) The user account for which to filter the settable values. If
    *   omitted, all settable values are returned.
    *
    * @return array
    *   An array of settable values.
+   *
+   * @todo: Type-hint $field_item on FieldItemInterface as soon as field
+   * definitions are decoupled from data definitions, see
+   * https://drupal.org/node/2268049.
    */
-  public function getSettableValues(AccountInterface $account = NULL);
+  public function getSettableValues($field_item, AccountInterface $account = NULL);
 
   /**
    * Returns an array of settable values with labels for display.
@@ -88,7 +79,9 @@ public function getSettableValues(AccountInterface $account = NULL);
    * If the optional $account parameter is passed, then the array is filtered to
    * values settable by the account.
    *
-   * @param \Drupal\Core\Session\AccountInterface $account
+   * @param \Drupal\Core\Field\FieldItemInterface $field_item
+   *   The field on which to set the value.
+   * @param \Drupal\Core\Session\AccountInterface|null $account
    *   (optional) The user account for which to filter the settable options. If
    *   omitted, all settable options are returned.
    *
@@ -98,6 +91,11 @@ public function getSettableValues(AccountInterface $account = NULL);
    *   a flat array of option labels keyed by values, or a two-dimensional array
    *   of option groups (array of flat option arrays, keyed by option group
    *   label). Note that labels should NOT be sanitized.
+   *
+   * @todo: Type-hint $field_item on FieldItemInterface as soon as field
+   * definitions are decoupled from data definitions, see
+   * https://drupal.org/node/2268049.
    */
-  public function getSettableOptions(AccountInterface $account = NULL);
+  public function getSettableOptions($field_item, AccountInterface $account = NULL);
+
 }
diff --git a/core/lib/Drupal/Core/Field/DefaultAllowedValuesProvider.php b/core/lib/Drupal/Core/Field/DefaultAllowedValuesProvider.php
new file mode 100644
index 0000000..a578612
--- /dev/null
+++ b/core/lib/Drupal/Core/Field/DefaultAllowedValuesProvider.php
@@ -0,0 +1,84 @@
+<?php
+
+/**
+ * @file
+ *
+ */
+
+namespace Drupal\Core\Field;
+
+use Drupal\Core\Session\AccountInterface;
+use Drupal\Core\TypedData\AllowedValuesProviderInterface;
+use Drupal\Core\TypedData\DataDefinitionInterface;
+
+/**
+ * A default allowed values provider reading an 'allowed_values' setting.
+ */
+class DefaultAllowedValuesProvider implements AllowedValuesProviderInterface {
+
+  /**
+   * The data definition.
+   *
+   * @var \Drupal\Core\TypedData\DataDefinitionInterface
+   */
+  protected $dataDefinition;
+
+  /**
+   * Constructs a DefaultAllowedValuesProvider object.
+   *
+   * @param \Drupal\Core\TypedData\DataDefinitionInterface $definition
+   *   The field definition.
+   */
+  public function __construct(DataDefinitionInterface $definition) {
+    $this->dataDefinition = $definition;
+  }
+
+  /**
+   * Flattens an array of allowed values.
+   *
+   * @param array $array
+   *   A single or multidimensional array.
+   *
+   * @return array
+   *   The flattened array.
+   */
+  protected function flattenOptions(array $array) {
+    $result = array();
+    array_walk_recursive($array, function($value, $key) use (&$result) {
+      $result[$key] = $value;
+    });
+
+    return $result;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPossibleValues(AccountInterface $account = NULL) {
+    $flatten_options = $this->flattenOptions($this->getPossibleOptions($account));
+    return array_keys($flatten_options);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPossibleOptions(AccountInterface $account = NULL) {
+    return $this->dataDefinition->getSetting('allowed_values') ?: array();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getSettableValues($data, AccountInterface $account = NULL) {
+    $flatten_options = $this->flattenOptions($this->getSettableOptions($account));
+    return array_keys($flatten_options);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getSettableOptions($data, AccountInterface $account = NULL) {
+    // Default to possible options.
+    return $this->getPossibleOptions();
+  }
+}
diff --git a/core/lib/Drupal/Core/Field/FieldDefinition.php b/core/lib/Drupal/Core/Field/FieldDefinition.php
index a0576f6..76b59c8 100644
--- a/core/lib/Drupal/Core/Field/FieldDefinition.php
+++ b/core/lib/Drupal/Core/Field/FieldDefinition.php
@@ -9,6 +9,7 @@
 
 use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Field\TypedData\FieldItemDataDefinition;
+use Drupal\Core\TypedData\AllowedValuesProviderInterface;
 use Drupal\Core\TypedData\ListDataDefinition;
 use Drupal\field\FieldException;
 
diff --git a/core/lib/Drupal/Core/TypedData/AllowedValuesInterface.php b/core/lib/Drupal/Core/TypedData/AllowedValuesProviderInterface.php
similarity index 76%
rename from core/lib/Drupal/Core/TypedData/AllowedValuesInterface.php
rename to core/lib/Drupal/Core/TypedData/AllowedValuesProviderInterface.php
index 5c782ae..db2cb48 100644
--- a/core/lib/Drupal/Core/TypedData/AllowedValuesInterface.php
+++ b/core/lib/Drupal/Core/TypedData/AllowedValuesProviderInterface.php
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Contains \Drupal\Core\TypedData\AllowedValuesInterface.
+ * Contains \Drupal\Core\TypedData\AllowedValuesProviderInterface.
  */
 
 namespace Drupal\Core\TypedData;
@@ -31,7 +31,7 @@
  *
  * @see \Drupal\options\Plugin\Field\FieldWidget\OptionsWidgetBase
  */
-interface AllowedValuesInterface {
+interface AllowedValuesProviderInterface {
 
   /**
    * Returns an array of possible values.
@@ -39,7 +39,7 @@
    * If the optional $account parameter is passed, then the array is filtered to
    * values viewable by the account.
    *
-   * @param \Drupal\Core\Session\AccountInterface $account
+   * @param \Drupal\Core\Session\AccountInterface|null $account
    *   (optional) The user account for which to filter the possible values. If
    *   omitted, all possible values are returned.
    *
@@ -54,7 +54,7 @@ public function getPossibleValues(AccountInterface $account = NULL);
    * If the optional $account parameter is passed, then the array is filtered to
    * values viewable by the account.
    *
-   * @param \Drupal\Core\Session\AccountInterface $account
+   * @param \Drupal\Core\Session\AccountInterface|null $account
    *   (optional) The user account for which to filter the possible options.
    *   If omitted, all possible options are returned.
    *
@@ -73,14 +73,19 @@ public function getPossibleOptions(AccountInterface $account = NULL);
    * If the optional $account parameter is passed, then the array is filtered to
    * values settable by the account.
    *
-   * @param \Drupal\Core\Session\AccountInterface $account
+   * @param \Drupal\Core\TypedData\TypedDataInterface $data
+   *   The data object on which to set the value.
+   * @param \Drupal\Core\Session\AccountInterface|null $account
    *   (optional) The user account for which to filter the settable values. If
    *   omitted, all settable values are returned.
    *
    * @return array
    *   An array of settable values.
+   *
+   * @todo: Type-hint $data on TypedDataInterface as soon as field definitions
+   * are decoupled from data definitions, see https://drupal.org/node/2268049.
    */
-  public function getSettableValues(AccountInterface $account = NULL);
+  public function getSettableValues($data, AccountInterface $account = NULL);
 
   /**
    * Returns an array of settable values with labels for display.
@@ -88,7 +93,9 @@ public function getSettableValues(AccountInterface $account = NULL);
    * If the optional $account parameter is passed, then the array is filtered to
    * values settable by the account.
    *
-   * @param \Drupal\Core\Session\AccountInterface $account
+   * @param \Drupal\Core\TypedData\TypedDataInterface $data
+   *   The data object on which to set the value.
+   * @param \Drupal\Core\Session\AccountInterface|null $account
    *   (optional) The user account for which to filter the settable options. If
    *   omitted, all settable options are returned.
    *
@@ -98,6 +105,9 @@ public function getSettableValues(AccountInterface $account = NULL);
    *   a flat array of option labels keyed by values, or a two-dimensional array
    *   of option groups (array of flat option arrays, keyed by option group
    *   label). Note that labels should NOT be sanitized.
+   *
+   * @todo: Type-hint $data on TypedDataInterface as soon as field definitions
+   * are decoupled from data definitions, see https://drupal.org/node/2268049.
    */
-  public function getSettableOptions(AccountInterface $account = NULL);
+  public function getSettableOptions($data, AccountInterface $account = NULL);
 }
diff --git a/core/lib/Drupal/Core/TypedData/DataDefinition.php b/core/lib/Drupal/Core/TypedData/DataDefinition.php
index 6f06cf3..83cb324 100644
--- a/core/lib/Drupal/Core/TypedData/DataDefinition.php
+++ b/core/lib/Drupal/Core/TypedData/DataDefinition.php
@@ -6,6 +6,7 @@
  */
 
 namespace Drupal\Core\TypedData;
+use Drupal\Core\Field\DefaultAllowedValuesProvider;
 
 /**
  * A typed data definition class for defining data based on defined data types.
@@ -368,4 +369,39 @@ public function toArray() {
     return $this->definition;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getAllowedValuesProvider() {
+    if ($this->getSetting('allowed_values')) {
+      $allowed_values_provider = $this->getSetting('allowed_values_provider');
+
+      // @todo throw an exception if this class doesn't implement the interface?
+      if (!empty($allowed_values_provider) && in_array('Drupal\Core\TypedData\AllowedValuesProviderInterface', class_implements($allowed_values_provider))) {
+        return new $allowed_values_provider($this);
+      }
+      else {
+        return new DefaultAllowedValuesProvider($this);
+      }
+    }
+
+    return NULL;
+  }
+
+  /**
+   * @param $values
+   *
+   * @return static
+   */
+  public function setAllowedValues($values) {
+    return $this->setSetting('allowed_values', $values);
+  }
+
+  /**
+   *
+   */
+  public function setAllowedValuesProvider($provider) {
+    return $this->setSetting('allowed_values_provider', $provider);
+  }
+
 }
diff --git a/core/lib/Drupal/Core/TypedData/DataDefinitionInterface.php b/core/lib/Drupal/Core/TypedData/DataDefinitionInterface.php
index 1b1aecb..262d2de 100644
--- a/core/lib/Drupal/Core/TypedData/DataDefinitionInterface.php
+++ b/core/lib/Drupal/Core/TypedData/DataDefinitionInterface.php
@@ -203,4 +203,13 @@ public function getConstraints();
    */
   public function getConstraint($constraint_name);
 
+  /**
+   * Returns an allowed value provider if allowed values are defined.
+   *
+   * @return \Drupal\Core\TypedData\AllowedValuesProviderInterface|null
+   *   An allowed values provider, or NULL if there no allowed values are
+   *   defined.
+   */
+  public function getAllowedValuesProvider();
+
 }
diff --git a/core/lib/Drupal/Core/TypedData/TypedDataManager.php b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
index c9afe86..5cce171 100644
--- a/core/lib/Drupal/Core/TypedData/TypedDataManager.php
+++ b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
@@ -377,7 +377,7 @@ public function getDefaultConstraints(DataDefinitionInterface $definition) {
       $constraints['NotNull'] = array();
     }
     // Check if the class provides allowed values.
-    if (is_subclass_of($definition->getClass(),'Drupal\Core\TypedData\AllowedValuesInterface')) {
+    if (is_subclass_of($definition->getClass(), 'Drupal\Core\TypedData\AllowedValuesProviderInterface')) {
       $constraints['AllowedValues'] = array();
     }
     // Add any constraints about referenced data.
diff --git a/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/AllowedValuesConstraintValidator.php b/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/AllowedValuesConstraintValidator.php
index da5263a..3c7d69f 100644
--- a/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/AllowedValuesConstraintValidator.php
+++ b/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/AllowedValuesConstraintValidator.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\Core\Validation\Plugin\Validation\Constraint;
 
-use Drupal\Core\TypedData\AllowedValuesInterface;
+use Drupal\Core\TypedData\AllowedValuesProviderInterface;
 use Drupal\Core\TypedData\ComplexDataInterface;
 use Symfony\Component\Validator\Constraint;
 use Symfony\Component\Validator\Constraints\ChoiceValidator;
@@ -23,7 +23,7 @@ class AllowedValuesConstraintValidator extends ChoiceValidator {
   public function validate($value, Constraint $constraint) {
     $typed_data = $this->context->getMetadata()->getTypedData();
 
-    if ($typed_data instanceof AllowedValuesInterface) {
+    if ($typed_data instanceof AllowedValuesProviderInterface) {
       $account = \Drupal::currentUser();
       $allowed_values = $typed_data->getSettableValues($account);
       $constraint->choices = $allowed_values;
diff --git a/core/modules/entity_reference/src/ConfigurableEntityReferenceItem.php b/core/modules/entity_reference/src/ConfigurableEntityReferenceItem.php
index cabf660..1be4cfc 100644
--- a/core/modules/entity_reference/src/ConfigurableEntityReferenceItem.php
+++ b/core/modules/entity_reference/src/ConfigurableEntityReferenceItem.php
@@ -12,7 +12,7 @@
 use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
 use Drupal\Core\Form\OptGroup;
 use Drupal\Core\Session\AccountInterface;
-use Drupal\Core\TypedData\AllowedValuesInterface;
+use Drupal\Core\TypedData\AllowedValuesProviderInterface;
 use Drupal\Core\TypedData\DataDefinition;
 use Drupal\Core\Validation\Plugin\Validation\Constraint\AllowedValuesConstraint;
 use Drupal\field\FieldConfigInterface;
@@ -28,7 +28,7 @@
  *
  * @see entity_reference_field_info_alter().
  */
-class ConfigurableEntityReferenceItem extends EntityReferenceItem implements AllowedValuesInterface {
+class ConfigurableEntityReferenceItem extends EntityReferenceItem implements AllowedValuesProviderInterface {
 
   /**
    * {@inheritdoc}
@@ -67,7 +67,7 @@ public function getPossibleOptions(AccountInterface $account = NULL) {
   /**
    * {@inheritdoc}
    */
-  public function getSettableValues(AccountInterface $account = NULL) {
+  public function getSettableValues($data, AccountInterface $account = NULL) {
     // Flatten options first, because "settable options" may contain group
     // arrays.
     $flatten_options = OptGroup::flattenOptions($this->getSettableOptions($account));
@@ -77,7 +77,7 @@ public function getSettableValues(AccountInterface $account = NULL) {
   /**
    * {@inheritdoc}
    */
-  public function getSettableOptions(AccountInterface $account = NULL) {
+  public function getSettableOptions($data, AccountInterface $account = NULL) {
     $field_definition = $this->getFieldDefinition();
     if (!$options = \Drupal::service('plugin.manager.entity_reference.selection')->getSelectionHandler($field_definition, $this->getEntity())->getReferenceableEntities()) {
       return array();
diff --git a/core/modules/field/src/Entity/FieldInstanceConfig.php b/core/modules/field/src/Entity/FieldInstanceConfig.php
index ed1400b..8b92e5c 100644
--- a/core/modules/field/src/Entity/FieldInstanceConfig.php
+++ b/core/modules/field/src/Entity/FieldInstanceConfig.php
@@ -745,4 +745,11 @@ public static function loadByName($entity_type_id, $bundle, $field_name) {
     return \Drupal::entityManager()->getStorage('field_instance_config')->load($entity_type_id . '.' . $bundle . '.' . $field_name);
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getAllowedValuesProvider() {
+    return $this->getItemDefinition()->getAllowedValuesProvider();
+  }
+
 }
diff --git a/core/modules/filter/src/Plugin/DataType/FilterFormat.php b/core/modules/filter/src/Plugin/DataType/FilterFormat.php
index f842896..4e7354d 100644
--- a/core/modules/filter/src/Plugin/DataType/FilterFormat.php
+++ b/core/modules/filter/src/Plugin/DataType/FilterFormat.php
@@ -8,7 +8,7 @@
 namespace Drupal\filter\Plugin\DataType;
 
 use Drupal\Core\Session\AccountInterface;
-use Drupal\Core\TypedData\AllowedValuesInterface;
+use Drupal\Core\TypedData\AllowedValuesProviderInterface;
 use Drupal\Core\TypedData\Plugin\DataType\String;
 
 /**
@@ -19,7 +19,7 @@
  *   label = @Translation("Filter format")
  * )
  */
-class FilterFormat extends String implements AllowedValuesInterface {
+class FilterFormat extends String implements AllowedValuesProviderInterface {
 
   /**
    * {@inheritdoc}
@@ -38,14 +38,14 @@ public function getPossibleOptions(AccountInterface $account = NULL) {
   /**
    * {@inheritdoc}
    */
-  public function getSettableValues(AccountInterface $account = NULL) {
+  public function getSettableValues($data, AccountInterface $account = NULL) {
     return array_keys($this->getSettableOptions($account));
   }
 
   /**
    * {@inheritdoc}
    */
-  public function getSettableOptions(AccountInterface $account = NULL) {
+  public function getSettableOptions($data, AccountInterface $account = NULL) {
     // @todo: Avoid calling functions but move to injected dependencies.
     return array_map(function ($format) { return $format->label(); }, filter_formats($account));
   }
diff --git a/core/modules/filter/src/Tests/FilterAPITest.php b/core/modules/filter/src/Tests/FilterAPITest.php
index 2c5522a..6eaa4df 100644
--- a/core/modules/filter/src/Tests/FilterAPITest.php
+++ b/core/modules/filter/src/Tests/FilterAPITest.php
@@ -8,7 +8,7 @@
 namespace Drupal\filter\Tests;
 
 use Drupal\Core\Session\AnonymousUserSession;
-use Drupal\Core\TypedData\AllowedValuesInterface;
+use Drupal\Core\TypedData\AllowedValuesProviderInterface;
 use Drupal\Core\TypedData\DataDefinition;
 use Drupal\filter\Plugin\DataType\FilterFormat;
 use Drupal\filter\Plugin\FilterInterface;
@@ -273,7 +273,7 @@ function testTypedDataAPI() {
     $definition = DataDefinition::create('filter_format');
     $data = \Drupal::typedDataManager()->create($definition);
 
-    $this->assertTrue($data instanceof AllowedValuesInterface, 'Typed data object implements \Drupal\Core\TypedData\AllowedValuesInterface');
+    $this->assertTrue($data instanceof AllowedValuesProviderInterface, 'Typed data object implements \Drupal\Core\TypedData\AllowedValuesInterface');
 
     $filtered_html_user = $this->createUser(array('uid' => 2), array(
       entity_load('filter_format', 'filtered_html')->getPermissionName(),
diff --git a/core/modules/node/src/Entity/Node.php b/core/modules/node/src/Entity/Node.php
index 90ab790..bf26401 100644
--- a/core/modules/node/src/Entity/Node.php
+++ b/core/modules/node/src/Entity/Node.php
@@ -381,7 +381,8 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ->setLabel(t('Publishing status'))
       ->setDescription(t('A boolean indicating whether the node is published.'))
       ->setRevisionable(TRUE)
-      ->setTranslatable(TRUE);
+      ->setTranslatable(TRUE)
+      ->setAllowedValues(array(FALSE, TRUE));
 
     $fields['created'] = FieldDefinition::create('created')
       ->setLabel(t('Created'))
diff --git a/core/modules/options/options.api.php b/core/modules/options/options.api.php
index 20010ac..f22f9aa 100644
--- a/core/modules/options/options.api.php
+++ b/core/modules/options/options.api.php
@@ -12,7 +12,7 @@
  *
  * @param array $options
  *   The array of options for the field, as returned by
- *   \Drupal\Core\TypedData\AllowedValuesInterface::getSettableOptions(). An
+ *   \Drupal\Core\TypedData\AllowedValuesProviderInterface::getSettableOptions(). An
  *   empty option (_none) might have been added, depending on the field
  *   properties.
  *
diff --git a/core/modules/options/src/Plugin/Field/FieldType/ListBooleanItem.php b/core/modules/options/src/Plugin/Field/FieldType/ListBooleanItem.php
index 5d16585..46889f7 100644
--- a/core/modules/options/src/Plugin/Field/FieldType/ListBooleanItem.php
+++ b/core/modules/options/src/Plugin/Field/FieldType/ListBooleanItem.php
@@ -11,7 +11,7 @@
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
 use Drupal\Core\Field\FieldItemBase;
 use Drupal\Core\Session\AccountInterface;
-use Drupal\Core\TypedData\AllowedValuesInterface;
+use Drupal\Core\TypedData\AllowedValuesProviderInterface;
 use Drupal\Core\TypedData\DataDefinition;
 
 /**
@@ -25,7 +25,7 @@
  *   default_formatter = "list_default",
  * )
  */
-class ListBooleanItem extends FieldItemBase implements AllowedValuesInterface {
+class ListBooleanItem extends FieldItemBase implements AllowedValuesProviderInterface {
 
   /**
    * {@inheritdoc}
@@ -54,14 +54,14 @@ public function getPossibleOptions(AccountInterface $account = NULL) {
   /**
    * {@inheritdoc}
    */
-  public function getSettableValues(AccountInterface $account = NULL) {
+  public function getSettableValues($data, AccountInterface $account = NULL) {
     return array_keys($this->getSettableOptions($account));
   }
 
   /**
    * {@inheritdoc}
    */
-  public function getSettableOptions(AccountInterface $account = NULL) {
+  public function getSettableOptions($data, AccountInterface $account = NULL) {
     return options_allowed_values($this->getFieldDefinition(), $this->getEntity());
   }
 
diff --git a/core/modules/options/src/Plugin/Field/FieldType/ListItemBase.php b/core/modules/options/src/Plugin/Field/FieldType/ListItemBase.php
index d61aef1..6cf1b14 100644
--- a/core/modules/options/src/Plugin/Field/FieldType/ListItemBase.php
+++ b/core/modules/options/src/Plugin/Field/FieldType/ListItemBase.php
@@ -10,12 +10,12 @@
 use Drupal\Core\Field\FieldItemBase;
 use Drupal\Core\Form\OptGroup;
 use Drupal\Core\Session\AccountInterface;
-use Drupal\Core\TypedData\AllowedValuesInterface;
+use Drupal\Core\TypedData\AllowedValuesProviderInterface;
 
 /**
  * Plugin base class inherited by the options field types.
  */
-abstract class ListItemBase extends FieldItemBase implements AllowedValuesInterface {
+abstract class ListItemBase extends FieldItemBase implements AllowedValuesProviderInterface {
 
   /**
    * {@inheritdoc}
@@ -47,7 +47,7 @@ public function getPossibleOptions(AccountInterface $account = NULL) {
   /**
    * {@inheritdoc}
    */
-  public function getSettableValues(AccountInterface $account = NULL) {
+  public function getSettableValues($data, AccountInterface $account = NULL) {
     // Flatten options firstly, because Settable Options may contain group
     // arrays.
     $flatten_options = OptGroup::flattenOptions($this->getSettableOptions($account));
@@ -57,7 +57,7 @@ public function getSettableValues(AccountInterface $account = NULL) {
   /**
    * {@inheritdoc}
    */
-  public function getSettableOptions(AccountInterface $account = NULL) {
+  public function getSettableOptions($data, AccountInterface $account = NULL) {
     $allowed_options = options_allowed_values($this->getFieldDefinition(), $this->getEntity());
     return $allowed_options;
   }
diff --git a/core/modules/options/src/Plugin/Field/FieldWidget/OptionsWidgetBase.php b/core/modules/options/src/Plugin/Field/FieldWidget/OptionsWidgetBase.php
index 01e7688..5f55003 100644
--- a/core/modules/options/src/Plugin/Field/FieldWidget/OptionsWidgetBase.php
+++ b/core/modules/options/src/Plugin/Field/FieldWidget/OptionsWidgetBase.php
@@ -9,15 +9,16 @@
 
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\FieldItemListInterface;
-use Drupal\Core\Field\FieldItemInterface;
 use Drupal\Core\Field\WidgetBase;
+use Drupal\Core\TypedData\AllowedValuesProviderInterface;
+
 
 /**
  * Base class for the 'options_*' widgets.
  *
  * Field types willing to enable one or several of the widgets defined in
  * options.module (select, radios/checkboxes, on/off checkbox) need to
- * implement the AllowedValuesInterface to specify the list of options to
+ * implement the AllowedValuesProviderInterface to specify the list of options to
  * display in the widgets.
  *
  * @see \Drupal\Core\TypedData\AllowedValuesInterface
@@ -119,7 +120,7 @@ public static function validateElement(array $element, array &$form_state) {
    * @return array
    *   The array of options for the widget.
    */
-  protected function getOptions(FieldItemInterface $item) {
+  protected function getOptions(AllowedValuesProviderInterface $item) {
     if (!isset($this->options)) {
       // Limit the settable options for the current user account.
       $options = $item->getSettableOptions(\Drupal::currentUser());
diff --git a/core/modules/taxonomy/src/Plugin/Field/FieldType/TaxonomyTermReferenceItem.php b/core/modules/taxonomy/src/Plugin/Field/FieldType/TaxonomyTermReferenceItem.php
index fb6a93e..160ec9d 100644
--- a/core/modules/taxonomy/src/Plugin/Field/FieldType/TaxonomyTermReferenceItem.php
+++ b/core/modules/taxonomy/src/Plugin/Field/FieldType/TaxonomyTermReferenceItem.php
@@ -11,7 +11,7 @@
 use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
 use Drupal\Core\Form\OptGroup;
 use Drupal\Core\Session\AccountInterface;
-use Drupal\Core\TypedData\AllowedValuesInterface;
+use Drupal\Core\TypedData\AllowedValuesProviderInterface;
 
 /**
  * Plugin implementation of the 'term_reference' field type.
@@ -25,7 +25,7 @@
  *   list_class = "\Drupal\taxonomy\Plugin\Field\FieldType\TaxonomyTermReferenceFieldItemList"
  * )
  */
-class TaxonomyTermReferenceItem extends EntityReferenceItem implements AllowedValuesInterface {
+class TaxonomyTermReferenceItem extends EntityReferenceItem implements AllowedValuesProviderInterface {
 
   /**
    * {@inheritdoc}
@@ -63,7 +63,7 @@ public function getPossibleOptions(AccountInterface $account = NULL) {
   /**
    * {@inheritdoc}
    */
-  public function getSettableValues(AccountInterface $account = NULL) {
+  public function getSettableValues($data, AccountInterface $account = NULL) {
     // Flatten options firstly, because Settable Options may contain group
     // arrays.
     $flatten_options = OptGroup::flattenOptions($this->getSettableOptions($account));
@@ -73,14 +73,15 @@ public function getSettableValues(AccountInterface $account = NULL) {
   /**
    * {@inheritdoc}
    */
-  public function getSettableOptions(AccountInterface $account = NULL) {
+  public function getSettableOptions($data, AccountInterface $account = NULL) {
     if ($callback = $this->getSetting('options_list_callback')) {
       return call_user_func_array($callback, array($this->getFieldDefinition(), $this->getEntity()));
     }
     else {
       $options = array();
+      $vocabulary_storage = \Drupal::entityManager()->getStorage('taxonomy_vocabulary');
       foreach ($this->getSetting('allowed_values') as $tree) {
-        if ($vocabulary = entity_load('taxonomy_vocabulary', $tree['vocabulary'])) {
+        if ($vocabulary = $vocabulary_storage->load($tree['vocabulary'])) {
           if ($terms = taxonomy_get_tree($vocabulary->id(), $tree['parent'], NULL, TRUE)) {
             foreach ($terms as $term) {
               $options[$term->id()] = str_repeat('-', $term->depth) . $term->getName();
