diff --git a/core/modules/aggregator/config/optional/views.view.aggregator_sources.yml b/core/modules/aggregator/config/optional/views.view.aggregator_sources.yml
index d615b14..bacfa46 100644
--- a/core/modules/aggregator/config/optional/views.view.aggregator_sources.yml
+++ b/core/modules/aggregator/config/optional/views.view.aggregator_sources.yml
@@ -1,6 +1,9 @@
 langcode: en
 status: true
 dependencies:
+  config:
+    - core.entity_view_mode.aggregator_feed.summary
+    - system.menu.tools
   module:
     - aggregator
     - user
@@ -133,6 +136,12 @@ display:
       empty: {  }
       relationships: {  }
       arguments: {  }
+      display_extenders: {  }
+    cache_metadata:
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+      cacheable: false
   feed_1:
     display_plugin: feed
     id: feed_1
@@ -193,8 +202,21 @@ display:
           hide_empty: false
           empty_zero: false
           hide_alter_empty: true
-          display_as_link: false
-          plugin_id: aggregator_title_link
+          click_sort_column: value
+          type: aggregator_title
+          settings:
+            display_as_link: false
+          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
+          plugin_id: field
           entity_type: aggregator_feed
           entity_field: title
         url:
@@ -371,6 +393,12 @@ display:
         default: '0'
       title: 'OPML feed'
       sitename_title: true
+      display_extenders: {  }
+    cache_metadata:
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+      cacheable: false
   page_1:
     display_plugin: page
     id: page_1
@@ -385,3 +413,9 @@ display:
         weight: 0
         context: '0'
         menu_name: tools
+      display_extenders: {  }
+    cache_metadata:
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+      cacheable: false
diff --git a/core/modules/aggregator/config/schema/aggregator.schema.yml b/core/modules/aggregator/config/schema/aggregator.schema.yml
index 85710b8..eb6c006 100644
--- a/core/modules/aggregator/config/schema/aggregator.schema.yml
+++ b/core/modules/aggregator/config/schema/aggregator.schema.yml
@@ -47,3 +47,11 @@ block.settings.aggregator_feed_block:
     feed:
       type: string
       label: 'Feed'
+
+field.formatter.settings.aggregator_title:
+  type: mapping
+  label: 'Formatter settings'
+  mapping:
+    display_as_link:
+      type: boolean
+      label: 'Display as link'
diff --git a/core/modules/aggregator/config/schema/aggregator.views.schema.yml b/core/modules/aggregator/config/schema/aggregator.views.schema.yml
index 547cbf8..ffce3f7 100644
--- a/core/modules/aggregator/config/schema/aggregator.views.schema.yml
+++ b/core/modules/aggregator/config/schema/aggregator.views.schema.yml
@@ -14,7 +14,6 @@ views.field.aggregator_title_link:
   mapping:
     display_as_link:
       type: boolean
-      label: 'Display as link'
 
 views.row.aggregator_rss:
   type: views_row
