             }
           })
         } else {
-          DDLogError("Failed to rasterize image")
+          DDLogError("Failed to create image")
           completion(nil)
         }
       }
     })
   }
-  
-  func queueImage(forURLString URLString: String, response: ImageRequestResponseType) {
+
+  /// Increase the priority of an image request
+  public func prioritizeImage(forURLString URLString: String) {
+
+    if let foundItem = queuedImageRequest(forURLString: URLString), let index = queuedRequests.index(of: foundItem) {
+      // move to end of list to bump priority, if not already downloading
+      queuedRequests.remove(at: index)
+      queuedRequests.append(foundItem)
+      DDLogVerbose("Increasing priority for download \(URLString)")
+    }
+  }
+  
+  /// Returns a sized and filtered image from the image cache, if available
+  public func cachedImage(forURLString URLString: String, size: CGSize? = nil, filters: [YapImageFilter]? = [AspectFillFilter()]) -> UIImage? {
+
+    let key = keyForImage(withURLString: URLString, size: size, filters: filters)
+    
+    if let cachedImage = imagesCache?.object(forKey: key as NSString) {
+      return cachedImage
+    }
+    return nil
+  }
+
+  /// Returns full sized, original image directly from the database if available, otherwise nil
+  /// This method is synchronous, so not recommened for use during scrolling
+  public func databaseImage(forURLString URLString: String) -> UIImage? {
+    if let imageData = databaseImageData(forURLString: URLString) {
+      return UIImage(data: imageData, scale: UIScreen.main.scale)
+    }
+    return nil
+  }
+  
+  /// Returns full sized, original image data directly from the database if available, otherwise nil
+  /// This method is synchronous, so not recommened for use during scrolling
+  public func databaseImageData(forURLString URLString: String) -> Data? {
+    // check the database
+    var imageData: Data? = nil
+    databaseConnection.read { transaction in
+      imageData = transaction.object(forKey: self.keyForImage(withURLString: URLString), inCollection: YapImageManagerImageCollection) as? Data
+    }
+    return imageData
+  }
+
+  /// Returns the Progress for an active download request, or nil if not available
+  /// Progress is available after YapImageManagerImageWillBeginDownloadingNotification
+  public func downloadProgress(forURLString URLString: String) -> Progress? {
+    if let imageRequest = self.activeImageRequest(forURLString: URLString) {
+      return imageRequest.progress
+    } else {
+      return nil
+    }
+  }
+  
+  // MARK: Image queue
+
+  func queueImage(forURLString URLString: String, response: ImageResponseHandler) {
+    
     if let foundItem = queuedImageRequest(forURLString: URLString), let index = queuedRequests.index(of: foundItem) {
       // move to end of list to bump priority, if not already downloading
 			foundItem.responses.append(response)

  }
  
  func isImageQueued(forURLString URLString: String) -> Bool {
    // NOTE: Active imageRequests remain on downloadQueue, so it's only necessary to check downloadQueue
    let foundItem: ImageRequest? = queuedImageRequest(forURLString: URLString)
    return (foundItem != nil)
  }
  
  /// Moves queued image download with URLString to the top of the list
  public func prioritizeImage(forURLString URLString: String) {
    if let foundItem = queuedImageRequest(forURLString: URLString), let index = queuedRequests.index(of: foundItem) {
      // move to end of list to bump priority, if not already downloading
      queuedRequests.remove(at: index)
      queuedRequests.append(foundItem)
      DDLogVerbose("Increasing priority for download \(URLString)")
    }
  }
  
  /// Returns full sized image
  /// This method is synchronous, so not recommened for use during scrolling
  public func cachedImage(forURLString URLString: String) -> UIImage? {
    if let imageData = cachedImageData(forURLString: URLString) {
      return UIImage(data: imageData, scale: UIScreen.main.scale)
    }
    return nil
  }
  
  /// Returns full size image, as Data?
  /// This method is synchronous, so not recommened for use during scrolling
  public func cachedImageData(forURLString URLString: String) -> Data? {
    // check the database
    var imageData: Data? = nil
    databaseConnection.read { transaction in
      imageData = transaction.object(forKey: self.keyForImage(withURLString: URLString), inCollection: YapImageManagerImageCollection) as? Data
    }
    return imageData
  }
  
  // image attributes
  func imageAttributes(forURLString URLString: String) -> NSDictionary? {
    // check the database
    var imageAttributes: NSDictionary?

            DispatchQueue.main.async(execute: {() -> Void in
              autoreleasepool {
                if let filteredImage = filteredImage {
									completion(ImageResponse(URLString: URLString, ticket: ticket, image: filteredImage))
                } else {
                  DDLogError("Failed to filter image with URL \(URLString)")
                }
