diff --git a/src/api/contactmodel.h b/src/api/contactmodel.h
index 0bacb15a45fc71ae13f2f33c4a4c636bd788545e..af6505e2d578f97cc3a20aa94edce91fcd0f0dee 100644
--- a/src/api/contactmodel.h
+++ b/src/api/contactmodel.h
@@ -117,7 +117,7 @@ Q_SIGNALS:
     /**
      * Connect this signal to know when this model was updated.
      */
-    void modelUpdated(const std::string& uri) const;
+    void modelUpdated(const std::string& uri, bool needsSorted=true) const;
     /**
      * Connect this signal to know when a contact was added.
      * @param contactUri
diff --git a/src/contactmodel.cpp b/src/contactmodel.cpp
index a6dd776cc60b4ebeed132b682fdd335685e00d14..3eed56d9723948b7d2584c5dd2625939c291aa7e 100644
--- a/src/contactmodel.cpp
+++ b/src/contactmodel.cpp
@@ -519,7 +519,7 @@ ContactModelPimpl::slotNewBuddySubscription(const std::string& contactUri, bool
         } else
             return;
     }
-    emit linked.modelUpdated(contactUri);
+    emit linked.modelUpdated(contactUri, false);
 }
 
 void
diff --git a/src/conversationmodel.cpp b/src/conversationmodel.cpp
index 805fd8a638d18448adf80b97204c2dc494adf716..850384b693160066d87202409bc6c024f92b1785 100644
--- a/src/conversationmodel.cpp
+++ b/src/conversationmodel.cpp
@@ -177,7 +177,7 @@ public Q_SLOTS:
     /**
      * Listen from contactModel when updated (like new alias, avatar, etc.)
      */
