diff --git a/src/sakia/core/account.py b/src/sakia/core/account.py
index 66177805b5579c7de7d11270bfd77043e4881001..4af3477d7c9f8e44a78f44d30cee019fcf19754b 100644
--- a/src/sakia/core/account.py
+++ b/src/sakia/core/account.py
@@ -36,6 +36,7 @@ class Account(QObject):
     loading_finished = pyqtSignal(Community, list)
     wallets_changed = pyqtSignal()
     certification_accepted = pyqtSignal()
+    contacts_changed = pyqtSignal()
 
     def __init__(self, salt, pubkey, name, communities, wallets, contacts, identities_registry):
         """
@@ -155,6 +156,15 @@ class Account(QObject):
         if len(same_contact) > 0:
             raise ContactAlreadyExists(new_contact['name'], same_contact[0]['name'])
         self.contacts.append(new_contact)
+        self.contacts_changed.emit()
+
+    def edit_contact(self, index, new_data):
+        self.contacts[index] = new_data
+        self.contacts_changed.emit()
+
+    def remove_contact(self, contact):
+        self.contacts.remove(contact)
+        self.contacts_changed.emit()
 
     def add_community(self, community):
         """
diff --git a/src/sakia/gui/contact.py b/src/sakia/gui/contact.py
index 457a8002a3390f1818f9e9ca32e5c070b3d85b87..43ed578a94f1796be9abc7bc7031a7bae512f9d2 100644
--- a/src/sakia/gui/contact.py
+++ b/src/sakia/gui/contact.py
@@ -18,14 +18,14 @@ class ConfigureContactDialog(QDialog, Ui_ConfigureContactDialog):
     classdocs
     """
 
-    def __init__(self, account, parent=None, contact=None, index_edit=None):
+    def __init__(self, app, account, parent=None, contact=None, index_edit=None):
         """
         Constructor
         """
-        super().__init__()
+        super().__init__(parent)
         self.setupUi(self)
+        self.app = app
         self.account = account
-        self.main_window = parent
         self.index_edit = index_edit
         self.contact = contact
 
@@ -38,19 +38,19 @@ class ConfigureContactDialog(QDialog, Ui_ConfigureContactDialog):
             self.edit_pubkey.setText(self.contact['pubkey'])
 
     @classmethod
-    def from_identity(cls, parent, account, identity):
+    def from_identity(cls, app, parent, account, identity):
         contact = {
             'name': identity.uid,
             'pubkey': identity.pubkey
         }
-        return ConfigureContactDialog(account, parent, contact)
+        return ConfigureContactDialog(app, account, parent, contact)
 
     def accept(self):
         name = self.edit_name.text()
         pubkey = self.edit_pubkey.text()
         if self.index_edit is not None:
-            self.account.contacts[self.index_edit] = {'name': name,
-                          'pubkey': pubkey}
+            self.account.edit_contact(self.index_edit, {'name': name,
+                          'pubkey': pubkey})
             logging.debug(self.contact)
         else:
             try:
@@ -60,7 +60,7 @@ class ConfigureContactDialog(QDialog, Ui_ConfigureContactDialog):
                 QMessageBox.critical(self, self.tr("Contact already exists"),
                             str(e),
                             QMessageBox.Ok)
-        self.main_window.app.save(self.account)
+        self.app.save(self.account)
         super().accept()
 
     def name_edited(self, new_name):
diff --git a/src/sakia/gui/mainwindow.py b/src/sakia/gui/mainwindow.py
index 808ce45a8cd7eaae3ae479da77da5133e1d943eb..021e520d03927f4023bd9f8a83c66515be68332c 100644
--- a/src/sakia/gui/mainwindow.py
+++ b/src/sakia/gui/mainwindow.py
@@ -95,6 +95,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
         if self.app.current_account:
             self.password_asker = PasswordAskerDialog(self.app.current_account)
             self.community_view.change_account(self.app.current_account, self.password_asker)
+            self.app.current_account.contacts_changed.connect(self.refresh_contacts)
         self.refresh()
 
     @asyncify
@@ -143,21 +144,20 @@ class MainWindow(QMainWindow, Ui_MainWindow):
     @pyqtSlot()
     def delete_contact(self):
         contact = self.sender().data()
-        self.app.current_account.contacts.remove(contact)
-        self.refresh_contacts()
+        self.app.current_account.remove_contacts(contact)
 
     @pyqtSlot()
     def edit_contact(self):
         index = self.sender().data()
-        dialog = ConfigureContactDialog(self.app.current_account, self, None, index)
-        result = dialog.exec_()
-        if result == QDialog.Accepted:
-            self.window().refresh_contacts()
+        dialog = ConfigureContactDialog(self.app, self.app.current_account, self, None, index)
+        dialog.exec_()
 
     def action_change_account(self, account_name):
+        self.app.accounts.contacts_changed.disconnect(self.refresh_contacts)
         self.app.change_current_account(self.app.get_account(account_name))
         self.password_asker = PasswordAskerDialog(self.app.current_account)
         self.community_view.change_account(self.app.current_account, self.password_asker)
+        self.app.accounts.contacts_changed.connect(self.refresh_contacts)
         self.refresh()
 
     @pyqtSlot()
@@ -185,14 +185,12 @@ class MainWindow(QMainWindow, Ui_MainWindow):
                                      self.password_asker)
 
     def open_add_contact_dialog(self):
-        dialog = ConfigureContactDialog(self.app.current_account, self)
-        result = dialog.exec_()
-        if result == QDialog.Accepted:
-            self.window().refresh_contacts()
+        dialog = ConfigureContactDialog(self.app, self.app.current_account, self)
+        dialog.exec_()
 
     def open_preferences_dialog(self):
         dialog = PreferencesDialog(self.app)
-        result = dialog.exec_()
+        dialog.exec_()
 
     def open_about_popup(self):
         """
diff --git a/src/sakia/gui/widgets/context_menu.py b/src/sakia/gui/widgets/context_menu.py
index fc25841fa4ab1bee3b8136fb043b12850c206eb3..ed7d84ee494f311cd46cf1551b47783062121616 100644
--- a/src/sakia/gui/widgets/context_menu.py
+++ b/src/sakia/gui/widgets/context_menu.py
@@ -134,11 +134,8 @@ class ContextMenu(QObject):
         MemberDialog.open_dialog(self._app, self._account, self._community, identity)
 
     def add_as_contact(self, identity):
-        dialog = ConfigureContactDialog.from_identity( self.parent(), self._account, identity)
+        dialog = ConfigureContactDialog.from_identity(self._app, self.parent(), self._account, identity)
         dialog.exec_()
-        #TODO: Send signal from account to refresh contacts
-        # if result == QDialog.Accepted:
-        #    self.parent().window().refresh_contacts()
 
     @asyncify
     async def send_money(self, identity):