diff --git a/src/sakia/core/account.py b/src/sakia/core/account.py
index 5f3da1111c884bae0adc70afac6e1749b130521c..723205015cb31c8b56a72b69b387f752a1f2c545 100644
--- a/src/sakia/core/account.py
+++ b/src/sakia/core/account.py
@@ -8,6 +8,7 @@ from ucoinpy.documents import Membership, SelfCertification, Certification, Revo
 from ucoinpy.key import SigningKey
 from ucoinpy.api import bma
 from ucoinpy.api.bma import PROTOCOL_VERSION
+from ucoinpy.api import errors
 
 import logging
 import asyncio
@@ -386,8 +387,9 @@ class Account(QObject):
                     if data:
                         registered = parsers[request](data)
                     tries += 1
-                except ValueError as e:
-                    if '404' in str(e) or '400' in str(e):
+                except errors.UcoinError as e:
+                    if e.ucode in (errors.NO_MEMBER_MATCHING_PUB_OR_UID,
+                                   e.ucode == errors.NO_MATCHING_IDENTITY):
                         if request == bma.wot.CertifiersOf:
                             request = bma.wot.Lookup
                             tries = 0
@@ -431,9 +433,11 @@ class Account(QObject):
             block_data = await community.bma_access.simple_request(bma.blockchain.Current)
             signed_raw = "{0}{1}\n".format(block_data['raw'], block_data['signature'])
             block_uid = Block.from_signed_raw(signed_raw).blockUID
-        except ValueError as e:
-            if '404' in str(e):
+        except errors.UcoinError as e:
+            if e.ucode == errors.NO_CURRENT_BLOCK:
                 block_uid = BlockUID.empty()
