         }
     }
 
+    public func cancel(cancelToken: CancelToken) -> Bool {
+        guard let _ = savedCompletions.removeValueForKey(cancelToken.completionId) else {
+            return false
+        }
+        return true
+    }
+
     // MARK: Future Combinators
-    public func map<M>(executionContext: ExecutionContext = QueueContext.futuresDefault, mapping: T -> Try<M>) -> Future<M> {
+
+    public func map<M>(executionContext: ExecutionContext = QueueContext.futuresDefault, cancelToken: CancelToken = CancelToken(), mapping: T -> Try<M>) -> Future<M> {
         let future = Future<M>()
-        onComplete(executionContext) { result in
+        onComplete(executionContext, cancelToken: cancelToken) { result in
             future.complete(result.flatMap(mapping))
         }
         return future
     }
     
-    public func flatMap<M>(executionContext: ExecutionContext = QueueContext.futuresDefault, mapping: T -> Future<M>) -> Future<M> {
+    public func flatMap<M>(executionContext: ExecutionContext = QueueContext.futuresDefault, cancelToken: CancelToken = CancelToken(), mapping: T -> Future<M>) -> Future<M> {
         let future = Future<M>()
-        onComplete(executionContext) { result in
+        onComplete(executionContext, cancelToken: cancelToken) { result in
             switch result {
             case .Success(let value):
                 future.completeWith(executionContext, future: mapping(value))

    }

    // MARK: Callbacks
    internal func complete(result: Try<T>) {
        let future = Future<T>()
        future.complete(result)
        addFuture(future)
        for complete in saveCompletes {
            complete(future)
        }
    }

        return future
    }
    
    public func andThen(executionContext: ExecutionContext = QueueContext.futuresDefault, cancelToken: CancelToken = CancelToken(), complete: Try<T> -> Void) -> FutureStream<T> {
        let future = FutureStream<T>(capacity: capacity)
        future.onComplete(executionContext, complete: complete)
        onComplete(executionContext, cancelToken: cancelToken) { result in
            future.complete(result)
        }
        return future
    }
    
    public func recover(executionContext: ExecutionContext = QueueContext.futuresDefault, cancelToken: CancelToken = CancelToken(), recovery: ErrorType -> Try<T>) -> FutureStream<T> {
        let future = FutureStream<T>(capacity: capacity)
        onComplete(executionContext, cancelToken: cancelToken) { result in
            future.complete(result.recoverWith(recovery))
        }
        return future
    }
    
    public func recoverWith(executionContext: ExecutionContext = QueueContext.futuresDefault, cancelToken: CancelToken = CancelToken(), recovery: ErrorType -> FutureStream<T>) -> FutureStream<T> {
        let future = FutureStream<T>(capacity: capacity)
        onComplete(executionContext, cancelToken: cancelToken) { result in
            switch result {
            case .Success(let value):
                future.success(value)
