diff --git a/tests/api/bma/test_blockchain.py b/tests/api/bma/test_blockchain.py
index a4c3b41d9ed1ac66b195466e9006ce08b2ac46cd..dd509f79f5d89f0a62e06adfa1d991510ddcf5ba 100644
--- a/tests/api/bma/test_blockchain.py
+++ b/tests/api/bma/test_blockchain.py
@@ -1,37 +1,39 @@
 import unittest
+
 import jsonschema
-import aiohttp
-from tests.api.webserver import WebFunctionalSetupMixin, web, asyncio
-from duniterpy.documents import BMAEndpoint
-from duniterpy.api.bma.blockchain import API, parameters, block, current, hardship, memberships, newcomers, \
-    certifications, joiners, actives, leavers, ud, tx, blocks, \
-    BLOCK_NUMBERS_SCHEMA, BLOCK_SCHEMA, BLOCKS_SCHEMA, HARDSHIP_SCHEMA, MEMBERSHIPS_SCHEMA, PARAMETERS_SCHEMA
+
+from duniterpy.api.bma.blockchain import parameters, block, current, hardship, memberships, newcomers, \
+    certifications, joiners, actives, leavers, ud, tx, BLOCK_NUMBERS_SCHEMA, BLOCK_SCHEMA, BLOCKS_SCHEMA, \
+    HARDSHIP_SCHEMA, MEMBERSHIPS_SCHEMA, PARAMETERS_SCHEMA
+from duniterpy.api.client import Client
+from duniterpy.api.endpoint import BMAEndpoint
+from tests.api.webserver import WebFunctionalSetupMixin, web
 
 
-class Test_BMA_blockchain(WebFunctionalSetupMixin, unittest.TestCase):
+class TestBmaBlockchain(WebFunctionalSetupMixin, unittest.TestCase):
     def test_parameters(self):
         json_sample = {
-                          "currency": "g1",
-                          "c": 0.0488,
-                          "dt": 86400,
-                          "ud0": 1000,
-                          "sigPeriod": 432000,
-                          "sigStock": 100,
-                          "sigWindow": 5259600,
-                          "sigValidity": 63115200,
-                          "sigQty": 5,
-                          "idtyWindow": 5259600,
-                          "msWindow": 5259600,
-                          "xpercent": 0.8,
-                          "msValidity": 31557600,
-                          "stepMax": 5,
-                          "medianTimeBlocks": 24,
-                          "avgGenTime": 300,
-                          "dtDiffEval": 12,
-                          "percentRot": 0.67,
-                          "udTime0": 1488970800,
-                          "udReevalTime0": 1490094000,
-                          "dtReeval": 15778800
+            "currency": "g1",
+            "c": 0.0488,
+            "dt": 86400,
+            "ud0": 1000,
+            "sigPeriod": 432000,
+            "sigStock": 100,
+            "sigWindow": 5259600,
+            "sigValidity": 63115200,
+            "sigQty": 5,
+            "idtyWindow": 5259600,
+            "msWindow": 5259600,
+            "xpercent": 0.8,
+            "msValidity": 31557600,
+            "stepMax": 5,
+            "medianTimeBlocks": 24,
+            "avgGenTime": 300,
+            "dtDiffEval": 12,
+            "percentRot": 0.67,
+            "udTime0": 1488970800,
+            "udReevalTime0": 1490094000,
+            "dtReeval": 15778800
         }
         jsonschema.validate(json_sample, PARAMETERS_SCHEMA)
 
@@ -43,65 +45,158 @@ class Test_BMA_blockchain(WebFunctionalSetupMixin, unittest.TestCase):
         async def go():
             _, port, url = await self.create_server('GET', '/blockchain/parameters', handler)
             with self.assertRaises(jsonschema.exceptions.ValidationError):