+            else:
+                raise
         selfcert = SelfCertification(PROTOCOL_VERSION,
                                      community.currency,
                                      self.pubkey,
diff --git a/src/sakia/core/community.py b/src/sakia/core/community.py
index cf4ee97e5fc1e7063b967656b2ca733415e9bfc1..9b3fd3f6ab1bd932eac6d9c6c511abc9ae28979b 100644
--- a/src/sakia/core/community.py
+++ b/src/sakia/core/community.py
@@ -5,18 +5,14 @@ Created on 1 févr. 2014
 """
 
 import logging
-import hashlib
 import re
-import time
-import asyncio
 import math
 
-from PyQt5.QtCore import QObject, pyqtSignal
+from PyQt5.QtCore import QObject
 
 from ..tools.exceptions import NoPeerAvailable
 from .net.network import Network
-from ucoinpy.api import bma
-from ucoinpy.documents import Block, BlockUID
+from ucoinpy.api import bma, errors
 from .net.api.bma.access import BmaAccess
 
 
@@ -172,8 +168,8 @@ class Community(QObject):
                 return block
             else:
                 return None
-        except ValueError as e:
-            if '404' in str(e):
+        except errors.UcoinError as e:
+            if e.ucode == errors.BLOCK_NOT_FOUND:
                 logging.debug(str(e))
                 return None
         except NoPeerAvailable as e:
@@ -207,8 +203,8 @@ class Community(QObject):
             block = await self.bma_access.future_request(bma.blockchain.Block,
                                  req_args={'number': block_number})
             return block['membersCount']
-        except ValueError as e:
-            if '404' in e:
+        except errors.UcoinError as e:
+            if e.ucode == errors.BLOCK_NOT_FOUND:
                 return 0
         except NoPeerAvailable as e:
             logging.debug(str(e))
@@ -228,8 +224,8 @@ class Community(QObject):
             block = await self.bma_access.future_request(bma.blockchain.Block,
                                  req_args={'number': block_number})
             return block['medianTime']
-        except ValueError as e:
-            if '404' in str(e):
+        except errors.UcoinError as e:
+            if e.ucode == errors.BLOCK_NOT_FOUND:
                 return 0
         except NoPeerAvailable as e:
             logging.debug(str(e))
diff --git a/src/sakia/core/net/api/bma/access.py b/src/sakia/core/net/api/bma/access.py
index b4b95e2534beff5ca4f7ae41fd4b910095849b13..76c0249cbd2deb94ef29b8818b88a9564756f24e 100644
--- a/src/sakia/core/net/api/bma/access.py
+++ b/src/sakia/core/net/api/bma/access.py
@@ -1,5 +1,6 @@
 from PyQt5.QtCore import QObject, pyqtSlot
 from ucoinpy.api import bma
+from ucoinpy.api import errors
 from .....tools.exceptions import NoPeerAvailable
 from ..... import __version__
 import logging
@@ -240,11 +241,7 @@ class BmaAccess(QObject):
                     json_data = await req.get(**get_args, session=self._network.session)
                     self._update_cache(request, req_args, get_args, json_data)
                     return json_data
-                except ValueError as e:
-                    if '404' in str(e) or '400' in str(e):
-                        raise
-                    tries += 1
-                except (ClientError, ServerDisconnectedError, gaierror, asyncio.TimeoutError) as e:
+                except (ClientError, ServerDisconnectedError, gaierror, asyncio.TimeoutError, ValueError) as e:
                     tries += 1
                 #except jsonschema.ValidationError as e:
                 #    logging.debug(str(e))
@@ -272,11 +269,7 @@ class BmaAccess(QObject):
                 try:
                     json_data = await req.get(**get_args, session=self._network.session)
                     return json_data
-                except ValueError as e:
-                    if '404' in str(e) or '400' in str(e):
-                        raise
-                    tries += 1
-                except (ClientError, ServerDisconnectedError, gaierror, asyncio.TimeoutError) as e:
+                except (ClientError, ServerDisconnectedError, gaierror, asyncio.TimeoutError, ValueError) as e:
                     tries += 1
                 #except jsonschema.ValidationError as e:
                 #    logging.debug(str(e))
@@ -317,9 +310,6 @@ class BmaAccess(QObject):
         try:
             result = await asyncio.gather(*replies)
             return tuple(result)
-        except ValueError as e:
-            if '404' in str(e) or '400' in str(e):
-                raise
-        except (ClientError, ServerDisconnectedError, gaierror, asyncio.TimeoutError) as e:
+        except (ClientError, ServerDisconnectedError, gaierror, asyncio.TimeoutError, ValueError) as e:
             pass
         return ()
diff --git a/src/sakia/core/net/node.py b/src/sakia/core/net/node.py
index ae54e077c0615f73307f242eef0e63813308f26c..e79574c7d0a9e73ea872202c3fd02382c79a9d12 100644
--- a/src/sakia/core/net/node.py
+++ b/src/sakia/core/net/node.py
@@ -8,7 +8,7 @@ from ucoinpy.documents.peer import Peer, Endpoint, BMAEndpoint
 from ucoinpy.documents import Block, BlockUID, MalformedDocumentError
 from ...tools.exceptions import InvalidNodeCurrency
 from ...tools.decorators import asyncify
-from ucoinpy.api import bma as bma
+from ucoinpy.api import bma, errors
 from ucoinpy.api.bma import ConnectionHandler
 
 from aiohttp.errors import WSClientDisconnectedError, WSServerHandshakeError, ClientResponseError
@@ -364,10 +364,7 @@ class Node(QObject):
                             break
                         elif msg.tp == aiohttp.MsgType.error:
                             break
-            except ValueError as e:
-                logging.debug("Websocket block {0} : {1} - {2}".format(type(e).__name__, str(e), self.pubkey[:5]))
-                await self.request_current_block()
-            except (WSServerHandshakeError, WSClientDisconnectedError, ClientResponseError) as e:
+            except (WSServerHandshakeError, WSClientDisconnectedError, ClientResponseError, ValueError) as e:
                 logging.debug("Websocket block {0} : {1} - {2}".format(type(e).__name__, str(e), self.pubkey[:5]))
                 await self.request_current_block()
             except (ClientError, gaierror, TimeoutError, DisconnectedError) as e:
@@ -390,8 +387,8 @@ class Node(QObject):
             conn_handler = self.endpoint.conn_handler()
             block_data = await bma.blockchain.Current(conn_handler).get(self._session)
             await self.refresh_block(block_data)
-        except ValueError as e:
-            if '404' in str(e):
+        except errors.UcoinError as e:
+            if e.ucode == errors.BLOCK_NOT_FOUND:
                 self.main_chain_previous_block = None
                 self.set_block(None)
             else:
@@ -399,7 +396,7 @@ class Node(QObject):
             logging.debug("Error in block reply :  {0}".format(self.pubkey[:5]))
             logging.debug(str(e))
             self.changed.emit()
-        except (ClientError, gaierror, TimeoutError, DisconnectedError) as e:
+        except (ClientError, gaierror, TimeoutError, DisconnectedError, ValueError) as e:
             logging.debug("{0} : {1}".format(str(e), self.pubkey[:5]))
             self.state = Node.OFFLINE
         except jsonschema.ValidationError as e:
@@ -423,15 +420,15 @@ class Node(QObject):
                 if self.block:
                     self.main_chain_previous_block = await bma.blockchain.Block(conn_handler,
                                                                                  self.block['number']).get(self._session)
-            except ValueError as e:
-                if '404' in str(e):
+            except errors.UcoinError as e:
+                if e.ucode == errors.BLOCK_NOT_FOUND:
                     self.main_chain_previous_block = None
                 else:
                     self.state = Node.OFFLINE
                 logging.debug("Error in previous block reply :  {0}".format(self.pubkey[:5]))
                 logging.debug(str(e))
                 self.changed.emit()
-            except (ClientError, gaierror, TimeoutError, DisconnectedError) as e:
+            except (ClientError, gaierror, TimeoutError, DisconnectedError, ValueError) as e:
                 logging.debug("{0} : {1}".format(str(e), self.pubkey[:5]))
                 self.state = Node.OFFLINE
             except jsonschema.ValidationError as e:
@@ -471,11 +468,12 @@ class Node(QObject):
                 logging.debug("Change : new state corrupted")
                 self.changed.emit()
 
-        except ValueError as e:
-            logging.debug("Error in peering reply : {0}".format(str(e)))
-            self.state = Node.OFFLINE
-            self.changed.emit()
-        except (ClientError, gaierror, TimeoutError, DisconnectedError) as e:
+        except errors.UcoinError as e:
+            if e.ucode == errors.PEER_NOT_FOUND:
+                logging.debug("Error in peering reply : {0}".format(str(e)))
+                self.state = Node.OFFLINE
+                self.changed.emit()
+        except (ClientError, gaierror, TimeoutError, DisconnectedError, ValueError) as e:
             logging.debug("{0} : {1}".format(type(e).__name__, self.pubkey[:5]))
             self.state = Node.OFFLINE
         except jsonschema.ValidationError as e:
@@ -499,11 +497,7 @@ class Node(QObject):
                 self.fork_window = summary_data["ucoin"]["forkWindowSize"]
             else:
                 self.fork_window = 0
-        except ValueError as e:
-            logging.debug("Error in summary : {0}".format(e))
-            self.state = Node.OFFLINE
-            self.changed.emit()
-        except (ClientError, gaierror, TimeoutError, DisconnectedError) as e:
+        except (ClientError, gaierror, TimeoutError, DisconnectedError, ValueError) as e:
             logging.debug("{0} : {1}".format(type(e).__name__, self.pubkey[:5]))
             self.state = Node.OFFLINE
         except jsonschema.ValidationError as e:
@@ -532,14 +526,14 @@ class Node(QObject):
             if self._uid != uid:
                 self._uid = uid
                 self.identity_changed.emit()
-        except ValueError as e:
-            if '404' in str(e):
+        except errors.UcoinError as e:
+            if e.ucode == errors.NO_MATCHING_IDENTITY:
                 logging.debug("UID not found : {0}".format(self.pubkey[:5]))
             else:
                 logging.debug("error in uid reply : {0}".format(self.pubkey[:5]))
                 self.state = Node.OFFLINE
                 self.identity_changed.emit()
-        except (ClientError, gaierror, TimeoutError, DisconnectedError) as e:
+        except (ClientError, gaierror, TimeoutError, DisconnectedError, ValueError) as e:
             logging.debug("{0} : {1}".format(type(e).__name__, self.pubkey[:5]))
             self.state = Node.OFFLINE
         except jsonschema.ValidationError as e:
@@ -569,10 +563,7 @@ class Node(QObject):
                             break
                         elif msg.tp == aiohttp.MsgType.error:
                             break
-            except ValueError as e:
-                logging.debug("Websocket peer {0} : {1} - {2}".format(type(e).__name__, str(e), self.pubkey[:5]))
-                await self.request_peers()
-            except (WSServerHandshakeError, WSClientDisconnectedError, ClientResponseError) as e:
+            except (WSServerHandshakeError, WSClientDisconnectedError, ClientResponseError, ValueError) as e:
                 logging.debug("Websocket peer {0} : {1} - {2}".format(type(e).__name__, str(e), self.pubkey[:5]))
                 await self.request_peers()
             except (ClientError, gaierror, TimeoutError, DisconnectedError) as e:
@@ -603,7 +594,7 @@ class Node(QObject):
                         leaf_data = await bma.network.peering.Peers(conn_handler).get(leaf=leaf_hash,
                                                                                       session=self._session)
                         self.refresh_peer_data(leaf_data['leaf']['value'])
-                    except (AttributeError, ValueError) as e:
+                    except (AttributeError, ValueError, errors.UcoinError) as e:
                         logging.debug("{pubkey} : Incorrect peer data in {leaf}".format(pubkey=self.pubkey[:5],
                                                                                         leaf=leaf_hash))
                         self.state = Node.OFFLINE
@@ -617,10 +608,11 @@ class Node(QObject):
                         self.state = Node.CORRUPTED
                 self._last_merkle = {'root' : peers_data['root'],
                                      'leaves': peers_data['leaves']}
-        except ValueError as e:
-            logging.debug("Error in peers reply")
-            self.state = Node.OFFLINE
-            self.changed.emit()
+        except errors.UcoinError as e:
+            if e.ucode == errors.PEER_NOT_FOUND:
+                logging.debug("Error in peers reply")
+                self.state = Node.OFFLINE
+                self.changed.emit()
         except (ClientError, gaierror, TimeoutError, DisconnectedError) as e:
             logging.debug("{0} : {1}".format(type(e).__name__, self.pubkey))
             self.state = Node.OFFLINE
diff --git a/src/sakia/core/registry/identities.py b/src/sakia/core/registry/identities.py
index b0125279744dfad71127a8bc2fcf10de711e7343..864b2bf5f55508a4fcad46327951b867bbdec8de 100644
--- a/src/sakia/core/registry/identities.py
+++ b/src/sakia/core/registry/identities.py
@@ -1,4 +1,4 @@
-from ucoinpy.api import bma
+from ucoinpy.api import bma, errors
 from ucoinpy.documents import BlockUID
 from .identity import Identity, LocalState, BlockchainState
 from pkg_resources import parse_version
@@ -80,8 +80,9 @@ class IdentitiesRegistry:
                                 identity.local_state = LocalState.PARTIAL
                                 timestamp = identity.sigdate
                 return identity
-            except ValueError:
-                lookup_tries += 1
+            except errors.UcoinError as e:
+                if e.ucode == errors.NO_MATCHING_IDENTITY:
+                    lookup_tries += 1
             except asyncio.TimeoutError:
                 lookup_tries += 1
             except ClientError:
@@ -112,8 +113,8 @@ class IdentitiesRegistry:
                     identity.sigdate = BlockUID.from_str(data['sigDate'])
                     identity.local_state = LocalState.PARTIAL
                     identity.blockchain_state = BlockchainState.VALIDATED
-                except ValueError as e:
-                    if '404' in str(e) or '400' in str(e):
+                except errors.UcoinError as e:
+                    if errors.NO_MEMBER_MATCHING_PUB_OR_UID:
                         identity = await self._find_by_lookup(pubkey, community)
                         return identity
                     else:
diff --git a/src/sakia/core/registry/identity.py b/src/sakia/core/registry/identity.py
index 1393f73784764391a7d01c5315a1402e7ec11785..c98176dc7853b026ce5e4fb7ea4e313ca8949605 100644
--- a/src/sakia/core/registry/identity.py
+++ b/src/sakia/core/registry/identity.py
@@ -10,7 +10,7 @@ from enum import Enum
 from pkg_resources import parse_version
 
 from ucoinpy.documents import BlockUID, SelfCertification, MalformedDocumentError
-from ucoinpy.api import bma as bma
+from ucoinpy.api import bma, errors
 from ucoinpy.api.bma import PROTOCOL_VERSION
 
 from ...tools.exceptions import Error, NoPeerAvailable,\
@@ -142,8 +142,8 @@ class Identity(QObject):
                                              uid,
                                              timestamp,
                                              signature)
-        except ValueError as e:
-            if '404' in str(e):
+        except errors.UcoinError as e:
+            if e.ucode == errors.NO_MATCHING_IDENTITY:
                 raise LookupFailureError(self.pubkey, community)
         except MalformedDocumentError:
             raise LookupFailureError(self.pubkey, community)
@@ -166,8 +166,8 @@ class Identity(QObject):
                 block = await community.bma_access.future_request(bma.blockchain.Block,
                                 req_args={'number': membership_data['blockNumber']})
                 return block['medianTime']
-        except ValueError as e:
-            if '404' in str(e) or '400' in str(e):
+        except errors.UcoinError as e:
+            if e.ucode == errors.NO_MEMBER_MATCHING_PUB_OR_UID:
                 raise MembershipNotFoundError(self.pubkey, community.name)
         except NoPeerAvailable as e:
             logging.debug(str(e))
@@ -186,7 +186,7 @@ class Identity(QObject):
                 expiration_date = join_date + parameters['sigValidity']
             except NoPeerAvailable:
                 expiration_date = None
-            except ValueError as e:
+            except errors.UcoinError as e:
                 logging.debug("Expiration date not found")
                 expiration_date = None
         except MembershipNotFoundError:
@@ -222,8 +222,8 @@ class Identity(QObject):
             else:
                 raise MembershipNotFoundError(self.pubkey, community.name)
 
-        except ValueError as e:
-            if '404' in str(e) or '400' in str(e):
+        except errors.UcoinError as e:
+            if e.ucode == errors.NO_MEMBER_MATCHING_PUB_OR_UID:
                 raise MembershipNotFoundError(self.pubkey, community.name)
         except NoPeerAvailable as e:
             logging.debug(str(e))
@@ -245,9 +245,9 @@ class Identity(QObject):
                             person_uid = uid_data["uid"]
                         if person_uid == self.uid:
                             return True
-        except ValueError as e:
-            if '404' in str(e):
-                return False
+        except errors.UcoinError as e:
+            if e.ucode in (errors.NO_MATCHING_IDENTITY):
+                logging.debug("Lookup error : {0}".format(str(e)))
         except NoPeerAvailable as e:
             logging.debug(str(e))
         return False
@@ -258,9 +258,9 @@ class Identity(QObject):
             try:
                 await community.bma_access.future_request(bma.wot.CertifiersOf,
                                                                {'search': self.pubkey})
-            except ValueError as e:
-                if '404' in str(e) or '400' in str(e):
-                    return True
+            except errors.UcoinError as e:
+                if e.ucode in (errors.NO_MATCHING_IDENTITY, errors.NO_MEMBER_MATCHING_PUB_OR_UID):
+                    logging.debug("Certifiers of error : {0}".format(str(e)))
         return False
 
     async def is_member(self, community):
@@ -274,8 +274,8 @@ class Identity(QObject):
             certifiers = await community.bma_access.future_request(bma.wot.CertifiersOf,
                                                                         {'search': self.pubkey})
             return certifiers['isMember']
-        except ValueError as e:
-            if '404' in str(e) or '400' in str(e):
+        except errors.UcoinError as e:
+            if e.ucode in (errors.NO_MATCHING_IDENTITY, errors.NO_MEMBER_MATCHING_PUB_OR_UID):
                 pass
             else:
                 raise
@@ -311,9 +311,9 @@ class Identity(QObject):
                     certifier['block_number'] = None
 
                 certifiers.append(certifier)
-        except ValueError as e:
-            if '404' in str(e):
-                logging.debug('bma.wot.CertifiersOf request error')
+        except errors.UcoinError as e:
+            if e.ucode in (errors.NO_MATCHING_IDENTITY, errors.NO_MEMBER_MATCHING_PUB_OR_UID):
+                logging.debug("Certifiers of error : {0}".format(str(e)))
             else:
                 logging.debug(str(e))
         except NoPeerAvailable as e:
@@ -341,8 +341,9 @@ class Identity(QObject):
                                 certifier['block_number'] = None
 
                                 certifiers.append(certifier)
-        except ValueError as e:
-            logging.debug("Lookup error : {0}".format(str(e)))
+        except errors.UcoinError as e:
+            if e.ucode in (errors.NO_MATCHING_IDENTITY, errors.NO_MEMBER_MATCHING_PUB_OR_UID):
+                logging.debug("Lookup error : {0}".format(str(e)))
         except NoPeerAvailable as e:
             logging.debug(str(e))
         return certifiers
@@ -402,9 +403,9 @@ class Identity(QObject):
                 else:
                     certified['block_number'] = None
                 certified_list.append(certified)
-        except ValueError as e:
-            if '404' in str(e):
-                logging.debug('bma.wot.CertifiedBy request error')
+        except errors.UcoinError as e:
+            if e.ucode in (errors.NO_MATCHING_IDENTITY, errors.NO_MEMBER_MATCHING_PUB_OR_UID):
+                logging.debug("Certified by error : {0}".format(str(e)))
         except NoPeerAvailable as e:
             logging.debug(str(e))
 
@@ -423,9 +424,9 @@ class Identity(QObject):
                         certified['cert_time'] = None
                         certified['block_number'] = None
                         certified_list.append(certified)
-        except ValueError as e:
-            if '404' in str(e):
-                logging.debug('bma.wot.Lookup request error')
+        except errors.UcoinError as e:
+            if e.ucode in (errors.NO_MATCHING_IDENTITY, errors.NO_MEMBER_MATCHING_PUB_OR_UID):
+                logging.debug("Lookup error : {0}".format(str(e)))
         except NoPeerAvailable as e:
             logging.debug(str(e))
         return certified_list
@@ -488,7 +489,7 @@ class Identity(QObject):
         if len(certified) > 0:
             latest_time = max([c['cert_time'] for c in certified])
             parameters = await community.parameters()
-            if parameters:
+            if parameters and latest_time:
                 current_time = time.time()
                 if current_time - latest_time < parameters['sigPeriod']:
                     return parameters['sigPeriod'] - (current_time - latest_time)
diff --git a/src/sakia/core/txhistory.py b/src/sakia/core/txhistory.py
index aa862d486464832d74a213310e8501542b5e7d7d..67f36b3a4142cc84a1d412d6d1d4f49b6f2635ac 100644
--- a/src/sakia/core/txhistory.py
+++ b/src/sakia/core/txhistory.py
@@ -3,7 +3,7 @@ import logging
 import hashlib
 from ucoinpy.documents.transaction import SimpleTransaction
 from ucoinpy.documents.block import Block
-from ucoinpy.api import  bma
+from ucoinpy.api import  bma, errors
 from .transfer import Transfer, TransferState
 from .net.network import MAX_CONFIRMATIONS
 from ..tools.exceptions import LookupFailureError, NoPeerAvailable
@@ -110,8 +110,8 @@ class TxHistory():
                     logging.debug("Error in {0}".format(number))
                     block = None
                     tries += 1
-            except ValueError as e:
-                if '404' in str(e):
+            except errors.UcoinError as e:
+                if e.ucode == errors.BLOCK_NOT_FOUND:
                     block = None
                     tries += 1
         return block_doc
@@ -237,8 +237,8 @@ class TxHistory():
                     if d['block_number'] < parsed_block:
                         dividends.remove(d)
                 return dividends
-            except ValueError as e:
-                if '404' in str(e):
+            except errors.UcoinError as e:
+                if e.ucode == errors.BLOCK_NOT_FOUND:
                     pass
         return {}
 
@@ -379,8 +379,9 @@ class TxHistory():
                     logging.debug("Starts a new refresh")
                     task = asyncio.ensure_future(self._refresh(community, block_from, current_block, received_list))
                     self._running_refresh.append(task)
-        except ValueError as e:
-            logging.debug("Block not found")
+        except errors.UcoinError as e:
+            if e.ucode == errors.BLOCK_NOT_FOUND:
+                logging.debug("Block not found")
         except NoPeerAvailable:
             logging.debug("No peer available")
 
diff --git a/src/sakia/gui/certification.py b/src/sakia/gui/certification.py
index 63cb6f30a7731319bf245a6ceaf5ea35957d770a..2bdb1db3e1d0ba099d327fdb893f30d35583c518 100644
--- a/src/sakia/gui/certification.py
+++ b/src/sakia/gui/certification.py
@@ -5,18 +5,16 @@ Created on 24 dec. 2014
 """
 import asyncio
 import logging
-
+from ucoinpy.api import errors
 from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QApplication, QMessageBox
-
 from PyQt5.QtCore import Qt, QObject, QLocale, QDateTime
 
-from ..gen_resources.certification_uic import Ui_CertificationDialog
 from .widgets import toast
 from .widgets.dialogs import QAsyncMessageBox
 from .member import MemberDialog
 from ..tools.decorators import asyncify, once_at_a_time
 from ..tools.exceptions import NoPeerAvailable
-
+from ..gen_resources.certification_uic import Ui_CertificationDialog
 
 class CertificationDialog(QObject):
     """
@@ -181,8 +179,8 @@ class CertificationDialog(QObject):
         is_member = await account_identity.is_member(self.community)
         try:
             block_0 = await self.community.get_block(0)
-        except ValueError as e:
-            if '404' in str(e) or '000' in str(e):
+        except errors.UcoinError as e:
+            if e.ucode == errors.BLOCK_NOT_FOUND:
                 block_0 = None
         except NoPeerAvailable as e:
             logging.debug(str(e))
diff --git a/src/sakia/gui/community_tile.py b/src/sakia/gui/community_tile.py
index d7a8bcaedd00d5ae992b8371a38fd3aed2eb38e5..08ec8cba28937c39272a3fcdb671511ccbe14855 100644
--- a/src/sakia/gui/community_tile.py
+++ b/src/sakia/gui/community_tile.py
@@ -2,12 +2,12 @@
 @author: inso
 """
 
-import asyncio
 import enum
 
 from PyQt5.QtWidgets import QFrame, QLabel, QVBoxLayout, QLayout
 from PyQt5.QtCore import QSize, pyqtSignal
 from ucoinpy.documents.block import Block
+from ucoinpy.api import errors
 
 from ..tools.decorators import asyncify, once_at_a_time, cancel_once_task
 from ..tools.exceptions import NoPeerAvailable
@@ -130,8 +130,8 @@ background-color: palette(base);
                               message=self.tr("Not connected"))
             self.text_label.setText(description)
             self._state = CommunityState.OFFLINE
