 	let ch: C
 	let received: (V) -> ()
 
-	private let receivedValue = dispatch_group_create()
-	private var v: V?
+	private let needResult = dispatch_group_create()
+	private var result: HandoffReceiveResult<V> = .Canceled
 
 	public init(channel: C, onSelected: (V) -> ()) {
 		ch = channel

	}

	public func start(onReady: CommReadyCallback) -> Comm {
		dispatch_group_enter(receivedValue)
		v = nil

		func haveValue(v: V?) {
			self.v = v
			dispatch_group_leave(self.receivedValue)
			onReady()
		}

		switch ch.recv(onReady) {
		case let .Block(thread):
			go {
				let (v, _) = thread.waitForSender()
				haveValue(v)
			}

			return thread.comm

		case let .FromSender(thread):
			go {
				let (v, _) = thread.recv()
				haveValue(v)
			}

			return thread.comm
		}
	}

	public func wasSelected() {
		dispatch_group_wait(receivedValue, DISPATCH_TIME_FOREVER)

		// Calls into the block that is associated with the Select Case
		received(v!)
	}
}



		switch action {
		case let .Block(thread):
			if case let .Completed(v) = thread.waitForSender() {
				return v
			}

		case let .FromSender(thread):
			if case let .Completed(v) = thread.recv() {
				return v
			}
		}
