diff --git a/Pages/CustomerLoans.js b/Pages/CustomerLoans.js
new file mode 100644
index 0000000..a32da68
--- /dev/null
+++ b/Pages/CustomerLoans.js
@@ -0,0 +1,358 @@
+//Customers.js
+
+//Actions specific to the Customers section
+
+var Common = require('./Common.js');
+var EC = protractor.ExpectedConditions;
+
+//loan details
+var productSelect = $("mat-select[formcontrolname='productIdentifier'] .mat-select-trigger");
+var shortNameInput = $("fims-id-input[controlname='identifier'] input");
+var principalAmountInput = $("fims-number-input[controlname='principalAmount'] input");
+var interestRateInput = $("fims-number-input[controlname='interest'] input");
+var termInput = $("fims-text-input[controlname='term'] input");
+var termSelect = $("mat-select[formcontrolname='termTemporalUnit'] .mat-select-trigger");
+var paymentPeriod = $("fims-text-input[controlname='paymentPeriod'] input");
+var paymentPeriodSelect = $("mat-select[formcontrolname='termTemporalUnit'] .mat-select-trigger");
+var depositAccountSelect = $("mat-select[formcontrolname='depositAccountIdentifier'] .mat-select-trigger");
+//if "Repay every" is set to "months"
+var radioMonthSetting1 = $$("mat-radio-group[formcontrolname='monthSetting'] mat-radio-button").get(0);
+var dayForMonthlyRepaySelect = $("mat-select[formcontrolname='monthSettingDay'] .mat-select-trigger");
+var radioMonthSetting2 = $$("mat-radio-group[formcontrolname='monthSetting'] mat-radio-button").get(1);
+var numberDaySelectMonthlyRepayment = $("mat-select[formcontrolname='monthSettingWeek'] .mat-select-trigger");
+var weekdaySelectMonthlyRepayment = $("mat-select[formcontrolname='monthSettingDayInWeek'] .mat-select-trigger");
+//if "Repay every" is set to "weeks"
+var dayInWeekSelect = $("mat-select[formcontrolname='dayInWeek'] .mat-select-trigger");
+//if "Repay every" is set to "years"
+var dayForYearlyRepaySelect = $("mat-select[formcontrolname='monthSettingDay'] .mat-select-trigger");
+var numberDaySelectYearlyRepayment = $("mat-select[formcontrolname='monthSettingWeek'] .mat-select-trigger");
+var weekdaySelectYearlyRepayment = $("mat-select[formcontrolname='monthSettingDayInWeek'] .mat-select-trigger");
+var monthSelectYearlyRepayment = $("mat-select[formcontrolname='month'] .mat-select-trigger");
+
+//Debt to income ratio
+var descriptionInputsDebt = $$("fims-case-credit-factor-form").get(0).$$("fims-text-input[controlname='description'] input");
+var amountInputsDebt = $$("fims-case-credit-factor-form").get(0).$$("fims-text-input[controlname='amount'] input");
+var descriptionInputsIncome = $$("fims-case-credit-factor-form").get(1).$$("fims-text-input[controlname='description'] input");
+var amountInputsIncome = $$("fims-case-credit-factor-form").get(1).$$("fims-text-input[controlname='amount'] input");
+var debtsTotal = $$("fims-case-debt-to-income-form h4").get(0);
+var incomeTotal = $$("fims-case-debt-to-income-form h4").get(1);
+var ratio = $("fims-case-debt-to-income-form");
+
+//Co-signer
+var memberSelect = $("fims-customer-select[formcontrolname='customerIdentifier'] input");
+
+//Documents
+var descriptionInputsDocs = $$("fims-case-documents-form fims-text-input[controlname='description'] input");
+
+
+//general elements
+var primaryButton =  $$(".mat-raised-button.mat-primary");
+var continueButton = $$(".mat-raised-button.mat-accent");
+var buttons = $$(".mat-button");
+
+module.exports = {
+
+    clickCreateLoanAccountForMember: function (customer) {
+        link = "/customers/detail/" + customer + "/loans/create";
+        browser.wait(EC.visibilityOf($('a[href="' + link + '"]')));
+        $('a[href="' + link + '"]').click();
+    },
+    selectProduct: function (productName) {
+        browser.sleep(2000);
+        browser.wait(EC.elementToBeClickable(productSelect), 3000);
+        productSelect.click();
+        browser.wait(EC.visibilityOf($(".mat-option")), 5000);
+        opt = element(by.cssContainingText('.mat-option', productName));
+        browser.executeScript("arguments[0].scrollIntoView();", opt.getWebElement());
+        browser.wait(EC.elementToBeClickable(opt), 2000);
+        opt.click();
+        browser.wait(EC.invisibilityOf($("mat-tooltip-component")), 4000);
+    },
+    selectProductFromOpenList: function (productName) {
+        browser.wait(EC.visibilityOf($(".mat-option")), 5000);
+        opt = element(by.cssContainingText('.mat-option', productName));
+        browser.executeScript("arguments[0].scrollIntoView();", opt.getWebElement());
+        browser.wait(EC.elementToBeClickable(opt), 2000);
+        opt.click();
+        browser.wait(EC.invisibilityOf($("mat-tooltip-component")), 4000);
+    },
+    verifyStateOfLoanAccountWithIdIs: function (identifier, expectedState) {
+        browser.wait(EC.visibilityOf($("tbody tr")), 5000);
+        //if > page of entries, need to implement way to page in order to find correct row
+        actualState = $$('tbody tr').filter(function (elem, index) {
+            return elem.$(".td-data-table-cell").getText().then(function (text) {
+                return text === identifier;
+            });
+        }).$$(".td-data-table-cell").get(3).getText();
+        expect(actualState).toEqual(expectedState);
+    },
+    enterTextIntoShortNameInputField: function (text) {
+        browser.wait(EC.elementToBeClickable(shortNameInput), 5000);
+        shortNameInput.click().sendKeys(text);
+    },
+    enterTextIntoPrincipalAmountInputField: function (text) {
+        principalAmountInput.click().sendKeys(protractor.Key.BACK_SPACE);
+        principalAmountInput.sendKeys(protractor.Key.BACK_SPACE);
+        principalAmountInput.sendKeys(protractor.Key.BACK_SPACE);
+        principalAmountInput.sendKeys(protractor.Key.BACK_SPACE);
+        principalAmountInput.sendKeys(protractor.Key.BACK_SPACE);
+        principalAmountInput.sendKeys(protractor.Key.BACK_SPACE);
+        principalAmountInput.sendKeys(protractor.Key.BACK_SPACE);
+        principalAmountInput.sendKeys(protractor.Key.BACK_SPACE);
+        principalAmountInput.sendKeys(protractor.Key.BACK_SPACE);
+        principalAmountInput.sendKeys(text);
+    },
+    enterTextIntoInterestRateInputField: function (text) {
+        interestRateInput.click().sendKeys(protractor.Key.BACK_SPACE);
+        interestRateInput.sendKeys(protractor.Key.BACK_SPACE);
+        interestRateInput.sendKeys(protractor.Key.BACK_SPACE);
+        interestRateInput.sendKeys(protractor.Key.BACK_SPACE);
+        interestRateInput.sendKeys(text);
+    },
+    verifyLoanAccountNotOfferedForSelection: function(accountIdentifier){
+        browser.wait(EC.elementToBeClickable(productSelect), 3000);
+        productSelect.click();
+        browser.wait(EC.visibilityOf($(".mat-option")), 5000);
+        expect(element(by.cssContainingText('.mat-option', accountIdentifier)).isPresent()).toBe(false);
+    },
+    verifyDepositAccountNotOfferedForSelection: function(accountIdentifier){
+        browser.executeScript("arguments[0].scrollIntoView();", depositAccountSelect.getWebElement());
+        browser.wait(EC.elementToBeClickable(depositAccountSelect), 3000);
+        depositAccountSelect.click();
+        expect($(".mat-option").isPresent()).toBe(true);
+        expect(element(by.cssContainingText('.mat-option', accountIdentifier)).isPresent()).toBe(false);
+    },
+    enterTextIntoTermInputField: function (text) {
+        termInput.click().clear().sendKeys(text);
+    },
+    selectTemporalUnitForTerm: function (temporalUnit) {
+        browser.executeScript("arguments[0].scrollIntoView();", termSelect.getWebElement());
+        browser.wait(EC.visibilityOf(termSelect), 2000);
+        termSelect.click();
+        browser.wait(EC.visibilityOf($(".mat-option")), 5000);
+        opt = element(by.cssContainingText('.mat-option', temporalUnit));
+        browser.executeScript("arguments[0].scrollIntoView();", opt.getWebElement());
+        browser.wait(EC.elementToBeClickable(opt), 2000);
+        opt.click();
+    },
+    enterTextIntoPaymentPeriodInputField: function (text) {
+        paymentPeriod.click().clear().sendKeys(text);
+    },
+    selectPaymentPeriod: function (paymentPeriod) {
+        browser.executeScript("arguments[0].scrollIntoView();", paymentPeriodSelect.getWebElement());
+        browser.wait(EC.visibilityOf(paymentPeriodSelect), 2000);
+        paymentPeriodSelect.click();
+        browser.wait(EC.visibilityOf($(".mat-option")), 5000);
+        opt = element(by.cssContainingText('.mat-option', paymentPeriod));
+        browser.executeScript("arguments[0].scrollIntoView();", opt.getWebElement());
+        browser.wait(EC.elementToBeClickable(opt), 2000);
+        opt.click();
+    },
+    selectDayForMonthlyRepayment: function (day) {
+        browser.executeScript("arguments[0].scrollIntoView();", dayForMonthlyRepaySelect.getWebElement());
+        browser.wait(EC.visibilityOf(dayForMonthlyRepaySelect), 2000);
+        dayForMonthlyRepaySelect.click();
+        browser.wait(EC.visibilityOf($(".mat-option")), 5000);
+        opt = element(by.cssContainingText('.mat-option', day));
+        browser.executeScript("arguments[0].scrollIntoView();", opt.getWebElement());
+        browser.wait(EC.elementToBeClickable(opt), 2000);
+        opt.click();
+    },
+    selectSecondRadioOptionForMonthlyRepayment: function(){
+        radioMonthSetting2.click();
+    },
+    selectWeekdayForMonthlyRepayment: function (ordinaryNumber, weekday) {
+        browser.executeScript("arguments[0].scrollIntoView();", numberDaySelectMonthlyRepayment.getWebElement());
+        browser.wait(EC.visibilityOf(numberDaySelectMonthlyRepayment), 2000);
+        numberDaySelectMonthlyRepayment.click();
+        browser.wait(EC.visibilityOf($(".mat-option")), 5000);
+        opt = element(by.cssContainingText('.mat-option', ordinaryNumber));
+        browser.executeScript("arguments[0].scrollIntoView();", opt.getWebElement());
+        browser.wait(EC.elementToBeClickable(opt), 2000);
+        opt.click();
+        weekdaySelectMonthlyRepayment.click();
+        browser.wait(EC.visibilityOf($(".mat-option")), 5000);
+        opt = element(by.cssContainingText('.mat-option', weekday));
+        browser.executeScript("arguments[0].scrollIntoView();", opt.getWebElement());
+        browser.wait(EC.elementToBeClickable(opt), 2000);
+        opt.click();
+    },
+    selectDepositAccount: function (depositAccount) {
+        browser.executeScript("arguments[0].scrollIntoView();", depositAccountSelect.getWebElement());
+        browser.wait(EC.visibilityOf(depositAccountSelect), 2000);
+        depositAccountSelect.click();
+        browser.wait(EC.visibilityOf($(".mat-option")), 5000);
+        opt = element(by.cssContainingText('.mat-option', depositAccount));
+        browser.executeScript("arguments[0].scrollIntoView();", opt.getWebElement());
+        browser.wait(EC.elementToBeClickable(opt), 2000);
+        opt.click();
+    },
+    clickEnabledCreateMemberLoanButton: function(){
+        browser.executeScript("arguments[0].scrollIntoView();", primaryButton.first().getWebElement());
+        browser.wait(EC.elementToBeClickable(primaryButton.first()), 3000);
+        primaryButton.filter(function(elem, index) {
+            return elem.$("span").getText().then(function(text) {
+                return text === "CREATE MEMBER LOAN";
+            });
+        }).click();
+    },
+    clickEnabledUpdateMemberLoanButton: function(){
+        browser.executeScript("arguments[0].scrollIntoView();", primaryButton.first().getWebElement());
+        browser.wait(EC.elementToBeClickable(primaryButton.first()), 3000);
+        primaryButton.filter(function(elem, index) {
+            return elem.$("span").getText().then(function(text) {
+                return text === "UPDATE MEMBER LOAN";
+            });
+        }).click();
+    },
+    verifyTransactionCharge: function(chargeName, chargeAmount){
+        browser.sleep(1000);
+        browser.wait(EC.visibilityOf($("fims-case-command-confirmation-form table tbody")), 3000);
+        expect($$("fims-case-command-confirmation-form table tbody .td-data-table-row").filter(function(elem, index){
+            return elem.$(".td-data-table-cell").getText().then(function(text){
+                return text === chargeName;
+            });
+        }).$$(".td-data-table-cell").last().getText().then(function(text){
+            return text === chargeAmount;
+        })).toBe(true);
+    },
+    clickButtonForTransaction: function (transaction) {
+        $$('.mat-raised-button.mat-primary').filter(function (elem, index) {
+            return elem.$("span").getText().then(function (text) {
+                return text === transaction;
+            });
+        }).click();
+    },
+    verifyLoanHasStatus: function (expectedStatus) {
+        browser.wait(EC.visibilityOf($("fims-state-display")), 2000);
+        status = $("fims-state-display .mat-list-text .mat-line").getText();
+        expect(status).toEqual(expectedStatus);
+    },
+    goToStepDebtToIncomeRatio: function(){
+        browser.sleep(100);
+        browser.wait(EC.elementToBeClickable($$(".td-step-label").get(1)), 3000);
+        $$(".td-step-label").get(1).click();
+    },
+    goToStepCoSigner: function(){
+        browser.sleep(100);
+        browser.wait(EC.elementToBeClickable($$(".td-step-label").get(2)), 3000);
+        $$(".td-step-label").get(2).click();
+    },
+    goToStepDocuments: function(){
+        browser.sleep(100);
+        browser.wait(EC.elementToBeClickable($$(".td-step-label").get(3)), 3000);
+        $$(".td-step-label").get(3).click();
+    },
+    verifyButtonCreateMemberLoanDisabled: function(){
+        expect(primaryButton.filter(function(elem, index) {
+            return elem.$("span").getText().then(function(text) {
+                return text === "CREATE MEMBER LOAN";
+            });
+        }).first().isEnabled()).toBe(false);
+    },
+    verifyButtonCreateMemberLoanEnabled: function(){
+        expect(primaryButton.filter(function(elem, index) {
+            return elem.$("span").getText().then(function(text) {
+                return text === "CREATE MEMBER LOAN";
+            });
+        }).first().isEnabled()).toBe(true);
+    },
+    verifyButtonUpdateMemberLoanDisabled: function(){
+        expect(primaryButton.filter(function(elem, index) {
+            return elem.$("span").getText().then(function(text) {
+                return text === "UPDATE MEMBER LOAN";
+            });
+        }).first().isEnabled()).toBe(false);
+    },
+    verifyButtonUpdateMemberLoanEnabled: function(){
+        expect(primaryButton.filter(function(elem, index) {
+            return elem.$("span").getText().then(function(text) {
+                return text === "UPDATE MEMBER LOAN";
+            });
+        }).first().isEnabled()).toBe(true);
+    },
+    clickButtonAddDebt: function(){
+        browser.sleep(200);
+        buttons.filter(function(elem, index) {
+            return elem.$("span").getText().then(function(text) {
+                return text === "ADD DEBT";
+            });
+        }).click();
+    },
+    clickButtonAddIncome: function(){
+        browser.sleep(200);
+        buttons.filter(function(elem, index) {
+            return elem.$("span").getText().then(function(text) {
+                return text === "ADD INCOME";
+            });
+        }).click();
+    },
+    removeDebtAtPosition: function(position){
+        buttons.filter(function(elem, index) {
+            return elem.$("span").getText().then(function(text) {
+                return text === "REMOVE DEBT";
+            });
+        }).get(position-1).click();
+    },
+    removeIncomeAtPosition: function(position){
+        buttons.filter(function(elem, index) {
+            return elem.$("span").getText().then(function(text) {
+                return text === "REMOVE INCOME";
+            });
+        }).get(position-1).click();
+    },
+    enterTextDescriptionInputFieldForDebt: function(text, number) {
+        browser.wait(EC.visibilityOf(descriptionInputsDebt.get(number-1)), 2000)
+        descriptionInputsDebt.get(number-1).clear().click().sendKeys(text);
+    },
+    enterTextIntoAmountInputFieldForDebt: function(text, number) {
+        browser.wait(EC.visibilityOf(amountInputsDebt.get(number-1)), 2000)
+        amountInputsDebt.get(number-1).clear().click().sendKeys(text);
+    },
+    enterTextIntoDescriptionInputFieldForIncome: function(text, number) {
+        browser.wait(EC.visibilityOf(descriptionInputsIncome.get(number-1)), 2000)
+        descriptionInputsIncome.get(number-1).clear().click().sendKeys(text);
+    },
+    enterTextIntoAmountInputFieldForIncome: function(text, number) {
+        browser.wait(EC.visibilityOf(amountInputsIncome.get(number-1)), 2000)
+        amountInputsIncome.get(number-1).clear().click().sendKeys(text);
+    },
+    verifyDebtTotalIs: function(amount) {
+        expect(debtsTotal.getText()).toMatch(amount);
+    },
+    verifyIncomeTotalIs: function(amount) {
+        expect(incomeTotal.getText()).toMatch(amount);
+    },
+    verifyDebtIncomeRatioIs: function(amount) {
+        expect(ratio.getText()).toMatch(amount);
+    },
+    enterTextIntoMemberInputField: function(text) {
+        browser.wait(EC.elementToBeClickable(memberSelect), 5000);
+        memberSelect.click().clear().sendKeys(text);
+    },
+    clickButtonAddDocument: function(){
+        browser.sleep(200);
+        buttons.filter(function(elem, index) {
+            return elem.$("span").getText().then(function(text) {
+                return text === "ADD DOCUMENT";
+            });
+        }).click();
+    },
+    removeDocumentAtPosition: function(position){
+        buttons.filter(function(elem, index) {
+            return elem.$("span").getText().then(function(text) {
+                return text === "REMOVE DOCUMENT";
+            });
+        }).get(position-1).click();
+    },
+    viewPlannedPaymentForCustomerLoan: function(customer, loanProduct, loanAccount){
+        link = "/customers/detail/" + customer + "/loans/products/" + loanProduct + "/detail/" + loanAccount + "/payments";
+        browser.wait(EC.elementToBeClickable($('a[href="' + link + '"]')), 6000);
+        $('a[href="' + link + '"]').click();
+    },
+    viewDebtIncomeReportForCustomerLoan: function(customer, loanProduct, loanAccount){
+        link = "/customers/detail/" + customer + "/loans/products/" + loanProduct + "/detail/" + loanAccount + "/debtIncome";
+        browser.wait(EC.elementToBeClickable($('a[href="' + link + '"]')), 6000);
+        $('a[href="' + link + '"]').click();
+    }
+};
diff --git a/Pages/Customers.js b/Pages/Customers.js
index 229fd3e..cbb8e88 100644
--- a/Pages/Customers.js
+++ b/Pages/Customers.js
@@ -25,19 +25,6 @@
 
 //create loan account
 var shortNameInput = $("fims-id-input[controlname='identifier'] input");
