diff --git wp-admin/includes/media.php wp-admin/includes/media.php
index 6cc1b63..4b921b1 100644
--- wp-admin/includes/media.php
+++ wp-admin/includes/media.php
@@ -1122,7 +1122,7 @@ function get_media_item( $attachment_id, $args = null ) {
 	$media_dims = apply_filters( 'media_meta', $media_dims, $post );
 
 	$image_edit_button = '';
-	if ( gd_edit_image_support( $post->post_mime_type ) ) {
+	if ( wp_image_editor_supports( array( 'mime_type' => $post->post_mime_type ) ) ) {
 		$nonce = wp_create_nonce( "image_editor-$post->ID" );
 		$image_edit_button = "<input type='button' id='imgedit-open-btn-$post->ID' onclick='imageEdit.open( $post->ID, \"$nonce\" )' class='button' value='" . esc_attr__( 'Edit Image' ) . "' /> <span class='spinner'></span>";
 	}
@@ -2254,7 +2254,7 @@ function edit_form_image_editor() {
 	$att_url = wp_get_attachment_url( $post->ID );
 
 	$image_edit_button = '';
-	if ( gd_edit_image_support( $post->post_mime_type ) ) {
+	if ( wp_image_editor_supports( array( 'mime_type' => $post->post_mime_type ) ) ) {
 		$nonce = wp_create_nonce( "image_editor-$post->ID" );
 		$image_edit_button = "<input type='button' id='imgedit-open-btn-$post->ID' onclick='imageEdit.open( $post->ID, \"$nonce\" )' class='button' value='" . esc_attr__( 'Edit Image' ) . "' /> <span class='spinner'></span>";
 	}
diff --git wp-includes/class-wp-image-editor-gd.php wp-includes/class-wp-image-editor-gd.php
index ca76006..78e186e 100644
--- wp-includes/class-wp-image-editor-gd.php
+++ wp-includes/class-wp-image-editor-gd.php
@@ -12,9 +12,9 @@
  * @since 3.5.0
  * @package WordPress
  * @subpackage Image_Editor
- * @uses WP_Image_Editor Extends class
  */
 class WP_Image_Editor_GD extends WP_Image_Editor {
+
 	protected $image = false; // GD Resource
 
 	function __destruct() {
@@ -32,14 +32,40 @@ class WP_Image_Editor_GD extends WP_Image_Editor {
 	 *
 	 * @return boolean
 	 */
-	public static function test( $args = null ) {
+	public static function test( $args = array() ) {
 		if ( ! extension_loaded('gd') || ! function_exists('gd_info') )
 			return false;
 
+		if ( isset( $args['mime_type'] ) && !self::supports_mime_type( $args['mime_type'] ) )
+			return false;
+
 		return true;
 	}
 
 	/**
+	 * Checks to see if editor supports the mime-type specified.
+	 *
+	 * @since 3.5.0
+	 * @access public
+	 *
+	 * @param string $mime_type
+	 * @return boolean
+	 */
+	protected static function supports_mime_type( $mime_type ) {
+		$image_types = imagetypes();
+		switch( $mime_type ) {
+			case 'image/jpeg':
+				return ($image_types & IMG_JPG) != 0;
+			case 'image/png':
+				return ($image_types & IMG_PNG) != 0;
+			case 'image/gif':
+				return ($image_types & IMG_GIF) != 0;
+		}
+
+		return false;
+	}
+
+	/**
 	 * Loads image from $this->file into new GD Resource.
 	 *
 	 * @since 3.5.0
@@ -47,7 +73,7 @@ class WP_Image_Editor_GD extends WP_Image_Editor {
 	 *
 	 * @return boolean|\WP_Error
 	 */
-	protected function load() {
+	public function load() {
 		if ( $this->image )
 			return true;
 
@@ -91,21 +117,6 @@ class WP_Image_Editor_GD extends WP_Image_Editor {
 	}
 
 	/**
-	 * Checks to see if editor supports the mime-type specified.
-	 *
-	 * @since 3.5.0
-	 * @access public
-	 *
-	 * @param string $mime_type
-	 * @return boolean
-	 */
-	public static function supports_mime_type( $mime_type ) {
-		$allowed_mime_types = array( 'image/gif', 'image/png', 'image/jpeg' );
-
-		return in_array( $mime_type, $allowed_mime_types );
-	}
-
-	/**
 	 * Resizes current image.
 	 * Wraps _resize, since _resize returns a GD Resource.
 	 *
@@ -261,7 +272,7 @@ class WP_Image_Editor_GD extends WP_Image_Editor {
 	 * @since 3.5.0
 	 * @access public
 	 *
-	 * @param boolean $horz Horizonal Flip
+	 * @param boolean $horz Horizontal Flip
 	 * @param boolean $vert Vertical Flip
 	 * @returns boolean|WP_Error
 	 */
@@ -369,4 +380,4 @@ class WP_Image_Editor_GD extends WP_Image_Editor {
 				return imagejpeg( $this->image, null, $this->quality );
 		}
 	}
-}
\ No newline at end of file
+}
diff --git wp-includes/class-wp-image-editor-imagick.php wp-includes/class-wp-image-editor-imagick.php
index 601b99b..8f6feef 100644
--- wp-includes/class-wp-image-editor-imagick.php
+++ wp-includes/class-wp-image-editor-imagick.php
@@ -12,9 +12,9 @@
  * @since 3.5.0
  * @package WordPress
  * @subpackage Image_Editor
- * @uses WP_Image_Editor Extends class
  */
 class WP_Image_Editor_Imagick extends WP_Image_Editor {
+
 	protected $image = null; // Imagick Object
 
 	function __destruct() {
@@ -36,14 +36,40 @@ class WP_Image_Editor_Imagick extends WP_Image_Editor {
 	 *
 	 * @return boolean
 	 */
-	public static function test( $args = null ) {
+	public static function test( $args = array() ) {
 		if ( ! extension_loaded( 'imagick' ) || ! is_callable( 'Imagick', 'queryFormats' ) )
 			return false;
 
+		if ( isset( $args['mime_type'] ) && !self::supports_mime_type( $args['mime_type'] ) )
+			return false;
+
 		return true;
 	}
 
 	/**
+	 * Checks to see if editor supports the mime-type specified.
+	 *
+	 * @since 3.5.0
+	 * @access public
+	 *
+	 * @param string $mime_type
+	 * @return boolean
+	 */
+	protected static function supports_mime_type( $mime_type ) {
+		$imagick_extension = strtoupper( self::get_extension( $mime_type ) );
+
+		if ( ! $imagick_extension )
+			return false;
+
+		try {
+			return ( (bool) Imagick::queryFormats( $imagick_extension ) );
+		}
+		catch ( Exception $e ) {
+			return false;
+		}
+	}
+
+	/**
 	 * Loads image from $this->file into new Imagick Object.
 	 *
 	 * @since 3.5.0
@@ -51,7 +77,7 @@ class WP_Image_Editor_Imagick extends WP_Image_Editor {
 	 *
 	 * @return boolean|WP_Error True if loaded; WP_Error on failure.
 	 */
-	protected function load() {
+	public function load() {
 		if ( $this->image )
 			return true;
 
@@ -138,29 +164,6 @@ class WP_Image_Editor_Imagick extends WP_Image_Editor {
 	}
 
 	/**
-	 * Checks to see if editor supports the mime-type specified.
-	 *
-	 * @since 3.5.0
-	 * @access public
-	 *
-	 * @param string $mime_type
-	 * @return boolean
-	 */
-	public static function supports_mime_type( $mime_type ) {
-		if ( ! $mime_type )
-			return false;
-
-		$imagick_extension = strtoupper( self::get_extension( $mime_type ) );
-
-		try {
-			return ( (bool) Imagick::queryFormats( $imagick_extension ) );
-		}
-		catch ( Exception $e ) {
-			return false;
-		}
-	}
-
-	/**
 	 * Resizes current image.
 	 *
 	 * @since 3.5.0
@@ -312,7 +315,7 @@ class WP_Image_Editor_Imagick extends WP_Image_Editor {
 	 * @since 3.5.0
 	 * @access public
 	 *
-	 * @param boolean $horz Horizonal Flip
+	 * @param boolean $horz Horizontal Flip
 	 * @param boolean $vert Vertical Flip
 	 * @returns boolean|WP_Error
 	 */
diff --git wp-includes/class-wp-image-editor.php wp-includes/class-wp-image-editor.php
index 920e4a4..695d02a 100644
--- wp-includes/class-wp-image-editor.php
+++ wp-includes/class-wp-image-editor.php
@@ -7,76 +7,38 @@
  */
 
 /**
- * Base WordPress Image Editor class for which Editor implementations extend
+ * Base image editor class from which implementations extend
  *
  * @since 3.5.0
  */
 abstract class WP_Image_Editor {
+
 	protected $file = null;
 	protected $size = null;
-	protected $mime_type  = null;
+	protected $mime_type = null;
 	protected $default_mime_type = 'image/jpeg';
 	protected $quality = 90;
 
-	protected function __construct( $filename ) {
-		$this->file = $filename;
-	}
-
 	/**
-	 * Returns a WP_Image_Editor instance and loads file into it.
+	 * Checks to see if current environment supports the editor chosen.
+	 * Must be overridden in a sub-class.
 	 *
 	 * @since 3.5.0
 	 * @access public
+	 * @abstract
 	 *
-	 * @param string $path Path to File to Load
-	 * @param array $required_methods Methods to require in implementation
-	 * @return WP_Image_Editor|WP_Error
+	 * @param array $args
+	 * @return boolean
 	 */
-	public final static function get_instance( $path = null, $required_methods = null ) {
-		$implementation = apply_filters( 'wp_image_editor_class', self::choose_implementation( $required_methods ), $path );
-
-		if ( $implementation ) {
-			$editor = new $implementation( $path );
-			$loaded = $editor->load();
-
-			if ( is_wp_error( $loaded ) )
-				return $loaded;
-
-			return $editor;
-		}
-
-		return new WP_Error( 'no_editor', __('No editor could be selected') );
+	public static function test( $args = array() ) {
+		return false;
 	}
 
 	/**
-	 * Tests which editors are capable of supporting the request.
-	 *
-	 * @since 3.5.0
-	 * @access private
-	 *
-	 * @param array $required_methods String array of all methods required for implementation returned.
-	 * @return string|bool Class name for the first editor that claims to support the request. False if no editor claims to support the request.
+	 * Each instance handles a single file.
 	 */
-	private final static function choose_implementation( $required_methods = null ) {
-		$request_order = apply_filters( 'wp_image_editors',
-			array( 'WP_Image_Editor_Imagick', 'WP_Image_Editor_GD' ) );
-
-		if ( ! $required_methods )
-			$required_methods = array();
-
-		// Loop over each editor on each request looking for one which will serve this request's needs
-		foreach ( $request_order as $editor ) {
-			// Check to see if this editor is a possibility, calls the editor statically
-			if ( ! call_user_func( array( $editor, 'test' ) ) )
-				continue;
-
-			// Make sure that all methods are supported by editor.
-			if ( array_diff( $required_methods, get_class_methods( $editor ) ) )
-				continue;
-
-			return $editor;
-		}
-		return false;
+	public function __construct( $file ) {
+		$this->file = $file;
 	}
 
 	/**
@@ -88,7 +50,7 @@ abstract class WP_Image_Editor {
 	 *
 	 * @return boolean|WP_Error True if loaded; WP_Error on failure.
 	 */
-	abstract protected function load();
+	abstract public function load();
 
 	/**
 	 * Saves current image to file.
@@ -168,7 +130,7 @@ abstract class WP_Image_Editor {
 	 * @access public
 	 * @abstract
 	 *
-	 * @param boolean $horz Horizonal Flip
+	 * @param boolean $horz Horizontal Flip
 	 * @param boolean $vert Vertical Flip
 	 * @return boolean|WP_Error
 	 */
@@ -187,36 +149,6 @@ abstract class WP_Image_Editor {
 	abstract public function stream( $mime_type = null );
 
 	/**
-	 * Checks to see if current environment supports the editor chosen.
-	 * Must be overridden in a sub-class.
-	 *
-	 * @since 3.5.0
-	 * @access public
-	 * @abstract
-	 *
-	 * @param array $args
-	 * @return boolean
-	 */
-	public static function test( $args = null ) {
-		return false;
-	}
-
-	/**
-	 * Checks to see if editor supports the mime-type specified.
-	 * Must be overridden in a sub-class.
-	 *
-	 * @since 3.5.0
-	 * @access public
-	 * @abstract
-	 *
-	 * @param string $mime_type
-	 * @return boolean
-	 */
-	public static function supports_mime_type( $mime_type ) {
-		return false;
-	}
-
-	/**
 	 * Gets dimensions of image.
 	 *
 	 * @since 3.5.0
@@ -451,3 +383,4 @@ abstract class WP_Image_Editor {
 		return $extensions[0];
 	}
 }
+
diff --git wp-includes/deprecated.php wp-includes/deprecated.php
index 9e99614..6751458 100644
--- wp-includes/deprecated.php
+++ wp-includes/deprecated.php
@@ -3210,13 +3210,13 @@ function _get_post_ancestors( &$post ) {
  *
  * @since 2.1.0
  * @deprecated 3.5.0
- * @see WP_Image_Editor
+ * see wp_get_image_editor()
  *
  * @param string $file Filename of the image to load.
  * @return resource The resulting image resource on success, Error string on failure.
  */
 function wp_load_image( $file ) {
-	_deprecated_function( __FUNCTION__, '3.5', 'WP_Image_Editor' );
+	_deprecated_function( __FUNCTION__, '3.5', 'wp_get_image_editor()' );
 
 	if ( is_numeric( $file ) )
 		$file = get_attached_file( $file );
@@ -3250,7 +3250,7 @@ function wp_load_image( $file ) {
  *
  * @since 2.5.0
  * @deprecated 3.5.0
- * @see WP_Image_Editor
+ * see wp_get_image_editor()
  *
  * @param string $file Image file path.
  * @param int $max_w Maximum width to resize to.
@@ -3262,9 +3262,9 @@ function wp_load_image( $file ) {
  * @return mixed WP_Error on failure. String with new destination path.
  */
 function image_resize( $file, $max_w, $max_h, $crop = false, $suffix = null, $dest_path = null, $jpeg_quality = 90 ) {
-	_deprecated_function( __FUNCTION__, '3.5', 'WP_Image_Editor' );
+	_deprecated_function( __FUNCTION__, '3.5', 'wp_get_image_editor()' );
 
-	$editor = WP_Image_Editor::get_instance( $file );
+	$editor = wp_get_image_editor( $file );
 	if ( is_wp_error( $editor ) )
 		return $editor;
 	$editor->set_quality( $jpeg_quality );
@@ -3328,4 +3328,39 @@ function user_pass_ok($user_login, $user_pass) {
  * @since 2.3.0
  * @deprecated 3.5.0
  */
-function _save_post_hook() {}
\ No newline at end of file
+function _save_post_hook() {}
+
+/**
+ * Check if the installed version of GD supports particular image type
+ *
+ * @since 2.9.0
+ * @deprecated 3.5.0
+ * see wp_image_editor_supports()
+ *
+ * @param string $mime_type
+ * @return bool
+ */
+function gd_edit_image_support($mime_type) {
+	_deprecated_function( __FUNCTION__, '3.5', 'wp_image_editor_supports()' );
+
+	if ( function_exists('imagetypes') ) {
+		switch( $mime_type ) {
+			case 'image/jpeg':
+				return (imagetypes() & IMG_JPG) != 0;
+			case 'image/png':
+				return (imagetypes() & IMG_PNG) != 0;
+			case 'image/gif':
+				return (imagetypes() & IMG_GIF) != 0;
+		}
+	} else {
+		switch( $mime_type ) {
+			case 'image/jpeg':
+				return function_exists('imagecreatefromjpeg');
+			case 'image/png':
+				return function_exists('imagecreatefrompng');
+			case 'image/gif':
+				return function_exists('imagecreatefromgif');
+		}
+	}
+	return false;
+}
diff --git wp-includes/media.php wp-includes/media.php
index d8475f1..3a1268f 100644
--- wp-includes/media.php
+++ wp-includes/media.php
@@ -383,7 +383,7 @@ function image_resize_dimensions($orig_w, $orig_h, $dest_w, $dest_h, $crop = fal
  */
 function image_make_intermediate_size( $file, $width, $height, $crop = false ) {
 	if ( $width || $height ) {
-		$editor = WP_Image_Editor::get_instance( $file );
+		$editor = wp_get_image_editor( $file );
 
 		if ( is_wp_error( $editor ) || is_wp_error( $editor->resize( $width, $height, $crop ) ) )
 			return false;
@@ -904,37 +904,6 @@ function get_taxonomies_for_attachments( $output = 'names' ) {
 }
 
 /**
- * Check if the installed version of GD supports particular image type
- *
- * @since 2.9.0
- *
- * @param string $mime_type
- * @return bool
- */
-function gd_edit_image_support($mime_type) {
-	if ( function_exists('imagetypes') ) {
-		switch( $mime_type ) {
-			case 'image/jpeg':
-				return (imagetypes() & IMG_JPG) != 0;
-			case 'image/png':
-				return (imagetypes() & IMG_PNG) != 0;
-			case 'image/gif':
-				return (imagetypes() & IMG_GIF) != 0;
-		}
-	} else {
-		switch( $mime_type ) {
-			case 'image/jpeg':
-				return function_exists('imagecreatefromjpeg');
-			case 'image/png':
-				return function_exists('imagecreatefrompng');
-			case 'image/gif':
-				return function_exists('imagecreatefromgif');
-		}
-	}
-	return false;
-}
-
-/**
  * Create new GD image resource with transparency support
  * @TODO: Deprecate if possible.
  *
@@ -1171,6 +1140,88 @@ function wp_max_upload_size() {
 }
 
 /**
+ * Returns a WP_Image_Editor instance and loads file into it.
+ *
+ * @since 3.5.0
+ * @access public
+ *
+ * @param string $path Path to file to load
+ * @param array $args Additional data. Accepts { 'mime_type'=>string, 'methods'=>{string, string, ...} }
+ * @return WP_Image_Editor|WP_Error
+ */
+function wp_get_image_editor( $path, $args = array() ) {
+	$args['path'] = $path;
+
+	$implementation = apply_filters( 'wp_image_editor_class', _wp_image_editor_choose( $args ) );
+
+	if ( $implementation ) {
+		$editor = new $implementation( $path );
+		$loaded = $editor->load();
+
+		if ( is_wp_error( $loaded ) )
+			return $loaded;
+
+		return $editor;
+	}
+
+	return new WP_Error( 'image_no_editor', __('No editor could be selected.') );
+}
+
+/**
+ * Tests whether there is an editor that supports a given mime type or methods.
+ *
+ * @since 3.5.0
+ * @access public
+ *
+ * @param string|array $args String path to image to check for support, or array of arguments.  Accepts { 'path'=>string, 'mime_type'=>string, 'methods'=>{string, string, ...} }
+ * @return boolean true if an eligible editor is found; false otherwise
+ */
+function wp_image_editor_supports( $args = array() ) {
+	return (bool) _wp_image_editor_choose( $args );
+}
+
+/**
+ * Tests which editors are capable of supporting the request.
+ *
+ * @since 3.5.0
+ * @access private
+ *
+ * @param array $args Additional data. Accepts { 'mime_type'=>string, 'methods'=>{string, string, ...} }
+ * @return string|bool Class name for the first editor that claims to support the request. False if no editor claims to support the request.
+ */
+function _wp_image_editor_choose( $args = array() ) {
+	require_once ABSPATH . WPINC . '/class-wp-image-editor.php';
+	require_once ABSPATH . WPINC . '/class-wp-image-editor-gd.php';
+	require_once ABSPATH . WPINC . '/class-wp-image-editor-imagick.php';
+
+	if ( !isset( $args['mime_type'] ) && isset( $args['path'] ) ) {
+		$file_info  = wp_check_filetype( $args['path'] );
+
+		// If $file_info['type'] is false, then we let the editor attempt to
+		// figure out the file type, rather than forcing a failure based on extension.
+		if ( isset( $file_info ) && $file_info['type'] )
+			$args['mime_type'] = $file_info['type'];
+	}
+
+	$implementations = apply_filters( 'wp_image_editors',
+		array( 'WP_Image_Editor_Imagick', 'WP_Image_Editor_GD' ) );
+
+	foreach ( $implementations as $implementation ) {
+		if ( ! call_user_func( array( $implementation, 'test' ), $args ) )
+			continue;
+
+		if ( isset( $args['methods'] ) &&
+			 array_diff( $args['methods'], get_class_methods( $implementation ) ) ) {
+			continue;
+		}
+
+		return $implementation;
+	}
+
+	return false;
+}
+
+/**
  * Prints default plupload arguments.
  *
  * @since 3.4.0
diff --git wp-settings.php wp-settings.php
index ac331c2..65485a8 100644
--- wp-settings.php
+++ wp-settings.php
@@ -143,10 +143,6 @@ require( ABSPATH . WPINC . '/nav-menu.php' );
 require( ABSPATH . WPINC . '/nav-menu-template.php' );
 require( ABSPATH . WPINC . '/admin-bar.php' );
 
-require( ABSPATH . WPINC . '/class-wp-image-editor.php' );
-require( ABSPATH . WPINC . '/class-wp-image-editor-gd.php' );
-require( ABSPATH . WPINC . '/class-wp-image-editor-imagick.php' );
-
 // Load multisite-specific files.
 if ( is_multisite() ) {
 	require( ABSPATH . WPINC . '/ms-functions.php' );
