diff --git a/requirements.txt b/requirements.txt
index 0c3a6b43b221d22eb6438aff93426d3c22fd3d2d..3c377eed23986cd65579fb880bf3d885d3c823a1 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,10 +1,11 @@
 quamash
 asynctest
 networkx
-attrs<=17.2
+attrs
 duniter-mirage
 duniterpy>=0.40
 pytest
 pytest-asyncio<0.6
 pyyaml
-aiohttp<3
\ No newline at end of file
+aiohttp
+async_timeout
\ No newline at end of file
diff --git a/src/sakia/app.py b/src/sakia/app.py
index 997b88a4c132d4775174b89c195a40635beb21a3..e198750c744243d4a6d7c9552f71ed9ec3083289 100644
--- a/src/sakia/app.py
+++ b/src/sakia/app.py
@@ -3,7 +3,7 @@ import datetime
 import logging
 import socket
 import i18n_rc
-
+import async_timeout
 import aiohttp
 from PyQt5.QtCore import QObject, pyqtSignal, QTranslator, QCoreApplication, QLocale, Qt
 from . import __version__
@@ -194,7 +194,7 @@ class Application(QObject):
     async def get_last_version(self):
         try:
             async with aiohttp.ClientSession() as session:
-                with aiohttp.Timeout(15):
+                async with async_timeout.timeout(10):
                     response = await session.get("https://api.github.com/repos/duniter/sakia/releases",
                                                  proxy=self.parameters.proxy())
                     if response.status == 200:
diff --git a/src/sakia/data/connectors/bma.py b/src/sakia/data/connectors/bma.py
index 2076a781d0da0578a126d276eeb99aabe919da86..154c5ff5714b15fc98dda875e6c2f6eaad1b9984 100644
--- a/src/sakia/data/connectors/bma.py
+++ b/src/sakia/data/connectors/bma.py
@@ -217,7 +217,7 @@ class BmaConnector:
                             else:
                                 answers[data_hash].append(node)
         finally:
-            session.close()
+            await session.close()
 
         if len(answers_data) > 0:
             if request is bma.wot.lookup:
diff --git a/src/sakia/data/connectors/node.py b/src/sakia/data/connectors/node.py
index b825381948435a84b17951726566e7bf005eafb1..d4a716add6980103c09d7da67dd63174171cd5f1 100644
--- a/src/sakia/data/connectors/node.py
+++ b/src/sakia/data/connectors/node.py
@@ -136,7 +136,7 @@ class NodeConnector(QObject):
             else:
                 closed = True
             await asyncio.sleep(0)
-        self.session.close()
+        await self.session.close()
 
     def refresh(self, manual=False):
         """
@@ -166,13 +166,13 @@ class NodeConnector(QObject):
                         self._connected['block'] = True
                         self._logger.debug("Connected successfully to block ws")
                         async for msg in ws:
-                            if msg.tp == aiohttp.WSMsgType.TEXT:
+                            if msg.type == aiohttp.WSMsgType.TEXT:
                                 self._logger.debug("Received a block")
                                 block_data = bma.parse_text(msg.data, bma.ws.WS_BLOCk_SCHEMA)
                                 await self.refresh_block(block_data)
-                            elif msg.tp == aiohttp.WSMsgType.CLOSED:
+                            elif msg.type == aiohttp.WSMsgType.CLOSED:
                                 break
-                            elif msg.tp == aiohttp.WSMsgType.ERROR:
+                            elif msg.type == aiohttp.WSMsgType.ERROR:
                                 break
                 except (aiohttp.WSServerHandshakeError, ValueError) as e:
                     self._logger.debug("Websocket block {0} : {1}".format(type(e).__name__, str(e)))
@@ -290,13 +290,13 @@ class NodeConnector(QObject):
                         self._connected['peer'] = True
                         self._logger.debug("Connected successfully to peer ws")
                         async for msg in ws:
-                            if msg.tp == aiohttp.WSMsgType.TEXT:
+                            if msg.type == aiohttp.WSMsgType.TEXT:
                                 self._logger.debug("Received a peer")
                                 peer_data = bma.parse_text(msg.data, bma.ws.WS_PEER_SCHEMA)
                                 self.refresh_peer_data(peer_data)
-                            elif msg.tp == aiohttp.WSMsgType.CLOSED:
+                            elif msg.type == aiohttp.WSMsgType.CLOSED:
                                 break
-                            elif msg.tp == aiohttp.WSMsgType.ERROR:
+                            elif msg.type == aiohttp.WSMsgType.ERROR:
                                 break
                 except (aiohttp.WSServerHandshakeError, ValueError) as e:
                     self._logger.debug("Websocket peer {0} : {1}"
diff --git a/src/sakia/data/entities/connection.py b/src/sakia/data/entities/connection.py
index 6b3136913748d4d6cf4ea3395c796a99ae0c9a30..3fd7d7e5cafffb22d11be8538d504f8543359677 100644
--- a/src/sakia/data/entities/connection.py
+++ b/src/sakia/data/entities/connection.py
@@ -17,7 +17,7 @@ class Connection:
     scrypt_r = attr.ib(convert=int, default=16, cmp=False, hash=False)
     scrypt_p = attr.ib(convert=int, default=1, cmp=False, hash=False)
     blockstamp = attr.ib(convert=block_uid, default=BlockUID.empty(), cmp=False, hash=False)
-    salt = attr.ib(convert=str, init=False, cmp=False, hash=False)
+    salt = attr.ib(convert=str, init=False, default="", cmp=False, hash=False)
     password = attr.ib(init=False, convert=str, default="", cmp=False, hash=False)
 
     def is_identity(self):
diff --git a/src/sakia/data/repositories/blockchains.py b/src/sakia/data/repositories/blockchains.py
index de897b35f0ee92854e6733e5c7848a9bba8b8d52..272a5b3f8f24e7b79b54d897ad70c022d13a2813 100644
--- a/src/sakia/data/repositories/blockchains.py
+++ b/src/sakia/data/repositories/blockchains.py
@@ -10,7 +10,7 @@ class BlockchainsRepo:
     """The repository for Blockchain entities.
     """
     _conn = attr.ib()  # :type sqlite3.Connection
-    _primary_keys = (Blockchain.currency,)
+    _primary_keys = (attr.fields(Blockchain).currency,)
 
     def insert(self, blockchain):
         """
