diff --git a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraintValidator.php b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraintValidator.php
index 40c7370..2f95c7e 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraintValidator.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraintValidator.php
@@ -92,7 +92,7 @@ public function validate($value, Constraint $constraint) {
     }
 
     /** @var \Drupal\Core\Entity\EntityReferenceSelection\SelectionInterface $handler * */
-    $handler = $this->selectionManager->getSelectionHandler($value->getFieldDefinition());
+    $handler = $this->selectionManager->getSelectionHandler($value->getFieldDefinition(), $value->getEntity());
     $target_type_id = $value->getFieldDefinition()->getSetting('target_type');
 
     // Add violations on deltas with a new entity that is not valid.
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/EntityReferenceAutocompleteWidget.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/EntityReferenceAutocompleteWidget.php
index b5e16c1..a66fda7 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/EntityReferenceAutocompleteWidget.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/EntityReferenceAutocompleteWidget.php
@@ -101,6 +101,13 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
       '#placeholder' => $this->getSetting('placeholder'),
     );
 
+    if ($this->getFieldSetting('handler') == 'views') {
+      $element['#selection_settings']['entity'] = [
+        'type' => $entity->getEntityTypeId(),
+        'id' => $entity->id(),
+      ];
+    }
+
     if ($this->getSelectionHandlerSetting('auto_create') && ($bundle = $this->getAutocreateBundle())) {
       $element['#autocreate'] = array(
         'bundle' => $bundle,
diff --git a/core/modules/views/src/Plugin/EntityReferenceSelection/ViewsSelection.php b/core/modules/views/src/Plugin/EntityReferenceSelection/ViewsSelection.php
index db19052..f120b48 100644
--- a/core/modules/views/src/Plugin/EntityReferenceSelection/ViewsSelection.php
+++ b/core/modules/views/src/Plugin/EntityReferenceSelection/ViewsSelection.php
@@ -3,6 +3,7 @@
 namespace Drupal\views\Plugin\EntityReferenceSelection;
 
 use Drupal\Core\Database\Query\SelectInterface;
+use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Entity\EntityReferenceSelection\SelectionInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
@@ -11,6 +12,7 @@
 use Drupal\Core\Plugin\PluginBase;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\Url;
+use Drupal\Core\Utility\Token;
 use Drupal\views\Views;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -48,6 +50,13 @@ class ViewsSelection extends PluginBase implements SelectionInterface, Container
   protected $currentUser;
 
   /**
+   * The Token service.
+   *
+   * @var \Drupal\Core\Utility\Token
+   */
+  protected $token;
+
+  /**
    * Constructs a new SelectionBase object.
    *
    * @param array $configuration
@@ -62,13 +71,16 @@ class ViewsSelection extends PluginBase implements SelectionInterface, Container
    *   The module handler service.
    * @param \Drupal\Core\Session\AccountInterface $current_user
    *   The current user.
+   * @param \Drupal\Core\Utility\Token $token
+   *   The token service.
    */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityManagerInterface $entity_manager, ModuleHandlerInterface $module_handler, AccountInterface $current_user) {
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityManagerInterface $entity_manager, ModuleHandlerInterface $module_handler, AccountInterface $current_user, Token $token) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
 
     $this->entityManager = $entity_manager;
     $this->moduleHandler = $module_handler;
     $this->currentUser = $current_user;
+    $this->token = $token;
   }
 
   /**
@@ -81,7 +93,8 @@ public static function create(ContainerInterface $container, array $configuratio
       $plugin_definition,
       $container->get('entity.manager'),
       $container->get('module_handler'),
-      $container->get('current_user')
+      $container->get('current_user'),
+      $container->get('token')
     );
   }
 
@@ -137,7 +150,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
         '#title' => $this->t('View arguments'),
         '#default_value' => $default,
         '#required' => FALSE,
-        '#description' => $this->t('Provide a comma separated list of arguments to pass to the view.'),
+        '#description' => t('Provide a comma separated list of arguments to pass to the view.')  . '<br />' . t('This field supports tokens.'),
       );
     }
     else {
@@ -213,7 +226,13 @@ protected function initializeView($match = NULL, $match_operator = 'CONTAINS', $
   public function getReferenceableEntities($match = NULL, $match_operator = 'CONTAINS', $limit = 0) {
     $handler_settings = $this->configuration['handler_settings'];
     $display_name = $handler_settings['view']['display_name'];
-    $arguments = $handler_settings['view']['arguments'];
+    $entity = NULL;
+    if (!empty($handler_settings['entity'])) {
+      $entity = $this->entityManager
+        ->getStorage($handler_settings['entity']['type'])
+        ->load($handler_settings['entity']['id']);
+    }
+    $arguments = $this->replaceArgumentTokens($handler_settings['view']['arguments'], $entity);
     $result = array();
     if ($this->initializeView($match, $match_operator, $limit)) {
       // Get the results.
@@ -244,11 +263,11 @@ public function countReferenceableEntities($match = NULL, $match_operator = 'CON
   public function validateReferenceableEntities(array $ids) {
     $handler_settings = $this->configuration['handler_settings'];
     $display_name = $handler_settings['view']['display_name'];
-    $arguments = $handler_settings['view']['arguments'];
+    $arguments = $this->replaceArgumentTokens($handler_settings['view']['arguments'], $this->configuration['entity'] ?: null);
     $result = array();
     if ($this->initializeView(NULL, 'CONTAINS', 0, $ids)) {
       // Get the results.
-      $entities = $this->view->executeDisplay($display_name, $arguments);
+      $entities = $this->view->executeDisplay($display_name, $arguments) ?: [];
       $result = array_keys($entities);
     }
     return $result;
@@ -288,4 +307,39 @@ public static function settingsFormValidate($element, FormStateInterface $form_s
    */
   public function entityQueryAlter(SelectInterface $query) { }
 
+  /**
+   * Handles replacing tokens in arguments for views.
+   *
+   * @param array $args
+   *   An array of arguments that may contain tokens.
+   * @param \Drupal\Core\Entity\EntityInterface $entity
+   *   The entity for use as token values.
+   *
+   * @return array
+   *   The arguments to be sent to the View.
+   */
+  protected function replaceArgumentTokens($args, EntityInterface $entity = NULL) {
+    $options = [
+      'clear' => TRUE,
+    ];
+
+    $data = [];
+
+    if ($entity) {
+      $tokenType = $entity->getEntityTypeId();
+
+      // Taxonomy tokens don't match the entity name.
+      if (strpos($tokenType, 'taxonomy_') === 0) {
+        $tokenType = substr($tokenType, 9);
+      }
+
+      $data = [$tokenType => $entity];
+    }
+
+    foreach ($args as $key => $arg) {
+      $args[$key] = $this->token->replace($arg, $data, $options);
+    }
+
+    return $args;
+  }
 }
