diff --git a/core/modules/aggregator/src/Plugin/views/argument/Fid.php b/core/modules/aggregator/src/Plugin/views/argument/Fid.php
index 90564d5..ad805ff 100644
--- a/core/modules/aggregator/src/Plugin/views/argument/Fid.php
+++ b/core/modules/aggregator/src/Plugin/views/argument/Fid.php
@@ -2,9 +2,7 @@
 
 namespace Drupal\aggregator\Plugin\views\argument;
 
-use Drupal\Core\Entity\EntityManagerInterface;
-use Drupal\views\Plugin\views\argument\NumericArgument;
-use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\views\Plugin\views\argument\EntityArgument;
 
 /**
  * Argument handler to accept an aggregator feed id.
@@ -13,50 +11,6 @@
  *
  * @ViewsArgument("aggregator_fid")
  */
-class Fid extends NumericArgument {
-
-  /**
-   * The entity manager service.
-   *
-   * @var \Drupal\Core\Entity\EntityManagerInterface
-   */
-  protected $entityManager;
-
-  /**
-   * Constructs a Drupal\Component\Plugin\PluginBase object.
-   *
-   * @param array $configuration
-   *   A configuration array containing information about the plugin instance.
-   * @param string $plugin_id
-   *   The plugin_id for the plugin instance.
-   * @param mixed $plugin_definition
-   *   The plugin implementation definition.
-   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
-   *   The entity manager.
-   */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityManagerInterface $entity_manager) {
-    parent::__construct($configuration, $plugin_id, $plugin_definition);
-    $this->entityManager = $entity_manager;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
-    return new static($configuration, $plugin_id, $plugin_definition, $container->get('entity.manager'));
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function titleQuery() {
-    $titles = [];
-
-    $feeds = $this->entityManager->getStorage('aggregator_feed')->loadMultiple($this->value);
-    foreach ($feeds as $feed) {
-      $titles[] = $feed->label();
-    }
-    return $titles;
-  }
+class Fid extends EntityArgument {
 
 }
diff --git a/core/modules/aggregator/src/Plugin/views/argument/Iid.php b/core/modules/aggregator/src/Plugin/views/argument/Iid.php
index 44b4569..fa58c0a 100644
--- a/core/modules/aggregator/src/Plugin/views/argument/Iid.php
+++ b/core/modules/aggregator/src/Plugin/views/argument/Iid.php
@@ -2,9 +2,7 @@
 
 namespace Drupal\aggregator\Plugin\views\argument;
 
-use Drupal\Core\Entity\EntityManagerInterface;
-use Drupal\views\Plugin\views\argument\NumericArgument;
-use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\views\Plugin\views\argument\EntityArgument;
 
 /**
  * Argument handler to accept an aggregator item id.
@@ -13,50 +11,6 @@
  *
  * @ViewsArgument("aggregator_iid")
  */
-class Iid extends NumericArgument {
-
-  /**
-   * The entity manager service.
-   *
-   * @var \Drupal\Core\Entity\EntityManagerInterface
-   */
-  protected $entityManager;
-
-  /**
-   * Constructs a Drupal\Component\Plugin\PluginBase object.
-   *
-   * @param array $configuration
-   *   A configuration array containing information about the plugin instance.
-   * @param string $plugin_id
-   *   The plugin_id for the plugin instance.
-   * @param mixed $plugin_definition
-   *   The plugin implementation definition.
-   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
-   *   The entity manager.
-   */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityManagerInterface $entity_manager) {
-    parent::__construct($configuration, $plugin_id, $plugin_definition);
-    $this->entityManager = $entity_manager;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
-    return new static($configuration, $plugin_id, $plugin_definition, $container->get('entity.manager'));
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function titleQuery() {
-    $titles = [];
-
-    $items = $this->entityManager->getStorage('aggregator_item')->loadMultiple($this->value);
-    foreach ($items as $feed) {
-      $titles[] = $feed->label();
-    }
-    return $titles;
-  }
+class Iid extends EntityArgument {
 
 }
diff --git a/core/modules/file/src/Plugin/views/argument/Fid.php b/core/modules/file/src/Plugin/views/argument/Fid.php
index 1654fcc..163db65 100644
--- a/core/modules/file/src/Plugin/views/argument/Fid.php
+++ b/core/modules/file/src/Plugin/views/argument/Fid.php
@@ -2,10 +2,7 @@
 
 namespace Drupal\file\Plugin\views\argument;
 
-use Drupal\Core\Entity\EntityManagerInterface;
-use Drupal\views\Plugin\views\argument\NumericArgument;
-use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
-use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\views\Plugin\views\argument\EntityArgument;
 
 /**
  * Argument handler to accept multiple file ids.
@@ -14,58 +11,6 @@
  *
  * @ViewsArgument("file_fid")
  */
-class Fid extends NumericArgument implements ContainerFactoryPluginInterface {
-
-  /**
-   * The entity manager service
-   *
-   * @var \Drupal\Core\Entity\EntityManagerInterface
-   */
-  protected $entityManager;
-
-  /**
-   * Constructs a Drupal\file\Plugin\views\argument\Fid object.
-   *
-   * @param array $configuration
-   *   A configuration array containing information about the plugin instance.
-   * @param string $plugin_id
-   *   The plugin_id for the plugin instance.
-   * @param mixed $plugin_definition
-   *   The plugin implementation definition.
-   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
-   *   The entity manager.
-   */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityManagerInterface $entity_manager) {
-    parent::__construct($configuration, $plugin_id, $plugin_definition);
-    $this->entityManager = $entity_manager;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
-    return new static(
-      $configuration,
-      $plugin_id,
-      $plugin_definition,
-      $container->get('entity.manager')
-    );
-  }
-
-  /**
-   * Override the behavior of titleQuery(). Get the filenames.
-   */
-  public function titleQuery() {
-    $storage = $this->entityManager->getStorage('file');
-    $fids = $storage->getQuery()
-      ->condition('fid', $this->value, 'IN')
-      ->execute();
-    $files = $storage->loadMultiple($fids);
-    $titles = [];
-    foreach ($files as $file) {
-      $titles[] = $file->getFilename();
-    }
-    return $titles;
-  }
+class Fid extends EntityArgument {
 
 }
diff --git a/core/modules/node/src/Plugin/views/argument/Nid.php b/core/modules/node/src/Plugin/views/argument/Nid.php
index 3b0f8df..9376db1 100644
--- a/core/modules/node/src/Plugin/views/argument/Nid.php
+++ b/core/modules/node/src/Plugin/views/argument/Nid.php
@@ -2,63 +2,13 @@
 
 namespace Drupal\node\Plugin\views\argument;
 
-use Drupal\node\NodeStorageInterface;
-use Drupal\views\Plugin\views\argument\NumericArgument;
-use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\views\Plugin\views\argument\EntityArgument;
 
 /**
  * Argument handler to accept a node id.
  *
  * @ViewsArgument("node_nid")
  */
-class Nid extends NumericArgument {
-
-  /**
-   * The node storage.
-   *
-   * @var \Drupal\node\NodeStorageInterface
-   */
-  protected $nodeStorage;
-
-  /**
-   * Constructs the Nid object.
-   *
-   * @param array $configuration
-   *   A configuration array containing information about the plugin instance.
-   * @param string $plugin_id
-   *   The plugin_id for the plugin instance.
-   * @param mixed $plugin_definition
-   *   The plugin implementation definition.
-   * @param NodeStorageInterface $node_storage
-   */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, NodeStorageInterface $node_storage) {
-    parent::__construct($configuration, $plugin_id, $plugin_definition);
-    $this->nodeStorage = $node_storage;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
-    return new static(
-      $configuration,
-      $plugin_id,
-      $plugin_definition,
-      $container->get('entity.manager')->getStorage('node')
-    );
-  }
-
-  /**
-   * Override the behavior of title(). Get the title of the node.
-   */
-  public function titleQuery() {
-    $titles = [];
-
-    $nodes = $this->nodeStorage->loadMultiple($this->value);
-    foreach ($nodes as $node) {
-      $titles[] = $node->label();
-    }
-    return $titles;
-  }
+class Nid extends EntityArgument {
 
 }
diff --git a/core/modules/taxonomy/src/Plugin/views/argument/Taxonomy.php b/core/modules/taxonomy/src/Plugin/views/argument/Taxonomy.php
index 25efbf3..8c3f2cf 100644
--- a/core/modules/taxonomy/src/Plugin/views/argument/Taxonomy.php
+++ b/core/modules/taxonomy/src/Plugin/views/argument/Taxonomy.php
@@ -2,10 +2,8 @@
 
 namespace Drupal\taxonomy\Plugin\views\argument;
 
-use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
-use Drupal\views\Plugin\views\argument\NumericArgument;
-use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\views\Plugin\views\argument\EntityArgument;
 
 /**
  * Argument handler for basic taxonomy tid.
@@ -14,47 +12,6 @@
  *
  * @ViewsArgument("taxonomy")
  */
-class Taxonomy extends NumericArgument implements ContainerFactoryPluginInterface {
-
-  /**
-   * @var EntityStorageInterface
-   */
-  protected $termStorage;
-
-  /**
-   * {@inheritdoc}
-   */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityStorageInterface $term_storage) {
-    parent::__construct($configuration, $plugin_id, $plugin_definition);
-
-    $this->termStorage = $term_storage;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
-    return new static(
-      $configuration,
-      $plugin_id,
-      $plugin_definition,
-      $container->get('entity.manager')->getStorage('taxonomy_term')
-    );
-  }
-
-  /**
-   * Override the behavior of title(). Get the title of the node.
-   */
-  public function title() {
-    // There might be no valid argument.
-    if ($this->argument) {
-      $term = $this->termStorage->load($this->argument);
-      if (!empty($term)) {
-        return $term->getName();
-      }
-    }
-    // TODO review text
-    return $this->t('No name');
-  }
+class Taxonomy extends EntityArgument implements ContainerFactoryPluginInterface {
 
 }
diff --git a/core/modules/taxonomy/src/Plugin/views/argument/VocabularyVid.php b/core/modules/taxonomy/src/Plugin/views/argument/VocabularyVid.php
index d2fe820..3855105 100644
--- a/core/modules/taxonomy/src/Plugin/views/argument/VocabularyVid.php
+++ b/core/modules/taxonomy/src/Plugin/views/argument/VocabularyVid.php
@@ -2,9 +2,7 @@
 
 namespace Drupal\taxonomy\Plugin\views\argument;
 
-use Drupal\views\Plugin\views\argument\NumericArgument;
-use Drupal\taxonomy\VocabularyStorageInterface;
-use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\views\Plugin\views\argument\EntityArgument;
 
 /**
  * Argument handler to accept a vocabulary id.
@@ -13,54 +11,6 @@
  *
  * @ViewsArgument("vocabulary_vid")
  */
-class VocabularyVid extends NumericArgument {
-
-  /**
-    * The vocabulary storage.
-    *
-    * @var \Drupal\taxonomy\VocabularyStorageInterface
-    */
-  protected $vocabularyStorage;
-
-  /**
-   * Constructs the VocabularyVid object.
-   *
-   * @param array $configuration
-   *   A configuration array containing information about the plugin instance.
-   * @param string $plugin_id
-   *   The plugin_id for the plugin instance.
-   * @param mixed $plugin_definition
-   *   The plugin implementation definition.
-   * @param VocabularyStorageInterface $vocabulary_storage
-   *   The vocabulary storage.
-   */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, VocabularyStorageInterface $vocabulary_storage) {
-    parent::__construct($configuration, $plugin_id, $plugin_definition);
-    $this->vocabularyStorage = $vocabulary_storage;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
-    return new static(
-      $configuration,
-      $plugin_id,
-      $plugin_definition,
-      $container->get('entity.manager')->getStorage('taxonomy_vocabulary')
-    );
-  }
-
-  /**
-   * Override the behavior of title(). Get the name of the vocabulary.
-   */
-  public function title() {
-    $vocabulary = $this->vocabularyStorage->load($this->argument);
-    if ($vocabulary) {
-      return $vocabulary->label();
-    }
-
-    return $this->t('No vocabulary');
-  }
+class VocabularyVid extends EntityArgument {
 
 }
diff --git a/core/modules/user/src/Plugin/views/argument/Uid.php b/core/modules/user/src/Plugin/views/argument/Uid.php
index 77fac07..2c79c28 100644
--- a/core/modules/user/src/Plugin/views/argument/Uid.php
+++ b/core/modules/user/src/Plugin/views/argument/Uid.php
@@ -2,9 +2,7 @@
 
 namespace Drupal\user\Plugin\views\argument;
 
-use Drupal\Core\Entity\EntityStorageInterface;
-use Drupal\views\Plugin\views\argument\NumericArgument;
-use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\views\Plugin\views\argument\EntityArgument;
 
 /**
  * Argument handler to accept a user id.
@@ -13,50 +11,6 @@
  *
  * @ViewsArgument("user_uid")
  */
-class Uid extends NumericArgument {
-
-  /**
-   * The user storage.
-   *
-   * @var \Drupal\Core\Entity\EntityStorageInterface
-   */
-  protected $storage;
-
-  /**
-   * Constructs a Drupal\Component\Plugin\PluginBase object.
-   *
-   * @param array $configuration
-   *   A configuration array containing information about the plugin instance.
-   * @param string $plugin_id
-   *   The plugin_id for the plugin instance.
-   * @param mixed $plugin_definition
-   *   The plugin implementation definition.
-   * @param \Drupal\Core\Entity\EntityStorageInterface $storage
-   *   The user storage.
-   */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityStorageInterface $storage) {
-    parent::__construct($configuration, $plugin_id, $plugin_definition);
-    $this->storage = $storage;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
-    return new static($configuration, $plugin_id, $plugin_definition,
-      $container->get('entity.manager')->getStorage('user'));
-  }
-
-  /**
-   * Override the behavior of title(). Get the name of the user.
-   *
-   * @return array
-   *    A list of usernames.
-   */
-  public function titleQuery() {
-    return array_map(function($account) {
-      return $account->label();
-    }, $this->storage->loadMultiple($this->value));
-  }
+class Uid extends EntityArgument {
 
 }
diff --git a/core/modules/views/config/schema/views.argument.schema.yml b/core/modules/views/config/schema/views.argument.schema.yml
index 2f43282..26a9548 100644
--- a/core/modules/views/config/schema/views.argument.schema.yml
+++ b/core/modules/views/config/schema/views.argument.schema.yml
@@ -40,6 +40,14 @@ views.argument.numeric:
       type: boolean
       label: 'Exclude'
 
+views.argument.entity_target_id:
+  type: views.argument.numeric
+  label: 'Entity Target ID'
+  mapping:
+    target_entity_type_id:
+      type: string
+      label: 'Target entity type ID'
+
 views.argument.string:
   type: views_argument
   label: 'String'
diff --git a/core/modules/views/src/EntityViewsData.php b/core/modules/views/src/EntityViewsData.php
index 2ba2086..0a42c2e 100644
--- a/core/modules/views/src/EntityViewsData.php
+++ b/core/modules/views/src/EntityViewsData.php
@@ -571,7 +571,10 @@ protected function processViewsDataForEntityReference($table, FieldDefinitionInt
           'id' => 'standard',
         ];
         $views_field['field']['id'] = 'field';
-        $views_field['argument']['id'] = 'numeric';
+        // Provide an argument plugin that has a meaningful titleQuery()
+        // implementation getting the entity label.
+        $views_field['argument']['id'] = 'entity_target_id';
+        $views_field['argument']['target_entity_type_id'] = $entity_type_id;
         $views_field['filter']['id'] = 'numeric';
         $views_field['sort']['id'] = 'standard';
       }
diff --git a/core/modules/views/src/Plugin/views/argument/EntityArgument.php b/core/modules/views/src/Plugin/views/argument/EntityArgument.php
new file mode 100644
index 0000000..5e5aef1
--- /dev/null
+++ b/core/modules/views/src/Plugin/views/argument/EntityArgument.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace Drupal\views\Plugin\views\argument;
+
+use Drupal\Core\Entity\EntityRepositoryInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Argument handler to accept an entity argument.
+ *
+ * @ingroup views_argument_handlers
+ *
+ * @ViewsArgument("entity_target_id")
+ */
+class EntityArgument extends NumericArgument implements ContainerFactoryPluginInterface {
+
+  /**
+   * The entity repository.
+   *
+   * @var \Drupal\Core\Entity\EntityRepositoryInterface
+   */
+  protected $entityRepository;
+
+  /**
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityRepositoryInterface $entity_repository, EntityTypeManagerInterface $entity_type_manager) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->entityRepository = $entity_repository;
+    $this->entityTypeManager = $entity_type_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('entity.repository'),
+      $container->get('entity_type.manager')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  function titleQuery() {
+    $titles = array();
+
+    $entities = $this->entityTypeManager->getStorage($this->definition['target_entity_type_id'])->loadMultiple($this->value);
+    foreach ($entities as $entity) {
+      $titles[$entity->id()] = $this->entityRepository->getTranslationFromContext($entity)->label();
+    }
+    return $titles;
+  }
+
+}
diff --git a/core/modules/views/src/Tests/Plugin/EntityArgumentTest.php b/core/modules/views/src/Tests/Plugin/EntityArgumentTest.php
new file mode 100644
index 0000000..21fea89
--- /dev/null
+++ b/core/modules/views/src/Tests/Plugin/EntityArgumentTest.php
@@ -0,0 +1,72 @@
+<?php
+
+namespace Drupal\views\Tests\Plugin;
+
+use Drupal\taxonomy\Tests\Views\TaxonomyTestBase;
+use Drupal\views\Views;
+
+/**
+ * Tests the handler of the view: entity target argument.
+ *
+ * @group views
+ * @see \Drupal\views\Plugin\views\argument\EntityArgument
+ */
+class EntityArgumentTest extends TaxonomyTestBase {
+
+  /**
+   * Views used by this test.
+   *
+   * @var array
+   */
+  public static $testViews = array('test_entity_id_argument');
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('node', 'taxonomy', 'views_test_config');
+
+  /**
+   * An user with permissions to administer taxonomy.
+   *
+   * @var \Drupal\user\UserInterface
+   */
+  protected $adminUser;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    // Create an administrative user.
+    $this->adminUser = $this->drupalCreateUser(['administer taxonomy', 'bypass node access']);
+    $this->drupalLogin($this->adminUser);
+  }
+
+  /**
+   * Tests the generated title of a view: entity target argument.
+   */
+  public function testArgumentTitle() {
+    $view = Views::getView('test_entity_id_argument');
+
+    // Test with single entity ID examples.
+    $this->drupalGet('/entity-id-argument-test');
+    $this->assertTitle($view->getTitle() . ' | Drupal');
+    $this->drupalGet('/entity-id-argument-test/1');
+    $this->assertTitle('test: title ' . $this->term1->label() . ', input ' . $this->term1->id() . ' | Drupal');
+    $this->drupalGet('/entity-id-argument-test/2');
+    $this->assertTitle('test: title ' . $this->term2->label() . ', input ' . $this->term2->id() . ' | Drupal');
+
+    // Test with multiple entity IDs examples.
+    $this->drupalGet('/entity-id-argument-test/1,2');
+    $this->assertTitle('test: title ' . $this->term1->label() . ', ' . $this->term2->label() . ', input ' . $this->term1->id() . ',' . $this->term2->id() . ' | Drupal');
+    $this->drupalGet('/entity-id-argument-test/2,1');
+    $this->assertTitle('test: title ' . $this->term2->label() . ', ' . $this->term1->label() . ', input ' . $this->term2->id() . ',' . $this->term1->id() . ' | Drupal');
+    $this->drupalGet('/entity-id-argument-test/1+2');
+    $this->assertTitle('test: title ' . $this->term1->label() . ' + ' . $this->term2->label() . ', input ' . $this->term1->id() . '+' . $this->term2->id() . ' | Drupal');
+    $this->drupalGet('/entity-id-argument-test/2+1');
+    $this->assertTitle('test: title ' . $this->term2->label() . ' + ' . $this->term1->label() . ', input ' . $this->term2->id() . '+' . $this->term1->id() . ' | Drupal');
+  }
+}
diff --git a/core/modules/views/src/Tests/Update/EntityArgumentUpdateTest.php b/core/modules/views/src/Tests/Update/EntityArgumentUpdateTest.php
new file mode 100644
index 0000000..f4d4e92
--- /dev/null
+++ b/core/modules/views/src/Tests/Update/EntityArgumentUpdateTest.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Drupal\views\Tests\Update;
+
+use Drupal\system\Tests\Update\UpdatePathTestBase;
+
+/**
+ * Tests the upgrade path for views field plugins.
+ *
+ * @see https://www.drupal.org/node/2455125
+ *
+ * @group Update
+ */
+class EntityArgumentUpdateTest extends UpdatePathTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setDatabaseDumpFiles() {
+    $this->databaseDumpFiles = [
+      __DIR__ . '/../../../../system/tests/fixtures/update/drupal-8.bare.standard.php.gz',
+      __DIR__ . '/../../../tests/fixtures/update/entity-id-argument.php',
+    ];
+  }
+
+  /**
+   * Tests that field plugins are updated properly.
+   */
+  public function testUpdateHookN() {
+    $this->runUpdates();
+
+    $config = \Drupal::config('views.view.test_entity_id_argument_update');
+    $this->assertEqual('entity_target_id', $config->get('display.default.display_options.arguments.field_tags_target_id.plugin_id'));
+    $this->assertEqual('taxonomy_term', $config->get('display.default.display_options.arguments.field_tags_target_id.target_entity_type_id'));
+  }
+
+}
diff --git a/core/modules/views/tests/fixtures/update/entity-id-argument.php b/core/modules/views/tests/fixtures/update/entity-id-argument.php
new file mode 100644
index 0000000..1581551
--- /dev/null
+++ b/core/modules/views/tests/fixtures/update/entity-id-argument.php
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * @file
+ * Test fixture.
+ */
+
+use Drupal\Core\Database\Database;
+use Drupal\Core\Serialization\Yaml;
+
+$connection = Database::getConnection();
+
+$config = Yaml::decode(file_get_contents(__DIR__ . '/views.view.test_entity_id_argument_update.yml'));
+
+$connection->insert('config')
+  ->fields(array(
+    'collection' => '',
+    'name' => 'views.view.test_entity_id_argument_update',
+    'data' => serialize($config),
+  ))
+  ->execute();
diff --git a/core/modules/views/tests/fixtures/update/views.view.test_entity_id_argument_update.yml b/core/modules/views/tests/fixtures/update/views.view.test_entity_id_argument_update.yml
new file mode 100644
index 0000000..9941b64
--- /dev/null
+++ b/core/modules/views/tests/fixtures/update/views.view.test_entity_id_argument_update.yml
@@ -0,0 +1,229 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.node.teaser
+    - node.type.article
+    - taxonomy.vocabulary.tags
+  module:
+    - node
+    - taxonomy
+    - user
+id: test_entity_id_argument_update
+label: test_entity_id_argument_update
+module: views
+description: ''
+tag: ''
+base_table: node_field_data
+base_field: nid
+core: 8.x
+display:
+  default:
+    display_plugin: default
+    id: default
+    display_title: Master
+    position: 0
+    display_options:
+      access:
+        type: perm
+        options:
+          perm: 'access content'
+      cache:
+        type: tag
+        options: {  }
+      query:
+        type: views_query
+        options:
+          disable_sql_rewrite: false
+          distinct: false
+          replica: false
+          query_comment: ''
+          query_tags: {  }
+      exposed_form:
+        type: basic
+        options:
+          submit_button: Apply
+          reset_button: false
+          reset_button_label: Reset
+          exposed_sorts_label: 'Sort by'
+          expose_sort_order: true
+          sort_asc_label: Asc
+          sort_desc_label: Desc
+      pager:
+        type: none
+        options:
+          items_per_page: 0
+          offset: 0
+      style:
+        type: default
+      row:
+        type: 'entity:node'
+        options:
+          view_mode: teaser
+      fields:
+        title:
+          id: title
+          table: node_field_data
+          field: title
+          entity_type: node
+          entity_field: title
+          label: ''
+          alter:
+            alter_text: false
+            make_link: false
+            absolute: false
+            trim: false
+            word_boundary: false
+            ellipsis: false
+            strip_tags: false
+            html: false
+          hide_empty: false
+          empty_zero: false
+          settings:
+            link_to_entity: true
+          plugin_id: field
+          relationship: none
+          group_type: group
+          admin_label: ''
+          exclude: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: true
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_alter_empty: true
+          click_sort_column: value
+          type: string
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+      filters:
+        status:
+          value: true
+          table: node_field_data
+          field: status
+          plugin_id: boolean
+          entity_type: node
+          entity_field: status
+          id: status
+          expose:
+            operator: ''
+          group: 1
+        type:
+          id: type
+          table: node_field_data
+          field: type
+          value:
+            article: article
+          entity_type: node
+          entity_field: type
+          plugin_id: bundle
+      sorts:
+        title:
+          id: title
+          table: node_field_data
+          field: title
+          order: DESC
+          entity_type: node
+          entity_field: title
+          plugin_id: standard
+          relationship: none
+          group_type: group
+          admin_label: ''
+          exposed: false
+          expose:
+            label: ''
+      title: test_entity_id_argument_update
+      header:
+        area:
+          id: area
+          table: views
+          field: area
+          relationship: none
+          group_type: group
+          admin_label: ''
+          empty: false
+          tokenize: true
+          content:
+            value: 'title {{ arguments.field_tags_target_id }}, input {{ raw_arguments.field_tags_target_id }}'
+            format: basic_html
+          plugin_id: text
+      footer: {  }
+      empty: {  }
+      relationships: {  }
+      arguments:
+        field_tags_target_id:
+          id: field_tags_target_id
+          table: node__field_tags
+          field: field_tags_target_id
+          relationship: none
+          group_type: group
+          admin_label: ''
+          default_action: ignore
+          exception:
+            value: all
+            title_enable: false
+            title: All
+          title_enable: true
+          title: 'test: title {{ arguments.field_tags_target_id }}, input {{ raw_arguments.field_tags_target_id }}'
+          default_argument_type: fixed
+          default_argument_options:
+            argument: ''
+          default_argument_skip_url: false
+          summary_options:
+            base_path: ''
+            count: true
+            items_per_page: 25
+            override: false
+          summary:
+            sort_order: asc
+            number_of_records: 0
+            format: default_summary
+          specify_validation: false
+          validate:
+            type: none
+            fail: 'not found'
+          validate_options: {  }
+          break_phrase: true
+          not: false
+          plugin_id: numeric
+      display_extenders: {  }
+    cache_metadata:
+      max-age: -1
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - url
+        - user
+        - 'user.node_grants:view'
+        - user.permissions
+      tags: {  }
+  page_1:
+    display_plugin: page
+    id: page_1
+    display_title: Page
+    position: 1
+    display_options:
+      display_extenders: {  }
+      path: entity-id-argument-test
+    cache_metadata:
+      max-age: -1
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - url
+        - user
+        - 'user.node_grants:view'
+        - user.permissions
+      tags: {  }
diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_entity_id_argument.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_entity_id_argument.yml
new file mode 100644
index 0000000..7004434
--- /dev/null
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_entity_id_argument.yml
@@ -0,0 +1,229 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.node.teaser
+    - node.type.article
+    - taxonomy.vocabulary.tags
+  module:
+    - node
+    - taxonomy
+    - user
+id: test_entity_id_argument
+label: test_entity_id_argument
+module: views
+description: ''
+tag: ''
+base_table: node_field_data
+base_field: nid
+core: 8.x
+display:
+  default:
+    display_plugin: default
+    id: default
+    display_title: Master
+    position: 0
+    display_options:
+      access:
+        type: perm
+        options:
+          perm: 'access content'
+      cache:
+        type: tag
+        options: {  }
+      query:
+        type: views_query
+        options:
+          disable_sql_rewrite: false
+          distinct: false
+          replica: false
+          query_comment: ''
+          query_tags: {  }
+      exposed_form:
+        type: basic
+        options:
+          submit_button: Apply
+          reset_button: false
+          reset_button_label: Reset
+          exposed_sorts_label: 'Sort by'
+          expose_sort_order: true
+          sort_asc_label: Asc
+          sort_desc_label: Desc
+      pager:
+        type: none
+        options:
+          items_per_page: 0
+          offset: 0
+      style:
+        type: default
+      row:
+        type: 'entity:node'
+        options:
+          view_mode: teaser
+      fields:
+        title:
+          id: title
+          table: node_field_data
+          field: title
+          entity_type: node
+          entity_field: title
+          label: ''
+          alter:
+            alter_text: false
+            make_link: false
+            absolute: false
+            trim: false
+            word_boundary: false
+            ellipsis: false
+            strip_tags: false
+            html: false
+          hide_empty: false
+          empty_zero: false
+          settings:
+            link_to_entity: true
+          plugin_id: field
+          relationship: none
+          group_type: group
+          admin_label: ''
+          exclude: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: true
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_alter_empty: true
+          click_sort_column: value
+          type: string
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+      filters:
+        status:
+          value: true
+          table: node_field_data
+          field: status
+          plugin_id: boolean
+          entity_type: node
+          entity_field: status
+          id: status
+          expose:
+            operator: ''
+          group: 1
+        type:
+          id: type
+          table: node_field_data
+          field: type
+          value:
+            article: article
+          entity_type: node
+          entity_field: type
+          plugin_id: bundle
+      sorts:
+        title:
+          id: title
+          table: node_field_data
+          field: title
+          order: DESC
+          entity_type: node
+          entity_field: title
+          plugin_id: standard
+          relationship: none
+          group_type: group
+          admin_label: ''
+          exposed: false
+          expose:
+            label: ''
+      title: test_entity_id_argument
+      header:
+        area:
+          id: area
+          table: views
+          field: area
+          relationship: none
+          group_type: group
+          admin_label: ''
+          empty: false
+          tokenize: true
+          content:
+            value: 'title {{ arguments.field_views_testing_tags_target_id }}, input {{ raw_arguments.field_views_testing_tags_target_id }}'
+            format: basic_html
+          plugin_id: text
+      footer: {  }
+      empty: {  }
+      relationships: {  }
+      arguments:
+        field_views_testing_tags_target_id:
+          id: field_views_testing_tags_target_id
+          table: node__field_views_testing_tags
+          field: field_views_testing_tags_target_id
+          relationship: none
+          group_type: group
+          admin_label: ''
+          default_action: ignore
+          exception:
+            value: all
+            title_enable: false
+            title: All
+          title_enable: true
+          title: 'test: title {{ arguments.field_views_testing_tags_target_id }}, input {{ raw_arguments.field_views_testing_tags_target_id }}'
+          default_argument_type: fixed
+          default_argument_options:
+            argument: ''
+          default_argument_skip_url: false
+          summary_options:
+            base_path: ''
+            count: true
+            items_per_page: 25
+            override: false
+          summary:
+            sort_order: asc
+            number_of_records: 0
+            format: default_summary
+          specify_validation: false
+          validate:
+            type: none
+            fail: 'not found'
+          validate_options: {  }
+          break_phrase: true
+          not: false
+          plugin_id: numeric
+      display_extenders: {  }
+    cache_metadata:
+      max-age: -1
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - url
+        - user
+        - 'user.node_grants:view'
+        - user.permissions
+      tags: {  }
+  page_1:
+    display_plugin: page
+    id: page_1
+    display_title: Page
+    position: 1
+    display_options:
+      display_extenders: {  }
+      path: entity-id-argument-test
+    cache_metadata:
+      max-age: -1
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - url
+        - user
+        - 'user.node_grants:view'
+        - user.permissions
+      tags: {  }
diff --git a/core/modules/views/tests/src/Unit/EntityViewsDataTest.php b/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
index 195e3d4..7b544c4 100644
--- a/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
+++ b/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
@@ -1,10 +1,5 @@
 <?php
 
