     /// Identifier of the room that the thread is in.
     public let roomId: String
     
-    private var _liveTimeline: MXEventTimeline?
+    private var liveTimeline: MXEventTimeline?
     private var eventsMap: [String: MXEvent] = [:]
     private var liveTimelineOperationQueue: OperationQueue = {
         let queue = OperationQueue()

    /// The live events timeline
    /// - Parameter completion: Completion block
    public func liveTimeline(_ completion: @escaping (MXEventTimeline) -> Void) {
        if let timeline = _liveTimeline {
            liveTimelineOperationQueue.addOperation {
                DispatchQueue.main.async {
                    completion(timeline)
                }
            }
        } else if let session = session {
            _liveTimeline = MXThreadEventTimeline(thread: self, andInitialEventId: nil)
            MXRoomState.load(from: session.store, withRoomId: self.roomId, matrixSession: session) { roomState in
                self._liveTimeline?.state = roomState
                self.liveTimelineOperationQueue.isSuspended = false
                if let timeline = self._liveTimeline {
                    completion(timeline)
                }
            }

    internal func addEvent(_ event: MXEvent) -> Bool {
        eventsMap[event.eventId] = event
        updateNotificationsCount()
        if let sender = event.sender,
           let session = session,
           sender == session.myUserId {
            //  the user sent a message to the thread, so mark the thread as read
            markAsRead()
        }
