     func startPayerCostScreen() {
         let payerCostViewModel = self.viewModel.payerCostViewModel()
         
-        let payerCostStep = AdditionalStepViewController(viewModel: payerCostViewModel, callback: { (payerCost) in
-            self.viewModel.updateCheckoutModel(payerCost: payerCost as! PayerCost)
-            self.executeNextStep()
+        let payerCostStep = AdditionalStepViewController(viewModel: payerCostViewModel, callback: { [weak self] (payerCost) in
+            guard let strongSelf = self else {
+                return
+            }
+            
+            strongSelf.viewModel.updateCheckoutModel(payerCost: payerCost as! PayerCost)
+            strongSelf.executeNextStep()
         })
         payerCostStep.callbackCancel = {
             self.viewModel.payerCosts = nil

    func createNewCardToken() {
        self.presentLoading()
        
        MPServicesBuilder.createNewCardToken(self.viewModel.cardToken!, baseURL: MercadoPagoCheckoutViewModel.servicePreference.getGatewayURL(), success: { (token : Token?) -> Void in
            self.viewModel.updateCheckoutModel(token: token!)
            self.dismissLoading()
            self.executeNextStep()
        
        }, failure : { (error) -> Void in
            self.viewModel.errorInputs(error: MPSDKError.convertFrom(error), errorCallback: { (Void) in
                self.createNewCardToken()
            })
            self.dismissLoading()
            self.executeNextStep()
        })
    }
    

        let cardInformation = self.viewModel.paymentOptionSelected as! CardInformation
        let saveCardToken = SavedCardToken(card: cardInformation, securityCode: securityCode, securityCodeRequired: true)
        
        MPServicesBuilder.createToken(saveCardToken, baseURL: MercadoPagoCheckoutViewModel.servicePreference.getGatewayURL(), success: { [weak self] (token) in
            guard let strongSelf = self else {
                return
            }
            
            if token.lastFourDigits.isEmpty {
                token.lastFourDigits = cardInformation.getCardLastForDigits()
            }
            strongSelf.viewModel.updateCheckoutModel(token: token)
            strongSelf.dismissLoading()
            strongSelf.executeNextStep()
            
            }, failure: { [weak self] (error) in
                guard let strongSelf = self else {
                    return
                }
                
                strongSelf.dismissLoading()
                strongSelf.viewModel.errorInputs(error: MPSDKError.convertFrom(error), errorCallback: { [weak self] (Void) in
                    self?.createSavedCardToken(cardInformation: cardInformation, securityCode: securityCode)
                })
                strongSelf.executeNextStep()
        })
    }
    
    func cloneCardToken(token: Token, securityCode: String) {
        self.presentLoading()
        MPServicesBuilder.cloneToken(token,securityCode:securityCode, success: { [weak self] (token) in
            guard let strongSelf = self else {
                return
            }
            
            strongSelf.viewModel.updateCheckoutModel(token: token)
            strongSelf.dismissLoading()
            strongSelf.executeNextStep()
            
            }, failure: { [weak self] (error) in
                guard let strongSelf = self else {
                    return
                }
                
                strongSelf.dismissLoading()
                strongSelf.viewModel.errorInputs(error: MPSDKError.convertFrom(error), errorCallback: { [weak self] (Void) in
                    self?.cloneCardToken(token: token, securityCode: securityCode)
                })
                strongSelf.executeNextStep()
        })
    }
    
    func collectPayerCosts(updateCallback:((Void)->Void)? = nil) {
        self.presentLoading()
        let bin = self.viewModel.cardToken?.getBin()
        
        MPServicesBuilder.getInstallments(bin, amount: self.viewModel.getFinalAmount(), issuer: self.viewModel.paymentData.issuer, paymentMethodId: self.viewModel.paymentData.paymentMethod._id, baseURL: MercadoPagoCheckoutViewModel.servicePreference.getDefaultBaseURL(),success: { [weak self] (installments) -> Void in
            guard let strongSelf = self else {
                return
            }
            
            strongSelf.viewModel.payerCosts = installments[0].payerCosts
            
            let defaultPayerCost = strongSelf.viewModel.checkoutPreference.paymentPreference?.autoSelectPayerCost(installments[0].payerCosts)
            if let defaultPC = defaultPayerCost {
                strongSelf.viewModel.updateCheckoutModel(payerCost: defaultPC)
            }
            
            if let updateCallback = updateCallback {
                updateCallback()
                strongSelf.dismissLoading()
            } else {
                
                strongSelf.dismissLoading()
                strongSelf.executeNextStep()
            }
            
            
        }) { [weak self] (error) -> Void in
            guard let strongSelf = self else {
                return
            }
            
            strongSelf.dismissLoading()
            strongSelf.viewModel.errorInputs(error: MPSDKError.convertFrom(error), errorCallback: { [weak self] (Void) in
                self?.collectPayerCosts()
            })
            strongSelf.executeNextStep()
        }
        
    }
