diff --git a/core/modules/image/src/Tests/ImageFieldTestBase.php b/core/modules/image/src/Tests/ImageFieldTestBase.php
index 6081d32..04da7ae 100644
--- a/core/modules/image/src/Tests/ImageFieldTestBase.php
+++ b/core/modules/image/src/Tests/ImageFieldTestBase.php
@@ -2,9 +2,7 @@
 
 namespace Drupal\image\Tests;
 
-use Drupal\field\Entity\FieldConfig;
 use Drupal\simpletest\WebTestBase;
-use Drupal\field\Entity\FieldStorageConfig;
 
 /**
  * TODO: Test the following functions.
@@ -24,6 +22,8 @@
  */
 abstract class ImageFieldTestBase extends WebTestBase {
 
+  use ImageFieldCreationTrait;
+
   /**
    * Modules to enable.
    *
@@ -52,62 +52,6 @@ protected function setUp() {
   }
 
   /**
-   * Create a new image field.
-   *
-   * @param string $name
-   *   The name of the new field (all lowercase), exclude the "field_" prefix.
-   * @param string $type_name
-   *   The node type that this field will be added to.
-   * @param array $storage_settings
-   *   A list of field storage settings that will be added to the defaults.
-   * @param array $field_settings
-   *   A list of instance settings that will be added to the instance defaults.
-   * @param array $widget_settings
-   *   Widget settings to be added to the widget defaults.
-   * @param array $formatter_settings
-   *   Formatter settings to be added to the formatter defaults.
-   * @param string $description
-   *   A description for the field.
-   */
-  function createImageField($name, $type_name, $storage_settings = array(), $field_settings = array(), $widget_settings = array(), $formatter_settings = array(), $description = '') {
-    FieldStorageConfig::create(array(
-      'field_name' => $name,
-      'entity_type' => 'node',
-      'type' => 'image',
-      'settings' => $storage_settings,
-      'cardinality' => !empty($storage_settings['cardinality']) ? $storage_settings['cardinality'] : 1,
-    ))->save();
-
-    $field_config = FieldConfig::create([
-      'field_name' => $name,
-      'label' => $name,
-      'entity_type' => 'node',
-      'bundle' => $type_name,
-      'required' => !empty($field_settings['required']),
-      'settings' => $field_settings,
-      'description' => $description,
-    ]);
-    $field_config->save();
-
-    entity_get_form_display('node', $type_name, 'default')
-      ->setComponent($name, array(
-        'type' => 'image_image',
-        'settings' => $widget_settings,
-      ))
-      ->save();
-
-    entity_get_display('node', $type_name, 'default')
-      ->setComponent($name, array(
-        'type' => 'image',
-        'settings' => $formatter_settings,
-      ))
-      ->save();
-
-    return $field_config;
-
-  }
-
-  /**
    * Preview an image in a node.
    *
    * @param \Drupal\Core\Image\ImageInterface $image
diff --git a/core/modules/image/tests/src/ImageFieldCreationTrait.php b/core/modules/image/tests/src/ImageFieldCreationTrait.php
new file mode 100644
index 0000000..d127104
--- /dev/null
+++ b/core/modules/image/tests/src/ImageFieldCreationTrait.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Drupal\image\Tests;
+
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
+
+/**
+ * Provides a helper method for creating Image fields.
+ */
+trait ImageFieldCreationTrait {
+
+  /**
+   * Create a new image field.
+   *
+   * @param string $name
+   *   The name of the new field (all lowercase), exclude the "field_" prefix.
+   * @param string $type_name
+   *   The node type that this field will be added to.
+   * @param array $storage_settings
+   *   A list of field storage settings that will be added to the defaults.
+   * @param array $field_settings
+   *   A list of instance settings that will be added to the instance defaults.
+   * @param array $widget_settings
+   *   Widget settings to be added to the widget defaults.
+   * @param array $formatter_settings
+   *   Formatter settings to be added to the formatter defaults.
+   * @param string $description
+   *   A description for the field.
+   */
+  protected function createImageField($name, $type_name, $storage_settings = array(), $field_settings = array(), $widget_settings = array(), $formatter_settings = array(), $description = '') {
+    FieldStorageConfig::create(array(
+      'field_name' => $name,
+      'entity_type' => 'node',
+      'type' => 'image',
+      'settings' => $storage_settings,
+      'cardinality' => !empty($storage_settings['cardinality']) ? $storage_settings['cardinality'] : 1,
+    ))->save();
+
+    $field_config = FieldConfig::create([
+      'field_name' => $name,
+      'label' => $name,
+      'entity_type' => 'node',
+      'bundle' => $type_name,
+      'required' => !empty($field_settings['required']),
+      'settings' => $field_settings,
+      'description' => $description,
+    ]);
+    $field_config->save();
+
+    entity_get_form_display('node', $type_name, 'default')
+      ->setComponent($name, array(
+        'type' => 'image_image',
+        'settings' => $widget_settings,
+      ))
+      ->save();
+
+    entity_get_display('node', $type_name, 'default')
+      ->setComponent($name, array(
+        'type' => 'image',
+        'settings' => $formatter_settings,
+      ))
+      ->save();
+
+    return $field_config;
+  }
+
+}
diff --git a/core/modules/simpletest/src/TestFilesTrait.php b/core/modules/simpletest/src/TestFilesTrait.php
new file mode 100644
index 0000000..d919377
--- /dev/null
+++ b/core/modules/simpletest/src/TestFilesTrait.php
@@ -0,0 +1,117 @@
+<?php
+
+namespace Drupal\simpletest;
+
+use Drupal\Core\StreamWrapper\PublicStream;
+
+/**
+ * Provides helper methods for generating test files.
+ */
+trait TestFilesTrait {
+
+  /**
+   * Whether the files were copied to the test files directory.
+   */
+  protected $generatedTestFiles = FALSE;
+
+  /**
+   * Gets a list of files that can be used in tests.
+   *
+   * The first time this method is called, it will call
+   * simpletest_generate_file() to generate binary and ASCII text files in the
+   * public:// directory. It will also copy all files in
+   * core/modules/simpletest/files to public://. These contain image, SQL, PHP,
+   * JavaScript, and HTML files.
+   *
+   * All filenames are prefixed with their type and have appropriate extensions:
+   * - text-*.txt
+   * - binary-*.txt
+   * - html-*.html and html-*.txt
+   * - image-*.png, image-*.jpg, and image-*.gif
+   * - javascript-*.txt and javascript-*.script
+   * - php-*.txt and php-*.php
+   * - sql-*.txt and sql-*.sql
+   *
+   * Any subsequent calls will not generate any new files, or copy the files
+   * over again. However, if a test class adds a new file to public:// that
+   * is prefixed with one of the above types, it will get returned as well, even
+   * on subsequent calls.
+   *
+   * @param $type
+   *   File type, possible values: 'binary', 'html', 'image', 'javascript',
+   *   'php', 'sql', 'text'.
+   * @param $size
+   *   (optional) File size in bytes to match. Defaults to NULL, which will not
+   *   filter the returned list by size.
+   *
+   * @return
+   *   List of files in public:// that match the filter(s).
+   */
+  protected function getTestFiles($type, $size = NULL) {
+    if (empty($this->generatedTestFiles)) {
+      // Generate binary test files.
+      $lines = array(64, 1024);
+      $count = 0;
+      foreach ($lines as $line) {
+        simpletest_generate_file('binary-' . $count++, 64, $line, 'binary');
+      }
+
+      // Generate ASCII text test files.
+      $lines = array(16, 256, 1024, 2048, 20480);
+      $count = 0;
+      foreach ($lines as $line) {
+        simpletest_generate_file('text-' . $count++, 64, $line, 'text');
+      }
+
+      // Copy other test files from simpletest.
+      $original = drupal_get_path('module', 'simpletest') . '/files';
+      $files = file_scan_directory($original, '/(html|image|javascript|php|sql)-.*/');
+      foreach ($files as $file) {
+        file_unmanaged_copy($file->uri, PublicStream::basePath());
+      }
+
+      $this->generatedTestFiles = TRUE;
+    }
+
+    $files = array();
+    // Make sure type is valid.
+    if (in_array($type, array('binary', 'html', 'image', 'javascript', 'php', 'sql', 'text'))) {
+      $files = file_scan_directory('public://', '/' . $type . '\-.*/');
+
+      // If size is set then remove any files that are not of that size.
+      if ($size !== NULL) {
+        foreach ($files as $file) {
+          $stats = stat($file->uri);
+          if ($stats['size'] != $size) {
+            unset($files[$file->uri]);
+          }
+        }
+      }
+    }
+    usort($files, array($this, 'drupalCompareFiles'));
+    return $files;
+  }
+
+  /**
+   * Compare two files based on size and file name.
+   *
+   * @param object $file1
+   *   An object with the properties 'uri', 'filename', and 'name'.
+   * @param object $file2
+   *   An object with the properties 'uri', 'filename', and 'name'.
+   * @return bool
+   *   The comparison result based on size and file name.
+   */
+  protected function drupalCompareFiles($file1, $file2) {
+    $compare_size = filesize($file1->uri) - filesize($file2->uri);
+    if ($compare_size) {
+      // Sort by file size.
+      return $compare_size;
+    }
+    else {
+      // The files were the same size, so sort alphabetically.
+      return strnatcmp($file1->name, $file2->name);
+    }
+  }
+
+}
diff --git a/core/modules/simpletest/src/WebTestBase.php b/core/modules/simpletest/src/WebTestBase.php
index b0f90ed..a36831f 100644
--- a/core/modules/simpletest/src/WebTestBase.php
+++ b/core/modules/simpletest/src/WebTestBase.php
@@ -22,7 +22,6 @@
 use Drupal\Core\Session\AnonymousUserSession;
 use Drupal\Core\Session\UserSession;
 use Drupal\Core\Site\Settings;
-use Drupal\Core\StreamWrapper\PublicStream;
 use Drupal\Core\Test\AssertMailTrait;
 use Drupal\Core\Url;
 use Drupal\system\Tests\Cache\AssertPageCacheContextsAndTagsTrait;
@@ -58,6 +57,9 @@
     createRole as drupalCreateRole;
     createAdminRole as drupalCreateAdminRole;
   }
