diff --git a/core/lib/Drupal/Core/Image/Image.php b/core/lib/Drupal/Core/Image/Image.php
deleted file mode 100644
index e170991..0000000
--- a/core/lib/Drupal/Core/Image/Image.php
+++ /dev/null
@@ -1,213 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\Image\Image.
- */
-
-namespace Drupal\Core\Image;
-
-use Drupal\Core\ImageToolkit\ImageToolkitInterface;
-
-/**
- * Defines an image object to represent an image file.
- *
- * @see \Drupal\Core\ImageToolkit\ImageToolkitInterface
- * @see \Drupal\image\ImageEffectInterface
- *
- * @ingroup image
- */
-class Image implements ImageInterface {
-
-  /**
-   * Path of the image file.
-   *
-   * @var string
-   */
-  protected $source = '';
-
-  /**
-   * An image toolkit object.
-   *
-   * @var \Drupal\Core\ImageToolkit\ImageToolkitInterface
-   */
-  protected $toolkit;
-
-  /**
-   * File size in bytes.
-   *
-   * @var int
-   */
-  protected $fileSize;
-
-  /**
-   * Constructs a new Image object.
-   *
-   * @param \Drupal\Core\ImageToolkit\ImageToolkitInterface $toolkit
-   *   The image toolkit.
-   * @param string|null $source
-   *   (optional) The path to an image file, or NULL to construct the object
-   *   with no image source.
-   */
-  public function __construct(ImageToolkitInterface $toolkit, $source = NULL) {
-    $this->toolkit = $toolkit;
-    $this->getToolkit()->setImage($this);
-    if ($source) {
-      $this->source = $source;
-      // Defer image file validity check to the toolkit.
-      if ($this->getToolkit()->parseFile()) {
-        $this->fileSize = filesize($this->source);
-      }
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function isValid() {
-    return $this->getToolkit()->isValid();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getHeight() {
-    return $this->getToolkit()->getHeight();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getWidth() {
-    return $this->getToolkit()->getWidth();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getFileSize() {
-    return $this->fileSize;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getMimeType() {
-    return $this->getToolkit()->getMimeType();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getSource() {
-    return $this->source;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getToolkitId() {
-    return $this->getToolkit()->getPluginId();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getToolkit() {
-    return $this->toolkit;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function save($destination = NULL) {
-    // Return immediately if the image is not valid.
-    if (!$this->isValid()) {
-      return FALSE;
-    }
-
-    $destination = $destination ?: $this->getSource();
-    if ($return = $this->getToolkit()->save($destination)) {
-      // Clear the cached file size and refresh the image information.
-      clearstatcache(TRUE, $destination);
-      $this->fileSize = filesize($destination);
-      $this->source = $destination;
-
-      // @todo Use File utility when https://drupal.org/node/2050759 is in.
-      if ($this->chmod($destination)) {
-        return $return;
-      }
-    }
-    return FALSE;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function apply($operation, array $arguments = array()) {
-    return $this->getToolkit()->apply($operation, $arguments);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function crop($x, $y, $width, $height = NULL) {
-    return $this->apply('crop', array('x' => $x, 'y' => $y, 'width' => $width, 'height' => $height));
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function desaturate() {
-    return $this->apply('desaturate', array());
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function resize($width, $height) {
-    return $this->apply('resize', array('width' => $width, 'height' => $height));
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function rotate($degrees, $background = NULL) {
-    return $this->apply('rotate', array('degrees' => $degrees, 'background' => $background));
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function scaleAndCrop($width, $height) {
-    return $this->apply('scale_and_crop', array('width' => $width, 'height' => $height));
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function scale($width, $height = NULL, $upscale = FALSE) {
-    return $this->apply('scale', array('width' => $width, 'height' => $height, 'upscale' => $upscale));
-  }
-
-  /**
-   * Provides a wrapper for drupal_chmod() to allow unit testing.
-   *
-   * @param string $uri
-   *   A string containing a URI file, or directory path.
-   * @param int $mode
-   *   Integer value for the permissions. Consult PHP chmod() documentation for
-   *   more information.
-   *
-   * @see drupal_chmod()
-   *
-   * @todo Remove when https://drupal.org/node/2050759 is in.
-   *
-   * @return bool
-   *   TRUE for success, FALSE in the event of an error.
-   */
-  protected function chmod($uri, $mode = NULL) {
-    return drupal_chmod($uri, $mode);
-  }
-
-}
diff --git a/core/lib/Drupal/Core/Image/ImageFactory.php b/core/lib/Drupal/Core/Image/ImageFactory.php
index efcf3d9..992a2e0 100644
--- a/core/lib/Drupal/Core/Image/ImageFactory.php
+++ b/core/lib/Drupal/Core/Image/ImageFactory.php
@@ -87,7 +87,11 @@ public function getToolkitId() {
    */
   public function get($source = NULL, $toolkit_id = NULL) {
     $toolkit_id = $toolkit_id ?: $this->toolkitId;
-    return new Image($this->toolkitManager->createInstance($toolkit_id), $source);
+    $image = $this->toolkitManager->createInstance($toolkit_id);
+    if ($source) {
+      $image->parseFile($source);
+    }
+    return $image;
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Image/ImageInterface.php b/core/lib/Drupal/Core/Image/ImageInterface.php
index 02db478..b630c3d 100644
--- a/core/lib/Drupal/Core/Image/ImageInterface.php
+++ b/core/lib/Drupal/Core/Image/ImageInterface.php
@@ -13,6 +13,20 @@
 interface ImageInterface {
 
   /**
+   * Determines if a file contains a valid image.
+   *
+   * Drupal supports GIF, JPG and PNG file formats when used with the GD
+   * toolkit, and may support others, depending on which toolkits are
+   * installed.
+   *
+   * @param @todo
+   *
+   * @return bool
+   *   TRUE if the file could be found and is an image, FALSE otherwise.
+   */
+  public function parseFile($source);
+
+  /**
    * Checks if the image is valid.
    *
    * @return bool
@@ -63,22 +77,6 @@ public function getMimeType();
   public function getSource();
 
   /**
-   * Returns the image toolkit used for this image file.
-   *
-   * @return \Drupal\Core\ImageToolkit\ImageToolkitInterface
-   *   The image toolkit.
-   */
-  public function getToolkit();
-
-  /**
-   * Returns the ID of the image toolkit used for this image file.
-   *
-   * @return string
-   *   The ID of the image toolkit.
-   */
-  public function getToolkitId();
-
-  /**
    * Applies a toolkit operation to the image.
    *
    * The operation is deferred to the active toolkit.
diff --git a/core/lib/Drupal/Core/ImageToolkit/ImageToolkitBase.php b/core/lib/Drupal/Core/ImageToolkit/ImageToolkitBase.php
index 793768c..632496f 100644
--- a/core/lib/Drupal/Core/ImageToolkit/ImageToolkitBase.php
+++ b/core/lib/Drupal/Core/ImageToolkit/ImageToolkitBase.php
@@ -20,14 +20,7 @@
  * @see \Drupal\Core\ImageToolkit\ImageToolkitManager
  * @see plugin_api
  */
-abstract class ImageToolkitBase extends PluginBase implements ImageToolkitInterface {
-
-  /**
-   * Image object this toolkit instance is tied to.
-   *
-   * @var \Drupal\Core\Image\ImageInterface
-   */
-  protected $image;
+abstract class ImageToolkitBase extends PluginBase implements ImageInterface, ImageToolkitInterface {
 
   /**
    * The image toolkit operation manager.
@@ -43,6 +36,19 @@
    */
   protected $logger;
 
+  /**
+   * Path of the image file.
+   *
+   * @var string
+   */
+  protected $source = '';
+
+  /**
+   * File size in bytes.
+   *
+   * @var int
+   */
+  protected $fileSize;
 
   /**
    * Constructs an ImageToolkitBase object.
@@ -67,18 +73,113 @@ public function __construct(array $configuration, $plugin_id, array $plugin_defi
   /**
    * {@inheritdoc}
    */
-  public function setImage(ImageInterface $image) {
-    if ($this->image) {
-      throw new \BadMethodCallException(__METHOD__ . '() may only be called once');
+  public function getFileSize() {
+    return $this->fileSize;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getSource() {
+    return $this->source;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public final function parseFile($source) {
+    $this->source = $source;
+    if ($this->doParseFile()) {
+      $this->fileSize = filesize($this->source);
+      return TRUE;
+    }
+    return FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public final function save($destination = NULL) {
+    // Return immediately if the image is not valid.
+    if (!$this->isValid()) {
+      return FALSE;
     }
-    $this->image = $image;
+
+    $destination = $destination ?: $this->getSource();
+    if ($return = $this->doSave($destination)) {
+      // Clear the cached file size and refresh the image information.
+      clearstatcache(TRUE, $destination);
+      $this->fileSize = filesize($destination);
+      $this->source = $destination;
+
+      // @todo Use File utility when https://drupal.org/node/2050759 is in.
+      if ($this->chmod($destination)) {
+        return $return;
+      }
+    }
+    return FALSE;
+  }
+
+  /**
+   * Provides a wrapper for drupal_chmod() to allow unit testing.
+   *
+   * @param string $uri
+   *   A string containing a URI file, or directory path.
+   * @param int $mode
+   *   Integer value for the permissions. Consult PHP chmod() documentation for
+   *   more information.
+   *
+   * @see drupal_chmod()
+   *
+   * @todo Remove when https://drupal.org/node/2050759 is in.
+   *
+   * @return bool
+   *   TRUE for success, FALSE in the event of an error.
+   */
+  protected function chmod($uri, $mode = NULL) {
+    return drupal_chmod($uri, $mode);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function crop($x, $y, $width, $height = NULL) {
+   return $this->apply('crop', array('x' => $x, 'y' => $y, 'width' => $width, 'height' => $height));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function desaturate() {
+    return $this->apply('desaturate', array());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function resize($width, $height) {
+    return $this->apply('resize', array('width' => $width, 'height' => $height));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function rotate($degrees, $background = NULL) {
+    return $this->apply('rotate', array('degrees' => $degrees, 'background' => $background));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function scaleAndCrop($width, $height) {
+    return $this->apply('scale_and_crop', array('width' => $width, 'height' => $height));
   }
 
   /**
    * {@inheritdoc}
    */
-  public function getImage() {
-    return $this->image;
+  public function scale($width, $height = NULL, $upscale = FALSE) {
+    return $this->apply('scale', array('width' => $width, 'height' => $height, 'upscale' => $upscale));
   }
 
   /**
diff --git a/core/lib/Drupal/Core/ImageToolkit/ImageToolkitInterface.php b/core/lib/Drupal/Core/ImageToolkit/ImageToolkitInterface.php
index b7c5348..62b23c5 100644
--- a/core/lib/Drupal/Core/ImageToolkit/ImageToolkitInterface.php
+++ b/core/lib/Drupal/Core/ImageToolkit/ImageToolkitInterface.php
@@ -66,82 +66,6 @@ public function settingsForm();
   public function settingsFormSubmit($form, FormStateInterface $form_state);
 
   /**
-   * Sets the image object that this toolkit instance is tied to.
-   *
-   * @param \Drupal\Core\Image\ImageInterface $image
-   *   The image that this toolkit instance will be tied to.
-   *
-   * @throws \BadMethodCallException
-   *   When called twice.
-   */
-  public function setImage(ImageInterface $image);
-
-  /**
-   * Gets the image object that this toolkit instance is tied to.
-   *
-   * @return \Drupal\Core\Image\ImageInterface
-   *   The image object that this toolkit instance is tied to.
-   */
-  public function getImage();
-
-  /**
-   * Checks if the image is valid.
-   *
-   * @return bool
-   *   TRUE if the image toolkit is currently handling a valid image, FALSE
-   *   otherwise.
-   */
-  public function isValid();
-
-  /**
-   * Writes an image resource to a destination file.
-   *
-   * @param string $destination
-   *   A string file URI or path where the image should be saved.
-   *
-   * @return bool
-   *   TRUE on success, FALSE on failure.
-   */
-  public function save($destination);
-
-  /**
-   * Determines if a file contains a valid image.
-   *
-   * Drupal supports GIF, JPG and PNG file formats when used with the GD
-   * toolkit, and may support others, depending on which toolkits are
-   * installed.
-   *
-   * @return bool
-   *   TRUE if the file could be found and is an image, FALSE otherwise.
-   */
-  public function parseFile();
-
-  /**
-   * Returns the height of the image.
-   *
-   * @return int|null
-   *   The height of the image, or NULL if the image is invalid.
-   */
-  public function getHeight();
-
-  /**
-   * Returns the width of the image.
-   *
-   * @return int|null
-   *   The width of the image, or NULL if the image is invalid.
-   */
-  public function getWidth();
-
-  /**
-   * Returns the MIME type of the image file.
-   *
-   * @return string
-   *   The MIME type of the image file, or an empty string if the image is
-   *   invalid.
-   */
-  public function getMimeType();
-
-  /**
    * Gets toolkit requirements in a format suitable for hook_requirements().
    *
    * @return array
@@ -171,19 +95,4 @@ public static function isAvailable();
    */
   public static function getSupportedExtensions();
 
-  /**
-   * Applies a toolkit operation to an image.
-   *
-   * @param string $operation
-   *   The toolkit operation to be processed.
-   * @param array $arguments
-   *   An associative array of arguments to be passed to the toolkit
-   *   operation, e.g. array('width' => 50, 'height' => 100,
-   *   'upscale' => TRUE).
-   *
-   * @return bool
-   *   TRUE if the operation was performed successfully, FALSE otherwise.
-   */
-  public function apply($operation, array $arguments = array());
-
 }
diff --git a/core/modules/system/src/Plugin/ImageToolkit/GDToolkit.php b/core/modules/system/src/Plugin/ImageToolkit/GDToolkit.php
index 3ccb44f..693211f 100644
--- a/core/modules/system/src/Plugin/ImageToolkit/GDToolkit.php
+++ b/core/modules/system/src/Plugin/ImageToolkit/GDToolkit.php
@@ -115,7 +115,7 @@ protected function load() {
     }
 
     $function = 'imagecreatefrom' . image_type_to_extension($this->getType(), FALSE);
-    if (function_exists($function) && $resource = $function($this->getImage()->getSource())) {
+    if (function_exists($function) && $resource = $function($this->getSource())) {
       $this->setResource($resource);
       if (imageistruecolor($resource)) {
         return TRUE;
@@ -145,7 +145,7 @@ public function isValid() {
   /**
    * {@inheritdoc}
    */
-  public function save($destination) {
+  protected function doSave($destination) {
     $scheme = file_uri_scheme($destination);
     // Work around lack of stream wrapper support in imagejpeg() and imagepng().
     if ($scheme && file_stream_wrapper_valid_scheme($scheme)) {
@@ -184,8 +184,8 @@ public function save($destination) {
   /**
    * {@inheritdoc}
    */
-  public function parseFile() {
-    $data = @getimagesize($this->getImage()->getSource());
+  protected function doParseFile() {
+    $data = @getimagesize($this->getSource());
     if ($data && in_array($data[2], static::supportedTypes())) {
       $this->setType($data[2]);
       $this->preLoadInfo = $data;
diff --git a/core/modules/system/src/Tests/Image/ToolkitGdTest.php b/core/modules/system/src/Tests/Image/ToolkitGdTest.php
index f3869be..2064e86 100644
--- a/core/modules/system/src/Tests/Image/ToolkitGdTest.php
+++ b/core/modules/system/src/Tests/Image/ToolkitGdTest.php
@@ -88,15 +88,14 @@ function colorsAreEqual($color_a, $color_b) {
    * Function for finding a pixel's RGBa values.
    */
   function getPixelColor(ImageInterface $image, $x, $y) {
-    $toolkit = $image->getToolkit();
-    $color_index = imagecolorat($toolkit->getResource(), $x, $y);
+    $color_index = imagecolorat($image->getResource(), $x, $y);
 
-    $transparent_index = imagecolortransparent($toolkit->getResource());
+    $transparent_index = imagecolortransparent($image->getResource());
     if ($color_index == $transparent_index) {
       return array(0, 0, 0, 127);
     }
 
-    return array_values(imagecolorsforindex($toolkit->getResource(), $color_index));
+    return array_values(imagecolorsforindex($image->getResource(), $color_index));
   }
 
   /**
@@ -232,17 +231,16 @@ function testManipulations() {
       foreach ($operations as $op => $values) {
         // Load up a fresh image.
         $image = $this->imageFactory->get(drupal_get_path('module', 'simpletest') . '/files/' . $file);
-        $toolkit = $image->getToolkit();
         if (!$image->isValid()) {
           $this->fail(String::format('Could not load image %file.', array('%file' => $file)));
           continue 2;
         }
 
         // All images should be converted to truecolor when loaded.
-        $image_truecolor = imageistruecolor($toolkit->getResource());
+        $image_truecolor = imageistruecolor($image->getResource());
         $this->assertTrue($image_truecolor, String::format('Image %file after load is a truecolor image.', array('%file' => $file)));
 
-        if ($image->getToolkit()->getType() == IMAGETYPE_GIF) {
+        if ($image->getType() == IMAGETYPE_GIF) {
           if ($op == 'desaturate') {
             // Transparent GIFs and the imagefilter function don't work together.
             $values['corners'][3][3] = 0;
@@ -258,7 +256,7 @@ function testManipulations() {
         $correct_dimensions_object = TRUE;
 
         // Check the real dimensions of the image first.
-        if (imagesy($toolkit->getResource()) != $values['height'] || imagesx($toolkit->getResource()) != $values['width']) {
+        if (imagesy($image->getResource()) != $values['height'] || imagesx($image->getResource()) != $values['width']) {
           $correct_dimensions_real = FALSE;
         }
 
@@ -269,14 +267,14 @@ function testManipulations() {
 
         $directory = $this->public_files_directory .'/imagetest';
         file_prepare_directory($directory, FILE_CREATE_DIRECTORY);
-        $file_path = $directory . '/' . $op . image_type_to_extension($image->getToolkit()->getType());
+        $file_path = $directory . '/' . $op . image_type_to_extension($image->getType());
         $image->save($file_path);
 
         $this->assertTrue($correct_dimensions_real, String::format('Image %file after %action action has proper dimensions.', array('%file' => $file, '%action' => $op)));
         $this->assertTrue($correct_dimensions_object, String::format('Image %file object after %action action is reporting the proper height and width values.', array('%file' => $file, '%action' => $op)));
 
         // JPEG colors will always be messed up due to compression.
-        if ($image->getToolkit()->getType() != IMAGETYPE_JPEG) {
+        if ($image->getType() != IMAGETYPE_JPEG) {
           // Now check each of the corners to ensure color correctness.
           foreach ($values['corners'] as $key => $corner) {
             // Get the location of the corner.
diff --git a/core/modules/system/src/Tests/Image/ToolkitTest.php b/core/modules/system/src/Tests/Image/ToolkitTest.php
index 35686bf..4d80025 100644
--- a/core/modules/system/src/Tests/Image/ToolkitTest.php
+++ b/core/modules/system/src/Tests/Image/ToolkitTest.php
@@ -31,7 +31,7 @@ function testGetAvailableToolkits() {
   function testLoad() {
     $image = $this->getImage();
     $this->assertTrue(is_object($image), 'Returned an object.');
-    $this->assertEqual($image->getToolkitId(), 'test', 'Image had toolkit set.');
+    $this->assertEqual($image->getPluginId(), 'test', 'Image had \'test\' toolkit set.');
     $this->assertToolkitOperationsCalled(array('parseFile'));
   }
 
diff --git a/core/modules/system/tests/modules/image_test/src/Plugin/ImageToolkit/TestToolkit.php b/core/modules/system/tests/modules/image_test/src/Plugin/ImageToolkit/TestToolkit.php
index 509ec9c..ec727b0 100644
--- a/core/modules/system/tests/modules/image_test/src/Plugin/ImageToolkit/TestToolkit.php
+++ b/core/modules/system/tests/modules/image_test/src/Plugin/ImageToolkit/TestToolkit.php
@@ -77,9 +77,9 @@ public function isValid() {
   /**
    * {@inheritdoc}
    */
-  public function parseFile() {
+  protected function doParseFile() {
     $this->logCall('parseFile', func_get_args());
-    $data = @getimagesize($this->getImage()->getSource());
+    $data = @getimagesize($this->getSource());
     if ($data && in_array($data[2], static::supportedTypes())) {
       $this->setType($data[2]);
       $this->width = $data[0];
@@ -92,7 +92,7 @@ public function parseFile() {
   /**
    * {@inheritdoc}
    */
-  public function save($destination) {
+  protected function doSave($destination) {
     $this->logCall('save', func_get_args());
     // Return false so that image_save() doesn't try to chmod the destination
     // file that we didn't bother to create.
@@ -204,7 +204,7 @@ protected static function supportedTypes() {
    * {@inheritdoc}
    */
   public function apply($operation, array $arguments = array()) {
-    $this->logCall('apply', func_get_args());
+    $this->logCall('apply', array($operation, $arguments));
     return TRUE;
   }
 
