diff --git a/routes/index.js b/routes/index.js
index cd9bc45..409eed0 100644
--- a/routes/index.js
+++ b/routes/index.js
@@ -1,10 +1,10 @@
 import { Router } from 'express'
 const router = Router()
 import { join } from 'path'
-import { fileURLToPath } from 'url';
-import { dirname } from 'path';
-const __filename = fileURLToPath(import.meta.url);
-const __dirname = dirname(__filename);
+import { fileURLToPath } from 'url'
+import { dirname } from 'path'
+const __filename = fileURLToPath(import.meta.url)
+const __dirname = dirname(__filename)
 
 /* GET React App */
 router.get(['/app', '/app/*'], (req, res, next) => {
diff --git a/routes/jami.js b/routes/jami.js
index 6340ddb..49250c4 100644
--- a/routes/jami.js
+++ b/routes/jami.js
@@ -6,12 +6,12 @@
     }
 
     getRouter() {
-      const router = Router({ mergeParams: true });
-      //router.use(express.json());
+        const router = Router({ mergeParams: true })
+        //router.use(express.json())
 
         // Accounts
         router.get('/accounts', async (req, res) => {
-            console.log("Get account list")
+            console.log('Get account list')
             let accounts = this.jami.getAccountList()
             if (req.user.accountFilter)
                 accounts = accounts.filter(account => req.user.accountFilter(account.getId()))
@@ -21,19 +21,19 @@
         const checkCanCreateAccounts = (req, res, next) => {
             console.log(`checkCanCreateAccounts ${req.params.accountId} for ${req.user.id}`)
             if (req.user && !req.user.accountFilter) {
-                return next();
+                return next()
             }
             res.status(403).end()
         }
 
         router.post('/accounts', checkCanCreateAccounts, async (req, res) => {
-            console.log("Create new account")
+            console.log('Create new account')
             console.log(req.body)
             try {
                 const accountId = await this.jami.addAccount(req.body)
                 if (req.body.registerName) {
-                    this.jami.registerName(accountId, "", req.body.registerName)
-                        .then(result => console.log("Name registrtion result: " + result))
+                    this.jami.registerName(accountId, '', req.body.registerName)
+                        .then(result => console.log('Name registrtion result: ' + result))
                 }
                 res.json({ accountId })
             } catch (e) {
@@ -44,7 +44,7 @@
         const checkAccount = (req, res, next) => {
             console.log(`checkAccount ${req.params.accountId} for ${req.user.id}`)
             if (req.user && (!req.user.accountFilter || req.user.accountFilter(req.params.accountId))) {
-                return next();
+                return next()
             }
             res.status(403).end()
         }
@@ -57,255 +57,255 @@
             const account = this.jami.getAccount(req.params.accountId)
             if (account) {
                 account.defaultModerators = this.jami.getDefaultModerators(account.getId())
-                const obj = await account.getObject();
-                obj.devices = this.jami.getDevices(req.params.accountId);
+                const obj = await account.getObject()
+                obj.devices = this.jami.getDevices(req.params.accountId)
                 res.json(obj)
             } else
                 res.status(404).end()
         })
 
-        accountRouter.post("/", async (req, res) => {
-          console.log(`Set account details ${req.params.accountId}`);
-          const account = this.jami.getAccount(req.params.accountId);
-          if (account) {
-            const newDetails = account.updateDetails(req.body);
-            this.jami.setAccountDetails(account.getId(), newDetails);
-            res.status(200).end();
-          } else res.status(404).end();
-        });
+        accountRouter.post('/', async (req, res) => {
+            console.log(`Set account details ${req.params.accountId}`)
+            const account = this.jami.getAccount(req.params.accountId)
+            if (account) {
+                const newDetails = account.updateDetails(req.body)
+                this.jami.setAccountDetails(account.getId(), newDetails)
+                res.status(200).end()
+            } else res.status(404).end()
+        })
 
         // Contacts
-        accountRouter.get("/contacts", (req, res) => {
-          console.log(`Get account ${req.params.accountId}`);
-          const account = this.jami.getAccount(req.params.accountId);
-          if (account) {
-            let rep = account.getContacts();
-            res.json(rep);
-          } else res.status(404).end();
-        });
+        accountRouter.get('/contacts', (req, res) => {
+            console.log(`Get account ${req.params.accountId}`)
+            const account = this.jami.getAccount(req.params.accountId)
+            if (account) {
+                let rep = account.getContacts()
+                res.json(rep)
+            } else res.status(404).end()
+        })
 
-        accountRouter.get("/contacts/:contactId", (req, res) => {
-          console.log(`Get account details fot ${req.params.accountId}`);
-          const account = this.jami.getAccount(req.params.accountId);
-          const uri = req.params.uri;
-          if (account) {
-            let rep = account.getContactDetails(uri);
-            res.json(rep);
-          } else res.status(404).end();
-        });
+        accountRouter.get('/contacts/:contactId', (req, res) => {
+            console.log(`Get account details fot ${req.params.accountId}`)
+            const account = this.jami.getAccount(req.params.accountId)
+            const uri = req.params.uri
+            if (account) {
+                let rep = account.getContactDetails(uri)
+                res.json(rep)
+            } else res.status(404).end()
+        })
 
-      accountRouter.get("/contacts/details/:contactId", (req, res) => {
-        console.log(
-          `Get contact ${req.params.contactId} details for ${req.params.accountId}`
-        );
-        const account = this.jami.getAccount(req.params.accountId);
-        if (account) {
-          let rep = this.jami.getContactDetails(
-            req.params.accountId,
-            req.params.contactId
-          );
-
-          console.log(rep);
-          res.json(rep);
-        } else res.status(404).end();
-      });
-
-      accountRouter.delete("/contacts/remove/:contactId", async (req, res) => {
-        console.log("REMOVED CONTACT: ", req.params.contactId);
-        const account = this.jami.getAccount(req.params.accountId);
-        if (account) {
-          let rep = this.jami.removeContact(
-            req.params.accountId,
-            req.params.contactId
-          );
-          res.json(rep);
-        } else res.status(404).end();
-        res.status(200).end();
-      });
-
-      accountRouter.delete("/contacts/block/:contactId/", async (req, res) => {
-        console.log("REMOVED AND BLOCKED CONTACT: ", req.params.contactId);
-        const account = this.jami.getAccount(req.params.accountId);
-        if (account) {
-          let rep = this.jami.blockContact(
-            req.params.accountId,
-            req.params.contactId
-          );
-          res.json(rep);
-        } else res.status(404).end();
-        res.status(200).end();
-      });
-
-
-      // Default modertors
-      accountRouter.put("/defaultModerators/:contactId", async (req, res) => {
-        console.log(
-          `Adding default moderator ${req.params.contactId} to account ${req.params.accountId}`
-        );
-        this.jami.addDefaultModerator(
-          req.params.accountId,
-          req.params.contactId
-        );
-        res.status(200).end();
-      });
-
-      accountRouter.delete(
-        "/defaultModerators/:contactId",
-        async (req, res) => {
-          console.log(
-            `Removing default moderator to account ${req.params.accountId}`
-          );
-          this.jami.removeDefaultModerator(
-            req.params.accountId,
-            req.params.contactId
-          );
-          res.status(200).end();
-        }
-      );
-
-      // Conversations
-      accountRouter.get("/conversations", async (req, res, next) => {
-        console.log(`Get conversations for account ${req.params.accountId}`);
-        const account = this.jami.getAccount(req.params.accountId);
-        if (!account) return res.sendStatus(404);
-        const conversations = account.getConversations();
-        res.json(
-          await Promise.all(
-            Object.keys(conversations).map(
-              async (conversationId) =>
-                await conversations[conversationId].getObject({
-                  memberFilter: (member) =>
-                    member.contact.getUri() !== account.getUri(),
-                })
+        accountRouter.get('/contacts/details/:contactId', (req, res) => {
+            console.log(
+                `Get contact ${req.params.contactId} details for ${req.params.accountId}`
             )
-          )
-        );
+            const account = this.jami.getAccount(req.params.accountId)
+            if (account) {
+                let rep = this.jami.getContactDetails(
+                    req.params.accountId,
+                    req.params.contactId
+                )
+
+                console.log(rep)
+                res.json(rep)
+            } else res.status(404).end()
+        })
+
+        accountRouter.delete('/contacts/remove/:contactId', async (req, res) => {
+            console.log('REMOVED CONTACT: ', req.params.contactId)
+            const account = this.jami.getAccount(req.params.accountId)
+            if (account) {
+                let rep = this.jami.removeContact(
+                    req.params.accountId,
+                    req.params.contactId
+                )
+                res.json(rep)
+            } else res.status(404).end()
+            res.status(200).end()
+        })
+
+        accountRouter.delete('/contacts/block/:contactId/', async (req, res) => {
+            console.log('REMOVED AND BLOCKED CONTACT: ', req.params.contactId)
+            const account = this.jami.getAccount(req.params.accountId)
+            if (account) {
+                let rep = this.jami.blockContact(
+                    req.params.accountId,
+                    req.params.contactId
+                )
+                res.json(rep)
+            } else res.status(404).end()
+            res.status(200).end()
+        })
+
+
+        // Default modertors
+        accountRouter.put('/defaultModerators/:contactId', async (req, res) => {
+            console.log(
+                `Adding default moderator ${req.params.contactId} to account ${req.params.accountId}`
+            )
+            this.jami.addDefaultModerator(
+                req.params.accountId,
+                req.params.contactId
+            )
+            res.status(200).end()
+        })
+
+        accountRouter.delete(
+            '/defaultModerators/:contactId',
+            async (req, res) => {
+                console.log(
+                    `Removing default moderator to account ${req.params.accountId}`
+                )
+                this.jami.removeDefaultModerator(
+                    req.params.accountId,
+                    req.params.contactId
+                )
+                res.status(200).end()
+            }
+        )
+
+        // Conversations
+        accountRouter.get('/conversations', async (req, res, next) => {
+            console.log(`Get conversations for account ${req.params.accountId}`)
+            const account = this.jami.getAccount(req.params.accountId)
+            if (!account) return res.sendStatus(404)
+            const conversations = account.getConversations()
+            res.json(
+                await Promise.all(
+                    Object.keys(conversations).map(
+                        async (conversationId) =>
+                            await conversations[conversationId].getObject({
+                                memberFilter: (member) =>
+                                    member.contact.getUri() !== account.getUri(),
+                            })
+                    )
+                )
+            )
         //res.json(account.getConversations())
-      });
+        })
 
-      accountRouter.post("/conversations", (req, res) => {
-        console.log(
-          `Create conversations for account, contact ${req.params.accountId}`
-        );
-        // console.log(req.body)
-        const account = this.jami.getAccount(req.params.accountId);
-        if (!account) return res.sendStatus(404);
-        if (req.body.members.length === 1) {
-          const details = this.jami.addContact(
-            req.params.accountId,
-            req.body.members[0]
-          );
-          res.json(details);
-        } else res.status(400).end();
-      });
+        accountRouter.post('/conversations', (req, res) => {
+            console.log(
+                `Create conversations for account, contact ${req.params.accountId}`
+            )
+            // console.log(req.body)
+            const account = this.jami.getAccount(req.params.accountId)
+            if (!account) return res.sendStatus(404)
+            if (req.body.members.length === 1) {
+                const details = this.jami.addContact(
+                    req.params.accountId,
+                    req.body.members[0]
+                )
+                res.json(details)
+            } else res.status(400).end()
+        })
 
-      accountRouter.post("/conversations/:conversationId", async (req, res) => {
-        console.log(
-          `Sending message to ${req.params.conversationId} for account ${req.params.accountId}`
-        );
-        this.jami.sendMessage(
-          req.params.accountId,
-          req.params.conversationId,
-          req.body.message
-        );
-        res.status(200).end();
-      });
+        accountRouter.post('/conversations/:conversationId', async (req, res) => {
+            console.log(
+                `Sending message to ${req.params.conversationId} for account ${req.params.accountId}`
+            )
+            this.jami.sendMessage(
+                req.params.accountId,
+                req.params.conversationId,
+                req.body.message
+            )
+            res.status(200).end()
+        })
 
-      accountRouter.get("/conversations/:conversationId", async (req, res) => {
-        console.log(
-          `Get conversation ${req.params.conversationId} for account ${req.params.accountId}`
-        );
-        const account = this.jami.getAccount(req.params.accountId);
-        if (!account) return res.sendStatus(404);
-        const conversation = account.getConversation(req.params.conversationId);
-        if (!conversation) res.status(404).end();
-        else {
-          res.json(
-            await conversation.getObject({
-              memberFilter: (member) =>
-                member.contact.getUri() !== account.getUri(),
-            })
-          );
-        }
-      });
+        accountRouter.get('/conversations/:conversationId', async (req, res) => {
+            console.log(
+                `Get conversation ${req.params.conversationId} for account ${req.params.accountId}`
+            )
+            const account = this.jami.getAccount(req.params.accountId)
+            if (!account) return res.sendStatus(404)
+            const conversation = account.getConversation(req.params.conversationId)
+            if (!conversation) res.status(404).end()
+            else {
+                res.json(
+                    await conversation.getObject({
+                        memberFilter: (member) =>
+                            member.contact.getUri() !== account.getUri(),
+                    })
+                )
+            }
+        })
 
-      accountRouter.get(
-        "/conversations/:conversationId/messages",
-        async (req, res) => {
-          console.log(
-            `Get messages for conversation ${req.params.conversationId} for account ${req.params.accountId}`
-          );
-          try {
-            const messages = await this.jami.loadMessages(
-              req.params.accountId,
-              req.params.conversationId
-            );
-            res.json(messages).end();
-          } catch (e) {
-            res.status(400).json({ error: e.message });
-          }
-        }
-      );
+        accountRouter.get(
+            '/conversations/:conversationId/messages',
+            async (req, res) => {
+                console.log(
+                    `Get messages for conversation ${req.params.conversationId} for account ${req.params.accountId}`
+                )
+                try {
+                    const messages = await this.jami.loadMessages(
+                        req.params.accountId,
+                        req.params.conversationId
+                    )
+                    res.json(messages).end()
+                } catch (e) {
+                    res.status(400).json({ error: e.message })
+                }
+            }
+        )
 
-      // Calls
+        // Calls
 
-      accountRouter.get("/calls", async (req, res) => {
-        console.log(`Get calls for account ${req.params.accountId}`);
-        try {
-          const calls = await this.jami.getCalls(req.params.accountId);
-          res.json(calls).end();
-        } catch (e) {
-          res.status(400).json({ error: e.message });
-        }
-      });
+        accountRouter.get('/calls', async (req, res) => {
+            console.log(`Get calls for account ${req.params.accountId}`)
+            try {
+                const calls = await this.jami.getCalls(req.params.accountId)
+                res.json(calls).end()
+            } catch (e) {
+                res.status(400).json({ error: e.message })
+            }
+        })
 
-      accountRouter.get("/calls/:callId", async (req, res) => {
-        console.log(`Get call ${callId} for account ${req.params.accountId}`);
-        try {
-          const messages = await this.jami.getCall(
-            req.params.accountId,
-            req.params.callId
-          );
-          res.json(messages).end();
-        } catch (e) {
-          res.status(400).json({ error: e.message });
-        }
-      });
+        accountRouter.get('/calls/:callId', async (req, res) => {
+            console.log(`Get call ${req.params.callId} for account ${req.params.accountId}`)
+            try {
+                const messages = await this.jami.getCall(
+                    req.params.accountId,
+                    req.params.callId
+                )
+                res.json(messages).end()
+            } catch (e) {
+                res.status(400).json({ error: e.message })
+            }
+        })
 
-      // Nameserver
-      const nsRouter = Router({ mergeParams: true });
-      accountRouter.use("/ns", nsRouter); // use account nameserver
-      router.use("/ns", nsRouter); // use default nameserver
+        // Nameserver
+        const nsRouter = Router({ mergeParams: true })
+        accountRouter.use('/ns', nsRouter) // use account nameserver
+        router.use('/ns', nsRouter) // use default nameserver
 
-      nsRouter.get(["/name/:nameQuery"], (req, res, next) => {
-        console.log(`Name lookup ${req.params.nameQuery}`);
-        this.jami
-          .lookupName(req.params.accountId || "", req.params.nameQuery)
-          .then((result) => {
-            if (result.state == 0) res.json(result);
-            else if (result.state == 1) res.status(400).json({});
-            else res.status(404).json({});
-          })
-          .catch((e) => {
-            res.status(404).json({});
-          });
-      });
+        nsRouter.get(['/name/:nameQuery'], (req, res, next) => {
+            console.log(`Name lookup ${req.params.nameQuery}`)
+            this.jami
+                .lookupName(req.params.accountId || '', req.params.nameQuery)
+                .then((result) => {
+                    if (result.state == 0) res.json(result)
+                    else if (result.state == 1) res.status(400).json({})
+                    else res.status(404).json({})
+                })
+                .catch((e) => {
+                    res.status(404).json({})
+                })
+        })
 
-      nsRouter.get(["/addr/:addrQuery"], (req, res, next) => {
-        console.log(`Address lookup ${req.params.addrQuery}`);
-        this.jami
-          .lookupAddress(req.params.accountId || "", req.params.addrQuery)
-          .then((result) => {
-            if (result.state == 0) res.json(result);
-            else if (result.state == 1) res.status(400).json({});
-            else res.status(404).json({});
-          })
-          .catch((e) => {
-            res.status(404).json({});
-          });
-      });
+        nsRouter.get(['/addr/:addrQuery'], (req, res, next) => {
+            console.log(`Address lookup ${req.params.addrQuery}`)
+            this.jami
+                .lookupAddress(req.params.accountId || '', req.params.addrQuery)
+                .then((result) => {
+                    if (result.state == 0) res.json(result)
+                    else if (result.state == 1) res.status(400).json({})
+                    else res.status(404).json({})
+                })
+                .catch((e) => {
+                    res.status(404).json({})
+                })
+        })
 
-      return router;
+        return router
     }
 }
 
