     private let presentersByCell = NSMapTable<UICollectionViewCell, AnyObject>(keyOptions: .weakMemory, valueOptions: .weakMemory)
 
     public private(set) var chatItemCompanionCollection = ChatItemCompanionCollection(items: [])
+
+    private let chattoUpdatesQueue: DispatchQueue = .init(
+        label: "chattoUpdatesQueue",
+        qos: .userInitiated
+    )
 
     public init(chatItemsDecorator: ChatItemsDecoratorProtocol,
                 chatItemPresenterFactory: ChatItemPresenterFactoryProtocol,

        }

        if usesBatchUpdates {
            UIView.animate(withDuration: self.configuration.updatesAnimationDuration, animations: { () -> Void in
                self.unfinishedBatchUpdatesCount += 1
                collectionView.performBatchUpdates({
                    updateModelClosure()
                    self.updateVisibleCells(changes) // For instance, to support removal of tails

                    collectionView.deleteItems(at: Array(changes.deletedIndexPaths))
                    collectionView.insertItems(at: Array(changes.insertedIndexPaths))
                    for move in changes.movedIndexPaths {
                        collectionView.moveItem(at: move.indexPathOld, to: move.indexPathNew)
                    }
                }, completion: { [weak self] _ in
                    defer { myCompletion() }
                    guard let sSelf = self else { return }
                    sSelf.unfinishedBatchUpdatesCount -= 1
                    if sSelf.unfinishedBatchUpdatesCount == 0, let onAllBatchUpdatesFinished = self?.onAllBatchUpdatesFinished {
                        DispatchQueue.main.async(execute: onAllBatchUpdatesFinished)
                    }

                    adjustScrollViewToBottom()
                })
            })
        } else {
            self.visibleCells = [:]
            updateModelClosure()

        }

        if itemsForMainThread.count > 0 {
            DispatchQueue.main.sync {
                for (index, itemCompanion) in itemsForMainThread {
                    let height = itemCompanion.presenter.heightForCell(
                        maximumWidth: collectionViewWidth,
                        decorationAttributes: itemCompanion.decorationAttributes
                    )
                    intermediateLayoutData[index].height = height
                }
            }
        }
        return createLayoutModel(intermediateLayoutData: intermediateLayoutData)
    }
