Persisting segment association for charge definitions.
diff --git a/api/src/main/java/io/mifos/portfolio/api/v1/domain/ChargeDefinition.java b/api/src/main/java/io/mifos/portfolio/api/v1/domain/ChargeDefinition.java
index efa69f8..3890867 100644
--- a/api/src/main/java/io/mifos/portfolio/api/v1/domain/ChargeDefinition.java
+++ b/api/src/main/java/io/mifos/portfolio/api/v1/domain/ChargeDefinition.java
@@ -16,7 +16,6 @@
 package io.mifos.portfolio.api.v1.domain;
 
 import io.mifos.core.lang.validation.constraints.ValidIdentifier;
-import io.mifos.core.lang.validation.constraints.ValidIdentifiers;
 import io.mifos.portfolio.api.v1.validation.ValidChargeDefinition;
 import io.mifos.portfolio.api.v1.validation.ValidChargeReference;
 import io.mifos.portfolio.api.v1.validation.ValidPaymentCycleUnit;
@@ -26,7 +25,6 @@
 import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
 import java.time.temporal.ChronoUnit;
-import java.util.List;
 import java.util.Objects;
 
 /**
@@ -84,8 +82,11 @@
   @ValidIdentifier(optional = true)
   private String forSegmentSet;
 
-  @ValidIdentifiers(optional = true)
-  private List<String> forSegments;
+  @ValidIdentifier(optional = true)
+  private String fromSegment;
+
+  @ValidIdentifier(optional = true)
+  private String toSegment;
 
   public ChargeDefinition() {
   }
@@ -203,12 +204,20 @@
     this.forSegmentSet = forSegmentSet;
   }
 
-  public List<String> getForSegments() {
-    return forSegments;
+  public String getFromSegment() {
+    return fromSegment;
   }
 
-  public void setForSegments(List<String> forSegments) {
-    this.forSegments = forSegments;
+  public void setFromSegment(String fromSegment) {
+    this.fromSegment = fromSegment;
+  }
+
+  public String getToSegment() {
+    return toSegment;
+  }
+
+  public void setToSegment(String toSegment) {
+    this.toSegment = toSegment;
   }
 
   @Override
@@ -230,12 +239,13 @@
         Objects.equals(toAccountDesignator, that.toAccountDesignator) &&
         forCycleSizeUnit == that.forCycleSizeUnit &&
         Objects.equals(forSegmentSet, that.forSegmentSet) &&
-        Objects.equals(forSegments, that.forSegments);
+        Objects.equals(fromSegment, that.fromSegment) &&
+        Objects.equals(toSegment, that.toSegment);
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(identifier, name, description, accrueAction, chargeAction, amount, chargeMethod, proportionalTo, fromAccountDesignator, accrualAccountDesignator, toAccountDesignator, forCycleSizeUnit, readOnly, forSegmentSet, forSegments);
+    return Objects.hash(identifier, name, description, accrueAction, chargeAction, amount, chargeMethod, proportionalTo, fromAccountDesignator, accrualAccountDesignator, toAccountDesignator, forCycleSizeUnit, readOnly, forSegmentSet, fromSegment, toSegment);
   }
 
   @Override
@@ -255,7 +265,8 @@
         ", forCycleSizeUnit=" + forCycleSizeUnit +
         ", readOnly=" + readOnly +
         ", forSegmentSet='" + forSegmentSet + '\'' +
-        ", forSegments=" + forSegments +
+        ", fromSegment='" + fromSegment + '\'' +
+        ", toSegment='" + toSegment + '\'' +
         '}';
   }
 }
diff --git a/api/src/main/java/io/mifos/portfolio/api/v1/validation/CheckValidChargeDefinition.java b/api/src/main/java/io/mifos/portfolio/api/v1/validation/CheckValidChargeDefinition.java
index 4735798..fcdf02a 100644
--- a/api/src/main/java/io/mifos/portfolio/api/v1/validation/CheckValidChargeDefinition.java
+++ b/api/src/main/java/io/mifos/portfolio/api/v1/validation/CheckValidChargeDefinition.java
@@ -43,17 +43,14 @@
         value.getProportionalTo() == null)
       return false;
     if (value.getChargeMethod() == ChargeDefinition.ChargeMethod.FIXED &&
-        value.getProportionalTo() != null)
-      return false;
+        value.getProportionalTo() != null &&
+        value.getForSegmentSet() == null) //Even if the charge is a fixed charge, we need a proportional to for segment sets.
+       return false;
     if (value.getForSegmentSet() == null &&
-        value.getForSegments() != null)
+        (value.getFromSegment() != null || value.getToSegment() != null))
       return false;
     if (value.getForSegmentSet() != null &&
-        value.getForSegments() == null)
-      return false;
-    if (value.getForSegmentSet() != null &&
-        value.getForSegments() != null &&
-        value.getForSegments().size() == 0)
+        (value.getFromSegment() == null || value.getToSegment() == null))
       return false;
 
     return true;
diff --git a/api/src/test/java/io/mifos/portfolio/api/v1/domain/ChargeDefinitionTest.java b/api/src/test/java/io/mifos/portfolio/api/v1/domain/ChargeDefinitionTest.java
index e8df923..8f9ad7e 100644
--- a/api/src/test/java/io/mifos/portfolio/api/v1/domain/ChargeDefinitionTest.java
+++ b/api/src/test/java/io/mifos/portfolio/api/v1/domain/ChargeDefinitionTest.java
@@ -24,9 +24,7 @@
 import java.math.BigDecimal;
 import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 
 /**
  * @author Myrle Krantz
@@ -100,11 +98,20 @@
             .adjustment(x -> x.setChargeMethod(ChargeDefinition.ChargeMethod.FIXED))
             .valid(false));
     ret.add(new ValidationTestCase<ChargeDefinition>("missingProportionalToIdentifierOnFixedCharge")
-            .adjustment(x -> {
-              x.setChargeMethod(ChargeDefinition.ChargeMethod.FIXED);
-              x.setProportionalTo(null);
-            })
-            .valid(true));
+        .adjustment(x -> {
+          x.setChargeMethod(ChargeDefinition.ChargeMethod.FIXED);
+          x.setProportionalTo(null);
+        })
+        .valid(true));
+    ret.add(new ValidationTestCase<ChargeDefinition>("fixed charge proportional so that segment set can be set.")
+        .adjustment(x -> {
+          x.setChargeMethod(ChargeDefinition.ChargeMethod.FIXED);
+          x.setProportionalTo("something");
+          x.setForSegmentSet("xyz");
+          x.setFromSegment("abc");
+          x.setToSegment("def");
+        })
+        .valid(true));
     ret.add(new ValidationTestCase<ChargeDefinition>("proportionalToRunningBalance")
         .adjustment(x -> x.setProportionalTo("{runningbalance}"))
         .valid(true));
@@ -114,20 +121,23 @@
     ret.add(new ValidationTestCase<ChargeDefinition>("segment set set but not list")
         .adjustment(x -> x.setForSegmentSet("xyz"))
         .valid(false));
-    ret.add(new ValidationTestCase<ChargeDefinition>("segment list set but not set")
-        .adjustment(x -> x.setForSegments(Arrays.asList("mno", "xyz")))
+    ret.add(new ValidationTestCase<ChargeDefinition>("from segment set but not set")
+        .adjustment(x -> x.setFromSegment("abc"))
         .valid(false));
-    ret.add(new ValidationTestCase<ChargeDefinition>("empty segment list")
-        .adjustment(x -> { x.setForSegmentSet("xyz"); x.setForSegments(Collections.emptyList());})
+    ret.add(new ValidationTestCase<ChargeDefinition>("to segment set but not set")
+        .adjustment(x -> x.setFromSegment("def"))
         .valid(false));
     ret.add(new ValidationTestCase<ChargeDefinition>("valid segment references")
-        .adjustment(x -> { x.setForSegmentSet("xyz"); x.setForSegments(Collections.singletonList("abc"));})
+        .adjustment(x -> { x.setForSegmentSet("xyz"); x.setFromSegment("abc"); x.setToSegment("def");})
         .valid(true));
     ret.add(new ValidationTestCase<ChargeDefinition>("invalid segment set identifier")
-        .adjustment(x -> { x.setForSegmentSet("//"); x.setForSegments(Collections.singletonList("abc"));})
+        .adjustment(x -> { x.setForSegmentSet("//"); x.setFromSegment("abc"); x.setToSegment("def");})
         .valid(false));
-    ret.add(new ValidationTestCase<ChargeDefinition>("invalid segment list set identifier")
-        .adjustment(x -> { x.setForSegmentSet("xyz"); x.setForSegments(Collections.singletonList("//"));})
+    ret.add(new ValidationTestCase<ChargeDefinition>("invalid from segment identifier")
+        .adjustment(x -> { x.setForSegmentSet("xyz"); x.setFromSegment("//"); x.setToSegment("def");})
+        .valid(false));
+    ret.add(new ValidationTestCase<ChargeDefinition>("invalid to segment identifier")
+        .adjustment(x -> { x.setForSegmentSet("xyz"); x.setFromSegment("abc"); x.setToSegment("//");})
         .valid(false));
     return ret;
   }
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 4ab454a..a49d578 100644
--- a/component-test/src/main/java/io/mifos/portfolio/TestAccountingInteractionInLoanWorkflow.java
+++ b/component-test/src/main/java/io/mifos/portfolio/TestAccountingInteractionInLoanWorkflow.java
@@ -24,13 +24,13 @@
 import io.mifos.individuallending.api.v1.domain.caseinstance.CaseParameters;
 import io.mifos.individuallending.api.v1.domain.product.AccountDesignators;
 import io.mifos.individuallending.api.v1.domain.product.ChargeIdentifiers;
+import io.mifos.individuallending.api.v1.domain.product.ChargeProportionalDesignator;
 import io.mifos.individuallending.api.v1.domain.workflow.Action;
 import io.mifos.individuallending.api.v1.events.IndividualLoanCommandEvent;
 import io.mifos.individuallending.api.v1.events.IndividualLoanEventConstants;
-import io.mifos.portfolio.api.v1.domain.Case;
-import io.mifos.portfolio.api.v1.domain.CostComponent;
-import io.mifos.portfolio.api.v1.domain.Product;
-import io.mifos.portfolio.api.v1.domain.TaskDefinition;
+import io.mifos.portfolio.api.v1.domain.*;
+import io.mifos.portfolio.api.v1.events.BalanceSegmentSetEvent;
+import io.mifos.portfolio.api.v1.events.ChargeDefinitionEvent;
 import io.mifos.portfolio.api.v1.events.EventConstants;
 import io.mifos.rhythm.spi.v1.client.BeatListener;
 import io.mifos.rhythm.spi.v1.domain.BeatPublish;
@@ -56,7 +56,12 @@
 public class TestAccountingInteractionInLoanWorkflow extends AbstractPortfolioTest {
   private static final BigDecimal PROCESSING_FEE_AMOUNT = BigDecimal.valueOf(10_0000, MINOR_CURRENCY_UNIT_DIGITS);
   private static final BigDecimal LOAN_ORIGINATION_FEE_AMOUNT = BigDecimal.valueOf(100_0000, MINOR_CURRENCY_UNIT_DIGITS);
-  private static final BigDecimal DISBURSEMENT_FEE_AMOUNT = BigDecimal.valueOf(1_0000, MINOR_CURRENCY_UNIT_DIGITS);
+  private static final BigDecimal DISBURSEMENT_FEE_LOWER_RANGE_AMOUNT = BigDecimal.valueOf(10_0000, MINOR_CURRENCY_UNIT_DIGITS);
+  private static final BigDecimal DISBURSEMENT_FEE_UPPER_RANGE_AMOUNT = BigDecimal.valueOf(1_0000, MINOR_CURRENCY_UNIT_DIGITS);
+  private static final String DISBURSEMENT_RANGES = "disbursement_ranges";
+  private static final String DISBURSEMENT_LOWER_RANGE = "smaller";
+  private static final String DISBURSEMENT_UPPER_RANGE = "larger";
+  private static final String UPPER_RANGE_DISBURSEMENT_FEE_ID = ChargeIdentifiers.DISBURSEMENT_FEE_ID + "2";
 
   private BeatListener portfolioBeatListener;
 
@@ -110,13 +115,17 @@
     step8Close();
   }
 
-  @Test(expected = IllegalArgumentException.class)
+  @Test
   public void workflowWithNegativePaymentSize() throws InterruptedException {
     step1CreateProduct();
     step2CreateCase();
     step3OpenCase();
     step4ApproveCase();
-    step5Disburse(BigDecimal.valueOf(-2).setScale(MINOR_CURRENCY_UNIT_DIGITS, BigDecimal.ROUND_HALF_EVEN));
+    try {
+      step5Disburse(BigDecimal.valueOf(-2).setScale(MINOR_CURRENCY_UNIT_DIGITS, BigDecimal.ROUND_HALF_EVEN));
+      Assert.fail("Expected an IllegalArgumentException.");
+    }
+    catch (IllegalArgumentException ignored) { }
   }
 
   //Create product and set charges to fixed fees.
@@ -124,9 +133,48 @@
     logger.info("step1CreateProduct");
     product = createProduct();
 
+    final BalanceSegmentSet balanceSegmentSet = new BalanceSegmentSet();
+    balanceSegmentSet.setIdentifier(DISBURSEMENT_RANGES);
+    balanceSegmentSet.setSegmentIdentifiers(Arrays.asList(DISBURSEMENT_LOWER_RANGE, DISBURSEMENT_UPPER_RANGE));
+    balanceSegmentSet.setSegments(Arrays.asList(BigDecimal.ZERO, BigDecimal.valueOf(1_000_0000, 4)));
+    portfolioManager.createBalanceSegmentSet(product.getIdentifier(), balanceSegmentSet);
+    Assert.assertTrue(this.eventRecorder.wait(EventConstants.POST_BALANCE_SEGMENT_SET, new BalanceSegmentSetEvent(product.getIdentifier(), balanceSegmentSet.getIdentifier())));
+
     setFeeToFixedValue(product.getIdentifier(), ChargeIdentifiers.PROCESSING_FEE_ID, PROCESSING_FEE_AMOUNT);
     setFeeToFixedValue(product.getIdentifier(), ChargeIdentifiers.LOAN_ORIGINATION_FEE_ID, LOAN_ORIGINATION_FEE_AMOUNT);
-    setFeeToFixedValue(product.getIdentifier(), ChargeIdentifiers.DISBURSEMENT_FEE_ID, DISBURSEMENT_FEE_AMOUNT);
+
+    final ChargeDefinition lowerRangeDisbursementFeeChargeDefinition
+        = portfolioManager.getChargeDefinition(product.getIdentifier(), ChargeIdentifiers.DISBURSEMENT_FEE_ID);
+    lowerRangeDisbursementFeeChargeDefinition.setChargeMethod(ChargeDefinition.ChargeMethod.FIXED);
+    lowerRangeDisbursementFeeChargeDefinition.setAmount(DISBURSEMENT_FEE_LOWER_RANGE_AMOUNT);
+    lowerRangeDisbursementFeeChargeDefinition.setProportionalTo(ChargeProportionalDesignator.PRINCIPAL_ADJUSTMENT_DESIGNATOR.name());
+    lowerRangeDisbursementFeeChargeDefinition.setForSegmentSet(DISBURSEMENT_RANGES);
+    lowerRangeDisbursementFeeChargeDefinition.setFromSegment(DISBURSEMENT_LOWER_RANGE);
+    lowerRangeDisbursementFeeChargeDefinition.setToSegment(DISBURSEMENT_LOWER_RANGE);
+
+    portfolioManager.changeChargeDefinition(product.getIdentifier(), ChargeIdentifiers.DISBURSEMENT_FEE_ID, lowerRangeDisbursementFeeChargeDefinition);
+    Assert.assertTrue(this.eventRecorder.wait(EventConstants.PUT_CHARGE_DEFINITION,
+        new ChargeDefinitionEvent(product.getIdentifier(), ChargeIdentifiers.DISBURSEMENT_FEE_ID)));
+
+    final ChargeDefinition upperRangeDisbursementFeeChargeDefinition = new ChargeDefinition();
+    upperRangeDisbursementFeeChargeDefinition.setIdentifier(UPPER_RANGE_DISBURSEMENT_FEE_ID);
+    upperRangeDisbursementFeeChargeDefinition.setName(UPPER_RANGE_DISBURSEMENT_FEE_ID);
+    upperRangeDisbursementFeeChargeDefinition.setDescription(lowerRangeDisbursementFeeChargeDefinition.getDescription());
+    upperRangeDisbursementFeeChargeDefinition.setFromAccountDesignator(lowerRangeDisbursementFeeChargeDefinition.getFromAccountDesignator());
+    upperRangeDisbursementFeeChargeDefinition.setToAccountDesignator(lowerRangeDisbursementFeeChargeDefinition.getToAccountDesignator());
+    upperRangeDisbursementFeeChargeDefinition.setAccrualAccountDesignator(lowerRangeDisbursementFeeChargeDefinition.getAccrualAccountDesignator());
+    upperRangeDisbursementFeeChargeDefinition.setAccrueAction(lowerRangeDisbursementFeeChargeDefinition.getAccrueAction());
+    upperRangeDisbursementFeeChargeDefinition.setChargeAction(lowerRangeDisbursementFeeChargeDefinition.getChargeAction());
+    upperRangeDisbursementFeeChargeDefinition.setChargeMethod(ChargeDefinition.ChargeMethod.PROPORTIONAL);
+    upperRangeDisbursementFeeChargeDefinition.setAmount(DISBURSEMENT_FEE_UPPER_RANGE_AMOUNT);
+    upperRangeDisbursementFeeChargeDefinition.setProportionalTo(ChargeProportionalDesignator.PRINCIPAL_ADJUSTMENT_DESIGNATOR.name());
+    upperRangeDisbursementFeeChargeDefinition.setForSegmentSet(DISBURSEMENT_RANGES);
+    upperRangeDisbursementFeeChargeDefinition.setFromSegment(DISBURSEMENT_UPPER_RANGE);
+    upperRangeDisbursementFeeChargeDefinition.setToSegment(DISBURSEMENT_UPPER_RANGE);
+
+    portfolioManager.createChargeDefinition(product.getIdentifier(), upperRangeDisbursementFeeChargeDefinition);
+    Assert.assertTrue(this.eventRecorder.wait(EventConstants.POST_CHARGE_DEFINITION,
+        new ChargeDefinitionEvent(product.getIdentifier(), UPPER_RANGE_DISBURSEMENT_FEE_ID)));
 
     taskDefinition = createTaskDefinition(product);
 
@@ -237,7 +285,8 @@
         customerCase.getIdentifier(),
         Action.DISBURSE,
         Collections.singleton(AccountDesignators.ENTRY),
-        amount, new CostComponent(ChargeIdentifiers.DISBURSEMENT_FEE_ID, DISBURSEMENT_FEE_AMOUNT),
+        amount, new CostComponent(ChargeIdentifiers.DISBURSEMENT_FEE_ID, DISBURSEMENT_FEE_LOWER_RANGE_AMOUNT),
+        new CostComponent(UPPER_RANGE_DISBURSEMENT_FEE_ID, BigDecimal.ZERO.setScale(MINOR_CURRENCY_UNIT_DIGITS, BigDecimal.ROUND_HALF_EVEN)),
         new CostComponent(ChargeIdentifiers.DISBURSE_PAYMENT_ID, amount));
     checkStateTransfer(
         product.getIdentifier(),
@@ -254,12 +303,12 @@
     final Set<Debtor> debtors = new HashSet<>();
     debtors.add(new Debtor(pendingDisbursalAccountIdentifier, amount.toPlainString()));
     debtors.add(new Debtor(AccountingFixture.LOANS_PAYABLE_ACCOUNT_IDENTIFIER, amount.toPlainString()));
-    debtors.add(new Debtor(AccountingFixture.TELLER_ONE_ACCOUNT_IDENTIFIER, DISBURSEMENT_FEE_AMOUNT.toPlainString()));
+    debtors.add(new Debtor(AccountingFixture.TELLER_ONE_ACCOUNT_IDENTIFIER, DISBURSEMENT_FEE_LOWER_RANGE_AMOUNT.toPlainString()));
 
     final Set<Creditor> creditors = new HashSet<>();
     creditors.add(new Creditor(customerLoanAccountIdentifier, amount.toPlainString()));
     creditors.add(new Creditor(AccountingFixture.TELLER_ONE_ACCOUNT_IDENTIFIER, amount.toPlainString()));
-    creditors.add(new Creditor(AccountingFixture.DISBURSEMENT_FEE_INCOME_ACCOUNT_IDENTIFIER, DISBURSEMENT_FEE_AMOUNT.toPlainString()));
+    creditors.add(new Creditor(AccountingFixture.DISBURSEMENT_FEE_INCOME_ACCOUNT_IDENTIFIER, DISBURSEMENT_FEE_LOWER_RANGE_AMOUNT.toPlainString()));
     AccountingFixture.verifyTransfer(ledgerManager, debtors, creditors, product.getIdentifier(), customerCase.getIdentifier(), Action.DISBURSE);
 
     expectedCurrentBalance = expectedCurrentBalance.add(amount);
diff --git a/component-test/src/main/java/io/mifos/portfolio/TestBalanceSegmentSets.java b/component-test/src/main/java/io/mifos/portfolio/TestBalanceSegmentSets.java
index e4852e6..197b3d5 100644
--- a/component-test/src/main/java/io/mifos/portfolio/TestBalanceSegmentSets.java
+++ b/component-test/src/main/java/io/mifos/portfolio/TestBalanceSegmentSets.java
@@ -31,7 +31,7 @@
  */
 public class TestBalanceSegmentSets extends AbstractPortfolioTest {
   @Test
-  public void test() throws InterruptedException {
+  public void testBalanceSegmentSetManagement() throws InterruptedException {
     final Product product = createProduct();
 
     final BalanceSegmentSet balanceSegmentSet = new BalanceSegmentSet();
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/BalanceSegmentSetCommandHandler.java b/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/BalanceSegmentSetCommandHandler.java
index dd8a7a3..ae83771 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/BalanceSegmentSetCommandHandler.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/BalanceSegmentSetCommandHandler.java
@@ -26,8 +26,8 @@
 import io.mifos.portfolio.service.internal.command.CreateBalanceSegmentSetCommand;
 import io.mifos.portfolio.service.internal.command.DeleteBalanceSegmentSetCommand;
 import io.mifos.portfolio.service.internal.mapper.BalanceSegmentSetMapper;
-import io.mifos.portfolio.service.internal.repository.BalanceSegmentSetEntity;
-import io.mifos.portfolio.service.internal.repository.BalanceSegmentSetRepository;
+import io.mifos.portfolio.service.internal.repository.BalanceSegmentEntity;
+import io.mifos.portfolio.service.internal.repository.BalanceSegmentRepository;
 import io.mifos.portfolio.service.internal.repository.ProductEntity;
 import io.mifos.portfolio.service.internal.repository.ProductRepository;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -41,14 +41,14 @@
  */
 @Aggregate
 public class BalanceSegmentSetCommandHandler {
-  private final BalanceSegmentSetRepository balanceSegmentSetRepository;
+  private final BalanceSegmentRepository balanceSegmentRepository;
   private final ProductRepository productRepository;
 
   @Autowired
   public BalanceSegmentSetCommandHandler(
-      final BalanceSegmentSetRepository balanceSegmentSetRepository,
+      final BalanceSegmentRepository balanceSegmentRepository,
       final ProductRepository productRepository) {
-    this.balanceSegmentSetRepository = balanceSegmentSetRepository;
+    this.balanceSegmentRepository = balanceSegmentRepository;
     this.productRepository = productRepository;
   }
 
@@ -59,10 +59,10 @@
     final ProductEntity product = productRepository.findByIdentifier(createBalanceSegmentSetCommand.getProductIdentifier())
         .orElseThrow(() -> ServiceException.notFound("Product with identifier ''{0}'' doesn''t exist.", createBalanceSegmentSetCommand.getProductIdentifier()));
 
-    final List<BalanceSegmentSetEntity> balanceSegmentSetEntities = BalanceSegmentSetMapper.map(
+    final List<BalanceSegmentEntity> balanceSegmentSetEntities = BalanceSegmentSetMapper.map(
         createBalanceSegmentSetCommand.getInstance(), product);
 
-    balanceSegmentSetRepository.save(balanceSegmentSetEntities);
+    balanceSegmentRepository.save(balanceSegmentSetEntities);
 
     return new BalanceSegmentSetEvent(
         createBalanceSegmentSetCommand.getProductIdentifier(),
@@ -76,7 +76,7 @@
     final ProductEntity product = productRepository.findByIdentifier(changeBalanceSegmentSetCommand.getProductIdentifier())
         .orElseThrow(() -> ServiceException.notFound("Product with identifier ''{0}'' doesn''t exist.", changeBalanceSegmentSetCommand.getProductIdentifier()));
 
-    final List<BalanceSegmentSetEntity> balanceSegmentSets = balanceSegmentSetRepository.findByProductIdentifierAndSegmentSetIdentifier(
+    final List<BalanceSegmentEntity> balanceSegmentSets = balanceSegmentRepository.findByProductIdentifierAndSegmentSetIdentifier(
         changeBalanceSegmentSetCommand.getProductIdentifier(),
         changeBalanceSegmentSetCommand.getInstance().getIdentifier())
         .collect(Collectors.toList());
@@ -85,12 +85,12 @@
           changeBalanceSegmentSetCommand.getProductIdentifier(),
           changeBalanceSegmentSetCommand.getInstance().getIdentifier());
 
-    balanceSegmentSetRepository.deleteInBatch(balanceSegmentSets);
+    balanceSegmentRepository.deleteInBatch(balanceSegmentSets);
 
-    final List<BalanceSegmentSetEntity> balanceSegmentSetEntities = BalanceSegmentSetMapper.map(
+    final List<BalanceSegmentEntity> balanceSegmentSetEntities = BalanceSegmentSetMapper.map(
         changeBalanceSegmentSetCommand.getInstance(), product);
 
-    balanceSegmentSetRepository.save(balanceSegmentSetEntities);
+    balanceSegmentRepository.save(balanceSegmentSetEntities);
 
     return new BalanceSegmentSetEvent(
         changeBalanceSegmentSetCommand.getProductIdentifier(),
@@ -101,7 +101,7 @@
   @CommandHandler(logStart = CommandLogLevel.INFO, logFinish = CommandLogLevel.INFO)
   @EventEmitter(selectorName = EventConstants.SELECTOR_NAME, selectorValue = EventConstants.DELETE_BALANCE_SEGMENT_SET)
   public BalanceSegmentSetEvent process(final DeleteBalanceSegmentSetCommand deleteBalanceSegmentSetCommand) {
-    final List<BalanceSegmentSetEntity> balanceSegmentSets = balanceSegmentSetRepository.findByProductIdentifierAndSegmentSetIdentifier(
+    final List<BalanceSegmentEntity> balanceSegmentSets = balanceSegmentRepository.findByProductIdentifierAndSegmentSetIdentifier(
         deleteBalanceSegmentSetCommand.getProductIdentifier(),
         deleteBalanceSegmentSetCommand.getBalanceSegmentSetIdentifier())
         .collect(Collectors.toList());
@@ -110,7 +110,7 @@
           deleteBalanceSegmentSetCommand.getProductIdentifier(),
           deleteBalanceSegmentSetCommand.getBalanceSegmentSetIdentifier());
 
-    balanceSegmentSetRepository.deleteInBatch(balanceSegmentSets);
+    balanceSegmentRepository.deleteInBatch(balanceSegmentSets);
 
     return new BalanceSegmentSetEvent(
         deleteBalanceSegmentSetCommand.getProductIdentifier(),
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/ChargeDefinitionCommandHandler.java b/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/ChargeDefinitionCommandHandler.java
index 61b7db9..6cfb5a1 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/ChargeDefinitionCommandHandler.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/ChargeDefinitionCommandHandler.java
@@ -15,7 +15,11 @@
  */
 package io.mifos.portfolio.service.internal.command.handler;
 
+import io.mifos.core.command.annotation.Aggregate;
+import io.mifos.core.command.annotation.CommandHandler;
 import io.mifos.core.command.annotation.CommandLogLevel;
+import io.mifos.core.command.annotation.EventEmitter;
+import io.mifos.core.lang.ServiceException;
 import io.mifos.portfolio.api.v1.domain.ChargeDefinition;
 import io.mifos.portfolio.api.v1.events.ChargeDefinitionEvent;
 import io.mifos.portfolio.api.v1.events.EventConstants;
@@ -23,17 +27,12 @@
 import io.mifos.portfolio.service.internal.command.CreateChargeDefinitionCommand;
 import io.mifos.portfolio.service.internal.command.DeleteProductChargeDefinitionCommand;
 import io.mifos.portfolio.service.internal.mapper.ChargeDefinitionMapper;
-import io.mifos.portfolio.service.internal.repository.ChargeDefinitionEntity;
-import io.mifos.portfolio.service.internal.repository.ChargeDefinitionRepository;
-import io.mifos.portfolio.service.internal.repository.ProductEntity;
-import io.mifos.portfolio.service.internal.repository.ProductRepository;
-import io.mifos.core.command.annotation.Aggregate;
-import io.mifos.core.command.annotation.CommandHandler;
-import io.mifos.core.command.annotation.EventEmitter;
-import io.mifos.core.lang.ServiceException;
+import io.mifos.portfolio.service.internal.repository.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Optional;
+
 /**
  * @author Myrle Krantz
  */
@@ -41,13 +40,16 @@
 public class ChargeDefinitionCommandHandler {
   private final ProductRepository productRepository;
   private final ChargeDefinitionRepository chargeDefinitionRepository;
+  private final BalanceSegmentRepository balanceSegmentRepository;
 
   @Autowired
   public ChargeDefinitionCommandHandler(
-          final ProductRepository productRepository,
-          final ChargeDefinitionRepository chargeDefinitionRepository) {
+      final ProductRepository productRepository,
+      final ChargeDefinitionRepository chargeDefinitionRepository,
+      final BalanceSegmentRepository balanceSegmentRepository) {
     this.productRepository = productRepository;
     this.chargeDefinitionRepository = chargeDefinitionRepository;
+    this.balanceSegmentRepository = balanceSegmentRepository;
   }
 
   @SuppressWarnings("unused")
@@ -62,8 +64,10 @@
             = productRepository.findByIdentifier(productIdentifier)
             .orElseThrow(() -> ServiceException.badRequest("The given product identifier does not refer to a product {0}", productIdentifier));
 
+    final SegmentRange segmentRange = getSegmentRange(chargeDefinition, productIdentifier);
+
     final ChargeDefinitionEntity chargeDefinitionEntity =
-            ChargeDefinitionMapper.map(productEntity, chargeDefinition);
+            ChargeDefinitionMapper.map(productEntity, chargeDefinition, segmentRange.fromSegment, segmentRange.toSegment);
     chargeDefinitionRepository.save(chargeDefinitionEntity);
 
     return new ChargeDefinitionEvent(
@@ -83,8 +87,10 @@
             = chargeDefinitionRepository.findByProductIdAndChargeDefinitionIdentifier(productIdentifier, chargeDefinition.getIdentifier())
             .orElseThrow(() -> ServiceException.internalError("task definition not found."));
 
+    final SegmentRange segmentRange = getSegmentRange(chargeDefinition, productIdentifier);
+
     final ChargeDefinitionEntity chargeDefinitionEntity =
-            ChargeDefinitionMapper.map(existingChargeDefinition.getProduct(), chargeDefinition);
+            ChargeDefinitionMapper.map(existingChargeDefinition.getProduct(), chargeDefinition, segmentRange.fromSegment, segmentRange.toSegment);
     chargeDefinitionEntity.setId(existingChargeDefinition.getId());
     chargeDefinitionEntity.setId(existingChargeDefinition.getId());
     chargeDefinitionRepository.save(chargeDefinitionEntity);
@@ -112,4 +118,34 @@
             command.getChargeDefinitionIdentifier());
   }
 
+  static class SegmentRange {
+    final BalanceSegmentEntity fromSegment;
+    final BalanceSegmentEntity toSegment;
+
+    SegmentRange(final BalanceSegmentEntity fromSegment, final BalanceSegmentEntity toSegment) {
+      this.fromSegment = fromSegment;
+      this.toSegment = toSegment;
+    }
+  }
+
+  private SegmentRange getSegmentRange(final ChargeDefinition chargeDefinition, final String productIdentifier) {
+    if (chargeDefinition.getForSegmentSet() != null) {
+      final Optional<BalanceSegmentEntity> fromSegmentOptional =
+          balanceSegmentRepository.findByProductIdentifierAndSegmentSetIdentifierAndSegmentIdentifier(
+              productIdentifier,
+              chargeDefinition.getForSegmentSet(),
+              chargeDefinition.getFromSegment());
+      final Optional<BalanceSegmentEntity> toSegmentOptional =
+          balanceSegmentRepository.findByProductIdentifierAndSegmentSetIdentifierAndSegmentIdentifier(
+              productIdentifier,
+              chargeDefinition.getForSegmentSet(),
+              chargeDefinition.getFromSegment());
+
+      if (fromSegmentOptional.isPresent() && toSegmentOptional.isPresent()) {
+        return new SegmentRange(fromSegmentOptional.get(), toSegmentOptional.get());
+      }
+    }
+
+    return new SegmentRange(null, null);
+  }
 }
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/ProductCommandHandler.java b/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/ProductCommandHandler.java
index 6693e03..c075416 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/ProductCommandHandler.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/command/handler/ProductCommandHandler.java
@@ -85,7 +85,7 @@
 
   private void createChargeDefinition(final ProductEntity productEntity, final ChargeDefinition chargeDefinition) {
     final ChargeDefinitionEntity chargeDefinitionEntity =
-            ChargeDefinitionMapper.map(productEntity, chargeDefinition);
+            ChargeDefinitionMapper.map(productEntity, chargeDefinition, null, null);
     chargeDefinitionRepository.save(chargeDefinitionEntity);
   }
 
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/mapper/BalanceSegmentSetMapper.java b/service/src/main/java/io/mifos/portfolio/service/internal/mapper/BalanceSegmentSetMapper.java
index c42dfd0..63ba34f 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/mapper/BalanceSegmentSetMapper.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/mapper/BalanceSegmentSetMapper.java
@@ -16,7 +16,7 @@
 package io.mifos.portfolio.service.internal.mapper;
 
 import io.mifos.portfolio.api.v1.domain.BalanceSegmentSet;
-import io.mifos.portfolio.service.internal.repository.BalanceSegmentSetEntity;
+import io.mifos.portfolio.service.internal.repository.BalanceSegmentEntity;
 import io.mifos.portfolio.service.internal.repository.ProductEntity;
 
 import java.util.ArrayList;
@@ -30,11 +30,11 @@
  * @author Myrle Krantz
  */
 public class BalanceSegmentSetMapper {
-  public static List<BalanceSegmentSetEntity> map(final BalanceSegmentSet instance, final ProductEntity product) {
+  public static List<BalanceSegmentEntity> map(final BalanceSegmentSet instance, final ProductEntity product) {
     return
         Stream.iterate(0, i -> i+1).limit(instance.getSegmentIdentifiers().size())
             .map(i -> {
-              final BalanceSegmentSetEntity ret = new BalanceSegmentSetEntity();
+              final BalanceSegmentEntity ret = new BalanceSegmentEntity();
               ret.setProduct(product);
               ret.setSegmentSetIdentifier(instance.getIdentifier());
               ret.setSegmentIdentifier(instance.getSegmentIdentifiers().get(i));
@@ -44,11 +44,11 @@
             .collect(Collectors.toList());
   }
 
-  public static Optional<BalanceSegmentSet> map(final Stream<BalanceSegmentSetEntity> instances) {
+  public static Optional<BalanceSegmentSet> map(final Stream<BalanceSegmentEntity> instances) {
     final BalanceSegmentSet ret = new BalanceSegmentSet();
     ret.setSegments(new ArrayList<>());
     ret.setSegmentIdentifiers(new ArrayList<>());
-    instances.sorted(Comparator.comparing(BalanceSegmentSetEntity::getLowerBound))
+    instances.sorted(Comparator.comparing(BalanceSegmentEntity::getLowerBound))
         .forEach(seg -> {
           ret.setIdentifier(seg.getSegmentSetIdentifier());
           ret.getSegments().add(seg.getLowerBound());
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/mapper/ChargeDefinitionMapper.java b/service/src/main/java/io/mifos/portfolio/service/internal/mapper/ChargeDefinitionMapper.java
index 91958f5..f99d272 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/mapper/ChargeDefinitionMapper.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/mapper/ChargeDefinitionMapper.java
@@ -17,9 +17,11 @@
 
 import io.mifos.individuallending.api.v1.domain.product.ChargeProportionalDesignator;
 import io.mifos.portfolio.api.v1.domain.ChargeDefinition;
+import io.mifos.portfolio.service.internal.repository.BalanceSegmentEntity;
 import io.mifos.portfolio.service.internal.repository.ChargeDefinitionEntity;
 import io.mifos.portfolio.service.internal.repository.ProductEntity;
 
+import javax.annotation.Nullable;
 import java.util.Optional;
 
 import static io.mifos.individuallending.api.v1.domain.product.ChargeIdentifiers.*;
@@ -28,7 +30,11 @@
  * @author Myrle Krantz
  */
 public class ChargeDefinitionMapper {
-  public static ChargeDefinitionEntity map(final ProductEntity productEntity, final ChargeDefinition chargeDefinition) {
+  public static ChargeDefinitionEntity map(
+      final ProductEntity productEntity,
+      final ChargeDefinition chargeDefinition,
+      @Nullable final BalanceSegmentEntity fromSegment,
+      @Nullable final BalanceSegmentEntity toSegment) {
 
     final ChargeDefinitionEntity ret = new ChargeDefinitionEntity();
 
@@ -46,6 +52,11 @@
     ret.setAccrualAccountDesignator(chargeDefinition.getAccrualAccountDesignator());
     ret.setToAccountDesignator(chargeDefinition.getToAccountDesignator());
     ret.setReadOnly(chargeDefinition.isReadOnly());
+    if (fromSegment != null && toSegment != null) {
+      ret.setSegmentSet(fromSegment.getSegmentSetIdentifier());
+      ret.setFromSegment(fromSegment.getSegmentIdentifier());
+      ret.setToSegment(toSegment.getSegmentIdentifier());
+    }
 
     return ret;
   }
@@ -66,6 +77,11 @@
     ret.setAccrualAccountDesignator(from.getAccrualAccountDesignator());
     ret.setToAccountDesignator(from.getToAccountDesignator());
     ret.setReadOnly(Optional.ofNullable(from.getReadOnly()).orElseGet(() -> readOnlyLegacyMapper(from.getIdentifier())));
+    if (from.getSegmentSet() != null && from.getFromSegment() != null && from.getToSegment() != null) {
+      ret.setForSegmentSet(from.getSegmentSet());
+      ret.setFromSegment(from.getFromSegment());
+      ret.setToSegment(from.getToSegment());
+    }
 
     return ret;
   }
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentSetEntity.java b/service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentEntity.java
similarity index 94%
rename from service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentSetEntity.java
rename to service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentEntity.java
index ee8c5c2..b2d7e8b 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentSetEntity.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentEntity.java
@@ -24,7 +24,7 @@
  */
 @Entity
 @Table(name = "bastet_p_balance_segs")
-public class BalanceSegmentSetEntity {
+public class BalanceSegmentEntity {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "id")
@@ -43,7 +43,7 @@
   @Column(name = "lower_bound")
   private BigDecimal lowerBound;
 
-  public BalanceSegmentSetEntity() {
+  public BalanceSegmentEntity() {
   }
 
   public Long getId() {
@@ -90,7 +90,7 @@
   public boolean equals(Object o) {
     if (this == o) return true;
     if (o == null || getClass() != o.getClass()) return false;
-    BalanceSegmentSetEntity that = (BalanceSegmentSetEntity) o;
+    BalanceSegmentEntity that = (BalanceSegmentEntity) o;
     return Objects.equals(product, that.product) &&
         Objects.equals(segmentSetIdentifier, that.segmentSetIdentifier) &&
         Objects.equals(segmentIdentifier, that.segmentIdentifier);
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentSetRepository.java b/service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentRepository.java
similarity index 65%
rename from service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentSetRepository.java
rename to service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentRepository.java
index 9aac27d..0a4f903 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentSetRepository.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/repository/BalanceSegmentRepository.java
@@ -18,12 +18,15 @@
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
+import java.util.Optional;
 import java.util.stream.Stream;
 
 /**
  * @author Myrle Krantz
  */
 @Repository
-public interface BalanceSegmentSetRepository extends JpaRepository<BalanceSegmentSetEntity, Long> {
-  Stream<BalanceSegmentSetEntity> findByProductIdentifierAndSegmentSetIdentifier(String productIdentifier, String segmentSetIdentifier);
+public interface BalanceSegmentRepository extends JpaRepository<BalanceSegmentEntity, Long> {
+  Stream<BalanceSegmentEntity> findByProductIdentifierAndSegmentSetIdentifier(String productIdentifier, String segmentSetIdentifier);
+
+  Optional<BalanceSegmentEntity> findByProductIdentifierAndSegmentSetIdentifierAndSegmentIdentifier(String productIdentifier, String segmentSetIdentifier, String segmentIdentifier);
 }
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/repository/ChargeDefinitionEntity.java b/service/src/main/java/io/mifos/portfolio/service/internal/repository/ChargeDefinitionEntity.java
index 423c871..11e154e 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/repository/ChargeDefinitionEntity.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/repository/ChargeDefinitionEntity.java
@@ -79,6 +79,15 @@
   @Column(name = "read_only")
   private Boolean readOnly;
 
+  @Column(name = "segment_set")
+  private String segmentSet;
+
+  @Column(name = "from_segment")
+  private String fromSegment;
+
+  @Column(name = "to_segment")
+  private String toSegment;
+
   public ChargeDefinitionEntity() {
   }
 
@@ -202,6 +211,30 @@
     this.readOnly = readOnly;
   }
 
+  public String getSegmentSet() {
+    return segmentSet;
+  }
+
+  public void setSegmentSet(String segmentSet) {
+    this.segmentSet = segmentSet;
+  }
+
+  public String getFromSegment() {
+    return fromSegment;
+  }
+
+  public void setFromSegment(String fromSegment) {
+    this.fromSegment = fromSegment;
+  }
+
+  public String getToSegment() {
+    return toSegment;
+  }
+
+  public void setToSegment(String toSegment) {
+    this.toSegment = toSegment;
+  }
+
   @Override
   public boolean equals(Object o) {
     if (this == o) return true;
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/service/BalanceSegmentSetService.java b/service/src/main/java/io/mifos/portfolio/service/internal/service/BalanceSegmentSetService.java
index 451a57e..ee558a6 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/service/BalanceSegmentSetService.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/service/BalanceSegmentSetService.java
@@ -17,7 +17,7 @@
 
 import io.mifos.portfolio.api.v1.domain.BalanceSegmentSet;
 import io.mifos.portfolio.service.internal.mapper.BalanceSegmentSetMapper;
-import io.mifos.portfolio.service.internal.repository.BalanceSegmentSetRepository;
+import io.mifos.portfolio.service.internal.repository.BalanceSegmentRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -28,18 +28,18 @@
  */
 @Service
 public class BalanceSegmentSetService {
-  private final BalanceSegmentSetRepository balanceSegmentSetRepository;
+  private final BalanceSegmentRepository balanceSegmentRepository;
 
   @Autowired
   public BalanceSegmentSetService(
-      final BalanceSegmentSetRepository balanceSegmentSetRepository) {
-    this.balanceSegmentSetRepository = balanceSegmentSetRepository;
+      final BalanceSegmentRepository balanceSegmentRepository) {
+    this.balanceSegmentRepository = balanceSegmentRepository;
   }
 
   public boolean existsByIdentifier(final String productIdentifier, final String balanceSegmentSetIdentifier)
   {
     //TODO: replace with existsBy once we've upgraded to spring data 1.11 or later.
-    return balanceSegmentSetRepository
+    return balanceSegmentRepository
         .findByProductIdentifierAndSegmentSetIdentifier(productIdentifier, balanceSegmentSetIdentifier)
         .findAny().isPresent();
   }
@@ -47,7 +47,7 @@
   public Optional<BalanceSegmentSet> findByIdentifier(
       final String productIdentifier,
       final String balanceSegmentSetIdentifier) {
-    return BalanceSegmentSetMapper.map(balanceSegmentSetRepository
+    return BalanceSegmentSetMapper.map(balanceSegmentRepository
         .findByProductIdentifierAndSegmentSetIdentifier(productIdentifier, balanceSegmentSetIdentifier));
   }
 }
diff --git a/service/src/main/resources/db/migrations/mariadb/V7__balance_segment_sets.sql b/service/src/main/resources/db/migrations/mariadb/V7__balance_segment_sets.sql
index 2cd41a5..a9a9399 100644
--- a/service/src/main/resources/db/migrations/mariadb/V7__balance_segment_sets.sql
+++ b/service/src/main/resources/db/migrations/mariadb/V7__balance_segment_sets.sql
@@ -23,4 +23,8 @@
   CONSTRAINT bastet_p_balance_segs_pk PRIMARY KEY (id),
   CONSTRAINT bastet_p_balance_segs_uq UNIQUE (product_id, seg_set_identifier, segment_identifier),
   CONSTRAINT bastet_p_balance_segs_fk FOREIGN KEY (product_id) REFERENCES bastet_products (id)
-);
\ No newline at end of file
+);
+
+ALTER TABLE bastet_p_chrg_defs ADD COLUMN segment_set VARCHAR(32) NULL DEFAULT NULL;
+ALTER TABLE bastet_p_chrg_defs ADD COLUMN from_segment VARCHAR(32) NULL DEFAULT NULL;
+ALTER TABLE bastet_p_chrg_defs ADD COLUMN to_segment VARCHAR(32) NULL DEFAULT NULL;
\ No newline at end of file
diff --git a/service/src/test/java/io/mifos/portfolio/service/internal/command/handler/ChargeDefinitionCommandHandlerTest.java b/service/src/test/java/io/mifos/portfolio/service/internal/command/handler/ChargeDefinitionCommandHandlerTest.java
index 7b419c0..ecd74d2 100644
--- a/service/src/test/java/io/mifos/portfolio/service/internal/command/handler/ChargeDefinitionCommandHandlerTest.java
+++ b/service/src/test/java/io/mifos/portfolio/service/internal/command/handler/ChargeDefinitionCommandHandlerTest.java
@@ -16,6 +16,7 @@
 package io.mifos.portfolio.service.internal.command.handler;
 
 import io.mifos.portfolio.service.internal.command.DeleteProductChargeDefinitionCommand;
+import io.mifos.portfolio.service.internal.repository.BalanceSegmentRepository;
 import io.mifos.portfolio.service.internal.repository.ChargeDefinitionRepository;
 import io.mifos.core.lang.ServiceException;
 import org.junit.Assert;
@@ -37,7 +38,9 @@
             .when(chargeDefinitionRepositoryMock)
             .findByProductIdAndChargeDefinitionIdentifier(productIdentifier, chargeDefinitionIdentifier);
 
-    final ChargeDefinitionCommandHandler testSubject = new ChargeDefinitionCommandHandler(null, chargeDefinitionRepositoryMock);
+    final BalanceSegmentRepository balanceSegmentRepository = Mockito.mock(BalanceSegmentRepository.class);
+
+    final ChargeDefinitionCommandHandler testSubject = new ChargeDefinitionCommandHandler(null, chargeDefinitionRepositoryMock, balanceSegmentRepository);
 
     try {
       testSubject.process(new DeleteProductChargeDefinitionCommand(productIdentifier, chargeDefinitionIdentifier));