     
 import PINRemoteImage
 
-class PINRemoteImageIntegration: NSObject, AXNetworkIntegrationProtocol {
+class PINRemoteImageIntegration: NSObject, AXNetworkIntegrationProtocol, PINRemoteImageManagerAlternateRepresentationProvider {
 
     weak var delegate: AXNetworkIntegrationDelegate?
     
     fileprivate var downloadUUIDs = NSMapTable<AXPhotoProtocol, NSUUID>(keyOptions: .strongMemory, valueOptions: .strongMemory)
+    fileprivate(set) var imageManager: PINRemoteImageManager!
+    
+    override init() {
+        super.init()
+        self.imageManager = PINRemoteImageManager(
+            sessionConfiguration: .default,
+            alternativeRepresentationProvider: self,
+            imageCache: PINRemoteImageManager.shared().cache // PINRemoteImageManager cache is thread safe, so we should be able to use the same cache instance as our shared counterpart
+        )
+    }
     
     func loadPhoto(_ photo: AXPhotoProtocol) {
         if photo.imageData != nil || photo.image != nil {

            
            self.downloadUUIDs.removeObject(forKey: photo)
            
            if let animatedImage = result.alternativeRepresentation as? FLAnimatedImage {
                // this is not great, as `PINRemoteImage` already creates the `FLAnimatedImage` that we need.
                // something to fix in the future.
                photo.imageData = animatedImage.data
                self.delegate?.networkIntegration(self, loadDidFinishWith: photo)
            } else if let image = result.image {
                photo.image = image

            }
        }
        
        guard let uuid = self.imageManager.downloadImage(with: url, options: [], progressDownload: progress, completion: completion) else {
            return
        }
        
