diff --git a/api/src/main/java/io/mifos/portfolio/api/v1/client/PortfolioManager.java b/api/src/main/java/io/mifos/portfolio/api/v1/client/PortfolioManager.java
index 58bba51..9a63006 100644
--- a/api/src/main/java/io/mifos/portfolio/api/v1/client/PortfolioManager.java
+++ b/api/src/main/java/io/mifos/portfolio/api/v1/client/PortfolioManager.java
@@ -452,6 +452,4 @@
   CasePage getAllCases(
       @RequestParam("pageIndex") final Integer pageIndex,
       @RequestParam("size") final Integer size);
-
-  //TODO: find a way to list cases by customer even though the portfolio contains products which may be associated with groups instead of customers.
 }
diff --git a/component-test/src/main/java/io/mifos/portfolio/AccountingFixture.java b/component-test/src/main/java/io/mifos/portfolio/AccountingFixture.java
index 091f0d4..60833f5 100644
--- a/component-test/src/main/java/io/mifos/portfolio/AccountingFixture.java
+++ b/component-test/src/main/java/io/mifos/portfolio/AccountingFixture.java
@@ -65,7 +65,9 @@
   static final String CONSUMER_LOAN_INTEREST_ACCOUNT_IDENTIFIER = "1103";
   static final String LATE_FEE_INCOME_ACCOUNT_IDENTIFIER = "1311";
   static final String LATE_FEE_ACCRUAL_ACCOUNT_IDENTIFIER = "7840";
-  static final String ARREARS_ALLOWANCE_ACCOUNT_IDENTIFIER = "3010";
+  static final String PRODUCT_LOSS_ALLOWANCE_ACCOUNT_IDENTIFIER = "7353.0";
+  static final String GENERAL_LOSS_ALLOWANCE_ACCOUNT_IDENTIFIER = "3010";
+  static final String GENERAL_EXPENSE_ACCOUNT_IDENTIFIER = "3011";
 
   static final Map<String, AccountData> accountMap = new HashMap<>();
 
@@ -240,11 +242,24 @@
     return ret;
   }
 
