diff --git a/ObjectivePGP.framework/Headers/ObjectivePGPObject.h b/ObjectivePGP.framework/Headers/ObjectivePGPObject.h
index 0a1a923b6b818e9498e28f6c1f3996ac1d3bc1b5..c448e10960a5b940a5c8cd59f891d8715454ade8 100644
--- a/ObjectivePGP.framework/Headers/ObjectivePGPObject.h
+++ b/ObjectivePGP.framework/Headers/ObjectivePGPObject.h
@@ -62,16 +62,21 @@ NS_ASSUME_NONNULL_BEGIN
 + (nullable NSData *)sign:(NSData *)data detached:(BOOL)detached usingKeys:(NSArray<PGPKey *> *)keys passphraseForKey:(nullable NSString * _Nullable(^NS_NOESCAPE)(PGPKey *key))passphraseBlock error:(NSError * __autoreleasing _Nullable *)error;
 
 /**
- Verify signed data using given key.
+ Verify signed data using given keys.
 
  @param data Signed data.
- @param detached Detached signature data (Optional). If not provided, `data` is expected to be signed.
+ @param signature Detached signature data (Optional). If not provided, `data` is expected to be signed.
  @param keys Public keys. The provided keys should match the signatures.
  @param passphraseBlock Optional. Handler for passphrase protected keys. Return passphrase for a key in question.
  @param error Optional. Check error code for details about the error.
  @return YES on success.
  */
