     }
 
     // MARK: Callbacks
-    public func onComplete(executionContext: ExecutionContext = QueueContext.futuresDefault, complete: Try<T> -> Void) {
+
+    public func onComplete(executionContext: ExecutionContext = QueueContext.futuresDefault, cancelToken: CancelToken = CancelToken(), complete: Try<T> -> Void) {
         let futureComplete : InFuture = { future in
             future.onComplete(executionContext, complete: complete)
         }
-        saveCompletes.append(futureComplete)
-        for future in futures {
-            futureComplete(future)
-        }
-    }
-
-    public func onSuccess(executionContext:ExecutionContext = QueueContext.futuresDefault, success: T -> Void) {
-        onComplete(executionContext) { result in
+        savedCompletions[cancelToken.completionId] = futureComplete
+        futures.forEach { futureComplete($0) }
+    }
+
+    public func onSuccess(executionContext:ExecutionContext = QueueContext.futuresDefault, cancelToken: CancelToken = CancelToken(), success: T -> Void) {
+        onComplete(executionContext, cancelToken: cancelToken) { result in
             switch result {
             case .Success(let value):
                 success(value)

        }
    }
    
    public func onFailure(executionContext: ExecutionContext = QueueContext.futuresDefault, failure: ErrorType -> Void) {
        onComplete(executionContext) { result in
            switch result {
            case .Failure(let error):
                failure(error)

}

// MARK: - Queue -

public struct Queue {
    public static let main = Queue(dispatch_get_main_queue());
    public static let global = Queue(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0))
