         }
     }
 
-
 /// For requests that failed before they even made it to the network layer
-internal final class FailedRequest: Request
+internal final class FailedRequest: RequestHookProvider
     {
     private let error: Error
+
+    var isCompleted: Bool { return true }
+    var progress: Double { return 1 }
 
     init(_ error: Error)
         { self.error = error }
 
-    func completion(callback: Response -> Void) -> Self
-        {
-        dispatch_async(dispatch_get_main_queue(), { callback(.Failure(self.error)) })
-        return self
-        }
-
-    func failure(callback: Error -> Void) -> Self
-        {
-        dispatch_async(dispatch_get_main_queue(), { callback(self.error) })
-        return self
+    func addResponseCallback(callback: ResponseCallback)
+        {
+        dispatch_async(dispatch_get_main_queue())
+            { callback((.Failure(self.error), isNew: true)) }
         }
 
     func progress(callback: Double -> Void) -> Self
         {
-        dispatch_async(dispatch_get_main_queue(), { callback(1) })
-        return self
-        }
-
-    // Everything else is a noop
-
-    func success(callback: Entity -> Void) -> Self { return self }
-    func newData(callback: Entity -> Void) -> Self { return self }
-    func notModified(callback: Void -> Void) -> Self { return self }
+        dispatch_async(dispatch_get_main_queue())
+            { callback(1) }
+        return self
+        }
 
     func cancel() { }
-
-    var isCompleted: Bool { return true }
-    var progress: Double { return 1 }
-    }
+    }

        }
    }

private typealias ResponseInfo = (response: Response, isNew: Bool)
private typealias ResponseCallback = ResponseInfo -> Void

internal final class NetworkRequest: Request, CustomDebugStringConvertible
    {
    // Basic metadata
    private let resource: Resource


    // MARK: Callbacks

    internal func addResponseCallback(callback: ResponseCallback)
        {
        addCallback(callback, to: &responseCallbacks, ifAlreadyComplete: responseInfo)
        }