-+ (BOOL)verify:(NSData *)data withSignature:(nullable NSData *)detached usingKeys:(NSArray<PGPKey *> *)keys passphraseForKey:(nullable NSString * _Nullable(^NS_NOESCAPE)(PGPKey *key))passphraseBlock error:(NSError * __autoreleasing _Nullable *)error;
++ (BOOL)verify:(NSData *)data withSignature:(nullable NSData *)signature usingKeys:(NSArray<PGPKey *> *)keys passphraseForKey:(nullable NSString * _Nullable(^NS_NOESCAPE)(PGPKey *key))passphraseBlock error:(NSError * __autoreleasing _Nullable *)error;
+
+/**
+ Verify if signature was signed with one of the given keys.
+ */
++ (BOOL)verifySignature:(NSData *)signature usingKeys:(NSArray<PGPKey *> *)keys passphraseForKey:(nullable NSString * _Nullable(^NS_NOESCAPE)(PGPKey *key))passphraseBlock error:(NSError * __autoreleasing _Nullable *)error;
 
 /**
  Encrypt data using given keys. Output in binary.
diff --git a/ObjectivePGP.framework/Headers/PGPPartialKey.h b/ObjectivePGP.framework/Headers/PGPPartialKey.h
index 3a6c58994b5a74e57499b6c4392eef306c21e195..506fa90ce53a1fb1b44bba7127602291c4b315a1 100644
--- a/ObjectivePGP.framework/Headers/PGPPartialKey.h
+++ b/ObjectivePGP.framework/Headers/PGPPartialKey.h
@@ -27,6 +27,7 @@ NS_SWIFT_NAME(PartialKey) @interface PGPPartialKey : NSObject <PGPExportable, NS
 @property (nonatomic, readonly) PGPKeyType type;
 @property (nonatomic, copy) PGPPacket *primaryKeyPacket;
 @property (nonatomic, copy) NSArray<PGPUser *> *users;
+@property (nonatomic, copy, nullable, readonly) PGPUser *primaryUser;
 @property (nonatomic, copy, readonly) NSArray<PGPPartialSubKey *> *subKeys;
 @property (nonatomic, copy, readonly) NSArray<PGPSignaturePacket *> *directSignatures;
 @property (nonatomic, nullable, copy, readonly) PGPSignaturePacket *revocationSignature;
diff --git a/ObjectivePGP.framework/Headers/PGPTypes.h b/ObjectivePGP.framework/Headers/PGPTypes.h
index 6f6139a1520ea6f88b9134b8c578bb0116685106..db9217a42c330aab900b0d48aa387c5ea262cd5b 100644
--- a/ObjectivePGP.framework/Headers/PGPTypes.h
+++ b/ObjectivePGP.framework/Headers/PGPTypes.h
@@ -12,7 +12,14 @@
 #define NS_DESIGNATED_INITIALIZER
 #endif
 
-#define PGP_NOESCAPE __attribute__((noescape))
+#ifdef NS_NOESCAPE
+#undef NS_NOESCAPE
+#endif
+
+#ifndef NS_NOESCAPE
+#define NS_NOESCAPE __attribute__((noescape))
+#endif
+
 
 static const UInt32 PGPUnknownLength = UINT32_MAX;
 static NSString *const PGPErrorDomain = @"com.objectivepgp";
@@ -53,7 +60,7 @@ typedef NS_ENUM(UInt8, PGPPacketTag) {
     PGPSecretSubkeyPacketTag = 7,
     PGPCompressedDataPacketTag = 8,
     PGPSymmetricallyEncryptedDataPacketTag = 9,
-    PGPMarkerPacketTag = 10, // Ignored (Obsolete Literal Packet)
+    PGPMarkerPacketTag = 10, // (Obsolete Literal Packet)
     PGPLiteralDataPacketTag = 11,
     PGPTrustPacketTag = 12,
     PGPUserIDPacketTag = 13,
@@ -61,6 +68,10 @@ typedef NS_ENUM(UInt8, PGPPacketTag) {
     PGPUserAttributePacketTag = 17,
     PGPSymmetricallyEncryptedIntegrityProtectedDataPacketTag = 18,
     PGPModificationDetectionCodePacketTag = 19,
+    PGPExperimentalPacketTag1 = 60,
+    PGPExperimentalPacketTag2 = 61,
+    PGPExperimentalPacketTag3 = 62,
+    PGPExperimentalPacketTag4 = 63
 };
 
 typedef NS_ENUM(UInt8, PGPUserAttributeSubpacketType) {
diff --git a/ObjectivePGP.framework/Info.plist b/ObjectivePGP.framework/Info.plist
index 820bd0f02dea0c14260f8c62e2bacc75631dc6a1..9f5bf076f56372e4dbca2fabbaa911fc1faba030 100644
Binary files a/ObjectivePGP.framework/Info.plist and b/ObjectivePGP.framework/Info.plist differ
diff --git a/ObjectivePGP.framework/LICENSE.txt b/ObjectivePGP.framework/LICENSE.txt
index 0c16858c7f766620f86675fdd6c88addbe9186d6..12bceadedb4bc679b21f78bb965ebcbdeb1289f4 100644
--- a/ObjectivePGP.framework/LICENSE.txt
+++ b/ObjectivePGP.framework/LICENSE.txt
@@ -8,6 +8,8 @@ Copyright (C) 2014-2017, Marcin Krzyżanowski All rights reserved.
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
 
+- Non-commercial use
+
 - Redistributions of source code must retain the above copyright notice, this
   list of conditions and the following disclaimer. 
 
diff --git a/ObjectivePGP.framework/ObjectivePGP b/ObjectivePGP.framework/ObjectivePGP
index d1ada8e13bd0885950ae87cbbb471baff8a10d09..2713e559545f5d72e88cd3b89959d5a43521b315 100755
Binary files a/ObjectivePGP.framework/ObjectivePGP and b/ObjectivePGP.framework/ObjectivePGP differ
diff --git a/ObjectivePGP.framework/PrivateHeaders/NSArray+PGPUtils.h b/ObjectivePGP.framework/PrivateHeaders/NSArray+PGPUtils.h
index 376e5e9239b4dbd7c004910124e85d6bd9a6a2aa..69ff9fadcfd52947c1786cef40a64d9e66bc37aa 100644
--- a/ObjectivePGP.framework/PrivateHeaders/NSArray+PGPUtils.h
+++ b/ObjectivePGP.framework/PrivateHeaders/NSArray+PGPUtils.h
@@ -18,7 +18,8 @@ NS_ASSUME_NONNULL_BEGIN
 
 @interface NSArray <ObjectType> (PGPUtils)
 
-- (NSArray<ObjectType> *)pgp_objectsPassingTest:(BOOL (^)(ObjectType obj, BOOL *stop))predicate;
+- (NSArray<ObjectType> *)pgp_objectsPassingTest:(NS_NOESCAPE BOOL (^)(ObjectType obj, BOOL *stop))predicate;
+- (NSArray *)pgp_flatMap:(NS_NOESCAPE NSArray *_Nullable (^)(ObjectType obj))block;
 
 @end
 
diff --git a/ObjectivePGP.framework/PrivateHeaders/NSData+PGPUtils.h b/ObjectivePGP.framework/PrivateHeaders/NSData+PGPUtils.h
index 790b762d78c9b00f327233a489f507dc5cad8a11..52e091e5f312dd2299a82142755e1d7a1ec7ff1e 100644
--- a/ObjectivePGP.framework/PrivateHeaders/NSData+PGPUtils.h
+++ b/ObjectivePGP.framework/PrivateHeaders/NSData+PGPUtils.h
@@ -23,6 +23,7 @@ NS_ASSUME_NONNULL_BEGIN
 - (NSData *)pgp_SHA512;
 - (NSData *)pgp_RIPEMD160;
 
+// xor up to the last byte of the shorter data
 + (NSData *)xor:(NSData *)d1 d2:(NSData *)d2;
 
 + (NSData *)dataWithValue:(NSValue *)value;
diff --git a/ObjectivePGP.framework/PrivateHeaders/ObjectivePGP-Private.h b/ObjectivePGP.framework/PrivateHeaders/ObjectivePGP-Private.h
index c2b3ae2ddb79cb194d1bac7554b0c13c4085f672..a40d6e9f3effe9b45cae097c84eac276077b4f06 100644
--- a/ObjectivePGP.framework/PrivateHeaders/ObjectivePGP-Private.h
+++ b/ObjectivePGP.framework/PrivateHeaders/ObjectivePGP-Private.h
@@ -21,6 +21,7 @@ FOUNDATION_EXPORT const unsigned char ObjectivePGPVersionString[];
 #import <ObjectivePGP/PGPCryptoUtils.h>
 #import <ObjectivePGP/PGPRSA.h>
 #import <ObjectivePGP/PGPS2K.h>
+#import <ObjectivePGP/PGPElgamal.h>
 #import <ObjectivePGP/NSArray+PGPUtils.h>
 #import <ObjectivePGP/PGPUserIDPacket.h>
 #import <ObjectivePGP/PGPSymetricKeyEncryptedSessionKeyPacket.h>
@@ -51,6 +52,7 @@ FOUNDATION_EXPORT const unsigned char ObjectivePGPVersionString[];
 #import <ObjectivePGP/PGPModificationDetectionCodePacket.h>
 #import <ObjectivePGP/PGPEncryptedSessionKeyPacketProtocol.h>
 #import <ObjectivePGP/PGPSymmetricallyEncryptedDataPacket.h>
+#import <ObjectivePGP/PGPMarkerPacket.h>
 #import <ObjectivePGP/PGPPKCSEmsa.h>
 #import <ObjectivePGP/PGPPKCSEme.h>
 #import <ObjectivePGP/PGPCryptoCFB.h>
diff --git a/ObjectivePGP.framework/PrivateHeaders/PGPCryptoUtils.h b/ObjectivePGP.framework/PrivateHeaders/PGPCryptoUtils.h
index 99e0a096c570729ab5fec9aa3b89a4fd2cb9e81e..da7c5e5f7f04183a6b72d78e5248ca23b6c04f99 100644
--- a/ObjectivePGP.framework/PrivateHeaders/PGPCryptoUtils.h
+++ b/ObjectivePGP.framework/PrivateHeaders/PGPCryptoUtils.h
@@ -18,7 +18,7 @@ NS_ASSUME_NONNULL_BEGIN
 + (NSUInteger)keySizeOfSymmetricAlgorithm:(PGPSymmetricAlgorithm)symmetricAlgorithm;
 + (NSUInteger)hashSizeOfHashAlhorithm:(PGPHashAlgorithm)hashAlgorithm;
 + (NSData *)randomData:(NSUInteger)length;
-+ (nullable NSData *)decrypt:(NSData *)data usingSecretKeyPacket:(PGPSecretKeyPacket *)keyPacket;
++ (nullable NSData *)decrypt:(NSData *)data usingSecretKeyPacket:(PGPSecretKeyPacket *)keyPacket encryptedMPIs:(NSArray <PGPMPI *> *)encryptedMPIs;
 
 @end
 
diff --git a/ObjectivePGP.framework/PrivateHeaders/PGPKeyMaterial.h b/ObjectivePGP.framework/PrivateHeaders/PGPKeyMaterial.h
index 7a3d53da33f473b65d27c1f6ca20b12b12e1c0d3..e58774c10cc3bfb771241c39bec86bc385e7f32e 100644
--- a/ObjectivePGP.framework/PrivateHeaders/PGPKeyMaterial.h
+++ b/ObjectivePGP.framework/PrivateHeaders/PGPKeyMaterial.h
@@ -11,15 +11,15 @@
 
 @interface PGPKeyMaterial: NSObject
 
-@property (nonatomic) PGPMPI *n;
-@property (nonatomic) PGPMPI *e;
-@property (nonatomic) PGPMPI *d;
-@property (nonatomic) PGPMPI *p;
-@property (nonatomic) PGPMPI *q;
-@property (nonatomic) PGPMPI *r;
-@property (nonatomic) PGPMPI *g;
-@property (nonatomic) PGPMPI *u;
-@property (nonatomic) PGPMPI *x;
-@property (nonatomic) PGPMPI *y;
+@property (nonatomic, copy) PGPMPI *n;
+@property (nonatomic, copy) PGPMPI *e;
+@property (nonatomic, copy) PGPMPI *d;
+@property (nonatomic, copy) PGPMPI *p;
+@property (nonatomic, copy) PGPMPI *q;
+@property (nonatomic, copy) PGPMPI *r;
+@property (nonatomic, copy) PGPMPI *g;
+@property (nonatomic, copy) PGPMPI *u;
+@property (nonatomic, copy) PGPMPI *x;
+@property (nonatomic, copy) PGPMPI *y;
 
 @end
diff --git a/ObjectivePGP.framework/PrivateHeaders/PGPLogging.h b/ObjectivePGP.framework/PrivateHeaders/PGPLogging.h
index 839acd251e7cfed783a18a49f65b02c29db00db9..5b14e1797cefbb642657ee10a04ab9b8ada56763 100644
--- a/ObjectivePGP.framework/PrivateHeaders/PGPLogging.h
+++ b/ObjectivePGP.framework/PrivateHeaders/PGPLogging.h
@@ -10,24 +10,46 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
-#define PGPLogMacro(_level, _tag, _message) NSLog(@"[%s] %@ %s/%tu %@", _tag, @(_level), __PRETTY_FUNCTION__, __LINE__, _message())
+#define PGP_NO_LOG          0x00
+#define PGP_ERROR_LEVEL     0x01
+#define PGP_WARNING_LEVEL   0x02
+#define PGP_DEBUG_LEVEL     0x03
 
-#ifdef DEBUG
+#ifndef PGP_LOG_LEVEL
+    #ifdef DEBUG
+        #define PGP_LOG_LEVEL PGP_DEBUG_LEVEL
+    #else
+        #define PGP_LOG_LEVEL PGP_WARNING_LEVEL
+    #endif
+#endif
+
+#define _PGPLogMacro(_level, _tag, _message) NSLog(@"[%s] %s: %s/%tu %@", _tag, _level, __PRETTY_FUNCTION__, __LINE__, _message())
+
+#if PGP_LOG_LEVEL >= PGP_DEBUG_LEVEL
 #define PGPLogDebug(format, ...)                                                     \
-    PGPLogMacro(0, "ObjectivePGP", (^{                                               \
+    _PGPLogMacro("DEBUG", "ObjectivePGP", (^{                                               \
                     return [NSString stringWithFormat:(@"" format), ##__VA_ARGS__]; \
                 }))
 #else
 #define PGPLogDebug(format, ...)
 #endif
 
+#if PGP_LOG_LEVEL >= PGP_WARNING_LEVEL
 #define PGPLogWarning(format, ...)                                                   \
-    PGPLogMacro(1, "ObjectivePGP", (^{                                               \
+    _PGPLogMacro("WARNING", "ObjectivePGP", (^{                                               \
                     return [NSString stringWithFormat:(@"" format), ##__VA_ARGS__]; \
                 }))
+#else
+#define PGPLogWarning(format, ...)
+#endif
+
+#if PGP_LOG_LEVEL >= PGP_ERROR_LEVEL
 #define PGPLogError(format, ...)                                                     \
-    PGPLogMacro(2, "ObjectivePGP", (^{                                               \
+    _PGPLogMacro("ERROR", "ObjectivePGP", (^{                                               \
                     return [NSString stringWithFormat:(@"" format), ##__VA_ARGS__]; \
                 }))
+#else
+#define PGPLogError(format, ...)
+#endif
 
 NS_ASSUME_NONNULL_END
diff --git a/ObjectivePGP.framework/PrivateHeaders/PGPOnePassSignaturePacket.h b/ObjectivePGP.framework/PrivateHeaders/PGPOnePassSignaturePacket.h
index cc2bfa44cf2e875cf74f9c88a83d8d958186e982..1dec32f71328c1da5ea0225ef5e9c447c336a277 100644
--- a/ObjectivePGP.framework/PrivateHeaders/PGPOnePassSignaturePacket.h
+++ b/ObjectivePGP.framework/PrivateHeaders/PGPOnePassSignaturePacket.h
@@ -17,7 +17,7 @@ NS_ASSUME_NONNULL_BEGIN
 
 @property (nonatomic) UInt8 version; //  The current version is 3.
 @property (nonatomic) PGPSignatureType signatureType;
-@property (nonatomic) PGPHashAlgorithm hashAlgorith;
+@property (nonatomic) PGPHashAlgorithm hashAlgorithm;
 @property (nonatomic) PGPPublicKeyAlgorithm publicKeyAlgorithm;
 @property (nonatomic, copy) PGPKeyID *keyID; // 8
 @property (nonatomic) BOOL isNested;
diff --git a/ObjectivePGP.framework/PrivateHeaders/PGPPacket.h b/ObjectivePGP.framework/PrivateHeaders/PGPPacket.h
index 4398c9de9cd75733ca084b3c6b91a13ffbe60e0d..614585bb21df78cf57009356dbc4da37711c3932 100644
--- a/ObjectivePGP.framework/PrivateHeaders/PGPPacket.h
+++ b/ObjectivePGP.framework/PrivateHeaders/PGPPacket.h
@@ -24,7 +24,7 @@ extern const UInt32 PGPUnknownLength;
 + (nullable NSData *)readPacketBody:(NSData *)data headerLength:(UInt32 *)headerLength consumedBytes:(nullable NSUInteger *)consumedBytes packetTag:(nullable PGPPacketTag *)tag indeterminateLength:(nullable BOOL *)indeterminateLength;
 - (NSUInteger)parsePacketBody:(NSData *)packetBody error:(NSError * __autoreleasing _Nullable *)error;
 
-+ (NSData *)buildPacketOfType:(PGPPacketTag)tag withBody:(PGP_NOESCAPE NSData *(^)(void))body;
++ (NSData *)buildPacketOfType:(PGPPacketTag)tag withBody:(NS_NOESCAPE NSData *(^)(void))body;
 
 - (id)copyWithZone:(nullable NSZone *)zone NS_REQUIRES_SUPER;
 
diff --git a/ObjectivePGP.framework/PrivateHeaders/PGPPublicKeyEncryptedSessionKeyPacket.h b/ObjectivePGP.framework/PrivateHeaders/PGPPublicKeyEncryptedSessionKeyPacket.h
index 191b69c03baf8cbcd535f28b9687753077a122ac..8e5c14d21263a364d6f2f1d47b4ffd5436762329 100644
--- a/ObjectivePGP.framework/PrivateHeaders/PGPPublicKeyEncryptedSessionKeyPacket.h
+++ b/ObjectivePGP.framework/PrivateHeaders/PGPPublicKeyEncryptedSessionKeyPacket.h
@@ -17,7 +17,6 @@ NS_ASSUME_NONNULL_BEGIN
 @interface PGPPublicKeyEncryptedSessionKeyPacket : PGPPacket <PGPEncryptedSessionKeyPacketProtocol, NSCopying, PGPExportable>
 @property (nonatomic) UInt8 version;
 @property (nonatomic) PGPPublicKeyAlgorithm publicKeyAlgorithm;
-@property (nonatomic, getter=isEncryptedWithPassword) BOOL encryptedWithPassword;
 @property (nonatomic, copy) PGPKeyID *keyID;
 
 - (BOOL)encrypt:(PGPPublicKeyPacket *)publicKeyPacket sessionKeyData:(NSData *)sessionKeyData sessionKeyAlgorithm:(PGPSymmetricAlgorithm)sessionKeyAlgorithm error:(NSError * __autoreleasing _Nullable *)error;
diff --git a/ObjectivePGP.framework/PrivateHeaders/PGPPublicKeyPacket.h b/ObjectivePGP.framework/PrivateHeaders/PGPPublicKeyPacket.h
index cf199de62b8ded991b76973a44ad52a637f65f36..c4b4ddaa3b3dc81a656e5e12f0a3699c551c7e32 100644
--- a/ObjectivePGP.framework/PrivateHeaders/PGPPublicKeyPacket.h
+++ b/ObjectivePGP.framework/PrivateHeaders/PGPPublicKeyPacket.h
@@ -13,7 +13,7 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
-@class PGPMPI;
+@class PGPMPI, PGPBigNum;
 
 @interface PGPPublicKeyPacket : PGPPacket <NSCopying, PGPExportable>
 
@@ -31,7 +31,7 @@ NS_ASSUME_NONNULL_BEGIN
 - (NSData *)buildKeyBodyData:(BOOL)forceV4;
 
 - (nullable PGPMPI *)publicMPI:(NSString *)identifier;
-- (nullable NSData *)encryptData:(NSData *)data withPublicKeyAlgorithm:(PGPPublicKeyAlgorithm)publicKeyAlgorithm;
+- (nullable NSArray<PGPMPI *> *)encryptData:(NSData *)data withPublicKeyAlgorithm:(PGPPublicKeyAlgorithm)publicKeyAlgorithm;
 
 @end
 
diff --git a/ObjectivePGP.framework/PrivateHeaders/PGPSecretKeyPacket+Private.h b/ObjectivePGP.framework/PrivateHeaders/PGPSecretKeyPacket+Private.h
index 7aca638f41fd5f2a8ef26081e07c84b6a3bcc2e8..f0768163b62e7f67ebc2f824a1723a91367e4451 100644
--- a/ObjectivePGP.framework/PrivateHeaders/PGPSecretKeyPacket+Private.h
+++ b/ObjectivePGP.framework/PrivateHeaders/PGPSecretKeyPacket+Private.h
@@ -16,11 +16,11 @@ NS_ASSUME_NONNULL_BEGIN
 @interface PGPSecretKeyPacket ()
 
 @property (nonatomic, readwrite) PGPS2KUsage s2kUsage;
-@property (nonatomic, /* copy, */ readwrite) PGPS2K *s2k;
+@property (nonatomic, copy, readwrite) PGPS2K *s2k;
 @property (nonatomic, readwrite) PGPSymmetricAlgorithm symmetricAlgorithm;
 @property (nonatomic, copy, nullable, readwrite) NSData *ivData;
 @property (nonatomic, copy) NSArray<PGPMPI *> *secretMPIs; // decrypted MPI
