diff --git a/model/Conversation.js b/model/Conversation.js
index 956b1c9..174ba03 100644
--- a/model/Conversation.js
+++ b/model/Conversation.js
@@ -1,95 +1,104 @@
-import Contact from './Contact.js'
+import Contact from './Contact.js';
 
 class Conversation {
-    constructor(id, accountId, members) {
-        this.id = id
-        this.accountId = accountId
-        this.members = members || []
-        this.messages = []
-        this.infos = {}
-    }
+  constructor(id, accountId, members) {
+    this.id = id;
+    this.accountId = accountId;
+    this.members = members || [];
+    this.messages = [];
+    this.infos = {};
+  }
 
-    static from(accountId, object) {
-        const conversation = new Conversation(object.id, accountId, object.members.map(member => {
-            member.contact = Contact.from(member.contact)
-            return member
-        }))
-        conversation.messages = object.messages
-        return conversation
-    }
-    static fromSingleContact(accountId, contact) {
-        return new Conversation(undefined, accountId, [{contact}])
-    }
+  static from(accountId, object) {
+    const conversation = new Conversation(
+      object.id,
+      accountId,
+      object.members.map((member) => {
+        member.contact = Contact.from(member.contact);
+        return member;
+      })
+    );
+    conversation.messages = object.messages;
+    return conversation;
+  }
+  static fromSingleContact(accountId, contact) {
+    return new Conversation(undefined, accountId, [{ contact }]);
+  }
 
-    getId() { return this.id }
+  getId() {
+    return this.id;
+  }
 
-    getAccountId() { return this.accountId }
+  getAccountId() {
+    return this.accountId;
+  }
 
-    getDisplayName() {
-        if (this.members.length !== 0) {
-            return this.members[0].contact.getDisplayName()
-        }
-        return this.getDisplayUri()
+  getDisplayName() {
+    if (this.members.length !== 0) {
+      return this.members[0].contact.getDisplayName();
     }
+    return this.getDisplayUri();
+  }
 
-    getDisplayNameNoFallback() {
-        if (this.members.length !== 0) {
-            return this.members[0].contact.getDisplayNameNoFallback()
-        }
+  getDisplayNameNoFallback() {
+    if (this.members.length !== 0) {
+      return this.members[0].contact.getDisplayNameNoFallback();
     }
+  }
 
-    async getObject(params) {
-        const members = params.memberFilter ? this.members.filter(params.memberFilter) : this.members
-        return {
-            id: this.id,
-            messages: this.messages,
-            members: await Promise.all(members.map(async member => {
-                const copiedMember = { role: member.role }//Object.assign({}, member);
-                copiedMember.contact = await member.contact.getObject()
-                return copiedMember
-            }))
-        }
-    }
+  async getObject(params) {
+    const members = params.memberFilter ? this.members.filter(params.memberFilter) : this.members;
+    return {
+      id: this.id,
+      messages: this.messages,
+      members: await Promise.all(
+        members.map(async (member) => {
+          const copiedMember = { role: member.role }; //Object.assign({}, member);
+          copiedMember.contact = await member.contact.getObject();
+          return copiedMember;
+        })
+      ),
+    };
+  }
 
-    getSummary() {
-        return this.getObject()
-    }
+  getSummary() {
+    return this.getObject();
+  }
 
-    getDisplayUri() {
-        return this.getId() || this.getFirstMember().contact.getUri()
-    }
+  getDisplayUri() {
+    return this.getId() || this.getFirstMember().contact.getUri();
+  }
 
-    getFirstMember() {
-        return this.members[0]
-    }
+  getFirstMember() {
+    return this.members[0];
+  }
 
-    getMembers() {
-        return this.members
-    }
+  getMembers() {
+    return this.members;
+  }
 
-    addMessage(message) {
-        if (this.messages.length === 0)
-            this.messages.push(message)
-        else if (message.id === this.messages[this.messages.length - 1].linearizedParent) {
-            this.messages.push(message)
-        } else if (message.linearizedParent === this.messages[0].id) {
-            this.messages.unshift(message)
-        } else {
-            console.log("Can't insert message " + message.id)
-        }
+  addMessage(message) {
+    if (this.messages.length === 0) this.messages.push(message);
+    else if (message.id === this.messages[this.messages.length - 1].linearizedParent) {
+      this.messages.push(message);
+    } else if (message.linearizedParent === this.messages[0].id) {
+      this.messages.unshift(message);
+    } else {
+      console.log("Can't insert message " + message.id);
     }
+  }
 
-    addLoadedMessages(messages) {
-        messages.forEach(message => this.addMessage(message))
-    }
+  addLoadedMessages(messages) {
+    messages.forEach((message) => this.addMessage(message));
+  }
 
-    getMessages() {
-        return this.messages
-    }
+  getMessages() {
+    return this.messages;
+  }
 
-    setInfos(infos){
-        this.infos = infos
-    }
+  setInfos(infos) {
+    this.infos = infos;
+  }
 }
 
 export default Conversation;
