             self.updateProgressLayer()
         }
     }
+    /** **State changing**
+    Should be used to change progress indicator. Should have value from 0.0 to 1.0. `progressState` should be .Progressing to allow change progress(except nil value).
+    */
     var progress: CGFloat? {
         didSet {
-            assert(self.progressState == .Progressing, "Progress state should be .Progressing while changing progress value")
+            if progress != nil {
+                assert(self.progressState == .Progressing, "Progress state should be .Progressing while changing progress value")
+            }
             progress = progress == nil ? nil : min(progress!, CGFloat(1.0))
             self.updateProgressLayer()
         }
     }
-    
-    private let firstStepAnimationTime = 0.3
-    private let secondStepAnimationTime = 0.15
-    private let textAppearingAnimationTime = 0.2
-    private let progressUpdateAnimationTime = 0.1
-
-    private var shapeLayer = CAShapeLayer()
-    private lazy var crossLayer: CAShapeLayer = {
-        let crossLayer = CAShapeLayer()
-        crossLayer.path = self.crossPath().CGPath
-        crossLayer.strokeColor = self.circleBorderColor.CGColor
-        return crossLayer
-    }()
-    private lazy var progressLayer: CAShapeLayer = {
-        let progressLayer = CAShapeLayer()
-        progressLayer.strokeColor = self.circleBorderColor.CGColor
-        progressLayer.fillColor = UIColor.clearColor().CGColor
-        return progressLayer
-    }()
+
+// MARK : Initialization
+    
+    required init?(coder aDecoder: NSCoder) {
+        super.init(coder: aDecoder)
+    }
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+        self.privateInit()
+        self.registerForNotifications()
+    }
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        self.privateInit()
+        self.registerForNotifications()
+    }
+    override func prepareForInterfaceBuilder() {
+        self.privateInit()
+    }
+    deinit {
+        self.unregisterFromNotifications()
+    }
+
+    private func privateInit() {
+        if (self.useTintColorForText) { self.setTitleColor(self.tintColor, forState: UIControlState.Normal) }
+        if (self.invertColorsOnHighlight) { self.setTitleColor(self.shapeBackgroundColor, forState: UIControlState.Highlighted) }
+        
+        self.layer.insertSublayer(self.shapeLayer, atIndex: 0)
+        self.layer.insertSublayer(self.crossLayer, atIndex: 1)
+        self.layer.insertSublayer(self.progressLayer, atIndex: 2)
+        self.updateToDefaultStateAnimated(false)
+    }
+
+    override func layoutSubviews() {
+        super.layoutSubviews()
+        self.shapeLayer.frame = self.layer.bounds
+        self.crossLayer.frame = self.layer.bounds
+        self.progressLayer.frame = self.layer.bounds
+        self.bringSubviewToFront(self.imageView!)
+    }
     
     override var highlighted: Bool {
         didSet {
+            if (self.invertColorsOnHighlight) { self.imageView?.tintColor = highlighted ? self.shapeBackgroundColor : self.circleBorderColor }
             self.crossLayer.strokeColor = highlighted ? self.circleBackgroundColor.CGColor : self.circleBorderColor.CGColor
             self.progressLayer.strokeColor = highlighted ? self.circleBackgroundColor.CGColor : self.circleBorderColor.CGColor
             if (highlighted) {

        }
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.privateInit()
        self.registerForNotifications()
    }
    override func awakeFromNib() {
        super.awakeFromNib()
        self.privateInit()
        self.registerForNotifications()
    }
    override func prepareForInterfaceBuilder() {
        self.privateInit()
    }
    deinit {
        self.unregisterFromNotifications()
    }

    private func privateInit() {
        self.setTitleColor(self.tintColor, forState: UIControlState.Normal)
        self.setTitleColor(self.shapeBackgroundColor, forState: UIControlState.Highlighted)
        self.layer.insertSublayer(self.shapeLayer, atIndex: 0)
        self.layer.insertSublayer(self.crossLayer, atIndex: 1)
        self.layer.insertSublayer(self.progressLayer, atIndex: 2)
        self.updateToDefaultStateAnimated(false)
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        self.shapeLayer.frame = self.layer.bounds
        self.crossLayer.frame = self.layer.bounds
        self.progressLayer.frame = self.layer.bounds
    }
    
    private func updateToDefaultStateAnimated(animated:Bool) {
        self.shapeLayer.strokeColor = self.borderColor.CGColor;
        self.shapeLayer.fillColor = self.shapeBackgroundColor.CGColor

        layer.addAnimation(animation, forKey: "rotation animation")
        UIView.animateWithDuration(textAppearingAnimationTime, animations: { () -> Void in
            self.titleLabel?.alpha = 0.0
            self.hideContentImage()
        })
    }
    
// MARK : Pathes creation for different states
    
    private func defaultStatePath() ->  UIBezierPath {
        let bordersPath = UIBezierPath(roundedRect:self.bounds, cornerRadius:self.cornerRadius)