-                async with aiohttp.ClientSession() as session:
-                    connection = BMAEndpoint("127.0.0.1", None, None, port).conn_handler(session)
-                    await parameters(connection)
+                client = Client(BMAEndpoint("127.0.0.1", "", "", port))
+                await client(parameters)
+            await client.close()
 
         self.loop.run_until_complete(go())
 
     def test_schema_block_0(self):
         json_sample = {
-  "version": 2,
-  "nonce": 10144,
-  "number": 0,
-  "powMin": 3,
-  "time": 1421838980,
-  "medianTime": 1421838980,
-  "membersCount": 4,
-  "monetaryMass": 0,
-  "currency": "meta_brouzouf",
-  "issuer": "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk",
-  "signature": "+78w7251vvRdhoIJ6IWHEiEOLxNrmfQf45Y5sYvPdnAdXkVpO1unMV5YA/G5Vhphyz1dICrbeKCPM5qbFsoWAQ==",
-  "hash": "00063EB6E83F8717CEF1D25B3E2EE308374A14B1",
-  "inner_hash": "00063EB6E83F8717CEF1D25B3E2EE308374A14B1",
-  "parameters": "0.1:86400:100:604800:2629800:3:3:2629800:3:11:600:20:144:0.67",
-  "previousHash": None,
-  "previousIssuer": None,
-  "dividend": None,
-  "membersChanges": [],
-  "identities": [
-    "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:Ot3zIp/nsHT3zgJy+2YcXPL6vaM5WFsD+F8w3qnJoBRuBG6lv761zoaExp2iyUnm8fDAyKPpMxRK2kf437QSCw==:1421787800:inso",
-    "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:GZKLgaxJKL+GqxVLePMt8OVLJ6qTLrib5Mr/j2gjiNRY2k485YLB2OlzhBzZVnD3xLs0xi69JUfmLnM54j3aCA==:1421786393:cgeek",
-    "BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:th576H89dfymkG7/sH+DAIzjlmIqNEW6zY3ONrGeAml+k3f1ver399kYnEgG5YCaKXnnVM7P0oJHah80BV3mDw==:1421790376:moul",
-    "37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:XRmbTYFkPeGVEU2mJzzN4h1oVNDsZ4yyNZlDAfBm9CWhBsZ82QqX9GPHye2hBxxiu4Nz1BHgQiME6B4JcAC8BA==:1421787461:galuel"
-  ],
-  "joiners": [
-    "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:ccJm3F44eLMhQtnQY/7+14SWCDqVTL3Miw65hBVpV+YiUSUknIGhBNN0C0Cf+Pf0/pa1tjucW8Us3z5IklFSDg==:0:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421787800:inso",
-    "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:1lFIiaR0QX0jibr5zQpXVGzBvMGqcsTRlmHiwGz5HOAZT8PTdVUb5q6YGZ6qAUZjdMjPmhLaiMIpYc47wUnzBA==:0:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421786393:cgeek",
-    "BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:ctyAhpTRrAAOhFJukWI8RBr//nqYYdQibVzjOfaCdcWLb3TNFKrNBBothNsq/YrYHr7gKrpoftucf/oxLF8zAg==:0:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421790376:moul",
-    "37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:uoiGaC5b7kWqtqdPxwatPk9QajZHCNT9rf8/8ud9Rli24z/igcOf0Zr4A6RTAIKWUq9foW39VqJe+Y9R3rhACw==:0:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421787461:galuel"
-  ],
-  "actives": [],
-  "leavers": [],
-  "excluded": [],
-  "revoked": [],
-  "certifications": [
-    "37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:0:3wmCVW8AbVxRFm2PuLXD9UTCIg93MhUblZJvlYrDldSV4xuA7mZCd8TV4vb/6Bkc0FMQgBdHtpXrQ7dpo20uBA==",
-    "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:0:7UMQsUjLvuiZKIzOH5rrZDdDi5rXUo69EuQulY1Zm42xpRx/Gt5CkoTcJ/Mu83oElQbcZZTz/lVJ6IS0jzMiCQ==",
-    "BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:0:twWSY9etI82FLEHzhdqIoHsC9ehWCA7DCPiGxDLCWGPO4TG77hwtn3RcC68qoKHCib577JCp+fcKyp2vyI6FDA==",
-    "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:0:7K5MHkO8ibf5SchmPkRrmsg9owEZZ23uEMJJSQYG7L3PUmAKmmV/0VSjivxXH8gJGQBGsXQoK79x1jsYnj2nAg==",
-    "BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:0:Jua4FcEJFptSE5OoG1/Mgzx4e9jgGnYu7t8g1sqqPujI9hRhLFNXbQXedPS1q1OD5vWivA045gKOq/gnj8opDg==",
-    "37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:0:R/DV4/wYjvBG09QSOGtnxd3bfPFhVjEE5Uy3BsBMVUvjLsgxjf8NgLhYVozcHTRWS43ArxlXKfS5m3+KIPhhAQ==",
-    "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:0:4hP+ahJK021akL4UxB6c5QLaGJXa9eapd3nfdFQe+Xy87f/XLhj8BCa22XbbOlyGdaZRT3AYzbCL2UD5tI8mCw==",
-    "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:0:sZTQJr0d/xQnxrIIdSePUJpSTOa8v6IYGXMF2fVDZxQU8vwfzPm2dUKTaF0nU6E9wOYszzkBHaXL85nir+WtCQ==",
-    "37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:0:hDuBkoFhWhR/FgOU1+9SbQGBMIr47xqUzw1ZMERaPQo4aWm0WFbZurG4lvuJZzTyG6RF/gSw4VPvYZFPxWmADg==",
-    "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:0:79ZVrBehElVZh82fJdR18IJx06GkEVZTbwdHH4zb0S6VaGwdtLh1rvomm4ukBvUc8r/suTweG/SScsJairXNAg==",
-    "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:0:e/ai9E4G5CFB9Qi329e0ffYpZMgxj8mM4rviqIr2+UESA0UG86OuAAyHO11hYeyolZRiU8I7WdtNE98B1uZuBg==",
-    "BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:0:q4PCneYkcPH8AHEqEvqTtYQWslhlYO2B87aReuOl1uPczn5Q3VkZFAsU48ZTYryeyWp2nxdQojdFYhlAUNchAw=="
-  ],
-  "transactions": [],
-  "raw": "Version: 1\nType: block\nCurrency: meta_brouzouf\nNonce: 10144\nNumber: 0\nPoWMin: 3\nTime: 1421838980\nMedianTime: 1421838980\nIssuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\nparameters: 0.1:86400:100:604800:2629800:3:3:2629800:3:11:600:20:144:0.67\nMembersCount: 4\nIdentities:\n8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:Ot3zIp/nsHT3zgJy+2YcXPL6vaM5WFsD+F8w3qnJoBRuBG6lv761zoaExp2iyUnm8fDAyKPpMxRK2kf437QSCw==:1421787800:inso\nHnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:GZKLgaxJKL+GqxVLePMt8OVLJ6qTLrib5Mr/j2gjiNRY2k485YLB2OlzhBzZVnD3xLs0xi69JUfmLnM54j3aCA==:1421786393:cgeek\nBMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:th576H89dfymkG7/sH+DAIzjlmIqNEW6zY3ONrGeAml+k3f1ver399kYnEgG5YCaKXnnVM7P0oJHah80BV3mDw==:1421790376:moul\n37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:XRmbTYFkPeGVEU2mJzzN4h1oVNDsZ4yyNZlDAfBm9CWhBsZ82QqX9GPHye2hBxxiu4Nz1BHgQiME6B4JcAC8BA==:1421787461:galuel\nJoiners:\n8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:ccJm3F44eLMhQtnQY/7+14SWCDqVTL3Miw65hBVpV+YiUSUknIGhBNN0C0Cf+Pf0/pa1tjucW8Us3z5IklFSDg==:0:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421787800:inso\nHnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:1lFIiaR0QX0jibr5zQpXVGzBvMGqcsTRlmHiwGz5HOAZT8PTdVUb5q6YGZ6qAUZjdMjPmhLaiMIpYc47wUnzBA==:0:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421786393:cgeek\nBMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:ctyAhpTRrAAOhFJukWI8RBr//nqYYdQibVzjOfaCdcWLb3TNFKrNBBothNsq/YrYHr7gKrpoftucf/oxLF8zAg==:0:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421790376:moul\n37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:uoiGaC5b7kWqtqdPxwatPk9QajZHCNT9rf8/8ud9Rli24z/igcOf0Zr4A6RTAIKWUq9foW39VqJe+Y9R3rhACw==:0:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421787461:galuel\nActives:\nLeavers:\nExcluded:\nCertifications:\n37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:0:3wmCVW8AbVxRFm2PuLXD9UTCIg93MhUblZJvlYrDldSV4xuA7mZCd8TV4vb/6Bkc0FMQgBdHtpXrQ7dpo20uBA==\nHnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:0:7UMQsUjLvuiZKIzOH5rrZDdDi5rXUo69EuQulY1Zm42xpRx/Gt5CkoTcJ/Mu83oElQbcZZTz/lVJ6IS0jzMiCQ==\nBMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:0:twWSY9etI82FLEHzhdqIoHsC9ehWCA7DCPiGxDLCWGPO4TG77hwtn3RcC68qoKHCib577JCp+fcKyp2vyI6FDA==\n8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:0:7K5MHkO8ibf5SchmPkRrmsg9owEZZ23uEMJJSQYG7L3PUmAKmmV/0VSjivxXH8gJGQBGsXQoK79x1jsYnj2nAg==\nBMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:0:Jua4FcEJFptSE5OoG1/Mgzx4e9jgGnYu7t8g1sqqPujI9hRhLFNXbQXedPS1q1OD5vWivA045gKOq/gnj8opDg==\n37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:0:R/DV4/wYjvBG09QSOGtnxd3bfPFhVjEE5Uy3BsBMVUvjLsgxjf8NgLhYVozcHTRWS43ArxlXKfS5m3+KIPhhAQ==\n8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:0:4hP+ahJK021akL4UxB6c5QLaGJXa9eapd3nfdFQe+Xy87f/XLhj8BCa22XbbOlyGdaZRT3AYzbCL2UD5tI8mCw==\nHnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:0:sZTQJr0d/xQnxrIIdSePUJpSTOa8v6IYGXMF2fVDZxQU8vwfzPm2dUKTaF0nU6E9wOYszzkBHaXL85nir+WtCQ==\n37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:0:hDuBkoFhWhR/FgOU1+9SbQGBMIr47xqUzw1ZMERaPQo4aWm0WFbZurG4lvuJZzTyG6RF/gSw4VPvYZFPxWmADg==\n8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:0:79ZVrBehElVZh82fJdR18IJx06GkEVZTbwdHH4zb0S6VaGwdtLh1rvomm4ukBvUc8r/suTweG/SScsJairXNAg==\nHnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:0:e/ai9E4G5CFB9Qi329e0ffYpZMgxj8mM4rviqIr2+UESA0UG86OuAAyHO11hYeyolZRiU8I7WdtNE98B1uZuBg==\nBMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:0:q4PCneYkcPH8AHEqEvqTtYQWslhlYO2B87aReuOl1uPczn5Q3VkZFAsU48ZTYryeyWp2nxdQojdFYhlAUNchAw==\nTransactions:\n"
-}
+            "version": 2,
+            "nonce": 10144,
+            "number": 0,
+            "powMin": 3,
+            "time": 1421838980,
+            "medianTime": 1421838980,
+            "membersCount": 4,
+            "monetaryMass": 0,
+            "currency": "meta_brouzouf",
+            "issuer": "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk",
+            "signature": "+78w7251vvRdhoIJ6IWHEiEOLxNrmfQf45Y5sYvPdnAdXkVpO1unMV5YA/G5Vhphyz1dICrbeKCPM5qbFsoWAQ==",
+            "hash": "00063EB6E83F8717CEF1D25B3E2EE308374A14B1",
+            "inner_hash": "00063EB6E83F8717CEF1D25B3E2EE308374A14B1",
+            "parameters": "0.1:86400:100:604800:2629800:3:3:2629800:3:11:600:20:144:0.67",
+            "previousHash": None,
+            "previousIssuer": None,
+            "dividend": None,
+            "membersChanges": [],
+            "identities": [
+                "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:\
+                Ot3zIp/nsHT3zgJy+2YcXPL6vaM5WFsD+F8w3qnJoBRuBG6lv761zoaExp2iyUnm8fDAyKPpMxRK2kf437QSCw==:\
+                1421787800:inso",
+                "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:\
+                GZKLgaxJKL+GqxVLePMt8OVLJ6qTLrib5Mr/j2gjiNRY2k485YLB2OlzhBzZVnD3xLs0xi69JUfmLnM54j3aCA==:\
+                1421786393:cgeek",
+                "BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:\
+                th576H89dfymkG7/sH+DAIzjlmIqNEW6zY3ONrGeAml+k3f1ver399kYnEgG5YCaKXnnVM7P0oJHah80BV3mDw==:\
+                1421790376:moul",
+                "37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:\
+                XRmbTYFkPeGVEU2mJzzN4h1oVNDsZ4yyNZlDAfBm9CWhBsZ82QqX9GPHye2hBxxiu4Nz1BHgQiME6B4JcAC8BA==:\
+                1421787461:galuel"
+            ],
+            "joiners": [
+                "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:\
+                ccJm3F44eLMhQtnQY/7+14SWCDqVTL3Miw65hBVpV+YiUSUknIGhBNN0C0Cf+Pf0/pa1tjucW8Us3z5IklFSDg==:\
+                0:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421787800:inso",
+                "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:\
+                1lFIiaR0QX0jibr5zQpXVGzBvMGqcsTRlmHiwGz5HOAZT8PTdVUb5q6YGZ6qAUZjdMjPmhLaiMIpYc47wUnzBA==:\
+                0:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421786393:cgeek",
+                "BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:\
+                ctyAhpTRrAAOhFJukWI8RBr//nqYYdQibVzjOfaCdcWLb3TNFKrNBBothNsq/YrYHr7gKrpoftucf/oxLF8zAg==:\
+                0:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421790376:moul",
+                "37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:\
+                uoiGaC5b7kWqtqdPxwatPk9QajZHCNT9rf8/8ud9Rli24z/igcOf0Zr4A6RTAIKWUq9foW39VqJe+Y9R3rhACw==:\
+                0:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421787461:galuel"
+            ],
+            "actives": [],
+            "leavers": [],
+            "excluded": [],
+            "revoked": [],
+            "certifications": [
+                "37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:\
+                8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:0:\
+                3wmCVW8AbVxRFm2PuLXD9UTCIg93MhUblZJvlYrDldSV4xuA7mZCd8TV4vb/6Bkc0FMQgBdHtpXrQ7dpo20uBA==",
+                "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:\
+                8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:0:\
+                7UMQsUjLvuiZKIzOH5rrZDdDi5rXUo69EuQulY1Zm42xpRx/Gt5CkoTcJ/Mu83oElQbcZZTz/lVJ6IS0jzMiCQ==",
+                "BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:\
+                8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:0:\
+                twWSY9etI82FLEHzhdqIoHsC9ehWCA7DCPiGxDLCWGPO4TG77hwtn3RcC68qoKHCib577JCp+fcKyp2vyI6FDA==",
+                "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:\
+                HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:0:\
+                7K5MHkO8ibf5SchmPkRrmsg9owEZZ23uEMJJSQYG7L3PUmAKmmV/0VSjivxXH8gJGQBGsXQoK79x1jsYnj2nAg==",
+                "BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:\
+                HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:0:\
+                Jua4FcEJFptSE5OoG1/Mgzx4e9jgGnYu7t8g1sqqPujI9hRhLFNXbQXedPS1q1OD5vWivA045gKOq/gnj8opDg==",
+                "37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:\
+                HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:0:\
+                R/DV4/wYjvBG09QSOGtnxd3bfPFhVjEE5Uy3BsBMVUvjLsgxjf8NgLhYVozcHTRWS43ArxlXKfS5m3+KIPhhAQ==",
+                "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:\
+                BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:0:\
+                4hP+ahJK021akL4UxB6c5QLaGJXa9eapd3nfdFQe+Xy87f/XLhj8BCa22XbbOlyGdaZRT3AYzbCL2UD5tI8mCw==",
+                "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:\
+                BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:0:\
+                sZTQJr0d/xQnxrIIdSePUJpSTOa8v6IYGXMF2fVDZxQU8vwfzPm2dUKTaF0nU6E9wOYszzkBHaXL85nir+WtCQ==",
+                "37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:\
+                BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:0:\
+                hDuBkoFhWhR/FgOU1+9SbQGBMIr47xqUzw1ZMERaPQo4aWm0WFbZurG4lvuJZzTyG6RF/gSw4VPvYZFPxWmADg==",
+                "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:\
+                37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:0:\
+                79ZVrBehElVZh82fJdR18IJx06GkEVZTbwdHH4zb0S6VaGwdtLh1rvomm4ukBvUc8r/suTweG/SScsJairXNAg==",
+                "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:\
+                37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:0:\
+                e/ai9E4G5CFB9Qi329e0ffYpZMgxj8mM4rviqIr2+UESA0UG86OuAAyHO11hYeyolZRiU8I7WdtNE98B1uZuBg==",
+                "BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:\
+                37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:0:\
+                q4PCneYkcPH8AHEqEvqTtYQWslhlYO2B87aReuOl1uPczn5Q3VkZFAsU48ZTYryeyWp2nxdQojdFYhlAUNchAw=="
+            ],
+            "transactions": [],
+            "raw": "Version: 1\nType: block\nCurrency: meta_brouzouf\nNonce: 10144\nNumber: 0\nPoWMin: 3\n\
+                   Time: 1421838980\nMedianTime: 1421838980\nIssuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\n\
+                   parameters: 0.1:86400:100:604800:2629800:3:3:2629800:3:11:600:20:144:0.67\nMembersCount: 4\n\
+                   Identities:\n\
+                   8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:\
+                   Ot3zIp/nsHT3zgJy+2YcXPL6vaM5WFsD+F8w3qnJoBRuBG6lv761zoaExp2iyUnm8fDAyKPpMxRK2kf437QSCw==:\
+                   1421787800:inso\n\
+                   HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:\
+                   GZKLgaxJKL+GqxVLePMt8OVLJ6qTLrib5Mr/j2gjiNRY2k485YLB2OlzhBzZVnD3xLs0xi69JUfmLnM54j3aCA==:\
+                   1421786393:cgeek\n\
+                   BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:\
+                   th576H89dfymkG7/sH+DAIzjlmIqNEW6zY3ONrGeAml+k3f1ver399kYnEgG5YCaKXnnVM7P0oJHah80BV3mDw==:\
+                   1421790376:moul\n\
+                   37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:\
+                   XRmbTYFkPeGVEU2mJzzN4h1oVNDsZ4yyNZlDAfBm9CWhBsZ82QqX9GPHye2hBxxiu4Nz1BHgQiME6B4JcAC8BA==:\
+                   1421787461:galuel\n\
+                   Joiners:\n8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:\
+                   ccJm3F44eLMhQtnQY/7+14SWCDqVTL3Miw65hBVpV+YiUSUknIGhBNN0C0Cf+Pf0/pa1tjucW8Us3z5IklFSDg==:0:\
+                   DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421787800:inso\n\
+                   HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:\
+                   1lFIiaR0QX0jibr5zQpXVGzBvMGqcsTRlmHiwGz5HOAZT8PTdVUb5q6YGZ6qAUZjdMjPmhLaiMIpYc47wUnzBA==:0:\
+                   DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421786393:cgeek\n\
+                   BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:\
+                   ctyAhpTRrAAOhFJukWI8RBr//nqYYdQibVzjOfaCdcWLb3TNFKrNBBothNsq/YrYHr7gKrpoftucf/oxLF8zAg==:0:\
+                   DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421790376:moul\n\
+                   37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:\
+                   uoiGaC5b7kWqtqdPxwatPk9QajZHCNT9rf8/8ud9Rli24z/igcOf0Zr4A6RTAIKWUq9foW39VqJe+Y9R3rhACw==:0:\
+                   DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421787461:galuel\n\
+                   Actives:\nLeavers:\nExcluded:\nCertifications:\n\
+                   37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:0:\
+                   3wmCVW8AbVxRFm2PuLXD9UTCIg93MhUblZJvlYrDldSV4xuA7mZCd8TV4vb/6Bkc0FMQgBdHtpXrQ7dpo20uBA==\n\
+                   HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:0:\
+                   7UMQsUjLvuiZKIzOH5rrZDdDi5rXUo69EuQulY1Zm42xpRx/Gt5CkoTcJ/Mu83oElQbcZZTz/lVJ6IS0jzMiCQ==\n\
+                   BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:0:\
+                   twWSY9etI82FLEHzhdqIoHsC9ehWCA7DCPiGxDLCWGPO4TG77hwtn3RcC68qoKHCib577JCp+fcKyp2vyI6FDA==\n\
+                   8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:0:\
+                   7K5MHkO8ibf5SchmPkRrmsg9owEZZ23uEMJJSQYG7L3PUmAKmmV/0VSjivxXH8gJGQBGsXQoK79x1jsYnj2nAg==\n\
+                   BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:0:\
+                   Jua4FcEJFptSE5OoG1/Mgzx4e9jgGnYu7t8g1sqqPujI9hRhLFNXbQXedPS1q1OD5vWivA045gKOq/gnj8opDg==\n\
+                   37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:0:\
+                   R/DV4/wYjvBG09QSOGtnxd3bfPFhVjEE5Uy3BsBMVUvjLsgxjf8NgLhYVozcHTRWS43ArxlXKfS5m3+KIPhhAQ==\n\
+                   8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:0:\
+                   4hP+ahJK021akL4UxB6c5QLaGJXa9eapd3nfdFQe+Xy87f/XLhj8BCa22XbbOlyGdaZRT3AYzbCL2UD5tI8mCw==\n\
+                   HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:0:\
+                   sZTQJr0d/xQnxrIIdSePUJpSTOa8v6IYGXMF2fVDZxQU8vwfzPm2dUKTaF0nU6E9wOYszzkBHaXL85nir+WtCQ==\n\
+                   37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:0:\
+                   hDuBkoFhWhR/FgOU1+9SbQGBMIr47xqUzw1ZMERaPQo4aWm0WFbZurG4lvuJZzTyG6RF/gSw4VPvYZFPxWmADg==\n\
+                   8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:0:\
+                   79ZVrBehElVZh82fJdR18IJx06GkEVZTbwdHH4zb0S6VaGwdtLh1rvomm4ukBvUc8r/suTweG/SScsJairXNAg==\n\
+                   HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:0:\
+                   e/ai9E4G5CFB9Qi329e0ffYpZMgxj8mM4rviqIr2+UESA0UG86OuAAyHO11hYeyolZRiU8I7WdtNE98B1uZuBg==\n\
+                   BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:0:\
+                   q4PCneYkcPH8AHEqEvqTtYQWslhlYO2B87aReuOl1uPczn5Q3VkZFAsU48ZTYryeyWp2nxdQojdFYhlAUNchAw==\n\
+                   Transactions:\n"
+        }
         jsonschema.validate(json_sample, BLOCK_SCHEMA)
 
     def test_block_bad(self):