-var principalAmountInput = $("fims-number-input[controlname='principalAmount'] input");
-var interestRateInput = $("fims-number-input[controlname='interest'] input");
-var termInput = $("fims-text-input[controlname='term'] input");
-var termSelect = $("mat-select[formcontrolname='termTemporalUnit'] .mat-select-trigger");
-var paymentPeriod = $("fims-text-input[controlname='paymentPeriod'] input");
-var paymentPeriodSelect = $("mat-select[formcontrolname='termTemporalUnit'] .mat-select-trigger");
-var depositAccountSelect = $("mat-select[formcontrolname='depositAccountIdentifier'] .mat-select-trigger");
-
-var radioMonthSetting1 = $$("mat-radio-group[formcontrolname='monthSetting'] mat-radio-button").get(0);
-var dayForMonthlyRepaySelect = $("mat-select[formcontrolname='monthSettingDay'] .mat-select-trigger");
-var radioMonthSetting2 = $$("mat-radio-group[formcontrolname='monthSetting'] mat-radio-button").get(1);
-var numberDaySelectMonthlyRepayment = $("mat-select[formcontrolname='monthSettingWeek'] .mat-select-trigger");
-var weekdaySelectMonthlyRepayment = $("mat-select[formcontrolname='monthSettingDayInWeek'] .mat-select-trigger");
 
 //identification cards
 var identificationCardNumberInput = $("fims-id-input[controlname='number'] input");
