Validation of case parameters had been accidentally left out.  This caused us to accumulate out of range values for the alignment week.  Now case parameters are validated, but I've weakened the week alignment validation temporarily until the UI can be fixed.
diff --git a/api/src/main/java/io/mifos/portfolio/api/v1/validation/CheckValidWeek.java b/api/src/main/java/io/mifos/portfolio/api/v1/validation/CheckValidWeek.java
index 76a13f5..a98f762 100644
--- a/api/src/main/java/io/mifos/portfolio/api/v1/validation/CheckValidWeek.java
+++ b/api/src/main/java/io/mifos/portfolio/api/v1/validation/CheckValidWeek.java
@@ -30,6 +30,7 @@
 
   @Override
   public boolean isValid(final Integer value, final ConstraintValidatorContext context) {
-    return value == null || value == 0 || value == 1 || value == 2 || value == -1;
+    //TODO: remove allowance for 3 and 4 once UI is fixed to also not allow them.
+    return value == null || value == 0 || value == 1 || value == 2 || value == 3 || value == 4 || value == -1;
   }
 }
diff --git a/api/src/main/java/io/mifos/portfolio/api/v1/validation/ValidWeek.java b/api/src/main/java/io/mifos/portfolio/api/v1/validation/ValidWeek.java
index edbe657..80727db 100644
--- a/api/src/main/java/io/mifos/portfolio/api/v1/validation/ValidWeek.java
+++ b/api/src/main/java/io/mifos/portfolio/api/v1/validation/ValidWeek.java
@@ -30,7 +30,7 @@
         validatedBy = {CheckValidWeek.class}
 )
 public @interface ValidWeek {
-  String message() default "Only weeks 0, 1, 2, or 4, are allowed.";
+  String message() default "Only weeks 0, 1, 2, or -1, are allowed.";
 
   Class<?>[] groups() default {};
 
diff --git a/component-test/src/main/java/io/mifos/portfolio/TestCases.java b/component-test/src/main/java/io/mifos/portfolio/TestCases.java
index 0206d75..63f8b0b 100644
--- a/component-test/src/main/java/io/mifos/portfolio/TestCases.java
+++ b/component-test/src/main/java/io/mifos/portfolio/TestCases.java
@@ -61,6 +61,21 @@
     }
   }
 
+
+  @Test(expected = IllegalArgumentException.class)
+  public void shouldFailToCreateCaseWithInvalidPaymentCycleAlignmentWeek() throws InterruptedException {
+    final Product product = createAndEnableProduct();
+
+    final Case caseInstance = Fixture.getTestCase(product.getIdentifier());
+    final CaseParameters caseParameters = Fixture.getTestCaseParameters();
+    caseParameters.getPaymentCycle().setAlignmentWeek(4);
+    final Gson gson = new Gson();
+    caseInstance.setParameters(gson.toJson(caseParameters));
+
+    portfolioManager.createCase(product.getIdentifier(), caseInstance);
+    Assert.fail("Should fail because alignment week is invalid.");
+  }
+
   @Test(expected = IllegalArgumentException.class)
   public void shouldFailToCreateCaseWithInterestOutOfRange() throws InterruptedException {
     final Product product = createAndEnableProduct();
diff --git a/service/src/main/java/io/mifos/individuallending/IndividualLendingPatternFactory.java b/service/src/main/java/io/mifos/individuallending/IndividualLendingPatternFactory.java
index 724d3c8..cf72ef2 100644
--- a/service/src/main/java/io/mifos/individuallending/IndividualLendingPatternFactory.java
+++ b/service/src/main/java/io/mifos/individuallending/IndividualLendingPatternFactory.java
@@ -41,6 +41,10 @@
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+import javax.validation.ValidatorFactory;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -188,6 +192,13 @@
   @Override
   public void checkParameters(final String parameters) {
     final CaseParameters caseParameters = gson.fromJson(parameters, CaseParameters.class);
+
+    final ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
+    final Validator validator = factory.getValidator();
+    final Set<ConstraintViolation<CaseParameters>> errors = validator.validate(caseParameters);
+    if (errors.size() != 0) {
+      throw ServiceException.badRequest("CaseParameters are invalid.");
+    }
     final String customerIdentifier = caseParameters.getCustomerIdentifier();
     if (!customerManager.isCustomerInGoodStanding(customerIdentifier))
       throw ServiceException.badRequest("Customer ''{0}'' is either not a customer or is not in good standing.");
diff --git a/service/src/main/java/io/mifos/individuallending/internal/mapper/CaseParametersMapper.java b/service/src/main/java/io/mifos/individuallending/internal/mapper/CaseParametersMapper.java
index bac7bdd..64eb458 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/mapper/CaseParametersMapper.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/mapper/CaseParametersMapper.java
@@ -138,6 +138,14 @@
     ret.setAlignmentWeek(instance.getPaymentCycleAlignmentWeek());
     ret.setAlignmentMonth(instance.getPaymentCycleAlignmentMonth());
 
+    //This is necessary because for a while inapproriate values were being accepted for the
+    //alignment week.  Those values are being mapped to -1 which is a sentinel value used to represent the
+    //last week of the month.  If we can fix the existing data, we can remove this code.
+    if (instance.getPaymentCycleAlignmentWeek() != null &&
+        ((instance.getPaymentCycleAlignmentWeek() == 3) ||
+         (instance.getPaymentCycleAlignmentWeek() == 4)))
+      ret.setAlignmentWeek(-1);
+
     return ret;
   }
 
diff --git a/service/src/main/java/io/mifos/individuallending/internal/service/schedule/ScheduledActionHelpers.java b/service/src/main/java/io/mifos/individuallending/internal/service/schedule/ScheduledActionHelpers.java
index 1807136..193ce33 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/service/schedule/ScheduledActionHelpers.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/service/schedule/ScheduledActionHelpers.java
@@ -233,7 +233,7 @@
         return lastDayOfMonth.minus(7, ChronoUnit.DAYS); //Will align days in next step.
     }
 
-    throw new IllegalStateException("PaymentCycle.alignmentWeek should only ever be 0, 1, 2, or -1.");
+    throw new IllegalStateException("PaymentCycle.alignmentWeek should only ever be 0, 1, 2, or -1, but was " + alignmentWeek);
   }
 
   static private LocalDate alignInDays(final LocalDate paymentDate, final PaymentCycle paymentCycle) {