+  use TestFilesTrait {
+    getTestFiles as drupalGetTestFiles;
+  }
 
   /**
    * The profile to install as a basis for testing.
@@ -169,11 +171,6 @@
   protected $sessionId = NULL;
 
   /**
-   * Whether the files were copied to the test files directory.
-   */
-  protected $generatedTestFiles = FALSE;
-
-  /**
    * The maximum number of redirects to follow when handling responses.
    */
   protected $maximumRedirects = 5;
@@ -334,99 +331,6 @@ protected function findBlockInstance(Block $block) {
   }
 
   /**
-   * Gets a list of files that can be used in tests.
-   *
-   * The first time this method is called, it will call
-   * simpletest_generate_file() to generate binary and ASCII text files in the
-   * public:// directory. It will also copy all files in
-   * core/modules/simpletest/files to public://. These contain image, SQL, PHP,
-   * JavaScript, and HTML files.
-   *
-   * All filenames are prefixed with their type and have appropriate extensions:
-   * - text-*.txt
-   * - binary-*.txt
-   * - html-*.html and html-*.txt
-   * - image-*.png, image-*.jpg, and image-*.gif
-   * - javascript-*.txt and javascript-*.script
-   * - php-*.txt and php-*.php
-   * - sql-*.txt and sql-*.sql
-   *
-   * Any subsequent calls will not generate any new files, or copy the files
-   * over again. However, if a test class adds a new file to public:// that
-   * is prefixed with one of the above types, it will get returned as well, even
-   * on subsequent calls.
-   *
-   * @param $type
-   *   File type, possible values: 'binary', 'html', 'image', 'javascript',
-   *   'php', 'sql', 'text'.
-   * @param $size
-   *   (optional) File size in bytes to match. Defaults to NULL, which will not
-   *   filter the returned list by size.
-   *
-   * @return
-   *   List of files in public:// that match the filter(s).
-   */
-  protected function drupalGetTestFiles($type, $size = NULL) {
-    if (empty($this->generatedTestFiles)) {
-      // Generate binary test files.
-      $lines = array(64, 1024);
-      $count = 0;
-      foreach ($lines as $line) {
-        simpletest_generate_file('binary-' . $count++, 64, $line, 'binary');
-      }
-
-      // Generate ASCII text test files.
-      $lines = array(16, 256, 1024, 2048, 20480);
-      $count = 0;
-      foreach ($lines as $line) {
-        simpletest_generate_file('text-' . $count++, 64, $line, 'text');
-      }
-
-      // Copy other test files from simpletest.
-      $original = drupal_get_path('module', 'simpletest') . '/files';
-      $files = file_scan_directory($original, '/(html|image|javascript|php|sql)-.*/');
-      foreach ($files as $file) {
-        file_unmanaged_copy($file->uri, PublicStream::basePath());
-      }
-
-      $this->generatedTestFiles = TRUE;
-    }
-
-    $files = array();
-    // Make sure type is valid.
-    if (in_array($type, array('binary', 'html', 'image', 'javascript', 'php', 'sql', 'text'))) {
-      $files = file_scan_directory('public://', '/' . $type . '\-.*/');
-
-      // If size is set then remove any files that are not of that size.
-      if ($size !== NULL) {
-        foreach ($files as $file) {
-          $stats = stat($file->uri);
-          if ($stats['size'] != $size) {
-            unset($files[$file->uri]);
-          }
-        }
-      }
-    }
-    usort($files, array($this, 'drupalCompareFiles'));
-    return $files;
-  }
-
-  /**
-   * Compare two files based on size and file name.
-   */
-  protected function drupalCompareFiles($file1, $file2) {
-    $compare_size = filesize($file1->uri) - filesize($file2->uri);
-    if ($compare_size) {
-      // Sort by file size.
-      return $compare_size;
-    }
-    else {
-      // The files were the same size, so sort alphabetically.
-      return strnatcmp($file1->name, $file2->name);
-    }
-  }
-
-  /**
    * Log in a user with the internal browser.
    *
    * If a user is already logged in, then the current user is logged out before