@@ -55,9 +42,6 @@
 var checkboxMandatory = $("mat-checkbox[formcontrolname='mandatory']");
 var checkboxAutoAssign = $("mat-checkbox[formcontrolname='predefined']");
 
-//payroll
-
-
 //general elements
 var linkCustomers = $$("a[href='/customers']");
 var primaryButton =  $$(".mat-raised-button.mat-primary");
@@ -295,112 +279,6 @@
         browser.wait(EC.elementToBeClickable(shortNameInput), 5000);
         shortNameInput.click().sendKeys(text);
     },
-    enterTextIntoPrincipalAmountInputField: function (text) {
-        principalAmountInput.click().sendKeys(protractor.Key.BACK_SPACE);
-        principalAmountInput.sendKeys(protractor.Key.BACK_SPACE);
-        principalAmountInput.sendKeys(protractor.Key.BACK_SPACE);
-        principalAmountInput.sendKeys(protractor.Key.BACK_SPACE);
-        principalAmountInput.sendKeys(protractor.Key.BACK_SPACE);
-        principalAmountInput.sendKeys(protractor.Key.BACK_SPACE);
-        principalAmountInput.sendKeys(protractor.Key.BACK_SPACE);
-        principalAmountInput.sendKeys(protractor.Key.BACK_SPACE);
-        principalAmountInput.sendKeys(protractor.Key.BACK_SPACE);
-        principalAmountInput.sendKeys(text);
-    },
-    enterTextIntoInterestRateInputField: function (text) {
-        interestRateInput.click().sendKeys(protractor.Key.BACK_SPACE);
-        interestRateInput.sendKeys(protractor.Key.BACK_SPACE);
-        interestRateInput.sendKeys(protractor.Key.BACK_SPACE);
-        interestRateInput.sendKeys(protractor.Key.BACK_SPACE);
-        interestRateInput.sendKeys(text);
-    },
-    verifyLoanAccountNotOfferedForSelection: function(accountIdentifier){
-        browser.wait(EC.elementToBeClickable(productSelect), 3000);
-        productSelect.click();
-        browser.wait(EC.visibilityOf($(".mat-option")), 5000);
-        expect(element(by.cssContainingText('.mat-option', accountIdentifier)).isPresent()).toBe(false);
-    },
-    verifyDepositAccountNotOfferedForSelection: function(accountIdentifier){
-        browser.executeScript("arguments[0].scrollIntoView();", depositAccountSelect.getWebElement());
-        browser.wait(EC.elementToBeClickable(depositAccountSelect), 3000);
-        depositAccountSelect.click();
-        expect($(".mat-option").isPresent()).toBe(true);
-        expect(element(by.cssContainingText('.mat-option', accountIdentifier)).isPresent()).toBe(false);
-    },
-    enterTextIntoTermInputField: function (text) {
-        termInput.click().clear().sendKeys(text);
-    },
-    selectTemporalUnitForTerm: function (temporalUnit) {
-        browser.executeScript("arguments[0].scrollIntoView();", termSelect.getWebElement());
-        browser.wait(EC.visibilityOf(termSelect), 2000);
-        termSelect.click();
-        browser.wait(EC.visibilityOf($(".mat-option")), 5000);
-        opt = element(by.cssContainingText('.mat-option', temporalUnit));
-        browser.executeScript("arguments[0].scrollIntoView();", opt.getWebElement());
-        browser.wait(EC.elementToBeClickable(opt), 2000);
-        opt.click();
-    },
-    enterTextIntoPaymentPeriodInputField: function (text) {
-        paymentPeriod.click().clear().sendKeys(text);
-    },
-    selectPaymentPeriod: function (paymentPeriod) {
-        browser.executeScript("arguments[0].scrollIntoView();", paymentPeriodSelect.getWebElement());
-        browser.wait(EC.visibilityOf(paymentPeriodSelect), 2000);
-        paymentPeriodSelect.click();
-        browser.wait(EC.visibilityOf($(".mat-option")), 5000);
-        opt = element(by.cssContainingText('.mat-option', paymentPeriod));
-        browser.executeScript("arguments[0].scrollIntoView();", opt.getWebElement());
-        browser.wait(EC.elementToBeClickable(opt), 2000);
-        opt.click();
-    },
-    selectDayForMonthlyRepayment: function (day) {
-        browser.executeScript("arguments[0].scrollIntoView();", dayForMonthlyRepaySelect.getWebElement());
-        browser.wait(EC.visibilityOf(dayForMonthlyRepaySelect), 2000);
-        dayForMonthlyRepaySelect.click();
-        browser.wait(EC.visibilityOf($(".mat-option")), 5000);
-        opt = element(by.cssContainingText('.mat-option', day));
-        browser.executeScript("arguments[0].scrollIntoView();", opt.getWebElement());
-        browser.wait(EC.elementToBeClickable(opt), 2000);
-        opt.click();
-    },
-    selectSecondRadioOptionForMonthlyRepayment: function(){
-        radioMonthSetting2.click();
-    },
-    selectWeekdayForMonthlyRepayment: function (ordinaryNumber, weekday) {
-        browser.executeScript("arguments[0].scrollIntoView();", numberDaySelectMonthlyRepayment.getWebElement());
-        browser.wait(EC.visibilityOf(numberDaySelectMonthlyRepayment), 2000);
-        numberDaySelectMonthlyRepayment.click();
-        browser.wait(EC.visibilityOf($(".mat-option")), 5000);
-        opt = element(by.cssContainingText('.mat-option', ordinaryNumber));
-        browser.executeScript("arguments[0].scrollIntoView();", opt.getWebElement());
-        browser.wait(EC.elementToBeClickable(opt), 2000);
-        opt.click();
-        weekdaySelectMonthlyRepayment.click();
-        browser.wait(EC.visibilityOf($(".mat-option")), 5000);
-        opt = element(by.cssContainingText('.mat-option', weekday));
-        browser.executeScript("arguments[0].scrollIntoView();", opt.getWebElement());
-        browser.wait(EC.elementToBeClickable(opt), 2000);
-        opt.click();
-    },
-    selectDepositAccount: function (depositAccount) {
-        browser.executeScript("arguments[0].scrollIntoView();", depositAccountSelect.getWebElement());
-        browser.wait(EC.visibilityOf(depositAccountSelect), 2000);
-        depositAccountSelect.click();
-        browser.wait(EC.visibilityOf($(".mat-option")), 5000);
-        opt = element(by.cssContainingText('.mat-option', depositAccount));
-        browser.executeScript("arguments[0].scrollIntoView();", opt.getWebElement());
-        browser.wait(EC.elementToBeClickable(opt), 2000);
-        opt.click();
-    },
-    clickEnabledCreateMemberLoanButton: function(){
-        browser.executeScript("arguments[0].scrollIntoView();", primaryButton.first().getWebElement());
-        browser.wait(EC.elementToBeClickable(primaryButton.first()), 3000);
-        primaryButton.filter(function(elem, index) {
-            return elem.$("span").getText().then(function(text) {
-                return text === "CREATE MEMBER LOAN";
-            });
-        }).click();
-    },
     verifyTransactionCharge: function(chargeName, chargeAmount){
         browser.sleep(1000);
         browser.wait(EC.visibilityOf($("fims-case-command-confirmation-form table tbody")), 3000);
@@ -419,11 +297,6 @@
             });
         }).click();
     },