-        except ValueError as e:
-            if '404' in str(e):
+        except errors.UcoinError as e:
+            if e.ucode == errors.BLOCK_NOT_FOUND:
                 description = """<html>
                 <body>
                 <p>
diff --git a/src/sakia/gui/community_view.py b/src/sakia/gui/community_view.py
index 88d8de5f0fda92c39be8cfaefceac704616c1b20..102c6eec8aee64a9d359fb1b9569245e3a289b61 100644
--- a/src/sakia/gui/community_view.py
+++ b/src/sakia/gui/community_view.py
@@ -6,7 +6,7 @@ Created on 2 févr. 2014
 
 import logging
 import time
-
+from ucoinpy.api import errors
 from PyQt5.QtCore import pyqtSlot, QDateTime, QLocale, QEvent, QT_TRANSLATE_NOOP, Qt
 from PyQt5.QtGui import QIcon, QPixmap
 from PyQt5.QtWidgets import QWidget, QMessageBox, QDialog, QPushButton, QTabBar, QAction
@@ -241,8 +241,9 @@ class CommunityWidget(QWidget, Ui_CommunityWidget):
                 except NoPeerAvailable as e:
                     logging.debug(str(e))
                     text += " ( ### ) "
-                except ValueError as e:
-                    logging.debug(str(e))
+                except errors.UcoinError as e:
+                    if e.ucode == errors.BLOCK_NOT_FOUND:
+                        logging.debug(str(e))
 
             if len(self.community.network.synced_nodes) == 0:
                 self.button_membership.setEnabled(False)
diff --git a/src/sakia/gui/identities_tab.py b/src/sakia/gui/identities_tab.py
index a3be7ad03025d83c27b10e48e753ba0b93208830..a5e73ff868c2eb5e8469130df1031257e0bdfd77 100644
--- a/src/sakia/gui/identities_tab.py
+++ b/src/sakia/gui/identities_tab.py
@@ -10,7 +10,7 @@ from PyQt5.QtCore import Qt, pyqtSignal, QEvent, QT_TRANSLATE_NOOP, QObject
 from PyQt5.QtGui import QCursor
 from PyQt5.QtWidgets import QWidget, QAction, QMenu, QDialog, \
                             QAbstractItemView
-from ucoinpy.api import bma
+from ucoinpy.api import bma, errors
 from ucoinpy.documents import BlockUID
 
 from ..models.identities import IdentitiesFilterProxyModel, IdentitiesTableModel
@@ -133,7 +133,10 @@ class IdentitiesTabWidget(QObject):
             self.ui.edit_textsearch.clear()
             self.ui.edit_textsearch.setPlaceholderText(text)
             await self.refresh_identities(identities)
-        except ValueError as e:
+        except errors.UcoinError as e:
+            if e.ucode == errors.BLOCK_NOT_FOUND:
+                logging.debug(str(e))
+        except NoPeerAvailable as e:
             logging.debug(str(e))
         finally:
             self.ui.busy.hide()
diff --git a/src/sakia/gui/process_cfg_community.py b/src/sakia/gui/process_cfg_community.py
index d7b0b44172bf19f4b7bf8a011b9b8de0629b452b..b924e04075bea4cb99da7a55d4b2ec98af72b5c6 100644
--- a/src/sakia/gui/process_cfg_community.py
+++ b/src/sakia/gui/process_cfg_community.py
@@ -8,7 +8,7 @@ import logging
 import asyncio
 import aiohttp
 
-from ucoinpy.api.bma import UcoinError
+from ucoinpy.api import errors
 from ucoinpy.documents import MalformedDocumentError
 from PyQt5.QtWidgets import QDialog, QMenu, QApplication
 from PyQt5.QtGui import QCursor
@@ -106,6 +106,8 @@ Yours : {0}, the network : {1}""".format(registered[1], registered[2])))
             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"))
 
     @asyncify
     async def check_register(self, checked=False):