-    void slotContactModelUpdated(const std::string& uri);
+    void slotContactModelUpdated(const std::string& uri, bool needsSorted);
     /**
      * Listen from contactModel when a new contact is added
      * @param uri
@@ -1223,7 +1223,7 @@ ConversationModelPimpl::slotContactRemoved(const std::string& uri)
 }
 
 void
-ConversationModelPimpl::slotContactModelUpdated(const std::string& uri)
+ConversationModelPimpl::slotContactModelUpdated(const std::string& uri, bool needsSorted)
 {
     // We don't create newConversationItem if we already filter on pending
     conversation::Info newConversationItem;
@@ -1259,7 +1259,11 @@ ConversationModelPimpl::slotContactModelUpdated(const std::string& uri)
                 conversations.emplace_front(conversationInfo);
             }
             dirtyConversations = {true, true};
-            emit linked.modelSorted();
+            if (needsSorted) {
+                emit linked.modelSorted();
+            } else {
+                emit linked.conversationUpdated(conversations.front().uid);
+            }
             return;
         }
     } else {
@@ -1267,7 +1271,7 @@ ConversationModelPimpl::slotContactModelUpdated(const std::string& uri)
         if (!conversations.empty()) {
             auto firstContactUri = conversations.front().participants.front();
 
-            if (firstContactUri.empty()) {
+            if (firstContactUri.empty() && needsSorted) {
                 conversations.pop_front();
                 dirtyConversations = {true, true};
                 emit linked.modelSorted();
@@ -1280,7 +1284,8 @@ ConversationModelPimpl::slotContactModelUpdated(const std::string& uri)
     dirtyConversations = {true, true};
     int index = indexOfContact(uri);
     if (index != -1) {
-        if (!conversations.empty() && conversations.front().participants.front().empty()) {
+        if (!conversations.empty() && conversations.front().participants.front().empty() &&
+            needsSorted) {
             // In this case, contact is present in list, so temporary item does not longer exists
             emit linked.modelSorted();
         } else {
diff --git a/test/contactmodeltester.cpp b/test/contactmodeltester.cpp
index 958fc56284833f74c63010479cdfaab067b58f2b..75bb94a5ad4ec4a02fed210a0f40c0708ea7c461 100644
--- a/test/contactmodeltester.cpp
+++ b/test/contactmodeltester.cpp
@@ -29,7 +29,9 @@
 #include <api/newaccountmodel.h>
 #include <api/contact.h>
 #include <api/contactmodel.h>
+#include <api/conversationmodel.h>
 #include <dbus/configurationmanager.h>
+#include <dbus/presencemanager.h>
 
 namespace ring
 {
@@ -199,7 +201,32 @@ ContactModelTester::testAddAlreadyAddedContact()
     CPPUNIT_ASSERT_NO_THROW(accInfo_.contactModel->getContact("contact1"));
     auto nbContactsAtEnd = accInfo_.contactModel->getAllContacts().size();
     CPPUNIT_ASSERT_EQUAL(nbContactsAtBegin, nbContactsAtEnd);
+}
 
+void
+ContactModelTester::testReceivesContactPresenceUpdate()
+{
+    CPPUNIT_ASSERT_NO_THROW(accInfo_.contactModel->getContact("contact1"));
+    CPPUNIT_ASSERT_EQUAL(accInfo_.contactModel->getContact("contact1").isPresent, false);
+
+    PresenceManager::instance().emitNewBuddyNotification(QString::fromStdString(accInfo_.id), "contact1", true, QString());
+    auto contactModelUpdated = WaitForSignalHelper (*accInfo_.contactModel, SIGNAL(modelUpdated(const std::string&, bool))).wait(1000);
+    CPPUNIT_ASSERT(contactModelUpdated);
+
+    // TODO: CPPUNIT_ASSERT(!modelSorted)
+
+    auto conversations = accInfo_.conversationModel->allFilteredConversations();
+    auto contactInfo = accInfo_.contactModel->getContact("contact1");
+    auto conversation = std::find_if(conversations.begin(), conversations.end(),
+                                [&contactInfo](const lrc::api::conversation::Info& conversation) {
+                                    return std::find(conversation.participants.begin(),
+                                                     conversation.participants.end(),
+                                                     contactInfo.profileInfo.uri) != conversation.participants.end();
+                                });
+    auto contactConversationUpdated = WaitForSignalHelper(*accInfo_.conversationModel,
+        SIGNAL(conversationUpdated(conversation.uid))).wait(1000);
+    CPPUNIT_ASSERT(contactConversationUpdated);
+    CPPUNIT_ASSERT_EQUAL(accInfo_.contactModel->getContact("contact1").isPresent, true);
 }
 
 void
diff --git a/test/contactmodeltester.h b/test/contactmodeltester.h
index f4d6c1debb6acb944f6e5b298f4c2b169bc38763..a2201e988f9443e30040138d96cc143cb5ec0d88 100644
--- a/test/contactmodeltester.h
+++ b/test/contactmodeltester.h
@@ -47,6 +47,7 @@ class ContactModelTester :  public CppUnit::TestFixture {
     CPPUNIT_TEST(testAddRingURI);
     CPPUNIT_TEST(testAddNewSIPContact);
     CPPUNIT_TEST(testAddAlreadyAddedContact);
+    CPPUNIT_TEST(testReceivesContactPresenceUpdate);
     CPPUNIT_TEST(testRmRingContact);
     CPPUNIT_TEST(testRmPendingContact);
     CPPUNIT_TEST(testRmSIPContact);
@@ -90,6 +91,11 @@ public:
      * No new contact should appears.
      */
     void testAddAlreadyAddedContact();
+    /**
+     * receive a presence update.
+     * modelSorted should not be emitted, but conversationUpdated should.
+     */
+    void testReceivesContactPresenceUpdate();
     /**
      * Remove "dummy" from "ring1" contacts.
      * The contact should be removed.
diff --git a/test/mocks/presencemanager_mock.h b/test/mocks/presencemanager_mock.h
index 40d41924efc88ec83cb4922be875204938d7ced7..2ef9b44cf22f870fc9ffa292635b454e4d3f96dd 100644
--- a/test/mocks/presencemanager_mock.h
+++ b/test/mocks/presencemanager_mock.h
@@ -48,6 +48,11 @@ public:
 
     ~PresenceManagerInterface() {}
 
+    void emitNewBuddyNotification(const QString &accountID, const QString &buddyUri, bool status, const QString &lineStatus)
+    {
+        emit newBuddyNotification(accountID, buddyUri, status, lineStatus);
+    }
+
 public Q_SLOTS: // METHODS
     void answerServerRequest(const QString &uri, bool flag)
     {