diff --git a/2.6-Displayed-status.md b/2.6-Displayed-status.md
new file mode 100644
index 0000000000000000000000000000000000000000..f30e3969a7b991a403ba1ddc88c50a8b362c2234
--- /dev/null
+++ b/2.6-Displayed-status.md
@@ -0,0 +1,73 @@
+Every client generally must be able to show what peer read what message and get how many unread messages there is.
+
+For this, the daemon provides some APIs:
+
+# Set a message displayed
+
+The Configuration manager provides:
+
+```
+<method name="setMessageDisplayed" tp:name-for-bindings="setMessageDisplayed">
+    <tp:added version="8.1.0"/>
+    <tp:docstring>
+        <p>Informs that a message have been read</p>
+    </tp:docstring>
+    <arg type="s" name="accountId" direction="in">
+        <tp:docstring>
+        The account ID
+        </tp:docstring>
+    </arg>
+    <arg type="s" name="conversationUri" direction="in">
+        <tp:docstring>
+        A conversation uri (swarm:xxxx or jami:xxxx)
+        </tp:docstring>
+    </arg>
+    <arg type="s" name="messageId" direction="in">
+        <tp:docstring>
+        The message ID
+        </tp:docstring>
+    </arg>
+    <arg type="i" name="status" direction="in">
+        <tp:docstring>
+        The message status, 3 for displayed
+        </tp:docstring>
+    </arg>
+    <arg type="b" name="success" direction="out">
+        <tp:docstring>
+        True if the message status was set, false if account, contact or message is unknown.
+        </tp:docstring>
+    </arg>
+</method>
+```
+
+to set a message as displayed. Should be done when the interaction is shown and the conversation selected.
+
+This sends a SIP messages to connected peers with the following format:
+
+```cpp
+std::string
+getDisplayed(const std::string& conversationId, const std::string& messageId)
+{
+    // implementing https://tools.ietf.org/rfc/rfc5438.txt
+    return fmt::format(
+        "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"
+        "<imdn><message-id>{}</message-id>\n"
+        "{}"
+        "<display-notification><status><displayed/></status></display-notification>\n"
+        "</imdn>",
+        messageId,
+        conversationId.empty() ? "" : "<conversation>" + conversationId + "</conversation>");
+}
+```
+
+Then the peer will know this via `onMessageDisplayed` and emit a signal to the client (`DRing::ConfigurationSignal::AccountMessageStatusChanged` with status 3 (`DRing::Account::MessageStates::DISPLAYED`))
+
+# Get unread messages
+
+By knowing the lastDisplayedMessage for our account, we can use this informations and `ConfigrationManager::countInteractionsSince` which count interaction since last message to a given message (typically last displayed interaction)
+
+To get last displayed message for a member, in `Configuration::getConversationMembers` each member will have the last displayed interaction available via `memberInfo["lastDisplayed"]`
+
+# How this information is stored
+
+In `src/jamidht/conversation.cpp` each conversation store the last displayed messages in a map<string, string> (uri, interactionId) and this structure is serialized in `fileutils::get_data_dir()/getAccountID()/conversation_data/repository_->id()/lastDisplayed`
\ No newline at end of file