         return CAMediaTimingFunction(name: timingFunction)
     }
     
+    private func transactionDurationType(labelType: Type, interval: CGFloat, delay: CGFloat) -> NSTimeInterval {
+        switch (labelType) {
+        case .LeftRight, .RightLeft:
+            return NSTimeInterval(2.0 * (delay + interval))
+        default:
+            return NSTimeInterval(delay + interval)
+        }
+    }
+    
+    override public func animationDidStop(anim: CAAnimation!, finished flag: Bool) {
+        let completion = anim.valueForKey(MarqueeKeys.CompletionClosure.rawValue) as? CompletionBlock<(Bool) -> ()>
+        completion?.f(flag)
+    }
+    
     //
     // MARK: - Label Control
     //
+    
+    public func triggerScrollStart() {
+        if labelShouldScroll() && !awayFromHome() {
+            beginScroll()
+        }
+    }
     
     public func restartLabel() {
         applyGradientMask(fadeLength, animated: false)
         
-        if labelShouldScroll() && !tapToScroll {
+        if labelShouldScroll() && !tapToScroll && !holdScrolling {
             beginScroll()
         }
     }

        }
    }
    
    public var animationDelay: NSTimeInterval = 1.0
    
    //
    // MARK: - Private details
    //
    
    private var sublabel = UILabel()
    private var orientationWillChange = false
    private var orientationObserver: AnyObject?
    private var animationDuration: NSTimeInterval = 0.0

    private var homeLabelFrame: CGRect = CGRect.zeroRect
    private var awayLabelFrame: CGRect = CGRect.zeroRect

            sublabel.textAlignment = super.textAlignment
            sublabel.lineBreakMode = super.lineBreakMode
            
            var unusedFrame = CGRect.zeroRect
            var labelFrame = CGRect.zeroRect
            
            switch type {
            case .ContinuousReverse, .RightLeft:
                CGRectDivide(bounds, &unusedFrame, &labelFrame, leadingBuffer, CGRectEdge.MaxXEdge)
                labelFrame = CGRectIntegral(labelFrame)
            default:
                labelFrame = CGRectIntegral(CGRectMake(leadingBuffer, 0.0, bounds.size.width - leadingBuffer, bounds.size.height))
            }
            
            homeLabelFrame = labelFrame
            awayLabelFrame = labelFrame
