         
         // if routes are in process and a manual nav event was attempted, it's ignore it and continue on.
         if !fromRouter && Router.sharedInstance.processing {
-            if !isInUnitTest() {
-                exceptionFailure("Attempted to push a ViewController while routes were being processed!")
+            // if the navController has no view controllers, this is coming from the rootViewController initializer, so let it pass.
+            if navController.viewControllers.count > 0 {
+                if !isInUnitTest() {
+                    exceptionFailure("Attempted to push a ViewController while routes were being processed!")
+                }
+                return
             }
-            return
         }
         
         if animated {

        NavSync.sharedInstance.performSegueWithIdentifier(identifier, sender: sender, fromController: self, fromRouter: true)
    }
}

}

extension UINavigationController {
    internal func swizzled_pushViewController(viewController: UIViewController, animated: Bool) {
        NavSync.sharedInstance.push(viewController, animated: animated, navController: self, fromRouter: false)
    }
    
    internal func router_pushViewController(viewController: UIViewController, animated: Bool) {
        NavSync.sharedInstance.push(viewController, animated: animated, navController: self, fromRouter: true)
    }
}

extension UIViewController {
    internal func swizzled_viewDidAppear(animated: Bool) {
        // release whatever lock is present
        NavSync.sharedInstance.appeared(self, animated: animated)