-@property (nonatomic, nullable, copy) NSData *encryptedMPIPartData; // after decrypt -> secretMPIArray
+@property (nonatomic, nullable, copy) NSData *encryptedMPIPartData; // after decrypt -> secretMPIs
 
 @end
 
diff --git a/ObjectivePGP.framework/PrivateHeaders/PGPSignaturePacket+Private.h b/ObjectivePGP.framework/PrivateHeaders/PGPSignaturePacket+Private.h
index 9c17602c7d84a3801fcc498b12dde1672ff093c6..9d0cf67c3049c7c954239bfa0c3d125f3ac287f3 100644
--- a/ObjectivePGP.framework/PrivateHeaders/PGPSignaturePacket+Private.h
+++ b/ObjectivePGP.framework/PrivateHeaders/PGPSignaturePacket+Private.h
@@ -21,7 +21,7 @@ PGP_EMPTY_INIT_UNAVAILABLE
 
 + (PGPSignaturePacket *)signaturePacket:(PGPSignatureType)type hashAlgorithm:(PGPHashAlgorithm)hashAlgorithm;
 
-- (nullable NSData *)buildDataToSignForType:(PGPSignatureType)type inputData:(nullable NSData *)inputData key:(nullable PGPKey *)key subKey:(nullable PGPKey *)subKey keyPacket:(nullable PGPPublicKeyPacket *)signingKeyPacket userID:(nullable NSString *)userID error:(NSError * __autoreleasing _Nullable *)error;
+- (nullable NSData *)buildDataToSignForType:(PGPSignatureType)type inputData:(nullable NSData *)inputData key:(nullable PGPKey *)key subKey:(nullable PGPKey *)subKey userID:(nullable NSString *)userID error:(NSError * __autoreleasing _Nullable *)error;
 - (nullable NSData *)buildFullSignatureBodyData;
 - (nullable PGPMPI *)signatureMPI:(NSString *)identifier;
 