@@ -18,7 +18,7 @@ class BlockchainsRepo:
         :param sakia.data.entities.Blockchain blockchain: the blockchain to commit
         """
         blockchain_tuple = attr.astuple(blockchain.parameters) \
-                           + attr.astuple(blockchain, filter=attr.filters.exclude(Blockchain.parameters))
+                           + attr.astuple(blockchain, filter=attr.filters.exclude(attr.fields(Blockchain).parameters))
         values = ",".join(['?'] * len(blockchain_tuple))
         self._conn.execute("INSERT INTO blockchains VALUES ({0})".format(values), blockchain_tuple)
 
@@ -28,7 +28,7 @@ class BlockchainsRepo:
         :param sakia.data.entities.Blockchain blockchain: the blockchain to update
         """
         updated_fields = attr.astuple(blockchain, filter=attr.filters.exclude(
-            Blockchain.parameters, *BlockchainsRepo._primary_keys))
+            attr.fields(Blockchain).parameters, *BlockchainsRepo._primary_keys))
         where_fields = attr.astuple(blockchain, filter=attr.filters.include(*BlockchainsRepo._primary_keys))
         self._conn.execute("""UPDATE blockchains SET
                           current_buid=?,
diff --git a/src/sakia/data/repositories/certifications.py b/src/sakia/data/repositories/certifications.py
index 2ae935801a543d7cc325b35b087d1ca255608c59..d51e5a8e9d15be2095926aa490b9c82da352421b 100644
--- a/src/sakia/data/repositories/certifications.py
+++ b/src/sakia/data/repositories/certifications.py
@@ -8,8 +8,8 @@ class CertificationsRepo:
     """The repository for Communities entities.
     """
     _conn = attr.ib()  # :type sqlite3.Connection
-    _primary_keys = (Certification.currency, Certification.certified,
-                     Certification.certifier, Certification.block,)
+    _primary_keys = (attr.fields(Certification).currency, attr.fields(Certification).certified,
+                     attr.fields(Certification).certifier, attr.fields(Certification).block,)
 
     def insert(self, certification):
         """
diff --git a/src/sakia/data/repositories/connections.py b/src/sakia/data/repositories/connections.py
index 5a80c97a32461a6b06816a143ac3d8b2d7bc151d..ef9b3450d4471a5b1ac0587c0d3a80c31010b3a4 100644
--- a/src/sakia/data/repositories/connections.py
+++ b/src/sakia/data/repositories/connections.py
@@ -9,14 +9,15 @@ class ConnectionsRepo:
     The repository for Connections entities.
     """
     _conn = attr.ib()  # :type sqlite3.Connection
-    _primary_keys = (Connection.currency, Connection.pubkey)
+    _primary_keys = (attr.fields(Connection).currency, attr.fields(Connection).pubkey)
 
     def insert(self, connection):
         """
         Commit a connection to the database
         :param sakia.data.entities.Connection connection: the connection to commit
         """
-        connection_tuple = attr.astuple(connection, filter=attr.filters.exclude(Connection.password, Connection.salt))
+        connection_tuple = attr.astuple(connection, filter=attr.filters.exclude(attr.fields(Connection).password,
+                                                                                attr.fields(Connection).salt))
         values = ",".join(['?'] * len(connection_tuple))
         self._conn.execute("INSERT INTO connections VALUES ({0})".format(values), connection_tuple)
 
@@ -25,7 +26,8 @@ class ConnectionsRepo:
         Update an existing connection in the database
         :param sakia.data.entities.Connection connection: the certification to update
         """
-        updated_fields = attr.astuple(connection, filter=attr.filters.exclude(Connection.password, Connection.salt,
+        updated_fields = attr.astuple(connection, filter=attr.filters.exclude(attr.fields(Connection).password,
+                                                                              attr.fields(Connection).salt,
                                                                               *ConnectionsRepo._primary_keys))
         where_fields = attr.astuple(connection, filter=attr.filters.include(*ConnectionsRepo._primary_keys))
 
diff --git a/src/sakia/data/repositories/contacts.py b/src/sakia/data/repositories/contacts.py
index 14ed377f14ae2bada1d9219c3c9a73b88154e569..6b38e409ce65355595fa2bc75480ea173ca2c022 100644
--- a/src/sakia/data/repositories/contacts.py
+++ b/src/sakia/data/repositories/contacts.py
@@ -9,7 +9,7 @@ class ContactsRepo:
     The repository for Contacts entities.
     """
     _conn = attr.ib()  # :type sqlite3.Contact
-    _primary_keys = (Contact.contact_id,)
+    _primary_keys = (attr.fields(Contact).contact_id,)
 
     def insert(self, contact):
         """
diff --git a/src/sakia/data/repositories/dividends.py b/src/sakia/data/repositories/dividends.py
index 41ba667f732dc38bb73745be09ed7f8ceb2fc93b..da1a74e569d5555ffd0bad0d79284a8970132258 100644
--- a/src/sakia/data/repositories/dividends.py
+++ b/src/sakia/data/repositories/dividends.py
@@ -8,7 +8,7 @@ class DividendsRepo:
     """The repository for Communities entities.
     """
     _conn = attr.ib()  # :type sqlite3.Connection
-    _primary_keys = (Dividend.currency, Dividend.pubkey, Dividend.block_number)
+    _primary_keys = (attr.fields(Dividend).currency, attr.fields(Dividend).pubkey, attr.fields(Dividend).block_number)
 
     def insert(self, dividend):
         """
diff --git a/src/sakia/data/repositories/identities.py b/src/sakia/data/repositories/identities.py
index 6867d8efad9363577b77ca0256df9426cced0a86..c136250b7b94999e378956705999c45ea2773398 100644
--- a/src/sakia/data/repositories/identities.py
+++ b/src/sakia/data/repositories/identities.py
@@ -10,7 +10,7 @@ class IdentitiesRepo:
     """The repository for Identities entities.
     """
     _conn = attr.ib()  # :type sqlite3.Connection
-    _primary_keys = (Identity.currency, Identity.pubkey, Identity.uid, Identity.blockstamp)
+    _primary_keys = (attr.fields(Identity).currency, attr.fields(Identity).pubkey, attr.fields(Identity).uid, attr.fields(Identity).blockstamp)
 
     def insert(self, identity):
         """
diff --git a/src/sakia/data/repositories/nodes.py b/src/sakia/data/repositories/nodes.py
index 368a0e85979fe204473c51d795b6fbcb0908da64..7ff4a0ec0004928d530ffef8d6c1cb0dc2c21183 100644
--- a/src/sakia/data/repositories/nodes.py
+++ b/src/sakia/data/repositories/nodes.py
@@ -9,7 +9,7 @@ class NodesRepo:
     """The repository for Communities entities.
     """
     _conn = attr.ib()  # :type sqlite3.Connection
-    _primary_keys = (Node.currency, Node.pubkey)
+    _primary_keys = (attr.fields(Node).currency, attr.fields(Node).pubkey)
 
     def insert(self, node):
         """
diff --git a/src/sakia/data/repositories/sources.py b/src/sakia/data/repositories/sources.py
index 58ac6c7b24b1292b95a16561f3a42840b837a56c..5b346e965aa6bbbc59d078ea330fdc8447e4e70c 100644
--- a/src/sakia/data/repositories/sources.py
+++ b/src/sakia/data/repositories/sources.py
@@ -8,7 +8,7 @@ class SourcesRepo:
     """The repository for Communities entities.
     """
     _conn = attr.ib()  # :type sqlite3.Connection
-    _primary_keys = (Source.currency, Source.pubkey, Source.identifier, Source.noffset)
+    _primary_keys = (attr.fields(Source).currency, attr.fields(Source).pubkey, attr.fields(Source).identifier, attr.fields(Source).noffset)
 
     def insert(self, source):
         """
diff --git a/src/sakia/data/repositories/transactions.py b/src/sakia/data/repositories/transactions.py
index 4a657a61b9c5fb433567cd0c1c08a8bd8aa6c958..5607f770f0acc613364c5418b3fd6f073a39f7fa 100644
--- a/src/sakia/data/repositories/transactions.py
+++ b/src/sakia/data/repositories/transactions.py
@@ -8,7 +8,7 @@ class TransactionsRepo:
     """The repository for Communities entities.
     """
     _conn = attr.ib()  # :type sqlite3.Connection
-    _primary_keys = (Transaction.currency, Transaction.pubkey, Transaction.sha_hash,)
+    _primary_keys = (attr.fields(Transaction).currency, attr.fields(Transaction).pubkey, attr.fields(Transaction).sha_hash,)
 
     def insert(self, transaction):
         """