@@ -112,9 +207,9 @@ class Test_BMA_blockchain(WebFunctionalSetupMixin, unittest.TestCase):
         async def go():
             _, port, url = await self.create_server('GET', '/blockchain/block/100', handler)
             with self.assertRaises(jsonschema.exceptions.ValidationError):
-                async with aiohttp.ClientSession() as session:
-                    connection = BMAEndpoint("127.0.0.1", None, None, port).conn_handler(session)
-                    await block(connection, 100)
+                client = Client(BMAEndpoint("127.0.0.1", "", "", port))
+                await client(block, 100)
+            await  client.close()
 
         self.loop.run_until_complete(go())
 
@@ -126,9 +221,9 @@ class Test_BMA_blockchain(WebFunctionalSetupMixin, unittest.TestCase):
         async def go():
             _, port, url = await self.create_server('GET', '/blockchain/current', handler)
             with self.assertRaises(jsonschema.exceptions.ValidationError):
-                async with aiohttp.ClientSession() as session:
-                    connection = BMAEndpoint("127.0.0.1", None, None, port).conn_handler(session)
-                    await current(connection)
+                client = Client(BMAEndpoint("127.0.0.1", "", "", port))
+                await client(current)
+            await  client.close()
 
         self.loop.run_until_complete(go())
 
@@ -152,10 +247,14 @@ class Test_BMA_blockchain(WebFunctionalSetupMixin, unittest.TestCase):
             "dividend": None,
             "membersChanges": [],
             "identities": [
-            "APGtJqMq91jKxgGX9KEoCKqqD6UTsnPmALGNyaLbTknA:Lld5KezKGDUgrvnNjKuEGZmWJZNYDYtsPJajuOdrEr7MKXIwJYBRTouWPlCoPP9OQBF7qi7dpX+qKeYcjVPPDA==:1443950660:Alcide"
+                "APGtJqMq91jKxgGX9KEoCKqqD6UTsnPmALGNyaLbTknA:\
+                Lld5KezKGDUgrvnNjKuEGZmWJZNYDYtsPJajuOdrEr7MKXIwJYBRTouWPlCoPP9OQBF7qi7dpX+qKeYcjVPPDA==:\
+                1443950660:Alcide"
             ],
             "joiners": [
-            "APGtJqMq91jKxgGX9KEoCKqqD6UTsnPmALGNyaLbTknA:XpdVaX1TKnvjRfJRpFnpVDQOmxfDKKUp3YuSG/Ic8DHAT2SJKFSr+th3mK14JHiBtKMsNpVwFyV7TlKNHgnjAw==:34428:0000074D458E92EF09C2305BF0D191DD7CF1D452:1443950660:Alcide"
+                "APGtJqMq91jKxgGX9KEoCKqqD6UTsnPmALGNyaLbTknA:\
+                XpdVaX1TKnvjRfJRpFnpVDQOmxfDKKUp3YuSG/Ic8DHAT2SJKFSr+th3mK14JHiBtKMsNpVwFyV7TlKNHgnjAw==:34428:\
+                0000074D458E92EF09C2305BF0D191DD7CF1D452:1443950660:Alcide"
             ],
             "actives": [],
             "leavers": [],
@@ -163,19 +262,48 @@ class Test_BMA_blockchain(WebFunctionalSetupMixin, unittest.TestCase):
             "revoked": [],
             "inner_hash": "00063EB6E83F8717CEF1D25B3E2EE308374A14B1",
             "certifications": [
-            "ATkjQPa4sn4LBF69jqEPzFtRdHYJs6MJQjvP8JdN7MtN:APGtJqMq91jKxgGX9KEoCKqqD6UTsnPmALGNyaLbTknA:34434:oGGiYVBAfhreOzWS1M7HQ0OHHUWAA3NdU29XAca3/3mbfD581QBxeADVR+Bj7kTBqrAxwpwyODtaHyZZNYI3AA==",
-            "2sq8bBDQGK74f1eD3mAPQVgHCmFdijZr9nbv16FwbokX:APGtJqMq91jKxgGX9KEoCKqqD6UTsnPmALGNyaLbTknA:34432:KFKYioosI3FAvyfTKiWyQqRGUros03S/NITNxShB/3L1LI4P7XSLp2+hFbCK375ODm1g/fnwfzOoorOKPGIOAw==",
-            "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:APGtJqMq91jKxgGX9KEoCKqqD6UTsnPmALGNyaLbTknA:34431:nKDTapgYR/nMEEkLaT4ygLCHlxmiACzi4Zv+gzRJN8hGdirQAMN1FNpJ2RVli4V4z+7y3lklPidOX2Aln8ZNBA=="
+                "ATkjQPa4sn4LBF69jqEPzFtRdHYJs6MJQjvP8JdN7MtN:\
+                APGtJqMq91jKxgGX9KEoCKqqD6UTsnPmALGNyaLbTknA:34434:\
+                oGGiYVBAfhreOzWS1M7HQ0OHHUWAA3NdU29XAca3/3mbfD581QBxeADVR+Bj7kTBqrAxwpwyODtaHyZZNYI3AA==",
+                "2sq8bBDQGK74f1eD3mAPQVgHCmFdijZr9nbv16FwbokX:\
+                APGtJqMq91jKxgGX9KEoCKqqD6UTsnPmALGNyaLbTknA:34432:\
+                KFKYioosI3FAvyfTKiWyQqRGUros03S/NITNxShB/3L1LI4P7XSLp2+hFbCK375ODm1g/fnwfzOoorOKPGIOAw==",
+                "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:\
+                APGtJqMq91jKxgGX9KEoCKqqD6UTsnPmALGNyaLbTknA:34431:\
+                nKDTapgYR/nMEEkLaT4ygLCHlxmiACzi4Zv+gzRJN8hGdirQAMN1FNpJ2RVli4V4z+7y3lklPidOX2Aln8ZNBA=="
             ],
             "transactions": [],
-            "raw": "Version: 1\nType: block\nCurrency: meta_brouzouf\nNonce: 162294\nNumber: 34435\nPoWMin: 5\nTime: 1443895887\nMedianTime: 1443881487\nIssuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\nPreviousHash: 00000D21F80687248A8C02F16BB19A975B4F983D\nPreviousIssuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\nMembersCount: 19\nIdentities:\nAPGtJqMq91jKxgGX9KEoCKqqD6UTsnPmALGNyaLbTknA:Lld5KezKGDUgrvnNjKuEGZmWJZNYDYtsPJajuOdrEr7MKXIwJYBRTouWPlCoPP9OQBF7qi7dpX+qKeYcjVPPDA==:1443950660:Alcide\nJoiners:\nAPGtJqMq91jKxgGX9KEoCKqqD6UTsnPmALGNyaLbTknA:XpdVaX1TKnvjRfJRpFnpVDQOmxfDKKUp3YuSG/Ic8DHAT2SJKFSr+th3mK14JHiBtKMsNpVwFyV7TlKNHgnjAw==:34428:0000074D458E92EF09C2305BF0D191DD7CF1D452:1443950660:Alcide\nActives:\nLeavers:\nExcluded:\nCertifications:\nATkjQPa4sn4LBF69jqEPzFtRdHYJs6MJQjvP8JdN7MtN:APGtJqMq91jKxgGX9KEoCKqqD6UTsnPmALGNyaLbTknA:34434:oGGiYVBAfhreOzWS1M7HQ0OHHUWAA3NdU29XAca3/3mbfD581QBxeADVR+Bj7kTBqrAxwpwyODtaHyZZNYI3AA==\n2sq8bBDQGK74f1eD3mAPQVgHCmFdijZr9nbv16FwbokX:APGtJqMq91jKxgGX9KEoCKqqD6UTsnPmALGNyaLbTknA:34432:KFKYioosI3FAvyfTKiWyQqRGUros03S/NITNxShB/3L1LI4P7XSLp2+hFbCK375ODm1g/fnwfzOoorOKPGIOAw==\n8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:APGtJqMq91jKxgGX9KEoCKqqD6UTsnPmALGNyaLbTknA:34431:nKDTapgYR/nMEEkLaT4ygLCHlxmiACzi4Zv+gzRJN8hGdirQAMN1FNpJ2RVli4V4z+7y3lklPidOX2Aln8ZNBA==\nTransactions:\n"
-            }
+            "raw": "Version: 1\nType: block\nCurrency: meta_brouzouf\nNonce: 162294\nNumber: 34435\nPoWMin: 5\n\
+            Time: 1443895887\nMedianTime: 1443881487\nIssuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\n\
+            PreviousHash: 00000D21F80687248A8C02F16BB19A975B4F983D\n\
+            PreviousIssuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\nMembersCount: 19\n\
+            Identities:\n\
+            APGtJqMq91jKxgGX9KEoCKqqD6UTsnPmALGNyaLbTknA:\
+            Lld5KezKGDUgrvnNjKuEGZmWJZNYDYtsPJajuOdrEr7MKXIwJYBRTouWPlCoPP9OQBF7qi7dpX+qKeYcjVPPDA==:\
+            1443950660:Alcide\n\
+            Joiners:\n\
+            APGtJqMq91jKxgGX9KEoCKqqD6UTsnPmALGNyaLbTknA:\
+            XpdVaX1TKnvjRfJRpFnpVDQOmxfDKKUp3YuSG/Ic8DHAT2SJKFSr+th3mK14JHiBtKMsNpVwFyV7TlKNHgnjAw==:34428:\
+            0000074D458E92EF09C2305BF0D191DD7CF1D452:1443950660:Alcide\n\
+            Actives:\nLeavers:\nExcluded:\n\
+            Certifications:\n\
+            ATkjQPa4sn4LBF69jqEPzFtRdHYJs6MJQjvP8JdN7MtN:\
+            APGtJqMq91jKxgGX9KEoCKqqD6UTsnPmALGNyaLbTknA:34434:\
+            oGGiYVBAfhreOzWS1M7HQ0OHHUWAA3NdU29XAca3/3mbfD581QBxeADVR+Bj7kTBqrAxwpwyODtaHyZZNYI3AA==\n\
+            2sq8bBDQGK74f1eD3mAPQVgHCmFdijZr9nbv16FwbokX:\
+            APGtJqMq91jKxgGX9KEoCKqqD6UTsnPmALGNyaLbTknA:34432:\
+            KFKYioosI3FAvyfTKiWyQqRGUros03S/NITNxShB/3L1LI4P7XSLp2+hFbCK375ODm1g/fnwfzOoorOKPGIOAw==\n\
+            8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:\
+            APGtJqMq91jKxgGX9KEoCKqqD6UTsnPmALGNyaLbTknA:34431:\
+            nKDTapgYR/nMEEkLaT4ygLCHlxmiACzi4Zv+gzRJN8hGdirQAMN1FNpJ2RVli4V4z+7y3lklPidOX2Aln8ZNBA==\n\
+            Transactions:\n"
+        }
         jsonschema.validate(json_sample, BLOCK_SCHEMA)
 
     def test_schema_hardship(self):
         json_sample = {
-          "block": 40432,
-          "level": 4
+            "block": 40432,
+            "level": 4
         }
         jsonschema.validate(json_sample, HARDSHIP_SCHEMA)
 
