         let ephKeyPair = self.preferences.crypto.generateKeyPair()
         let ephPrivateKey = ephKeyPair.privateKey
         
-        let ephKeyName = try self.keyHelper.saveEphPrivateKey(ephPrivateKey, name: recipientCardId)
+        let ephKeyName: String
+        do {
+            ephKeyName = try self.keyHelper.saveEphPrivateKey(ephPrivateKey, name: recipientCardId)
+        }
+        catch {
+            completion(nil, NSError(domain: SecureChat.ErrorDomain, code: -1, userInfo: [NSLocalizedDescriptionKey: "Error while saving ephemeral key."]))
+            return
+        }
         
         // FIXME: Optional one time key?
         let sessionState = InitiatorSessionState(creationDate: Date(), ephKeyName: ephKeyName, recipientCardId: cardsSet.identityCard.identifier, recipientPublicKey: identityPublicKeyData, recipientLongTermCardId: cardsSet.longTermCard.identifier, recipientLongTermPublicKey: longTermPublicKeyData, recipientOneTimeCardId: cardsSet.oneTimeCard.identifier, recipientOneTimePublicKey: oneTimePublicKeyData)
-        try self.sessionHelper.saveSessionState(sessionState, forRecipientCardId: recipientCardId, crypto: self.preferences.crypto)
+        
+        do {
+            try self.sessionHelper.saveSessionState(sessionState, forRecipientCardId: recipientCardId, crypto: self.preferences.crypto)
+        }
+        catch {
+            completion(nil, NSError(domain: SecureChat.ErrorDomain, code: -1, userInfo: [NSLocalizedDescriptionKey: "Error while saving new session."]))
+            return
+        }
         
         let validator = EphemeralCardValidator(crypto: self.preferences.crypto)
         
         // FIXME validate identity card
-        
-        try validator.addVerifier(withId: cardsSet.identityCard.identifier, publicKeyData: cardsSet.identityCard.publicKeyData)
-        
-        guard validator.validate(cardResponse: cardsSet.longTermCard.cardResponse) else {
-            throw NSError(domain: SecureTalk.ErrorDomain, code: -1, userInfo: [NSLocalizedDescriptionKey: "Initiator LongTerm card validation failed."])
-        }
-        guard validator.validate(cardResponse: cardsSet.oneTimeCard.cardResponse) else {
-            throw NSError(domain: SecureTalk.ErrorDomain, code: -1, userInfo: [NSLocalizedDescriptionKey: "Initiator OneTime card validation failed."])
+        do {
+            try validator.addVerifier(withId: cardsSet.identityCard.identifier, publicKeyData: cardsSet.identityCard.publicKeyData)
+        }
+        catch {
+            completion(nil, NSError(domain: SecureChat.ErrorDomain, code: -1, userInfo: [NSLocalizedDescriptionKey: "Error while adding verifier."]))
+            return
+        }
+        
+        do {
+            guard validator.validate(cardResponse: cardsSet.longTermCard.cardResponse) else {
+                throw NSError(domain: SecureTalk.ErrorDomain, code: -1, userInfo: [NSLocalizedDescriptionKey: "Initiator LongTerm card validation failed."])
+            }
+            guard validator.validate(cardResponse: cardsSet.oneTimeCard.cardResponse) else {
+                throw NSError(domain: SecureTalk.ErrorDomain, code: -1, userInfo: [NSLocalizedDescriptionKey: "Initiator OneTime card validation failed."])
+            }
+        }
+        catch {
+            completion(nil, error)
+            return
         }
         
         let identityCardEntry = SecureTalk.CardEntry(identifier: cardsSet.identityCard.identifier, publicKeyData: identityPublicKeyData)

                completion(secureTalk, error)
            }
        }
    }
}


        completion(secureTalk, nil)
    }
    
    private func initiateTalk(withRecipientWithCard card: VSSCard, completion: @escaping (SecureTalk?, Error?)->()) {
        guard let myIdentityCard = self.identityCard else {
            completion(nil, NSError(domain: SecureChat.ErrorDomain, code: -1, userInfo: [NSLocalizedDescriptionKey: "Identity card missing. Probably, SecureChat was not initialized."]))
            return
        }
        
        // FIXME: Check is session active
        let session: SessionState?
        do {
            session = try self.sessionHelper.getSessionState(forRecipientCardId: card.identifier, crypto: self.preferences.crypto)
        }
        catch {
            completion(nil, NSError(domain: SecureChat.ErrorDomain, code: -1, userInfo: [NSLocalizedDescriptionKey: "Error while obtaining save session."]))
            return
        }
        
        if let session = session as? InitiatorSessionState {
            self.recoverInitiatorTalk(withRecipientWithCard: card, myIdentityCard: myIdentityCard, initiatorSessionState: session, completion: completion)
        }
        else if let session = session as? ResponderSessionState {
            self.recoverResponderTalk(withRecipientWithCard: card, myIdentityCard: myIdentityCard, responderSessionState: session, completion: completion)
        }
        else {
            // FIXME
        }
    }
    
    public func initiateTalk(withRecipientWithCardId cardId: String, completion: @escaping (SecureTalk?, Error?)->()) {
        self.virgilClient.getCard(withId: cardId) { card, error in
            guard error == nil else {
                completion(nil, error)
