diff --git a/Cargo.lock b/Cargo.lock
index 5ecd84f1686ded6b94b0898a4880f7880ee0bec5..b75da19b441f5ba03b5c8680958eeaac40efb270 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -50,7 +50,7 @@ dependencies = [
 
 [[package]]
 name = "duniter-protocol"
-version = "0.4.0"
+version = "0.4.1"
 dependencies = [
  "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "base64 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
diff --git a/protocol/Cargo.toml b/protocol/Cargo.toml
index 0420f09aa36f2a91b2387f02e22bf54dd9bfc409..0bdca9af799e722a32da1bb372834c98b766e715 100644
--- a/protocol/Cargo.toml
+++ b/protocol/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "duniter-protocol"
-version = "0.4.0"
+version = "0.4.1"
 authors = ["nanocryk <nanocryk@duniter.org>"]
 description = "Implements the Duniter Protocol"
 repository = "https://git.duniter.org/nodes/rust/duniter-rs"
diff --git a/protocol/blockchain/mod.rs b/protocol/blockchain/mod.rs
index 3d20cc64ff949e3fb8276ac14e2fd6b6a328afc8..5f997b0c9fd18f8dfc1443f8ca304c22a9c1d42f 100644
--- a/protocol/blockchain/mod.rs
+++ b/protocol/blockchain/mod.rs
@@ -69,7 +69,7 @@ pub trait Document: Debug {
             let signatures = self.signatures();
             let mismatches: Vec<_> = issuers
                 .iter()
-                .zip(signatures.iter())
+                .zip(signatures)
                 .enumerate()
                 .filter(|&(_, (key, signature))| !key.verify(self.as_bytes(), signature))
                 .map(|(i, _)| i)
diff --git a/protocol/blockchain/v10/documents/identity.rs b/protocol/blockchain/v10/documents/identity.rs
index 36aa5a61635fb3c4f82fb772e241c787b1ed9dde..5e901d74e82a3591d44c95df3c117a3f09d2754c 100644
--- a/protocol/blockchain/v10/documents/identity.rs
+++ b/protocol/blockchain/v10/documents/identity.rs
@@ -199,7 +199,7 @@ impl StandardTextDocumentParser for IdentityDocumentParser {
 mod tests {
     use super::*;
     use duniter_crypto::keys::{PrivateKey, PublicKey, Signature};
-    use blockchain::VerificationResult;
+    use blockchain::{Document, VerificationResult};
 
     #[test]
     fn generate_real_document() {
@@ -241,8 +241,8 @@ mod tests {
     #[test]
     fn identity_standard_regex() {
         assert!(IDENTITY_REGEX.is_match(
-            "Issuer: DKpQPUL4ckzXYdnDRvCRKAm1gNvSdmAXnTrJZ7LvM5Qo
-UniqueID: toc
+            "Issuer: DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV
+UniqueID: tic
 Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
 "
         ));
@@ -253,22 +253,28 @@ Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
         let doc = "Version: 10
 Type: Identity
 Currency: duniter_unit_test_currency
-Issuer: DKpQPUL4ckzXYdnDRvCRKAm1gNvSdmAXnTrJZ7LvM5Qo
-UniqueID: toc
+Issuer: DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV
+UniqueID: tic
 Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-lcekuS0eP2dpFL99imJcwvDAwx49diiDMkG8Lj7FLkC/6IJ0tgNjUzCIZgMGi7bL5tODRiWi9B49UMXb8b3MAw==";
+";
 
-        let body = "Issuer: DKpQPUL4ckzXYdnDRvCRKAm1gNvSdmAXnTrJZ7LvM5Qo
-UniqueID: toc
+        let body = "Issuer: DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV
+UniqueID: tic
 Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
 ";
 
         let currency = "duniter_unit_test_currency";
 
         let signatures = vec![Signature::from_base64(
-"lcekuS0eP2dpFL99imJcwvDAwx49diiDMkG8Lj7FLkC/6IJ0tgNjUzCIZgMGi7bL5tODRiWi9B49UMXb8b3MAw=="
+"1eubHHbuNfilHMM0G2bI30iZzebQ2cQ1PC7uPAw08FGMMmQCRerlF/3pc4sAcsnexsxBseA/3lY03KlONqJBAg=="
         ).unwrap(),];
 
-        let _ = IdentityDocumentParser::parse_standard(doc, body, currency, signatures).unwrap();
+        let doc = IdentityDocumentParser::parse_standard(doc, body, currency, signatures).unwrap();
+        if let V10Document::Identity(doc) = doc {
+            println!("Doc : {:?}", doc);
+            assert_eq!(doc.verify_signatures(), VerificationResult::Valid())
+        } else {
+            panic!("Wrong document type");
+        }
     }
 }
diff --git a/protocol/blockchain/v10/documents/membership.rs b/protocol/blockchain/v10/documents/membership.rs
index 07153b79a886e6ef368ae14953be5e3bb03ba444..2710cfeae00c421ff8266da20cb34d72ba6bf64b 100644
--- a/protocol/blockchain/v10/documents/membership.rs
+++ b/protocol/blockchain/v10/documents/membership.rs
@@ -308,7 +308,7 @@ Block: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
 Membership: IN
 UserID: tic
 CertTS: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-s2hUbokkibTAWGEwErw6hyXSWlWFQ2UWs2PWx8d/kkElAyuuWaQq4Tsonuweh1xn4AC1TVWt4yMR3WrDdkhnAw==";
+";
 
         let body = "Issuer: DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV
 Block: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
@@ -323,6 +323,13 @@ CertTS: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
 "s2hUbokkibTAWGEwErw6hyXSWlWFQ2UWs2PWx8d/kkElAyuuWaQq4Tsonuweh1xn4AC1TVWt4yMR3WrDdkhnAw=="
         ).unwrap(),];
 
-        let _ = MembershipDocumentParser::parse_standard(doc, body, currency, signatures).unwrap();
+        let doc =
+            MembershipDocumentParser::parse_standard(doc, body, currency, signatures).unwrap();
+        if let V10Document::Membership(doc) = doc {
+            println!("Doc : {:?}", doc);
+            assert_eq!(doc.verify_signatures(), VerificationResult::Valid())
+        } else {
+            panic!("Wrong document type");
+        }
     }
 }
diff --git a/protocol/blockchain/v10/documents/mod.rs b/protocol/blockchain/v10/documents/mod.rs
index 31ed9af9e8a2bd5b6661ad18e50a4616fe55b9e7..684028d255db4dce5baab69d4622894701fb84f3 100644
--- a/protocol/blockchain/v10/documents/mod.rs
+++ b/protocol/blockchain/v10/documents/mod.rs
@@ -33,11 +33,11 @@ lazy_static! {
         Type: (?P<type>[[:alpha:]]+)\n\
         Currency: (?P<currency>[[:alnum:] _-]+)\n\
         (?P<body>(?:.*\n)+?))\
-        (?P<sigs>([[:alnum:]+/=]+\n)+)$"
+        (?P<sigs>([[:alnum:]+/=]+\n)*([[:alnum:]+/=]+))$"
     ).unwrap();
 
     static ref SIGNATURES_REGEX: Regex = Regex::new(
-        "[[:alnum:]+/=]+\n"
+        "[[:alnum:]+/=]+\n?"
     ).unwrap();
 }
 
