       let cv = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())
       cv.translatesAutoresizingMaskIntoConstraints = false
       self.view.addSubview(cv)
+      let headerContainerView = self._headerContainerView
       let footerContainerView = self._footerContainerView
+      self.view.addSubview(headerContainerView)
       self.view.addSubview(footerContainerView)
       
-      
+      self._headerViewBottomSpaceConstraint = headerContainerView.bottomAnchor.constraint(equalTo: cv.topAnchor)
+      self._headerViewTopSpaceConstraint = headerContainerView.topAnchor.constraint(equalTo: self.view.topAnchor)
       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)
+      self._update(containerView: self._headerContainerView, with: self._emptyHeaderView)
+      self._update(containerView: self._footerContainerView, with: self._emptyFooterView)
       
       NSLayoutConstraint.activate([
-         cv.topAnchor.constraint(equalTo: self.view.topAnchor),
          cv.widthAnchor.constraint(equalTo: self.view.widthAnchor),
+         self._headerViewBottomSpaceConstraint,
+         self._headerViewTopSpaceConstraint,
          self._footerViewBottomSpaceConstraint,
          self._footerViewTopSpaceConstraint,
          self._cvLeadingSpaceConstraint,

   @objc private func _refreshControlChanged(control: UIRefreshControl) {
      formDelegate?.elementsBeganRefreshing(in: self)
   }
   
   private func _removeFooterView() {
      _update(footerView: _emptyFooterView)
   }
   
   private func _update(footerView: UIView) {
      loadViewIfNeeded()
      _footerContainerView.subviews.forEach { $0.removeFromSuperview() }
      _footerContainerView.addSubview(footerView)
      
      if footerView.translatesAutoresizingMaskIntoConstraints {
         NSLayoutConstraint.activate([
            _footerContainerView.widthAnchor.constraint(equalTo: footerView.widthAnchor),
            _footerContainerView.heightAnchor.constraint(equalTo: footerView.heightAnchor),
            ])
      } else {
         NSLayoutConstraint.activate([
            footerView.centerYAnchor.constraint(equalTo: _footerContainerView.centerYAnchor),
            footerView.centerXAnchor.constraint(equalTo: _footerContainerView.centerXAnchor),
            _footerContainerView.widthAnchor.constraint(equalTo: footerView.widthAnchor),
            _footerContainerView.heightAnchor.constraint(equalTo: footerView.heightAnchor),
            ])
      }
   }

   public var footerView: UIView? {
      didSet {
         switch footerView {
         case .none: _update(containerView: _footerContainerView, with: _emptyFooterView)
         case .some(let view): _update(containerView: _footerContainerView, with: view)
         }
      }
   }
