diff --git a/Pages/Customers.js b/Pages/Customers.js
index efad5f2..229fd3e 100644
--- a/Pages/Customers.js
+++ b/Pages/Customers.js
@@ -29,7 +29,7 @@
 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 = $("fima-text-input[controlname='paymentPeriod'] input");
+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");
 
@@ -300,6 +300,11 @@
         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) {
@@ -319,7 +324,8 @@
         browser.executeScript("arguments[0].scrollIntoView();", depositAccountSelect.getWebElement());
         browser.wait(EC.elementToBeClickable(depositAccountSelect), 3000);
         depositAccountSelect.click();
-        expect($(".mat-option").isPresent()).toBe(false);
+        expect($(".mat-option").isPresent()).toBe(true);
+        expect(element(by.cssContainingText('.mat-option', accountIdentifier)).isPresent()).toBe(false);
     },
     enterTextIntoTermInputField: function (text) {
         termInput.click().clear().sendKeys(text);
diff --git a/Pages/Loans.js b/Pages/Loans.js
index dbd64c4..c29f6d7 100644
--- a/Pages/Loans.js
+++ b/Pages/Loans.js
@@ -310,6 +310,7 @@
         radioWeeks.click();
     },
     verifyEditLoanProductButtonIsDisplayed: function(){
+        browser.sleep(500);
         expect($("a[title='Edit product']").isPresent()).toBe(true);
     },
     verifyEditLoanProductButtonIsNotDisplayed: function(){
diff --git a/Specs/loans1_creation&assignment.js b/Specs/loans1_creation&assignment.js
new file mode 100644
index 0000000..92653b7
--- /dev/null
+++ b/Specs/loans1_creation&assignment.js
@@ -0,0 +1,424 @@
+var helper = require('../helper.js');
+var Login = require('../Pages/Login.js');
+var Employees = require('../Pages/Employees.js');
+var Common = require('../Pages/Common.js');
+var Offices = require('../Pages/Offices');
+var Roles = require('../Pages/Roles');
+var Teller = require('../Pages/Teller');
+var Customers = require('../Pages/Customers');
+var Deposits = require('../Pages/Deposits');
+var Accounting = require('../Pages/Accounting');
+var Loans = require('../Pages/Loans');
+
+
+describe('Loans 1', function() {
+    var EC = protractor.ExpectedConditions;
+    employeeIdentifier = helper.getRandomString(6);
+    officeIdentifier = helper.getRandomString(6);
+    tellerIdentifier = helper.getRandomString(4);
+    customerAccount = helper.getRandomString(5);
+    depositIdentifier = helper.getRandomString(4);
+    depositName = helper.getRandomString(8);
+    chequeReceivablesAccount = helper.getRandomString(4);
+    cashOverShortAccount = helper.getRandomString(4);
+    tellerAccount = helper.getRandomString(4);
+    revenueAccount = helper.getRandomString(4);
+    loanShortName = helper.getRandomString(6);
+    loanShortName2 = helper.getRandomString(6);
+    taskIdentifier = helper.getRandomString(3);
+    loanAccountShortName =  helper.getRandomString(4);
+
+    it('should create a new administrator role', function () {
+        Common.waitForThePageToFinishLoading();
+        Roles.clickCreateNewRoleFromQuickAccess();
+        Roles.enterTextIntoRoleIdentifierInput("Administrator");
+        Common.verifyCardHasTitle("Create new role");
+        Roles.selectCheckboxToGiveUserAllPermissions();
+        Roles.clickEnabledSaveRoleButton();
+        Common.verifyMessagePopupIsDisplayed("Role is going to be saved");
+        Common.verifyCardHasTitle("Manage roles");
+    });
+    it('should create a new employee with administrator permissions', function () {
+        Employees.goToManageEmployeesViaSidePanel();
+        Employees.createEmployee(employeeIdentifier, "Kate", "Atkinson", "Administrator", "abc123!!");
+        Login.signOut();
+        Login.logInForFirstTimeWithTenantUserAndPassword("playground", employeeIdentifier, "abc123!!", "abc123??");
+    });
+    it('should create new accounts', function () {
+        Accounting.goToAccountingViaSidePanel();
+        Common.clickLinkShowForRowWithId("7000");
+        Common.clickLinkShowForRowWithId("7200");
+        Accounting.clickCreateNewAccountInLedger("7200");
+        Accounting.enterTextIntoAccountIdentifierInputField(chequeReceivablesAccount);
+        Accounting.verifyRadioAssetToBeSelected();
+        Accounting.verifyRadioAssetToBeDisabled();
+        Accounting.enterTextIntoAccountNameInputField("Cheques Receivables");
+        Accounting.clickButtonCreateAccount();
+        Common.verifyMessagePopupIsDisplayed("Account is going to be saved");
+        Accounting.goToAccountingViaSidePanel();
+        Common.clickLinkShowForRowWithId("7000");
+        Common.clickLinkShowForRowWithId("7300");
+        Accounting.clickCreateNewAccountInLedger("7300");
+        Accounting.enterTextIntoAccountIdentifierInputField(tellerAccount);
+        Accounting.verifyRadioAssetToBeSelected();
+        Accounting.verifyRadioAssetToBeDisabled();
+        Accounting.enterTextIntoAccountNameInputField("My teller");
+        Accounting.clickButtonCreateAccount();
+        Common.verifyMessagePopupIsDisplayed("Account is going to be saved");
+        Accounting.goToAccountingViaSidePanel();
+        Common.clickLinkShowForRowWithId("1000");
+        Common.clickLinkShowForRowWithId("1300");
+        Accounting.clickCreateNewAccountInLedger("1300");
+        Accounting.enterTextIntoAccountIdentifierInputField(revenueAccount);
+        Accounting.verifyRadioRevenueToBeSelected();
+        Accounting.enterTextIntoAccountNameInputField("Revenue from deposit charges");
+        Accounting.clickButtonCreateAccount();
+        Common.verifyMessagePopupIsDisplayed("Account is going to be saved");
+        Accounting.goToAccountingViaSidePanel();
+        Common.clickLinkShowForRowWithId("2000");
+        Common.clickLinkShowForRowWithId("3300");
+        Accounting.clickCreateNewAccountInLedger("3300");
+        Accounting.enterTextIntoAccountIdentifierInputField(cashOverShortAccount);
+        Accounting.enterTextIntoAccountNameInputField("Cash over short account");
+        Accounting.clickButtonCreateAccount();
+        Common.verifyMessagePopupIsDisplayed("Account is going to be saved");
+    });
+    it('should create a headquarter office', function () {
+        Offices.goToManageOfficesViaSidePanel();
+        Offices.verifyNoHeadquarterExistingYet();
+        Offices.clickButtonCreateHeadquarter();
+        Common.verifyCardHasTitle("Create new office");
+        Offices.enterTextIntoOfficeIdentifierInputField("hqo1");
+        Offices.enterTextIntoOfficeNameInputField("Headquarter Office Playground");
+        Offices.clickEnabledContinueButtonForOfficeDetails();
+        Offices.clickCreateOfficeButton();
+        Common.verifyMessagePopupIsDisplayed("Office is going to be saved");
+    });
+    it('should create a new branch office', function () {
+        Offices.clickButtonCreateNewOffice();
+        Common.verifyCardHasTitle("Create new office");
+        Offices.enterTextIntoOfficeIdentifierInputField(officeIdentifier);
+        Offices.enterTextIntoOfficeNameInputField("Branch " + officeIdentifier);
+        Offices.clickEnabledContinueButtonForOfficeDetails();
+        Offices.clickCreateOfficeButton();
+        Common.verifyMessagePopupIsDisplayed("Office is going to be saved");
+        Common.clickSearchButtonToMakeSearchInputFieldAppear();
+        Common.enterTextInSearchInputFieldAndApplySearch(officeIdentifier);
+        Common.verifyFirstRowOfSearchResultHasTextAsId(officeIdentifier);
+    });
+    it('should create a new teller for the branch office', function () {
+        Common.clickLinkShowForFirstRowInTable();
+        Offices.goToManageTellersForOfficeByIdentifier(officeIdentifier);
+        Offices.clickCreateTellerForOfficeByIdentifier(officeIdentifier);
+        Offices.enterTextIntoTellerNumberInputField(tellerIdentifier);
+        Offices.enterTextIntoPasswordInputField("qazwsx123!!");
+        Offices.enterTextIntoCashWithdrawalLimitInputField("1000");
+        Offices.enterTextIntoTellerAccountInputFieldAndSelectMatchingEntry(tellerAccount);
+        Offices.enterTextIntoVaultAccountInputFieldAndSelectMatchingEntry("7351");
+        Offices.enterTextIntoChequesReceivableAccountInputFieldAndSelectMatchingEntry(chequeReceivablesAccount);
+        Offices.enterTextIntoCashOverShortInputFieldAndSelectMatchingEntry(cashOverShortAccount);
+        Offices.clickCreateTellerButton();
+        Common.verifyMessagePopupIsDisplayed("Teller is going to be saved");
+        //workaround for current bug that teller is not always listed immediately
+        Common.clickBackButtonInTitleBar();
+        Offices.goToManageTellersForOfficeByIdentifier(officeIdentifier);
+        //Offices.verifyTellerStatusIs("CLOSED");
+        Common.clickLinkShowForFirstRowInTable();
+    });
+    it('should open the teller and assign it to an employee', function () {
+        Offices.clickActionOpenForTellerOfOffice(tellerIdentifier, officeIdentifier);
+        Offices.enterTextIntoAssignedEmployeeInputField(employeeIdentifier);
+        Offices.selectOptionInListByName("Atkinson, Kate");
+        Offices.clickEnabledOpenTellerButton();
+        Common.verifyMessagePopupIsDisplayed("Teller is going to be updated");
+        Offices.verifyTellerStatusIs("OPEN");
+    });
+    it('should be able to create customer', function () {
+        Customers.goToManageCustomersViaSidePanel();
+        Common.verifyCardHasTitle("Manage members");
+        Customers.clickButtonOrLinkCreateNewMember();
+        Common.verifyCardHasTitle("Create new member");
+        Customers.enterTextIntoAccountInputField(customerAccount);
+        Customers.enterTextIntoFirstNameInputField("Thomas");
+        Customers.enterTextIntoLastNameInputField("Pynchon");
+        Customers.enterTextIntoDayOfBirthInputField("9211978");
+        Customers.verifyIsMemberCheckboxSelected();
+        Customers.clickEnabledContinueButtonForMemberDetails();
+        Customers.enterTextIntoStreetInputField("800 Chatham Road #326");
+        Customers.enterTextIntoCityInputField("Winston-Salem");
+        Customers.selectCountryByName("Germany");
+        Customers.clickEnabledContinueButtonForMemberAddress();
+        Customers.clickEnabledCreateMemberButton();
+        Common.verifyMessagePopupIsDisplayed("Member is going to be saved");
+        Common.verifyCardHasTitle("Manage members");
+        Common.clickSearchButtonToMakeSearchInputFieldAppear();
+        Common.enterTextInSearchInputFieldAndApplySearch(customerAccount);
+        Common.verifyFirstRowOfSearchResultHasTextAsId(customerAccount);
+    });
+    it('should not be possible to create loan account for pending customer', function () {
+
+    });
+    it('should activate the customer', function () {
+        Common.clickLinkShowForFirstRowInTable();
+        Customers.verifyMemberHasStatusInactive();
+        Customers.clickButtonGoToTasks();
+        Customers.clickButtonActivate();
+        Common.verifyMessagePopupIsDisplayed("Command is going to be executed");
+        Customers.verifyMemberHasStatusActive();
+    });
+    it('should create a deposit account - Checking with opening charge', function () {
+        Deposits.goToDepositsViaSidePanel();
+        Common.verifyCardHasTitle("Manage deposit products");
+        Deposits.clickButtonCreateDepositAccount();
+        Common.verifyCardHasTitle("Create new deposit product");
+        Deposits.enterTextIntoShortNameInputField(depositIdentifier);
+        Deposits.verifyRadioCheckingIsSelected();
+        Deposits.enterTextIntoNameInputField(depositName);
+        Deposits.enterTextIntoMinimumBalanceInputField("100");
+        Deposits.verifyRadioAnnuallyIsSelected();
+        Deposits.verifyCheckboxFlexibleInterestNotChecked();
+        Deposits.enterTextIntoInterestInputField("0.05");
+        Deposits.enterTextIntoCashAccountInputField("7352");
+        Deposits.enterTextIntoExpenseAccountInputField("2820");
+        Deposits.enterTextIntoAccrueAccountInputField("8202");
+        Deposits.enterTextIntoEquityLedgerInputField("9100");
+        Deposits.clickEnabledContinueButtonForProductDetails();
+        Deposits.clickButtonAddCharge();
+        Deposits.enterTextIntoChargeNameInputField("Account opening charge");
+        Deposits.enterTextIntoIncomeAccountInputField(revenueAccount);
+        Deposits.enterTextIntoChargeAmountInputField("0");
+        Deposits.selectTypeOfCharge("Account Opening");
+        Deposits.clickEnabledCreateProductButton();
+        Common.verifyMessagePopupIsDisplayed("Product is going to be saved");
+        Common.verifyCardHasTitle("Manage deposit products");
+    });
+    it('should enable deposit product', function () {
+        Common.clickLinkShowForRowWithId(depositIdentifier);
+        Deposits.verifyProductHasStatusDisabled();
+        Deposits.clickButtonEnableProduct();
+        Common.verifyMessagePopupIsDisplayed("Product is going to be updated");
+        Deposits.verifyProductHasStatusEnabled();
+    });
+    it('should assign deposit product to customer', function () {
+        Customers.goToManageCustomersViaSidePanel();
+        Common.clickSearchButtonToMakeSearchInputFieldAppear();
+        Common.enterTextInSearchInputFieldAndApplySearch(customerAccount);
+        Common.verifyFirstRowOfSearchResultHasTextAsId(customerAccount);
+        Common.clickLinkShowForRowWithId(customerAccount);
+        Customers.clickManageDepositAccountsForMember(customerAccount);
+        Customers.clickCreateDepositAccountForMember(customerAccount);
+        Customers.selectProduct(depositName);
+        Customers.clickEnabledButtonCreateDepositAccount();
+        Common.verifyMessagePopupIsDisplayed("Deposit account is going to be saved");
+    });
+    it('create first loan product', function () {
+        Loans.goToLoanProductsViaSidePanel();
+        Loans.clickButtonCreateLoanProduct();
+        //product details
+        Loans.enterTextIntoShortNameInputField(loanShortName);
+        Loans.enterTextIntoNameInputField("My loan " + loanShortName);
+        Loans.enterTextIntoDescriptionInputField("My loan " + loanShortName);
+        Loans.enterTextIntoMinimumPrincipalInputField("10000");
+        Loans.enterTextIntoMaximumPrincipalInputField("9999.99");
+        //not possible, invalid input
+        Loans.verifyPrincipalAmountInputFieldsHaveError("Must be greater than or equal minimum");
+        Loans.enterTextIntoMaximumPrincipalInputField("50000");
+        //maximum term: 5 years
+        Loans.enterTextIntoTermInputField("5");
+        Loans.selectRadioButtonYears();
+        Loans.clickEnabledContinueButtonForProductDetails();
+        //ledger and account settings
+        //asset account only
+        Loans.enterTextIntoCashAccountInputField(tellerAccount);
+        //asset ledger only
+        Loans.enterTextIntoCustomerLoanLedgerInputField("7900");
+        Loans.clickEnabledContinueButtonForLedgerAndAccountSettings();
+        //interest settings
+        Loans.toggleInterestRangeToOn();
+        Loans.enterTextIntoInterestRangeMinInputField("5.0");
+        Loans.enterTextIntoInterestRangeMaxInputField("4.99");
+        //not possible, invalid input
+        Loans.verifyInterestRangeInputFieldsHaveError("Must be greater than minimum");
+        Loans.enterTextIntoInterestRangeMinInputField("0.80");
+        Loans.enterTextIntoInterestRangeMaxInputField("3.60");
+        //revenue account only
+        Loans.enterTextIntoIncomeAccountAccountInputField("1101");
+        //asset account only
+        Loans.enterTextIntoAccrualAccountInputField("7810");
+        Loans.clickEnabledContinueButtonForInterestSettings();
+        //fee income accounts
+        Loans.enterTextIntoProcessingFeeIncomeAccountInputField("1313");
+        Loans.enterTextIntoOriginatingFeeIncomeAccountInputField("1313");
+        Loans.enterTextIntoDisbursementFeeIncomeAccountInputField("1313");
+        Loans.enterTextIntoLateFeeIncomeAccountInputField("1311");
+        Loans.enterTextIntoLateFeeAccrualAccountInputField("7810");
+        //arrears allowance reserve account
+        Loans.clickEnabledContinueButtonForFeeIncomeAccounts();
+        Loans.enterTextIntoArrearsAllowanceAccountInputField("3040");
+        Loans.clickEnabledCreateProductButton();
+        Common.verifyMessagePopupIsDisplayed("Product is going to be saved");
+    });
+    it('should enable the first loan product', function () {
+        //message
+        Common.clickLinkShowForRowWithId(loanShortName);
+        Loans.clickButtonEnableProduct();
+        Common.verifyMessagePopupIsDisplayed("Product is going to be enabled");
+    });
+    it('create second loan product', function () {
+        Loans.goToLoanProductsViaSidePanel();
+        Loans.clickButtonCreateLoanProduct();
+        //product details
+        Loans.enterTextIntoShortNameInputField(loanShortName2);
+        Loans.enterTextIntoNameInputField("My loan " + loanShortName2);
+        Loans.enterTextIntoDescriptionInputField("My loan " + loanShortName2);
+        Loans.enterTextIntoMinimumPrincipalInputField("500");
+        Loans.enterTextIntoMaximumPrincipalInputField("1500");
+        Loans.selectCurrencyByName("JMD");
+        //maximum term: 52 weeks
+        Loans.enterTextIntoTermInputField("52");
+        Loans.selectRadioButtonWeeks();
+        Loans.clickEnabledContinueButtonForProductDetails();
+        //ledger and account settings
+        Loans.enterTextIntoCashAccountInputField(tellerAccount);
+        Loans.enterTextIntoCustomerLoanLedgerInputField("7900");
+        Loans.clickEnabledContinueButtonForLedgerAndAccountSettings();
+        //interest settings
+        Loans.verifyInterestRangeToggleSetToOff();
+        Loans.enterTextIntoInterestRateInputField("15.00");
+        Loans.enterTextIntoIncomeAccountAccountInputField("1101");
+        Loans.enterTextIntoAccrualAccountInputField("7810");
+        Loans.clickEnabledContinueButtonForInterestSettings();
+        //fee income accounts
+        //revenue accounts only
+        Loans.enterTextIntoProcessingFeeIncomeAccountInputField("1313");
+        Loans.enterTextIntoOriginatingFeeIncomeAccountInputField("1313");
+        Loans.enterTextIntoDisbursementFeeIncomeAccountInputField("1313");
+        Loans.enterTextIntoLateFeeIncomeAccountInputField("1311");
+        //asset accounts only
+        Loans.enterTextIntoLateFeeAccrualAccountInputField("7810");
+        Loans.clickEnabledContinueButtonForFeeIncomeAccounts();
+        //arrears allowance reserve account
+        //expense accounts only
+        Loans.enterTextIntoArrearsAllowanceAccountInputField("3040");
+        Loans.clickEnabledCreateProductButton();
+        Common.verifyMessagePopupIsDisplayed("Product is going to be saved");
+    });
+    it('should not be able to select loan product if not enabled', function () {
+        Customers.goToManageCustomersViaSidePanel();
+        Common.clickSearchButtonToMakeSearchInputFieldAppear();
+        Common.enterTextInSearchInputFieldAndApplySearch(customerAccount);
+        Common.verifyFirstRowOfSearchResultHasTextAsId(customerAccount);
+        Common.clickLinkShowForFirstRowInTable();
+        Customers.clickManageLoanAccountsForMember(customerAccount);
+        Customers.clickCreateLoanAccountForMember(customerAccount);
+        //verify loan product cannot be selected
+        Customers.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 +")");
+    });
+    it('should open deposit account', function () {
+        Teller.goToTellerManagementViaSidePanel();
+        Teller.enterTextIntoTellerNumberInputField(tellerIdentifier);
+        Teller.enterTextIntoPasswordInputField("qazwsx123!!");
+        Teller.clickEnabledUnlockTellerButton();
+        Common.verifyMessagePopupIsDisplayed("Teller drawer unlocked");
+        Teller.enterTextIntoSearchInputField(customerAccount);
+        //will be successful even if the customer does not exist, clicks one of the buttons too quickly: need to fix
+        Teller.clickButtonShowAtIndex(0);
+        Teller.verifyCardTitleHasNameOfCustomer("Thomas Pynchon");
+        Teller.clickOnOpenAccountForCustomer(customerAccount);
+        Common.verifyCardHasTitle("Teller transaction");
+        Teller.selectAccountToBeAffected(customerAccount + ".9100.00001(" + depositIdentifier +")");
+        Teller.enterTextIntoAmountInputField("1000");
+        Teller.clickEnabledCreateTransactionButton();
+        Teller.verifyTransactionAmount("1000");
+        Teller.verifyChargesPayedInCashCheckboxChecked();
+        Teller.clickEnabledConfirmTransactionButton();
+        Common.verifyMessagePopupIsDisplayed("Transaction successfully confirmed");
+    });
+    it('should enable the second loan product', function () {
+        Loans.goToLoanProductsViaSidePanel();
+        Common.clickLinkShowForRowWithId(loanShortName2);
+        Loans.verifyEditLoanProductButtonIsDisplayed();
+        Loans.clickButtonEnableProduct();
+        Common.verifyMessagePopupIsDisplayed("Product is going to be enabled");
+    });
+    it('loan product cannot be edited when enabled', function () {
+        Loans.verifyEditLoanProductButtonIsNotDisplayed();
+    });
+    it('should assign loan product to customer', function () {
+        Customers.goToManageCustomersViaSidePanel();
+        Common.clickSearchButtonToMakeSearchInputFieldAppear();
+        Common.enterTextInSearchInputFieldAndApplySearch(customerAccount);
+        Common.verifyFirstRowOfSearchResultHasTextAsId(customerAccount);
+        Common.clickLinkShowForRowWithId(customerAccount);
+        Customers.clickManageLoanAccountsForMember(customerAccount);
+        Customers.clickCreateLoanAccountForMember(customerAccount);
+        Customers.selectProduct("My loan " + loanShortName);
+        Customers.enterTextIntoShortNameInputField(loanAccountShortName);
+        Customers.enterTextIntoPrincipalAmountInputField("9999.99");
+        //invalid input, error
+        Customers.enterTextIntoPrincipalAmountInputField("50,000.01");
+        //invalid input, error
+        Customers.enterTextIntoPrincipalAmountInputField("10,000");
+        Customers.enterTextIntoInterestRateInputField("3.65");
+        //invalid input, error
+        Customers.enterTextIntoInterestRateInputField("0.79");
+        //invalid input, error
+        Customers.enterTextIntoInterestRateInputField("3.60");
+        Customers.enterTextIntoTermInputField("62");
+        //invalid input, error
+        Customers.enterTextIntoTermInputField("60");
+        //valid input, no error
+        Customers.selectTemporalUnitForTerm("years");
+        //invalid input, error
+        Customers.enterTextIntoTermInputField("5");
+        //valid input, no error
+        Customers.enterTextIntoPaymentPeriodInputField("62");
+        //invalid input, error: Invalid payment period. Maximum allowed are 260 week(s), 60 month(s) or 5 year(s).
+        Customers.enterTextIntoPaymentPeriodInputField("6");
+        //valid input, no error
+        Customers.selectPaymentPeriod("years");
+        //invalid input, error
+        Customers.selectPaymentPeriod("months");
+        //valid input, no error
+        Customers.selectSecondRadioOptionForMonthlyRepayment();
+        Customers.selectWeekdayForMonthlyRepayment("last", "Friday");
+        Customers.selectDepositAccount(customerAccount + ".9100.00001(" + depositIdentifier + ")");
+        //change loan product to the other one
+        Customers.selectProduct(loanShortName2);
+        //error for principal: Value must be smaller than or equal to 1500
+        Customers.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");
+        //debt to income ratio
+        //co-signer
+        //documents
+        Customers.clickEnabledCreateMemberLoanButton();
+        Common.verifyMessagePopupIsDisplayed("Case is going to be saved");
+        Customers.verifyStateOfLoanAccountWithIdIs(loanAccountShortName, "CREATED");
+        //details
+    });
+    it('planned payment', function () {
+
+    });
+    it('debt/income ratio', function () {
+
+    });
+    it('editing loan account possible until approved', function () {
+        //edit loan account to different one (different product, different settings)
+        //planned payment
+        //...
+    });
+    it('update/deletion of unassigned/assigned product', function () {
+        //assigned product cannot be deleted anymore
+        //what about disabled/edited? fees/tasks???
+        //unassigned product can be disabled/edited
+        //edit product and verify updated
+        //unassigned product can be deleted
+    });
+});
\ No newline at end of file
