     }
     
     func up() {
-        Drop.up(self)
+        restartUpTimer(0.0)
+    }
+    
+    func upFromTimer(timer: NSTimer) {
+        if let interval = timer.userInfo as? Double {
+            Drop.up(self, interval: interval)
+        }
     }
     
     private func restartUpTimer(after: Double) {
+        restartUpTimer(after, interval: 0.25)
+    }
+    
+    private func restartUpTimer(after: Double, interval: Double) {
         upTimer?.invalidate()
         upTimer = nil
-        upTimer = NSTimer.scheduledTimerWithTimeInterval(after, target: self, selector: "up", userInfo: nil, repeats: false)
+        upTimer = NSTimer.scheduledTimerWithTimeInterval(after, target: self, selector: "upFromTimer:", userInfo: interval, repeats: false)
     }
     
     private func updateHeight() {

        }
    }
    
    private class func up(drop: Drop) {
        self .up(drop, after: 0.0)
    }
    
    private class func up(drop: Drop, after: Double) {
        self .up(drop, after: after, interval: 0.25)
    }
    
    private class func up(drop: Drop, after: Double, interval: NSTimeInterval) {
        drop.topConstraint.constant = drop.heightConstraint.constant
        let options: UIViewAnimationOptions = .AllowUserInteraction | .CurveEaseIn
        UIView.animateWithDuration(
            interval,
            delay: after,
            options: options,
            animations: { [weak drop] () -> Void in
                if let drop = drop {

            }
        case .Ended:
            if topConstraint.constant > 0.0 {
                restartUpTimer(0.0, interval: 0.1)
            } else {
                restartUpTimer(2.0)
                topConstraint.constant = 0.0