diff --git a/core/modules/aggregator/src/AggregatorFeedViewsData.php b/core/modules/aggregator/src/AggregatorFeedViewsData.php
index 70f8684..baa0d60 100644
--- a/core/modules/aggregator/src/AggregatorFeedViewsData.php
+++ b/core/modules/aggregator/src/AggregatorFeedViewsData.php
@@ -35,7 +35,8 @@ public function getViewsData() {
     $data['aggregator_feed']['fid']['filter']['id'] = 'numeric';
 
     $data['aggregator_feed']['title']['help'] = $this->t('The title of the aggregator feed.');
-    $data['aggregator_feed']['title']['field']['id'] = 'aggregator_title_link';
+    $data['aggregator_feed']['title']['field']['default_formatter'] = 'aggregator_title';
+
     $data['aggregator_feed']['argument']['id'] = 'string';
 
     $data['aggregator_feed']['url']['help'] = $this->t('The fully-qualified URL of the feed.');
diff --git a/core/modules/aggregator/src/AggregatorItemViewsData.php b/core/modules/aggregator/src/AggregatorItemViewsData.php
index 2a89b67..0f67a53 100644
--- a/core/modules/aggregator/src/AggregatorItemViewsData.php
+++ b/core/modules/aggregator/src/AggregatorItemViewsData.php
@@ -28,8 +28,7 @@ public function getViewsData() {
     $data['aggregator_item']['iid']['argument']['numeric'] = TRUE;
 
     $data['aggregator_item']['title']['help'] = $this->t('The title of the aggregator item.');
-    $data['aggregator_item']['title']['field']['id'] = 'aggregator_title_link';
-    $data['aggregator_item']['title']['field']['extra'] = 'link';
+    $data['aggregator_item']['title']['field']['default_formatter'] = 'aggregator_title';
 
     $data['aggregator_item']['link']['help'] = $this->t('The link to the original source URL of the item.');
 
diff --git a/core/modules/aggregator/src/Plugin/Field/FieldFormatter/AggregatorTitleFormatter.php b/core/modules/aggregator/src/Plugin/Field/FieldFormatter/AggregatorTitleFormatter.php
new file mode 100644
index 0000000..6882aed
--- /dev/null
+++ b/core/modules/aggregator/src/Plugin/Field/FieldFormatter/AggregatorTitleFormatter.php
@@ -0,0 +1,90 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\aggregator\Plugin\Field\FieldFormatter\AggregatorTitleFormatter.
+ */
+
+namespace Drupal\aggregator\Plugin\Field\FieldFormatter;
+
+use Drupal\Core\Field\FieldDefinitionInterface;
+use Drupal\Core\Field\FieldItemListInterface;
+use Drupal\Core\Field\FormatterBase;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Url;
+
+/**
+ * Plugin implementation of the 'aggregator_title' formatter.
+ *
+ * @FieldFormatter(
+ *   id = "aggregator_title",
+ *   label = @Translation("Aggregator title"),
+ *   description = @Translation("Formats an aggregator item or feed title with an optional link."),
+ *   field_types = {
+ *     "string"
+ *   }
+ * )
+ */
+class AggregatorTitleFormatter extends FormatterBase {
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultSettings() {
+    $options = parent::defaultSettings();
+
+    $options['display_as_link'] = TRUE;
+    return $options;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsForm(array $form, FormStateInterface $form_state) {
+    $form = parent::settingsForm($form, $form_state);
+
+    $form['display_as_link'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Link to URL'),
+      '#default_value' => $this->getSetting('display_as_link'),
+    ];
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function viewElements(FieldItemListInterface $items) {
+    $elements = [];
+
+    if ($items->getEntity()->getEntityTypeId() == 'aggregator_feed') {
+      $url_string = $items->getEntity()->getUrl();
+    }
+    else {
+      $url_string = $items->getEntity()->getLink();
+    }
+
+    foreach ($items as $delta => $item) {
+        if ($this->getSetting('display_as_link') && $url_string) {
+          $elements[$delta] = [
+            '#type' => 'link',
+            '#title' => $item->value,
+            '#url' => Url::fromUri($url_string),
+          ];
+        }
+        else {
+          $elements[$delta] = ['#markup' => $item->value];
+        }
+      }
+
+    return $elements;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function isApplicable(FieldDefinitionInterface $field_definition) {
+    return (($field_definition->getTargetEntityTypeId() === 'aggregator_item' || $field_definition->getTargetEntityTypeId() === 'aggregator_feed') && $field_definition->getName() === 'title');
+  }
+
+}
diff --git a/core/modules/aggregator/src/Plugin/views/field/TitleLink.php b/core/modules/aggregator/src/Plugin/views/field/TitleLink.php
deleted file mode 100644
index ba05199..0000000
--- a/core/modules/aggregator/src/Plugin/views/field/TitleLink.php
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\aggregator\Plugin\views\field\TitleLink.
- */
-
-namespace Drupal\aggregator\Plugin\views\field;
-
-use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Url;
-use Drupal\views\Plugin\views\display\DisplayPluginBase;
-use Drupal\views\Plugin\views\field\FieldPluginBase;
-use Drupal\views\ResultRow;
-use Drupal\views\ViewExecutable;
-
-/**
- * Defines a field handler that turns an item's title into a clickable link.
- *
- * The link refers to the original source article.
- *
- * @ingroup views_field_handlers
- *
- * @ViewsField("aggregator_title_link")
- */
-class TitleLink extends FieldPluginBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function init(ViewExecutable $view, DisplayPluginBase $display, array &$options = NULL) {
-    parent::init($view, $display, $options);
-
-    $this->additional_fields['link'] = 'link';
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function defineOptions() {
-    $options = parent::defineOptions();
-
-    $options['display_as_link'] = array('default' => TRUE);
-
-    return $options;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function buildOptionsForm(&$form, FormStateInterface $form_state) {
-    $form['display_as_link'] = array(
-      '#title' => $this->t('Display as link'),
-      '#type' => 'checkbox',
-      '#default_value' => !empty($this->options['display_as_link']),
-    );
-    parent::buildOptionsForm($form, $form_state);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function render(ResultRow $values) {
-    $value = $this->getValue($values);
-    return $this->renderLink($this->sanitizeValue($value), $values);
-  }
-
-  /**
-   * Renders aggregator item's title as link.
-   *
-   * @param string $data
-   *   The XSS safe string for the link text.
-   * @param \Drupal\views\ResultRow $values
-   *   The values retrieved from a single row of a view's query result.
-   *
-   * @return string
-   *   Returns a string for the link text.
-   */
-  protected function renderLink($data, ResultRow $values) {
-    $link = $this->getValue($values, 'link');
-    if (!empty($this->options['display_as_link'])) {
-      $this->options['alter']['make_link'] = TRUE;
-      // Note: $link is an external URI, pointing to the feed itself.
-      $this->options['alter']['url'] = Url::fromUri($link);
-      $this->options['alter']['html'] = TRUE;
-      $this->options['alter']['absolute'] = TRUE;
-    }
-
-    return $data;
-  }
-
-}
diff --git a/core/modules/aggregator/src/Tests/AggregatorTitleTest.php b/core/modules/aggregator/src/Tests/AggregatorTitleTest.php
new file mode 100644
index 0000000..cfa9975
--- /dev/null
+++ b/core/modules/aggregator/src/Tests/AggregatorTitleTest.php
@@ -0,0 +1,93 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\aggregator\Tests\AggregatorTitleTest.
+ */
+
+namespace Drupal\aggregator\Tests;
+
+use Drupal\aggregator\Entity\Feed;
+use Drupal\aggregator\Entity\Item;
+use Drupal\simpletest\KernelTestBase;
+
+
+/**
+ * Tests the aggregator_title formatter.
+ *
+ * @group field
+ */
+class AggregatorTitleTest extends KernelTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('file', 'field', 'options', 'aggregator', 'entity_reference');
+
+  /**
+   * The field name that is tested.
+   *
+   * @var string
+   */
+  protected $fieldName;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installConfig(['field']);
+    $this->installEntitySchema('aggregator_feed');
+    $this->installEntitySchema('aggregator_item');
+
+    $this->fieldName = 'title';
+  }
+
+  /*
+   * Tests the formatter output.
+   */
+  public function testStringFormatter() {
+    // Create an aggregator feed.
+    $aggregator_feed = Feed::create([
+      'title' => 'testing title',
+      'url' => 'http://www.example.com',
+    ]);
+    $aggregator_feed->save();
+
+    // Create an aggregator feed item.
+    $aggregator_item = Item::create([
+      'title' => 'test title',
+      'fid' => $aggregator_feed->id(),
+      'link' => 'http://www.example.com',
+      ]);
+    $aggregator_item->save();
+
+    // Verify aggregator feed title with and without links.
+    $build = $aggregator_feed->{$this->fieldName}->view(['type' => 'aggregator_title', 'settings' => ['display_as_link' => TRUE]]);
+    $result = $this->render($build);
+
+    $this->assertTrue(strpos($result, 'testing title'));
+    $this->assertTrue(strpos($result, 'href="' . $aggregator_feed->getUrl()) . '"');
+
+    $build = $aggregator_feed->{$this->fieldName}->view(['type' => 'aggregator_title', 'settings' => ['display_as_link' => FALSE]]);
+    $result = $this->render($build);
+    $this->assertTrue(strpos($result, 'testing title') === 0);
+    $this->assertTrue(strpos($result, $aggregator_feed->getUrl()) === FALSE);
+
+    // Verify aggregator item title with and without links.
+    $build = $aggregator_item->{$this->fieldName}->view(['type' => 'aggregator_title', 'settings' => ['display_as_link' =>TRUE]]);
+    $result = $this->render($build);
+
+    $this->assertTrue(strpos($result, 'test title'));
+    $this->assertTrue(strpos($result, 'href="' . $aggregator_item->getLink()) . '"');
+
+    $build = $aggregator_item->{$this->fieldName}->view(['type' => 'aggregator_title', 'settings' => ['display_as_link' => FALSE]]);
+    $result = $this->render($build);
+    $this->assertTrue(strpos($result, 'test title') === 0);
+    $this->assertTrue(strpos($result, $aggregator_item->getLink()) === FALSE);
+  }
+
+}
diff --git a/core/modules/aggregator/src/Tests/Views/IntegrationTest.php b/core/modules/aggregator/src/Tests/Views/IntegrationTest.php
index 09a8bb4..f08eeee 100644
--- a/core/modules/aggregator/src/Tests/Views/IntegrationTest.php
+++ b/core/modules/aggregator/src/Tests/Views/IntegrationTest.php
@@ -101,9 +101,9 @@ public function testAggregatorItemView() {
 
     $column_map = array(
       'iid' => 'iid',
-      'aggregator_item_title' => 'title',
+      'title' => 'title',
       'aggregator_item_timestamp' => 'timestamp',
-      'aggregator_item_description' => 'description',
+      'description' => 'description',
       'aggregator_item_author' => 'author',
     );
     $this->assertIdenticalResultset($view, $expected, $column_map);
diff --git a/core/modules/aggregator/tests/modules/aggregator_test_views/test_views/views.view.test_aggregator_items.yml b/core/modules/aggregator/tests/modules/aggregator_test_views/test_views/views.view.test_aggregator_items.yml
index d939007..690a03a 100644
--- a/core/modules/aggregator/tests/modules/aggregator_test_views/test_views/views.view.test_aggregator_items.yml
+++ b/core/modules/aggregator/tests/modules/aggregator_test_views/test_views/views.view.test_aggregator_items.yml
@@ -44,7 +44,8 @@ display:
           table: aggregator_item
           field: title
           id: title
-          plugin_id: aggregator_title_link
+          plugin_id: field
+          type: aggregator_title
           alter:
             alter_text: false
             text: ''
@@ -167,7 +168,15 @@ display:
           entity_type: aggregator_item
           entity_field: description
       filters: {  }
-      sorts: {  }
+      sorts:
+        iid:
+          id: iid
+          table: aggregator_item
+          field: iid
+          plugin_id: standard
+          entity_type: aggregator_item
+          entity_field: iid
+          order: 'ASC'
   feed_1:
     display_plugin: feed
     id: feed_1
diff --git a/core/modules/ckeditor/src/Tests/CKEditorLoadingTest.php b/core/modules/ckeditor/src/Tests/CKEditorLoadingTest.php
index 62cbf12..dd53245 100644
--- a/core/modules/ckeditor/src/Tests/CKEditorLoadingTest.php
+++ b/core/modules/ckeditor/src/Tests/CKEditorLoadingTest.php
@@ -116,8 +116,8 @@ function testLoading() {
     $this->assertTrue($editor_js_present, 'Text Editor JavaScript is present.');
     $this->assertTrue(count($body) === 1, 'A body field exists.');
     $this->assertTrue(count($format_selector) === 1, 'A single text format selector exists on the page.');
-    $specific_format_selector = $this->xpath('//select[contains(@class, "filter-list") and @data-editor-for="edit-body-0-value"]');
-    $this->assertTrue(count($specific_format_selector) === 1, 'A single text format selector exists on the page and has a "data-editor-for" attribute with the correct value.');
+    $specific_format_selector = $this->xpath('//select[contains(@class, "filter-list") and contains(@class, "editor") and @data-editor-for="edit-body-0-value"]');
+    $this->assertTrue(count($specific_format_selector) === 1, 'A single text format selector exists on the page and has the "editor" class and a "data-editor-for" attribute with the correct value.');
     $this->assertTrue(in_array('ckeditor/drupal.ckeditor', explode(',', $settings['ajaxPageState']['libraries'])), 'CKEditor glue library is present.');
 
     // Enable the ckeditor_test module, customize configuration. In this case,
diff --git a/core/modules/editor/js/editor.js b/core/modules/editor/js/editor.js
index 1b26b0f..c6bbfd6 100644
--- a/core/modules/editor/js/editor.js
+++ b/core/modules/editor/js/editor.js
@@ -14,45 +14,44 @@
    *   A text format selector DOM element.
    *
    * @return DOM
-   *   The text area DOM element, if it was found.
+   *   The text area DOM element.
    */
   function findFieldForFormatSelector($formatSelector) {
     var field_id = $formatSelector.attr('data-editor-for');
-    // This selector will only find text areas in the top-level document. We do
-    // not support attaching editors on text areas within iframes.
     return $('#' + field_id).get(0);
   }
 
   /**
-   * Changes the text editor on a text area.
+   * Changes the text editor on the text area for the given text format selector.
    *
-   * @param DOM field
-   *   The text area DOM element.
+   * @param jQuery $formatSelector
+   *   A text format selector DOM element.
+   * @param String activeFormatID
+   *   The currently active text format; its associated text editor will be
+   *   detached.
    * @param String newFormatID
-   *   The text format we're changing to; the text editor for the currently
-   *   active text format will be detached, and the text editor for the new text
-   *   format will be attached.
+   *   The text format we're changing to; its associated text editor will be
+   *   attached.
    */
-  function changeTextEditor(field, newFormatID) {
-    var previousFormatID = field.getAttribute('data-editor-active-text-format');
-
+  function changeTextEditor($formatSelector, activeFormatID, newFormatID) {
+    var originalFormatID = activeFormatID;
+    var field = findFieldForFormatSelector($formatSelector);
     // Detach the current editor (if any) and attach a new editor.
-    if (drupalSettings.editor.formats[previousFormatID]) {
-      Drupal.editorDetach(field, drupalSettings.editor.formats[previousFormatID]);
+    if (drupalSettings.editor.formats[activeFormatID]) {
+      Drupal.editorDetach(field, drupalSettings.editor.formats[activeFormatID]);
     }
     // When no text editor is currently active, stop tracking changes.
-    else {
+    else if (!drupalSettings.editor.formats[activeFormatID]) {
       $(field).off('.editor');
     }
+    activeFormatID = newFormatID;
 
     // Attach the new text editor (if any).
-    if (drupalSettings.editor.formats[newFormatID]) {
-      var format = drupalSettings.editor.formats[newFormatID];
-      filterXssWhenSwitching(field, format, previousFormatID, Drupal.editorAttach);
+    if (drupalSettings.editor.formats[activeFormatID]) {
+      var format = drupalSettings.editor.formats[activeFormatID];
+      filterXssWhenSwitching(field, format, originalFormatID, Drupal.editorAttach);
     }
-
-    // Store the new active format.
-    field.setAttribute('data-editor-active-text-format', newFormatID);
+    $formatSelector.attr('data-editor-active-text-format', newFormatID);
   }
 
   /**
@@ -62,8 +61,7 @@
    */
   function onTextFormatChange(event) {
     var $select = $(event.target);
-    var field = event.data.field;
-    var activeFormatID = field.getAttribute('data-editor-active-text-format');
+    var activeFormatID = $select.attr('data-editor-active-text-format');
     var newFormatID = $select.val();
 
     // Prevent double-attaching if the change event is triggered manually.
@@ -77,7 +75,7 @@
     // markup to be stripped away.
     var supportContentFiltering = drupalSettings.editor.formats[newFormatID] && drupalSettings.editor.formats[newFormatID].editorSupportsContentFiltering;
     // If there is no content yet, it's always safe to change the text format.
-    var hasContent = field.value !== '';
+    var hasContent = findFieldForFormatSelector($select).value !== '';
     if (hasContent && supportContentFiltering) {
       var message = Drupal.t('Changing the text format to %text_format will permanently remove content that is not allowed in that text format.<br><br>Save your changes before switching the text format to avoid losing data.', {
         '%text_format': $select.find('option:selected').text()
@@ -91,7 +89,7 @@
             text: Drupal.t('Continue'),
             'class': 'button button--primary',
             click: function () {
-              changeTextEditor(field, newFormatID);
+              changeTextEditor($select, activeFormatID, newFormatID);
               confirmationDialog.close();
             }
           },
@@ -123,7 +121,7 @@
       confirmationDialog.showModal();
     }
     else {
-      changeTextEditor(field, newFormatID);
+      changeTextEditor($select, activeFormatID, newFormatID);
     }
   }
 
@@ -142,18 +140,11 @@
         return;
       }
 
-      $(context).find('[data-editor-for]').once('editor').each(function () {
+      $(context).find('.editor').once('editor').each(function () {
         var $this = $(this);
-        var field = findFieldForFormatSelector($this);
-
-        // Opt-out if no supported text area was found.
-        if (!field) {
-          return;
-        }
-
-        // Store the current active format.
         var activeFormatID = $this.val();
-        field.setAttribute('data-editor-active-text-format', activeFormatID);
+        $this.attr('data-editor-active-text-format', activeFormatID);
+        var field = findFieldForFormatSelector($this);
 
         // Directly attach this text editor, if the text format is enabled.
         if (settings.editor.formats[activeFormatID]) {
@@ -174,7 +165,7 @@
 
         // Attach onChange handler to text format selector element.
         if ($this.is('select')) {
-          $this.on('change.editorAttach', {field: field}, onTextFormatChange);
+          $this.on('change.editorAttach', onTextFormatChange);
         }
         // Detach any editor when the containing form is submitted.
         $this.parents('form').on('submit', function (event) {
@@ -197,17 +188,17 @@
       if (trigger === 'serialize') {
         // Removing the editor-processed class guarantees that the editor will
         // be reattached. Only do this if we're planning to destroy the editor.
-        editors = $(context).find('[data-editor-for]').findOnce('editor');
+        editors = $(context).find('.editor').findOnce('editor');
       }
       else {
-        editors = $(context).find('[data-editor-for]').removeOnce('editor');
+        editors = $(context).find('.editor').removeOnce('editor');
       }
 
       editors.each(function () {
         var $this = $(this);
         var activeFormatID = $this.val();
         var field = findFieldForFormatSelector($this);
-        if (field && activeFormatID in settings.editor.formats) {
+        if (activeFormatID in settings.editor.formats) {
           Drupal.editorDetach(field, settings.editor.formats[activeFormatID], trigger);
         }
       });
diff --git a/core/modules/editor/src/Element.php b/core/modules/editor/src/Element.php
index a87f3a0..934e5e4 100644
--- a/core/modules/editor/src/Element.php
+++ b/core/modules/editor/src/Element.php
@@ -73,6 +73,7 @@ function preRenderTextFormat(array $element) {
         '#name' => $element['format']['format']['#name'],
         '#value' => $format_id,
         '#attributes' => array(
+          'class' => array('editor'),
           'data-editor-for' => $field_id,
         ),
       );
diff --git a/core/modules/editor/src/Tests/EditorLoadingTest.php b/core/modules/editor/src/Tests/EditorLoadingTest.php
index 002ccd3..3a8a374 100644
--- a/core/modules/editor/src/Tests/EditorLoadingTest.php
+++ b/core/modules/editor/src/Tests/EditorLoadingTest.php
@@ -156,8 +156,8 @@ public function testLoading() {
     $this->assertTrue($editor_js_present, 'Text Editor JavaScript is present.');
     $this->assertTrue(count($body) === 1, 'A body field exists.');
     $this->assertTrue(count($format_selector) === 1, 'A single text format selector exists on the page.');
-    $specific_format_selector = $this->xpath('//select[contains(@class, "filter-list") and @data-editor-for="edit-body-0-value"]');
-    $this->assertTrue(count($specific_format_selector) === 1, 'A single text format selector exists on the page and has a "data-editor-for" attribute with the correct value.');
+    $specific_format_selector = $this->xpath('//select[contains(@class, "filter-list") and contains(@class, "editor") and @data-editor-for="edit-body-0-value"]');
+    $this->assertTrue(count($specific_format_selector) === 1, 'A single text format selector exists on the page and has the "editor" class and a "data-editor-for" attribute with the correct value.');
 
     // Load the editor image dialog form and make sure it does not fatal.
     $this->drupalGet('editor/dialog/image/full_html');
@@ -190,8 +190,8 @@ public function testLoading() {
     $this->assertTrue($editor_js_present, 'Text Editor JavaScript is present.');
     $this->assertTrue(count($body) === 1, 'A body field exists.');
     $this->assertTrue(count($format_selector) === 0, 'No text format selector exists on the page.');
-    $hidden_input = $this->xpath('//input[@type="hidden" and @value="plain_text" and @data-editor-for="edit-body-0-value"]');
-    $this->assertTrue(count($hidden_input) === 1, 'A single text format hidden input exists on the page and has a "data-editor-for" attribute with the correct value.');
+    $hidden_input = $this->xpath('//input[@type="hidden" and @value="plain_text" and contains(@class, "editor") and @data-editor-for="edit-body-0-value"]');
+    $this->assertTrue(count($hidden_input) === 1, 'A single text format hidden input exists on the page and has the "editor" class and a "data-editor-for" attribute with the correct value.');
 
     // Create an "article" node that uses the full_html text format, then try
     // to let the untrusted user edit it.
diff --git a/core/modules/field/src/Tests/EntityReference/EntityReferenceFormatterTest.php b/core/modules/field/src/Tests/EntityReference/EntityReferenceFormatterTest.php
index 52fdc08..548ae64 100644
--- a/core/modules/field/src/Tests/EntityReference/EntityReferenceFormatterTest.php
+++ b/core/modules/field/src/Tests/EntityReference/EntityReferenceFormatterTest.php
@@ -189,7 +189,7 @@ public function testEntityFormatter() {
       </div>
 </div>
 ';
-    $expected_rendered_body_field_1 = '<div class="field field-entity-test--body field-name-body field-type-text field-label-above">
+    $expected_rendered_body_field_1 = '<div class="clearfix field field-entity-test--body field-name-body field-type-text field-label-above">
       <div class="field-label">Body</div>
     <div class="field-items">
           <div class="field-item"><p>Hello, world!</p></div>
diff --git a/core/modules/field_ui/field_ui.module b/core/modules/field_ui/field_ui.module
index b153c4d..df6a1c0 100644
--- a/core/modules/field_ui/field_ui.module
+++ b/core/modules/field_ui/field_ui.module
@@ -20,6 +20,8 @@
  * Implements hook_help().
  */
 function field_ui_help($route_name, RouteMatchInterface $route_match) {
+  $module_handler = \Drupal::moduleHandler();
+
   switch ($route_name) {
     case 'help.page.field_ui':
       $output = '';
diff --git a/core/modules/responsive_image/responsive_image.module b/core/modules/responsive_image/responsive_image.module
index ad39ad8..08545cc 100644
--- a/core/modules/responsive_image/responsive_image.module
+++ b/core/modules/responsive_image/responsive_image.module
@@ -24,9 +24,9 @@
  * Implements hook_help().
  */
 function responsive_image_help($route_name, RouteMatchInterface $route_match) {
+  $output = '';
   switch ($route_name) {
     case 'help.page.responsive_image':
-      $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
       $output .= '<p>' . t('The Responsive Image module provides an image formatter and breakpoint mappings to output responsive images using the HTML5 picture tag. For more information, see the <a href="!responsive_image">online documentation for the Responsive Image module</a>.', array( '!responsive_image' => 'https://drupal.org/documentation/modules/responsive_image')) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
@@ -36,11 +36,14 @@ function responsive_image_help($route_name, RouteMatchInterface $route_match) {
       $output .= '<dt>' . t('Using responsive image styles in Image fields') . '</dt>';
       $output .= '<dd>' . t('After defining responsive image styles, you can use them in the display settings for your Image fields, so that the site displays responsive images using the HTML5 picture tag. Open the Manage display page for the entity type (content type, taxonomy vocabulary, etc.) that the Image field is attached to. Choose the format <em>Responsive image</em>, click the Edit icon, and select one of the responsive image styles that you have created. For general information on how to manage fields and their display see the <a href="!field_ui">Field UI module help page</a>. For background information about entities and fields see the <a href="!field_help">Field module help page</a>.', array('!field_ui' => \Drupal::url('help.page', array('name' => 'field_ui')),'!field_help' => \Drupal::url('help.page', array('name' => 'field')))) . '</dd>';
       $output .= '</dl>';
-      return $output;
+      break;
 
     case 'entity.responsive_image_style.collection':
-      return '<p>' . t('A responsive image style associates an image style with each breakpoint defined by your theme.') . '</p>';
+      $output .= '<p>' . t('A responsive image style associates an image style with each breakpoint defined by your theme.') . '</p>';
+      break;
+
   }
+  return $output;
 }
 
 /**
diff --git a/core/modules/simpletest/src/AssertContentTrait.php b/core/modules/simpletest/src/AssertContentTrait.php
index 100a1c9..4306f43 100644
--- a/core/modules/simpletest/src/AssertContentTrait.php
+++ b/core/modules/simpletest/src/AssertContentTrait.php
@@ -483,10 +483,11 @@ protected function assertNoEscaped($raw, $message = '', $group = 'Other') {
   }
 
   /**
-   * Passes if the page (with HTML stripped) contains the text.
+   * Passes if the text IS found on the text version of the page.
    *
-   * Note that stripping HTML tags also removes their attributes, such as
-   * the values of text fields.
+   * The text version is the equivalent of what a user would see when viewing
+   * through a web browser. In other words the HTML has been filtered out of the
+   * contents.
    *
    * @param string $text
    *   Plain text to look for.
@@ -502,18 +503,17 @@ protected function assertNoEscaped($raw, $message = '', $group = 'Other') {
    *
    * @return bool
    *   TRUE on pass, FALSE on fail.
-   *
-   * @see \Drupal\simpletest\AssertContentTrait::assertRaw()
    */
   protected function assertText($text, $message = '', $group = 'Other') {
     return $this->assertTextHelper($text, $message, $group, FALSE);
   }
 
   /**
-   * Passes if the page (with HTML stripped) does not contains the text.
+   * Passes if the text is NOT found on the text version of the page.
    *
-   * Note that stripping HTML tags also removes their attributes, such as
-   * the values of text fields.
+   * The text version is the equivalent of what a user would see when viewing
+   * through a web browser. In other words the HTML has been filtered out of the
+   * contents.
    *
    * @param string $text
    *   Plain text to look for.
@@ -529,8 +529,6 @@ protected function assertText($text, $message = '', $group = 'Other') {
    *
    * @return bool
    *   TRUE on pass, FALSE on fail.
-   *
-   * @see \Drupal\simpletest\AssertContentTrait::assertNoRaw()
    */
   protected function assertNoText($text, $message = '', $group = 'Other') {
     return $this->assertTextHelper($text, $message, $group, TRUE);
diff --git a/core/modules/simpletest/src/WebTestBase.php b/core/modules/simpletest/src/WebTestBase.php
index 401a35e..9dd2f1a 100644
--- a/core/modules/simpletest/src/WebTestBase.php
+++ b/core/modules/simpletest/src/WebTestBase.php
@@ -981,13 +981,6 @@ protected function installParameters() {
     unset($connection_info['default']['namespace']);
     unset($connection_info['default']['pdo']);
     unset($connection_info['default']['init_commands']);
-    // Remove database connection info that is not used by SQLite.
-    if ($driver == 'sqlite') {
-      unset($connection_info['default']['username']);
-      unset($connection_info['default']['password']);
-      unset($connection_info['default']['host']);
-      unset($connection_info['default']['port']);
-    }
     $parameters = array(
       'interactive' => FALSE,
       'parameters' => array(
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 0575b1a..17148be 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -70,6 +70,8 @@
  * Implements hook_help().
  */
 function system_help($route_name, RouteMatchInterface $route_match) {
+  global $base_url;
+
   switch ($route_name) {
     case 'help.page.system':
       $output = '';
diff --git a/core/modules/text/templates/field--text-long.html.twig b/core/modules/text/templates/field--text-long.html.twig
new file mode 100644
index 0000000..07ce721
--- /dev/null
+++ b/core/modules/text/templates/field--text-long.html.twig
@@ -0,0 +1 @@
+{% extends "field--text.html.twig" %}
diff --git a/core/modules/text/templates/field--text-with-summary.html.twig b/core/modules/text/templates/field--text-with-summary.html.twig
new file mode 100644
index 0000000..07ce721
--- /dev/null
+++ b/core/modules/text/templates/field--text-with-summary.html.twig
@@ -0,0 +1 @@
+{% extends "field--text.html.twig" %}
diff --git a/core/modules/text/templates/field--text.html.twig b/core/modules/text/templates/field--text.html.twig
new file mode 100644
index 0000000..9cd1ab9
--- /dev/null
+++ b/core/modules/text/templates/field--text.html.twig
@@ -0,0 +1,20 @@
+{% extends "field.html.twig" %}
+{#
+/**
+ * @file
+ * Default theme implementation for a text field.
+ *
+ * A 'clearfix' class is added, because 'text' fields have a 'format' property
+ * that allows a Text Format to be associated with the entered text, which then
+ * applies filtering on output. A common use case is to align images to the left
+ * or right, and without this 'clearfix' class, such aligned images may be
+ * rendered outside of the 'text' field formatter's boundaries, and hence
+ * overlap with other fields. By setting the 'clearfix' class on all 'text'
+ * fields, we prevent that.
+ *
+ * @see https://www.drupal.org/node/2358529
+ *
+ * @ingroup themeable
+ */
+#}
+{% set attributes = attributes.addClass('clearfix') %}
diff --git a/core/modules/text/text.module b/core/modules/text/text.module
index 5bcf7e2..ea91ce8 100644
--- a/core/modules/text/text.module
+++ b/core/modules/text/text.module
@@ -39,6 +39,29 @@ function text_help($route_name, RouteMatchInterface $route_match) {
 }
 
 /**
+ * Implements hook_theme().
+ */
+function text_theme() {
+  return [
+    // Normally theme suggestion templates are only picked up when they are in
+    // themes. We explicitly define theme suggestions here so that the text
+    // field templates in core/modules/text/templates are picked up.
+    'field__text' => [
+      'render element' => 'elements',
+      'base hook' => 'field',
+    ],
+    'field__text_long' => [
+      'render element' => 'elements',
+      'base hook' => 'field',
+    ],
+    'field__text_with_summary' => [
+      'render element' => 'elements',
+      'base hook' => 'field',
+    ],
+  ];
+}
+
+/**
  * Generates a trimmed, formatted version of a text field value.
  *
  * If the end of the summary is not indicated using the <!--break--> delimiter
diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_style_opml.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_style_opml.yml
index e601365..6c631b3 100644
--- a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_style_opml.yml
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_style_opml.yml
@@ -83,8 +83,21 @@ display:
           hide_empty: false
           empty_zero: false
           hide_alter_empty: true
-          display_as_link: false
-          plugin_id: aggregator_title_link
+          click_sort_column: value
+          type: aggregator_title
+          settings:
+            display_as_link: false
+          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
+          plugin_id: field
           entity_type: aggregator_feed
           entity_field: title
         url:
diff --git a/core/themes/classy/templates/field/field--text-long.html.twig b/core/themes/classy/templates/field/field--text-long.html.twig
deleted file mode 100644
index 07ce721..0000000
--- a/core/themes/classy/templates/field/field--text-long.html.twig
+++ /dev/null
@@ -1 +0,0 @@
-{% extends "field--text.html.twig" %}
diff --git a/core/themes/classy/templates/field/field--text-with-summary.html.twig b/core/themes/classy/templates/field/field--text-with-summary.html.twig
deleted file mode 100644
index 07ce721..0000000
--- a/core/themes/classy/templates/field/field--text-with-summary.html.twig
+++ /dev/null
@@ -1 +0,0 @@
-{% extends "field--text.html.twig" %}
diff --git a/core/themes/classy/templates/field/field--text.html.twig b/core/themes/classy/templates/field/field--text.html.twig
deleted file mode 100644
index 9cd1ab9..0000000
--- a/core/themes/classy/templates/field/field--text.html.twig
+++ /dev/null
@@ -1,20 +0,0 @@
-{% extends "field.html.twig" %}
-{#
-/**
- * @file
- * Default theme implementation for a text field.
- *
- * A 'clearfix' class is added, because 'text' fields have a 'format' property
- * that allows a Text Format to be associated with the entered text, which then
- * applies filtering on output. A common use case is to align images to the left
- * or right, and without this 'clearfix' class, such aligned images may be
- * rendered outside of the 'text' field formatter's boundaries, and hence
- * overlap with other fields. By setting the 'clearfix' class on all 'text'
- * fields, we prevent that.
- *
- * @see https://www.drupal.org/node/2358529
- *
- * @ingroup themeable
- */
-#}
-{% set attributes = attributes.addClass('clearfix') %}
