diff --git a/core/includes/form.inc b/core/includes/form.inc
index 05c604d..388e319 100644
--- a/core/includes/form.inc
+++ b/core/includes/form.inc
@@ -44,55 +44,6 @@ function form_set_cache($form_build_id, $form, FormStateInterface $form_state) {
 }
 
 /**
- * Ensures an include file is loaded whenever the form is processed.
- *
- * Example:
- * @code
- *   // Load node.admin.inc from Node module.
- *   form_load_include($form_state, 'inc', 'node', 'node.admin');
- * @endcode
- *
- * Use this function instead of module_load_include() from inside a form
- * constructor or any form processing logic as it ensures that the include file
- * is loaded whenever the form is processed. In contrast to using
- * module_load_include() directly, form_load_include() makes sure the include
- * file is correctly loaded also if the form is cached.
- *
- * @param $form_state
- *   The current state of the form.
- * @param $type
- *   The include file's type (file extension).
- * @param $module
- *   The module to which the include file belongs.
- * @param $name
- *   (optional) The base file name (without the $type extension). If omitted,
- *   $module is used; i.e., resulting in "$module.$type" by default.
- *
- * @return
- *   The filepath of the loaded include file, or FALSE if the include file was
- *   not found or has been loaded already.
- *
- * @see module_load_include()
- */
-function form_load_include(FormStateInterface $form_state, $type, $module, $name = NULL) {
-  if (!isset($name)) {
-    $name = $module;
-  }
-  if (!isset($form_state['build_info']['files']["$module:$name.$type"])) {
-    // Only add successfully included files to the form state.
-    if ($result = module_load_include($type, $module, $name)) {
-      $form_state['build_info']['files']["$module:$name.$type"] = array(
-        'type' => $type,
-        'module' => $module,
-        'name' => $name,
-      );
-      return $result;
-    }
-  }
-  return FALSE;
-}
-
-/**
  * Retrieves, populates, and processes a form.
  *
  * @deprecated in Drupal 8.x-dev, will be removed before Drupal 8.0.
diff --git a/core/lib/Drupal/Core/Form/FormBuilder.php b/core/lib/Drupal/Core/Form/FormBuilder.php
index 6c473f2..0fff656 100644
--- a/core/lib/Drupal/Core/Form/FormBuilder.php
+++ b/core/lib/Drupal/Core/Form/FormBuilder.php
@@ -334,7 +334,7 @@ public function getCache($form_build_id, FormStateInterface &$form_state) {
           $form_state->setFormState($stored_form_state);
 
           // If the original form is contained in include files, load the files.
-          // @see form_load_include()
+          // @see \Drupal\Core\Form\FormStateInterface::loadInclude()
           $form_state['build_info'] += array('files' => array());
           foreach ($form_state['build_info']['files'] as $file) {
             if (is_array($file)) {
diff --git a/core/lib/Drupal/Core/Form/FormState.php b/core/lib/Drupal/Core/Form/FormState.php
index d4c29e2..1fcba6d 100644
--- a/core/lib/Drupal/Core/Form/FormState.php
+++ b/core/lib/Drupal/Core/Form/FormState.php
@@ -61,7 +61,7 @@ class FormState implements FormStateInterface, \ArrayAccess {
    *     'name' as needed by module_load_include(). The files listed here are
    *     automatically loaded by form_get_cache(). By default the current menu
    *     router item's 'file' definition is added, if any. Use
-   *     form_load_include() to add include files from a form constructor.
+   *     self::loadInclude() to add include files from a form constructor.
    *   - form_id: Identification of the primary form being constructed and
    *     processed.
    *   - base_form_id: Identification for a base form, as declared in the form
@@ -432,6 +432,29 @@ public function setFormState(array $form_state_additions) {
   /**
    * {@inheritdoc}
    */