@@ -185,11 +313,13 @@ class Test_BMA_blockchain(WebFunctionalSetupMixin, unittest.TestCase):
             return web.Response(body=b'{}', content_type='application/json')
 
         async def go():
-            _, port, url = await self.create_server('GET', '/blockchain/hardship/8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU', handler)
+            _, port, url = await self.create_server('GET',
+                                                    '/blockchain/hardship/8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU',
+                                                    handler)
             with self.assertRaises(jsonschema.exceptions.ValidationError):
-                async with aiohttp.ClientSession() as session:
-                    connection = BMAEndpoint("127.0.0.1", None, None, port).conn_handler(session)
-                    await hardship(connection, "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU")
+                client = Client(BMAEndpoint("127.0.0.1", "", "", port))
+                await client(hardship, "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU")
+            await client.close()
 
         self.loop.run_until_complete(go())
 
@@ -225,11 +355,13 @@ class Test_BMA_blockchain(WebFunctionalSetupMixin, unittest.TestCase):
             return web.Response(body=b'{}', content_type='application/json')
 
         async def go():
-            _, port, url = await self.create_server('GET', '/blockchain/memberships/8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU', handler)
+            _, port, url = await self.create_server('GET',
+                                                    '/blockchain/memberships/8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU',
+                                                    handler)
             with self.assertRaises(jsonschema.exceptions.ValidationError):
-                async with aiohttp.ClientSession() as session:
-                    connection = BMAEndpoint("127.0.0.1", None, None, port).conn_handler(session)
-                    await memberships(connection, "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU")
+                client = Client(BMAEndpoint("127.0.0.1", "", "", port))
+                await client(memberships, "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU")
+            await client.close()
 
         self.loop.run_until_complete(go())
 
@@ -249,9 +381,9 @@ class Test_BMA_blockchain(WebFunctionalSetupMixin, unittest.TestCase):
         async def go():
             _, port, url = await self.create_server('GET', '/blockchain/with/newcomers', handler)
             with self.assertRaises(jsonschema.exceptions.ValidationError):
-                async with aiohttp.ClientSession() as session:
-                    connection = BMAEndpoint("127.0.0.1", None, None, port).conn_handler(session)
-                    await newcomers(connection)
+                client = Client(BMAEndpoint("127.0.0.1", "", "", port))
+                await client(newcomers)
+            await client.close()
 
         self.loop.run_until_complete(go())
 
@@ -271,9 +403,9 @@ class Test_BMA_blockchain(WebFunctionalSetupMixin, unittest.TestCase):
         async def go():
             _, port, url = await self.create_server('GET', '/blockchain/with/certs', handler)
             with self.assertRaises(jsonschema.exceptions.ValidationError):
-                async with aiohttp.ClientSession() as session:
-                    connection = BMAEndpoint("127.0.0.1", None, None, port).conn_handler(session)
-                    await certifications(connection)
+                client = Client(BMAEndpoint("127.0.0.1", "", "", port))
+                await client(certifications)
+            await client.close()
 
         self.loop.run_until_complete(go())
 
@@ -293,9 +425,9 @@ class Test_BMA_blockchain(WebFunctionalSetupMixin, unittest.TestCase):
         async def go():
             _, port, url = await self.create_server('GET', '/blockchain/with/joiners', handler)
             with self.assertRaises(jsonschema.exceptions.ValidationError):
-                async with aiohttp.ClientSession() as session:
-                    connection = BMAEndpoint("127.0.0.1", None, None, port).conn_handler(session)
-                    await joiners(connection)
+                client = Client(BMAEndpoint("127.0.0.1", "", "", port))
+                await client(joiners)
+            await client.close()
 
         self.loop.run_until_complete(go())
 
@@ -315,9 +447,9 @@ class Test_BMA_blockchain(WebFunctionalSetupMixin, unittest.TestCase):
         async def go():
             _, port, url = await self.create_server('GET', '/blockchain/with/actives', handler)
             with self.assertRaises(jsonschema.exceptions.ValidationError):
-                async with aiohttp.ClientSession() as session:
-                    connection = BMAEndpoint("127.0.0.1", None, None, port).conn_handler(session)
-                    await actives(connection)
+                client = Client(BMAEndpoint("127.0.0.1", "", "", port))
+                await client(actives)
+            await client.close()
 
         self.loop.run_until_complete(go())
 
@@ -337,9 +469,9 @@ class Test_BMA_blockchain(WebFunctionalSetupMixin, unittest.TestCase):
         async def go():
             _, port, url = await self.create_server('GET', '/blockchain/with/leavers', handler)
             with self.assertRaises(jsonschema.exceptions.ValidationError):
-                async with aiohttp.ClientSession() as session:
-                    connection = BMAEndpoint("127.0.0.1", None, None, port).conn_handler(session)
-                    await leavers(connection)
+                client = Client(BMAEndpoint("127.0.0.1", "", "", port))
+                await client(leavers)
+            await client.close()
 
         self.loop.run_until_complete(go())
 