@@ -180,6 +180,7 @@ impl<'a> DocumentParser<&'a str, V10Document, V10DocumentParsingError> for V10Do
 #[cfg(test)]
 mod tests {
     use super::*;
+    use blockchain::{Document, VerificationResult};
 
     #[test]
     fn document_regex() {
@@ -215,8 +216,7 @@ Outputs:
 Comment: -----@@@----- (why not this comment?)
 42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r
 2D96KZwNUvVtcapQPq2mm7J9isFcDCfykwJpVEZwBc7tCgL4qPyu17BT5ePozAE9HS6Yvj51f62Mp4n9d9dkzJoX
-2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk
-"
+2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk"
         ));
 
         assert!(DOCUMENT_REGEX.is_match(
@@ -230,8 +230,7 @@ IdtyTimestamp: 32-DB30D958EE5CB75186972286ED3F4686B8A1C2CD
 IdtySignature: J3G9oM5AKYZNLAB5Wx499w61NuUoS57JVccTShUb\
 GpCMjCqj9yXXqNq7dyZpDWA6BxipsiaMZhujMeBfCznzyci
 CertTimestamp: 36-1076F10A7397715D2BEE82579861999EA1F274AC
-SoKwoa8PFfCDJWZ6dNCv7XstezHcc2BbKiJgVDXv82R5zYR83nis9dShLgWJ5w48noVUHimdngzYQneNYSMV3rk
-"
+SoKwoa8PFfCDJWZ6dNCv7XstezHcc2BbKiJgVDXv82R5zYR83nis9dShLgWJ5w48noVUHimdngzYQneNYSMV3rk"
         ));
     }
 
