                         self.taskQueue.cancel(dataTask.URLSessionTask)
                         self.removeDataTask(dataTask) // No more ImageTasks can register
                     }
-                case .Decoding(let operation): operation.cancel()
+                case .Decoding: return
                 case .Processing(let operation): operation.cancel()
                 }
                 self.loadStates[task] = nil // No longer registered

        
        removeDataTask(dataTask) // No more ImageTasks can register

        if let data = data, response = response, cache = conf.cache where error == nil {
            conf.cachingQueue.addBlock {
                // FIXME: The fact that we use first image task is confusing, because there is no direct relation between DataTask reusing and on-disk caching (it's up to the user).
                if let task = dataTask.registeredTasks.first {
                    cache.setData(data, response: response, forTask: task)
                }
            }
        }

        dataTask.registeredTasks.forEach {
            if let data = data where error == nil {
                decodeData(data, response: response, task: $0)
            } else {
                complete($0, image: nil, error: error)
            }
        }
    }

    private func decodeData(data: NSData, response: NSURLResponse? = nil, task: ImageTask) {
        guard loadStates[task] != nil else { /* no longer registered */ return }
        loadStates[task] = .Decoding(conf.decodingQueue.addBlock { [weak self] in
            let image = self?.conf.decoder.decode(data, response: response)
            self?.queue.async {
                self?.didDecodeImage(image, error: (image == nil ? errorWithCode(.DecodingFailed) : nil), task: task)
            }
        })
    }
    
    private func didDecodeImage(image: Image?, error: ErrorType?, task: ImageTask) {

                    let data = cache.dataFor(task)
                    self?.queue.async {
                        if let data = data {
                            self?.decodeData(data, tasks: [task])
                        } else {
                            guard self?.loadStates[task] != nil else { /* no longer registered */ return }
                            self?.loadDataFor(task)