@@ -353,102 +485,117 @@ class Test_BMA_blockchain(WebFunctionalSetupMixin, unittest.TestCase):
 
     def test_schema_blocks(self):
         json_sample = [
-          {
-            "version": 2,
-            "nonce": 1,
-            "number": 100,
-            "powMin": 4,
-            "time": 1461847414,
-            "medianTime": 1461847412,
-            "membersCount": 2,
-            "monetaryMass": 0,
-            "unitbase": 0,
-            "issuersCount": 0,
-            "issuersFrame": 0,
-            "issuersFrameVar": 0,
-            "currency": "test_net",
-            "issuer": "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk",
-            "signature": "R6XzQ7DDTam+koGCoEeygxFAuy9Uh/by6GS8mMx5rFWqusxaUYRJW4QkeGmqT9yHTpXCbHwZZbpIgm3SbrrVDg==",
-            "hash": "2C49A15983AEA3EBFD6B430876933A72C11D8D20E49ED94C4066557C1B528973",
-            "parameters": "",
-            "previousHash": "12DD8737F97BD3AC0B7E4B10F770F101A0D3EB3EEC858023CBCA06BB4AA9EBE6",
-            "previousIssuer": "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk",
-            "inner_hash": "0C9002C192ADB5D913C78D813216E56677CCF53A4DE0764C30E46E858D4854A5",
-            "dividend": None,
-            "identities": [],
-            "joiners": [],
-            "actives": [],
-            "leavers": [],
-            "revoked": [],
-            "excluded": [],
-            "certifications": [],
-            "transactions": [],
-            "raw": "Version: 2\nType: block\nCurrency: test_net\nNumber: 100\nPoWMin: 4\nTime: 1461847414\nMedianTime: 1461847412\nIssuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\nPreviousHash: 12DD8737F97BD3AC0B7E4B10F770F101A0D3EB3EEC858023CBCA06BB4AA9EBE6\nPreviousIssuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\nMembersCount: 2\nIdentities:\nJoiners:\nActives:\nLeavers:\nRevoked:\nExcluded:\nCertifications:\nTransactions:\nInnerHash: 0C9002C192ADB5D913C78D813216E56677CCF53A4DE0764C30E46E858D4854A5\nNonce: 1\n"
-          },
-          {
-            "version": 2,
-            "nonce": 1,
-            "number": 101,
-            "powMin": 4,
-            "time": 1461847414,
-            "medianTime": 1461847412,
-            "membersCount": 2,
-            "monetaryMass": 0,
-            "unitbase": 0,
-            "issuersCount": 0,
-            "issuersFrame": 0,
-            "issuersFrameVar": 0,
-            "currency": "test_net",
-            "issuer": "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk",
-            "signature": "IDWQCVtI8XxRVqakKc822ayZ8qNzm0kYK3ew1heqMf8aqsMhiS/1IKBi4gBFBXMpO49bX8GkZW/R/TDxiYsUAg==",
-            "hash": "9A29E79EC06444EEC4ADC9F7C9B720A91A9FC1B66219F641EF71661BD2F28F8F",
-            "parameters": "",
-            "previousHash": "2C49A15983AEA3EBFD6B430876933A72C11D8D20E49ED94C4066557C1B528973",
-            "previousIssuer": "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk",
-            "inner_hash": "A91B10BA4EEB7CF712DC92CAE7F6FF761571929B8BF1A13E1FF5CC402442A10A",
-            "dividend": None,
-            "identities": [],
-            "joiners": [],
-            "actives": [],
-            "leavers": [],
-            "revoked": [],
-            "excluded": [],
-            "certifications": [],
-            "transactions": [],
-            "raw": "Version: 2\nType: block\nCurrency: test_net\nNumber: 101\nPoWMin: 4\nTime: 1461847414\nMedianTime: 1461847412\nIssuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\nPreviousHash: 2C49A15983AEA3EBFD6B430876933A72C11D8D20E49ED94C4066557C1B528973\nPreviousIssuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\nMembersCount: 2\nIdentities:\nJoiners:\nActives:\nLeavers:\nRevoked:\nExcluded:\nCertifications:\nTransactions:\nInnerHash: A91B10BA4EEB7CF712DC92CAE7F6FF761571929B8BF1A13E1FF5CC402442A10A\nNonce: 1\n"
-          },
-          {
-            "version": 2,
-            "nonce": 1,
-            "number": 102,
-            "powMin": 4,
-            "time": 1461847414,
-            "medianTime": 1461847413,
-            "membersCount": 2,
-            "monetaryMass": 0,
-            "unitbase": 0,
-            "issuersCount": 0,
-            "issuersFrame": 0,
-            "issuersFrameVar": 0,
-            "currency": "test_net",
-            "issuer": "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk",
-            "signature": "jUfBfFwzsXyPGi/seEonWHOfq5/lAudASpnpiHhfr7OQhOTYL3RRECy2RVlZAoqJ9FqlcdTSaj+I+FFPBomoBA==",
-            "hash": "8B6F0E8EA4B9D5A078D679E6004F891CAB5BDE827B51B1090E6B71B1FFB3E727",
-            "parameters": "",
-            "previousHash": "9A29E79EC06444EEC4ADC9F7C9B720A91A9FC1B66219F641EF71661BD2F28F8F",
-            "previousIssuer": "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk",
-            "inner_hash": "301236A7771CBDE30F253E2A42E34BF758450DADDDB37A832328701B04213A59",
-            "dividend": None,
-            "identities": [],
-            "joiners": [],
-            "actives": [],
-            "leavers": [],
-            "revoked": [],
-            "excluded": [],
-            "certifications": [],
-            "transactions": [],
-            "raw": "Version: 2\nType: block\nCurrency: test_net\nNumber: 102\nPoWMin: 4\nTime: 1461847414\nMedianTime: 1461847413\nIssuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\nPreviousHash: 9A29E79EC06444EEC4ADC9F7C9B720A91A9FC1B66219F641EF71661BD2F28F8F\nPreviousIssuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\nMembersCount: 2\nIdentities:\nJoiners:\nActives:\nLeavers:\nRevoked:\nExcluded:\nCertifications:\nTransactions:\nInnerHash: 301236A7771CBDE30F253E2A42E34BF758450DADDDB37A832328701B04213A59\nNonce: 1\n"
-          }
+            {
+                "version": 2,
+                "nonce": 1,
+                "number": 100,
+                "powMin": 4,
+                "time": 1461847414,
+                "medianTime": 1461847412,
+                "membersCount": 2,
+                "monetaryMass": 0,
+                "unitbase": 0,
+                "issuersCount": 0,
+                "issuersFrame": 0,
+                "issuersFrameVar": 0,
+                "currency": "test_net",
+                "issuer": "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk",
+                "signature": "R6XzQ7DDTam+koGCoEeygxFAuy9Uh/by6GS8mMx5rFWqusxaUYRJW4QkeGmqT9yHTpXCbHwZZbpIgm3SbrrVDg==",
+                "hash": "2C49A15983AEA3EBFD6B430876933A72C11D8D20E49ED94C4066557C1B528973",
+                "parameters": "",
+                "previousHash": "12DD8737F97BD3AC0B7E4B10F770F101A0D3EB3EEC858023CBCA06BB4AA9EBE6",
+                "previousIssuer": "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk",
+                "inner_hash": "0C9002C192ADB5D913C78D813216E56677CCF53A4DE0764C30E46E858D4854A5",
+                "dividend": None,
+                "identities": [],
+                "joiners": [],
+                "actives": [],
+                "leavers": [],
+                "revoked": [],
+                "excluded": [],
+                "certifications": [],
+                "transactions": [],
+                "raw": "Version: 2\nType: block\nCurrency: test_net\nNumber: 100\nPoWMin: 4\nTime: 1461847414\n\
+                MedianTime: 1461847412\nIssuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\n\
+                PreviousHash: 12DD8737F97BD3AC0B7E4B10F770F101A0D3EB3EEC858023CBCA06BB4AA9EBE6\n\
+                PreviousIssuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\n\
+                MembersCount: 2\nIdentities:\nJoiners:\nActives:\nLeavers:\nRevoked:\nExcluded:\nCertifications:\n\
+                Transactions:\nInnerHash: 0C9002C192ADB5D913C78D813216E56677CCF53A4DE0764C30E46E858D4854A5\nNonce: 1\n"
+            },
+            {
+                "version": 2,
+                "nonce": 1,
+                "number": 101,
+                "powMin": 4,
+                "time": 1461847414,
+                "medianTime": 1461847412,
+                "membersCount": 2,
+                "monetaryMass": 0,
+                "unitbase": 0,
+                "issuersCount": 0,
+                "issuersFrame": 0,
+                "issuersFrameVar": 0,
+                "currency": "test_net",
+                "issuer": "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk",
+                "signature": "IDWQCVtI8XxRVqakKc822ayZ8qNzm0kYK3ew1heqMf8aqsMhiS/1IKBi4gBFBXMpO49bX8GkZW/R/TDxiYsUAg==",
+                "hash": "9A29E79EC06444EEC4ADC9F7C9B720A91A9FC1B66219F641EF71661BD2F28F8F",
+                "parameters": "",
+                "previousHash": "2C49A15983AEA3EBFD6B430876933A72C11D8D20E49ED94C4066557C1B528973",
+                "previousIssuer": "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk",
+                "inner_hash": "A91B10BA4EEB7CF712DC92CAE7F6FF761571929B8BF1A13E1FF5CC402442A10A",
+                "dividend": None,
+                "identities": [],
+                "joiners": [],
+                "actives": [],
+                "leavers": [],
+                "revoked": [],
+                "excluded": [],
+                "certifications": [],
+                "transactions": [],
+                "raw": "Version: 2\nType: block\nCurrency: test_net\nNumber: 101\nPoWMin: 4\nTime: 1461847414\n\
+                MedianTime: 1461847412\nIssuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\n\
+                PreviousHash: 2C49A15983AEA3EBFD6B430876933A72C11D8D20E49ED94C4066557C1B528973\n\
+                PreviousIssuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\nMembersCount: 2\nIdentities:\nJoiners:\n\
+                Actives:\nLeavers:\nRevoked:\nExcluded:\nCertifications:\nTransactions:\n\
+                InnerHash: A91B10BA4EEB7CF712DC92CAE7F6FF761571929B8BF1A13E1FF5CC402442A10A\nNonce: 1\n"
+            },
+            {
+                "version": 2,
+                "nonce": 1,
+                "number": 102,
+                "powMin": 4,
+                "time": 1461847414,
+                "medianTime": 1461847413,
+                "membersCount": 2,
+                "monetaryMass": 0,
+                "unitbase": 0,
+                "issuersCount": 0,
+                "issuersFrame": 0,
+                "issuersFrameVar": 0,
+                "currency": "test_net",
+                "issuer": "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk",
+                "signature": "jUfBfFwzsXyPGi/seEonWHOfq5/lAudASpnpiHhfr7OQhOTYL3RRECy2RVlZAoqJ9FqlcdTSaj+I+FFPBomoBA==",
+                "hash": "8B6F0E8EA4B9D5A078D679E6004F891CAB5BDE827B51B1090E6B71B1FFB3E727",
+                "parameters": "",
+                "previousHash": "9A29E79EC06444EEC4ADC9F7C9B720A91A9FC1B66219F641EF71661BD2F28F8F",
+                "previousIssuer": "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk",
+                "inner_hash": "301236A7771CBDE30F253E2A42E34BF758450DADDDB37A832328701B04213A59",
+                "dividend": None,
+                "identities": [],
+                "joiners": [],
+                "actives": [],
+                "leavers": [],
+                "revoked": [],
+                "excluded": [],
+                "certifications": [],
+                "transactions": [],
+                "raw": "Version: 2\nType: block\nCurrency: test_net\nNumber: 102\nPoWMin: 4\nTime: 1461847414\n\
+                MedianTime: 1461847413\nIssuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\n\
+                PreviousHash: 9A29E79EC06444EEC4ADC9F7C9B720A91A9FC1B66219F641EF71661BD2F28F8F\n\
+                PreviousIssuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\nMembersCount: 2\nIdentities:\nJoiners:\n\
+                Actives:\nLeavers:\nRevoked:\nExcluded:\nCertifications:\nTransactions:\n\
+                InnerHash: 301236A7771CBDE30F253E2A42E34BF758450DADDDB37A832328701B04213A59\nNonce: 1\n"
+            }
         ]
         jsonschema.validate(json_sample, BLOCKS_SCHEMA)
 
@@ -460,9 +607,9 @@ class Test_BMA_blockchain(WebFunctionalSetupMixin, unittest.TestCase):
         async def go():
             _, port, url = await self.create_server('GET', '/blockchain/with/ud', handler)
             with self.assertRaises(jsonschema.exceptions.ValidationError):
-                async with aiohttp.ClientSession() as session:
-                    connection = BMAEndpoint("127.0.0.1", None, None, port).conn_handler(session)
-                    await ud(connection)
+                client = Client(BMAEndpoint("127.0.0.1", "", "", port))
+                await client(ud)
+            await client.close()
 
         self.loop.run_until_complete(go())
 
@@ -482,8 +629,8 @@ class Test_BMA_blockchain(WebFunctionalSetupMixin, unittest.TestCase):
         async def go():
             _, port, url = await self.create_server('GET', '/blockchain/with/tx', handler)
             with self.assertRaises(jsonschema.exceptions.ValidationError):
-                async with aiohttp.ClientSession() as session:
-                    connection = BMAEndpoint("127.0.0.1", None, None, port).conn_handler(session)
-                    await tx(connection)
+                client = Client(BMAEndpoint("127.0.0.1", "", "", port))
+                await client(tx)
+            await client.close()
 
         self.loop.run_until_complete(go())
diff --git a/tests/api/bma/test_network.py b/tests/api/bma/test_network.py
index a4600ab7e087699b123428fe7763797f4c7f6697..7b5db693a2927a0e5d3bed1f61d097ce38de03fd 100644
--- a/tests/api/bma/test_network.py
+++ b/tests/api/bma/test_network.py
@@ -1,26 +1,26 @@
 import unittest
 
-import aiohttp
 import jsonschema
 
-from duniterpy.documents import BMAEndpoint
-from tests.api.webserver import WebFunctionalSetupMixin, web
 from duniterpy.api.bma import network
+from duniterpy.api.client import Client
+from duniterpy.api.endpoint import BMAEndpoint
+from tests.api.webserver import WebFunctionalSetupMixin, web
 
 
-class TestBMANetwork(WebFunctionalSetupMixin, unittest.TestCase):
+class TestBmaNetwork(WebFunctionalSetupMixin, unittest.TestCase):
 
     def test_peering(self):
         json_sample = {
-          "version": "1",
-          "currency": "beta_brouzouf",
-          "pubkey": "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY",
-          "endpoints": [
-            "BASIC_MERKLED_API some.dns.name 88.77.66.55 2001:0db8:0000:85a3:0000:0000:ac1f 9001",
-            "BASIC_MERKLED_API some.dns.name 88.77.66.55 2001:0db8:0000:85a3:0000:0000:ac1f 9002",
-            "OTHER_PROTOCOL 88.77.66.55 9001",
-          ],
-          "signature": "42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r"
+            "version": "1",
+            "currency": "beta_brouzouf",
+            "pubkey": "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY",
+            "endpoints": [
+                "BASIC_MERKLED_API some.dns.name 88.77.66.55 2001:0db8:0000:85a3:0000:0000:ac1f 9001",
+                "BASIC_MERKLED_API some.dns.name 88.77.66.55 2001:0db8:0000:85a3:0000:0000:ac1f 9002",
+                "OTHER_PROTOCOL 88.77.66.55 9001",
+            ],
+            "signature": "42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r"
         }
         jsonschema.validate(json_sample, network.PEERING_SCHEMA)
 
@@ -32,35 +32,35 @@ class TestBMANetwork(WebFunctionalSetupMixin, unittest.TestCase):
         async def go():
             _, port, url = await self.create_server('GET', '/network/peering', handler)
             with self.assertRaises(jsonschema.exceptions.ValidationError):
-                async with aiohttp.ClientSession() as session:
-                    connection = BMAEndpoint("127.0.0.1", None, None, port).conn_handler(session)
-                    await network.peering(connection)
+                client = Client(BMAEndpoint("127.0.0.1", "", "", port))
+                await client(network.peering)
+            await client.close()
 
         self.loop.run_until_complete(go())
 
     def test_peers_root(self):
         json_sample = {
-          "depth": 3,
-          "nodesCount": 6,
-          "leavesCount": 5,
-          "root": "114B6E61CB5BB93D862CA3C1DFA8B99E313E66E9"
+            "depth": 3,
+            "nodesCount": 6,
+            "leavesCount": 5,
+            "root": "114B6E61CB5BB93D862CA3C1DFA8B99E313E66E9"
         }
         jsonschema.validate(json_sample, network.PEERS_SCHEMA)
 
     def test_peers_leaf(self):
         json_sample = {
-          "hash": "2E69197FAB029D8669EF85E82457A1587CA0ED9C",
-          "value": {
-            "version": "1",
-            "currency": "beta_brouzouf",
-            "pubkey": "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY",
-            "endpoints": [
-              "BASIC_MERKLED_API some.dns.name 88.77.66.55 2001:0db8:0000:85a3:0000:0000:ac1f 9001",
-              "BASIC_MERKLED_API some.dns.name 88.77.66.55 2001:0db8:0000:85a3:0000:0000:ac1f 9002",
-              "OTHER_PROTOCOL 88.77.66.55 9001",
-            ],
-            "signature": "42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r"
-          }
+            "hash": "2E69197FAB029D8669EF85E82457A1587CA0ED9C",
+            "value": {
+                "version": "1",
+                "currency": "beta_brouzouf",
+                "pubkey": "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY",
+                "endpoints": [
+                    "BASIC_MERKLED_API some.dns.name 88.77.66.55 2001:0db8:0000:85a3:0000:0000:ac1f 9001",
+                    "BASIC_MERKLED_API some.dns.name 88.77.66.55 2001:0db8:0000:85a3:0000:0000:ac1f 9002",
+                    "OTHER_PROTOCOL 88.77.66.55 9001",
+                ],
+                "signature": "42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r"
+            }
         }
         jsonschema.validate(json_sample, network.PEERS_SCHEMA)
 
