diff --git a/core/modules/ckeditor/js/views/ControllerView.js b/core/modules/ckeditor/js/views/ControllerView.js
index aff0f8d..e3cd278 100644
--- a/core/modules/ckeditor/js/views/ControllerView.js
+++ b/core/modules/ckeditor/js/views/ControllerView.js
@@ -138,7 +138,7 @@
       };
 
       // Create hidden CKEditor with all features enabled, retrieve metadata.
-      // @see \Drupal\ckeditor\Plugin\Editor\CKEditor::settingsForm.
+      // @see \Drupal\ckeditor\Plugin\Editor\CKEditor::buildConfigurationForm()
       var hiddenCKEditorID = 'ckeditor-hidden';
       if (CKEDITOR.instances[hiddenCKEditorID]) {
         CKEDITOR.instances[hiddenCKEditorID].destroy(true);
diff --git a/core/modules/ckeditor/src/Plugin/Editor/CKEditor.php b/core/modules/ckeditor/src/Plugin/Editor/CKEditor.php
index 949c8e5..41aa232 100644
--- a/core/modules/ckeditor/src/Plugin/Editor/CKEditor.php
+++ b/core/modules/ckeditor/src/Plugin/Editor/CKEditor.php
@@ -95,7 +95,7 @@ public static function create(ContainerInterface $container, array $configuratio
   /**
    * {@inheritdoc}
    */
-  public function getDefaultSettings() {
+  public function getDefaultConfiguration() {
     return array(
       'toolbar' => array(
         'rows' => array(
@@ -131,7 +131,7 @@ public function getDefaultSettings() {
   /**
    * {@inheritdoc}
    */
-  public function settingsForm(array $form, FormStateInterface $form_state, EditorEntity $editor) {
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state, EditorEntity $editor = NULL) {
     $settings = $editor->getSettings();
 
     $ckeditor_settings_toolbar = array(
@@ -211,7 +211,7 @@ public function settingsForm(array $form, FormStateInterface $form_state, Editor
         'plugins' => $settings['plugins'],
       ),
     ));
-    $config = $this->getJSSettings($fake_editor);
+    $config = $this->getJSConfiguration($fake_editor);
     // Remove the ACF configuration that is generated based on filter settings,
     // because otherwise we cannot retrieve per-feature metadata.
     unset($config['allowedContent']);
@@ -228,7 +228,7 @@ public function settingsForm(array $form, FormStateInterface $form_state, Editor
   /**
    * {@inheritdoc}
    */
-  public function settingsFormSubmit(array $form, FormStateInterface $form_state) {
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
     // Modify the toolbar settings by reference. The values in
     // $form_state->getValue(array('editor', 'settings')) will be saved directly
     // by editor_form_filter_admin_format_submit().
@@ -248,7 +248,7 @@ public function settingsFormSubmit(array $form, FormStateInterface $form_state)
   /**
    * {@inheritdoc}
    */
-  public function getJSSettings(EditorEntity $editor) {
+  public function getJSConfiguration(EditorEntity $editor) {
     $settings = array();
 
     // Get the settings for all enabled plugins, even the internal ones.
@@ -369,7 +369,7 @@ public function getLibraries(EditorEntity $editor) {
   /**
    * Builds the "toolbar" configuration part of the CKEditor JS settings.
    *
-   * @see getJSSettings()
+   * @see getJSConfiguration()
    *
    * @param \Drupal\editor\Entity\Editor $editor
    *   A configured text editor object.
@@ -392,7 +392,7 @@ public function buildToolbarJSSetting(EditorEntity $editor) {
   /**
    * Builds the "contentsCss" configuration part of the CKEditor JS settings.
    *
-   * @see getJSSettings()
+   * @see getJSConfiguration()
    *
    * @param \Drupal\editor\Entity\Editor $editor
    *   A configured text editor object.
diff --git a/core/modules/ckeditor/src/Tests/CKEditorAdminTest.php b/core/modules/ckeditor/src/Tests/CKEditorAdminTest.php
index 6849757..b1f8e72 100644
--- a/core/modules/ckeditor/src/Tests/CKEditorAdminTest.php
+++ b/core/modules/ckeditor/src/Tests/CKEditorAdminTest.php
@@ -110,7 +110,7 @@ function testExistingFormat() {
       ),
       'plugins' => array(),
     );
-    $this->assertIdentical($ckeditor->getDefaultSettings(), $expected_default_settings);
+    $this->assertIdentical($ckeditor->getDefaultConfiguration(), $expected_default_settings);
 
     // Keep the "CKEditor" editor selected and click the "Configure" button.
     $this->drupalPostAjaxForm(NULL, $edit, 'editor_configure');
@@ -228,7 +228,7 @@ function testNewFormat() {
     // Ensure the toolbar buttons configuration value is initialized to the
     // default value.
     $ckeditor = $this->container->get('plugin.manager.editor')->createInstance('ckeditor');
-    $default_settings = $ckeditor->getDefaultSettings();
+    $default_settings = $ckeditor->getDefaultConfiguration();
     $expected_buttons_value = json_encode($default_settings['toolbar']['rows']);
     $this->assertFieldByName('editor[settings][toolbar][button_groups]', $expected_buttons_value);
 
diff --git a/core/modules/ckeditor/src/Tests/CKEditorLoadingTest.php b/core/modules/ckeditor/src/Tests/CKEditorLoadingTest.php
index dd53245..4dda8a0 100644
--- a/core/modules/ckeditor/src/Tests/CKEditorLoadingTest.php
+++ b/core/modules/ckeditor/src/Tests/CKEditorLoadingTest.php
@@ -107,7 +107,7 @@ function testLoading() {
     $expected = array('formats' => array('filtered_html' => array(
       'format' => 'filtered_html',
       'editor' => 'ckeditor',
-      'editorSettings' => $ckeditor_plugin->getJSSettings($editor),
+      'editorSettings' => $ckeditor_plugin->getJSConfiguration($editor),
       'editorSupportsContentFiltering' => TRUE,
       'isXssSafe' => FALSE,
     )));
@@ -138,7 +138,7 @@ function testLoading() {
         'filtered_html' => array(
           'format' => 'filtered_html',
           'editor' => 'ckeditor',
-          'editorSettings' => $ckeditor_plugin->getJSSettings($editor),
+          'editorSettings' => $ckeditor_plugin->getJSConfiguration($editor),
           'editorSupportsContentFiltering' => TRUE,
           'isXssSafe' => FALSE,
     )));
diff --git a/core/modules/ckeditor/src/Tests/CKEditorTest.php b/core/modules/ckeditor/src/Tests/CKEditorTest.php
index f532a52..af8d855 100644
--- a/core/modules/ckeditor/src/Tests/CKEditorTest.php
+++ b/core/modules/ckeditor/src/Tests/CKEditorTest.php
@@ -71,7 +71,7 @@ protected function setUp() {
   }
 
   /**
-   * Tests CKEditor::getJSSettings().
+   * Tests CKEditor::getJSConfiguration().
    */
   function testGetJSSettings() {
     $editor = entity_load('editor', 'filtered_html');
@@ -95,7 +95,7 @@ function testGetJSSettings() {
       ),
     );
     ksort($expected_config);
-    $this->assertIdentical($expected_config, $this->ckeditor->getJSSettings($editor), 'Generated JS settings are correct for default configuration.');
+    $this->assertIdentical($expected_config, $this->ckeditor->getJSConfiguration($editor), 'Generated JS settings are correct for default configuration.');
 
     // Customize the configuration: add button, have two contextually enabled
     // buttons, and configure a CKEditor plugin setting.
@@ -119,7 +119,7 @@ function testGetJSSettings() {
     $expected_config['drupalExternalPlugins']['llama_contextual_and_button'] = file_create_url('core/modules/ckeditor/tests/modules/js/llama_contextual_and_button.js');
     $expected_config['contentsCss'][] = file_create_url('core/modules/ckeditor/tests/modules/ckeditor_test.css');
     ksort($expected_config);
-    $this->assertIdentical($expected_config, $this->ckeditor->getJSSettings($editor), 'Generated JS settings are correct for customized configuration.');
+    $this->assertIdentical($expected_config, $this->ckeditor->getJSConfiguration($editor), 'Generated JS settings are correct for customized configuration.');
 
     // Change the allowed HTML tags; the "allowedContent" and "format_tags"
     // settings for CKEditor should automatically be updated as well.
@@ -130,7 +130,7 @@ function testGetJSSettings() {
     $expected_config['allowedContent']['pre'] = array('attributes' => TRUE, 'styles' => FALSE, 'classes' => TRUE);
     $expected_config['allowedContent']['h3'] = array('attributes' => TRUE, 'styles' => FALSE, 'classes' => TRUE);
     $expected_config['format_tags'] = 'p;h3;h4;h5;h6;pre';
-    $this->assertIdentical($expected_config, $this->ckeditor->getJSSettings($editor), 'Generated JS settings are correct for customized configuration.');
+    $this->assertIdentical($expected_config, $this->ckeditor->getJSConfiguration($editor), 'Generated JS settings are correct for customized configuration.');
 
     // Disable the filter_html filter: allow *all *tags.
     $format->setFilterConfig('filter_html', array('status' => 0));
@@ -139,7 +139,7 @@ function testGetJSSettings() {
     $expected_config['allowedContent'] = TRUE;
     $expected_config['disallowedContent'] = FALSE;
     $expected_config['format_tags'] = 'p;h1;h2;h3;h4;h5;h6;pre';
-    $this->assertIdentical($expected_config, $this->ckeditor->getJSSettings($editor), 'Generated JS settings are correct for customized configuration.');
+    $this->assertIdentical($expected_config, $this->ckeditor->getJSConfiguration($editor), 'Generated JS settings are correct for customized configuration.');
 
     // Enable the filter_test_restrict_tags_and_attributes filter.
     $format->setFilterConfig('filter_test_restrict_tags_and_attributes', array(
@@ -208,12 +208,12 @@ function testGetJSSettings() {
     );
     $expected_config['format_tags'] = 'p';
     ksort($expected_config);
-    $this->assertIdentical($expected_config, $this->ckeditor->getJSSettings($editor), 'Generated JS settings are correct for customized configuration.');
+    $this->assertIdentical($expected_config, $this->ckeditor->getJSConfiguration($editor), 'Generated JS settings are correct for customized configuration.');
 
     // Assert that we're robust enough to withstand people messing with State
     // manually.
     \Drupal::state()->delete('ckeditor_internal_format_tags:' . $format->id());
-    $this->assertIdentical($expected_config, $this->ckeditor->getJSSettings($editor), 'Even when somebody manually deleted the key-value pair in State with the pre-calculated format_tags setting, it returns "p" — because the <p> tag is always allowed.');
+    $this->assertIdentical($expected_config, $this->ckeditor->getJSConfiguration($editor), 'Even when somebody manually deleted the key-value pair in State with the pre-calculated format_tags setting, it returns "p" — because the <p> tag is always allowed.');
   }
 
   /**
@@ -386,7 +386,7 @@ function testJSTranslation() {
     $this->installSchema('locale', 'locales_location');
     $this->installSchema('locale', 'locales_target');
     $editor = Editor::load('filtered_html');
-    $this->ckeditor->getJSSettings($editor);
+    $this->ckeditor->getJSConfiguration($editor);
     $localeStorage = $this->container->get('locale.storage');
     $string = $localeStorage->findString(array('source' => 'Edit Link', 'context' => ''));
     $this->assertTrue(!empty($string), 'String from JavaScript file saved.');
@@ -414,7 +414,7 @@ protected function assertCKEditorLanguage($langcode = 'fr') {
 
     // Test that we now get the expected language.
     $editor = Editor::load('filtered_html');
-    $settings = $this->ckeditor->getJSSettings($editor);
+    $settings = $this->ckeditor->getJSConfiguration($editor);
     $this->assertEqual($settings['language'], $langcode);
   }
 
diff --git a/core/modules/editor/editor.module b/core/modules/editor/editor.module
index b7ec8b5..afb27d8 100644
--- a/core/modules/editor/editor.module
+++ b/core/modules/editor/editor.module
@@ -153,12 +153,13 @@ function editor_form_filter_format_form_alter(&$form, FormStateInterface $form_s
 
   // Add editor-specific validation and submit handlers.
   if ($editor) {
+    /** @var $plugin \Drupal\editor\Plugin\EditorPluginInterface */
     $plugin = $manager->createInstance($editor->getEditor());
     $settings_form = array();
-    $settings_form['#element_validate'][] = array($plugin, 'settingsFormValidate');
-    $form['editor']['settings']['subform'] = $plugin->settingsForm($settings_form, $form_state, $editor);
+    $settings_form['#element_validate'][] = array($plugin, 'validateConfigurationForm');
+    $form['editor']['settings']['subform'] = $plugin->buildConfigurationForm($settings_form, $form_state, $editor);
     $form['editor']['settings']['subform']['#parents'] = array('editor', 'settings');
-    $form['actions']['submit']['#submit'][] = array($plugin, 'settingsFormSubmit');
+    $form['actions']['submit']['#submit'][] = array($plugin, 'submitConfigurationForm');
   }
 
   $form['#validate'][] = 'editor_form_filter_admin_format_validate';
diff --git a/core/modules/editor/src/Entity/Editor.php b/core/modules/editor/src/Entity/Editor.php
index 60cdf5a..9ddc0cb 100644
--- a/core/modules/editor/src/Entity/Editor.php
+++ b/core/modules/editor/src/Entity/Editor.php
@@ -80,7 +80,9 @@ public function __construct(array $values, $entity_type) {
     parent::__construct($values, $entity_type);
 
     $plugin = $this->editorPluginManager()->createInstance($this->editor);
-    $this->settings += $plugin->getDefaultSettings();
+
+    /* @var \Drupal\editor\Plugin\EditorPluginInterface $plugin */
+    $this->settings = array_merge($this->settings, $plugin->getDefaultConfiguration());
   }
 
   /**
diff --git a/core/modules/editor/src/Plugin/EditorBase.php b/core/modules/editor/src/Plugin/EditorBase.php
index eafe673..84f7511 100644
--- a/core/modules/editor/src/Plugin/EditorBase.php
+++ b/core/modules/editor/src/Plugin/EditorBase.php
@@ -53,27 +53,27 @@
   /**
    * {@inheritdoc}
    */
-  public function getDefaultSettings() {
+  public function getDefaultConfiguration() {
     return array();
   }
 
   /**
    * {@inheritdoc}
    */
-  public function settingsForm(array $form, FormStateInterface $form_state, Editor $editor) {
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state, Editor $editor = NULL) {
     return $form;
   }
 
   /**
    * {@inheritdoc}
    */
-  public function settingsFormValidate(array $form, FormStateInterface $form_state) {
+  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
   }
 
   /**
    * {@inheritdoc}
    */
-  public function settingsFormSubmit(array $form, FormStateInterface $form_state) {
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
   }
 
 }
diff --git a/core/modules/editor/src/Plugin/EditorManager.php b/core/modules/editor/src/Plugin/EditorManager.php
index 6fc04d0..286fb39 100644
--- a/core/modules/editor/src/Plugin/EditorManager.php
+++ b/core/modules/editor/src/Plugin/EditorManager.php
@@ -83,7 +83,7 @@ public function getAttachments(array $format_ids) {
       $settings['editor']['formats'][$format_id] = array(
         'format' => $format_id,
         'editor' => $editor->getEditor(),
-        'editorSettings' => $plugin->getJSSettings($editor),
+        'editorSettings' => $plugin->getJSConfiguration($editor),
         'editorSupportsContentFiltering' => $plugin_definition['supports_content_filtering'],
         'isXssSafe' => $plugin_definition['is_xss_safe'],
       );
diff --git a/core/modules/editor/src/Plugin/EditorPluginInterface.php b/core/modules/editor/src/Plugin/EditorPluginInterface.php
index f5177f5..430c7ab 100644
--- a/core/modules/editor/src/Plugin/EditorPluginInterface.php
+++ b/core/modules/editor/src/Plugin/EditorPluginInterface.php
@@ -8,6 +8,7 @@
 namespace Drupal\editor\Plugin;
 
 use Drupal\Component\Plugin\PluginInspectionInterface;
+use Drupal\Core\Plugin\PluginFormInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\editor\Entity\Editor;
 
@@ -22,7 +23,7 @@
  * @see \Drupal\editor\Plugin\EditorManager
  * @see plugin_api
  */
-interface EditorPluginInterface extends PluginInspectionInterface {
+interface EditorPluginInterface extends PluginInspectionInterface, PluginFormInterface {
 
   /**
    * Returns the default settings for this configurable text editor.
@@ -31,27 +32,7 @@
    *   An array of settings as they would be stored by a configured text editor
    *   entity (\Drupal\editor\Entity\Editor).
    */
-  public function getDefaultSettings();
-
-  /**
-   * Returns a settings form to configure this text editor.
-   *
-   * If the editor's behavior depends on extensive options and/or external data,
-   * then the implementing module can choose to provide a separate, global
-   * configuration page rather than per-text-format settings. In that case, this
-   * form should provide a link to the separate settings page.
-   *
-   * @param array $form
-   *   An empty form array to be populated with a configuration form, if any.
-   * @param \Drupal\Core\Form\FormStateInterface $form_state
-   *   The state of the entire filter administration form.
-   * @param \Drupal\editor\Entity\Editor $editor
-   *   A configured text editor object.
-   *
-   * @return array
-   *   A render array for the settings form.
-   */
-  public function settingsForm(array $form, FormStateInterface $form_state, Editor $editor);
+  public function getDefaultConfiguration();
 
   /**
    * Validates the settings form for an editor.
@@ -65,7 +46,7 @@ public function settingsForm(array $form, FormStateInterface $form_state, Editor
    * @param \Drupal\Core\Form\FormStateInterface $form_state
    *   The current state of the form.
    */
-  public function settingsFormValidate(array $form, FormStateInterface $form_state);
+  public function validateConfigurationForm(array &$form, FormStateInterface $form_state);
 
   /**
    * Modifies any values in the form state to prepare them for saving.
@@ -78,7 +59,7 @@ public function settingsFormValidate(array $form, FormStateInterface $form_state
    * @param \Drupal\Core\Form\FormStateInterface $form_state
    *   The current state of the form.
    */
-  public function settingsFormSubmit(array $form, FormStateInterface $form_state);
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state);
 
   /**
    * Returns JavaScript settings to be attached.
@@ -98,7 +79,7 @@ public function settingsFormSubmit(array $form, FormStateInterface $form_state);
    * @see drupal_process_attached()
    * @see EditorManager::getAttachments()
    */
-  public function getJSSettings(Editor $editor);
+  public function getJSConfiguration(Editor $editor);
 
   /**
    * Returns libraries to be attached.
@@ -119,4 +100,13 @@ public function getJSSettings(Editor $editor);
    */
   public function getLibraries(Editor $editor);
 
+  /**
+   * {@inheritdoc}
+   *
+   * If the editor's behavior depends on extensive options and/or external data,
+   * then the implementing module can choose to provide a separate, global
+   * configuration page rather than per-text-format configuration. In that case,
+   * this form should provide a link to the separate configuration page.
+   */
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state);
 }
diff --git a/core/modules/editor/src/Tests/EditorManagerTest.php b/core/modules/editor/src/Tests/EditorManagerTest.php
index c28d99d..717bd5a 100644
--- a/core/modules/editor/src/Tests/EditorManagerTest.php
+++ b/core/modules/editor/src/Tests/EditorManagerTest.php
@@ -96,7 +96,7 @@ public function testManager() {
             'full_html' => [
               'format'  => 'full_html',
               'editor' => 'unicorn',
-              'editorSettings' => $unicorn_plugin->getJSSettings($editor),
+              'editorSettings' => $unicorn_plugin->getJSConfiguration($editor),
               'editorSupportsContentFiltering' => TRUE,
               'isXssSafe' => FALSE,
             ],
diff --git a/core/modules/editor/tests/modules/src/Plugin/Editor/TRexEditor.php b/core/modules/editor/tests/modules/src/Plugin/Editor/TRexEditor.php
index 5539c16..919238e 100644
--- a/core/modules/editor/tests/modules/src/Plugin/Editor/TRexEditor.php
+++ b/core/modules/editor/tests/modules/src/Plugin/Editor/TRexEditor.php
@@ -30,14 +30,14 @@ class TRexEditor extends EditorBase {
   /**
    * {@inheritdoc}
    */
-  public function getDefaultSettings() {
+  public function getDefaultConfiguration() {
     return array('stumpy_arms' => TRUE);
   }
 
   /**
    * {@inheritdoc}
    */
-  public function settingsForm(array $form, FormStateInterface $form_state, EditorEntity $editor) {
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state, EditorEntity $editor = NULL) {
     $form['stumpy_arms'] = array(
       '#title' => t('Stumpy arms'),
       '#type' => 'checkbox',
@@ -49,7 +49,7 @@ public function settingsForm(array $form, FormStateInterface $form_state, Editor
   /**
    * {@inheritdoc}
    */
-  public function getJSSettings(EditorEntity $editor) {
+  public function getJSConfiguration(EditorEntity $editor) {
     $js_settings = array();
     $settings = $editor->getSettings();
     if ($settings['stumpy_arms']) {
diff --git a/core/modules/editor/tests/modules/src/Plugin/Editor/UnicornEditor.php b/core/modules/editor/tests/modules/src/Plugin/Editor/UnicornEditor.php
index e859732..9d914c2 100644
--- a/core/modules/editor/tests/modules/src/Plugin/Editor/UnicornEditor.php
+++ b/core/modules/editor/tests/modules/src/Plugin/Editor/UnicornEditor.php
@@ -31,14 +31,14 @@ class UnicornEditor extends EditorBase {
   /**
    * {@inheritdoc}
    */
-  function getDefaultSettings() {
+  public function getDefaultConfiguration() {
     return array('ponies_too' => TRUE);
   }
 
   /**
    * {@inheritdoc}
    */
-  function settingsForm(array $form, FormStateInterface $form_state, EditorEntity $editor) {
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state, EditorEntity $editor = NULL) {
     $form['ponies_too'] = array(
       '#title' => t('Pony mode'),
       '#type' => 'checkbox',
@@ -50,7 +50,7 @@ function settingsForm(array $form, FormStateInterface $form_state, EditorEntity
   /**
    * {@inheritdoc}
    */
-  function getJSSettings(EditorEntity $editor) {
+  public function getJSConfiguration(EditorEntity $editor) {
     $js_settings = array();
     $settings = $editor->getSettings();
     if ($settings['ponies_too']) {
diff --git a/core/modules/editor/tests/src/Unit/EditorConfigEntityUnitTest.php b/core/modules/editor/tests/src/Unit/EditorConfigEntityUnitTest.php
index c5a676b..77ea892 100644
--- a/core/modules/editor/tests/src/Unit/EditorConfigEntityUnitTest.php
+++ b/core/modules/editor/tests/src/Unit/EditorConfigEntityUnitTest.php
@@ -103,8 +103,8 @@ public function testCalculateDependencies() {
     $plugin->expects($this->once())
       ->method('getPluginDefinition')
       ->will($this->returnValue(array('provider' => 'test_module')));
-    $plugin->expects($this->once())
-      ->method('getDefaultSettings')
+    $plugin->expects($this->any())
+      ->method('getDefaultConfiguration')
       ->will($this->returnValue(array()));
 
     $this->editorPluginManager->expects($this->any())
