diff --git a/api/src/main/java/io/mifos/individuallending/api/v1/client/IndividualLending.java b/api/src/main/java/io/mifos/individuallending/api/v1/client/IndividualLending.java
index b483ec3..7f378d5 100644
--- a/api/src/main/java/io/mifos/individuallending/api/v1/client/IndividualLending.java
+++ b/api/src/main/java/io/mifos/individuallending/api/v1/client/IndividualLending.java
@@ -33,18 +33,9 @@
 @SuppressWarnings("unused")
 @FeignClient (value = "portfolio-v1", path = "/portfolio/v1", configuration = CustomFeignClientsConfiguration.class)
 public interface IndividualLending {
-  @RequestMapping(
-      value = "/individuallending/products/{productidentifier}/lossprovisionsteps/{dayslate}",
-      method = RequestMethod.DELETE,
-      produces = MediaType.ALL_VALUE,
-      consumes = MediaType.APPLICATION_JSON_VALUE
-  )
-  void deleteLossProvisionStep(
-      @PathVariable("productidentifier") final String productIdentifier,
-      @PathVariable("dayslate") final String daysLate);
 
   @RequestMapping(
-      value = "/individuallending/products/{productidentifier}/lossprovisionsteps/",
+      value = "/individuallending/products/{productidentifier}/lossprovisionsteps",
       method = RequestMethod.PUT,
       produces = MediaType.ALL_VALUE,
       consumes = MediaType.APPLICATION_JSON_VALUE
diff --git a/api/src/test/java/io/mifos/individuallending/api/v1/domain/product/LossProvisionStepTest.java b/api/src/test/java/io/mifos/individuallending/api/v1/domain/product/LossProvisionStepTest.java
index e7947b6..e401491 100644
--- a/api/src/test/java/io/mifos/individuallending/api/v1/domain/product/LossProvisionStepTest.java
+++ b/api/src/test/java/io/mifos/individuallending/api/v1/domain/product/LossProvisionStepTest.java
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2017 Kuelap, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package io.mifos.individuallending.api.v1.domain.product;
 
 import io.mifos.core.test.domain.ValidationTest;
diff --git a/service/src/main/java/io/mifos/individuallending/internal/command/ChangeLossProvisionSteps.java b/service/src/main/java/io/mifos/individuallending/internal/command/ChangeLossProvisionSteps.java
new file mode 100644
index 0000000..cc47711
--- /dev/null
+++ b/service/src/main/java/io/mifos/individuallending/internal/command/ChangeLossProvisionSteps.java
@@ -0,0 +1,18 @@
+package io.mifos.individuallending.internal.command;
+
+import io.mifos.individuallending.api.v1.domain.product.LossProvisionStep;
+
+import java.util.List;
+
+/**
+ * @author Myrle Krantz
+ */
+public class ChangeLossProvisionSteps {
+  private final String productIdentifier;
+  private final List<LossProvisionStep> lossProvisionSteps;
+
+  public ChangeLossProvisionSteps(String productIdentifier, List<LossProvisionStep> lossProvisionSteps) {
+    this.productIdentifier = productIdentifier;
+    this.lossProvisionSteps = lossProvisionSteps;
+  }
+}
diff --git a/service/src/main/java/io/mifos/individuallending/internal/mapper/LossProvisionStepMapper.java b/service/src/main/java/io/mifos/individuallending/internal/mapper/LossProvisionStepMapper.java
new file mode 100644
index 0000000..1b4bbbe
--- /dev/null
+++ b/service/src/main/java/io/mifos/individuallending/internal/mapper/LossProvisionStepMapper.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2017 Kuelap, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.mifos.individuallending.internal.mapper;
+
+import io.mifos.individuallending.api.v1.domain.product.LossProvisionStep;
+import io.mifos.individuallending.internal.repository.LossProvisionStepEntity;
+
+import java.math.BigDecimal;
+
+public interface LossProvisionStepMapper {
+  static LossProvisionStepEntity map(
+      final Long productId,
+      final LossProvisionStep instance) {
+    final LossProvisionStepEntity ret = new LossProvisionStepEntity();
+    ret.setProductId(productId);
+    ret.setDaysLate(instance.getDaysLate());
+    ret.setPercentProvision(instance.getPercentProvision().setScale(2, BigDecimal.ROUND_HALF_EVEN));
+    return ret;
+  }
+
+  static LossProvisionStep map(
+      final LossProvisionStepEntity entity) {
+    final LossProvisionStep ret = new LossProvisionStep();
+    ret.setDaysLate(entity.getDaysLate());
+    ret.setPercentProvision(entity.getPercentProvision());
+    return ret;
+  }
+}
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/repository/ProductArrearsConfigurationEntity.java b/service/src/main/java/io/mifos/individuallending/internal/repository/LossProvisionStepEntity.java
similarity index 90%
rename from service/src/main/java/io/mifos/portfolio/service/internal/repository/ProductArrearsConfigurationEntity.java
rename to service/src/main/java/io/mifos/individuallending/internal/repository/LossProvisionStepEntity.java
index f2ff9b9..a74a8ea 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/repository/ProductArrearsConfigurationEntity.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/repository/LossProvisionStepEntity.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package io.mifos.portfolio.service.internal.repository;
+package io.mifos.individuallending.internal.repository;
 
 import javax.persistence.*;
 import java.math.BigDecimal;
@@ -25,7 +25,7 @@
 @SuppressWarnings("unused")
 @Entity
 @Table(name = "bastet_p_arrears_config")
-public class ProductArrearsConfigurationEntity {
+public class LossProvisionStepEntity {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "id")
@@ -76,7 +76,7 @@
   public boolean equals(Object o) {
     if (this == o) return true;
     if (o == null || getClass() != o.getClass()) return false;
-    ProductArrearsConfigurationEntity that = (ProductArrearsConfigurationEntity) o;
+    LossProvisionStepEntity that = (LossProvisionStepEntity) o;
     return Objects.equals(productId, that.productId) &&
         Objects.equals(daysLate, that.daysLate);
   }
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/repository/ProductArrearsConfigurationRepository.java b/service/src/main/java/io/mifos/individuallending/internal/repository/LossProvisionStepRepository.java
similarity index 67%
rename from service/src/main/java/io/mifos/portfolio/service/internal/repository/ProductArrearsConfigurationRepository.java
rename to service/src/main/java/io/mifos/individuallending/internal/repository/LossProvisionStepRepository.java
index 01bdfb4..810412e 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/repository/ProductArrearsConfigurationRepository.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/repository/LossProvisionStepRepository.java
@@ -13,17 +13,20 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package io.mifos.portfolio.service.internal.repository;
+package io.mifos.individuallending.internal.repository;
 
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
-import java.util.List;
+import java.util.Optional;
+import java.util.stream.Stream;
 
 /**
  * @author Myrle Krantz
  */
 @Repository
-public interface ProductArrearsConfigurationRepository extends JpaRepository<ProductArrearsConfigurationEntity, Long> {
-  List<ProductArrearsConfigurationEntity> findByProductId(Long id);
+public interface LossProvisionStepRepository extends JpaRepository<LossProvisionStepEntity, Long> {
+  Stream<LossProvisionStepEntity> findByProductId(Long id);
+
+  Optional<LossProvisionStepEntity> findByProductIdAndDaysLate(Long id, int daysLate);
 }
diff --git a/service/src/main/java/io/mifos/individuallending/internal/service/DataContextOfAction.java b/service/src/main/java/io/mifos/individuallending/internal/service/DataContextOfAction.java
index 03c1fac..90c0328 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/service/DataContextOfAction.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/service/DataContextOfAction.java
@@ -21,7 +21,6 @@
 import io.mifos.individuallending.internal.repository.CaseParametersEntity;
 import io.mifos.portfolio.api.v1.domain.AccountAssignment;
 import io.mifos.portfolio.service.internal.repository.CaseEntity;
-import io.mifos.portfolio.service.internal.repository.ProductArrearsConfigurationEntity;
 import io.mifos.portfolio.service.internal.repository.ProductEntity;
 
 import javax.annotation.Nonnull;
@@ -37,20 +36,17 @@
   private final ProductEntity product;
   private final CaseEntity customerCase;
   private final CaseParametersEntity caseParameters;
-  private final List<ProductArrearsConfigurationEntity> productArrearsConfigurationEntities;
   private final List<AccountAssignment> oneTimeAccountAssignments;
 
   public DataContextOfAction(
       final @Nonnull ProductEntity product,
       final @Nonnull CaseEntity customerCase,
       final @Nonnull CaseParametersEntity caseParameters,
-      final List<ProductArrearsConfigurationEntity> productArrearsConfigurationEntities,
       final @Nullable List<AccountAssignment> oneTimeAccountAssignments)
   {
     this.product = product;
     this.customerCase = customerCase;
     this.caseParameters = caseParameters;
-    this.productArrearsConfigurationEntities = productArrearsConfigurationEntities;
     this.oneTimeAccountAssignments = oneTimeAccountAssignments == null ? Collections.emptyList() : oneTimeAccountAssignments;
   }
 
@@ -70,10 +66,6 @@
     return CaseParametersMapper.mapEntity(caseParameters, product.getMinorCurrencyUnitDigits());
   }
 
-  public @Nonnull List<ProductArrearsConfigurationEntity> getProductArrearsConfigurationEntities() {
-    return productArrearsConfigurationEntities;
-  }
-
   @Nonnull List<AccountAssignment> getOneTimeAccountAssignments() {
     return oneTimeAccountAssignments;
   }
diff --git a/service/src/main/java/io/mifos/individuallending/internal/service/DataContextService.java b/service/src/main/java/io/mifos/individuallending/internal/service/DataContextService.java
index eb04895..20f2e0d 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/service/DataContextService.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/service/DataContextService.java
@@ -19,7 +19,10 @@
 import io.mifos.individuallending.internal.repository.CaseParametersEntity;
 import io.mifos.individuallending.internal.repository.CaseParametersRepository;
 import io.mifos.portfolio.api.v1.domain.AccountAssignment;
-import io.mifos.portfolio.service.internal.repository.*;
+import io.mifos.portfolio.service.internal.repository.CaseEntity;
+import io.mifos.portfolio.service.internal.repository.CaseRepository;
+import io.mifos.portfolio.service.internal.repository.ProductEntity;
+import io.mifos.portfolio.service.internal.repository.ProductRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -34,18 +37,15 @@
   private final ProductRepository productRepository;
   private final CaseRepository caseRepository;
   private final CaseParametersRepository caseParametersRepository;
-  private final ProductArrearsConfigurationRepository productArrearsConfigurationRepository;
 
   @Autowired
   public DataContextService(
       final ProductRepository productRepository,
       final CaseRepository caseRepository,
-      final CaseParametersRepository caseParametersRepository,
-      final ProductArrearsConfigurationRepository productArrearsConfigurationRepository) {
+      final CaseParametersRepository caseParametersRepository) {
     this.productRepository = productRepository;
     this.caseRepository = caseRepository;
     this.caseParametersRepository = caseParametersRepository;
-    this.productArrearsConfigurationRepository = productArrearsConfigurationRepository;
   }
 
   public DataContextOfAction checkedGetDataContext(
@@ -66,14 +66,10 @@
                 "Individual loan not found ''{0}.{1}''.",
                 productIdentifier, caseIdentifier));
 
-    final List<ProductArrearsConfigurationEntity> productArrearsConfigurationEntities
-        = productArrearsConfigurationRepository.findByProductId(product.getId());
-
     return new DataContextOfAction(
         product,
         customerCase,
         caseParameters,
-        productArrearsConfigurationEntities,
         oneTimeAccountAssignments);
   }
 }
