Architecture improvement.  Only individual loan code should be dependent on individual loan actions.
diff --git a/service/src/main/java/io/mifos/individuallending/internal/service/IndividualLoanService.java b/service/src/main/java/io/mifos/individuallending/internal/service/IndividualLoanService.java
index 6a253be..a10a100 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/service/IndividualLoanService.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/service/IndividualLoanService.java
@@ -113,10 +113,10 @@
           final int minorCurrencyUnitDigits,
           final BigDecimal initialBalance,
           final @Nonnull List<ScheduledAction> scheduledActions) {
-    final Map<Action, List<ChargeDefinition>> chargeDefinitionsMappedByChargeAction
+    final Map<String, List<ChargeDefinition>> chargeDefinitionsMappedByChargeAction
             = chargeDefinitionService.getChargeDefinitionsMappedByChargeAction(productIdentifier);
 
-    final Map<Action, List<ChargeDefinition>> chargeDefinitionsMappedByAccrueAction
+    final Map<String, List<ChargeDefinition>> chargeDefinitionsMappedByAccrueAction
             = chargeDefinitionService.getChargeDefinitionsMappedByAccrueAction(productIdentifier);
 
     final ChargeDefinition acceptPaymentDefinition = getPaymentChargeDefinition();
@@ -255,8 +255,8 @@
   }
 
   private List<ScheduledCharge> getScheduledCharges(final List<ScheduledAction> scheduledActions,
-                                                    final Map<Action, List<ChargeDefinition>> chargeDefinitionsMappedByChargeAction,
-                                                    final Map<Action, List<ChargeDefinition>> chargeDefinitionsMappedByAccrueAction,
+                                                    final Map<String, List<ChargeDefinition>> chargeDefinitionsMappedByChargeAction,
+                                                    final Map<String, List<ChargeDefinition>> chargeDefinitionsMappedByAccrueAction,
                                                     final ChargeDefinition acceptPaymentDefinition) {
     return scheduledActions.stream()
             .flatMap(scheduledAction -> getChargeDefinitionStream(chargeDefinitionsMappedByChargeAction, chargeDefinitionsMappedByAccrueAction, acceptPaymentDefinition, scheduledAction)
@@ -265,18 +265,18 @@
   }
 
   private Stream<ChargeDefinition> getChargeDefinitionStream(
-          final Map<Action, List<ChargeDefinition>> chargeDefinitionsMappedByChargeAction,
-          final Map<Action, List<ChargeDefinition>> chargeDefinitionsMappedByAccrueAction,
+          final Map<String, List<ChargeDefinition>> chargeDefinitionsMappedByChargeAction,
+          final Map<String, List<ChargeDefinition>> chargeDefinitionsMappedByAccrueAction,
           final ChargeDefinition acceptPaymentDefinition,
           final ScheduledAction scheduledAction) {
-    List<ChargeDefinition> chargeMapping = chargeDefinitionsMappedByChargeAction.get(scheduledAction.action);
+    List<ChargeDefinition> chargeMapping = chargeDefinitionsMappedByChargeAction.get(scheduledAction.action.name());
     if ((chargeMapping == null) && (scheduledAction.action == Action.valueOf(acceptPaymentDefinition.getChargeAction())))
       chargeMapping = Collections.singletonList(acceptPaymentDefinition);
 
     if (chargeMapping == null)
       chargeMapping = Collections.emptyList();
 
-    List<ChargeDefinition> accrueMapping = chargeDefinitionsMappedByAccrueAction.get(scheduledAction.action);
+    List<ChargeDefinition> accrueMapping = chargeDefinitionsMappedByAccrueAction.get(scheduledAction.action.name());
     if ((accrueMapping == null) && (scheduledAction.action == Action.valueOf(acceptPaymentDefinition.getChargeAction())))
       accrueMapping = Collections.singletonList(acceptPaymentDefinition);
 
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/service/ChargeDefinitionService.java b/service/src/main/java/io/mifos/portfolio/service/internal/service/ChargeDefinitionService.java
index 6ba6642..0230368 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/service/ChargeDefinitionService.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/service/ChargeDefinitionService.java
@@ -16,7 +16,6 @@
 package io.mifos.portfolio.service.internal.service;
 
 import io.mifos.portfolio.api.v1.domain.ChargeDefinition;
-import io.mifos.individuallending.api.v1.domain.workflow.Action;
 import io.mifos.portfolio.service.internal.mapper.ChargeDefinitionMapper;
 import io.mifos.portfolio.service.internal.repository.ChargeDefinitionRepository;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -46,25 +45,26 @@
             .collect(Collectors.toList());
   }
 
-  @Nonnull public Map<Action, List<ChargeDefinition>> getChargeDefinitionsMappedByChargeAction(
+  @Nonnull
+  public Map<String, List<ChargeDefinition>> getChargeDefinitionsMappedByChargeAction(
           final String productIdentifier)
   {
     final List<ChargeDefinition> chargeDefinitions = findAllEntities(productIdentifier);
 
     return chargeDefinitions.stream()
-            .collect(Collectors.groupingBy(x -> Action.valueOf(x.getChargeAction()),
+            .collect(Collectors.groupingBy(ChargeDefinition::getChargeAction,
                     Collectors.mapping(x -> x, Collectors.toList())));
   }
 
   @Nonnull
-  public Map<Action, List<ChargeDefinition>> getChargeDefinitionsMappedByAccrueAction(
+  public Map<String, List<ChargeDefinition>> getChargeDefinitionsMappedByAccrueAction(
           final String productIdentifier)
   {
     final List<ChargeDefinition> chargeDefinitions = findAllEntities(productIdentifier);
 
     return chargeDefinitions.stream()
             .filter(x -> x.getAccrueAction() != null)
-            .collect(Collectors.groupingBy(x -> Action.valueOf(x.getAccrueAction()),
+            .collect(Collectors.groupingBy(ChargeDefinition::getAccrueAction,
                     Collectors.mapping(x -> x, Collectors.toList())));
   }
 
diff --git a/service/src/test/java/io/mifos/individuallending/internal/service/IndividualLoanServiceTest.java b/service/src/test/java/io/mifos/individuallending/internal/service/IndividualLoanServiceTest.java
index 500e594..59032e6 100644
--- a/service/src/test/java/io/mifos/individuallending/internal/service/IndividualLoanServiceTest.java
+++ b/service/src/test/java/io/mifos/individuallending/internal/service/IndividualLoanServiceTest.java
@@ -50,7 +50,7 @@
     private int minorCurrencyUnitDigits = 2;
     private CaseParameters caseParameters;
     private LocalDate initialDisbursementDate;
-    private Map<Action, List<ChargeDefinition>> chargeDefinitionsMappedByAction;
+    private Map<String, List<ChargeDefinition>> chargeDefinitionsMappedByAction;
     private Set<String> expectedChargeIdentifiers = new HashSet<>(Arrays.asList(ChargeIdentifiers.INTEREST_ID, ChargeIdentifiers.PAYMENT_ID));
 
     TestCase(final String description) {
@@ -72,7 +72,7 @@
       return this;
     }
 
-    TestCase chargeDefinitionsMappedByAction(final Map<Action, List<ChargeDefinition>> newVal) {
+    TestCase chargeDefinitionsMappedByAction(final Map<String, List<ChargeDefinition>> newVal) {
       this.chargeDefinitionsMappedByAction = newVal;
       return this;
     }
@@ -111,8 +111,8 @@
 
     //I know: this is cheating in a unit test.  But I really didn't want to put this data together by hand.
 
-    final Map<Action, List<ChargeDefinition>> chargeDefinitionsMappedByAction = new HashMap<>();
-    chargeDefinitionsMappedByAction.put(Action.APPLY_INTEREST, getInterestChargeDefinition(0.01, ChronoUnit.YEARS));
+    final Map<String, List<ChargeDefinition>> chargeDefinitionsMappedByAction = new HashMap<>();
+    chargeDefinitionsMappedByAction.put(Action.APPLY_INTEREST.name(), getInterestChargeDefinition(0.01, ChronoUnit.YEARS));
 
     return new TestCase("simpleCase")
             .minorCurrencyUnitDigits(2)
@@ -130,8 +130,8 @@
     caseParameters.setPaymentCycle(new PaymentCycle(ChronoUnit.MONTHS, 1, 0, null, null));
     caseParameters.setMaximumBalance(BigDecimal.valueOf(200000));
 
-    final Map<Action, List<ChargeDefinition>> chargeDefinitionsMappedByAction = new HashMap<>();
-    chargeDefinitionsMappedByAction.put(Action.APPLY_INTEREST, getInterestChargeDefinition(0.10, ChronoUnit.YEARS));
+    final Map<String, List<ChargeDefinition>> chargeDefinitionsMappedByAction = new HashMap<>();
+    chargeDefinitionsMappedByAction.put(Action.APPLY_INTEREST.name(), getInterestChargeDefinition(0.10, ChronoUnit.YEARS));
 
     return new TestCase("yearLoanTestCase")
             .minorCurrencyUnitDigits(2)
@@ -148,11 +148,11 @@
     caseParameters.setPaymentCycle(new PaymentCycle(ChronoUnit.WEEKS, 1, 1, 0, 0));
     caseParameters.setMaximumBalance(BigDecimal.valueOf(2000));
 
-    final Map<Action, List<ChargeDefinition>> chargeDefinitionsMappedByAction = new HashMap<>();
-    chargeDefinitionsMappedByAction.put(Action.APPLY_INTEREST, getInterestChargeDefinition(0.05, ChronoUnit.YEARS));
+    final Map<String, List<ChargeDefinition>> chargeDefinitionsMappedByAction = new HashMap<>();
+    chargeDefinitionsMappedByAction.put(Action.APPLY_INTEREST.name(), getInterestChargeDefinition(0.05, ChronoUnit.YEARS));
 
     final List<ChargeDefinition> defaultLoanCharges = IndividualLendingPatternFactory.defaultIndividualLoanCharges();
-    defaultLoanCharges.forEach(x -> chargeDefinitionsMappedByAction.put(Action.valueOf(x.getChargeAction()), Collections.singletonList(x)));
+    defaultLoanCharges.forEach(x -> chargeDefinitionsMappedByAction.put(x.getChargeAction(), Collections.singletonList(x)));
 
     return new TestCase("chargeDefaultsCase")
             .minorCurrencyUnitDigits(2)