@@ -72,8 +72,8 @@ class TestBMANetwork(WebFunctionalSetupMixin, unittest.TestCase):
         async def go():
             _, port, url = await self.create_server('GET', '/network/peering/peers', handler)
             with self.assertRaises(jsonschema.exceptions.ValidationError):
-                async with aiohttp.ClientSession() as session:
-                    connection = BMAEndpoint("127.0.0.1", None, None, port).conn_handler(session)
-                    await network.peers(connection)
+                client = Client(BMAEndpoint("127.0.0.1", "", "", port))
+                await client(network.peers)
+            await client.close()
 
         self.loop.run_until_complete(go())
diff --git a/tests/api/bma/test_tx.py b/tests/api/bma/test_tx.py
index 3e8d78fb78f1fdd93510151caaedcff03c6bf757..e9d7676ba080360416eb7f31a99f2f166f5c3db1 100644
--- a/tests/api/bma/test_tx.py
+++ b/tests/api/bma/test_tx.py
@@ -1,122 +1,124 @@
 import unittest
+
 import jsonschema
-import aiohttp
-from duniterpy.documents import BMAEndpoint
+
 from duniterpy.api.bma.tx import history, sources, blocks, HISTORY_SCHEMA, SOURCES_SCHEMA
-from tests.api.webserver import WebFunctionalSetupMixin, web, asyncio
+from duniterpy.api.client import Client
+from duniterpy.api.endpoint import BMAEndpoint
+from tests.api.webserver import WebFunctionalSetupMixin, web
 
 
-class Test_BMA_TX(WebFunctionalSetupMixin, unittest.TestCase):
+class TestBmaTx(WebFunctionalSetupMixin, unittest.TestCase):
     def test_bma_tx_history(self):
         json_sample = {
-          "currency": "meta_brouzouf",
-          "pubkey": "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk",
-          "history": {
-            "sent": [
-              {
-                "version": 1,
-                "issuers": [
-                  "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk"
-                ],
-                "inputs": [
-                  "0:D:125:000A8362AE0C1B8045569CE07735DE4C18E81586:100"
-                ],
-                "outputs": [
-                  "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:5",
-                  "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:95"
-                ],
-                "comment": "Essai",
-                "signatures": [
-                  "8zzWSU+GNSNURnH1NKPT/TBoxngEc/0wcpPSbs7FqknGxud+94knvT+dpe99k6NwyB5RXvOVnKAr4p9/KEluCw=="
-                ],
-                "hash": "FC7BAC2D94AC9C16AFC5C0150C2C9E7FBB2E2A09",
-                "block_number": 173,
-                "time": 1421932545
-              }
-            ],
-            "received": [
-              {
-                "version": 1,
-                "issuers": [
-                  "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU"
-                ],
-                "inputs": [
-                  "0:D:125:000A8362AE0C1B8045569CE07735DE4C18E81586:100"
-                ],
-                "outputs": [
-                  "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:7",
-                  "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:93"
-                ],
-                "comment": "",
-                "signatures": [
-                  "1Mn8q3K7N+R4GZEpAUm+XSyty1Uu+BuOy5t7BIRqgZcKqiaxfhAUfDBOcuk2i4TJy1oA5Rntby8hDN+cUCpvDg=="
-                ],
-                "hash": "5FB3CB80A982E2BDFBB3EA94673A74763F58CB2A",
-                "block_number": 207,
-                "time": 1421955525
-              },
-              {
-                "version": 1,
-                "issuers": [
-                  "J78bPUvLjxmjaEkdjxWLeENQtcfXm7iobqB49uT1Bgp3"
-                ],
-                "inputs": [
-                  "0:T:15128:6A50FF82410387B239489CE38B34E0FDDE1697FE:10000"
-                ],
-                "outputs": [
-                  "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:42",
-                  "J78bPUvLjxmjaEkdjxWLeENQtcfXm7iobqB49uT1Bgp3:9958"
-                ],
-                "comment": "",
-                "signatures": [
-                  "XhBcCPizPiWdKeXWg1DX/FTQst6DppEjsYEtoAZNA0P11reXtgc9IduiIxNWzNjt/KvTw8APkSI8/Uf31QQVDA=="
-                ],
-                "hash": "ADE7D1C4002D6BC10013C34CE22733A55173BAD4",
-                "block_number": 15778,
-                "time": 1432314584
-              }
-            ],
-            "sending": [
-              {
-                "version": 1,
-                "issuers": [
-                  "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk"
-                ],
-                "inputs": [
-                  "0:D:8196:000022AD426FE727C707D847EC2168A64C577706:5872"
-                ],
-                "outputs": [
-                  "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:5871"
-                  "2sq8bBDQGK74f1eD3mAPQVgHCmFdijZr9nbv16FwbokX:1",
-                ],
-                "comment": "some comment",
-                "signatures": [
-                  "kLOAAy7/UldQk7zz4I7Jhv9ICuGYRx7upl8wH8RYL43MMF6+7MbPh3QRN1qNFGpAfa3XMWIQmbUWtjZKP6OfDA=="
-                ],
-                "hash": "BA41013F2CD38EDFFA9D38A275F8532DD906A2DE"
-              }
-            ],
-            "receiving": [
-             {
-                "version": 1,
-                "issuers": [
-                  "2sq8bBDQGK74f1eD3mAPQVgHCmFdijZr9nbv16FwbokX"
-                ],
-                "inputs": [
-                  "0:D:8196:000022AD426FE727C707D847EC2168A64C577706:4334"
-                ],
-                "outputs": [
-                  "2sq8bBDQGK74f1eD3mAPQVgHCmFdijZr9nbv16FwbokX:1",
-                  "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:4333"
-                ],
-                "comment": "some comment",
-                "signatures": [
-                  "DRiZinUEKrrLiJNogtydzwEbmETrvWiLNYXCiJsRekxTLyU5g4LjnwiLp/XlvmIekjJK5n/gullLWrHUBvFSAw=="
-                ],
-                "hash": "A0A511131CD0E837204A9441B3354918AC4CE671"
-              }
-            ]
-          }
+            "currency": "meta_brouzouf",
+            "pubkey": "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk",
+            "history": {
+                "sent": [
+                    {
+                        "version": 1,
+                        "issuers": [
+                            "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk"
+                        ],
+                        "inputs": [
+                            "0:D:125:000A8362AE0C1B8045569CE07735DE4C18E81586:100"
+                        ],
+                        "outputs": [
+                            "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:5",
+                            "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:95"
+                        ],
+                        "comment": "Essai",
+                        "signatures": [
+                            "8zzWSU+GNSNURnH1NKPT/TBoxngEc/0wcpPSbs7FqknGxud+94knvT+dpe99k6NwyB5RXvOVnKAr4p9/KEluCw=="
+                        ],
+                        "hash": "FC7BAC2D94AC9C16AFC5C0150C2C9E7FBB2E2A09",
+                        "block_number": 173,
+                        "time": 1421932545
+                    }
+                ],
+                "received": [
+                    {
+                        "version": 1,
+                        "issuers": [
+                            "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU"
+                        ],
+                        "inputs": [
+                            "0:D:125:000A8362AE0C1B8045569CE07735DE4C18E81586:100"
+                        ],
+                        "outputs": [
+                            "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:7",
+                            "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:93"
+                        ],
+                        "comment": "",
+                        "signatures": [
+                            "1Mn8q3K7N+R4GZEpAUm+XSyty1Uu+BuOy5t7BIRqgZcKqiaxfhAUfDBOcuk2i4TJy1oA5Rntby8hDN+cUCpvDg=="
+                        ],
+                        "hash": "5FB3CB80A982E2BDFBB3EA94673A74763F58CB2A",
+                        "block_number": 207,
+                        "time": 1421955525
+                    },
+                    {
+                        "version": 1,
+                        "issuers": [
+                            "J78bPUvLjxmjaEkdjxWLeENQtcfXm7iobqB49uT1Bgp3"
+                        ],
+                        "inputs": [
+                            "0:T:15128:6A50FF82410387B239489CE38B34E0FDDE1697FE:10000"
+                        ],
+                        "outputs": [
+                            "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:42",
+                            "J78bPUvLjxmjaEkdjxWLeENQtcfXm7iobqB49uT1Bgp3:9958"
+                        ],
+                        "comment": "",
+                        "signatures": [
+                            "XhBcCPizPiWdKeXWg1DX/FTQst6DppEjsYEtoAZNA0P11reXtgc9IduiIxNWzNjt/KvTw8APkSI8/Uf31QQVDA=="
+                        ],
+                        "hash": "ADE7D1C4002D6BC10013C34CE22733A55173BAD4",
+                        "block_number": 15778,
+                        "time": 1432314584
+                    }
+                ],
+                "sending": [
+                    {
+                        "version": 1,
+                        "issuers": [
+                            "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk"
+                        ],
+                        "inputs": [
+                            "0:D:8196:000022AD426FE727C707D847EC2168A64C577706:5872"
+                        ],
+                        "outputs": [
+                            "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:5871"
+                            "2sq8bBDQGK74f1eD3mAPQVgHCmFdijZr9nbv16FwbokX:1",
+                        ],
+                        "comment": "some comment",
+                        "signatures": [
+                            "kLOAAy7/UldQk7zz4I7Jhv9ICuGYRx7upl8wH8RYL43MMF6+7MbPh3QRN1qNFGpAfa3XMWIQmbUWtjZKP6OfDA=="
+                        ],
+                        "hash": "BA41013F2CD38EDFFA9D38A275F8532DD906A2DE"
+                    }
+                ],
+                "receiving": [
+                    {
+                        "version": 1,
+                        "issuers": [
+                            "2sq8bBDQGK74f1eD3mAPQVgHCmFdijZr9nbv16FwbokX"
+                        ],
+                        "inputs": [
+                            "0:D:8196:000022AD426FE727C707D847EC2168A64C577706:4334"
+                        ],
+                        "outputs": [
+                            "2sq8bBDQGK74f1eD3mAPQVgHCmFdijZr9nbv16FwbokX:1",
+                            "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:4333"
+                        ],
+                        "comment": "some comment",
+                        "signatures": [
+                            "DRiZinUEKrrLiJNogtydzwEbmETrvWiLNYXCiJsRekxTLyU5g4LjnwiLp/XlvmIekjJK5n/gullLWrHUBvFSAw=="
+                        ],
+                        "hash": "A0A511131CD0E837204A9441B3354918AC4CE671"
+                    }
+                ]
+            }
         }
         jsonschema.validate(json_sample, HISTORY_SCHEMA)
 
@@ -128,9 +130,9 @@ class Test_BMA_TX(WebFunctionalSetupMixin, unittest.TestCase):
         async def go():
             _, port, url = await self.create_server('GET', '/tx/history/pubkey', handler)
             with self.assertRaises(jsonschema.exceptions.ValidationError):
-                async with aiohttp.ClientSession() as session:
-                    connection = BMAEndpoint("127.0.0.1", None, None, port).conn_handler(session)
-                    await history(connection, 'pubkey')
+                client = Client(BMAEndpoint("127.0.0.1", "", "", port))
+                await client(history, 'pubkey')
+            await client.close()
 
         self.loop.run_until_complete(go())
 
@@ -142,34 +144,34 @@ class Test_BMA_TX(WebFunctionalSetupMixin, unittest.TestCase):
         async def go():
             _, port, url = await self.create_server('GET', '/tx/history/pubkey/blocks/0/100', handler)
             with self.assertRaises(jsonschema.exceptions.ValidationError):
