             }
             
             do {
-                try self.initiateTalk(withRecipientWithCard: recipientIdentityCard) { secureTalk, error in
+                self.initiateTalk(withRecipientWithCard: recipientIdentityCard) { secureTalk, error in
                     completion(secureTalk, error)
                     
                 }

        let ephKeyPair = self.preferences.crypto.generateKeyPair()
        let ephPrivateKey = ephKeyPair.privateKey
        
        let ephKeyName = try self.keyHelper.saveEphPrivateKey(ephPrivateKey, name: recipientCardId)
        
        // 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)
        
        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."])
        }
        
        let identityCardEntry = SecureTalk.CardEntry(identifier: cardsSet.identityCard.identifier, publicKeyData: identityPublicKeyData)

        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)
