diff --git a/res/ui/transactions_tab.ui b/res/ui/transactions_tab.ui
index 7b5f520604ea8c1dd224328f13ddc15434b6a46a..b459a6950f465ba297e35a1279cb9bd18fac0e67 100644
--- a/res/ui/transactions_tab.ui
+++ b/res/ui/transactions_tab.ui
@@ -14,6 +14,32 @@
    <string>Form</string>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QGroupBox" name="groupBox_2">
+     <property name="title">
+      <string>Balance</string>
+     </property>
+     <layout class="QVBoxLayout" name="verticalLayout_4">
+      <item>
+       <widget class="QLabel" name="label_balance">
+        <property name="font">
+         <font>
+          <pointsize>22</pointsize>
+          <weight>75</weight>
+          <bold>true</bold>
+         </font>
+        </property>
+        <property name="text">
+         <string>label_balance</string>
+        </property>
+        <property name="alignment">
+         <set>Qt::AlignHCenter|Qt::AlignTop</set>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
    <item>
     <layout class="QVBoxLayout" name="verticalLayout_3">
      <item>
@@ -75,37 +101,6 @@
        </attribute>
       </widget>
      </item>
-     <item>
-      <layout class="QHBoxLayout" name="layout_balance">
-       <item>
-        <widget class="QLabel" name="label_payment">
-         <property name="text">
-          <string>Payment:</string>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <widget class="QLabel" name="label_deposit">
-         <property name="text">
-          <string>Deposit:</string>
-         </property>
-         <property name="alignment">
-          <set>Qt::AlignCenter</set>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <widget class="QLabel" name="label_balance">
-         <property name="text">
-          <string>Balance:</string>
-         </property>
-         <property name="alignment">
-          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-         </property>
-        </widget>
-       </item>
-      </layout>
-     </item>
     </layout>
    </item>
   </layout>
diff --git a/src/cutecoin/core/registry/identity.py b/src/cutecoin/core/registry/identity.py
index d5930684cad896617404aa661be3abaabbf50eea..aa77a6cb782be986e1161a2e6c85076ebe1fd386 100644
--- a/src/cutecoin/core/registry/identity.py
+++ b/src/cutecoin/core/registry/identity.py
@@ -10,10 +10,10 @@ import asyncio
 from enum import Enum
 
 from ucoinpy.documents.certification import SelfCertification
-from cutecoin.tools.exceptions import Error, NoPeerAvailable,\
+from ...tools.exceptions import Error, NoPeerAvailable,\
                                         MembershipNotFoundError
-from cutecoin.core.net.api import bma as qtbma
-from cutecoin.core.net.api.bma import PROTOCOL_VERSION
+from ..net.api import bma as qtbma
+from ..net.api.bma import PROTOCOL_VERSION
 from PyQt5.QtCore import QObject, pyqtSignal
 
 
@@ -117,6 +117,7 @@ class Identity(QObject):
                                          signature)
         return None
 
+    @asyncio.coroutine
     def get_join_date(self, community):
         """
         Get the person join date.
@@ -125,11 +126,11 @@ class Identity(QObject):
         :param cutecoin.core.community.Community community: The community target to request the join date
         :return: A datetime object
         """
-        search = community.bma_access.get(self, qtbma.blockchain.Membership, {'search': self.pubkey})
+        search = yield from community.bma_access.future_request(qtbma.blockchain.Membership, {'search': self.pubkey})
         if search != qtbma.blockchain.Membership.null_value:
             if len(search['memberships']) > 0:
                 membership_data = search['memberships'][0]
