                 self.executeClosureAsyncOnSessionQueueIfNecessary {
                     session.endClip(completionHandler: { (sessionClip: NextLevelClip?, error: Error?) in
                         if let clip = sessionClip {
-                            self.videoDelegate?.nextLevel(self, didCompleteClip: clip, inSession: session)
+                            self.executeClosureSyncOnMainQueue {
+                                self.videoDelegate?.nextLevel(self, didCompleteClip: clip, inSession: session)
+                            }
                         } else if let _ = error {
                             // TODO report error
                         }
-                        self.videoDelegate?.nextLevel(self, didCompleteSession: session)
+                        self.executeClosureSyncOnMainQueue {
+                            self.videoDelegate?.nextLevel(self, didCompleteSession: session)
+                        }
                     })
                 }
             }

                }
            }
            
            self.executeClosureAsyncOnMainQueueIfNecessary {
                self.videoDelegate?.nextLevel(self, didSetupVideoInSession: session)
            }
        }

// MARK: - queues

extension NextLevel {

    internal func executeClosureAsyncOnMainQueueIfNecessary(withClosure closure: @escaping () -> Void) {
        DispatchQueue.main.async(execute: closure)
    }

    internal func executeClosureSyncOnMainQueue(withClosure closure: @escaping () -> Void) {
        DispatchQueue.main.sync(execute: closure)
    }
    
    internal func executeClosureAsyncOnSessionQueueIfNecessary(withClosure closure: @escaping () -> Void) {
        self._sessionQueue.async(execute: closure)
    }
