         animation.isRemovedOnCompletion = false
         animation.fillMode = kCAFillModeForwards
         shapeLayer.add(animation, forKey: "animateInnerRing")
+        
+        valueLabel.text = "\(self.oldValue)"
+        link = CADisplayLink(target: self, selector: #selector(self.animateLabel))
+        link.add(to: RunLoop.current, forMode: .commonModes)
+    }
+    
+    
+    @objc private func animateLabel() {
+        let dt = (link.timestamp - self.startTime) / animationDuration
+        
+        if (dt >= 1.0) {
+            valueLabel.update(withValue: value, valueIndicator: valueIndicator,
+                              showsDecimal: showFloatingPoint, decimalPlaces: decimalPlaces)
+            
+            link.remove(from: RunLoop.current, forMode: .commonModes)
+            return
+        }
+        
+        let current = (self.value - self.oldValue) * CGFloat(dt) + self.oldValue
+        
+        valueLabel.update(withValue: current, valueIndicator: valueIndicator,
+                          showsDecimal: showFloatingPoint, decimalPlaces: decimalPlaces)
+    }
+    
+    private func update(withValue: CGFloat) {
+        
     }
 }

        self.addSubview(valueLabel)
    }
    
    public func setValue(_ newVal: CGFloat, animated: Bool) {
        self.value = newVal
        if animated {
            animateInnerRing()
        }
        
    }
    
    func animateInnerRing() {
        let animation = CABasicAnimation(keyPath: "strokeEnd")

    var toRads: CGFloat { return self * CGFloat(M_PI) / 180 }
}

extension UILabel {
    func update(withValue value: CGFloat, valueIndicator: String, showsDecimal: Bool, decimalPlaces: Int) {
        if showsDecimal {
            self.text = String(format: "%.\(decimalPlaces)f", value) + "\(valueIndicator)"
        } else {
            self.text = "\(Int(value))\(valueIndicator)"
        }
        self.sizeToFit()
    }
}

@IBDesignable
public class UICircularProgressRingView: UIView, CAAnimationDelegate {
    
    // MARK: Value properties
    
    /// The value of the current progress. Range [0, maxValue]
    @IBInspectable public var value: CGFloat = 0 {
        willSet {
            print("========== OLD \(self.value)")
            self.oldValue = self.value
        }
        didSet {
            self.setNeedsDisplay()
        }
    }
    
    private var oldValue: CGFloat = 0.0
    
    /// The value of the maximum amount of progress. Range [0, ∞]
    @IBInspectable public var maxValue: CGFloat = 100 {
        didSet {
