diff --git a/core/modules/views/src/Plugin/views/field/Computed.php b/core/modules/views/src/Plugin/views/field/Computed.php
new file mode 100644
index 0000000..167672d
--- /dev/null
+++ b/core/modules/views/src/Plugin/views/field/Computed.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace Drupal\views\Plugin\views\field;
+
+use Drupal\Core\Entity\EntityFieldManagerInterface;
+use Drupal\Core\Field\FormatterPluginManager;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\views\ResultRow;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * A handler for computed fields.
+ *
+ * @ingroup views_field_handlers
+ *
+ * @ViewsField("computed")
+ */
+class Computed extends FieldPluginBase {
+
+  /**
+   * The formatter manager.
+   *
+   * @var \Drupal\Core\Field\FormatterPluginManager
+   */
+  protected $formatterManager;
+
+  /**
+   * The entity field manager.
+   *
+   * @var \Drupal\Core\Entity\EntityFieldManagerInterface
+   */
+  protected $entityFieldManager;
+
+  /**
+   * Create an instance of Computed.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, FormatterPluginManager $formatter_plugin_manager, EntityFieldManagerInterface $entity_field_manager) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+
+    $this->formatterManager = $formatter_plugin_manager;
+    $this->entityFieldManager = $entity_field_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('plugin.manager.field.formatter'),
+      $container->get('entity_field.manager')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    // Don't query for computed fields.
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function defineOptions() {
+    $options = parent::defineOptions();
+    $options['type'] = ['default' => ''];
+    return $options;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildOptionsForm(&$form, FormStateInterface $form_state) {
+    parent::buildOptionsForm($form, $form_state);
+
+    $field_definition = $this->entityFieldManager->getBaseFieldDefinitions($this->configuration['entity_type'])[$this->field];
+    $formatters = $this->formatterManager->getOptions($field_definition->getType());
+
+    $form['type'] = [
+      '#type' => 'select',
+      '#title' => $this->t('Formatter'),
+      '#options' => $formatters,
+      '#default_value' => $this->options['type'],
+      '#ajax' => [
+        'url' => views_ui_build_form_url($form_state),
+      ],
+      '#submit' => [[$this, 'submitTemporaryForm']],
+      '#executes_submit_callback' => TRUE,
+    ];
+
+    // @todo support formatter settings.
+  }
+
+
+  /**
+   * {@inheritdoc}
+   */
+  public function render(ResultRow $values) {
+    $entity = $this->getEntity($values);
+
+    return $entity->{$this->field}->view([
+      'type' => $this->options['type'],
+      // @todo.
+      'settings' => [],
+    ]);
+  }
+
+}
