       return responseIsValid
     }
     
-    private func dataReceived(data : NSData!, response : NSURLResponse!, error : NSError!, failure fail : ((NSError?) -> Void), success succeed : (NSData) -> Void) {
+    private func dataReceived(data : NSData!, response : NSURLResponse!, error : NSError!, failure fail : ((NSError?,Request) -> Void), success succeed : (NSData,Request) -> Void) {
       if let error = error {
         if error.domain != NSURLErrorDomain || error.code != NSURLErrorCancelled {
           dispatch_async(dispatch_get_main_queue(), {
-            fail(error)
+            fail(error,self)
           })
         }
       } else if let httpResponse = response as? NSHTTPURLResponse {

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

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