 	/// - Parameter path: path relative to the user's instance URL
 	/// - Returns: Promise of an image
 	open func fetchImage(path: String) -> Promise<UIImage> {
-		return request(.custom(method: .get, baseURL: nil, path: path, parameters: nil, headers: ["Accept": "image/*"])) {
-			Alamofire.request($0).validateSalesforceResponse().responseData()
-		}.then(on: bgq) {
-			(data: Data) -> UIImage in
-			guard let image = UIImage(data: data) else {
-				throw SerializationError.invalid("Image Data", message: "Unable to create image")
-			}
-			return image
-		}
+		return requestor.request(resource: .custom(method: .get, baseURL: nil, path: path, parameters: nil, headers: ["Accept": "image/*"])).asImage(on: q)
 	}
 	
 	/// Asynchronously retrieves an image at the given path.

	/// - Parameter type: Object name
	/// - Returns: Promise<ObjectDescription>
	open func describe(type: String) -> Promise<ObjectDescription> {
		return request(.describe(type: type, version: version)) {
			Alamofire.request($0).validateSalesforceResponse().responseJSONDictionary()
		}.then(on: q) {
			(json: [String: Any]) -> ObjectDescription in
			return try ObjectDescription(json: json)
		}

	/// - Parameter fields: Optional array of field names to retrieve. If nil, all fields will be retrieved
	/// - Returns: Promise of a dictionary keyed by field names (aka "Record")
	open func retrieve(type: String, id: String, fields: [String]? = nil) -> Promise<Record> {
		return requestor.request(resource: .retrieve(type: type, id: id, fields: fields, version: version)).asJSON()
	}
	
	/// Asynchronously retrieves multiple records of the same type, by ID
