diff --git a/core/lib/Drupal/Core/Entity/Element/EntityAutocomplete.php b/core/lib/Drupal/Core/Entity/Element/EntityAutocomplete.php
index 51adf91..e3283ca 100644
--- a/core/lib/Drupal/Core/Entity/Element/EntityAutocomplete.php
+++ b/core/lib/Drupal/Core/Entity/Element/EntityAutocomplete.php
@@ -9,6 +9,7 @@
 use Drupal\Core\Entity\EntityReferenceSelection\SelectionWithAutocreateInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Render\Element\Textfield;
+use Drupal\Core\Render\Markup;
 use Drupal\Core\Site\Settings;
 
 /**
@@ -64,13 +65,15 @@ public static function valueCallback(&$element, $input, FormStateInterface $form
       }
 
       if ($element['#default_value']) {
-        if (!(reset($element['#default_value']) instanceof EntityInterface)) {
+        $first_item = reset($element['#default_value']);
+        if ($first_item instanceof EntityInterface || is_string($first_item)) {
+          // Extract the labels from the passed-in entity objects, taking access
+          // checks into account.
+          return static::getEntityLabels($element['#default_value']);
+        }
+        else {
           throw new \InvalidArgumentException('The #default_value property has to be an entity object or an array of entity objects.');
         }
-
-        // Extract the labels from the passed-in entity objects, taking access
-        // checks into account.
-        return static::getEntityLabels($element['#default_value']);
       }
     }
 
@@ -294,7 +297,7 @@ protected static function matchEntityByTitle(SelectionInterface $handler, $input
       // More helpful error if there are only a few matching entities.
       $multiples = array();
       foreach ($entities as $id => $name) {
-        $multiples[] = $name . ' (' . $id . ')';
+        $multiples[] = strip_tags($name) . ' (' . $id . ')';
       }
       $params['@id'] = $id;
       $form_state->setError($element, t('Multiple entities match this reference; "%multiple". Specify the one you want by appending the id in parentheses, like "@value (@id)".', array('%multiple' => implode('", "', $multiples)) + $params));
@@ -311,8 +314,8 @@ protected static function matchEntityByTitle(SelectionInterface $handler, $input
    * This method is also responsible for checking the 'view label' access on the
    * passed-in entities.
    *
-   * @param \Drupal\Core\Entity\EntityInterface[] $entities
-   *   An array of entity objects.
+   * @param \Drupal\Core\Entity\EntityInterface[]|string[] $entities
+   *   An array of entity objects or Views-generated labels.
    *
    * @return string
    *   A string of entity labels separated by commas.
@@ -320,13 +323,19 @@ protected static function matchEntityByTitle(SelectionInterface $handler, $input
   public static function getEntityLabels(array $entities) {
     $entity_labels = array();
     foreach ($entities as $entity) {
-      // Use the special view label, since some entities allow the label to be
-      // viewed, even if the entity is not allowed to be viewed.
-      $label = ($entity->access('view label')) ? $entity->label() : t('- Restricted access -');
+      // This string is generated by a View renderer so we know it's safe.
+      if (is_string($entity)) {
+        $label = Markup::create(strip_tags($entity));
+      }
+      else {
+        // Use the special view label, since some entities allow the label to be
+        // viewed, even if the entity is not allowed to be viewed.
+        $label = ($entity->access('view label')) ? $entity->label() : t('- Restricted access -');
 
-      // Take into account "autocreated" entities.
-      if (!$entity->isNew()) {
-        $label .= ' (' . $entity->id() . ')';
+        // Take into account "autocreated" entities.
+        if (!$entity->isNew()) {
+          $label .= ' (' . $entity->id() . ')';
+        }
       }
 
       // Labels containing commas or quotes must be wrapped in quotes.
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..817e9bb 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/EntityReferenceAutocompleteWidget.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/EntityReferenceAutocompleteWidget.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Field\WidgetBase;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\user\EntityOwnerInterface;
+use Drupal\views\Views;
 use Symfony\Component\Validator\ConstraintViolationInterface;
 
 /**
@@ -86,17 +87,17 @@ public function settingsSummary() {
   public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
     $entity = $items->getEntity();
     $referenced_entities = $items->referencedEntities();
+    $handler_settings = $this->getFieldSettings('handler_settings');
 
     $element += array(
       '#type' => 'entity_autocomplete',
       '#target_type' => $this->getFieldSetting('target_type'),
       '#selection_handler' => $this->getFieldSetting('handler'),
-      '#selection_settings' => $this->getFieldSetting('handler_settings'),
+      '#selection_settings' => $handler_settings,
       // Entity reference field items are handling validation themselves via
       // the 'ValidReference' constraint.
       '#validate_reference' => FALSE,
       '#maxlength' => 1024,
-      '#default_value' => isset($referenced_entities[$delta]) ? $referenced_entities[$delta] : NULL,
       '#size' => $this->getSetting('size'),
       '#placeholder' => $this->getSetting('placeholder'),
     );
@@ -108,6 +109,44 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
       );
     }
 
+    if (!isset($referenced_entities[$delta])) {
+      $default_value = NULL;
+    }
+    else {
+      if ($handler_settings['handler'] == 'views') {
+        // Use the rendered view row to display the referenced entity.
+        $display_name = $handler_settings['handler_settings']['view']['display_name'];
+        $arguments = $handler_settings['handler_settings']['view']['arguments'];
+        $view_name = $handler_settings['handler_settings']['view']['view_name'];
+
+        // Check that the view is valid and the display still exists.
+        $view = Views::getView($view_name);
+        if (!$view) {
+          drupal_set_message(t('The reference view %view_name cannot be found.', array('%view_name' => $view_name)), 'warning');
+          return FALSE;
+        }
+        if (!$view->access($display_name)) {
+          drupal_set_message(t('You do no have access to the reference view %view_name.', array('%view_name' => $view_name)), 'warning');
+          return FALSE;
+        }
+        $view->setDisplay($display_name);
+
+        $result = array();
+        $referenced_id = $referenced_entities[$delta]->id();
+        $view->displayHandlers->get($display_name)->setOption('entity_reference_options', [
+          'limit' => 1,
+          'ids' => [$referenced_id],
+        ]);
+        $result = $view->executeDisplay($display_name, $arguments);
+        $default_value = \Drupal::service('renderer')->renderPlain($result[$referenced_id]);
+        $default_value = strip_tags((string) $default_value . ' (' . $referenced_id . ')');
+      }
+      else {
+        $default_value = $referenced_entities[$delta];
+      }
+    }
+
+    $element['#default_value'] = $default_value;
     return array('target_id' => $element);
   }
 
diff --git a/core/misc/autocomplete.js b/core/misc/autocomplete.js
index 254e7e5..17fff9c 100644
--- a/core/misc/autocomplete.js
+++ b/core/misc/autocomplete.js
@@ -196,7 +196,7 @@
    */
   function renderItem(ul, item) {
     return $('<li>')
-      .append($('<a>').html(item.label))
+      .append($('<span>').html(item.label))
       .appendTo(ul);
   }
 
