             let totalDuration = 2.0 * (delay + interval)
             keyTimes =
             [
-                0.0,                                              // Initial gradient
-                delay/totalDuration,                              // Begin of fade in
-                (delay + 0.4)/totalDuration,                      // End of fade in, just as scroll away starts
-                0.95 * totalDuration/totalDuration,               // Begin of fade out, just before scroll home completes
-                1.0,                                              // End of fade out, as scroll home completes
-                1.0                                               // Buffer final value (used on continuous types)
+                0.0,                                                // 1) Initial gradient
+                delay/totalDuration,                                // 2) Begin of LE fade-in, just as scroll away starts
+                (delay + 0.4)/totalDuration,                        // 3) End of LE fade in [LE fully faded]
+                (delay + interval - 0.4)/totalDuration,             // 4) Begin of TE fade out, just before scroll away finishes
+                (delay + interval)/totalDuration,                   // 5) End of TE fade out [TE fade removed]
+                (delay + interval + delay)/totalDuration,           // 6) Begin of TE fade back in, just as scroll home starts
+                (delay + interval + delay + 0.4)/totalDuration,     // 7) End of TE fade back in [TE fully faded]
+                (totalDuration - 0.4)/totalDuration,                // 8) Begin of LE fade out, just before scroll home finishes
+                1.0                                                 // 9) End of LE fade out, just as scroll home finishes
             ]
             
         // .MLContinuous, .MLContinuousReverse

        
        // Define values
        switch (type) {
        case .ContinuousReverse, .RightLeft:
            values = [
                [0.0, fadeFraction, 1.0, 1.0],                   // Initial gradient
                [0.0, fadeFraction, 1.0, 1.0],                   // Begin of fade in
                [0.0, fadeFraction, 1.0 - fadeFraction, 1.0],    // End of fade in, just as scroll away starts
                [0.0, fadeFraction, 1.0 - fadeFraction, 1.0],    // Begin of fade out, just before scroll home completes
                [0.0, fadeFraction, 1.0, 1.0],                   // End of fade out, as scroll home completes
                [0.0, fadeFraction, 1.0, 1.0]                    // Final "home" value
            ]
            break
        
        // .MLContinuous, .MLLeftRight
        default:
            values = [
            [0.0, 0.0, 1.0 - fadeFraction, 1.0],            // Initial gradient
            [0.0, 0.0, 1.0 - fadeFraction, 1.0],            // Begin of fade in
            [0.0, fadeFraction, 1.0 - fadeFraction, 1.0],   // End of fade in, just as scroll away starts
            [0.0, fadeFraction, 1.0 - fadeFraction, 1.0],   // Begin of fade out, just before scroll home completes
            [0.0, 0.0, 1.0 - fadeFraction, 1.0],            // End of fade out, as scroll home completes
            [0.0, 0.0, 1.0 - fadeFraction, 1.0]             // Final "home" value
            ]
            break
        }

    
    private func keyFrameAnimationForGradient(fadeLength: CGFloat, interval: CGFloat, delay: CGFloat) -> CAKeyframeAnimation {
        // Setup
        var values: [[CGColorRef]]
        var keyTimes: [CGFloat]
        let transp = UIColor.clearColor().CGColor
        let opaque = UIColor.blackColor().CGColor
        
        // Create new animation
        let animation = CAKeyframeAnimation(keyPath: "colors")
        
        // Get timing function
        let timingFunction = timingFunctionForAnimationCurve(animationCurve)
