     private var addButton: NSButton? = nil
     private var scrollLeftButton: NSButton? = nil
     private var scrollRightButton: NSButton? = nil
-    private weak var selectedButton: NSButton? = nil
+    private weak var selectedButton: TabButton? = nil
 
     private var hideScrollButtons: Bool = true
     private var isHighlighted: Bool = false
 
-    @IBOutlet public weak var dataSource: TabsControlDataSource? {
-        didSet { self.reloadTabs() }
-    }
+    // MARK: - Public Properties
+    
+    @IBOutlet public weak var dataSource: TabsControlDataSource?
     @IBOutlet public weak var delegate: TabsControlDelegate? {
         get { return self.delegateInterceptor.receiver as? TabsControlDelegate }
         set { self.delegateInterceptor.receiver = newValue as? NSObject }
     }
-    
-    public weak var selectedItem: AnyObject? = nil
-    
-    public var preferFullWidthTabs: Bool = false
-    
-    public var minTabWidth: CGFloat =  50.0
-    public var maxTabWidth: CGFloat = 150.0
-    
+
+    public var automaticSideBorderMasks: Bool = true {
+        didSet { self.propagateBorderMask() }
+    }
+    public var preferFullWidthTabs: Bool = false {
+        didSet {
+            self.layoutTabButtons(self.tabButtons(), animated: true)
+            self.updateAuxiliaryButtons()
+        }
+    }
+    
+    public var minTabWidth: CGFloat =  50.0 {
+        didSet {
+            self.layoutTabButtons(self.tabButtons(), animated: true)
+            self.updateAuxiliaryButtons()
+        }
+    }
+    public var maxTabWidth: CGFloat = 150.0 {
+        didSet {
+            self.layoutTabButtons(self.tabButtons(), animated: true)
+            self.updateAuxiliaryButtons()
+        }
+    }
+
 //    public override var highlighted: Bool {
 //        get { return true }
 //    }
     
