         case .Ended:
             let velocity = recognizer.velocityInView(self)
             
-            // TODO: move constant here and clean up
             // If the user swipes up with a great enough velocity or
             // if the panned view has been moved up enough, then remove it
-            if velocity.y < -100 || pannedView.frame.maxY < center.y {
+            if velocity.y < itemViewRemovalEscapeVelocity || pannedView.frame.maxY < center.y {
                 animateRemoval(ofItemView: pannedView)
             }
             // Otherwise animate a snapping back of the view into its position
             else {
-                // TODO: add constant for this duration
-                UIView.animateWithDuration(0.25, animations: {
+                UIView.animateWithDuration(itemViewRemovalFailureAnimationDuration, animations: {
                     var newPosition = viewPosition
                     // TODO: make the resting location common code
                     newPosition.y = self.bounds.height / 2.0 - pannedView.bounds.height / 2.0

    public var itemViewPanDownResistance = CGFloat(1.8)
    public var itemViewPanDownResistanceMax = CGFloat(0.9)
    public var itemViewPanDownResistanceMin = CGFloat(0.0)
    
    private var itemViews: [UIView] = []
    private var absoluteOffset = CGFloat(0)

        var position = viewPositions[itemView]!
        position.y = -itemView.frame.height
        
        UIView.animateWithDuration(itemViewRemovalAnimationDuration, delay: 0, options: [.CurveLinear], animations: {
            self.updateItemView(itemView, withPosition: position)
            
            }, completion: { (finished) in
