 		//
 		let animation = self.postTransitionState()
 		//
-		if context.isAnimated {
-			UIView.animate(withDuration: 0.5,
-			               delay: 0,
-			               options: .curveEaseInOut,
-			               animations: animation,
-			               completion: self.completeTransition)
+		if self.context.isAnimated {
+			self.propertyAnimator.addAnimations(animation)
+			self.propertyAnimator.addCompletion(self.completeTransition)
+			self.propertyAnimator.startAnimation()
+			//
+			if self.shouldPop && self.context.isInteractive {
+				self.propertyAnimator.pauseAnimation()
+				guard let gesture = self.fromViewGesture else {
+					return self.propertyAnimator.continueAnimation(withTimingParameters: nil, durationFactor: 0)
+				}
+				//
+				gesture.action = { [weak self] in
+					guard let animator = self else { return }
+					switch $0.state {
+					case .began:
+						animator.propertyAnimator.pauseAnimation()
+						animator.progressWhenInterrupted = animator.propertyAnimator.fractionComplete
+					case .changed:
+						let translation = $0.translation(in: animator.containerView)
+						let width = animator.containerView.frame.width
+						let progress = translation.x / width + animator.progressWhenInterrupted
+						animator.propertyAnimator.fractionComplete = progress
+					case .ended:
+						animator.propertyAnimator.continueAnimation(withTimingParameters: nil, durationFactor: 0)
+					default:
+						break
+					}
+				}
+			}
 		} else {
 			UIView.performWithoutAnimation(animation)
-			self.completeTransition(true)
+			self.completeTransition(at: .end)
 		}
 	}
 }
+
+
+final class PanGestureRecognizer : UIPanGestureRecognizer {
+
+	var action: ((UIPanGestureRecognizer) -> Void)?
+
+	init() {
+		super.init(target: nil, action: nil)
+		self.addTarget(self, action: #selector(self.handlePan(_:)))
+	}
+
+	@objc private func handlePan(_ gesture: UIPanGestureRecognizer) {
+		self.action?(gesture)
+	}
+}

	}

	///
	private func completeTransition(_ didComplete: Bool) {
		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)
		}
	}


	}

	///
	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