-  private static Account arrearsAllowanceAccount() {
+  private static Account productLossAllowanceAccount() {
     final Account ret = new Account();
-    ret.setIdentifier(ARREARS_ALLOWANCE_ACCOUNT_IDENTIFIER);
-    //ret.setGroup(LOAN_INCOME_LEDGER_IDENTIFIER); //TODO: ??
-    ret.setType(AccountType.LIABILITY.name()); //TODO: ??
+    ret.setIdentifier(PRODUCT_LOSS_ALLOWANCE_ACCOUNT_IDENTIFIER);
+    ret.setType(AccountType.ASSET.name());
+    return ret;
+  }
+
+  private static Account generalLossAllowanceAccount() {
+    final Account ret = new Account();
+    ret.setIdentifier(GENERAL_LOSS_ALLOWANCE_ACCOUNT_IDENTIFIER);
+    ret.setType(AccountType.EXPENSE.name());
+    return ret;
+  }
+
+  private static Account generalExpenseAccount() {
+    final Account ret = new Account();
+    ret.setIdentifier(GENERAL_EXPENSE_ACCOUNT_IDENTIFIER);
+    ret.setType(AccountType.EXPENSE.name());
     return ret;
   }
 
@@ -531,7 +546,9 @@
     makeAccountResponsive(consumerLoanInterestAccount(), universalCreationDate, ledgerManagerMock);
     makeAccountResponsive(lateFeeIncomeAccount(), universalCreationDate, ledgerManagerMock);
     makeAccountResponsive(lateFeeAccrualAccount(), universalCreationDate, ledgerManagerMock);
-    makeAccountResponsive(arrearsAllowanceAccount(), universalCreationDate, ledgerManagerMock);
+    makeAccountResponsive(productLossAllowanceAccount(), universalCreationDate, ledgerManagerMock);
+    makeAccountResponsive(generalLossAllowanceAccount(), universalCreationDate, ledgerManagerMock);
+    makeAccountResponsive(generalExpenseAccount(), universalCreationDate, ledgerManagerMock);
 
     Mockito.doReturn(incomeLedger()).when(ledgerManagerMock).findLedger(INCOME_LEDGER_IDENTIFIER);
     Mockito.doReturn(feesAndChargesLedger()).when(ledgerManagerMock).findLedger(FEES_AND_CHARGES_LEDGER_IDENTIFIER);
diff --git a/component-test/src/main/java/io/mifos/portfolio/Fixture.java b/component-test/src/main/java/io/mifos/portfolio/Fixture.java
index 5054006..092052b 100644
--- a/component-test/src/main/java/io/mifos/portfolio/Fixture.java
+++ b/component-test/src/main/java/io/mifos/portfolio/Fixture.java
@@ -67,9 +67,9 @@
     accountAssignments.add(new AccountAssignment(INTEREST_ACCRUAL, LOAN_INTEREST_ACCRUAL_ACCOUNT_IDENTIFIER));
     accountAssignments.add(new AccountAssignment(LATE_FEE_INCOME, LATE_FEE_INCOME_ACCOUNT_IDENTIFIER));
     accountAssignments.add(new AccountAssignment(LATE_FEE_ACCRUAL, LATE_FEE_ACCRUAL_ACCOUNT_IDENTIFIER));
-    accountAssignments.add(new AccountAssignment(PRODUCT_LOSS_ALLOWANCE, ARREARS_ALLOWANCE_ACCOUNT_IDENTIFIER));
-    accountAssignments.add(new AccountAssignment(GENERAL_LOSS_ALLOWANCE, ARREARS_ALLOWANCE_ACCOUNT_IDENTIFIER));
-    accountAssignments.add(new AccountAssignment(GENERAL_EXPENSE, ARREARS_ALLOWANCE_ACCOUNT_IDENTIFIER));
+    accountAssignments.add(new AccountAssignment(PRODUCT_LOSS_ALLOWANCE, PRODUCT_LOSS_ALLOWANCE_ACCOUNT_IDENTIFIER));
+    accountAssignments.add(new AccountAssignment(GENERAL_LOSS_ALLOWANCE, GENERAL_LOSS_ALLOWANCE_ACCOUNT_IDENTIFIER));
+    accountAssignments.add(new AccountAssignment(GENERAL_EXPENSE, GENERAL_EXPENSE_ACCOUNT_IDENTIFIER));
     //accountAssignments.add(new AccountAssignment(ENTRY, ...));
     // Don't assign entry account in test since it usually will not be assigned IRL.
     accountAssignments.add(new AccountAssignment(LOAN_FUNDS_SOURCE, LOAN_FUNDS_SOURCE_ACCOUNT_IDENTIFIER));
diff --git a/component-test/src/main/java/io/mifos/portfolio/TestAccountingInteractionInLoanWorkflow.java b/component-test/src/main/java/io/mifos/portfolio/TestAccountingInteractionInLoanWorkflow.java
index cae6d77..63b306c 100644
--- a/component-test/src/main/java/io/mifos/portfolio/TestAccountingInteractionInLoanWorkflow.java
+++ b/component-test/src/main/java/io/mifos/portfolio/TestAccountingInteractionInLoanWorkflow.java
@@ -95,6 +95,43 @@
   }
 
   @Test
