   public func get(key: KeyType) -> CacheRequest<OutputType> {
     let result = CacheRequest<OutputType>()
     
-    let request = Request(URL: key, success: { data in
+    let request = Request(URL: key, success: { data,request in
       Logger.log("Fetched \(key) from the network fetcher")
       result.succeed(data)
-      self.pendingRequests[key.absoluteString!] = nil
-    }, failure: { error in
+      self.removePendingRequests(request)
+    }, failure: { error, request in
       Logger.log("Failed fetching \(key) from the network fetcher", .Error)
       result.fail(error)
-      self.pendingRequests[key.absoluteString!] = nil
+      self.removePendingRequests(request)
     })
-    
-    pendingRequests[key.absoluteString!] = request
+    self.addPendingRequest(request)
     return result
   }
   

    private let URL : NSURL
    private var task : NSURLSessionDataTask? = nil
    
    init(URL: NSURL, success succeed : (NSData) -> (), failure fail : ((NSError?) -> ())) {
      self.URL = URL
      self.task = NSURLSession.sharedSession().dataTaskWithURL(URL) {[weak self] (data, response, error) in
        if let strongSelf = self {

          failWithCode(.InvalidNetworkResponse, failure: fail)
        } else if let data = data {
          dispatch_async(dispatch_get_main_queue()) {
            succeed(data,self)
          }
        } else {
          failWithCode(.NoDataRetrieved, failure: fail)
