             }
         #endif
     }
+    
+    /**
+     Processes the start transition delegation methods.
+     - Parameter fromViewController: An optional UIViewController.
+     - Parameter toViewController: An optional UIViewController.
+     */
+    func processStartTransitionDelegation(fromViewController: UIViewController?, toViewController: UIViewController?) {
+        guard let fvc = fromViewController else {
+            return
+        }
+        
+        guard let tvc = toViewController else {
+            return
+        }
+        
+        processForMotionDelegate(viewController: fvc) { [weak self] in
+            guard let s = self else {
+                return
+            }
+            
+            $0.motion?(motion: s, willStartTransitionTo: tvc)
+            $0.motionWillStartTransition?(motion: s)
+        }
+        
+        processForMotionDelegate(viewController: tvc) { [weak self] in
+            guard let s = self else {
+                return
+            }
+            
+            $0.motion?(motion: s, willStartTransitionFrom: fvc)
+            $0.motionWillStartTransition?(motion: s)
+        }
+    }
+    
+    /**
+     Processes the end transition delegation methods.
+     - Parameter transitionContext: An optional UIViewControllerContextTransitioning.
+     - Parameter fromViewController: An optional UIViewController.
+     - Parameter toViewController: An optional UIViewController.
+     */
+    func processEndTransitionDelegation(transitionContext: UIViewControllerContextTransitioning?, fromViewController: UIViewController?, toViewController: UIViewController?) {
+        guard let fvc = fromViewController else {
+            return
+        }
+        
+        guard let tvc = toViewController else {
+            return
+        }
+        
+        processForMotionDelegate(viewController: fvc) { [weak self] in
+            guard let s = self else {
+                return
+            }
+                
+            $0.motion?(motion: s, didEndTransitionTo: tvc)
+            $0.motionDidEndTransition?(motion: s)
+        }
+            
+        processForMotionDelegate(viewController: tvc) { [weak self] in
+            guard let s = self else {
+                return
+            }
+            
+            $0.motion?(motion: s, didEndTransitionFrom: fvc)
+            $0.motionDidEndTransition?(motion: s)
+        }
+        
+        transitionContext?.finishInteractiveTransition()
+    }
+    
+    /**
+     Processes the cancel transition delegation methods.
+     - Parameter transitionContext: An optional UIViewControllerContextTransitioning.
+     - Parameter fromViewController: An optional UIViewController.
+     - Parameter toViewController: An optional UIViewController.
+     */
+    func processCancelTransitionDelegation(transitionContext: UIViewControllerContextTransitioning?, fromViewController: UIViewController?, toViewController: UIViewController?) {
+        guard let fvc = fromViewController else {
+            return
+        }
+        
+        guard let tvc = toViewController else {
+            return
+        }
+        
+        processForMotionDelegate(viewController: fvc) { [weak self] in
+            guard let s = self else {
+                return
+            }
+            
+            $0.motion?(motion: s, didCancelTransitionTo: tvc)
+            $0.motionDidCancelTransition?(motion: s)
+        }
+        
+        processForMotionDelegate(viewController: tvc) { [weak self] in
+            guard let s = self else {
+                return
+            }
+            
+            $0.motion?(motion: s, didCancelTransitionFrom: fvc)
+            $0.motionDidCancelTransition?(motion: s)
+        }
+        
+        transitionContext?.finishInteractiveTransition()
+    }
 }
 
 fileprivate extension Motion {

        fullScreenSnapshot?.removeFromSuperview()
    }
    
    override func complete(isFinished finished: Bool) {
        guard isTransitioning else {
            return
        }
        
        context.clean()
        
        if finished && isPresenting && toOverFullScreen {
            // finished presenting a overFullScreen VC
            context.unhide(rootView: toView)
            context.removeSnapshots(rootView: toView)

        }
        
        // move fromView & toView back from our container back to the one supplied by UIKit
        if (toOverFullScreen && isFinished) || (fromOverFullScreen && !isFinished) {
            transitionContainer.addSubview(isFinished ? fromView : toView)
        }
        
