diff --git a/model/Account.js b/model/Account.js
index 0685411..e5d3ffe 100644
--- a/model/Account.js
+++ b/model/Account.js
@@ -1,150 +1,149 @@
 import Contact from './Contact.js'
 
 class Account {
-  constructor(id, details, volatileDetails) {
-    this.id = id;
-    this.details = details;
-    this.volatileDetails = volatileDetails;
-    this.contactCache = {};
-    this.contacts = {};
-    this.conversations = {};
-    this.lookups = [];
-    this.devices = {};
-  }
-
-  static from(object) {
-    const account = new Account(
-      object.id,
-      object.details,
-      object.volatileDetails
-    );
-    if (object.defaultModerators)
-      account.defaultModerators = object.defaultModerators.map((m) =>
-        Contact.from(m)
-      );
-    return account;
-  }
-
-  update(data) {
-    this.details = data.details;
-    this.volatileDetails = data.volatileDetails;
-  }
-
-  async getObject() {
-    const hasModerators =
-      this.defaultModerators && this.defaultModerators.length;
-    return {
-      id: this.id,
-      details: this.details,
-      defaultModerators: hasModerators
-        ? await Promise.all(
-            this.defaultModerators.map(async (c) => await c.getObject())
-          )
-        : undefined,
-      volatileDetails: this.volatileDetails,
-    };
-  }
-
-  getId() {
-    return this.id;
-  }
-
-  getType() {
-    return this.details["Account.type"];
-  }
-
-  getUri() {
-    return this.details["Account.username"];
-  }
-
-  getRegisteredName() {
-    return this.volatileDetails["Account.registeredName"];
-  }
-
-  isRendezVous() {
-    return this.details["Account.rendezVous"] === Account.BOOL_TRUE;
-  }
-
-  isPublicIn() {
-    return this.details["DHT.PublicInCalls"] === Account.BOOL_TRUE;
-  }
-
-  setDetail(detail, value) {
-    this.details[detail] = value;
-  }
-
-  updateDetails(details) {
-    return Object.assign(this.details, details);
-  }
-
-  getDetails() {
-    return this.details;
-  }
-
-  getSummary() {
-    return this.getObject();
-  }
-
-  getDisplayName() {
-    return this.details["Account.displayName"] || this.getDisplayUri();
-  }
-
-  getDisplayUri() {
-    return this.getRegisteredName() || this.getUri();
-  }
-
-  getDisplayNameNoFallback() {
-    return this.details["Account.displayName"] || this.getRegisteredName();
-  }
-
-  getConversationIds() {
-    return Object.keys(this.conversations);
-  }
-  getConversations() {
-    return this.conversations;
-  }
-
-  getConversation(conversationId) {
-    return this.conversations[conversationId];
-  }
-
-  addConversation(conversation) {
-    this.conversations[conversation.getId()] = conversation;
-  }
-
-  removeConversation(conversationId) {
-    delete this.conversations[conversationId];
-  }
-
-  getContactFromCache(uri) {
-    let contact = this.contactCache[uri];
-    if (!contact) {
-      contact = new Contact(uri);
-      this.contactCache[uri] = contact;
+    constructor(id, details, volatileDetails) {
+        this.id = id
+        this.details = details
+        this.volatileDetails = volatileDetails
+        this.contactCache = {}
+        this.contacts = {}
+        this.conversations = {}
+        this.lookups = []
+        this.devices = {}
     }
-    return contact;
-  }
 
-  getContacts() {
-    return this.contacts;
-  }
+    static from(object) {
+        const account = new Account(
+            object.id,
+            object.details,
+            object.volatileDetails
+        )
+        if (object.defaultModerators)
+            account.defaultModerators = object.defaultModerators.map((m) =>
+                Contact.from(m)
+            )
+        return account
+    }
 
-  getDefaultModerators() {
-    return this.defaultModerators;
-  }
+    update(data) {
+        this.details = data.details
+        this.volatileDetails = data.volatileDetails
+    }
 
-  setDevices(devices) {
-    this.devices = { ...devices };
-  }
-  getDevices() {
-    return this.devices;
-  }
+    async getObject() {
+        const hasModerators = this.defaultModerators && this.defaultModerators.length
+        return {
+            id: this.id,
+            details: this.details,
+            defaultModerators: hasModerators
+                ? await Promise.all(
+                    this.defaultModerators.map(async (c) => await c.getObject())
+                )
+                : undefined,
+            volatileDetails: this.volatileDetails,
+        }
+    }
+
+    getId() {
+        return this.id
+    }
+
+    getType() {
+        return this.details['Account.type']
+    }
+
+    getUri() {
+        return this.details['Account.username']
+    }
+
+    getRegisteredName() {
+        return this.volatileDetails['Account.registeredName']
+    }
+
+    isRendezVous() {
+        return this.details['Account.rendezVous'] === Account.BOOL_TRUE
+    }
+
+    isPublicIn() {
+        return this.details['DHT.PublicInCalls'] === Account.BOOL_TRUE
+    }
+
+    setDetail(detail, value) {
+        this.details[detail] = value
+    }
+
+    updateDetails(details) {
+        return Object.assign(this.details, details)
+    }
+
+    getDetails() {
+        return this.details
+    }
+
+    getSummary() {
+        return this.getObject()
+    }
+
+    getDisplayName() {
+        return this.details['Account.displayName'] || this.getDisplayUri()
+    }
+
+    getDisplayUri() {
+        return this.getRegisteredName() || this.getUri()
+    }
+
+    getDisplayNameNoFallback() {
+        return this.details['Account.displayName'] || this.getRegisteredName()
+    }
+
+    getConversationIds() {
+        return Object.keys(this.conversations)
+    }
+    getConversations() {
+        return this.conversations
+    }
+
+    getConversation(conversationId) {
+        return this.conversations[conversationId]
+    }
+
+    addConversation(conversation) {
+        this.conversations[conversation.getId()] = conversation
+    }
+
+    removeConversation(conversationId) {
+        delete this.conversations[conversationId]
+    }
+
+    getContactFromCache(uri) {
+        let contact = this.contactCache[uri]
+        if (!contact) {
+            contact = new Contact(uri)
+            this.contactCache[uri] = contact
+        }
+        return contact
+    }
+
+    getContacts() {
+        return this.contacts
+    }
+
+    getDefaultModerators() {
+        return this.defaultModerators
+    }
+
+    setDevices(devices) {
+        this.devices = { ...devices }
+    }
+    getDevices() {
+        return this.devices
+    }
 }
 
-Account.TYPE_JAMI = "RING"
-Account.TYPE_SIP = "SIP"
+Account.TYPE_JAMI = 'RING'
+Account.TYPE_SIP = 'SIP'
 
-Account.BOOL_TRUE = "true"
-Account.BOOL_FALSE = "false"
+Account.BOOL_TRUE = 'true'
+Account.BOOL_FALSE = 'false'
 
 export default Account
