diff --git a/model/Account.js b/model/Account.js
index e40be7c..0685411 100644
--- a/model/Account.js
+++ b/model/Account.js
@@ -1,113 +1,144 @@
 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 = []
+  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;
     }
+    return contact;
+  }
 
-    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
-    }
+  getContacts() {
+    return this.contacts;
+  }
 
-    update(data) {
-        this.details = data.details
-        this.volatileDetails = data.volatileDetails
-    }
+  getDefaultModerators() {
+    return this.defaultModerators;
+  }
 
-    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"