-    verifyLoanHasStatus: function (expectedStatus) {
-        browser.wait(EC.visibilityOf($("fims-state-display")), 2000);
-        status = $("fims-state-display .mat-list-text .mat-line").getText();
-        expect(status).toEqual(expectedStatus);
-    },
 
     //customer tasks
     goToTasks: function(){
diff --git a/Specs/gate1.js b/Specs/gate1.js
index 3d12ca3..6195ace 100644
--- a/Specs/gate1.js
+++ b/Specs/gate1.js
@@ -34,6 +34,7 @@
 var Roles = require('../Pages/Roles');
 var Teller = require('../Pages/Teller');
 var Customers = require('../Pages/Customers');
+var CustomerLoans = require('../Pages/CustomerLoans');
 var Deposits = require('../Pages/Deposits');
 var Accounting = require('../Pages/Accounting');
 var Loans = require('../Pages/Loans');
@@ -475,12 +476,12 @@
         Customers.clickCreateLoanAccountForMember(customerAccount);
         Customers.selectProduct("My loan " + loanShortName);
         Customers.enterTextIntoShortNameInputField(loanAccountShortName);
-        Customers.enterTextIntoPrincipalAmountInputField("5000");
-        Customers.enterTextIntoTermInputField("12");
+        CustomerLoans.enterTextIntoPrincipalAmountInputField("5000");
+        CustomerLoans.enterTextIntoTermInputField("12");
         //verify correct radio button selected; BUG
-        Customers.selectDayForMonthlyRepayment("3.");
-        Customers.selectDepositAccount(customerAccount + ".9100.00001(" + depositIdentifier + ")");
-        Customers.clickEnabledCreateMemberLoanButton();
+        CustomerLoans.selectDayForMonthlyRepayment("3.");
+        CustomerLoans.selectDepositAccount(customerAccount + ".9100.00001(" + depositIdentifier + ")");
+        CustomerLoans.clickEnabledCreateMemberLoanButton();
         Common.verifyMessagePopupIsDisplayed("Case is going to be saved");
         Customers.verifyStateOfLoanAccountWithIdIs(loanAccountShortName, "CREATED");
     });