+  public function loadInclude($type, $module, $name = NULL) {
+    if (!isset($name)) {
+      $name = $module;
+    }
+    $build_info = $this->get('build_info');
+    if (!isset($build_info['files']["$module:$name.$type"])) {
+      // Only add successfully included files to the form state.
+      if ($result = $this->moduleLoadInclude($type, $module, $name)) {
+        $build_info['files']["$module:$name.$type"] = array(
+          'type' => $type,
+          'module' => $module,
+          'name' => $name,
+        );
+        $this->set('build_info', $build_info);
+        return $result;
+      }
+    }
+    return FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getCacheableArray($allowed_keys = array()) {
     $cacheable_array = array(
       'build_info' => $this->build_info,
@@ -824,4 +847,11 @@ protected function drupalSetMessage($message = NULL, $type = 'status', $repeat =
     return drupal_set_message($message, $type, $repeat);
   }
 
+  /**
+   * Wraps module_load_include().
+   */
+  protected function moduleLoadInclude($type, $module, $name = NULL) {
+    return module_load_include($type, $module, $name);
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Form/FormStateInterface.php b/core/lib/Drupal/Core/Form/FormStateInterface.php
index a154f3b..85f4b52 100644
--- a/core/lib/Drupal/Core/Form/FormStateInterface.php
+++ b/core/lib/Drupal/Core/Form/FormStateInterface.php
@@ -47,6 +47,37 @@ public function &getCompleteForm();
   public function setCompleteForm(array &$complete_form);
 
   /**
+   * Ensures an include file is loaded whenever the form is processed.
+   *
+   * Example:
+   * @code
+   *   // Load node.admin.inc from Node module.
+   *   $form_state->loadInclude('inc', 'node', 'node.admin');
+   * @endcode
+   *
+   * Use this function instead of module_load_include() from inside a form
+   * constructor or any form processing logic as it ensures that the include file
+   * is loaded whenever the form is processed. In contrast to using
+   * module_load_include() directly, this method makes sure the include file is
+   * correctly loaded also if the form is cached.
+   *
+   * @param string $type
+   *   The include file's type (file extension).
+   * @param string $module
+   *   The module to which the include file belongs.
+   * @param string|null $name
+   *   (optional) The base file name (without the $type extension). If omitted,
+   *   $module is used; i.e., resulting in "$module.$type" by default.
+   *
+   * @return string|false
+   *   The filepath of the loaded include file, or FALSE if the include file was
+   *   not found or has been loaded already.
+   *
+   * @see module_load_include()
+   */
+  public function loadInclude($type, $module, $name = NULL);
+
+  /**
    * Returns an array representation of the cacheable portion of the form state.
    *
    * @return array
diff --git a/core/modules/ckeditor/src/Plugin/CKEditorPlugin/DrupalImage.php b/core/modules/ckeditor/src/Plugin/CKEditorPlugin/DrupalImage.php
index 23f9c1c..6f1ecee 100644
--- a/core/modules/ckeditor/src/Plugin/CKEditorPlugin/DrupalImage.php
+++ b/core/modules/ckeditor/src/Plugin/CKEditorPlugin/DrupalImage.php
@@ -68,7 +68,7 @@ public function getButtons() {
    * @see editor_image_upload_settings_form()
    */
   public function settingsForm(array $form, FormStateInterface $form_state, Editor $editor) {
-    form_load_include($form_state, 'inc', 'editor', 'editor.admin');
+    $form_state->loadInclude('admin.inc', 'editor');
     $form['image_upload'] = editor_image_upload_settings_form($editor);
     $form['image_upload']['#attached']['library'][] = 'ckeditor/drupal.ckeditor.drupalimage.admin';
     $form['image_upload']['#element_validate'][] = array($this, 'validateImageUploadSettings');
diff --git a/core/modules/views_ui/src/ViewEditForm.php b/core/modules/views_ui/src/ViewEditForm.php
index 1c9522e..fd669c4 100644
--- a/core/modules/views_ui/src/ViewEditForm.php
+++ b/core/modules/views_ui/src/ViewEditForm.php
@@ -89,7 +89,7 @@ public function form(array $form, FormStateInterface $form_state) {
     //   - Change $form_state['view'] to $form_state['temporary']['view'].
     //   - Add a #process function to initialize $form_state['temporary']['view']
     //     on cached form submissions.
-    //   - Use form_load_include().
+    //   - Use \Drupal\Core\Form\FormStateInterface::loadInclude().
     $form_state['no_cache'] = TRUE;
 
     if ($display_id) {
diff --git a/core/modules/views_ui/src/ViewFormBase.php b/core/modules/views_ui/src/ViewFormBase.php
index e9841b7..9fcaaa0 100644
--- a/core/modules/views_ui/src/ViewFormBase.php
+++ b/core/modules/views_ui/src/ViewFormBase.php
@@ -35,7 +35,7 @@ public function init(FormStateInterface $form_state) {
     }
 
     // @todo Remove the need for this.
-    form_load_include($form_state, 'inc', 'views_ui', 'admin');
+    $form_state->loadInclude('inc', 'views_ui', 'admin');
     $form_state->set('view', $this->entity);
   }
 
diff --git a/core/tests/Drupal/Tests/Core/Form/FormStateTest.php b/core/tests/Drupal/Tests/Core/Form/FormStateTest.php
index 3f391dd..a8581d7 100644
--- a/core/tests/Drupal/Tests/Core/Form/FormStateTest.php
+++ b/core/tests/Drupal/Tests/Core/Form/FormStateTest.php
@@ -348,6 +348,79 @@ public function providerTestIsValueEmpty() {
     return $data;
   }
 
+  /**
+   * @covers ::loadInclude
+   */
+  public function testLoadInclude() {
+    $type = 'some_type';
+    $module = 'some_module';
+    $name = 'some_name';
+    $form_state = $this->getMockBuilder('Drupal\Core\Form\FormState')
+      ->setMethods(array('moduleLoadInclude'))
+      ->getMock();
+    $form_state->expects($this->once())
+      ->method('moduleLoadInclude')
+      ->with($type, $module, $name)
+      ->willReturn(TRUE);
+    $this->assertTrue($form_state->loadInclude($type, $module, $name));
+  }
+
+  /**
+   * @covers ::loadInclude
+   */
+  public function testLoadIncludeNoName() {
+    $type = 'some_type';
+    $module = 'some_module';
+    $form_state = $this->getMockBuilder('Drupal\Core\Form\FormState')
+      ->setMethods(array('moduleLoadInclude'))
+      ->getMock();
+      $form_state->expects($this->once())
+        ->method('moduleLoadInclude')
+        ->with($type, $module, $module)
+        ->willReturn(TRUE);
+    $this->assertTrue($form_state->loadInclude($type, $module));
+  }
+
+  /**
+   * @covers ::loadInclude
+   */
+  public function testLoadIncludeNotFound() {
+    $type = 'some_type';
+    $module = 'some_module';
+    $form_state = $this->getMockBuilder('Drupal\Core\Form\FormState')
+      ->setMethods(array('moduleLoadInclude'))
+      ->getMock();
+    $form_state->expects($this->once())
+      ->method('moduleLoadInclude')
+      ->with($type, $module, $module)
+      ->willReturn(FALSE);
+    $this->assertFalse($form_state->loadInclude($type, $module));
+  }
+
+  /**
+   * @covers ::loadInclude
+   */
+  public function testLoadIncludeAlreadyLoaded() {
+    $type = 'some_type';
+    $module = 'some_module';
+    $name = 'some_name';
+    $form_state = $this->getMockBuilder('Drupal\Core\Form\FormState')
+      ->setConstructorArgs([['build_info' => ['files' => [
+        'some_module:some_name.some_type' => [
+          'type' => $type,
+          'module' => $module,
+          'name' => $name,
+        ],
+      ]]]])
+      ->setMethods(array('moduleLoadInclude'))
+      ->getMock();
+
+    $form_state->expects($this->never())
+      ->method('moduleLoadInclude');
+
+    $this->assertFalse($form_state->loadInclude($type, $module, $name));
+  }
+
 }
 
 /**