diff --git a/core/modules/field/src/Tests/EntityReference/Views/SelectionTest.php b/core/modules/field/src/Tests/EntityReference/Views/SelectionTest.php
index e677dbc..3368418 100644
--- a/core/modules/field/src/Tests/EntityReference/Views/SelectionTest.php
+++ b/core/modules/field/src/Tests/EntityReference/Views/SelectionTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\field\Tests\EntityReference\Views;
 
+use Drupal\Component\Utility\Crypt;
+use Drupal\Core\Site\Settings;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\simpletest\WebTestBase;
 use Drupal\views\Views;
@@ -17,11 +19,18 @@ class SelectionTest extends WebTestBase {
   public static $modules = ['node', 'views', 'entity_reference_test', 'entity_test'];
 
   /**
-   * Nodes for testing.
+   * An array of node titles, keyed by content type and node ID.
    *
    * @var array
    */
-  protected $nodes = array();
+  protected $nodeTitles = [];
+
+  /**
+   * An array of node entities.
+   *
+   * @var \Drupal\node\NodeInterface[]
+   */
+  protected $nodes = [];
 
   /**
    * The entity reference field to test.
@@ -36,14 +45,17 @@ class SelectionTest extends WebTestBase {
   protected function setUp() {
     parent::setUp();
 
-    // Create nodes.
-    $type = $this->drupalCreateContentType()->id();
-    $node1 = $this->drupalCreateNode(array('type' => $type));
-    $node2 = $this->drupalCreateNode(array('type' => $type));
-    $node3 = $this->drupalCreateNode();
+    // Create content types and nodes.
+    $type1 = $this->drupalCreateContentType()->id();
+    $type2 = $this->drupalCreateContentType()->id();
+
+    $node1 = $this->drupalCreateNode(['type' => $type1, 'title' => 'Test first node']);
+    $node2 = $this->drupalCreateNode(['type' => $type1, 'title' => 'Test second node']);
+    $node3 = $this->drupalCreateNode(['type' => $type2, 'title' => 'Test third node']);
 
     foreach (array($node1, $node2, $node3) as $node) {
-      $this->nodes[$node->getType()][$node->id()] = $node->label();
+      $this->nodes[] = $node;
+      $this->nodeTitles[$node->getType()][$node->id()] = $node->label();
     }
 
     // Create a field.
@@ -77,6 +89,50 @@ protected function setUp() {
   }
 
   /**
+   * Tests that the Views selection handles the views output properly.
+   */
+  public function testAutocompleteOutput() {
+    // Reset any internal static caching.
+    \Drupal::service('entity_type.manager')->getStorage('node')->resetCache();
+
+    $view = Views::getView('test_entity_reference');
+    $view->setDisplay();
+
+    // Enable the display of the 'type' field so we can test that the output
+    // does not contain only the entity label.
+    $fields = $view->displayHandlers->get('default')->getOption('fields');
+    $fields['type']['exclude'] = FALSE;
+    $view->displayHandlers->get('default')->setOption('fields', $fields);
+    $view->save();
+
+    // Prepare the selection settings key needed by the entity reference
+    // autocomplete route.
+    $target_type = 'node';
+    $selection_handler = $this->field->getSetting('handler');
+    $selection_settings = $this->field->getSetting('handler_settings');
+    $selection_settings_key = Crypt::hmacBase64(serialize($selection_settings) . $target_type . $selection_handler, Settings::getHashSalt());
+    \Drupal::keyValue('entity_autocomplete')->set($selection_settings_key, $selection_settings);
+
+    $result = $this->drupalGetJSON('entity_reference_autocomplete/' . $target_type . '/' . $selection_handler . '/' . $selection_settings_key, ['query' => ['q' => 't']]);
+
+    $expected = [
+      0 => [
+        'value' => $this->nodes[0]->bundle() . ': ' . $this->nodes[0]->label() . ' (' . $this->nodes[0]->id() . ')',
+        'label' => '<span class="views-field views-field-type"><span class="field-content">' . $this->nodes[0]->bundle() . '</span></span>: <span class="views-field views-field-title"><span class="field-content"><a href="' . $this->nodes[0]->toUrl()->toString() . '" hreflang="en">' . $this->nodes[0]->label() . '</a></span></span>',
+      ],
+      1 => [
+        'value' => $this->nodes[1]->bundle() . ': ' . $this->nodes[1]->label() . ' (' . $this->nodes[1]->id() . ')',
+        'label' => '<span class="views-field views-field-type"><span class="field-content">' . $this->nodes[1]->bundle() . '</span></span>: <span class="views-field views-field-title"><span class="field-content"><a href="' . $this->nodes[1]->toUrl()->toString() . '" hreflang="en">' . $this->nodes[1]->label() . '</a></span></span>',
+      ],
+      2 => [
+        'value' => $this->nodes[2]->bundle() . ': ' . $this->nodes[2]->label() . ' (' . $this->nodes[2]->id() . ')',
+        'label' => '<span class="views-field views-field-type"><span class="field-content">' . $this->nodes[2]->bundle() . '</span></span>: <span class="views-field views-field-title"><span class="field-content"><a href="' . $this->nodes[2]->toUrl()->toString() . '" hreflang="en">' . $this->nodes[2]->label() . '</a></span></span>',
+      ],
+    ];
+    $this->assertEqual($result, $expected, 'The autocomplete result of the Views entity reference selection handler contains the proper output.');
+  }
+
+  /**
    * Confirm the expected results are returned.
    *
    * @param array $result
@@ -86,7 +142,7 @@ protected function assertResults(array $result) {
     $success = FALSE;
     foreach ($result as $node_type => $values) {
       foreach ($values as $nid => $label) {
-        if (!$success = $this->nodes[$node_type][$nid] == trim(strip_tags($label))) {
+        if (!$success = $this->nodeTitles[$node_type][$nid] == trim(strip_tags($label))) {
           // There was some error, so break.
           break;
         }
diff --git a/core/modules/system/tests/modules/entity_reference_test/config/install/views.view.test_entity_reference.yml b/core/modules/system/tests/modules/entity_reference_test/config/install/views.view.test_entity_reference.yml
index 3e78c51..18a4010 100644
--- a/core/modules/system/tests/modules/entity_reference_test/config/install/views.view.test_entity_reference.yml
+++ b/core/modules/system/tests/modules/entity_reference_test/config/install/views.view.test_entity_reference.yml
@@ -2,12 +2,11 @@ langcode: en
 status: true
 dependencies:
   module:
-    - entity_reference_test
     - node
     - user
 id: test_entity_reference
 label: 'Entity reference'
-module: entity_reference_test
+module: views
 description: ''
 tag: ''
 base_table: node_field_data
@@ -35,6 +34,71 @@ display:
       row:
         type: fields
       fields:
+        type:
+          id: type
+          table: node_field_data
+          field: type
+          relationship: none
+          group_type: group
+          admin_label: ''
+          label: ''
+          exclude: true
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: 0
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: false
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          click_sort_column: target_id
+          type: entity_reference_label
+          settings:
+            link: false
+          group_column: target_id
+          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
+          entity_type: node
+          entity_field: type
+          plugin_id: field
         title:
           id: title
           table: node_field_data
@@ -107,6 +171,16 @@ display:
           plugin_id: date
           entity_type: node
           entity_field: created
+      display_extenders: {  }
+    cache_metadata:
+      max-age: -1
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - url.query_args
+        - 'user.node_grants:view'
+        - user.permissions
+      tags: {  }
   entity_reference_1:
     display_plugin: entity_reference
     id: entity_reference_1
@@ -123,3 +197,19 @@ display:
         type: none
         options:
           offset: 0
+      display_extenders: {  }
+      row:
+        type: entity_reference
+        options:
+          default_field_elements: true
+          inline: {  }
+          separator: ': '
+          hide_empty: false
+    cache_metadata:
+      max-age: -1
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - 'user.node_grants:view'
+        - user.permissions
+      tags: {  }
diff --git a/core/modules/views/src/Plugin/EntityReferenceSelection/ViewsSelection.php b/core/modules/views/src/Plugin/EntityReferenceSelection/ViewsSelection.php
index db19052..fa0641c 100644
--- a/core/modules/views/src/Plugin/EntityReferenceSelection/ViewsSelection.php
+++ b/core/modules/views/src/Plugin/EntityReferenceSelection/ViewsSelection.php
@@ -9,6 +9,7 @@
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\Core\Plugin\PluginBase;
+use Drupal\Core\Render\RendererInterface;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\Url;
 use Drupal\views\Views;
@@ -48,6 +49,13 @@ class ViewsSelection extends PluginBase implements SelectionInterface, Container
   protected $currentUser;
 
   /**
+   * The renderer.
+   *
+   * @var \Drupal\Core\Render\RendererInterface
+   */
+  protected $renderer;
+
+  /**
    * Constructs a new SelectionBase object.
    *
    * @param array $configuration
@@ -63,12 +71,13 @@ class ViewsSelection extends PluginBase implements SelectionInterface, Container
    * @param \Drupal\Core\Session\AccountInterface $current_user
    *   The current user.
    */
-  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, RendererInterface $renderer) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
 
     $this->entityManager = $entity_manager;
     $this->moduleHandler = $module_handler;
     $this->currentUser = $current_user;
+    $this->renderer = $renderer;
   }
 
   /**
@@ -81,7 +90,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('renderer')
     );
   }
 
@@ -224,7 +234,7 @@ public function getReferenceableEntities($match = NULL, $match_operator = 'CONTA
     if ($result) {
       foreach ($this->view->result as $row) {
         $entity = $row->_entity;
-        $return[$entity->bundle()][$entity->id()] = $entity->label();
+        $return[$entity->bundle()][$entity->id()] = $this->renderer->renderPlain($result[$entity->id()]);
       }
     }
     return $return;
