diff --git a/_ucoinpy_test/documents/test_block.py b/_ucoinpy_test/documents/test_block.py
new file mode 100644
index 0000000000000000000000000000000000000000..0dcc8d744a31032e81cc95f72d33fc97b915f4ba
--- /dev/null
+++ b/_ucoinpy_test/documents/test_block.py
@@ -0,0 +1,42 @@
+'''
+Created on 12 déc. 2014
+
+@author: inso
+'''
+import pytest
+from ucoinpy.documents.block import Block
+from mock import Mock
+
+
+raw_block = "Version: 1\nType: \
+Block\nCurrency: zeta_brouzouf\n\
+Nonce: 45079\nNumber: 15\nPoWMin: 4\n\
+Time: 1418083330\nMedianTime: 1418080208\n\
+Issuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\n\
+PreviousHash: 0000E73C340601ACA1AD5AAA5B5E56B03E178EF8\n\
+PreviousIssuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\n\
+MembersCount: 4\nIdentities:\nJoiners:\nActives:\nLeavers:\n\
+Excluded:\nCertifications:\nTransactions:\n"
+
+
+class Test_Block:
+    def test_fromraw(self):
+        block = Block.from_raw(raw_block)
+        assert block.version == 1
+        assert block.currency == "zeta_brouzouf"
+        assert block.noonce == 45079
+        assert block.number == 15
+        assert block.powmin == 4
+        assert block.time == 1418083330
+        assert block.mediantime == 1418080208
+        assert block.issuer == "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk"
+        assert block.previoushash == "0000E73C340601ACA1AD5AAA5B5E56B03E178EF8"
+        assert block.previousissuer == "0000E73C340601ACA1AD5AAA5B5E56B03E178EF8"
+        assert block.memberscount == 4
+        assert block.identities == []
+        assert block.joiners == []
+        assert block.actives == []
+        assert block.leavers == []
+        assert block.excluded == []
+        assert block.certifications == []
+        assert block.transactions == []
diff --git a/_ucoinpy_test/documents/test_certification.py b/_ucoinpy_test/documents/test_certification.py
new file mode 100644
index 0000000000000000000000000000000000000000..0d53c3b3c1cf08ac94a21a0b000ba79d158d060f
--- /dev/null
+++ b/_ucoinpy_test/documents/test_certification.py
@@ -0,0 +1,31 @@
+'''
+Created on 6 déc. 2014
+
+@author: inso
+'''
+
+import pytest
+from ucoinpy.documents.certification import SelfCertification
+from ucoinpy.key import Base58Encoder
+from mock import Mock
+
+from nacl.signing import SigningKey
+
+uid = "lolcat"
+timestamp = 1409990782.24
+correct_certification = """UID:lolcat
+META:TS:1409990782
+J3G9oM5AKYZNLAB5Wx499w61NuUoS57JVccTShUbGpCMjCqj9yXXqNq7dyZpDWA6BxipsiaMZhujMeBfCznzyci
+"""
+
+key = SigningKey()
+
+
+class Test_SelfCertification:
+    '''
+    classdocs
+    '''
+
+    def test_certification(self):
+        cert = SelfCertification(timestamp, uid)
+        assert cert.signed(key) == correct_certification
diff --git a/ucoinpy/documents/block.py b/ucoinpy/documents/block.py
index c849531f660abe86df4fb8cfa8f132ef58592e4d..55bb26a2706892b7ae6062c4ffd6962b0d89710a 100644
--- a/ucoinpy/documents/block.py
+++ b/ucoinpy/documents/block.py
@@ -53,7 +53,7 @@ COMPACT_TRANSACTION
 BOTTOM_SIGNATURE
     '''
 
-    re_currency = re.compile("Currency: ([0-9a-zA-Z_\-]+)\n")
+    re_type = re.compile("Type: (Block)\n")
     re_noonce = re.compile("Nonce: ([0-9]+)\n")
     re_number = re.compile("Number: ([0-9]+)\n")
     re_powmin = re.compile("PoWMin: ([0-9]+)\n")
@@ -111,46 +111,49 @@ BOTTOM_SIGNATURE
 
         n = 0
 
-        version = Block.RE_VERSION.match(lines[n])
-        n = 1
+        version = Block.re_version.match(lines[n]).group(1)
+        n = n + 1
 
-        currency = Block.re_currency.match(lines[n])
-        n = 2
+        type = Block.re_type.match(lines[n]).group(1)
+        n = n + 1
 
-        noonce = int(Block.re_noonce.match(lines[n]))
-        n = 3
+        currency = Block.re_currency.match(lines[n]).group(1)
+        n = n + 1
 
-        number = int(Block.re_number.match(lines[n]))
-        n = 4
+        noonce = int(Block.re_noonce.match(lines[n])).group(1)
+        n = n + 1
 
-        powmin = int(Block.re_powmin.match(lines[n]))
-        n = 5
+        number = int(Block.re_number.match(lines[n])).group(1)
+        n = n + 1
 
-        time = int(Block.re_time.match(lines[n]))
-        n = 6
+        powmin = int(Block.re_powmin.match(lines[n])).group(1)
+        n = n + 1
+
+        time = int(Block.re_time.match(lines[n])).group(1)
+        n = n + 1
 
-        mediantime = int(Block.re_mediantime.match(lines[n]))
-        n = 7
+        mediantime = int(Block.re_mediantime.match(lines[n])).group(1)
+        n = n + 1
 
-        ud = Block.re_universaldividend.match(lines[n])
+        ud = Block.re_universaldividend.match(lines[n]).group(1)
         if ud is not None:
             ud = int(ud)
             n = n + 1
 
-        issuer = Block.re_issuer.match(lines[n])
+        issuer = Block.re_issuer.match(lines[n]).group(1)
         n = n + 1
 
-        prev_hash = Block.re_previoushash.match(lines[n])
+        prev_hash = Block.re_previoushash.match(lines[n]).group(1)
         n = n + 1()
 
-        prev_issuer = Block.re_previousissuer.match(lines[n])
+        prev_issuer = Block.re_previousissuer.match(lines[n]).group(1)
         n = n + 1
 
         if number == 0:
-            parameters = Block.re_parameters.match(lines[n])
+            parameters = Block.re_parameters.match(lines[n]).group(1)
             n = n + 1
 
-        members_count = int(Block.re_memberscount.match(lines[n]))
+        members_count = int(Block.re_memberscount.match(lines[n])).group(1)
         n = n + 1
 
         identities = []
@@ -169,25 +172,25 @@ BOTTOM_SIGNATURE
 
         if Block.re_joiners.match(lines[n]) is not None:
             while Block.re_actives.match(lines[n]) is None:
-                membership = Membership.from_inline(version, lines[n])
+                membership = Membership.from_inline(version, currency, "IN", lines[n])
                 joiners.append(membership)
                 lines = lines + 1
 
         if Block.re_actives.match(lines[n]) is not None:
             while Block.re_leavers.match(lines[n]) is None:
-                membership = Membership.from_inline(version, lines[n])
+                membership = Membership.from_inline(version, currency, "IN", lines[n])
                 actives.append(membership)
                 lines = lines + 1
 
         if Block.re_leavers.match(lines[n]) is not None:
             while Block.re_excluded.match(lines[n]) is None:
-                membership = Membership.from_inline(version, lines[n])
+                membership = Membership.from_inline(version, currency, "OUT", lines[n])
                 leavers.append(membership)
                 lines = lines + 1
 
         if Block.re_excluded.match(lines[n]) is not None:
             while Block.re_certifications.match(lines[n]) is None:
-                membership = Membership.from_inline(version, lines[n])
+                membership = Membership.from_inline(version, currency, "OUT", lines[n])
                 excluded.append(membership)
                 lines = lines + 1