 
 extension URLSession
 {
-  private func downloadCompletion(_ tbd: TBD<(URL, HTTPURLResponse)>) -> (URL?, URLResponse?, Error?) -> Void
+  private func downloadCompletion(_ tbd: Injector<(URL, HTTPURLResponse)>) -> (URL?, URLResponse?, Error?) -> Void
   {
     return {
-      [weak tbd] (location: URL?, response: URLResponse?, error: Error?) in
-      guard let tbd = tbd else { return }
+      (location: URL?, response: URLResponse?, error: Error?) in
 
       if let error = error
       {

  public func deferredUploadTask(qos: DispatchQoS = .current,
                                 with request: URLRequest, fromData bodyData: Data) -> DeferredURLSessionTask<(Data, HTTPURLResponse)>
  {
    let tbd = TBD<(Data, HTTPURLResponse)>(qos: qos)

    let scheme = request.url?.scheme
    if scheme != "http" && scheme != "https"
    {
      let message = "deferred does not support url scheme \"\(scheme ?? "unknown")\""
      tbd.determine(error: DeferredError.invalid(message))
    }

    let task = uploadTask(with: request, from: bodyData, completionHandler: dataCompletion(tbd))
    return DeferredURLSessionTask(source: tbd, task: task)
  }

  public func deferredUploadTask(qos: DispatchQoS = .current,
                                 with request: URLRequest, fromFile fileURL: URL) -> DeferredURLSessionTask<(Data, HTTPURLResponse)>
  {
    let tbd = TBD<(Data, HTTPURLResponse)>(qos: qos)

    let scheme = request.url?.scheme
    if scheme != "http" && scheme != "https"
    {
      let message = "deferred does not support url scheme \"\(scheme ?? "unknown")\""
      tbd.determine(error: DeferredError.invalid(message))
    }

    let task = uploadTask(with: request, fromFile: fileURL, completionHandler: dataCompletion(tbd))
    return DeferredURLSessionTask(source: tbd, task: task)
  }
}

private class DeferredDownloadTask<Value>: DeferredURLSessionTask<Value>
{
  init(source: TBD<Value>, task: URLSessionDownloadTask)
  {
    super.init(source: source, task: task)
  }

  @discardableResult
  override func cancel(_ reason: String = "") -> Bool
  {

  public func deferredDataTask(qos: DispatchQoS = .current,
                               with request: URLRequest) -> DeferredURLSessionTask<(Data, HTTPURLResponse)>
  {
    do { try validateURL(request) }
    catch {
      return DeferredURLSessionTask(qos: qos, error: error)
    }

    return DeferredURLSessionTask(qos: qos) {
      dataTask(with: request, completionHandler: dataCompletion($0))
    }
  }

  public func deferredDataTask(qos: DispatchQoS = .current,
