diff --git a/gen_resources.py b/gen_resources.py
index cfa45fd9918bf98dc408f1416efbc18a742419a0..b73cfa715e5bd3c4889ec59ed3c91df88195eaad 100644
--- a/gen_resources.py
+++ b/gen_resources.py
@@ -5,7 +5,7 @@ import sys, os, multiprocessing, subprocess
 
 sakia = os.path.abspath(os.path.join(os.path.dirname(__file__)))
 resources = os.path.abspath(os.path.join(os.path.dirname(__file__), 'res'))
-gen_ui = os.path.abspath(os.path.join(os.path.dirname(__file__), 'src', 'sakia', 'presentation'))
+gen_ui = os.path.abspath(os.path.join(os.path.dirname(__file__), 'src', 'sakia', 'gen_resources'))
 gen_resources = os.path.abspath(os.path.join(os.path.dirname(__file__), 'src'))
 
 def convert_ui(args, **kwargs):
diff --git a/res/ui/certifications_tab.ui b/res/ui/certifications_tab.ui
deleted file mode 100644
index b7e8eacfa6aa09ab59782740abc8f1bd5d9e91e4..0000000000000000000000000000000000000000
--- a/res/ui/certifications_tab.ui
+++ /dev/null
@@ -1,165 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>certificationsTabWidget</class>
- <widget class="QWidget" name="certificationsTabWidget">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>481</width>
-    <height>456</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Form</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QGroupBox" name="groupbox_balance">
-     <property name="title">
-      <string>Certifications</string>
-     </property>
-     <layout class="QVBoxLayout" name="verticalLayout_4">
-      <item>
-       <widget class="QLabel" name="label_resume">
-        <property name="font">
-         <font>
-          <pointsize>22</pointsize>
-          <weight>75</weight>
-          <bold>true</bold>
-         </font>
-        </property>
-        <property name="text">
-         <string>loading...</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>
-      <layout class="QHBoxLayout" name="horizontalLayout_2">
-       <property name="topMargin">
-        <number>5</number>
-       </property>
-       <item>
-        <widget class="QDateTimeEdit" name="date_from">
-         <property name="displayFormat">
-          <string>dd/MM/yyyy</string>
-         </property>
-         <property name="calendarPopup">
-          <bool>true</bool>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <widget class="QDateTimeEdit" name="date_to">
-         <property name="displayFormat">
-          <string>dd/MM/yyyy</string>
-         </property>
-         <property name="calendarPopup">
-          <bool>true</bool>
-         </property>
-        </widget>
-       </item>
-      </layout>
-     </item>
-     <item>
-      <widget class="QProgressBar" name="progressbar">
-       <property name="maximum">
-        <number>0</number>
-       </property>
-       <property name="value">
-        <number>-1</number>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QTableView" name="table_history">
-       <property name="contextMenuPolicy">
-        <enum>Qt::CustomContextMenu</enum>
-       </property>
-       <property name="alternatingRowColors">
-        <bool>true</bool>
-       </property>
-       <property name="showGrid">
-        <bool>true</bool>
-       </property>
-       <attribute name="horizontalHeaderShowSortIndicator" stdset="0">
-        <bool>true</bool>
-       </attribute>
-       <attribute name="horizontalHeaderStretchLastSection">
-        <bool>true</bool>
-       </attribute>
-       <attribute name="verticalHeaderVisible">
-        <bool>false</bool>
-       </attribute>
-      </widget>
-     </item>
-    </layout>
-   </item>
-  </layout>
- </widget>
- <resources>
-  <include location="../icons/icons.qrc"/>
- </resources>
- <connections>
-  <connection>
-   <sender>table_history</sender>
-   <signal>customContextMenuRequested(QPoint)</signal>
-   <receiver>certificationsTabWidget</receiver>
-   <slot>history_context_menu()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>273</x>
-     <y>183</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>830</x>
-     <y>802</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>date_from</sender>
-   <signal>dateChanged(QDate)</signal>
-   <receiver>certificationsTabWidget</receiver>
-   <slot>dates_changed()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>102</x>
-     <y>28</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>199</x>
-     <y>149</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>date_to</sender>
-   <signal>dateChanged(QDate)</signal>
-   <receiver>certificationsTabWidget</receiver>
-   <slot>dates_changed()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>297</x>
-     <y>28</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>199</x>
-     <y>149</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
- <slots>
-  <slot>history_context_menu()</slot>
-  <slot>dates_changed()</slot>
- </slots>
-</ui>
diff --git a/res/ui/community_cfg.ui b/res/ui/community_cfg.ui
deleted file mode 100644
index a31cb57384fab2f61fa4dd97c75d6246fb7e6217..0000000000000000000000000000000000000000
--- a/res/ui/community_cfg.ui
+++ /dev/null
@@ -1,333 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>CommunityConfigurationDialog</class>
- <widget class="QDialog" name="CommunityConfigurationDialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>400</width>
-    <height>317</height>
-   </rect>
-  </property>
-  <property name="contextMenuPolicy">
-   <enum>Qt::CustomContextMenu</enum>
-  </property>
-  <property name="windowTitle">
-   <string>Add a community</string>
-  </property>
-  <property name="modal">
-   <bool>true</bool>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QStackedWidget" name="stacked_pages">
-     <property name="currentIndex">
-      <number>0</number>
-     </property>
-     <widget class="QWidget" name="page_node">
-      <layout class="QVBoxLayout" name="verticalLayout_4">
-       <item>
-        <spacer name="verticalSpacer_2">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>20</width>
-           <height>40</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-       <item>
-        <widget class="QLabel" name="label">
-         <property name="text">
-          <string>Please enter the address of a node :</string>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <layout class="QHBoxLayout" name="horizontalLayout">
-         <property name="rightMargin">
-          <number>5</number>
-         </property>
-         <item>
-          <widget class="QLineEdit" name="lineedit_server"/>
-         </item>
-         <item>
-          <widget class="QLabel" name="label_double_dot">
-           <property name="text">
-            <string>:</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QSpinBox" name="spinbox_port">
-           <property name="maximum">
-            <number>65535</number>
-           </property>
-           <property name="value">
-            <number>8001</number>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </item>
-       <item>
-        <spacer name="verticalSpacer">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>20</width>
-           <height>40</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-       <item>
-        <layout class="QVBoxLayout" name="verticalLayout_5">
-         <property name="topMargin">
-          <number>6</number>
-         </property>
-         <item>
-          <widget class="QPushButton" name="button_register">
-           <property name="text">
-            <string>Register your account</string>
-           </property>
-           <property name="icon">
-            <iconset resource="../icons/icons.qrc">
-             <normaloff>:/icons/new_membership</normaloff>:/icons/new_membership</iconset>
-           </property>
-           <property name="iconSize">
-            <size>
-             <width>32</width>
-             <height>32</height>
-            </size>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QPushButton" name="button_connect">
-           <property name="text">
-            <string>Connect using your account</string>
-           </property>
-           <property name="icon">
-            <iconset resource="../icons/icons.qrc">
-             <normaloff>:/icons/connect_icon</normaloff>:/icons/connect_icon</iconset>
-           </property>
-           <property name="iconSize">
-            <size>
-             <width>32</width>
-             <height>32</height>
-            </size>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QPushButton" name="button_guest">
-           <property name="text">
-            <string>Connect as a guest</string>
-           </property>
-           <property name="icon">
-            <iconset resource="../icons/icons.qrc">
-             <normaloff>:/icons/guest_icon</normaloff>:/icons/guest_icon</iconset>
-           </property>
-           <property name="iconSize">
-            <size>
-             <width>32</width>
-             <height>32</height>
-            </size>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QLabel" name="label_error">
-           <property name="text">
-            <string/>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="page_add_nodes">
-      <layout class="QVBoxLayout" name="verticalLayout_2">
-       <item>
-        <widget class="QGroupBox" name="groupBox_2">
-         <property name="title">
-          <string>Communities nodes</string>
-         </property>
-         <layout class="QVBoxLayout" name="verticalLayout_3">
-          <item>
-           <widget class="QTreeView" name="tree_peers">
-            <property name="contextMenuPolicy">
-             <enum>Qt::CustomContextMenu</enum>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <layout class="QHBoxLayout" name="horizontalLayout_3">
-            <item>
-             <widget class="QLineEdit" name="lineedit_add_address">
-              <property name="text">
-               <string/>
-              </property>
-              <property name="placeholderText">
-               <string>Server</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QSpinBox" name="spinbox_add_port">
-              <property name="minimum">
-               <number>0</number>
-              </property>
-              <property name="maximum">
-               <number>65535</number>
-              </property>
-              <property name="singleStep">
-               <number>1</number>
-              </property>
-              <property name="value">
-               <number>8081</number>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QPushButton" name="button_add">
-              <property name="text">
-               <string>Add</string>
-              </property>
-             </widget>
-            </item>
-           </layout>
-          </item>
-         </layout>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-    </widget>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="layout_previous_next">
-     <item>
-      <widget class="QPushButton" name="button_previous">
-       <property name="enabled">
-        <bool>false</bool>
-       </property>
-       <property name="text">
-        <string>Previous</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <spacer name="horizontalSpacer_2">
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>40</width>
-         <height>20</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-     <item>
-      <widget class="QPushButton" name="button_next">
-       <property name="enabled">
-        <bool>true</bool>
-       </property>
-       <property name="text">
-        <string>Next</string>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-  </layout>
- </widget>
- <resources>
-  <include location="../icons/icons.qrc"/>
- </resources>
- <connections>
-  <connection>
-   <sender>button_add</sender>
-   <signal>clicked()</signal>
-   <receiver>CommunityConfigurationDialog</receiver>
-   <slot>add_node()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>337</x>
-     <y>236</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>199</x>
-     <y>149</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>tree_peers</sender>
-   <signal>customContextMenuRequested(QPoint)</signal>
-   <receiver>CommunityConfigurationDialog</receiver>
-   <slot>showContextMenu(QPoint)</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>199</x>
-     <y>128</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>199</x>
-     <y>149</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>button_next</sender>
-   <signal>clicked()</signal>
-   <receiver>CommunityConfigurationDialog</receiver>
-   <slot>next()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>349</x>
-     <y>278</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>199</x>
-     <y>149</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>button_previous</sender>
-   <signal>clicked()</signal>
-   <receiver>CommunityConfigurationDialog</receiver>
-   <slot>previous()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>49</x>
-     <y>278</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>199</x>
-     <y>149</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
- <slots>
-  <slot>add_node()</slot>
-  <slot>showContextMenu(QPoint)</slot>
-  <slot>check()</slot>
-  <slot>next()</slot>
-  <slot>previous()</slot>
-  <slot>current_wallet_changed(int)</slot>
-  <slot>remove_node()</slot>
- </slots>
-</ui>
diff --git a/res/ui/create_wallet.ui b/res/ui/create_wallet.ui
deleted file mode 100644
index 4a611d7a5caf318d910868867b3f63d65e2c6efb..0000000000000000000000000000000000000000
--- a/res/ui/create_wallet.ui
+++ /dev/null
@@ -1,169 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>CreateWalletDialog</class>
- <widget class="QDialog" name="CreateWalletDialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>400</width>
-    <height>234</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Create a new wallet</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <spacer name="verticalSpacer_2">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>1</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item>
-    <widget class="QStackedWidget" name="stacked_pages">
-     <property name="currentIndex">
-      <number>0</number>
-     </property>
-     <widget class="QWidget" name="page_wallet">
-      <layout class="QVBoxLayout" name="verticalLayout_3">
-       <item>
-        <layout class="QHBoxLayout" name="horizontalLayout">
-         <property name="topMargin">
-          <number>0</number>
-         </property>
-         <item>
-          <widget class="QLabel" name="label">
-           <property name="text">
-            <string>Wallet name :</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QLineEdit" name="edit_name"/>
-         </item>
-        </layout>
-       </item>
-      </layout>
-     </widget>
-    </widget>
-   </item>
-   <item>
-    <widget class="QLabel" name="label_error">
-     <property name="text">
-      <string/>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <spacer name="verticalSpacer_3">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>2</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="horizontalLayout_2">
-     <item>
-      <widget class="QPushButton" name="button_previous">
-       <property name="text">
-        <string>Previous</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <spacer name="horizontalSpacer">
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>40</width>
-         <height>20</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-     <item>
-      <widget class="QPushButton" name="button_next">
-       <property name="text">
-        <string>Next</string>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>edit_name</sender>
-   <signal>textChanged(QString)</signal>
-   <receiver>CreateWalletDialog</receiver>
-   <slot>check()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>238</x>
-     <y>91</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>199</x>
-     <y>116</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>button_next</sender>
-   <signal>clicked()</signal>
-   <receiver>CreateWalletDialog</receiver>
-   <slot>next()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>349</x>
-     <y>212</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>199</x>
-     <y>116</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>button_previous</sender>
-   <signal>clicked()</signal>
-   <receiver>CreateWalletDialog</receiver>
-   <slot>previous()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>49</x>
-     <y>212</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>199</x>
-     <y>116</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
- <slots>
-  <slot>open_import_key()</slot>
-  <slot>open_generate_key()</slot>
-  <slot>check()</slot>
-  <slot>next()</slot>
-  <slot>previous()</slot>
- </slots>
-</ui>
diff --git a/res/ui/currency_tab.ui b/res/ui/currency_tab.ui
deleted file mode 100644
index 96fb8c5971e30da25a72bb274cce7d4ad3b27974..0000000000000000000000000000000000000000
--- a/res/ui/currency_tab.ui
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>CurrencyTabWidget</class>
- <widget class="QWidget" name="CurrencyTabWidget">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>400</width>
-    <height>300</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Form</string>
-  </property>
-  <property name="windowIcon">
-   <iconset>
-    <normaloff>:/icons/noun_43022_cc.svg</normaloff>:/icons/noun_43022_cc.svg</iconset>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout_4">
-   <item>
-    <widget class="QFrame" name="actionsFrame">
-     <property name="frameShape">
-      <enum>QFrame::StyledPanel</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Raised</enum>
-     </property>
-     <layout class="QVBoxLayout" name="verticalLayout">
-      <item>
-       <widget class="QTabWidget" name="tabs_account">
-        <property name="currentIndex">
-         <number>-1</number>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources>
-  <include location="../icons/icons.qrc"/>
- </resources>
- <connections/>
- <slots>
-  <slot>refresh_wallet_content(QModelIndex)</slot>
-  <slot>wallet_context_menu(QPoint)</slot>
-  <slot>dates_changed(QDateTime)</slot>
-  <slot>history_context_menu(QPoint)</slot>
- </slots>
-</ui>
diff --git a/res/ui/node_manager.ui b/res/ui/node_manager.ui
deleted file mode 100644
index ef4041a7ec9580838728d1d3066eb14662b72d1f..0000000000000000000000000000000000000000
--- a/res/ui/node_manager.ui
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>NodeManager</class>
- <widget class="QDialog" name="NodeManager">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>1024</width>
-    <height>600</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Node manager</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QWidget" name="web_view" native="true"/>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/res/ui/wallets_tab.ui b/res/ui/wallets_tab.ui
deleted file mode 100644
index 16b4dd1c96d212b9773b06a202151676c417af27..0000000000000000000000000000000000000000
--- a/res/ui/wallets_tab.ui
+++ /dev/null
@@ -1,129 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>WalletsTab</class>
- <widget class="QWidget" name="WalletsTab">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>924</width>
-    <height>920</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Form</string>
-  </property>
-  <property name="styleSheet">
-   <string notr="true">QGroupBox {
-    border: 1px solid gray;
-    border-radius: 9px;
-    margin-top: 0.5em;
-}
-
-QGroupBox::title {
-    subcontrol-origin: margin;
-    left: 10px;
-    padding: 0 3px 0 3px;
-	font-weight: bold;
-}</string>
-  </property>
-  <layout class="QGridLayout" name="gridLayout">
-   <item row="0" column="0">
-    <widget class="QGroupBox" name="groupBox_2">
-     <property name="title">
-      <string>Balance</string>
-     </property>
-     <layout class="QVBoxLayout" name="verticalLayout_3">
-      <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>
-      <item>
-       <widget class="QLabel" name="label_balance_range">
-        <property name="text">
-         <string>label_balance_range</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignCenter</set>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item row="1" column="0">
-    <widget class="QTableView" name="table_wallets">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-       <horstretch>0</horstretch>
-       <verstretch>1</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="contextMenuPolicy">
-      <enum>Qt::CustomContextMenu</enum>
-     </property>
-     <property name="alternatingRowColors">
-      <bool>true</bool>
-     </property>
-     <property name="selectionMode">
-      <enum>QAbstractItemView::SingleSelection</enum>
-     </property>
-     <property name="selectionBehavior">
-      <enum>QAbstractItemView::SelectRows</enum>
-     </property>
-     <property name="sortingEnabled">
-      <bool>true</bool>
-     </property>
-     <attribute name="horizontalHeaderStretchLastSection">
-      <bool>true</bool>
-     </attribute>
-     <attribute name="verticalHeaderVisible">
-      <bool>false</bool>
-     </attribute>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources>
-  <include location="../icons/icons.qrc"/>
- </resources>
- <connections>
-  <connection>
-   <sender>table_wallets</sender>
-   <signal>customContextMenuRequested(QPoint)</signal>
-   <receiver>WalletsTab</receiver>
-   <slot>wallet_context_menu(QPoint)</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>199</x>
-     <y>346</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>199</x>
-     <y>225</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
- <slots>
-  <slot>wallet_context_menu(QPoint)</slot>
-  <slot>wallet_changed()</slot>
-  <slot>send_membership_demand()</slot>
-  <slot>send_membership_leaving()</slot>
-  <slot>revoke_uid()</slot>
-  <slot>publish_uid()</slot>
- </slots>
-</ui>
diff --git a/src/sakia/gui/dialogs/account_cfg/account.py b/src/sakia/gui/dialogs/account_cfg/account.py
deleted file mode 100644
index 023d726dcd8e33294a4dd74aae61443006f07c71..0000000000000000000000000000000000000000
--- a/src/sakia/gui/dialogs/account_cfg/account.py
+++ /dev/null
@@ -1,269 +0,0 @@
-"""
-Created on 6 mars 2014
-
-@author: inso
-"""
-import logging
-import asyncio
-from duniterpy.key import SigningKey
-from ..presentation.account_cfg_uic import Ui_AccountConfigurationDialog
-from ..gui.process_cfg_community import ProcessConfigureCommunity
-from ..gui.password_asker import PasswordAskerDialog, detect_non_printable
-from ..gui.widgets.dialogs import QAsyncMessageBox
-from ..models.communities import CommunitiesListModel
-from ..tools.exceptions import KeyAlreadyUsed, Error, NoPeerAvailable
-from ..tools.decorators import asyncify
-
-from PyQt5.QtWidgets import QDialog, QMessageBox
-from PyQt5.QtCore import QRegExp
-from PyQt5.QtGui import QRegExpValidator
-
-
-class Step():
-    def __init__(self, config_dialog, previous_step=None, next_step=None):
-        self.previous_step = previous_step
-        self.next_step = next_step
-        self.config_dialog = config_dialog
-
-
-class StepPageInit(Step):
-    """
-    First step when adding a community
-    """
-
-    def __init__(self, config_dialog):
-        super().__init__(config_dialog)
-
-    def is_valid(self):
-        if len(self.config_dialog.edit_account_name.text()) > 2:
-            return True
-        else:
-            return False
-
-    def process_next(self):
-        if self.config_dialog.account is None:
-            name = self.config_dialog.edit_account_name.text()
-            self.config_dialog.account = self.config_dialog.app.create_account(name)
-        else:
-            name = self.config_dialog.edit_account_name.text()
-            self.config_dialog.account.name = name
-
-    def display_page(self):
-        if self.config_dialog.account is not None:
-            self.config_dialog.edit_account_name.setText(self.config_dialog.account.name)
-            model = CommunitiesListModel(self.config_dialog.account)
-            self.config_dialog.list_communities.setModel(model)
-            self.config_dialog.password_asker = PasswordAskerDialog(self.config_dialog.account)
-
-        self.config_dialog.button_previous.setEnabled(False)
-        self.config_dialog.button_next.setEnabled(False)
-
-
-class StepPageKey(Step):
-    """
-    First step when adding a community
-    """
-
-    def __init__(self, config_dialog):
-        super().__init__(config_dialog)
-
-    def is_valid(self):
-        if self.config_dialog.app.preferences['expert_mode']:
-            return True
-
-        if len(self.config_dialog.edit_salt.text()) < 6:
-            self.config_dialog.label_info.setText(self.config_dialog.tr("Forbidden : salt is too short"))
-            return False
-
-        if len(self.config_dialog.edit_password.text()) < 6:
-            self.config_dialog.label_info.setText(self.config_dialog.tr("Forbidden : password is too short"))
-            return False
-
-        if detect_non_printable(self.config_dialog.edit_salt.text()):
-            self.config_dialog.label_info.setText(self.config_dialog.tr("Forbidden : Invalid characters in salt field"))
-            return False
-
-        if detect_non_printable(self.config_dialog.edit_password.text()):
-            self.config_dialog.label_info.setText(
-                self.config_dialog.tr("Forbidden : Invalid characters in password field"))
-            return False
-
-        if self.config_dialog.edit_password.text() != \
-                self.config_dialog.edit_password_repeat.text():
-            self.config_dialog.label_info.setText(self.config_dialog.tr("Error : passwords are different"))
-            return False
-
-        self.config_dialog.label_info.setText("")
-        return True
-
-    def process_next(self):
-        salt = self.config_dialog.edit_salt.text()
-        password = self.config_dialog.edit_password.text()
-        self.config_dialog.account.set_scrypt_infos(salt, password)
-        self.config_dialog.password_asker = PasswordAskerDialog(self.config_dialog.account)
-        model = CommunitiesListModel(self.config_dialog.account)
-        self.config_dialog.list_communities.setModel(model)
-
-    def display_page(self):
-        self.config_dialog.button_previous.setEnabled(False)
-        self.config_dialog.button_next.setEnabled(False)
-
-
-class StepPageCommunities(Step):
-    """
-    First step when adding a community
-    """
-
-    def __init__(self, config_dialog):
-        super().__init__(config_dialog)
-
-    def is_valid(self):
-        return True
-
-    def process_next(self):
-        password = self.config_dialog.password_asker.exec_()
-        if self.config_dialog.password_asker.result() == QDialog.Rejected:
-            return
-
-        self.config_dialog.app.add_account(self.config_dialog.account)
-        if len(self.config_dialog.app.accounts) == 1:
-            self.config_dialog.app.preferences['account'] = self.config_dialog.account.name
-        self.config_dialog.app.save(self.config_dialog.account)
-        self.config_dialog.app.change_current_account(self.config_dialog.account)
-
-    def display_page(self):
-        logging.debug("Communities DISPLAY")
-        self.config_dialog.button_previous.setEnabled(False)
-        self.config_dialog.button_next.setText("Ok")
-        list_model = CommunitiesListModel(self.config_dialog.account)
-        self.config_dialog.list_communities.setModel(list_model)
-
-
-class ProcessConfigureAccount(QDialog, Ui_AccountConfigurationDialog):
-    """
-    classdocs
-    """
-
-    def __init__(self, app, account):
-        """
-        Constructor
-        """
-        # Set up the user interface from Designer.
-        super().__init__()
-        self.setupUi(self)
-        regexp = QRegExp('[A-Za-z0-9_-]*')
-        validator = QRegExpValidator(regexp)
-        self.edit_account_name.setValidator(validator)
-        self.account = account
-        self.password_asker = None
-        self.app = app
-        step_init = StepPageInit(self)
-        step_key = StepPageKey(self)
-        step_communities = StepPageCommunities(self)
-        step_init.next_step = step_key
-        step_key.next_step = step_communities
-        self.step = step_init
-        self.step.display_page()
-        if self.account is None:
-            self.setWindowTitle(self.tr("New account"))
-            self.button_delete.hide()
-        else:
-            self.label_action.setText("Edit account uid")
-            self.edit_account_name.setPlaceholderText(self.account.name)
-            self.stacked_pages.removeWidget(self.stacked_pages.widget(1))
-            step_init.next_step = step_communities
-            self.button_next.setEnabled(True)
-            self.stacked_pages.currentWidget()
-
-            self.setWindowTitle(self.tr("Configure {0}".format(self.account.name)))
-
-    def open_process_add_community(self):
-        logging.debug("Opening configure community dialog")
-        logging.debug(self.password_asker)
-        dialog = ProcessConfigureCommunity(self.app,
-                                           self.account, None,
-                                           self.password_asker)
-        dialog.accepted.connect(self.action_add_community)
-        dialog.exec_()
-
-    def action_add_community(self):
-        logging.debug("Action add community : done")
-        self.list_communities.setModel(CommunitiesListModel(self.account))
-        self.button_next.setEnabled(True)
-        self.button_next.setText(self.tr("Ok"))
-
-    def action_remove_community(self):
-        for index in self.list_communities.selectedIndexes():
-            self.account.communities.pop(index.row())
-
-        self.list_communities.setModel(CommunitiesListModel(self.account))
-
-    def action_edit_community(self):
-        self.list_communities.setModel(CommunitiesListModel(self.account))
-
-    def action_edit_account_key(self):
-        self.button_generate.setEnabled(self.step.is_valid())
-        self.button_next.setEnabled(self.step.is_valid())
-
-    def action_show_pubkey(self):
-        salt = self.edit_salt.text()
-        password = self.edit_password.text()
-        pubkey = SigningKey(salt, password).pubkey
-        self.label_info.setText(pubkey)
-
-    def action_edit_account_parameters(self):
-        if self.step.is_valid():
-            self.button_next.setEnabled(True)
-        else:
-            self.button_next.setEnabled(False)
-
-    def open_process_edit_community(self, index):
-        community = self.account.communities[index.row()]
-        dialog = ProcessConfigureCommunity(self.app, self.account, community, self.password_asker)
-
-        dialog.accepted.connect(self.action_edit_community)
-        dialog.exec_()
-
-    @asyncify
-    async def action_delete_account(self, checked=False):
-        reply = await QAsyncMessageBox.question(self, self.tr("Warning"),
-                                     self.tr("""This action will delete your account ({0}) locally.
-Please note your key parameters (salt and password) if you wish to recover it later.
-Your account won't be removed from the networks it joined.
-Are you sure ?""").format(self.app.current_account.name))
-        if reply == QMessageBox.Yes:
-            account = self.app.current_account
-            await self.app.delete_account(account)
-            self.app.save(account)
-            self.accept()
-
-    def next(self):
-        if self.step.is_valid():
-            try:
-                self.step.process_next()
-                if self.step.next_step is not None:
-                    self.step = self.step.next_step
-                    next_index = self.stacked_pages.currentIndex() + 1
-                    self.stacked_pages.setCurrentIndex(next_index)
-                    self.step.display_page()
-                else:
-                    self.accept()
-            except Error as e:
-                QMessageBox.critical(self, self.tr("Error"),
-                                     str(e), QMessageBox.Ok)
-
-    def previous(self):
-        if self.step.previous_step is not None:
-            self.step = self.step.previous_step
-            previous_index = self.stacked_pages.currentIndex() - 1
-            self.stacked_pages.setCurrentIndex(previous_index)
-            self.step.display_page()
-
-    def async_exec(self):
-        future = asyncio.Future()
-        self.finished.connect(lambda r: future.set_result(r))
-        self.open()
-        return future
-
-    def accept(self):
-        super().accept()
diff --git a/src/sakia/gui/dialogs/community_cfg/process_cfg_community.py b/src/sakia/gui/dialogs/community_cfg/process_cfg_community.py
deleted file mode 100644
index 4f437e380c7ffba363b84030aab166dac87bbddd..0000000000000000000000000000000000000000
--- a/src/sakia/gui/dialogs/community_cfg/process_cfg_community.py
+++ /dev/null
@@ -1,321 +0,0 @@
-"""
-Created on 8 mars 2014
-
-@author: inso
-"""
-
-import logging
-import asyncio
-
-import aiohttp
-
-from duniterpy.api import errors
-from duniterpy.documents import MalformedDocumentError
-from PyQt5.QtWidgets import QDialog, QMenu, QApplication
-from PyQt5.QtGui import QCursor
-from PyQt5.QtCore import pyqtSignal, QObject
-
-from ..presentation.community_cfg_uic import Ui_CommunityConfigurationDialog
-from ..models.peering import PeeringTreeModel
-from ..core import Community
-from ..core.net import Node
-from .widgets import toast
-from .widgets.dialogs import QAsyncMessageBox
-from ..tools.decorators import asyncify
-from ..tools.exceptions import NoPeerAvailable
-
-
-class Step(QObject):
-    def __init__(self, config_dialog, previous_step=None, next_step=None):
-        super().__init__()
-        self.previous_step = previous_step
-        self.next_step = next_step
-        self.config_dialog = config_dialog
-
-
-class StepPageInit(Step):
-    """
-    First step when adding a community
-    """
-    def __init__(self, config_dialog):
-        super().__init__(config_dialog)
-        self.node = None
-        logging.debug("Init")
-        self.config_dialog.button_connect.clicked.connect(self.check_connect)
-        self.config_dialog.button_register.clicked.connect(self.check_register)
-        self.config_dialog.button_guest.clicked.connect(self.check_guest)
-
-    @property
-    def app(self):
-        return self.config_dialog.app
-
-    @property
-    def account(self):
-        return self.config_dialog.account
-
-    @property
-    def community(self):
-        return self.config_dialog.community
-
-    @property
-    def password_asker(self):
-        return self.config_dialog.password_asker
-
-    @asyncify
-    async def check_guest(self, checked=False):
-        server = self.config_dialog.lineedit_server.text()
-        port = self.config_dialog.spinbox_port.value()
-        logging.debug("Is valid ? ")
-        self.config_dialog.label_error.setText(self.tr("connecting..."))
-        try:
-            self.node = await Node.from_address(None, server, port, session=aiohttp.ClientSession())
-            community = Community.create(self.node)
-            self.config_dialog.button_connect.setEnabled(False)
-            self.config_dialog.button_register.setEnabled(False)
-            self.config_dialog.community = community
-            self.config_dialog.next()
-        except aiohttp.errors.DisconnectedError as e:
-            self.config_dialog.label_error.setText(str(e))
-        except aiohttp.errors.ClientError as e:
-            self.config_dialog.label_error.setText(str(e))
-        except (MalformedDocumentError, ValueError) as e:
-            self.config_dialog.label_error.setText(str(e))
-        except aiohttp.errors.TimeoutError:
-            self.config_dialog.label_error.setText(self.tr("Could not connect. Check hostname, ip address or port"))
-
-    @asyncify
-    async def check_connect(self, checked=False):
-        server = self.config_dialog.lineedit_server.text()
-        port = self.config_dialog.spinbox_port.value()
-        logging.debug("Is valid ? ")
-        self.config_dialog.label_error.setText(self.tr("connecting..."))
-        try:
-            self.node = await Node.from_address(None, server, port, session=aiohttp.ClientSession())
-            community = Community.create(self.node)
-            self.config_dialog.button_connect.setEnabled(False)
-            self.config_dialog.button_register.setEnabled(False)
-            registered = await self.account.check_registered(community)
-            self.config_dialog.button_connect.setEnabled(True)
-            self.config_dialog.button_register.setEnabled(True)
-            if registered[0] is False and registered[2] is None:
-                self.config_dialog.label_error.setText(self.tr("Could not find your identity on the network."))
-            elif registered[0] is False and registered[2]:
-                self.config_dialog.label_error.setText(self.tr("""Your pubkey or UID is different on the network.
-Yours : {0}, the network : {1}""".format(registered[1], registered[2])))
-            else:
-                self.config_dialog.community = community
-                self.config_dialog.next()
-        except aiohttp.errors.DisconnectedError as e:
-            self.config_dialog.label_error.setText(str(e))
-        except aiohttp.errors.ClientError as e:
-            self.config_dialog.label_error.setText(str(e))
-        except (MalformedDocumentError, ValueError) as e:
-            self.config_dialog.label_error.setText(str(e))
-        except NoPeerAvailable:
-            self.config_dialog.label_error.setText(self.tr("Could not connect. Check node peering entry"))
-        except aiohttp.errors.TimeoutError:
-            self.config_dialog.label_error.setText(self.tr("Could not connect. Check hostname, ip address or port"))
-
-    @asyncify
-    async def check_register(self, checked=False):
-        server = self.config_dialog.lineedit_server.text()
-        port = self.config_dialog.spinbox_port.value()
-        logging.debug("Is valid ? ")
-        self.config_dialog.label_error.setText(self.tr("connecting..."))
-        try:
-            session = aiohttp.ClientSession()
-            self.node = await Node.from_address(None, server, port, session=session)
-            community = Community.create(self.node)
-            self.config_dialog.button_connect.setEnabled(False)
-            self.config_dialog.button_register.setEnabled(False)
-            registered = await self.account.check_registered(community)
-            self.config_dialog.button_connect.setEnabled(True)
-            self.config_dialog.button_register.setEnabled(True)
-            if registered[0] is False and registered[2] is None:
-                password = await self.password_asker.async_exec()
-                if self.password_asker.result() == QDialog.Rejected:
-                    return
-                self.config_dialog.label_error.setText(self.tr("Broadcasting identity..."))
-                result = await self.account.send_selfcert(password, community)
-                if result[0]:
-                    if self.app.preferences['notifications']:
-                        toast.display(self.tr("UID broadcast"), self.tr("Identity broadcasted to the network"))
-                    QApplication.restoreOverrideCursor()
-                    self.config_dialog.next()
-                else:
-                    self.config_dialog.label_error.setText(self.tr("Error") + " " + \
-                                                           self.tr("{0}".format(result[1])))
-                    if self.app.preferences['notifications']:
-                        toast.display(self.tr("Error"), self.tr("{0}".format(result[1])))
-                QApplication.restoreOverrideCursor()
-                self.config_dialog.community = community
-            elif registered[0] is False and registered[2]:
-                self.config_dialog.label_error.setText(self.tr("""Your pubkey or UID was already found on the network.
-Yours : {0}, the network : {1}""".format(registered[1], registered[2])))
-            else:
-                self.config_dialog.label_error.setText(self.tr("Your account already exists on the network"))
-        except (MalformedDocumentError, ValueError, errors.DuniterError,
-                aiohttp.errors.ClientError, aiohttp.errors.DisconnectedError) as e:
-            session.close()
-            self.config_dialog.label_error.setText(str(e))
-        except NoPeerAvailable:
-            self.config_dialog.label_error.setText(self.tr("Could not connect. Check node peering entry"))
-        except aiohttp.errors.TimeoutError:
-            self.config_dialog.label_error.setText(self.tr("Could not connect. Check hostname, ip address or port"))
-
-    def is_valid(self):
-        return self.node is not None
-
-    def process_next(self):
-        """
-        We create the community
-        """
-        account = self.config_dialog.account
-        logging.debug("Account : {0}".format(account))
-        self.config_dialog.community = Community.create(self.node)
-
-    def display_page(self):
-        self.config_dialog.button_next.hide()
-        self.config_dialog.button_previous.hide()
-
-
-class StepPageAddpeers(Step):
-    """
-    The step where the user add peers
-    """
-    def __init__(self, config_dialog):
-        super().__init__(config_dialog)
-
-    def is_valid(self):
-        return True
-
-    def process_next(self):
-        pass
-
-    def display_page(self):
-        self.config_dialog.button_next.show()
-        self.config_dialog.button_previous.show()
-        # We add already known peers to the displayed list
-        self.config_dialog.nodes = self.config_dialog.community.network.root_nodes
-        tree_model = PeeringTreeModel(self.config_dialog.community)
-
-        self.config_dialog.tree_peers.setModel(tree_model)
-        self.config_dialog.button_previous.setEnabled(False)
-        self.config_dialog.button_next.setText(self.config_dialog.tr("Ok"))
-
-
-class ProcessConfigureCommunity(QDialog, Ui_CommunityConfigurationDialog):
-    """
-    Dialog to configure or add a community
-    """
-    community_added = pyqtSignal()
-
-    def __init__(self, app, account, community, password_asker):
-        """
-        Constructor
-
-        :param sakia.core.Application app: The application
-        :param sakia.core.Account account: The configured account
-        :param sakia.core.Community community: The configured community
-        :param sakia.gui.password_asker.Password_Asker password_asker: The password asker
-        """
-        super().__init__()
-        self.setupUi(self)
-        self.app = app
-        self.community = community
-        self.account = account
-        self.password_asker = password_asker
-        self.step = None
-        self.nodes = []
-
-        self.community_added.connect(self.add_community_and_close)
-        self._step_init = StepPageInit(self)
-        step_add_peers = StepPageAddpeers(self)
-
-        self._step_init.next_step = step_add_peers
-
-        if self.community is not None:
-            self.stacked_pages.removeWidget(self.page_node)
-            self.step = step_add_peers
-            self.setWindowTitle(self.tr("Configure community {0}").format(self.community.currency))
-        else:
-            self.step = self._step_init
-            self.setWindowTitle(self.tr("Add a community"))
-
-        self.step.display_page()
-
-    def next(self):
-        if self.step.next_step is not None:
-            if self.step.is_valid():
-                self.step.process_next()
-                self.step = self.step.next_step
-                next_index = self.stacked_pages.currentIndex() + 1
-                self.stacked_pages.setCurrentIndex(next_index)
-                self.step.display_page()
-        else:
-            self.add_community_and_close()
-
-    def previous(self):
-        if self.step.previous_step is not None:
-            self.step = self.step.previous_step
-            previous_index = self.stacked_pages.currentIndex() - 1
-            self.stacked_pages.setCurrentIndex(previous_index)
-            self.step.display_page()
-
-    async def start_add_node(self):
-        """
-        Add node slot
-        """
-        server = self.lineedit_add_address.text()
-        port = self.spinbox_add_port.value()
-
-        try:
-            node = await Node.from_address(self.community.currency, server, port, session=self.community.network.session)
-            self.community.add_node(node)
-        except Exception as e:
-            await QAsyncMessageBox.critical(self, self.tr("Error"),
-                                 str(e))
-        self.tree_peers.setModel(PeeringTreeModel(self.community))
-
-    def add_node(self):
-        asyncio.ensure_future(self.start_add_node())
-
-    def remove_node(self):
-        """
-        Remove node slot
-        """
-        logging.debug("Remove node")
-        index = self.sender().data()
-        self.community.remove_node(index)
-        self.tree_peers.setModel(PeeringTreeModel(self.community))
-
-    @property
-    def nb_steps(self):
-        s = self.step
-        nb_steps = 1
-        while s.next_step != None:
-            s = s.next_step
-            nb_steps = nb_steps + 1
-        return nb_steps
-
-    def showContextMenu(self, point):
-        if self.stacked_pages.currentIndex() == self.nb_steps - 1:
-            menu = QMenu()
-            index = self.tree_peers.indexAt(point)
-            action = menu.addAction(self.tr("Delete"), self.remove_node)
-            action.setData(index.row())
-            if self.community is not None:
-                if len(self.nodes) == 1:
-                    action.setEnabled(False)
-            menu.exec_(QCursor.pos())
-
-    def async_exec(self):
-        future = asyncio.Future()
-        self.finished.connect(lambda r: future.set_result(r))
-        self.open()
-        return future
-
-    def add_community_and_close(self):
-        if self.community not in self.account.communities:
-            self.account.add_community(self.community)
-        self.accept()
diff --git a/src/sakia/gui/node_manager.py b/src/sakia/gui/node_manager.py
deleted file mode 100644
index ffbe8067de8659fa33e933561c73b3589ca18e38..0000000000000000000000000000000000000000
--- a/src/sakia/gui/node_manager.py
+++ /dev/null
@@ -1,58 +0,0 @@
-import aiohttp
-
-from PyQt5.QtCore import QObject, QEvent, QUrl
-from PyQt5.QtWidgets import QDialog
-
-#from ..gen_resources.node_manager_uic import Ui_NodeManager
-from .widgets.dialogs import QAsyncMessageBox
-from ..tools.decorators import asyncify
-
-
-class NodeManager(QObject):
-    """
-    A widget showing informations about a member
-    """
-
-    def __init__(self, widget, ui):
-        """
-        Init MemberDialog
-
-        :param PyQt5.QtWidget widget: The class of the widget
-        :param sakia.presentation.member_uic.Ui_DialogMember ui: the class of the ui applyed to the widget
-        :return:
-        """
-        super().__init__()
-        self.widget = widget
-        self.ui = ui
-        self.ui.setupUi(self.widget)
-        self.widget.installEventFilter(self)
-
-    @classmethod
-    def create(cls, parent):
-        raise TypeError("Not implemented ( https://github.com/duniter/sakia/issues/399 )")
-        #dialog = cls(QDialog(parent), Ui_NodeManager())
-        #return dialog
-
-    @asyncify
-    async def open_home_page(self):
-        try:
-            with aiohttp.ClientSession() as session:
-                response = await session.get("http://127.0.0.1:9220")
-                if response.status == 200:
-                    self.ui.web_view.load(QUrl("http://127.0.0.1:9220"))
-                    self.ui.web_view.show()
-                    self.widget.show()
-                else:
-                    await QAsyncMessageBox.critical(self.widget, "Local node manager",
-                                            "Could not access to local node ui.")
-        except aiohttp.ClientError:
-            await QAsyncMessageBox.critical(self.widget, "Local node manager",
-                                      "Could not connect to node. Please make sure it's running.")
-
-    def eventFilter(self, source, event):
-        if event.type() == QEvent.Resize:
-            self.widget.resizeEvent(event)
-        return self.widget.eventFilter(source, event)
-
-    def exec(self):
-        self.widget.exec()
diff --git a/src/sakia/gui/process_cfg_community.py b/src/sakia/gui/process_cfg_community.py
deleted file mode 100644
index 4f437e380c7ffba363b84030aab166dac87bbddd..0000000000000000000000000000000000000000
--- a/src/sakia/gui/process_cfg_community.py
+++ /dev/null
@@ -1,321 +0,0 @@
-"""
-Created on 8 mars 2014
-
-@author: inso
-"""
-
-import logging
-import asyncio
-
-import aiohttp
-
-from duniterpy.api import errors
-from duniterpy.documents import MalformedDocumentError
-from PyQt5.QtWidgets import QDialog, QMenu, QApplication
-from PyQt5.QtGui import QCursor
-from PyQt5.QtCore import pyqtSignal, QObject
-
-from ..presentation.community_cfg_uic import Ui_CommunityConfigurationDialog
-from ..models.peering import PeeringTreeModel
-from ..core import Community
-from ..core.net import Node
-from .widgets import toast
-from .widgets.dialogs import QAsyncMessageBox
-from ..tools.decorators import asyncify
-from ..tools.exceptions import NoPeerAvailable
-
-
-class Step(QObject):
-    def __init__(self, config_dialog, previous_step=None, next_step=None):
-        super().__init__()
-        self.previous_step = previous_step
-        self.next_step = next_step
-        self.config_dialog = config_dialog
-
-
-class StepPageInit(Step):
-    """
-    First step when adding a community
-    """
-    def __init__(self, config_dialog):
-        super().__init__(config_dialog)
-        self.node = None
-        logging.debug("Init")
-        self.config_dialog.button_connect.clicked.connect(self.check_connect)
-        self.config_dialog.button_register.clicked.connect(self.check_register)
-        self.config_dialog.button_guest.clicked.connect(self.check_guest)
-
-    @property
-    def app(self):
-        return self.config_dialog.app
-
-    @property
-    def account(self):
-        return self.config_dialog.account
-
-    @property
-    def community(self):
-        return self.config_dialog.community
-
-    @property
-    def password_asker(self):
-        return self.config_dialog.password_asker
-
-    @asyncify
-    async def check_guest(self, checked=False):
-        server = self.config_dialog.lineedit_server.text()
-        port = self.config_dialog.spinbox_port.value()
-        logging.debug("Is valid ? ")
-        self.config_dialog.label_error.setText(self.tr("connecting..."))
-        try:
-            self.node = await Node.from_address(None, server, port, session=aiohttp.ClientSession())
-            community = Community.create(self.node)
-            self.config_dialog.button_connect.setEnabled(False)
-            self.config_dialog.button_register.setEnabled(False)
-            self.config_dialog.community = community
-            self.config_dialog.next()
-        except aiohttp.errors.DisconnectedError as e:
-            self.config_dialog.label_error.setText(str(e))
-        except aiohttp.errors.ClientError as e:
-            self.config_dialog.label_error.setText(str(e))
-        except (MalformedDocumentError, ValueError) as e:
-            self.config_dialog.label_error.setText(str(e))
-        except aiohttp.errors.TimeoutError:
-            self.config_dialog.label_error.setText(self.tr("Could not connect. Check hostname, ip address or port"))
-
-    @asyncify
-    async def check_connect(self, checked=False):
-        server = self.config_dialog.lineedit_server.text()
-        port = self.config_dialog.spinbox_port.value()
-        logging.debug("Is valid ? ")
-        self.config_dialog.label_error.setText(self.tr("connecting..."))
-        try:
-            self.node = await Node.from_address(None, server, port, session=aiohttp.ClientSession())
-            community = Community.create(self.node)
-            self.config_dialog.button_connect.setEnabled(False)
-            self.config_dialog.button_register.setEnabled(False)
-            registered = await self.account.check_registered(community)
-            self.config_dialog.button_connect.setEnabled(True)
-            self.config_dialog.button_register.setEnabled(True)
-            if registered[0] is False and registered[2] is None:
-                self.config_dialog.label_error.setText(self.tr("Could not find your identity on the network."))
-            elif registered[0] is False and registered[2]:
-                self.config_dialog.label_error.setText(self.tr("""Your pubkey or UID is different on the network.
-Yours : {0}, the network : {1}""".format(registered[1], registered[2])))
-            else:
-                self.config_dialog.community = community
-                self.config_dialog.next()
-        except aiohttp.errors.DisconnectedError as e:
-            self.config_dialog.label_error.setText(str(e))
-        except aiohttp.errors.ClientError as e:
-            self.config_dialog.label_error.setText(str(e))
-        except (MalformedDocumentError, ValueError) as e:
-            self.config_dialog.label_error.setText(str(e))
-        except NoPeerAvailable:
-            self.config_dialog.label_error.setText(self.tr("Could not connect. Check node peering entry"))
-        except aiohttp.errors.TimeoutError:
-            self.config_dialog.label_error.setText(self.tr("Could not connect. Check hostname, ip address or port"))
-
-    @asyncify
-    async def check_register(self, checked=False):
-        server = self.config_dialog.lineedit_server.text()
-        port = self.config_dialog.spinbox_port.value()
-        logging.debug("Is valid ? ")
-        self.config_dialog.label_error.setText(self.tr("connecting..."))
-        try:
-            session = aiohttp.ClientSession()
-            self.node = await Node.from_address(None, server, port, session=session)
-            community = Community.create(self.node)
-            self.config_dialog.button_connect.setEnabled(False)
-            self.config_dialog.button_register.setEnabled(False)
-            registered = await self.account.check_registered(community)
-            self.config_dialog.button_connect.setEnabled(True)
-            self.config_dialog.button_register.setEnabled(True)
-            if registered[0] is False and registered[2] is None:
-                password = await self.password_asker.async_exec()
-                if self.password_asker.result() == QDialog.Rejected:
-                    return
-                self.config_dialog.label_error.setText(self.tr("Broadcasting identity..."))
-                result = await self.account.send_selfcert(password, community)
-                if result[0]:
-                    if self.app.preferences['notifications']:
-                        toast.display(self.tr("UID broadcast"), self.tr("Identity broadcasted to the network"))
-                    QApplication.restoreOverrideCursor()
-                    self.config_dialog.next()
-                else:
-                    self.config_dialog.label_error.setText(self.tr("Error") + " " + \
-                                                           self.tr("{0}".format(result[1])))
-                    if self.app.preferences['notifications']:
-                        toast.display(self.tr("Error"), self.tr("{0}".format(result[1])))
-                QApplication.restoreOverrideCursor()
-                self.config_dialog.community = community
-            elif registered[0] is False and registered[2]:
-                self.config_dialog.label_error.setText(self.tr("""Your pubkey or UID was already found on the network.
-Yours : {0}, the network : {1}""".format(registered[1], registered[2])))
-            else:
-                self.config_dialog.label_error.setText(self.tr("Your account already exists on the network"))
-        except (MalformedDocumentError, ValueError, errors.DuniterError,
-                aiohttp.errors.ClientError, aiohttp.errors.DisconnectedError) as e:
-            session.close()
-            self.config_dialog.label_error.setText(str(e))
-        except NoPeerAvailable:
-            self.config_dialog.label_error.setText(self.tr("Could not connect. Check node peering entry"))
-        except aiohttp.errors.TimeoutError:
-            self.config_dialog.label_error.setText(self.tr("Could not connect. Check hostname, ip address or port"))
-
-    def is_valid(self):
-        return self.node is not None
-
-    def process_next(self):
-        """
-        We create the community
-        """
-        account = self.config_dialog.account
-        logging.debug("Account : {0}".format(account))
-        self.config_dialog.community = Community.create(self.node)
-
-    def display_page(self):
-        self.config_dialog.button_next.hide()
-        self.config_dialog.button_previous.hide()
-
-
-class StepPageAddpeers(Step):
-    """
-    The step where the user add peers
-    """
-    def __init__(self, config_dialog):
-        super().__init__(config_dialog)
-
-    def is_valid(self):
-        return True
-
-    def process_next(self):
-        pass
-
-    def display_page(self):
-        self.config_dialog.button_next.show()
-        self.config_dialog.button_previous.show()
-        # We add already known peers to the displayed list
-        self.config_dialog.nodes = self.config_dialog.community.network.root_nodes
-        tree_model = PeeringTreeModel(self.config_dialog.community)
-
-        self.config_dialog.tree_peers.setModel(tree_model)
-        self.config_dialog.button_previous.setEnabled(False)
-        self.config_dialog.button_next.setText(self.config_dialog.tr("Ok"))
-
-
-class ProcessConfigureCommunity(QDialog, Ui_CommunityConfigurationDialog):
-    """
-    Dialog to configure or add a community
-    """
-    community_added = pyqtSignal()
-
-    def __init__(self, app, account, community, password_asker):
-        """
-        Constructor
-
-        :param sakia.core.Application app: The application
-        :param sakia.core.Account account: The configured account
-        :param sakia.core.Community community: The configured community
-        :param sakia.gui.password_asker.Password_Asker password_asker: The password asker
-        """
-        super().__init__()
-        self.setupUi(self)
-        self.app = app
-        self.community = community
-        self.account = account
-        self.password_asker = password_asker
-        self.step = None
-        self.nodes = []
-
-        self.community_added.connect(self.add_community_and_close)
-        self._step_init = StepPageInit(self)
-        step_add_peers = StepPageAddpeers(self)
-
-        self._step_init.next_step = step_add_peers
-
-        if self.community is not None:
-            self.stacked_pages.removeWidget(self.page_node)
-            self.step = step_add_peers
-            self.setWindowTitle(self.tr("Configure community {0}").format(self.community.currency))
-        else:
-            self.step = self._step_init
-            self.setWindowTitle(self.tr("Add a community"))
-
-        self.step.display_page()
-
-    def next(self):
-        if self.step.next_step is not None:
-            if self.step.is_valid():
-                self.step.process_next()
-                self.step = self.step.next_step
-                next_index = self.stacked_pages.currentIndex() + 1
-                self.stacked_pages.setCurrentIndex(next_index)
-                self.step.display_page()
-        else:
-            self.add_community_and_close()
-
-    def previous(self):
-        if self.step.previous_step is not None:
-            self.step = self.step.previous_step
-            previous_index = self.stacked_pages.currentIndex() - 1
-            self.stacked_pages.setCurrentIndex(previous_index)
-            self.step.display_page()
-
-    async def start_add_node(self):
-        """
-        Add node slot
-        """
-        server = self.lineedit_add_address.text()
-        port = self.spinbox_add_port.value()
-
-        try:
-            node = await Node.from_address(self.community.currency, server, port, session=self.community.network.session)
-            self.community.add_node(node)
-        except Exception as e:
-            await QAsyncMessageBox.critical(self, self.tr("Error"),
-                                 str(e))
-        self.tree_peers.setModel(PeeringTreeModel(self.community))
-
-    def add_node(self):
-        asyncio.ensure_future(self.start_add_node())
-
-    def remove_node(self):
-        """
-        Remove node slot
-        """
-        logging.debug("Remove node")
-        index = self.sender().data()
-        self.community.remove_node(index)
-        self.tree_peers.setModel(PeeringTreeModel(self.community))
-
-    @property
-    def nb_steps(self):
-        s = self.step
-        nb_steps = 1
-        while s.next_step != None:
-            s = s.next_step
-            nb_steps = nb_steps + 1
-        return nb_steps
-
-    def showContextMenu(self, point):
-        if self.stacked_pages.currentIndex() == self.nb_steps - 1:
-            menu = QMenu()
-            index = self.tree_peers.indexAt(point)
-            action = menu.addAction(self.tr("Delete"), self.remove_node)
-            action.setData(index.row())
-            if self.community is not None:
-                if len(self.nodes) == 1:
-                    action.setEnabled(False)
-            menu.exec_(QCursor.pos())
-
-    def async_exec(self):
-        future = asyncio.Future()
-        self.finished.connect(lambda r: future.set_result(r))
-        self.open()
-        return future
-
-    def add_community_and_close(self):
-        if self.community not in self.account.communities:
-            self.account.add_community(self.community)
-        self.accept()