-                block = community.bma_access.get(self, qtbma.blockchain.Block,
+                block = yield from community.bma_access.future_request(qtbma.blockchain.Block,
                                 req_args={'number': membership_data['blockNumber']})
                 if block != qtbma.blockchain.Block.null_value:
                     return block['medianTime']
@@ -137,14 +138,16 @@ class Identity(QObject):
         else:
             raise MembershipNotFoundError(self.pubkey, community.name)
 
+    @asyncio.coroutine
     def get_expiration_date(self, community):
         try:
-            join_block_number = self.membership(community)['blockNumber']
+            membership = yield from self.membership(community)
+            join_block_number = membership['blockNumber']
             try:
-                join_block = community.bma_access.get(self, qtbma.blockchain.Block,
+                join_block = yield from community.bma_access.future_request(qtbma.blockchain.Block,
                                 req_args={'number': join_block_number})
 
-                parameters = community.bma_access.get(self, qtbma.blockchain.Parameters)
+                parameters = yield from community.bma_access.future_request(qtbma.blockchain.Parameters)
                 if join_block != qtbma.blockchain.Block.null_value \
                         and parameters != qtbma.blockchain.Parameters.null_value:
                     join_date = join_block['medianTime']
@@ -159,6 +162,7 @@ class Identity(QObject):
 
 
 #TODO: Manage 'OUT' memberships ? Maybe ?
+    @asyncio.coroutine
     def membership(self, community):
         """
         Get the person last membership document.
@@ -166,7 +170,7 @@ class Identity(QObject):
         :param cutecoin.core.community.Community community: The community target to request the join date
         :return: The membership data in BMA json format
         """
-        search = community.bma_access.get(self, qtbma.blockchain.Membership,
+        search = yield from community.bma_access.future_request(qtbma.blockchain.Membership,
                                            {'search': self.pubkey})
         if search != qtbma.blockchain.Membership.null_value:
             block_number = -1
@@ -182,8 +186,9 @@ class Identity(QObject):
         else:
             raise MembershipNotFoundError(self.pubkey, community.name)
 
+    @asyncio.coroutine
     def published_uid(self, community):
-        data = community.bma_access.get(self, qtbma.wot.Lookup,
+        data = yield from community.bma_access.future_request(qtbma.wot.Lookup,
                                  req_args={'search': self.pubkey})
         if data != qtbma.wot.Lookup.null_value:
             timestamp = 0
@@ -200,6 +205,7 @@ class Identity(QObject):
                             return True
         return False
 
+    @asyncio.coroutine
     def is_member(self, community):
         """
         Check if the person is a member of a community
@@ -207,11 +213,12 @@ class Identity(QObject):
         :param cutecoin.core.community.Community community: The community target to request the join date
         :return: True if the person is a member of a community
         """
-        certifiers = community.bma_access.get(self, qtbma.wot.CertifiersOf, {'search': self.pubkey})
+        certifiers = yield from community.bma_access.future_request(qtbma.wot.CertifiersOf, {'search': self.pubkey})
         if certifiers != qtbma.wot.CertifiersOf.null_value:
             return certifiers['isMember']
         return False
 
+    @asyncio.coroutine
     def certifiers_of(self, identities_registry, community):
         """
         Get the list of this person certifiers
@@ -220,7 +227,7 @@ class Identity(QObject):
         :param cutecoin.core.community.Community community: The community target to request the join date
         :return: The list of the certifiers of this community
         """
-        data = community.bma_access.get(self, qtbma.wot.CertifiersOf, {'search': self.pubkey})
+        data = yield from community.bma_access.future_request(qtbma.wot.CertifiersOf, {'search': self.pubkey})
 
         certifiers = list()
 
@@ -257,8 +264,9 @@ class Identity(QObject):
                 certifiers.append(certifier)
         return certifiers
 
+    @asyncio.coroutine
     def unique_valid_certifiers_of(self, identities_registry, community):
-        certifier_list = self.certifiers_of(identities_registry, community)
+        certifier_list = yield from self.certifiers_of(identities_registry, community)
         unique_valid = []
         #  add certifiers of uid
         for certifier in tuple(certifier_list):
@@ -276,6 +284,7 @@ class Identity(QObject):
                 unique_valid.append(certifier)
         return unique_valid
 
+    @asyncio.coroutine
     def certified_by(self, identities_registry, community):
         """
         Get the list of persons certified by this person
@@ -283,7 +292,7 @@ class Identity(QObject):
         :param cutecoin.core.community.Community community: The community target to request the join date
         :return: The list of the certified persons of this community in BMA json format
         """
-        data = community.bma_access.get(self, qtbma.wot.CertifiedBy, {'search': self.pubkey})
+        data = yield from community.bma_access.future_request(qtbma.wot.CertifiedBy, {'search': self.pubkey})
         certified_list = list()
         if data == qtbma.wot.CertifiedBy.null_value:
             logging.debug('bma.wot.CertifiersOf request error')
@@ -312,8 +321,9 @@ class Identity(QObject):
                 certified_list.append(certified)
         return certified_list
 
+    @asyncio.coroutine
     def unique_valid_certified_by(self, identities_registry, community):
-        certified_list = self.certified_by(identities_registry, community)
+        certified_list = yield from self.certified_by(identities_registry, community)
         unique_valid = []
         #  add certifiers of uid
         for certified in tuple(certified_list):
@@ -331,8 +341,10 @@ class Identity(QObject):
                 unique_valid.append(certified)
         return unique_valid
 
+    @asyncio.coroutine
     def membership_expiration_time(self, community):
-        join_block = self.membership(community)['blockNumber']
+        membership = yield from self.membership(community)
+        join_block = membership['blockNumber']
         join_date = community.get_block(join_block)['medianTime']
         parameters = community.parameters
         expiration_date = join_date + parameters['sigValidity']
diff --git a/src/cutecoin/gui/community_view.py b/src/cutecoin/gui/community_view.py
index 9a747d6ecff91a2959767a30e9ded87b4c24cb7e..186cb2a35e52c1da4015f0c7fcfe838363c6ac56 100644
--- a/src/cutecoin/gui/community_view.py
+++ b/src/cutecoin/gui/community_view.py
@@ -19,6 +19,7 @@ from .password_asker import PasswordAskerDialog
 from . import toast
 import asyncio
 from ..tools.exceptions import MembershipNotFoundError, LookupFailureError
+from ..tools.decorators import asyncify
 from ..gen_resources.community_view_uic import Ui_CommunityWidget
 
 
@@ -101,7 +102,8 @@ class CommunityWidget(QWidget, Ui_CommunityWidget):
                     error,
                     QMessageBox.Ok)
 
-    @pyqtSlot(int)
+    @asyncify
+    @asyncio.coroutine
     def refresh_block(self, block_number):
         """
         When a new block is found, start handling data.
@@ -110,8 +112,8 @@ class CommunityWidget(QWidget, Ui_CommunityWidget):
         logging.debug("Refresh block")
         self.status_info.clear()
         try:
-            person = self.app.identities_registry.find(self.app.current_account.pubkey, self.community)
-            expiration_time = person.membership_expiration_time(self.community)
+            person = yield from self.app.identities_registry.future_find(self.app.current_account.pubkey, self.community)
+            expiration_time = yield from person.membership_expiration_time(self.community)
             sig_validity = self.community.parameters['sigValidity']
             warning_expiration_time = int(sig_validity / 3)
             will_expire_soon = (expiration_time < warning_expiration_time)
@@ -126,7 +128,8 @@ class CommunityWidget(QWidget, Ui_CommunityWidget):
                         toast.display(self.tr("Membership expiration"),
                                   self.tr("<b>Warning : Membership expiration in {0} days</b>").format(days))
 
-            certifiers_of = person.unique_valid_certifiers_of(self.app.identities_registry, self.community)
+            certifiers_of = yield from person.unique_valid_certifiers_of(self.app.identities_registry,
+                                                                         self.community)
             if len(certifiers_of) < self.community.parameters['sigQty']:
                 self.status_info.append('warning_certifications')
                 if self.app.preferences['notifications']:
@@ -184,12 +187,16 @@ class CommunityWidget(QWidget, Ui_CommunityWidget):
 
             self.status_label.setText(label_text)
 
+    @asyncify
+    @asyncio.coroutine
     def refresh_quality_buttons(self):
         if self.account and self.community:
             try:
-                if self.account.identity(self.community).published_uid(self.community):
+                published_uid = yield from self.account.identity(self.community).published_uid(self.community)
+                if published_uid:
                     logging.debug("UID Published")
-                    if self.account.identity(self.community).is_member(self.community):
+                    is_member = yield from self.account.identity(self.community).is_member(self.community)
+                    if is_member:
                         self.button_membership.setText(self.tr("Renew membership"))
                         self.button_membership.show()
                         self.button_certification.show()
diff --git a/src/cutecoin/gui/identities_tab.py b/src/cutecoin/gui/identities_tab.py
index f9427bbef36e2c379e665c2467066282a7b09e95..12bdffe224b57416f35f234700333be947a30529 100644
--- a/src/cutecoin/gui/identities_tab.py
+++ b/src/cutecoin/gui/identities_tab.py
@@ -9,16 +9,15 @@ from PyQt5.QtCore import Qt, pyqtSlot, QEvent
 from PyQt5.QtGui import QIcon, QCursor
 from PyQt5.QtWidgets import QWidget, QMessageBox, QAction, QMenu, QDialog, \
                             QAbstractItemView
-from cutecoin.models.identities import IdentitiesFilterProxyModel, IdentitiesTableModel
+from ..models.identities import IdentitiesFilterProxyModel, IdentitiesTableModel
 from ..gen_resources.identities_tab_uic import Ui_IdentitiesTab
-from cutecoin.gui.contact import ConfigureContactDialog
-from cutecoin.gui.member import MemberDialog
-from .wot_tab import WotTabWidget
+from .contact import ConfigureContactDialog
+from .member import MemberDialog
 from .transfer import TransferMoneyDialog
 from .certification import CertificationDialog
-from . import toast
 import asyncio
 from ..core.net.api import bma as qtbma
+from ..tools.decorators import asyncify
 
 
 class IdentitiesTabWidget(QWidget, Ui_IdentitiesTab):
@@ -53,10 +52,10 @@ class IdentitiesTabWidget(QWidget, Ui_IdentitiesTab):
         self.table_identities.resizeColumnsToContents()
 
         members_action = QAction(self.tr("Members"), self)
-        members_action.triggered.connect(self.search_members)
+        members_action.triggered.connect(self._async_search_members)
         self.button_search.addAction(members_action)
         direct_connections = QAction(self.tr("Direct connections"), self)
-        direct_connections.triggered.connect(self.search_direct_connections)
+        direct_connections.triggered.connect(self._async_search_direct_connections)
         self.button_search.addAction(direct_connections)
         self.button_search.clicked.connect(self.search_text)
 
@@ -67,18 +66,9 @@ class IdentitiesTabWidget(QWidget, Ui_IdentitiesTab):
             self.community = None
 
     def change_community(self, community):
-        if self.community:
-            try:
-                self.account.identity(self.community).inner_data_changed.disconnect(self.handle_account_identity_change)
-            except TypeError as e:
-                if "disconnect" in str(e):
-                    logging.debug("Disconnect failed between inner_data_changed ans handle_account_identity_changed")
-                    pass
-        if community:
-            self.account.identity(community).inner_data_changed.connect(self.handle_account_identity_change)
-
         self.community = community
         self.table_identities.model().change_community(community)
+        self._async_search_direct_connections()
 
     def identity_context_menu(self, point):
         index = self.table_identities.indexAt(point)
@@ -175,27 +165,6 @@ class IdentitiesTabWidget(QWidget, Ui_IdentitiesTab):
         index_wot_tab = self.tabs_information.indexOf(self.wot_tab)
         self.tabs_information.setCurrentIndex(index_wot_tab)
 
-    @asyncio.coroutine
-    def _execute_search_text(self, text):
-        response = yield from self.community.bma_access.future_request(qtbma.wot.Lookup, {'search': text})
-        identities = []
-        for identity_data in response['results']:
-            identity = yield from self.app.identities_registry.future_find(identity_data['pubkey'], self.community)
-            identities.append(identity)
-
-        self_identity = self.account.identity(self.community)
-        try:
-            self_identity.inner_data_changed.disconnect(self.handle_account_identity_change)
-            self.community.inner_data_changed.disconnect(self.handle_community_change)
-        except TypeError as e:
-            if "disconnect() failed" in str(e):
-                pass
-            else:
-                raise
-
-        self.edit_textsearch.clear()
-        self.refresh_identities(identities)
-
     def search_text(self):
         """
         Search text and display found identities
@@ -205,67 +174,54 @@ class IdentitiesTabWidget(QWidget, Ui_IdentitiesTab):
         if len(text) < 2:
             return False
         else:
-            asyncio.async(self._execute_search_text(text))
+            asyncio.async(self._async_execute_search_text(text))
 
-    @pyqtSlot(str)
-    def handle_community_change(self, origin):
-        logging.debug("Handle account community {0}".format(origin))
-        if origin == qtbma.wot.Members:
-            self.search_members()
+    @asyncio.coroutine
+    def _async_execute_search_text(self, text):
+        response = yield from self.community.bma_access.future_request(qtbma.wot.Lookup, {'search': text})
+        identities = []
+        for identity_data in response['results']:
+            identity = yield from self.app.identities_registry.future_find(identity_data['pubkey'], self.community)
+            identities.append(identity)
 
-    @pyqtSlot(str)
-    def handle_account_identity_change(self, origin):
-        logging.debug("Handle account identity change {0}".format(origin))
-        if origin in (str(qtbma.wot.CertifiedBy), str(qtbma.wot.CertifiersOf)):
-            self.search_direct_connections()
+        self.edit_textsearch.clear()
+        self.refresh_identities(identities)
 
-    def search_members(self):
+    @asyncify
+    @asyncio.coroutine
+    def _async_search_members(self):
         """
         Search members of community and display found members
         """
-        pubkeys = self.community.members_pubkeys()
-        identities = []
-        for p in pubkeys:
-            identities.append(self.app.identities_registry.find(p, self.community))
-
-        self_identity = self.account.identity(self.community)
+        if self.community:
+            pubkeys = self.community.members_pubkeys()
+            identities = []
+            for p in pubkeys:
+                identities.append(self.app.identities_registry.find(p, self.community))
 
-        try:
-            self_identity.inner_data_changed.disconnect(self.handle_account_identity_change)
-            self.community.inner_data_changed.connect(self.handle_community_change)
-        except TypeError as e:
-            if "disconnect() failed" in str(e):
-                pass
-            else:
-                raise
+            self.edit_textsearch.clear()
+            self.refresh_identities(identities)
 
-        self.edit_textsearch.clear()
-        self.refresh_identities(identities)
-
-    def search_direct_connections(self):
+    @asyncify
+    @asyncio.coroutine
+    def _async_search_direct_connections(self):
         """
         Search members of community and display found members
         """
-        self_identity = self.account.identity(self.community)
-        try:
-            self.community.inner_data_changed.disconnect(self.handle_community_change)
-            self_identity.inner_data_changed.connect(self.handle_account_identity_change)
-        except TypeError as e:
-            if "disconnect() failed" in str(e):
-                logging.debug("Could not disconnect community")
-            else:
-                raise
-
-        account_connections = []
-        for p in self_identity.unique_valid_certifiers_of(self.app.identities_registry, self.community):
-            account_connections.append(p['identity'])
-        certifiers_of = [p for p in account_connections]
-        for p in self_identity.unique_valid_certified_by(self.app.identities_registry, self.community):
-            account_connections.append(p['identity'])
-        certified_by = [p for p in account_connections
-                  if p.pubkey not in [i.pubkey for i in certifiers_of]]
-        identities = certifiers_of + certified_by
-        self.refresh_identities(identities)
+        if self.account and self.community:
+            self_identity = self.account.identity(self.community)
+            account_connections = []
+            certs_of = yield from self_identity.unique_valid_certifiers_of(self.app.identities_registry, self.community)
+            for p in certs_of:
+                account_connections.append(p['identity'])
+            certifiers_of = [p for p in account_connections]
+            certs_by = yield from self_identity.unique_valid_certified_by(self.app.identities_registry, self.community)
+            for p in certs_by:
+                account_connections.append(p['identity'])
+            certified_by = [p for p in account_connections
+                      if p.pubkey not in [i.pubkey for i in certifiers_of]]
+            identities = certifiers_of + certified_by
+            self.refresh_identities(identities)
 
     def refresh_identities(self, identities):
         """
diff --git a/src/cutecoin/gui/wot_tab.py b/src/cutecoin/gui/wot_tab.py
index 173daa0d72132ce0ea6ea1d85582a049b693e247..f8a022d4ec86b0b9b838d26e963e800cc9f78f50 100644
--- a/src/cutecoin/gui/wot_tab.py
+++ b/src/cutecoin/gui/wot_tab.py
@@ -1,8 +1,10 @@
 # -*- coding: utf-8 -*-
 
 import logging
+import asyncio
 from cutecoin.core.graph import Graph
 from ..tools.exceptions import MembershipNotFoundError
+from ..tools.decorators import asyncify
 from PyQt5.QtWidgets import QWidget, QComboBox, QLineEdit
 from PyQt5.QtCore import pyqtSlot, QEvent, QLocale, QDateTime
 from cutecoin.core.net.api import bma
@@ -60,6 +62,8 @@ class WotTabWidget(QWidget, Ui_WotTabWidget):
         self.community = community
         self.reset()
 
+    @asyncify
+    @asyncio.coroutine
     def refresh_informations_frame(self):
         parameters = self.community.parameters
         try:
@@ -72,8 +76,8 @@ class WotTabWidget(QWidget, Ui_WotTabWidget):
             last_renewal = None
             expiration = None
 
-        certified = identity.unique_valid_certified_by(self.app.identities_registry, self.community)
-        certifiers = identity.unique_valid_certifiers_of(self.app.identities_registry, self.community)
+        certified = yield from identity.unique_valid_certified_by(self.app.identities_registry, self.community)
+        certifiers = yield from identity.unique_valid_certifiers_of(self.app.identities_registry, self.community)
         if last_renewal and expiration:
             date_renewal = QLocale.toString(
                 QLocale(),
@@ -148,6 +152,8 @@ class WotTabWidget(QWidget, Ui_WotTabWidget):
             )
         )
 
+    @asyncify
+    @asyncio.coroutine
     def draw_graph(self, identity):
         """
         Draw community graph centered on the identity
@@ -159,22 +165,15 @@ class WotTabWidget(QWidget, Ui_WotTabWidget):
         if self.community:
             identity_account = self.account.identity(self.community)
 
-            # Disconnect old identity
-            try:
-                if self._current_identity and self._current_identity != identity:
-                    self._current_identity.inner_data_changed.disconnect(self.handle_identity_change)
-            except TypeError as e:
-                if "disconnect()" in str(e):
-                    logging.debug("Disconnect of old identity failed.")
-
             #Connect new identity
             if self._current_identity != identity:
                 self._current_identity = identity
-                identity.inner_data_changed.connect(self.handle_identity_change)
 
             # create Identity from node metadata
-            certifier_list = identity.unique_valid_certifiers_of(self.app.identities_registry, self.community)
-            certified_list = identity.unique_valid_certified_by(self.app.identities_registry, self.community)
+            certifier_list = yield from identity.unique_valid_certifiers_of(self.app.identities_registry,
+                                                                            self.community)
+            certified_list = yield from identity.unique_valid_certified_by(self.app.identities_registry,
+                                                                           self.community)
 
             # create empty graph instance
             graph = Graph(self.app, self.community)
@@ -221,10 +220,6 @@ class WotTabWidget(QWidget, Ui_WotTabWidget):
         else:
             self.reset()
 
-    @pyqtSlot(str)
-    def handle_identity_change(self, request):
-        self.refresh()
-
     def search(self):
         """
         Search nodes when return is pressed in combobox lineEdit
diff --git a/src/cutecoin/models/identities.py b/src/cutecoin/models/identities.py
index 33f3032e5f657d2a417a7890952508abe0524ffc..52af9851a01f45ea599c9194fa902df19203dea2 100644
--- a/src/cutecoin/models/identities.py
+++ b/src/cutecoin/models/identities.py
@@ -6,10 +6,12 @@ Created on 5 févr. 2014
 
 from ..core.net.api import bma as qtbma
 from ..tools.exceptions import NoPeerAvailable, MembershipNotFoundError
+from ..tools.decorators import asyncify
 from PyQt5.QtCore import QAbstractTableModel, QSortFilterProxyModel, Qt, \
                         QDateTime, QModelIndex, QLocale
 from PyQt5.QtGui import QColor
 import logging
+import asyncio
 
 
 class IdentitiesFilterProxyModel(QSortFilterProxyModel):
@@ -91,7 +93,6 @@ class IdentitiesTableModel(QAbstractTableModel):
         self.columns_ids = ('uid', 'pubkey', 'renewed', 'expiration')
         self.identities_data = []
         self._identities = []
-        self._refresh_slots = []
 
     def change_community(self, community):
         self.community = community
@@ -103,16 +104,19 @@ class IdentitiesTableModel(QAbstractTableModel):
         """
         return [i[1] for i in self.identities_data]
 
+    @asyncio.coroutine
     def identity_data(self, identity):
         try:
-            join_date = identity.get_join_date(self.community)
-            expiration_date = identity.get_expiration_date(self.community)
+            join_date = yield from identity.get_join_date(self.community)
+            expiration_date = yield from identity.get_expiration_date(self.community)
         except MembershipNotFoundError:
             join_date = None
             expiration_date = None
 
         return (identity.uid, identity.pubkey, join_date, expiration_date)
 
+    @asyncify
+    @asyncio.coroutine
     def refresh_identities(self, identities):
         """
         Change the identities to display
@@ -120,49 +124,15 @@ class IdentitiesTableModel(QAbstractTableModel):
         :param cutecoin.core.registry.IdentitiesRegistry identities: The new identities to display
         """
         logging.debug("Refresh {0} identities".format(len(identities)))
-
-        # We disconnect identities from their local slots
-        for (index, identity) in enumerate(self._identities):
-            identity.inner_data_changed.disconnect(self._refresh_slots[index])
-
         self.identities_data = []
         self._identities = []
-        self._refresh_slots = []
         self.beginResetModel()
         for identity in identities:
-            logging.debug(identity)
-
-            # Connection
-            refresh_slot = lambda req, identity=identity: self.refresh_identity(req, identity)
-            identity.inner_data_changed.connect(refresh_slot)
-
             self._identities.append(identity)
-            self._refresh_slots.append(refresh_slot)
-            self.identities_data.append(self.identity_data(identity))
+            data = yield from self.identity_data(identity)
+            self.identities_data.append(data)
         self.endResetModel()
 
-    def refresh_identity(self, request, identity):
-        """
-        Refresh an identity when its inner_data changed
-        :param cutecoin.core.registry.Identity identity: The refreshed identity
-        """
-        logging.debug("Refresh {0} because of {1}".format(identity, request))
-        try:
-            index = self._identities.index(identity)
-            self.identities_data[index] = self.identity_data(identity)
-            if request == str(qtbma.wot.Lookup):
-                model_index_0 = self.createIndex(index, self.columns_ids.index('uid'))
-                model_index_max = self.createIndex(index, self.columns_ids.index('pubkey'))
-                self.dataChanged.emit(model_index_0, model_index_max)
-            elif request in (str(qtbma.blockchain.Membership),
-                             str(qtbma.blockchain.Block),
-                             str(qtbma.blockchain.Parameters)):
-                model_index_0 = self.createIndex(index, self.columns_ids.index('renewed'))
-                model_index_max = self.createIndex(index, self.columns_ids.index('expiration'))
-                self.dataChanged.emit(model_index_0, model_index_max)
-        except ValueError:
-            logging.debug("Identity {0} is not in list : {1}".format(identity, self.identities_data))
-
     def rowCount(self, parent):
         return len(self.identities_data)
 
diff --git a/src/cutecoin/tests/gui/identities_tab/test_identities_table.py b/src/cutecoin/tests/gui/identities_tab/test_identities_table.py
index af35cb0c522661bb798e5d36563576cdbd0396b9..a5f582842e130c7a6817001c0ab68742eb9166a1 100644
--- a/src/cutecoin/tests/gui/identities_tab/test_identities_table.py
+++ b/src/cutecoin/tests/gui/identities_tab/test_identities_table.py
@@ -6,7 +6,7 @@ import logging
 import time
 from ucoinpy.documents.peer import BMAEndpoint as PyBMAEndpoint
 from PyQt5.QtWidgets import QDialog
-from PyQt5.QtCore import QLocale, Qt
+from PyQt5.QtCore import QLocale, Qt, QPoint
 from PyQt5.QtTest import QTest
 from cutecoin.core.net.api import bma as qtbma
 from cutecoin.tests.mocks.bma import nice_blockchain
@@ -75,10 +75,6 @@ class TestIdentitiesTable(unittest.TestCase):
             identities_tab.show()
             return future
 
-        @asyncio.coroutine
-        def async_open_widget():
-            yield from open_widget()
-
         def close_dialog():
             if identities_tab.isVisible():
                 identities_tab.close()
@@ -86,10 +82,12 @@ class TestIdentitiesTable(unittest.TestCase):
 
         @asyncio.coroutine
         def exec_test():
-            yield from asyncio.sleep(1)
-            self.assertEqual(mock.get_request(0).method, 'GET')
-            self.assertEqual(mock.get_request(0).url,
-                             '/wot/certifiers-of/7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ')
+            yield from asyncio.sleep(2)
+            urls = [mock.get_request(i).url for i in range(0, 3)]
+            self.assertTrue('/wot/certifiers-of/7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ' in urls,
+                            msg="Not found in {0}".format(urls))
+            self.assertTrue('/wot/certified-by/7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ' in urls,
+                            msg="Not found in {0}".format(urls))
 
             # requests 1 to 3 are for getting certifiers-of and certified-by
             # on john, + a lookup
@@ -97,15 +95,19 @@ class TestIdentitiesTable(unittest.TestCase):
             QTest.keyClicks(identities_tab.edit_textsearch, "doe")
             QTest.mouseClick(identities_tab.button_search, Qt.LeftButton)
             yield from asyncio.sleep(2)
+            self.assertEqual(mock.get_request(3).method, 'GET')
+            self.assertEqual(mock.get_request(3).url,
+                             '/wot/lookup/doe')
             self.assertEqual(mock.get_request(4).method, 'GET')
             self.assertEqual(mock.get_request(4).url,
-                             '/wot/lookup/doe')
+                             '/wot/certifiers-of/FADxcH5LmXGmGFgdixSes6nWnC4Vb4pRUBYT81zQRhjn')
             self.assertEqual(identities_tab.table_identities.model().rowCount(), 1)
+            yield from asyncio.sleep(2)
             self.lp.call_soon(close_dialog)
 
         asyncio.async(exec_test())
         self.lp.call_later(15, close_dialog)
-        self.lp.run_until_complete(async_open_widget())
+        self.lp.run_until_complete(open_widget())
         mock.delete_mock()
 
 if __name__ == '__main__':
diff --git a/src/cutecoin/tools/decorators.py b/src/cutecoin/tools/decorators.py
new file mode 100644
index 0000000000000000000000000000000000000000..1324e59f78cd01b90e6c2a5255ebc9a545096a8b
--- /dev/null
+++ b/src/cutecoin/tools/decorators.py
@@ -0,0 +1,10 @@
+import asyncio
+import functools
+
+
+def asyncify(fn):
+    @functools.wraps(fn)
+    def wrapper(*args, **kwargs):
+        asyncio.async(asyncio.coroutine(fn)(*args, **kwargs))
+
+    return wrapper