 	}
 
 	///
-	private func completeTransition(_ didComplete: Bool) {
+	private func completeTransition(at position: UIViewAnimatingPosition) {
 		UIView.performWithoutAnimation {
 			self.constraintToDeactivate = nil
-			self.fromView.removeFromSuperview()
 			self.overlayView.removeFromSuperview()
 			self.containerView.removeLayoutGuide(self.layoutGuide)
-			self.optionalCompletion?(self.context)
-			self.transition.complete(at: .end)
+			switch position {
+			case .start:
+				self.toView.removeFromSuperview()
+				self.transition.complete(at: .start)
+			case .end:
+				if self.shouldPush {
+					let toViewController = self.context.viewController(forKey: .to)
+					let gesture = PanGestureRecognizer()
+					self.toView.addGestureRecognizer(gesture)
+					gesture.action = { [weak toViewController] in
+						if $0.state == .began {
+							(toViewController?.parent as? ContainerViewController)?.pop(option: .interactive)
+						}
+					}
+				} else if let gesture = self.fromViewGesture {
+					self.fromView.removeGestureRecognizer(gesture)
+				}
+				self.fromView.removeFromSuperview()
+				self.optionalCompletion?(self.context)
+				self.transition.complete(at: .end)
+			case .current:
+				fatalError("Transition should not stop somewhere in between")
+			}
 		}
 	}
 

	fileprivate private(set) lazy var shouldPush: Bool = self.context.kind == .push

	///
	fileprivate var views: [UIView] {
		// Return in correct order depending on the kind of the transition context
		if self.shouldPush {

	}

	///
	fileprivate var fromViewGesture: PanGestureRecognizer? {
		return self.fromView.gestureRecognizers.flatMap({ $0.flatMap({ $0 as? PanGestureRecognizer }).first })
	}

	///
	fileprivate let factor = CGFloat(0.3)

	///
	fileprivate var constraintToDeactivate: NSLayoutConstraint?

	///
	fileprivate let propertyAnimator = UIViewPropertyAnimator(duration: 0.5, curve: .easeInOut)

	///
	fileprivate var progressWhenInterrupted = CGFloat(0)
	
	//
	///
	public let transition: Transition
