      - warning: Not calling finish or perform on an animation will result in a memory leak!
      
      */
-    open func then(duration: TimeInterval, delay: TimeInterval = 0.0, options: UIViewAnimationOptions = [], _ callback: @escaping Animation) -> Animate {
-        animations.enqueue(data: .animation(duration,delay,options,callback))
+    open func then(duration: TimeInterval, delay: TimeInterval = 0.0, options: UIViewAnimationOptions = [], animations: @escaping Animation) -> Animate {
+        self.animations.enqueue(data: .animation(duration,delay,options,animations))
         return self
     }
     
+    /**
+     Perform linked spring animations here.
+     ```
+     //syntax:
+     
+     Animate(duration: time, springDamping: 0.8, initialVelocity: 0.0) {
+     // Initial animation
+     
+     }.then(duration: time) {
+     // Animation begining upon completion of the initial animation.
+     
+     }.then(duration: time, delay: 1.0, options: [.curveEaseInOut]) {
+     // Animation following the previous animation.
+     
+     }.perform()
+     ```
+     - parameter duration: The duration that the animation should take.
+     - parameter delay: Takes a time interval to delay the animation.
+     - parameter springDamping: Takes the spring damping for the animation. 1.0 gives a smooth animation with a number closer to 0.0 having higher oscillation.
+     - parameter initialVelocity: The initial velocity for the view as a ratio of it's distance to it's final position in points per second. If the distance is 200 points then an initial velocity of 0.5 would be 100 points per second.
+     - parameter options: Takes a set of UIViewAnimationOptions. Default is none.
+     - parameter callback: `Animation` callback to perform over the duration passed in.
+     
+     - returns: The current animation instance.
+     
+     - warning: Not calling finish or perform on an animation will result in a memory leak!
+     
+     */
+    open func then(duration: TimeInterval, delay: TimeInterval = 0.0, springDamping: CGFloat = 1.0, initialVelocity: CGFloat = 0.5, options: UIViewAnimationOptions = [], animations: @escaping Animation) -> Animate {
+        self.animations.enqueue(data: .spring(duration, delay, springDamping, initialVelocity, options, animations))
+        return self
+    }
     
     /**
      Block in which to perform things that you may want to pause an ongoing flow of animations for.

     - warning: Not calling finish or perform on an animation will result in a memory leak!
     
     */
    public init(duration: TimeInterval, delay: TimeInterval = 0.0, options: UIViewAnimationOptions = [], _ callback: @escaping Animation) {
        animations.enqueue(data: .animation(duration,delay,options,callback))
    }
    
    /**

     animation.perform()
     ```
     - parameter duration: The duration that the animation should take.
     - parameter delay: Takes a time interval to delay the animation.
     - parameter options: Takes a set of UIViewAnimationOptions. Default is none.
     - parameter callback: `Animation` callback to perform over the duration passed in.
     
     - returns: An animation instance.
