         }
 
         if performInBackground {
-            DispatchQueue.global(qos: .userInitiated).async {
+            self.chattoUpdatesQueue.async {
                 guard let modelUpdate = createModelUpdate() else { return }
 
                 DispatchQueue.main.async {

        }

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

    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,