-    public var tabsStyle: TabsControlTabsStyle = .NumbersApp
-    public var bordersMask: TabsControlBorderMask = .Top
-    public var automaticSideBorderMasks: Bool = true
-    
-    public var controlBorderColor: NSColor? = NSColor.KPC_defaultControlBorderColor()
-    public var controlBackgroundColor: NSColor? = NSColor.KPC_defaultControlBackgroundColor()
-    public var controlHighlightedBackgroundColor: NSColor? = NSColor.KPC_defaultControlHighlightedBackgroundColor()
-    
-    public var tabBorderColor: NSColor? = NSColor.KPC_defaultTabBorderColor() {
-        didSet {
-//            self.tabButtons.valueForKey("cell") setValue
-//            [[[self tabButtons] valueForKey:@"cell"] setValue:tabBorderColor forKey:@"tabBorderColor"];
-
-        }
-    }
-    public var tabTitleColor: NSColor? = NSColor.KPC_defaultTabBorderColor()
-    public var tabBackgroundColor: NSColor? = NSColor.KPC_defaultTabTitleColor()
-    public var tabHighlightedBackgroundColor: NSColor? = NSColor.KPC_defaultTabBackgroundColor()
-    public var tabSelectedBorderColor: NSColor? = NSColor.KPC_defaultTabHighlightedBackgroundColor()
-    public var tabSelectedTitleColor: NSColor? = NSColor.KPC_defaultTabSelectedTitleColor()
-    public var tabSelectedBackgroundColor: NSColor? = NSColor.KPC_defaultTabSelectedBackgroundColor()
+    // MARK: - Public Computed Properties
+    
+    var tabButtonCell: TabButtonCell {
+        get { return self.cell as! TabButtonCell }
+    }
+
+    public var tabsStyle: TabsControlTabsStyle {
+        get { return self.tabButtonCell.tabStyle }
+        set {
+            self.tabButtonCell.tabStyle = newValue
+            self.tabButtons().forEach { $0.tabButtonCell?.tabStyle = newValue }
+        }
+    }
+    public var bordersMask: TabsControlBorderMask {
+        get { return self.tabButtonCell.borderMask }
+        set {
+            self.tabButtonCell.borderMask = newValue
+            self.propagateBorderMask()
+        }
+    }
+    
+    // MARK: - Public TabControl Color Properties
+    
+    public var controlBorderColor: NSColor = NSColor.KPC_defaultControlBorderColor() {
+        didSet { self.needsDisplay = true }
+    }
+    public var controlBackgroundColor: NSColor = NSColor.KPC_defaultControlBackgroundColor() {
+        didSet { self.needsDisplay = true }
+    }
+    public var controlHighlightedBackgroundColor: NSColor = NSColor.KPC_defaultControlHighlightedBackgroundColor() {
+        didSet { self.needsDisplay = true }
+    }
+
+    // MARK: - Public Tabs Color Properties
+
+    public var tabBorderColor: NSColor = NSColor.KPC_defaultTabBorderColor() {
+        didSet { self.tabButtons().forEach{ $0.tabButtonCell?.tabBorderColor = self.tabBorderColor } }
+    }
+    public var tabTitleColor: NSColor = NSColor.KPC_defaultTabBorderColor() {
+        didSet { self.tabButtons().forEach{ $0.tabButtonCell?.tabTitleColor = self.tabTitleColor } }
+    }
+    public var tabBackgroundColor: NSColor = NSColor.KPC_defaultTabTitleColor() {
+        didSet { self.tabButtons().forEach{ $0.tabButtonCell?.tabBackgroundColor = self.tabBackgroundColor } }
+    }
+    public var tabHighlightedBackgroundColor: NSColor = NSColor.KPC_defaultTabBackgroundColor() {
+        didSet { self.tabButtons().forEach{ $0.tabButtonCell?.tabHighlightedBackgroundColor = self.tabHighlightedBackgroundColor } }
+    }
+    public var tabSelectedBorderColor: NSColor = NSColor.KPC_defaultTabHighlightedBackgroundColor() {
+        didSet { self.tabButtons().forEach{ $0.tabButtonCell?.tabSelectedBorderColor = self.tabSelectedBorderColor } }
+    }
+    public var tabSelectedTitleColor: NSColor = NSColor.KPC_defaultTabSelectedTitleColor() {
+        didSet { self.tabButtons().forEach{ $0.tabButtonCell?.tabSelectedTitleColor = self.tabSelectedTitleColor } }
+    }
+    public var tabSelectedBackgroundColor: NSColor = NSColor.KPC_defaultTabSelectedBackgroundColor() {
+        didSet { self.tabButtons().forEach{ $0.tabButtonCell?.tabSelectedBackgroundColor = self.tabSelectedBackgroundColor } }
+    }
+    
+    // MARK: - Initializers & Setup
     
     public required init?(coder: NSCoder) {
         super.init(coder: coder)

        
        self.cell = TabButtonCell(textCell: "")
        self.cell?.font = NSFont.systemFontOfSize(13)
        
        self.highlight(false)
        if self.scrollView == nil {

        return 0.0
    }
    
    // MARK: - State Restoration
    
    public override func encodeRestorableStateWithCoder(coder: NSCoder) {
        super.encodeRestorableStateWithCoder(coder)
        // TODO: complete!
    }

    public override func restoreStateWithCoder(coder: NSCoder) {
        super.restoreStateWithCoder(coder)
        // TODO: complete!
    }
    
    // MARK: Helpers
    
    private func propagateBorderMask() {
        let buttons = self.tabButtons()
        var borderMask = self.tabButtonCell.borderMask
        
        for (index, button) in buttons.enumerate() {
            if index == 0 && self.automaticSideBorderMasks == true {
                borderMask = borderMask.union(.Left)
            }
            if index == buttons.count-1 && self.automaticSideBorderMasks == true {
                borderMask = borderMask.union(.Right)
            }
            let buttonCell = button.cell as! TabButtonCell
            buttonCell.borderMask = borderMask
        }
    }
}