diff --git a/ObjectivePGP.framework/PrivateHeaders/PGPUser+Private.h b/ObjectivePGP.framework/PrivateHeaders/PGPUser+Private.h
index 314f57ed8473955a2ab48783488bbcdef1622b83..8ce5f5a5559258640f99c0d4a78e112e7b0dba8d 100644
--- a/ObjectivePGP.framework/PrivateHeaders/PGPUser+Private.h
+++ b/ObjectivePGP.framework/PrivateHeaders/PGPUser+Private.h
@@ -25,7 +25,7 @@ NS_ASSUME_NONNULL_BEGIN
 
 - (instancetype)initWithUserIDPacket:(PGPUserIDPacket *)userPacket NS_DESIGNATED_INITIALIZER;
 
-- (nullable PGPSignaturePacket *)validSelfCertificate;
+- (nullable PGPSignaturePacket *)latestSelfCertificate;
 
 @end
 
diff --git a/ObjectivePGP.framework/README.md b/ObjectivePGP.framework/README.md
index 1b91f05f9f45d13a6fdf6f86c56ced98633ae2f5..959a92ce1c8943de085fe34a33a76eccde8b7651 100644
--- a/ObjectivePGP.framework/README.md
+++ b/ObjectivePGP.framework/README.md
@@ -10,9 +10,25 @@
 
 Here is the [blog post](http://blog.krzyzanowskim.com/2014/07/31/short-story-about-openpgp-for-ios-and-os-x-objectivepgp/) story.
 
+## How do I get involved?
+
+You want to help, great! Go ahead and fork our repo, make your changes and send us a pull request.
+
 ## Contribution
 
-You are welcome to contribute. Please create [Pull Request](https://github.com/krzyzanowskim/ObjectivePGP/pulls) against `develop` branch.
+You are welcome to contribute. See [CONTRIBUTING.md](https://github.com/krzyzanowskim/ObjectivePGP/blob/master/CONTRIBUTING.md)  
+Please create [Pull Request](https://github.com/krzyzanowskim/ObjectivePGP/pulls) against `develop` branch.
+
+## The license
+
+The ObjectivePGP stays under a dual license:
+
+- Free for non-commercial use, covered by the variant of BSD license. That means you have to mention Marcin Krzyżanowski as the original author of this code and reproduce the [LICENSE](./LICENSE.txt) text inside your app.
+
+- Commercial-use license to use in commercial products. Please bear in mind that some free products remain commercial products. Please contact me via [email](http://www.krzyzanowskim.com) for details.
+
+
+Not sure what to choose? check [FAQ](https://github.com/krzyzanowskim/ObjectivePGP/wiki/FAQ)
 
 ## Usage
 
@@ -133,9 +149,10 @@ let secretKey = try key.export(keyType: .secret)
 ASCII armor is a binary-to-textual encoding converter. ASCII armor involves encasing encrypted messaging in ASCII so that they can be sent in a standard messaging format such as email.
 
 Example:
+
 ```
 -----BEGIN PGP PUBLIC KEY BLOCK-----
-Comment: For info see http://www.objectivepgp.org
+Comment: For more info see http://www.objectivepgp.org
 
 [...]
 -----END PGP PUBLIC KEY BLOCK-----
@@ -157,7 +174,7 @@ When convert manually, it is important to use right `PGPArmorType` value that de
 | ---------- | --------------------- |-------- |
 | Encrypted  | `PGPArmorMessage` | `Armor.armored(ObjectivePGP.encrypt(...), as: .message)` |
 | Decrypted  | `PGPArmorMessage` | `Armor.armored(ObjectivePGP.decrypt(...), as: .message)` |
-| Pubic key  | `PGPArmorTypePublic`  | `Armor.armored(key.export(), as: .publicKey)` |
+| Public key | `PGPArmorTypePublic`  | `Armor.armored(key.export(), as: .publicKey)` |
 | Secret key | `PGPArmorTypeSecret`  | `Armor.armored(key.export(), as: .secretKey)` |
 
 For any result of encryption the type is `PGPArmorMessage`
@@ -177,7 +194,9 @@ end
 
 ObjectivePGP comes with the [Frameworks](./Frameworks) for the latest release.
 
-1. Download latest [ObjectivePGP.framework](https://github.com/krzyzanowskim/ObjectivePGP/releases) or build a framework with the [build-frameworks.sh](./build-frameworks.sh) script.
+1. Download latest [ObjectivePGP.framework](https://github.com/krzyzanowskim/ObjectivePGP/releases) or build a framework with the [build-frameworks.sh](./scripts/build-frameworks.sh) script.
+1. Add a New Copy Files Phase by selecting the Add icon, highlighted in Figure 4. Set the Destination field to Frameworks, and add the framework to the list (see [Embedding Frameworks In An App](https://developer.apple.com/library/content/technotes/tn2435/_index.html)). Ensure Code Sign on Copy is checked.
+![Figure 4](https://user-images.githubusercontent.com/14152377/35073501-5b50bc50-fbe9-11e7-8d8a-3c8ce47c8e44.png)
 1. Link framework with the target
     - Add `ObjectivePGP.framework` to "**Link Binary With Libraries**" list for the target.
     ![screen shot 2017-06-30 at 02 20 47](https://user-images.githubusercontent.com/758033/27715926-d79a4e3c-5d3a-11e7-8b1b-d8b5ddb8182e.png)
@@ -186,8 +205,10 @@ ObjectivePGP comes with the [Frameworks](./Frameworks) for the latest release.
     1. Add `libz` and `libbz2` to "**Link Binary With Libraries**" list for the target. These are system libraries.
 1. In the Build Phases tab, click the + button at the top and select “New Run Script Phase”. Enter the following code into the script text field:
 
+
+
 ```sh
-bash "${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/ObjectivePGP.framework/strip-frameworks.sh"
+bash "${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/ObjectivePGP.framework/Code=8"
 ```
 
 (The last step, is required for working around an iOS App Store bug when archiving universal binaries.)
@@ -198,18 +219,11 @@ See [CHANGELOG](./CHANGELOG)
 
 Known limitations:
 
-- Elgamal cipher is not supported.
 - Cleartext signature.
 
-## The license
-
-The ObjectivePGP stays under a dual license:
-
-- Free for non-commercial use, covered by the standard 2-clause BSD license. That means you have to mention Marcin Krzyżanowski as the original author of this code and reproduce the [LICENSE](./LICENSE.txt) text inside your app.
-
-- Commercial-use license to use in commercial products. Please bear in mind that some free products remain commercial products. Please contact me via [email](http://www.krzyzanowskim.com) for details.
+## Security Audit
 
-Not sure what to choose? check this [thread](https://twitter.com/krzyzanowskim/status/868481597204508672)
+To date the ObjectivePGP code base has undergone a complete security audit from [Cure53](https://cure53.de/).
 
 ### Acknowledgment