 public var KeyboardButtonMenuViewTag: Int = 102
 
 public class KeyboardButton: UIView {
-  public var type: KeyboardButtonType = .Key("")
-  public var widthInRow: KeyboardButtonWidth = .Dynamic
-  public var style: KeyboardButtonStyle!
+  public var type: KeyboardButtonType = .Key("") { didSet { reload() } }
+  public var widthInRow: KeyboardButtonWidth = .Dynamic { didSet { reload() } }
+  public var style: KeyboardButtonStyle! { didSet { reload() } }
   public var keyMenu: KeyMenu?
 
   public var textLabel: UILabel?

    }
  }

  public required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
  }

  private func setupAppearance() {
    backgroundColor = style.backgroundColor
    layer.cornerRadius = style.cornerRadius
    // border
    layer.borderColor = style.borderColor.CGColor
    layer.borderWidth = style.borderWidth
    // shadow
    if style.shadowEnabled {
      layer.shadowColor = style.shadowColor.CGColor
      layer.shadowOpacity = style.shadowOpacity
      layer.shadowOffset = style.shadowOffset
      layer.shadowRadius = style.shadowRadius
      if let path = style.shadowPath {
        layer.shadowPath = path.CGPath
      }
    }
  }

  // MARK: Layout
  public override func layoutSubviews() {
    super.layoutSubviews()

    self.style = style
    self.widthInRow = width
    self.identifier = identifier
    reload()
  }

  public required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    reload()
  }

  private func reload() {
    userInteractionEnabled = true
    backgroundColor = style.backgroundColor
    layer.cornerRadius = style.cornerRadius

    // border
    layer.borderColor = style.borderColor.CGColor
    layer.borderWidth = style.borderWidth

    // shadow
    if style.shadowEnabled {
      layer.shadowColor = style.shadowColor.CGColor
      layer.shadowOpacity = style.shadowOpacity
      layer.shadowOffset = style.shadowOffset
      layer.shadowRadius = style.shadowRadius
      if let path = style.shadowPath {
        layer.shadowPath = path.CGPath
      }
    }

    // content
    textLabel?.removeFromSuperview()
    textLabel = nil
    imageView?.removeFromSuperview()
    imageView = nil

    switch type {
    case .Key(let text):
