     private init(queue: NSOperationQueue, callbackQueue: NSOperationQueue, task: Task<V>) {
         self.task = task
         
+        // prefer GCD over NSOperationQueue for main thread dispatching
+        let callbackQueueIsMainOperationQueue = callbackQueue === _mainOperationQueue
+        
+        func dispatchToCallbackQueue(closure: () -> Void) {
+            if callbackQueueIsMainOperationQueue {
+                dispatch_async(_dispatch_serial_queue) {
+                    dispatch_sync(_dispatch_main_queue, closure)
+                }
+            }
+            else {
+                callbackQueue.addOperationWithBlock(closure)
+            }
+        }
+        
+        //
         queue.addOperationWithBlock {
             defer {
                 if let didFinishClosure = self.didFinishClosure {
-                    callbackQueue.addOperationWithBlock {
+                    dispatchToCallbackQueue {
                         didFinishClosure(task)
                     }
                 }

                try await(task)
                
                if let didFinishWithValueClosure = self.didFinishWithValueClosure {
                    callbackQueue.addOperationWithBlock {
                        didFinishWithValueClosure(task.value)
                    }
                }

    
}

private let _mainOperationQueue = NSOperationQueue.mainQueue()
private let _dispatch_main_queue = dispatch_get_main_queue()
private let _dispatch_serial_queue = dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL)

public final class TaskAwaiter<V> {
    
    public let task: Task<V>