\ No newline at end of file
diff --git a/service/src/main/java/io/mifos/individuallending/internal/service/LossProvisionStepService.java b/service/src/main/java/io/mifos/individuallending/internal/service/LossProvisionStepService.java
new file mode 100644
index 0000000..a079ecf
--- /dev/null
+++ b/service/src/main/java/io/mifos/individuallending/internal/service/LossProvisionStepService.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2017 Kuelap, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.mifos.individuallending.internal.service;
+
+import io.mifos.core.lang.ServiceException;
+import io.mifos.individuallending.api.v1.domain.product.LossProvisionStep;
+import io.mifos.individuallending.internal.mapper.LossProvisionStepMapper;
+import io.mifos.individuallending.internal.repository.LossProvisionStepRepository;
+import io.mifos.portfolio.service.internal.repository.ProductRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * @author Myrle Krantz
+ */
+@Service
+public class LossProvisionStepService {
+  private final ProductRepository productRepository;
+  private final LossProvisionStepRepository lossProvisionStepRepository;
+
+  @Autowired
+  public LossProvisionStepService(
+      final ProductRepository productRepository,
+      final LossProvisionStepRepository lossProvisionStepRepository) {
+    this.productRepository = productRepository;
+    this.lossProvisionStepRepository = lossProvisionStepRepository;
+  }
+
+  public Optional<LossProvisionStep> findByProductIdAndDaysLate(
+      final Long id,
+      final int daysLate) {
+    return lossProvisionStepRepository.findByProductIdAndDaysLate(id, daysLate).map(LossProvisionStepMapper::map);
+  }
+
+  public List<LossProvisionStep> findByProductIdentifier(
+      final String productIdentifier) {
+    final Long productId = productRepository.findByIdentifier(productIdentifier)
+        .orElseThrow(() -> ServiceException.notFound("Product ''{}'' doesn''t exist.", productIdentifier))
+        .getId();
+    return lossProvisionStepRepository.findByProductId(productId)
+        .map(LossProvisionStepMapper::map)
+        .collect(Collectors.toList());
+  }
+}
\ No newline at end of file
diff --git a/service/src/main/java/io/mifos/individuallending/internal/service/costcomponent/DisbursePaymentBuilderService.java b/service/src/main/java/io/mifos/individuallending/internal/service/costcomponent/DisbursePaymentBuilderService.java
index 57a80f4..c843ee0 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/service/costcomponent/DisbursePaymentBuilderService.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/service/costcomponent/DisbursePaymentBuilderService.java
@@ -38,14 +38,14 @@
 @Service
 public class DisbursePaymentBuilderService implements PaymentBuilderService {
   private final ScheduledChargesService scheduledChargesService;
-  private final LossProvisioningService lossProvisioningService;
+  private final LossProvisionChargesService lossProvisionChargesService;
 
   @Autowired
   public DisbursePaymentBuilderService(
       final ScheduledChargesService scheduledChargesService,
-      final LossProvisioningService lossProvisioningService) {
+      final LossProvisionChargesService lossProvisionChargesService) {
     this.scheduledChargesService = scheduledChargesService;
-    this.lossProvisioningService = lossProvisioningService;
+    this.lossProvisionChargesService = lossProvisionChargesService;
   }
 
   @Override
@@ -75,7 +75,7 @@
 
     final List<ScheduledCharge> scheduledCharges = scheduledChargesService.getScheduledCharges(
         productIdentifier, scheduledActions);
-    final Optional<ScheduledCharge> initialLossProvisionCharge = lossProvisioningService.getScheduledChargeForDisbursement(
+    final Optional<ScheduledCharge> initialLossProvisionCharge = lossProvisionChargesService.getScheduledChargeForDisbursement(
         dataContextOfAction, forDate);
     initialLossProvisionCharge.ifPresent(scheduledCharges::add);
 
diff --git a/service/src/main/java/io/mifos/individuallending/internal/service/schedule/LossProvisioningService.java b/service/src/main/java/io/mifos/individuallending/internal/service/schedule/LossProvisionChargesService.java
similarity index 75%
rename from service/src/main/java/io/mifos/individuallending/internal/service/schedule/LossProvisioningService.java
rename to service/src/main/java/io/mifos/individuallending/internal/service/schedule/LossProvisionChargesService.java
index bdfb7fe..7bb2eb7 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/service/schedule/LossProvisioningService.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/service/schedule/LossProvisionChargesService.java
@@ -15,20 +15,19 @@
  */
 package io.mifos.individuallending.internal.service.schedule;
 
-import io.mifos.core.lang.ServiceException;
 import io.mifos.individuallending.api.v1.domain.product.AccountDesignators;
 import io.mifos.individuallending.api.v1.domain.product.ChargeProportionalDesignator;
+import io.mifos.individuallending.api.v1.domain.product.LossProvisionStep;
 import io.mifos.individuallending.api.v1.domain.workflow.Action;
 import io.mifos.individuallending.internal.service.DataContextOfAction;
+import io.mifos.individuallending.internal.service.LossProvisionStepService;
 import io.mifos.portfolio.api.v1.domain.ChargeDefinition;
-import io.mifos.portfolio.service.internal.repository.ProductArrearsConfigurationEntity;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
-import java.util.List;
 import java.util.Optional;
-import java.util.stream.Collectors;
 
 import static io.mifos.individuallending.api.v1.domain.product.ChargeIdentifiers.PROVISION_FOR_LOSSES_ID;
 import static io.mifos.individuallending.api.v1.domain.product.ChargeIdentifiers.PROVISION_FOR_LOSSES_NAME;
@@ -37,7 +36,15 @@
  * @author Myrle Krantz
  */
 @Service
-public class LossProvisioningService {
+public class LossProvisionChargesService {
+  private final LossProvisionStepService lossProvisionStepService;
+
+  @Autowired
+  public LossProvisionChargesService(
+      final LossProvisionStepService lossProvisionStepService) {
+    this.lossProvisionStepService = lossProvisionStepService;
+  }
+
   public Optional<ScheduledCharge> getScheduledChargeForMarkLate(
       final DataContextOfAction dataContextOfAction,
       final LocalDate forDate,
@@ -59,7 +66,7 @@
       final LocalDate forDate,
       final int daysLate, Action action) {
     final Optional<ChargeDefinition> optionalChargeDefinition = percentProvision(dataContextOfAction, daysLate)
-        .map(this::getLossProvisionCharge);
+        .map(percentProvision -> getLossProvisionCharge(percentProvision, action));
 
     return optionalChargeDefinition.map(chargeDefinition -> {
       final ScheduledAction scheduledAction = new ScheduledAction(action, forDate);
@@ -71,22 +78,15 @@
       final DataContextOfAction dataContextOfAction,
       final int daysLate)
   {
-    final List<ProductArrearsConfigurationEntity> arrearsConfigurationForGivenDaysLate =
-        dataContextOfAction.getProductArrearsConfigurationEntities().stream()
-            .filter(x -> x.getDaysLate() == daysLate)
-            .collect(Collectors.toList());
-
-    if (arrearsConfigurationForGivenDaysLate.size() > 1)
-      throw ServiceException.internalError("There should not be more than one arrears allocation for given # of days late.");
-    if (arrearsConfigurationForGivenDaysLate.size() == 0)
-      return Optional.empty(); //None
-
-    return Optional.of(arrearsConfigurationForGivenDaysLate.get(0).getPercentProvision());
+    return lossProvisionStepService.findByProductIdAndDaysLate(dataContextOfAction.getProductEntity().getId(), daysLate)
+        .map(LossProvisionStep::getPercentProvision);
   }
 
-  private ChargeDefinition getLossProvisionCharge(final BigDecimal percentProvision) {
+  private ChargeDefinition getLossProvisionCharge(
+      final BigDecimal percentProvision,
+      final Action action) {
     final ChargeDefinition ret = new ChargeDefinition();
-    ret.setChargeAction(Action.MARK_LATE.name());
+    ret.setChargeAction(action.name());
     ret.setIdentifier(PROVISION_FOR_LOSSES_ID);
     ret.setName(PROVISION_FOR_LOSSES_NAME);
     ret.setDescription(PROVISION_FOR_LOSSES_NAME);
diff --git a/service/src/main/java/io/mifos/individuallending/rest/LossProvisionStepRestController.java b/service/src/main/java/io/mifos/individuallending/rest/LossProvisionStepRestController.java
new file mode 100644
index 0000000..c2d0d0d
--- /dev/null
+++ b/service/src/main/java/io/mifos/individuallending/rest/LossProvisionStepRestController.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2017 Kuelap, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.mifos.individuallending.rest;
+
+import io.mifos.anubis.annotation.AcceptedTokenType;
+import io.mifos.anubis.annotation.Permittable;
+import io.mifos.core.command.gateway.CommandGateway;
+import io.mifos.core.lang.ServiceException;
+import io.mifos.individuallending.api.v1.domain.product.LossProvisionStep;
+import io.mifos.individuallending.internal.command.ChangeLossProvisionSteps;
+import io.mifos.individuallending.internal.service.LossProvisionStepService;
+import io.mifos.portfolio.api.v1.PermittableGroupIds;
+import io.mifos.portfolio.service.internal.service.ProductService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * @author Myrle Krantz
+ */
+@RestController
+@RequestMapping("/individuallending/products/{productidentifier}/cases/lossprovisionsteps")
+public class LossProvisionStepRestController {
+  private final CommandGateway commandGateway;
+  private final ProductService productService;
+  private final LossProvisionStepService lossProvisionStepService;
+
+  @Autowired
+  public LossProvisionStepRestController(
+      final CommandGateway commandGateway,
+      final ProductService productService,
+      final LossProvisionStepService lossProvisionStepService) {
+    this.commandGateway = commandGateway;
+    this.productService = productService;
+    this.lossProvisionStepService = lossProvisionStepService;
+  }
+
+  @Permittable(value = AcceptedTokenType.TENANT, groupId = PermittableGroupIds.PRODUCT_LOSS_PROVISIONING_MANAGEMENT)
+  @RequestMapping(
+      method = RequestMethod.PUT,
+      consumes = MediaType.ALL_VALUE,
+      produces = MediaType.APPLICATION_JSON_VALUE)
+  public @ResponseBody
+  ResponseEntity<Void>
+  setLossProvisionSteps(
+      @PathVariable("productidentifier") final String productIdentifier,
+      @RequestBody @Valid List<LossProvisionStep> lossProvisionSteps) {
+    checkProductExists(productIdentifier);
+
+    commandGateway.process(new ChangeLossProvisionSteps(productIdentifier, lossProvisionSteps));
+
+    return new ResponseEntity<>(HttpStatus.ACCEPTED);
+  }
+
+  @Permittable(value = AcceptedTokenType.TENANT, groupId = PermittableGroupIds.PRODUCT_LOSS_PROVISIONING_MANAGEMENT)
+  @RequestMapping(
+      method = RequestMethod.GET,
+      consumes = MediaType.ALL_VALUE,
+      produces = MediaType.APPLICATION_JSON_VALUE
+  )
+  public @ResponseBody
+  List<LossProvisionStep>
+  getAllLossProvisionSteps(
+      @PathVariable("productidentifier") final String productIdentifier) {
+    checkProductExists(productIdentifier);
+
+    return lossProvisionStepService.findByProductIdentifier(productIdentifier);
+  }
+
+  private void checkProductExists(@PathVariable("productidentifier") String productIdentifier) {
+    productService.findByIdentifier(productIdentifier)
+        .orElseThrow(() -> ServiceException.notFound("Product not found ''{0}''.", productIdentifier));
+  }
+}
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 4bc8051..91b18f5 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
@@ -161,7 +161,6 @@
           product,
           customerCase,
           CaseParametersMapper.map(1L, caseParameters),
-          Collections.emptyList(),
           Collections.emptyList());
     }
 
diff --git a/service/src/test/java/io/mifos/individuallending/internal/service/costcomponent/PaymentBuilderServiceTestHarness.java b/service/src/test/java/io/mifos/individuallending/internal/service/costcomponent/PaymentBuilderServiceTestHarness.java
index 84b3f38..99a5c17 100644
--- a/service/src/test/java/io/mifos/individuallending/internal/service/costcomponent/PaymentBuilderServiceTestHarness.java
+++ b/service/src/test/java/io/mifos/individuallending/internal/service/costcomponent/PaymentBuilderServiceTestHarness.java
@@ -55,7 +55,6 @@
         product,
         customerCase,
         caseParameters,
-        Collections.emptyList(),
         Collections.emptyList());
     return testSubject.getPaymentBuilder(
         dataContextOfAction,