@@ -501,7 +502,7 @@
         Customers.clickButtonForTask("APPROVE");
         Customers.clickButtonForTransaction("APPROVE");
         Common.verifyMessagePopupIsDisplayed("Case is going to be updated");
-        Customers.verifyLoanHasStatus("APPROVED");
+        CustomerLoans.verifyLoanHasStatus("APPROVED");
     });
     it('should be able to disburse loan - no task', function () {
         //currently error if this is done too quickly; workaround
@@ -513,7 +514,7 @@
         Customers.verifyTransactionCharge("Disbursement fee", "05.00");
         Customers.clickButtonForTransaction("DISBURSE");
         Common.verifyMessagePopupIsDisplayed("Case is going to be updated");
-        Customers.verifyLoanHasStatus("ACTIVE");
+        CustomerLoans.verifyLoanHasStatus("ACTIVE");
     });
     it('bookings should be as expected (open/approve/disburse loan)', function () {
         //verify fees have been booked as expected
diff --git a/Specs/loans1_creation&assignment.js b/Specs/loans1_creation&assignment.js
index 92653b7..5f3c9a2 100644
--- a/Specs/loans1_creation&assignment.js
+++ b/Specs/loans1_creation&assignment.js
@@ -6,6 +6,7 @@
 var Roles = require('../Pages/Roles');
 var Teller = require('../Pages/Teller');
 var Customers = require('../Pages/Customers');
+var CustomerLoans = require('../Pages/CustomerLoans');
 var Deposits = require('../Pages/Deposits');
 var Accounting = require('../Pages/Accounting');
 var Loans = require('../Pages/Loans');
@@ -312,12 +313,12 @@
         Customers.clickManageLoanAccountsForMember(customerAccount);
         Customers.clickCreateLoanAccountForMember(customerAccount);
         //verify loan product cannot be selected
-        Customers.verifyLoanAccountNotOfferedForSelection(loanShortName2);
+        CustomerLoans.verifyLoanAccountNotOfferedForSelection(loanShortName2);
         Customers.selectProductFromOpenList(loanShortName);
     });
     it('should not be able to select deposit account if not enabled', function () {
         //verify deposit account cannot be selected
-        Customers.verifyDepositAccountNotOfferedForSelection(customerAccount + ".9100.00001(" + depositIdentifier +")");
+        CustomerLoans.verifyDepositAccountNotOfferedForSelection(customerAccount + ".9100.00001(" + depositIdentifier +")");
     });
     it('should open deposit account', function () {
         Teller.goToTellerManagementViaSidePanel();
@@ -356,58 +357,82 @@
         Common.verifyFirstRowOfSearchResultHasTextAsId(customerAccount);
         Common.clickLinkShowForRowWithId(customerAccount);
         Customers.clickManageLoanAccountsForMember(customerAccount);
-        Customers.clickCreateLoanAccountForMember(customerAccount);
-        Customers.selectProduct("My loan " + loanShortName);
-        Customers.enterTextIntoShortNameInputField(loanAccountShortName);
-        Customers.enterTextIntoPrincipalAmountInputField("9999.99");
+        CustomerLoans.clickCreateLoanAccountForMember(customerAccount);
+        CustomerLoans.selectProduct("My loan " + loanShortName);
+        CustomerLoans.enterTextIntoShortNameInputField(loanAccountShortName);
+        CustomerLoans.enterTextIntoPrincipalAmountInputField("9999.99");
         //invalid input, error
-        Customers.enterTextIntoPrincipalAmountInputField("50,000.01");
+        CustomerLoans.enterTextIntoPrincipalAmountInputField("50,000.01");
         //invalid input, error
-        Customers.enterTextIntoPrincipalAmountInputField("10,000");
-        Customers.enterTextIntoInterestRateInputField("3.65");
+        CustomerLoans.enterTextIntoPrincipalAmountInputField("10,000");
+        CustomerLoans.enterTextIntoInterestRateInputField("3.65");
         //invalid input, error
-        Customers.enterTextIntoInterestRateInputField("0.79");
+        CustomerLoans.enterTextIntoInterestRateInputField("0.79");
         //invalid input, error
-        Customers.enterTextIntoInterestRateInputField("3.60");
-        Customers.enterTextIntoTermInputField("62");
+        CustomerLoans.enterTextIntoInterestRateInputField("3.60");
+        CustomerLoans.enterTextIntoTermInputField("62");
         //invalid input, error
-        Customers.enterTextIntoTermInputField("60");
+        CustomerLoans.enterTextIntoTermInputField("60");
         //valid input, no error
-        Customers.selectTemporalUnitForTerm("years");
+        CustomerLoans.selectTemporalUnitForTerm("years");
         //invalid input, error
-        Customers.enterTextIntoTermInputField("5");
+        CustomerLoans.enterTextIntoTermInputField("5");
         //valid input, no error
-        Customers.enterTextIntoPaymentPeriodInputField("62");
+        CustomerLoans.enterTextIntoPaymentPeriodInputField("62");
         //invalid input, error: Invalid payment period. Maximum allowed are 260 week(s), 60 month(s) or 5 year(s).
-        Customers.enterTextIntoPaymentPeriodInputField("6");
+        CustomerLoans.enterTextIntoPaymentPeriodInputField("6");
         //valid input, no error
-        Customers.selectPaymentPeriod("years");
+        CustomerLoans.selectPaymentPeriod("years");
         //invalid input, error
-        Customers.selectPaymentPeriod("months");
+        CustomerLoans.selectPaymentPeriod("months");
         //valid input, no error
-        Customers.selectSecondRadioOptionForMonthlyRepayment();
-        Customers.selectWeekdayForMonthlyRepayment("last", "Friday");
-        Customers.selectDepositAccount(customerAccount + ".9100.00001(" + depositIdentifier + ")");
+        CustomerLoans.selectSecondRadioOptionForMonthlyRepayment();
+        CustomerLoans.selectWeekdayForMonthlyRepayment("last", "Friday");
+        CustomerLoans.selectDepositAccount(customerAccount + ".9100.00001(" + depositIdentifier + ")");
         //change loan product to the other one
-        Customers.selectProduct(loanShortName2);
+        CustomerLoans.selectProduct(loanShortName2);
         //error for principal: Value must be smaller than or equal to 1500
-        Customers.enterTextIntoPrincipalAmountInputField("1500");
+        CustomerLoans.enterTextIntoPrincipalAmountInputField("1500");
         //interest rate input is disabled and shows 15%
         //error for payment period: Invalid payment period. Maximum allowed are 21 week(s), 5 month(s) or 0 year(s).
-        Customers.selectPaymentPeriod("months");
+        CustomerLoans.selectPaymentPeriod("months");
         //debt to income ratio
+        CustomerLoans.goToStepDebtToIncomeRatio();
+        CustomerLoans.clickButtonAddDebt();
+        CustomerLoans.enterTextDescriptionInputFieldForDebt("My loan", 1);
+        CustomerLoans.enterTextIntoAmountInputFieldForDebt("10000", 1);
+        CustomerLoans.verifyDebtTotalIs("10,000.00");
+        CustomerLoans.clickButtonAddDebt();
+        CustomerLoans.enterTextDescriptionInputFieldForDebt("My mortgage", 2);
+        CustomerLoans.enterTextIntoAmountInputFieldForDebt("5000", 2);
+        CustomerLoans.verifyDebtTotalIs("15,000.00");
+        CustomerLoans.clickButtonAddIncome();
+        CustomerLoans.enterTextIntoDescriptionInputFieldForIncome("First job", 1);
+        CustomerLoans.enterTextIntoAmountInputFieldForIncome("5000",1);
+        CustomerLoans.verifyIncomeTotalIs("5,000.00");
+        CustomerLoans.verifyDebtIncomeRatioIs("03.00");
+        CustomerLoans.clickButtonAddIncome();
+        CustomerLoans.enterTextIntoDescriptionInputFieldForIncome("Second job", 2);
+        CustomerLoans.enterTextIntoAmountInputFieldForIncome("5000",2);
+        CustomerLoans.verifyIncomeTotalIs("10,000.00");
+        CustomerLoans.verifyDebtIncomeRatioIs("01.50");
+        //browser.pause();
+        CustomerLoans.goToStepCoSigner();
         //co-signer
+        //CustomerLoans.enterTextIntoMemberInputField();
         //documents
-        Customers.clickEnabledCreateMemberLoanButton();
+        CustomerLoans.goToStepDocuments();
+        browser.pause();
+        CustomerLoans.clickEnabledCreateMemberLoanButton();
         Common.verifyMessagePopupIsDisplayed("Case is going to be saved");
         Customers.verifyStateOfLoanAccountWithIdIs(loanAccountShortName, "CREATED");
         //details
     });
     it('planned payment', function () {
-
+        CustomerLoans.viewPlannedPaymentForCustomerLoan(customerAccount, loanShortName, loanAccountShortName);
     });
     it('debt/income ratio', function () {
-
+        CustomerLoans.viewDebtIncomeReportForCustomerLoan(customerAccount, loanShortName, loanAccountShortName);
     });
     it('editing loan account possible until approved', function () {
         //edit loan account to different one (different product, different settings)
@@ -416,9 +441,13 @@
     });
     it('update/deletion of unassigned/assigned product', function () {
         //assigned product cannot be deleted anymore
-        //what about disabled/edited? fees/tasks???
+        //what about disabled/edited?
+        //disable assigned product & check customer loan account: ATEN-475
+        //try to edit assigned product: ATEN-507
+        //fees: try to edit fees
+        //tasks: try to edit/add tasks: bug ATEN-318
         //unassigned product can be disabled/edited
-        //edit product and verify updated
+        //edit product and verify updated, edit fees and add tasks
         //unassigned product can be deleted
     });
 });
\ No newline at end of file
