diff --git a/core/modules/editor/editor.services.yml b/core/modules/editor/editor.services.yml
index 731215c..2176397 100644
--- a/core/modules/editor/editor.services.yml
+++ b/core/modules/editor/editor.services.yml
@@ -1,7 +1,7 @@
 services:
   plugin.manager.editor:
     class: Drupal\editor\Plugin\EditorManager
-    parent: default_plugin_manager
+    arguments: ['@container.namespaces', '@cache.discovery', '@module_handler', '@cache.data', '@entity.manager']
   element.editor:
     class: Drupal\editor\Element
     arguments: ['@plugin.manager.editor']
diff --git a/core/modules/editor/src/Plugin/EditorManager.php b/core/modules/editor/src/Plugin/EditorManager.php
index 6fc04d0..86d9543 100644
--- a/core/modules/editor/src/Plugin/EditorManager.php
+++ b/core/modules/editor/src/Plugin/EditorManager.php
@@ -7,9 +7,12 @@
 
 namespace Drupal\editor\Plugin;
 
+use Drupal\Core\Cache\Cache;
+use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Plugin\DefaultPluginManager;
 use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\editor\Entity\Editor;
 
 /**
  * Configurable text editor manager.
@@ -22,20 +25,40 @@
 class EditorManager extends DefaultPluginManager {
 
   /**
+   * The attachments cache.
+   *
+   * @var \Drupal\Core\Cache\CacheBackendInterface
+   */
+  protected $attachmentsCache;
+
+  /**
+   * The entity manager.
+   *
+   * @var \Drupal\Core\Entity\EntityManagerInterface
+   */
+  protected $entityManager;
+
+  /**
    * Constructs an EditorManager object.
    *
    * @param \Traversable $namespaces
    *   An object that implements \Traversable which contains the root paths
    *   keyed by the corresponding namespace to look for plugin implementations.
-   * @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
-   *   Cache backend instance to use.
+   * @param \Drupal\Core\Cache\CacheBackendInterface $discovery_cache
+   *   Cache backend instance to use for plugin discovery.
    * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
    *   The module handler to invoke the alter hook with.
+   * @param \Drupal\Core\Cache\CacheBackendInterface $attachments_cache
+   *   Cache backend instance to use for editor attachment caching.
+   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
+   *   The entity manager.
    */
-  public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler) {
+  public function __construct(\Traversable $namespaces, CacheBackendInterface $discovery_cache, ModuleHandlerInterface $module_handler, CacheBackendInterface $attachments_cache, EntityManagerInterface $entity_manager) {
     parent::__construct('Plugin/Editor', $namespaces, $module_handler, 'Drupal\editor\Plugin\EditorPluginInterface', 'Drupal\editor\Annotation\Editor');
     $this->alterInfo('editor_info');
-    $this->setCacheBackend($cache_backend, 'editor_plugins');
+    $this->setCacheBackend($discovery_cache, 'editor_plugins');
+    $this->attachmentsCache = $attachments_cache;
+    $this->entityManager = $entity_manager;
   }
 
   /**
@@ -64,15 +87,33 @@ public function listOptions() {
    * @see drupal_process_attached()
    */
   public function getAttachments(array $format_ids) {
+    $cid = 'editor_attachments:' . implode($format_ids);
+    if ($cache = $this->attachmentsCache->get($cid)) {
+      $attachments = $cache->data;
+    }
+    else {
+      $attachments = $this->doGetAttachments($format_ids);
+      $this->attachmentsCache->set($cid, $attachments, Cache::PERMANENT, ['editor_list']);
+    }
+    return $attachments;
+  }
+
+  /**
+   * Helper for ::getAttachments().
+   *
+   * @param array $format_ids
+   *   An array of format IDs as returned by array_keys(filter_formats()).
+   *
+   * @return array
+   *   An array of attachments, for use with #attached.
+   */
+  protected function doGetAttachments(array $format_ids) {
     $attachments = array('library' => array());
 
     $settings = array();
-    foreach ($format_ids as $format_id) {
-      $editor = editor_load($format_id);
-      if (!$editor) {
-        continue;
-      }
-
+    $editors = $this->entityManager->getStorage('editor')->loadMultiple($format_ids);
+    /** @var \Drupal\editor\EditorInterface $editor */
+    foreach ($editors as $editor) {
       $plugin = $this->createInstance($editor->getEditor());
       $plugin_definition = $plugin->getPluginDefinition();
 