-                async with aiohttp.ClientSession() as session:
-                    connection = BMAEndpoint("127.0.0.1", None, None, port).conn_handler(session)
-                    await blocks(connection, 'pubkey', 0, 100)
+                client = Client(BMAEndpoint("127.0.0.1", "", "", port))
+                await client(blocks, 'pubkey', 0, 100)
+            await client.close()
 
         self.loop.run_until_complete(go())
 
     def test_bma_tx_sources(self):
         json_sample = {
-          "currency": "meta_brouzouf",
-          "pubkey": "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU",
-          "sources": [
-            {
-              "pubkey": "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU",
-              "type": "T",
-              "noffset": 34444,
-              "identifier": "6ACECB199D1B054B2633D0E42C066939B7F8EF1D",
-              "amount": 1000000,
-              "base": 1
-            },
-            {
-              "pubkey": "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU",
-              "type": "D",
-              "noffset": 34989,
-              "identifier": "0007CCC9755067008C28E791E6F2B0D4CBE9B894",
-              "amount": 1730543585843,
-              "base": 2
-            }
-          ]
+            "currency": "meta_brouzouf",
+            "pubkey": "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU",
+            "sources": [
+                {
+                    "pubkey": "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU",
+                    "type": "T",
+                    "noffset": 34444,
+                    "identifier": "6ACECB199D1B054B2633D0E42C066939B7F8EF1D",
+                    "amount": 1000000,
+                    "base": 1
+                },
+                {
+                    "pubkey": "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU",
+                    "type": "D",
+                    "noffset": 34989,
+                    "identifier": "0007CCC9755067008C28E791E6F2B0D4CBE9B894",
+                    "amount": 1730543585843,
+                    "base": 2
+                }
+            ]
         }
         jsonschema.validate(json_sample, SOURCES_SCHEMA)
 
@@ -181,8 +183,8 @@ class Test_BMA_TX(WebFunctionalSetupMixin, unittest.TestCase):
         async def go():
             _, port, url = await self.create_server('GET', '/tx/sources/pubkey', handler)
             with self.assertRaises(jsonschema.exceptions.ValidationError):
-                async with aiohttp.ClientSession() as session:
-                    connection = BMAEndpoint("127.0.0.1", None, None, port).conn_handler(session)
-                    await sources(connection, 'pubkey')
+                client = Client(BMAEndpoint("127.0.0.1", "", "", port))
+                await client(sources, 'pubkey')
+            await client.close()
 
         self.loop.run_until_complete(go())
diff --git a/tests/api/bma/test_wot.py b/tests/api/bma/test_wot.py
index 061890e925ebbc12f92f381c482bac7b18b84ed4..b1d68712da56001b3d2f513e2e40908321700114 100644
--- a/tests/api/bma/test_wot.py
+++ b/tests/api/bma/test_wot.py
@@ -1,162 +1,164 @@
-import aiohttp
+import json
 import unittest
+
 import jsonschema
-import json
-from tests.api.webserver import WebFunctionalSetupMixin, web, asyncio
-from duniterpy.documents import BMAEndpoint
-from duniterpy.api.bma.wot import lookup, members, certified_by, certifiers_of, requirements, \
-    REQUIREMENTS_SCHEMA, CERTIFICATIONS_SCHEMA, LOOKUP_SCHEMA, MEMBERS_SCHEMA
 
+from duniterpy.api.bma.wot import lookup, members, certified_by, certifiers_of, REQUIREMENTS_SCHEMA, \
+    CERTIFICATIONS_SCHEMA, LOOKUP_SCHEMA, MEMBERS_SCHEMA
+from duniterpy.api.client import Client
+from duniterpy.api.endpoint import BMAEndpoint
+from tests.api.webserver import WebFunctionalSetupMixin, web
 
-class Test_BMA_Wot(WebFunctionalSetupMixin, unittest.TestCase):
+
+class TestBmaWot(WebFunctionalSetupMixin, unittest.TestCase):
     def test_bma_wot_lookup(self):
         json_sample = {
-  "partial": False,
-  "results": [
-            {
-              "pubkey": "5cnvo5bmR8QbtyNVnkDXWq6n5My6oNLd1o6auJApGCsv",
-              "uids": [
+            "partial": False,
+            "results": [
                 {
-                  "uid": "inso",
-                  "meta": {
-                    "timestamp": "0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855"
-                  },
-                  "revoked": False,
-                  "revoked_on": None,
-                  "revocation_sig": None,
-                  "self": "gTUSERA3IqEzMDvdpiFkTgBBFKwUl7M62e+VCzwyHJTrxvBSB+C+8ImoKsd7pYFAnZ+HL6cJ1p7jyVUIOZGqCw==",
-                  "others": [
-                    {
-                      "pubkey": "Ds1z6Wd8hNTexBoo3LVG2oXLZN4dC9ZWxoWwnDbF1NEW",
-                      "meta": {
-                        "block_number": 0,
-                        "block_hash": "000003D02B95D3296A4F06DBAC51775C4336A4DC09D0E958DC40033BE7E20F3D"
-                      },
-                      "uids": [
-                        "Galuel"
-                      ],
-                      "isMember": True,
-                      "wasMember": True,
-                      "signature": "iK3TOdqrHhUbHNB3cPpmWd8sTL2hz0wiScZmXlRc8WhLg2et3xMjAHMuF+wuiM9/7R3daKZq5dOGF3drOuApAg=="
-                    },
-                    {
-                      "pubkey": "7F6oyFQywURCACWZZGtG97Girh9EL1kg2WBwftEZxDoJ",
-                      "meta": {
-                        "block_number": 0,
-                        "block_hash": "000003D02B95D3296A4F06DBAC51775C4336A4DC09D0E958DC40033BE7E20F3D"
-                      },
-                      "uids": [
-                        "vit"
-                      ],
-                      "isMember": True,
-                      "wasMember": True,
-                      "signature": "eTdxT+2VikgYgdFENy/zmYxFyDDpBuGDBHedS7CzlEfYWU7iClZ9se06QdtzkFtiOtQ1BBkWPVMXxbqF8KSECw=="
-                    },
-                      ]
+                    "pubkey": "5cnvo5bmR8QbtyNVnkDXWq6n5My6oNLd1o6auJApGCsv",
+                    "uids": [
+                        {
+                            "uid": "inso",
+                            "meta": {
+                                "timestamp": "0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855"
+                            },
+                            "revoked": False,
+                            "revoked_on": None,
+                            "revocation_sig": None,
+                            "self": "gTUSERA3IqEzMDvdpiFkTgBBFKwUl7M62e+VCzwyHJTrxvBSB+C+8ImoKsd7pYFAnZ+HL6cJ1p7jyVUIOZGqCw==",
+                            "others": [
+                                {
+                                    "pubkey": "Ds1z6Wd8hNTexBoo3LVG2oXLZN4dC9ZWxoWwnDbF1NEW",
+                                    "meta": {
+                                        "block_number": 0,
+                                        "block_hash": "000003D02B95D3296A4F06DBAC51775C4336A4DC09D0E958DC40033BE7E20F3D"
+                                    },
+                                    "uids": [
+                                        "Galuel"
+                                    ],
+                                    "isMember": True,
+                                    "wasMember": True,
+                                    "signature": "iK3TOdqrHhUbHNB3cPpmWd8sTL2hz0wiScZmXlRc8WhLg2et3xMjAHMuF+wuiM9/7R3daKZq5dOGF3drOuApAg=="
+                                },
+                                {
+                                    "pubkey": "7F6oyFQywURCACWZZGtG97Girh9EL1kg2WBwftEZxDoJ",
+                                    "meta": {
+                                        "block_number": 0,
+                                        "block_hash": "000003D02B95D3296A4F06DBAC51775C4336A4DC09D0E958DC40033BE7E20F3D"
+                                    },
+                                    "uids": [
+                                        "vit"
+                                    ],
+                                    "isMember": True,
+                                    "wasMember": True,
+                                    "signature": "eTdxT+2VikgYgdFENy/zmYxFyDDpBuGDBHedS7CzlEfYWU7iClZ9se06QdtzkFtiOtQ1BBkWPVMXxbqF8KSECw=="
+                                },
+                            ]
+                        },
+                    ],
+                    "signed": [
+                        {
+                            "uid": "yannlefranco",
+                            "pubkey": "8SJZia3RJ36hp3wXy8AJXJj8z7yeLHCVaTtv2xSi2MBj",
+                            "meta": {
+                                "timestamp": "0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855"
+                            },
+                            "cert_time": {
+                                "block": 0
+                            },
+                            "isMember": True,
+                            "wasMember": True,
+                            "signature": "lYdOV3uLH3DQHzuODuaZXQnfPIKKF9AsT84b8pkmgU65trAojmTpuBgaYaPN0Yce+8dwtdHxby7h5pO0RWgRBw=="
+                        },
+                        {
+                            "uid": "Galuel",
+                            "pubkey": "Ds1z6Wd8hNTexBoo3LVG2oXLZN4dC9ZWxoWwnDbF1NEW",
+                            "meta": {
+                                "timestamp": "0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855"
+                            },
+                            "cert_time": {
+                                "block": 0
+                            },
+                            "isMember": True,
+                            "wasMember": True,
+                            "signature": "PcZUAleSeR38CbL5zfcdN2+ir+s11Y6oIl2iO4t80M4PXKXWHeqd0uYore0JibMBVnIhpLqcC8SpyVmZnfdaAQ=="
+                        }
+                    ]
                 },
-              ],
-              "signed": [
-                    {
-                      "uid": "yannlefranco",
-                      "pubkey": "8SJZia3RJ36hp3wXy8AJXJj8z7yeLHCVaTtv2xSi2MBj",
-                      "meta": {
-                        "timestamp": "0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855"
-                      },
-                      "cert_time": {
-                        "block": 0
-                      },
-                      "isMember": True,
-                      "wasMember": True,
-                      "signature": "lYdOV3uLH3DQHzuODuaZXQnfPIKKF9AsT84b8pkmgU65trAojmTpuBgaYaPN0Yce+8dwtdHxby7h5pO0RWgRBw=="
-                    },
-                    {
-                      "uid": "Galuel",
-                      "pubkey": "Ds1z6Wd8hNTexBoo3LVG2oXLZN4dC9ZWxoWwnDbF1NEW",
-                      "meta": {
-                        "timestamp": "0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855"
-                      },
-                      "cert_time": {
-                        "block": 0
-                      },
-                      "isMember": True,
-                      "wasMember": True,
-                      "signature": "PcZUAleSeR38CbL5zfcdN2+ir+s11Y6oIl2iO4t80M4PXKXWHeqd0uYore0JibMBVnIhpLqcC8SpyVmZnfdaAQ=="
-                    }
-          ]
-            },
-            {
-              "pubkey": "7hygreNPE4LJpQhB6zHqGsofKA2G3dDXQM2n6LkDBakB",
-              "uids": [
                 {
-                  "uid": "Mymypinson",
-                  "meta": {
-                    "timestamp": "17524-00000C1533A49A4EC583B91148E2A38E91E39396BAD0C8D3A5B93338E905EF83"
-                  },
-                  "revoked": False,
-                  "revoked_on": None,
-                  "revocation_sig": None,
-                  "self": "trkirggMe9HsnO4T2FV9h1NKzxiZncXB5D5znhuq3zDZaY3MTja2edWaJhO0KcFU4yZdQPudt8ltldYL0rk1Cg==",
-                  "others": [
-                    {
-                      "pubkey": "zio4Jp8hnqkYmoz5FMYm1siCjGmjWzVUg27KMfDoefA",
-                      "meta": {
-                        "block_number": 19452,
-                        "block_hash": "00000B96722EC36F4089D2490929931B3CF26994A8ED6708C6C71370D60AA25F"
-                      },
-                      "uids": [
-                        "eliadem"
-                      ],
-                      "isMember": True,
-                      "wasMember": True,
-                      "signature": "GJJa4T9eOJf6oL+SYLGQDnD4K1TpC1492ItGa4+51imkJRXMTvvYmZguwbOuBn8GRISxlMqfgzbHzj5SFG0ODg=="
-                    },
-                    {
-                      "pubkey": "5SwfQubSat5SunNafCsunEGTY93nVM4kLSsuprNqQb6S",
-                      "meta": {
-                        "block_number": 19452,
-                        "block_hash": "00000B96722EC36F4089D2490929931B3CF26994A8ED6708C6C71370D60AA25F"
-                      },
-                      "uids": [
-                        "Patrice_F"
-                      ],
-                      "isMember": True,
-                      "wasMember": True,
-                      "signature": "E2Km7x6L8/iiFuWVa+UHailM/AOsM/1COj9aQM7B0bDRMx6h+iSfOPxnUSXydiaeT1FPlNeLZOEKIcNmRk6gCA=="
-                    },
-                  ],
+                    "pubkey": "7hygreNPE4LJpQhB6zHqGsofKA2G3dDXQM2n6LkDBakB",
+                    "uids": [
+                        {
+                            "uid": "Mymypinson",
+                            "meta": {
+                                "timestamp": "17524-00000C1533A49A4EC583B91148E2A38E91E39396BAD0C8D3A5B93338E905EF83"
+                            },
+                            "revoked": False,
+                            "revoked_on": None,
+                            "revocation_sig": None,
+                            "self": "trkirggMe9HsnO4T2FV9h1NKzxiZncXB5D5znhuq3zDZaY3MTja2edWaJhO0KcFU4yZdQPudt8ltldYL0rk1Cg==",
+                            "others": [
+                                {
+                                    "pubkey": "zio4Jp8hnqkYmoz5FMYm1siCjGmjWzVUg27KMfDoefA",
+                                    "meta": {
+                                        "block_number": 19452,
+                                        "block_hash": "00000B96722EC36F4089D2490929931B3CF26994A8ED6708C6C71370D60AA25F"
+                                    },
+                                    "uids": [
+                                        "eliadem"
+                                    ],
+                                    "isMember": True,
+                                    "wasMember": True,
+                                    "signature": "GJJa4T9eOJf6oL+SYLGQDnD4K1TpC1492ItGa4+51imkJRXMTvvYmZguwbOuBn8GRISxlMqfgzbHzj5SFG0ODg=="
+                                },
+                                {
+                                    "pubkey": "5SwfQubSat5SunNafCsunEGTY93nVM4kLSsuprNqQb6S",
+                                    "meta": {
+                                        "block_number": 19452,
+                                        "block_hash": "00000B96722EC36F4089D2490929931B3CF26994A8ED6708C6C71370D60AA25F"
+                                    },
+                                    "uids": [
+                                        "Patrice_F"
+                                    ],
+                                    "isMember": True,
+                                    "wasMember": True,
+                                    "signature": "E2Km7x6L8/iiFuWVa+UHailM/AOsM/1COj9aQM7B0bDRMx6h+iSfOPxnUSXydiaeT1FPlNeLZOEKIcNmRk6gCA=="
+                                },
+                            ],
+                        }
+                    ],
+                    "signed": [
+                        {
+                            "uid": "Duarte",
+                            "pubkey": "GRBPV3Y7PQnB9LaZhSGuS3BqBJbSHyibzYq65kTh1nQ4",
+                            "meta": {
+                                "timestamp": "20544-000008FFA0AABEA96759559DA426D92880EA35878C680479135A5C9A3FFA8BF9"
+                            },
+                            "cert_time": {
+                                "block": 35202
+                            },
+                            "isMember": True,
+                            "wasMember": True,
+                            "signature": "regfnOZWIrA4Tkj+MU6PFwHcfm/8G+ygDlNGKUP7b5pLhBHGVVMIw3xh6PcLHSkUUmnxlTImuqGJg+ky6dl3CA=="
+                        },
+                        {
+                            "uid": "NicolasCARRAT",
+                            "pubkey": "44PxHAjt5L9vasbgruPeccs1kjhG3sdzP3ATRWvXSLop",
+                            "meta": {
+                                "timestamp": "21924-000007B75B75D8E6393F609BD42423776FAB90500BCAE7EAAC498BD8EC6DFABB"
+                            },
+                            "cert_time": {
+                                "block": 36645
+                            },
+                            "isMember": True,
+                            "wasMember": True,
+                            "signature": "kC8hoeM2b0wiis5iaF4aHEzRUs0YQy7qJyPFD4rGtZ6II+EN5WbvmxQaN7PckoRUbbSFhNC4gMcnrClNdchBBQ=="
+                        },
+                    ]
                 }
-              ],
-                "signed": [
-                    {
-                      "uid": "Duarte",
-                      "pubkey": "GRBPV3Y7PQnB9LaZhSGuS3BqBJbSHyibzYq65kTh1nQ4",
-                      "meta": {
-                        "timestamp": "20544-000008FFA0AABEA96759559DA426D92880EA35878C680479135A5C9A3FFA8BF9"
-                      },
-                      "cert_time": {
-                        "block": 35202
-                      },
-                      "isMember": True,
-                      "wasMember": True,
-                      "signature": "regfnOZWIrA4Tkj+MU6PFwHcfm/8G+ygDlNGKUP7b5pLhBHGVVMIw3xh6PcLHSkUUmnxlTImuqGJg+ky6dl3CA=="
-                    },
-                    {
-                      "uid": "NicolasCARRAT",
-                      "pubkey": "44PxHAjt5L9vasbgruPeccs1kjhG3sdzP3ATRWvXSLop",
-                      "meta": {
-                        "timestamp": "21924-000007B75B75D8E6393F609BD42423776FAB90500BCAE7EAAC498BD8EC6DFABB"
-                      },
-                      "cert_time": {
-                        "block": 36645
-                      },
-                      "isMember": True,
-                      "wasMember": True,
-                      "signature": "kC8hoeM2b0wiis5iaF4aHEzRUs0YQy7qJyPFD4rGtZ6II+EN5WbvmxQaN7PckoRUbbSFhNC4gMcnrClNdchBBQ=="
-                    },
-          ]
-            }
-          ]
-    }
+            ]
+        }
         jsonschema.validate(json_sample, LOOKUP_SCHEMA)
 
     def test_bma_wot_lookup_bad(self):