+  public void cantChangeDeniedCase() throws InterruptedException {
+    final LocalDateTime today = midnightToday();
+    step1CreateProduct();
+    step2CreateCase();
+    step3OpenCase(today);
+    step4DenyCase(today);
+
+    try {
+      customerCase.setInterest(BigDecimal.ONE);
+      portfolioManager.changeCase(product.getIdentifier(), customerCase.getIdentifier(), customerCase);
+      Assert.fail("Changing a denied case should fail.");
+    }
+    catch (IllegalArgumentException ignored) {
+
+    }
+  }
+
+  @Test
+  public void cantChangeApprovedCase() throws InterruptedException {
+    final LocalDateTime today = midnightToday();
+
+    step1CreateProduct();
+    step2CreateCase();
+    step3OpenCase(today);
+    step4ApproveCase(today);
+
+    try {
+      customerCase.setInterest(BigDecimal.ONE);
+      portfolioManager.changeCase(product.getIdentifier(), customerCase.getIdentifier(), customerCase);
+      Assert.fail("Changing a denied case should fail.");
+    }
+    catch (IllegalArgumentException ignored) {
+
+    }
+  }
+
+  @Test
   public void workflowTerminatingInEarlyLoanPayoff() throws InterruptedException {
     final LocalDateTime today = midnightToday();
 
diff --git a/service/src/main/java/io/mifos/individuallending/internal/service/costcomponent/CostComponentService.java b/service/src/main/java/io/mifos/individuallending/internal/service/costcomponent/CostComponentService.java
index 6bb7b51..6d7b0ca 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/service/costcomponent/CostComponentService.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/service/costcomponent/CostComponentService.java
@@ -152,7 +152,6 @@
       default:
         return BigDecimal.ZERO;
     }
-//TODO: correctly implement charges which are proportional to other charges.
   }
 
   private static Function<BigDecimal, BigDecimal> howToApplyScheduledChargeToAmount(
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/checker/CaseChecker.java b/service/src/main/java/io/mifos/portfolio/service/internal/checker/CaseChecker.java
index 11b422f..e7b5510 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/checker/CaseChecker.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/checker/CaseChecker.java
@@ -29,7 +29,6 @@
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
-import java.util.Optional;
 
 /**
  * @author Myrle Krantz
@@ -56,16 +55,30 @@
     caseService.findByIdentifier(productIdentifier, instance.getIdentifier())
         .ifPresent(x -> {throw ServiceException.conflict("Duplicate identifier: " + productIdentifier + "." + x.getIdentifier());});
 
-    final Optional<Boolean> productEnabled = productService.findEnabledByIdentifier(productIdentifier);
-    if (!productEnabled.orElseThrow(() -> ServiceException.internalError("Product should exist, but doesn't"))) {
+    final Product product = productService.findByIdentifier(productIdentifier)
+        .orElseThrow(() -> ServiceException.badRequest("Product must exist ''{0}''.", productIdentifier));
+    final Boolean productEnabled = product.isEnabled();
+    if (!productEnabled) {
       throw ServiceException.badRequest("Product must be enabled before cases for it can be created: " + productIdentifier);}
 
-    checkForChange(productIdentifier, instance);
+    validateParameters(productIdentifier, instance, product);
   }
 
   public void checkForChange(final String productIdentifier, final Case instance) {
     final Product product = productService.findByIdentifier(productIdentifier)
         .orElseThrow(() -> ServiceException.badRequest("Product must exist ''{0}''.", productIdentifier));
+
+    final Case.State currentState = Case.State.valueOf(instance.getCurrentState());
+    if (currentState.equals(Case.State.ACTIVE) || currentState.equals(Case.State.CLOSED) || currentState.equals(Case.State.APPROVED))
+      throw ServiceException.badRequest("You may not change a case after it has been approved or closed.");
+
+    validateParameters(productIdentifier, instance, product);
+  }
+
+  private void validateParameters(
+      final String productIdentifier,
+      final Case instance,
+      final Product product) {
     final InterestRange interestRange = product.getInterestRange();
 
     final BigDecimal interest = instance.getInterest();
diff --git a/service/src/main/java/io/mifos/portfolio/service/rest/CaseRestController.java b/service/src/main/java/io/mifos/portfolio/service/rest/CaseRestController.java
index c24e7de..086a9c8 100644
--- a/service/src/main/java/io/mifos/portfolio/service/rest/CaseRestController.java
+++ b/service/src/main/java/io/mifos/portfolio/service/rest/CaseRestController.java
@@ -166,7 +166,6 @@
 
     this.commandGateway.process(new ChangeCaseCommand(instance));
     return new ResponseEntity<>(HttpStatus.ACCEPTED);
-    //TODO: Make sure case can't be changed from certain states.
   }
 
   @Permittable(value = AcceptedTokenType.TENANT, groupId = PermittableGroupIds.CASE_MANAGEMENT)