@@ -144,7 +146,7 @@ Yours : {0}, the network : {1}""".format(registered[1], registered[2])))
 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, UcoinError,
+        except (MalformedDocumentError, ValueError, errors.UcoinError,
                 aiohttp.errors.ClientError, aiohttp.errors.DisconnectedError) as e:
             session.close()
             self.config_dialog.label_error.setText(str(e))
diff --git a/src/sakia/gui/transactions_tab.py b/src/sakia/gui/transactions_tab.py
index 5c7892a00b07c23df681cb3a60edc1cbaf883cfb..8fdf12a6fe086e85c4af1e873c2c848372c85279 100644
--- a/src/sakia/gui/transactions_tab.py
+++ b/src/sakia/gui/transactions_tab.py
@@ -1,6 +1,6 @@
 import logging
-import asyncio
 
+from ucoinpy.api import errors
 from PyQt5.QtWidgets import QWidget, QAbstractItemView, QHeaderView
 from PyQt5.QtCore import Qt, QObject, QDateTime, QTime, QModelIndex, pyqtSignal, pyqtSlot, QEvent
 from PyQt5.QtGui import QCursor
@@ -106,7 +106,7 @@ class TransactionsTabWidget(QObject):
             self.ui.date_to.setMaximumDateTime(tomorrow_datetime)
         except NoPeerAvailable as e:
             logging.debug(str(e))
-        except ValueError as e:
+        except errors.UcoinError as e:
             logging.debug(str(e))
 
     def refresh(self):
diff --git a/src/sakia/gui/widgets/search_user.py b/src/sakia/gui/widgets/search_user.py
index e93b906e39abfcfd01d07b1a66651055ef9beaba..2fb326cdcc8f2e4c0556a6545c71694df93c76d9 100644
--- a/src/sakia/gui/widgets/search_user.py
+++ b/src/sakia/gui/widgets/search_user.py
@@ -3,7 +3,7 @@ import logging
 from PyQt5.QtCore import QEvent, pyqtSignal, QT_TRANSLATE_NOOP, Qt
 from PyQt5.QtWidgets import QComboBox, QWidget
 
-from ucoinpy.api import bma
+from ucoinpy.api import bma, errors
 
 from ...tools.decorators import asyncify
 from ...tools.exceptions import NoPeerAvailable
@@ -81,8 +81,8 @@ class SearchUserWidget(QWidget, Ui_SearchUserWidget):
                     self.combobox_search.addItem(uid)
                 self.blockSignals(False)
                 self.combobox_search.showPopup()
-        except ValueError as e:
-            if '404' in str(e):
+        except errors.UcoinError as e:
+            if e.ucode == errors.NO_MATCHING_IDENTITY:
                 self.nodes = list()
                 self.blockSignals(True)
                 self.combobox_search.clear()
diff --git a/src/sakia/tests/functional/process_cfg_community/test_add_community.py b/src/sakia/tests/functional/process_cfg_community/test_add_community.py
index 92287575241237542f2d312078fb7600d1dcbf4c..a2acd3ec1ae4fb1bff3bea924483abb78418f378 100644
--- a/src/sakia/tests/functional/process_cfg_community/test_add_community.py
+++ b/src/sakia/tests/functional/process_cfg_community/test_add_community.py
@@ -74,17 +74,17 @@ class ProcessAddCommunity(unittest.TestCase, QuamashTest):
             await asyncio.sleep(5)
             self.assertEqual(mock.get_request(5).method, 'GET')
             self.assertEqual(mock.get_request(5).url,
-                             '/wot/lookup/john')
-            for i in range(6, 8):
+                             '/wot/certifiers-of/john')
+            for i in range(6, 9):
                 self.assertEqual(mock.get_request(i).method, 'GET')
                 self.assertEqual(mock.get_request(i).url,
                                  '/wot/lookup/john')
 
-            self.assertEqual(mock.get_request(8).url, '/blockchain/current')
-            self.assertEqual(mock.get_request(8).method, 'GET')
+            self.assertEqual(mock.get_request(9).url, '/blockchain/current')
+            self.assertEqual(mock.get_request(9).method, 'GET')
 
-            self.assertEqual(mock.get_request(9).url[:8], '/wot/add')
-            self.assertEqual(mock.get_request(9).method, 'POST')
+            self.assertEqual(mock.get_request(10).url[:8], '/wot/add')
+            self.assertEqual(mock.get_request(10).method, 'POST')
             self.assertEqual(process_community.label_error.text(), "Broadcasting identity...")
             await asyncio.sleep(1)
 
@@ -175,7 +175,7 @@ class ProcessAddCommunity(unittest.TestCase, QuamashTest):
             self.assertEqual(mock.get_request(0).url, '/network/peering')
             self.assertEqual(mock.get_request(1).method, 'GET')
             self.assertEqual(mock.get_request(1).url,
-                             '/wot/lookup/john')
+                             '/wot/certifiers-of/wrong_pubkey')
             self.assertEqual(process_community.label_error.text(), """Your pubkey or UID is different on the network.
 Yours : wrong_pubkey, the network : 7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ""")
             process_community.close()
diff --git a/src/sakia/tests/mocks/bma/init_new_community.py b/src/sakia/tests/mocks/bma/init_new_community.py
index 81f34691fbc2f53c6a30a42d7085dd2e98a77fa5..ef4cf44ea565eb40390b05163b517551545d50a8 100644
--- a/src/sakia/tests/mocks/bma/init_new_community.py
+++ b/src/sakia/tests/mocks/bma/init_new_community.py
@@ -1,4 +1,5 @@
 from ..server import MockServer
+from ucoinpy.api import errors
 
 bma_lookup_test_john = {
     "partial": False,
@@ -91,12 +92,15 @@ def get_mock(loop):
 
     mock.add_route('GET', '/blockchain/parameters', bma_parameters, 200)
 
-    mock.add_route('GET', '/blockchain/block/0', {"message": "Block not found"}, 404)
+    mock.add_route('GET', '/blockchain/block/0', {'ucode': errors.BLOCK_NOT_FOUND,
+                                                  "message": "Block not found"}, 404)
 
-    mock.add_route('GET', '/blockchain/current', {'message': "Block not found"}, 404)
+    mock.add_route('GET', '/blockchain/current', {'ucode': errors.NO_CURRENT_BLOCK,
+                                                  'message': "Block not found"}, 404)
 
     mock.add_route('GET', '/wot/certifiers-of/7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ',
-                   {'message': "No member matching this pubkey or uid"}, 404)
+                   {'ucode': errors.NO_MEMBER_MATCHING_PUB_OR_UID,
+                    'message': "No member matching this pubkey or uid"}, 404)
 
     mock.add_route('GET', '/wot/lookup/john', bma_lookup_test_john, 200)
 
diff --git a/src/sakia/tests/mocks/bma/new_blockchain.py b/src/sakia/tests/mocks/bma/new_blockchain.py
index b1496cdb54f0b769f893d8caecf69e2276c01e62..34fcca1099dfcd90f04c90be2f3bd28ad22d8e87 100644
--- a/src/sakia/tests/mocks/bma/new_blockchain.py
+++ b/src/sakia/tests/mocks/bma/new_blockchain.py
@@ -1,5 +1,5 @@
 from ..server import MockServer
-
+from ucoinpy.api import errors
 
 bma_wot_add = {
   "pubkey": "7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ",
@@ -43,21 +43,33 @@ def get_mock(loop):
 
     mock.add_route('GET', '/blockchain/parameters', bma_parameters, 200)
 
-    mock.add_route('GET', '/blockchain/block/0', {'message': "Block not found"}, 404)
+    mock.add_route('GET', '/blockchain/block/0', {'ucode': errors.BLOCK_NOT_FOUND,
+                                                  'message': "Block not found"}, 404)
 
-    mock.add_route('GET', '/blockchain/current', {'message': "Block not found"}, 404)
+    mock.add_route('GET', '/blockchain/current', {'ucode': errors.NO_CURRENT_BLOCK,
+                                                  'message': "Block not found"}, 404)
 
     mock.add_route('GET', '/wot/certifiers-of/7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ',
-                   {'message': "No member matching this pubkey or uid"}, 404)
+                   {'ucode': errors.NO_MEMBER_MATCHING_PUB_OR_UID,
+                    'message': "No member matching this pubkey or uid"}, 404)
 
     mock.add_route('GET', '/wot/lookup/7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ',
-                   {'message': "No member matching this pubkey or uid"}, 404)
+                   {'ucode': errors.NO_MATCHING_IDENTITY,
+                    'message': "No member matching this pubkey or uid"}, 404)
 
     mock.add_route('GET', '/wot/lookup/john',
-                   {'message': "No member matching this pubkey or uid"}, 404)
+                   {'ucode': errors.NO_MATCHING_IDENTITY,
+                    'message': "No member matching this pubkey or uid"}, 404)
+
+    mock.add_route('GET', '/wot/certifiers-of/john',
+                   {'ucode': errors.NO_MEMBER_MATCHING_PUB_OR_UID, 'message': "No member matching this pubkey or uid"}, 404)
 
     mock.add_route('GET', '/wot/lookup/doe',
-                   {'message': "No member matching this pubkey or uid"}, 404)
+                   {'ucode': errors.NO_MATCHING_IDENTITY,
+                    'message': "No member matching this pubkey or uid"}, 404)
+
+    mock.add_route('GET', '/wot/certifiers-of/doe',
+                   {'ucode': errors.NO_MEMBER_MATCHING_PUB_OR_UID, 'message': "No member matching this pubkey or uid"}, 404)
 
     mock.add_route('POST', '/wot/add', bma_wot_add, 200)
 
diff --git a/src/sakia/tests/mocks/bma/nice_blockchain.py b/src/sakia/tests/mocks/bma/nice_blockchain.py
index ea4b198df93b817d3b27a53631546214ba2978d9..9b34498a62ec973c271eca171c37f24b6df35333 100644
--- a/src/sakia/tests/mocks/bma/nice_blockchain.py
+++ b/src/sakia/tests/mocks/bma/nice_blockchain.py
@@ -1,4 +1,5 @@
 from ..server import MockServer
+from ucoinpy.api import errors
 
 bma_lookup_john = {
     "partial": False,
@@ -480,6 +481,9 @@ def get_mock(loop):
 
     mock.add_route('GET', '/ud/history/7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ', bma_udhistory_john, 200)
 
+    mock.add_route('GET', '/wot/certifiers-of/john', bma_certifiers_of_john,
+                   200)
+
     mock.add_route('GET', '/wot/certifiers-of/7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ', bma_certifiers_of_john,
                    200)
 
@@ -496,11 +500,23 @@ def get_mock(loop):
     mock.add_route('GET', '/blockchain/memberships/7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ', bma_membership_john,
                    200)
 
+    mock.add_route('GET', '/wot/lookup/wrong_pubkey',
+                   {'ucode': errors.NO_MATCHING_IDENTITY, 'message': "No member matching this pubkey or uid"}, 404)
+
+    mock.add_route('GET', '/wot/certifiers-of/wrong_pubkey',
+                   {'ucode': errors.NO_MEMBER_MATCHING_PUB_OR_UID, 'message': "No member matching this pubkey or uid"}, 404)
+
+    mock.add_route('GET', '/wot/lookup/wrong_uid',
+                   {'ucode': errors.NO_MATCHING_IDENTITY, 'message': "No member matching this pubkey or uid"}, 404)
+
+    mock.add_route('GET', '/wot/certifiers-of/wrong_uid',
+                   {'ucode': errors.NO_MEMBER_MATCHING_PUB_OR_UID, 'message': "No member matching this pubkey or uid"}, 404)
+
     mock.add_route('GET', '/wot/certifiers-of/FADxcH5LmXGmGFgdixSes6nWnC4Vb4pRUBYT81zQRhjn',
-                   {'error': "No member matching this pubkey or uid"}, 404)
+                   {'ucode': errors.NO_MEMBER_MATCHING_PUB_OR_UID, 'message': "No member matching this pubkey or uid"}, 404)
 
     mock.add_route('GET', '/blockchain/memberships/FADxcH5LmXGmGFgdixSes6nWnC4Vb4pRUBYT81zQRhjn',
-                   {'error': "No member matching this pubkey or uid"}, 404)
+                   {'ucode': errors.NO_MEMBER_MATCHING_PUB_OR_UID, 'message': "No member matching this pubkey or uid"}, 404)
 
     mock.add_route('POST', '/tx/process', {}, 200, )
 
diff --git a/src/sakia/tests/unit/core/test_network.py b/src/sakia/tests/unit/core/test_network.py
index 575e880168f58bbfb77140da9c6a4f55c86b189c..c312f5fa6f9667b16fc7f6ed3ed5d856d8fe3bad 100644
--- a/src/sakia/tests/unit/core/test_network.py
+++ b/src/sakia/tests/unit/core/test_network.py
@@ -15,12 +15,3 @@ class TestCommunity(unittest.TestCase, QuamashTest):
 
     def tearDown(self):
         self.tearDownQuamash()
-
-    def test_confirmations(self):
-        network = Network("test_currency", [], Mock("aiohttp.ClientSession"))
-        Network.current_blockUID = PropertyMock(return_value=BlockUID(1000, "fbf9271d0df23ee03044795aebca8be06dd7f998".upper()))
-
-        self.assertEqual(network.confirmations(996), 5)
-        self.assertEqual(network.confirmations(900), 101)
-        with self.assertRaises(ValueError):
-            network.confirmations(1002)