@@ -167,9 +169,9 @@ class Test_BMA_Wot(WebFunctionalSetupMixin, unittest.TestCase):
         async def go():
             _, port, url = await self.create_server('GET', '/wot/lookup/pubkey', handler)
             with self.assertRaises(jsonschema.exceptions.ValidationError):
-                async with aiohttp.ClientSession() as session:
-                    connection = BMAEndpoint("127.0.0.1", None, None, port).conn_handler(session)
-                    await lookup(connection, 'pubkey')
+                client = Client(BMAEndpoint("127.0.0.1", "", "", port))
+                await client(lookup, 'pubkey')
+            await client.close()
 
         self.loop.run_until_complete(go())
 
@@ -191,9 +193,9 @@ class Test_BMA_Wot(WebFunctionalSetupMixin, unittest.TestCase):
         async def go():
             _, port, url = await self.create_server('GET', '/wot/members', handler)
             with self.assertRaises(jsonschema.exceptions.ValidationError):
-                async with aiohttp.ClientSession() as session:
-                    connection = BMAEndpoint("127.0.0.1", None, None, port).conn_handler(session)
-                    await members(connection)
+                client = Client(BMAEndpoint("127.0.0.1", "", "", port))
+                await client(members)
+            await client.close()
 
         self.loop.run_until_complete(go())
 
@@ -245,9 +247,9 @@ class Test_BMA_Wot(WebFunctionalSetupMixin, unittest.TestCase):
         async def go():
             _, port, url = await self.create_server('GET', '/wot/certifiers-of/pubkey', handler)
             with self.assertRaises(jsonschema.exceptions.ValidationError):
-                async with aiohttp.ClientSession() as session:
-                    connection = BMAEndpoint("127.0.0.1", None, None, port).conn_handler(session)
-                    await certifiers_of(connection, 'pubkey')
+                client = Client(BMAEndpoint("127.0.0.1", "", "", port))
+                await client(certifiers_of, 'pubkey')
+            await client.close()
 
         self.loop.run_until_complete(go())
 
@@ -277,9 +279,9 @@ class Test_BMA_Wot(WebFunctionalSetupMixin, unittest.TestCase):
         async def go():
             _, port, url = await self.create_server('GET', '/wot/certifiers-of/pubkey', handler)
             with self.assertRaises(jsonschema.exceptions.ValidationError):
-                async with aiohttp.ClientSession() as session:
-                    connection = BMAEndpoint("127.0.0.1", None, None, port).conn_handler(session)
-                    await certifiers_of(connection, 'pubkey')
+                client = Client(BMAEndpoint("127.0.0.1", "", "", port))
+                await client(certifiers_of, 'pubkey')
+            await client.close()
 
         self.loop.run_until_complete(go())
 
@@ -291,9 +293,9 @@ class Test_BMA_Wot(WebFunctionalSetupMixin, unittest.TestCase):
         async def go():
             _, port, url = await self.create_server('GET', '/wot/certified-by/pubkey', handler)
             with self.assertRaises(jsonschema.exceptions.ValidationError):
-                async with aiohttp.ClientSession() as session:
-                    connection = BMAEndpoint("127.0.0.1", None, None, port).conn_handler(session)
-                    await certified_by(connection, 'pubkey')
+                client = Client(BMAEndpoint("127.0.0.1", "", "", port))
+                await client(certified_by, 'pubkey')
+            await client.close()
 
         self.loop.run_until_complete(go())
 
@@ -341,4 +343,3 @@ class Test_BMA_Wot(WebFunctionalSetupMixin, unittest.TestCase):
             ]
         }
         jsonschema.validate(json_sample, REQUIREMENTS_SCHEMA)
-
diff --git a/tests/api/test_bma.py b/tests/api/test_bma.py
index f6791bc7c0c55cfe251e1e2f678245fdd4e0f0b2..f013f536cafac43ff6cdc3cbc501fe9489eef8e2 100644
--- a/tests/api/test_bma.py
+++ b/tests/api/test_bma.py
@@ -1,9 +1,10 @@
 import unittest
-from duniterpy.api.bma import API, parse_error
-from duniterpy.documents.peer import BMAEndpoint
 
+from duniterpy.api.client import API, parse_error
+from duniterpy.api.endpoint import BMAEndpoint
 
-class Test_BMA_API(unittest.TestCase):
+
+class TestBmaApi(unittest.TestCase):
 
     def test_reverse_url_complete(self):
         endpoint = BMAEndpoint("test.com", "124.2.2.1", "2001:0db8:0000:85a3:0000:0000:ac1f:8001 ", 9092)
@@ -11,17 +12,17 @@ class Test_BMA_API(unittest.TestCase):
         self.assertEqual(api.reverse_url("http", "/test/url"), "http://test.com:9092/any/test/url")
 
     def test_reverse_url_only_ipv4(self):
-        endpoint = BMAEndpoint(None, "124.2.2.1", None, 9092)
+        endpoint = BMAEndpoint("", "124.2.2.1", "", 9092)
         api = API(endpoint.conn_handler(), "any")
         self.assertEqual(api.reverse_url("http", "/test/url"), "http://124.2.2.1:9092/any/test/url")
 
     def test_reverse_url_only_ipv6(self):
-        endpoint = BMAEndpoint(None, None, "2001:0db8:0000:85a3:0000:0000:ac1f:8001", 9092)
+        endpoint = BMAEndpoint("", "", "2001:0db8:0000:85a3:0000:0000:ac1f:8001", 9092)
         api = API(endpoint.conn_handler(), "any")
-        self.assertEqual(api.reverse_url("http", "/test/url"), "http://[2001:0db8:0000:85a3:0000:0000:ac1f:8001]:9092/any/test/url")
+        self.assertEqual(api.reverse_url("http", "/test/url"),
+                         "http://[2001:0db8:0000:85a3:0000:0000:ac1f:8001]:9092/any/test/url")
 
     def test_parse_error(self):
-        api = API(None, "any")
         error = parse_error("""{
 "ucode": 1005,
 "message": "Document has unkown fields or wrong line ending format"
diff --git a/tests/api/webserver.py b/tests/api/webserver.py
index 79bf3c30c4e71ffa3afe12565944a3f0a0f966a9..db6f529d1b595d7cb3d93481dae61bb413bbc39c 100644
--- a/tests/api/webserver.py
+++ b/tests/api/webserver.py
@@ -1,7 +1,6 @@
 import asyncio
 import socket
 from aiohttp import web
-from aiohttp import log
 
 
 # Thanks to aiohttp tests courtesy
@@ -46,4 +45,4 @@ class WebFunctionalSetupMixin:
 
         protocol = "https" if ssl_ctx else "http"
         url = "{}://127.0.0.1:{}".format(protocol, port) + path
-        return app, port, url
\ No newline at end of file
+        return app, port, url