    fileprivate var _layoutState = LayoutState()
    
    // MARK: - Public Properties
+   public var headerViewTopPadding: CGFloat = 0 {
+      didSet {
+         _headerViewTopSpaceConstraint.constant = headerViewTopPadding
+      }
+   }
+   
+   public var headerViewBottomPadding: CGFloat = 0 {
+      didSet {
+         _headerViewBottomSpaceConstraint.constant = -headerViewBottomPadding
+      }
+   }
+   
+   public var headerView: UIView? {
+      didSet {
+         switch headerView {
+         case .none: _update(containerView: _headerContainerView, with: _emptyHeaderView)
+         case .some(let view): _update(containerView: _headerContainerView, with: view)
+         }
+      }
+   }
+
    public var footerViewTopPadding: CGFloat = 0 {
       didSet {
          _footerViewTopSpaceConstraint.constant = footerViewTopPadding

      let cv = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())
      cv.translatesAutoresizingMaskIntoConstraints = false
      self.view.addSubview(cv)
      let footerContainerView = self._footerContainerView
      self.view.addSubview(footerContainerView)
      
      
      self._footerViewBottomSpaceConstraint = footerContainerView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor)
      self._footerViewTopSpaceConstraint = footerContainerView.topAnchor.constraint(equalTo: cv.bottomAnchor)
      self._cvLeadingSpaceConstraint = cv.leadingAnchor.constraint(equalTo: self.view.leadingAnchor)
      self._update(footerView: self._emptyFooterView)
      
      NSLayoutConstraint.activate([
         cv.topAnchor.constraint(equalTo: self.view.topAnchor),
         cv.widthAnchor.constraint(equalTo: self.view.widthAnchor),
         self._footerViewBottomSpaceConstraint,
         self._footerViewTopSpaceConstraint,
         self._cvLeadingSpaceConstraint,

      control.layer.zPosition = -1
      return control
   }()

   fileprivate var _headerViewTopSpaceConstraint: NSLayoutConstraint!
   fileprivate var _headerViewBottomSpaceConstraint: NSLayoutConstraint!
   
   fileprivate lazy var _headerContainerView: UIView = {
      let headerView = UIView(frame: .zero)
      headerView.translatesAutoresizingMaskIntoConstraints = false
      return headerView
   }()
   
   fileprivate lazy var _emptyHeaderView: UIView = {
      let view = UIView()
      view.translatesAutoresizingMaskIntoConstraints = false
      view.heightAnchor.constraint(equalToConstant: 0).isActive = true
      return view
   }()

   fileprivate var _footerViewTopSpaceConstraint: NSLayoutConstraint!
   fileprivate var _footerViewBottomSpaceConstraint: NSLayoutConstraint!
   
