diff --git a/src/contentScripts/communityConsole/extraInfo/infoHandlers/basedOnResponseEvent.js b/src/contentScripts/communityConsole/extraInfo/infoHandlers/basedOnResponseEvent.js
index 881356c..30bb36d 100644
--- a/src/contentScripts/communityConsole/extraInfo/infoHandlers/basedOnResponseEvent.js
+++ b/src/contentScripts/communityConsole/extraInfo/infoHandlers/basedOnResponseEvent.js
@@ -53,14 +53,24 @@
     window.addEventListener(this.getEvent(), e => {
       if (e.detail.id < this.info.id) return;
 
-      this.info = {
-        body: e.detail.body,
-        id: e.detail.id,
-        timestamp: Date.now(),
-      };
+      this.updateInfoWithNewValue(e);
     });
   }
 
+  /**
+   * Updates the info value with the information obtained from an event.
+   * Can be overriden to implement more advanced logic.
+   *
+   * @param {Event} e
+   */
+  updateInfoWithNewValue(e) {
+    this.info = {
+      body: e.detail.body,
+      id: e.detail.id,
+      timestamp: Date.now(),
+    };
+  }
+
   async getCurrentInfo(injectionDetails) {
     const options = this.getWaitForCurrentInfoOptions();
     return waitFor(
diff --git a/src/contentScripts/communityConsole/extraInfo/infoHandlers/thread.js b/src/contentScripts/communityConsole/extraInfo/infoHandlers/thread.js
index ba7b906..c44d7f8 100644
--- a/src/contentScripts/communityConsole/extraInfo/infoHandlers/thread.js
+++ b/src/contentScripts/communityConsole/extraInfo/infoHandlers/thread.js
@@ -10,12 +10,6 @@
 const kCurrentInfoExpiresInMs = kTimeoutInMs * 1.5;
 
 export default class ThreadInfoHandler extends ResponseEventBasedInfoHandler {
-  constructor() {
-    super();
-
-    this.thread = undefined;
-  }
-
   getEvent() {
     return kViewThreadResponse;
   }
@@ -27,14 +21,44 @@
     };
   }
 
-  async isInfoCurrent(injectionDetails) {
-    this.thread = new ThreadModel(this.info.body?.[1]);
+  setUpDefaultInfoValue() {
+    this.info = {
+      thread: new ThreadModel(),
+      messages: [],
+      id: -1,
+      timestamp: 0,
+    };
+  }
 
+  updateInfoWithNewValue(e) {
+    const newThread = new ThreadModel(e.detail.body?.[1]);
+    if (newThread.getId() != this.info.thread.getId()) {
+      this.info.messages = [];
+    }
+
+    const newMessages = newThread.getAllMessagesList();
+    this.updateRecordedMessages(newMessages);
+
+    this.info.thread = newThread;
+    this.info.id = e.detail.id;
+    this.info.timestamp = Date.now();
+  }
+
+  updateRecordedMessages(newMessages) {
+    const nonUpdatedMessages = this.info.messages.filter(message => {
+      return !newMessages.some(newMessage => {
+        return message.getId() == newMessage.getId();
+      });
+    });
+    this.info.messages = nonUpdatedMessages.concat(newMessages);
+  }
+
+  async isInfoCurrent(injectionDetails) {
     const currentPage = this.parseThreadUrl();
     const isCurrentThread =
         Date.now() - this.info.timestamp < kCurrentInfoExpiresInMs &&
-        this.thread.getId() == currentPage.thread &&
-        this.thread.getForumId() == currentPage.forum;
+        this.info.thread.getId() == currentPage.thread &&
+        this.info.thread.getForumId() == currentPage.forum;
 
     const isMessageNode = injectionDetails.isMessageNode;
     const messageNode = injectionDetails.messageNode;
@@ -53,8 +77,8 @@
 
   currentThreadContainsMessage(messageNode) {
     const messageId = MessageExtraInfoService.getMessageIdFromNode(messageNode);
-    const message = MessageExtraInfoService.getMessageFromThreadModel(
-        messageId, this.thread);
+    const message = MessageExtraInfoService.getMessageFromList(
+        messageId, this.info.messages);
     return message !== undefined;
   }
 }
diff --git a/src/contentScripts/communityConsole/extraInfo/injections/baseThreadMessage.js b/src/contentScripts/communityConsole/extraInfo/injections/baseThreadMessage.js
index d086f9d..d0cd162 100644
--- a/src/contentScripts/communityConsole/extraInfo/injections/baseThreadMessage.js
+++ b/src/contentScripts/communityConsole/extraInfo/injections/baseThreadMessage.js
@@ -25,16 +25,15 @@
 
   inject(threadInfo, injectionDetails) {
     const messageNode = injectionDetails.messageNode;
-    const message = this.#getMessage(threadInfo, messageNode);
+    const message = this.#getMessage(threadInfo.messages, messageNode);
     const [chips, tooltips] = MessageExtraInfoService.getMessageChips(message);
     this.#injectChips(chips, messageNode);
     for (const tooltip of tooltips) new MDCTooltip(tooltip);
   }
 
-  #getMessage(threadInfo, messageNode) {
-    const thread = new ThreadModel(threadInfo.body?.[1]);
+  #getMessage(messagesList, messageNode) {
     const messageId = MessageExtraInfoService.getMessageIdFromNode(messageNode);
-    return MessageExtraInfoService.getMessageFromThreadModel(messageId, thread);
+    return MessageExtraInfoService.getMessageFromList(messageId, messagesList);
   }
 
   #injectChips(chips, messageNode) {
diff --git a/src/contentScripts/communityConsole/extraInfo/injections/threadQuestion.js b/src/contentScripts/communityConsole/extraInfo/injections/threadQuestion.js
index 1efe6db..d797ee1 100644
--- a/src/contentScripts/communityConsole/extraInfo/injections/threadQuestion.js
+++ b/src/contentScripts/communityConsole/extraInfo/injections/threadQuestion.js
@@ -9,7 +9,7 @@
     BaseExtraInfoInjection {
   inject(threadInfo, injectionDetails) {
     const [chips, tooltips] =
-        ThreadExtraInfoService.getThreadChips(threadInfo.body?.['1']);
+        ThreadExtraInfoService.getThreadChips(threadInfo.thread.data);
     this.#injectChips(chips, injectionDetails.stateChips);
     for (const tooltip of tooltips) new MDCTooltip(tooltip);
   }
diff --git a/src/contentScripts/communityConsole/extraInfo/services/message.js b/src/contentScripts/communityConsole/extraInfo/services/message.js
index 3ad9798..268fea5 100644
--- a/src/contentScripts/communityConsole/extraInfo/services/message.js
+++ b/src/contentScripts/communityConsole/extraInfo/services/message.js
@@ -1,5 +1,3 @@
-import MessageModel from '../../../../models/Message.js';
-
 import StatesExtraInfoService from './states.js';
 
 export default class MessageExtraInfoService {
@@ -16,22 +14,11 @@
     return id;
   }
 
-  static getMessageFromThreadModel(messageId, threadModel) {
-    for (const messageOrGap of threadModel.getMessageOrGapModels()) {
-      if (!(messageOrGap instanceof MessageModel)) continue;
-      if (messageOrGap.getId() == messageId) {
-        return messageOrGap;
-      } else {
-        for (const subMessageOrGap of messageOrGap.getCommentsAndGaps()) {
-          if (!(subMessageOrGap instanceof MessageModel)) continue;
-          if (subMessageOrGap.getId() == messageId) {
-            return subMessageOrGap;
-          }
-        }
-      }
+  static getMessageFromList(messageId, messagesList) {
+    for (const message of messagesList) {
+      if (message.getId() == messageId) return message;
     }
-
-    throw new Error(`Couldn't find message ${messageId} in thread.`);
+    throw new Error(`Couldn't find message ${messageId} in the message list.`);
   }
 
   static getMessageChips(messageModel) {
