 	private func swizzled_viewWillDisappear(animated: Bool) {
 		self.appearState = .WillDisappear
 
+		if isBeingDismissed() && parentViewController == nil, let presentingViewController = self.presentingViewController where presentingViewController === presentingViewControllerForCurrentCoverageCallbacks {
+			presentingViewController.traverseViewControllerSubtreeFromHereIncludingPresentedViewControllers(false) { viewController in
+				guard viewController.appearState == .DidAppear else {
+					return
+				}
+
+				viewController.viewWillBeUncoveredByViewController(self, animated: animated)
+			}
+		}
+
 		swizzled_viewWillDisappear(animated)
 	}
 

	@nonobjc
	private static func traverseAllViewControllers(closure: UIViewController -> Void) {
		for window in UIApplication.sharedApplication().windows {
			window.rootViewController?.traverseViewControllerSubtreeFromHere(closure)
		}
	}


	@nonobjc
	private func traverseViewControllerSubtreeFromHere(closure: UIViewController -> Void) {
		closure(self)

		for childViewController in childViewControllers {
			childViewController.traverseViewControllerSubtreeFromHere(closure)
		}

		presentedViewController?.traverseViewControllerSubtreeFromHere(closure)
	}



	@nonobjc
	public func presentViewController(viewControllerToPresent: UIViewController, completion: Closure? = nil) {
		presentViewController(viewControllerToPresent, animated: true, completion: completion)
	}


	@nonobjc
	private var presentingViewControllerForCurrentCoverageCallbacks: UIViewController? {
		get { return objc_getAssociatedObject(self, &AssociatedKeys.presentingViewControllerForCurrentCoverageCallbacks) as? UIViewController }
		set { objc_setAssociatedObject(self, &AssociatedKeys.presentingViewControllerForCurrentCoverageCallbacks, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) }
	}