-/**
- * @file
- * Contains \Drupal\Tests\views\Unit\EntityViewsDataTest.
- */
-
 namespace Drupal\Tests\views\Unit;
 
 use Drupal\Core\Config\Entity\ConfigEntityType;
@@ -1044,7 +1039,8 @@ protected function assertLanguageField($data) {
   protected function assertEntityReferenceField($data) {
     $this->assertEquals('field', $data['field']['id']);
     $this->assertEquals('numeric', $data['filter']['id']);
-    $this->assertEquals('numeric', $data['argument']['id']);
+    $this->assertEquals('entity_target_id', $data['argument']['id']);
+    $this->assertEquals('user', $data['argument']['target_entity_type_id']);
     $this->assertEquals('standard', $data['sort']['id']);
   }
 
diff --git a/core/modules/views/views.post_update.php b/core/modules/views/views.post_update.php
index a4da940..72c33b6 100644
--- a/core/modules/views/views.post_update.php
+++ b/core/modules/views/views.post_update.php
@@ -179,6 +179,7 @@ function views_post_update_taxonomy_index_tid() {
   });
 }
 
+
 /**
  * @} End of "addtogroup updates-8.1.x".
  */
@@ -237,5 +238,35 @@ function views_post_update_boolean_filter_values() {
 }
 
 /**
+ * Post update configured views for entity reference argument plugin IDs.
+ */
+function views_post_update_views_data_argument_plugin_id() {
+  $config_factory = \Drupal::configFactory();
+
+  // Loop through any view, on 'arguments', to update the plugin IDs.
+  foreach ($config_factory->listAll('views.view') as $config_name) {
+    $config = $config_factory->getEditable($config_name);
+    $save = FALSE;
+
+    foreach ($config->get('display') as $display_id => $display_config) {
+      foreach ((array) $config->get('display.' . $display_id . '.display_options.arguments') as $argument_id => $argument_config) {
+        // This update deals with the Entity reference field type.
+        $argument_table_data = Views::viewsData()->get($argument_config['table']);
+        $argument_definition = isset($argument_table_data[$argument_config['field']]['argument']) ? $argument_table_data[$argument_config['field']]['argument'] : NULL;
+        if (isset($argument_config['plugin_id']) && $argument_definition && $argument_config['plugin_id'] == 'numeric' && $argument_definition['id'] == 'entity_target_id') {
+          $config->set("display.$display_id.display_options.arguments.$argument_id.plugin_id", 'entity_target_id');
+          $config->set("display.$display_id.display_options.arguments.$argument_id.target_entity_type_id", $argument_definition['target_entity_type_id']);
+          $save = TRUE;
+        }
+      }
+    }
+
+    if ($save) {
+      $config->save();
+    }
+  }
+}
+
+/**
  * @} End of "addtogroup updates-8.2.x".
  */
diff --git a/core/modules/views/views.views.inc b/core/modules/views/views.views.inc
index 0bd5f27..83fe290 100644
--- a/core/modules/views/views.views.inc
+++ b/core/modules/views/views.views.inc
@@ -747,5 +747,10 @@ function core_field_views_data(FieldStorageConfigInterface $field_storage) {
     ];
   }
 
+  // Provide an argument plugin that has a meaningful titleQuery()
+  // implementation getting the entity label.
+  $data[$table_name][$field_name . '_target_id']['argument']['id'] = 'entity_target_id';
+  $data[$table_name][$field_name . '_target_id']['argument']['target_entity_type_id'] = $target_entity_type_id;
+
   return $data;
 }