@@ -243,8 +242,7 @@ SoKwoa8PFfCDJWZ6dNCv7XstezHcc2BbKiJgVDXv82R5zYR83nis9dShLgWJ5w48noVUHimdngzYQneN
                     "
 42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r
 2D96KZwNUvVtcapQPq2mm7J9isFcDCfykwJpVEZwBc7tCgL4qPyu17BT5ePozAE9HS6Yvj51f62Mp4n9d9dkzJoX
-2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk
-"
+2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk"
                 )
                 .count(),
             3
@@ -255,11 +253,50 @@ SoKwoa8PFfCDJWZ6dNCv7XstezHcc2BbKiJgVDXv82R5zYR83nis9dShLgWJ5w48noVUHimdngzYQneN
                 .captures_iter(
                     "
 42yQm4hGTJYWkPg39hQAUgP6S6EQ4vTfXdJuxKEHL1ih6YHiDL2hcwrFgBHjXLRgxRhj2VNVqqc6b4JayKqTE14r
-2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk
-"
+2XiBDpuUdu6zCPWGzHXXy8c4ATSscfFQG9DjmqMZUxDZVt1Dp4m2N5oHYVUfoPdrU9SLk4qxi65RNrfCVnvQtQJk"
                 )
                 .count(),
             2
         );
     }
+
+    #[test]
+    fn parse_identity_document() {
+        let text = "Version: 10
+Type: Identity
+Currency: duniter_unit_test_currency
+Issuer: DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV
+UniqueID: tic
+Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+1eubHHbuNfilHMM0G2bI30iZzebQ2cQ1PC7uPAw08FGMMmQCRerlF/3pc4sAcsnexsxBseA/3lY03KlONqJBAg==";
+
+        let doc = V10DocumentParser::parse(text).unwrap();
+        if let V10Document::Identity(doc) = doc {
+            println!("Doc : {:?}", doc);
+            assert_eq!(doc.verify_signatures(), VerificationResult::Valid())
+        } else {
+            panic!("Wrong document type");
+        }
+    }
+
+    #[test]
+    fn parse_membership_document() {
+        let text = "Version: 10
+Type: Membership
+Currency: duniter_unit_test_currency
+Issuer: DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV
+Block: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+Membership: IN
+UserID: tic
+CertTS: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+s2hUbokkibTAWGEwErw6hyXSWlWFQ2UWs2PWx8d/kkElAyuuWaQq4Tsonuweh1xn4AC1TVWt4yMR3WrDdkhnAw==";
+
+        let doc = V10DocumentParser::parse(text).unwrap();
+        if let V10Document::Membership(doc) = doc {
+            println!("Doc : {:?}", doc);
+            assert_eq!(doc.verify_signatures(), VerificationResult::Valid())
+        } else {
+            panic!("Wrong document type");
+        }
+    }
 }