http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/RecurringDepositProductData.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/RecurringDepositProductData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/RecurringDepositProductData.java
index c17ce43..184a7e7 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/RecurringDepositProductData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/RecurringDepositProductData.java
@@ -31,6 +31,7 @@ import 
org.apache.fineract.organisation.monetary.data.CurrencyData;
 import org.apache.fineract.portfolio.charge.data.ChargeData;
 import 
org.apache.fineract.portfolio.interestratechart.data.InterestRateChartData;
 import org.apache.fineract.portfolio.paymenttype.data.PaymentTypeData;
+import org.apache.fineract.portfolio.tax.data.TaxGroupData;
 
 /**
  * Immutable data object represent a Recurring Deposit product.
@@ -68,7 +69,7 @@ public class RecurringDepositProductData extends 
DepositProductData {
             final Map<String, List<GLAccountData>> accountingMappingOptions, 
final Collection<ChargeData> chargeOptions,
             final Collection<ChargeData> penaltyOptions, final 
InterestRateChartData chartTemplate,
             final Collection<EnumOptionData> 
preClosurePenalInterestOnTypeOptions,
-            final Collection<EnumOptionData> periodFrequencyTypeOptions) {
+            final Collection<EnumOptionData> periodFrequencyTypeOptions, final 
Collection<TaxGroupData> taxGroupOptions) {
 
         final Long id = null;
         final String name = null;
@@ -101,6 +102,8 @@ public class RecurringDepositProductData extends 
DepositProductData {
         final BigDecimal minDepositAmount = null;
         final BigDecimal depositAmount = null;
         final BigDecimal maxDepositAmount = null;
+        final boolean withHoldTax = false;
+        final TaxGroupData taxGroup = null;
 
         return new RecurringDepositProductData(id, name, shortName, 
description, currency, nominalAnnualInterestRate,
                 interestCompoundingPeriodType, interestPostingPeriodType, 
interestCalculationType, interestCalculationDaysInYearType,
@@ -112,7 +115,8 @@ public class RecurringDepositProductData extends 
DepositProductData {
                 penaltyToIncomeAccountMappings, interestRateCharts, 
chartTemplate, preClosurePenalApplicable, preClosurePenalInterest,
                 preClosurePenalInterestOnType, 
preClosurePenalInterestOnTypeOptions, minDepositTerm, maxDepositTerm, 
minDepositTermType,
                 maxDepositTermType, inMultiplesOfDepositTerm, 
inMultiplesOfDepositTermType, isMandatoryDeposit, allowWithdrawal,
-                adjustAdvanceTowardsFuturePayments, 
periodFrequencyTypeOptions, minDepositAmount, depositAmount, maxDepositAmount);
+                adjustAdvanceTowardsFuturePayments, 
periodFrequencyTypeOptions, minDepositAmount, depositAmount, maxDepositAmount,
+                withHoldTax, taxGroup, taxGroupOptions);
     }
 
     public static RecurringDepositProductData withCharges(final 
RecurringDepositProductData existingProduct,
@@ -136,13 +140,16 @@ public class RecurringDepositProductData extends 
DepositProductData {
                 existingProduct.maxDepositTermType, 
existingProduct.inMultiplesOfDepositTerm, 
existingProduct.inMultiplesOfDepositTermType,
                 existingProduct.isMandatoryDeposit, 
existingProduct.allowWithdrawal, 
existingProduct.adjustAdvanceTowardsFuturePayments,
                 existingProduct.periodFrequencyTypeOptions, 
existingProduct.minDepositAmount, existingProduct.depositAmount,
-                existingProduct.maxDepositAmount);
+                existingProduct.maxDepositAmount, existingProduct.withHoldTax, 
existingProduct.taxGroup, existingProduct.taxGroupOptions);
     }
 
     /**
      * Returns a {@link RecurringDepositProductData} that contains and exist
      * {@link RecurringDepositProductData} data with further template data for
      * dropdowns.
+     * 
+     * @param taxGroupOptions
+     *            TODO
      */
     public static RecurringDepositProductData withTemplate(final 
RecurringDepositProductData existingProduct,
             final Collection<CurrencyData> currencyOptions, final 
Collection<EnumOptionData> interestCompoundingPeriodTypeOptions,
@@ -154,7 +161,7 @@ public class RecurringDepositProductData extends 
DepositProductData {
             final Map<String, List<GLAccountData>> accountingMappingOptions, 
final Collection<ChargeData> chargeOptions,
             final Collection<ChargeData> penaltyOptions, final 
InterestRateChartData chartTemplate,
             final Collection<EnumOptionData> 
preClosurePenalInterestOnTypeOptions,
-            final Collection<EnumOptionData> periodFrequencyTypeOptions) {
+            final Collection<EnumOptionData> periodFrequencyTypeOptions, final 
Collection<TaxGroupData> taxGroupOptions) {
 
         return new RecurringDepositProductData(existingProduct.id, 
existingProduct.name, existingProduct.shortName,
                 existingProduct.description, existingProduct.currency, 
existingProduct.nominalAnnualInterestRate,
@@ -173,7 +180,8 @@ public class RecurringDepositProductData extends 
DepositProductData {
                 existingProduct.minDepositTermType, 
existingProduct.maxDepositTermType, existingProduct.inMultiplesOfDepositTerm,
                 existingProduct.inMultiplesOfDepositTermType, 
existingProduct.isMandatoryDeposit, existingProduct.allowWithdrawal,
                 existingProduct.adjustAdvanceTowardsFuturePayments, 
periodFrequencyTypeOptions, existingProduct.minDepositAmount,
-                existingProduct.depositAmount, 
existingProduct.maxDepositAmount);
+                existingProduct.depositAmount, 
existingProduct.maxDepositAmount, existingProduct.withHoldTax, 
existingProduct.taxGroup,
+                taxGroupOptions);
 
     }
 
@@ -213,7 +221,7 @@ public class RecurringDepositProductData extends 
DepositProductData {
                 existingProduct.maxDepositTermType, 
existingProduct.inMultiplesOfDepositTerm, 
existingProduct.inMultiplesOfDepositTermType,
                 existingProduct.isMandatoryDeposit, 
existingProduct.allowWithdrawal, 
existingProduct.adjustAdvanceTowardsFuturePayments,
                 existingProduct.periodFrequencyTypeOptions, 
existingProduct.minDepositAmount, existingProduct.depositAmount,
-                existingProduct.maxDepositAmount);
+                existingProduct.maxDepositAmount, existingProduct.withHoldTax, 
existingProduct.taxGroup, existingProduct.taxGroupOptions);
     }
 
     public static RecurringDepositProductData instance(final 
DepositProductData depositProductData,
@@ -246,6 +254,7 @@ public class RecurringDepositProductData extends 
DepositProductData {
         final InterestRateChartData chartTemplate = null;
         final Collection<EnumOptionData> preClosurePenalInterestOnTypeOptions 
= null;
         final Collection<EnumOptionData> periodFrequencyTypeOptions = null;
+        final Collection<TaxGroupData> taxGroupOptions = null;
 
         return new RecurringDepositProductData(depositProductData.id, 
depositProductData.name, depositProductData.shortName,
                 depositProductData.description, depositProductData.currency, 
depositProductData.nominalAnnualInterestRate,
@@ -260,7 +269,8 @@ public class RecurringDepositProductData extends 
DepositProductData {
                 penaltyToIncomeAccountMappings, interestRateCharts, 
chartTemplate, preClosurePenalApplicable, preClosurePenalInterest,
                 preClosurePenalInterestOnType, 
preClosurePenalInterestOnTypeOptions, minDepositTerm, maxDepositTerm, 
minDepositTermType,
                 maxDepositTermType, inMultiplesOfDepositTerm, 
inMultiplesOfDepositTermType, isMandatoryDeposit, allowWithdrawal,
-                adjustAdvanceTowardsFuturePayments, 
periodFrequencyTypeOptions, minDepositAmount, depositAmount, maxDepositAmount);
+                adjustAdvanceTowardsFuturePayments, 
periodFrequencyTypeOptions, minDepositAmount, depositAmount, maxDepositAmount,
+                depositProductData.withHoldTax, depositProductData.taxGroup, 
taxGroupOptions);
     }
 
     public static RecurringDepositProductData lookup(final Long id, final 
String name) {
@@ -316,6 +326,9 @@ public class RecurringDepositProductData extends 
DepositProductData {
         final BigDecimal minDepositAmount = null;
         final BigDecimal depositAmount = null;
         final BigDecimal maxDepositAmount = null;
+        final boolean withHoldTax = false;
+        final TaxGroupData taxGroup = null;
+        final Collection<TaxGroupData> taxGroupOptions = null;
 
         return new RecurringDepositProductData(id, name, shortName, 
description, currency, nominalAnnualInterestRate,
                 interestCompoundingPeriodType, interestPostingPeriodType, 
interestCalculationType, interestCalculationDaysInYearType,
@@ -327,7 +340,8 @@ public class RecurringDepositProductData extends 
DepositProductData {
                 penaltyToIncomeAccountMappings, interestRateCharts, 
chartTemplate, preClosurePenalApplicable, preClosurePenalInterest,
                 preClosurePenalInterestOnType, 
preClosurePenalInterestOnTypeOptions, minDepositTerm, maxDepositTerm, 
minDepositTermType,
                 maxDepositTermType, inMultiplesOfDepositTerm, 
inMultiplesOfDepositTermType, isMandatoryDeposit, allowWithdrawal,
-                adjustAdvanceTowardsFuturePayments, 
periodFrequencyTypeOptions, minDepositAmount, depositAmount, maxDepositAmount);
+                adjustAdvanceTowardsFuturePayments, 
periodFrequencyTypeOptions, minDepositAmount, depositAmount, maxDepositAmount,
+                withHoldTax, taxGroup, taxGroupOptions);
     }
 
     public static RecurringDepositProductData withInterestChart(final 
RecurringDepositProductData product,
@@ -347,7 +361,7 @@ public class RecurringDepositProductData extends 
DepositProductData {
                 product.maxDepositTerm, product.minDepositTermType, 
product.maxDepositTermType, product.inMultiplesOfDepositTerm,
                 product.inMultiplesOfDepositTermType, 
product.isMandatoryDeposit, product.allowWithdrawal,
                 product.adjustAdvanceTowardsFuturePayments, 
product.periodFrequencyTypeOptions, product.minDepositAmount,
-                product.depositAmount, product.maxDepositAmount);
+                product.depositAmount, product.maxDepositAmount, 
product.withHoldTax, product.taxGroup, product.taxGroupOptions);
 
     }
 
@@ -375,7 +389,8 @@ public class RecurringDepositProductData extends 
DepositProductData {
             final EnumOptionData maxDepositTermType, final Integer 
inMultiplesOfDepositTerm,
             final EnumOptionData inMultiplesOfDepositTermType, final boolean 
isMandatoryDeposit, boolean allowWithdrawal,
             boolean adjustAdvanceTowardsFuturePayments, final 
Collection<EnumOptionData> periodFrequencyTypeOptions,
-            final BigDecimal minDepositAmount, final BigDecimal depositAmount, 
final BigDecimal maxDepositAmount) {
+            final BigDecimal minDepositAmount, final BigDecimal depositAmount, 
final BigDecimal maxDepositAmount,
+            final boolean withHoldTax, final TaxGroupData taxGroup, final 
Collection<TaxGroupData> taxGroupOptions) {
 
         super(id, name, shortName, description, currency, 
nominalAnnualInterestRate, interestCompoundingPeriodType,
                 interestPostingPeriodType, interestCalculationType, 
interestCalculationDaysInYearType, lockinPeriodFrequency,
@@ -383,7 +398,8 @@ public class RecurringDepositProductData extends 
DepositProductData {
                 interestCompoundingPeriodTypeOptions, 
interestPostingPeriodTypeOptions, interestCalculationTypeOptions,
                 interestCalculationDaysInYearTypeOptions, 
lockinPeriodFrequencyTypeOptions, withdrawalFeeTypeOptions, paymentTypeOptions,
                 accountingRuleOptions, accountingMappingOptions, charges, 
chargeOptions, penaltyOptions, feeToIncomeAccountMappings,
-                penaltyToIncomeAccountMappings, interestRateCharts, 
chartTemplate, minBalanceForInterestCalculation);
+                penaltyToIncomeAccountMappings, interestRateCharts, 
chartTemplate, minBalanceForInterestCalculation, withHoldTax, taxGroup,
+                taxGroupOptions);
 
         this.preClosurePenalApplicable = preClosurePenalApplicable;
         this.preClosurePenalInterest = preClosurePenalInterest;

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountData.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountData.java
index a10ac9d..6df8f09 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountData.java
@@ -28,6 +28,7 @@ import 
org.apache.fineract.infrastructure.core.data.EnumOptionData;
 import org.apache.fineract.organisation.monetary.data.CurrencyData;
 import org.apache.fineract.organisation.staff.data.StaffData;
 import org.apache.fineract.portfolio.charge.data.ChargeData;
+import org.apache.fineract.portfolio.tax.data.TaxGroupData;
 
 /**
  * Immutable data object representing a savings account.
@@ -64,6 +65,8 @@ public class SavingsAccountData {
     private final boolean enforceMinRequiredBalance;
     private final BigDecimal minBalanceForInterestCalculation;
     private final BigDecimal onHoldFunds;
+    private final boolean withHoldTax;
+    private final TaxGroupData taxGroup;
 
     // associations
     private final SavingsAccountSummaryData summary;
@@ -87,8 +90,8 @@ public class SavingsAccountData {
     private final SavingsAccountChargeData withdrawalFee;
     @SuppressWarnings("unused")
     private final SavingsAccountChargeData annualFee;
-       private final BigDecimal nominalAnnualInterestRateOverdraft;
-       private final BigDecimal minOverdraftForInterestCalculation;
+    private final BigDecimal nominalAnnualInterestRateOverdraft;
+    private final BigDecimal minOverdraftForInterestCalculation;
 
     public static SavingsAccountData instance(final Long id, final String 
accountNo, final EnumOptionData depositType,
             final String externalId, final Long groupId, final String 
groupName, final Long clientId, final String clientName,
@@ -101,7 +104,8 @@ public class SavingsAccountData {
             final SavingsAccountSummaryData summary, final boolean 
allowOverdraft, final BigDecimal overdraftLimit,
             final BigDecimal minRequiredBalance, final boolean 
enforceMinRequiredBalance,
             final BigDecimal minBalanceForInterestCalculation, final 
BigDecimal onHoldFunds,
-            final BigDecimal nominalAnnualInterestRateOverdraft, final 
BigDecimal minOverdraftForInterestCalculation) {
+            final BigDecimal nominalAnnualInterestRateOverdraft, final 
BigDecimal minOverdraftForInterestCalculation,
+            final boolean withHoldTax, final TaxGroupData taxGroup) {
 
         final Collection<SavingsProductData> productOptions = null;
         final Collection<StaffData> fieldOfficerOptions = null;
@@ -123,8 +127,8 @@ public class SavingsAccountData {
                 fieldOfficerOptions, interestCompoundingPeriodTypeOptions, 
interestPostingPeriodTypeOptions,
                 interestCalculationTypeOptions, 
interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions,
                 withdrawalFeeTypeOptions, charges, chargeOptions, 
allowOverdraft, overdraftLimit, minRequiredBalance,
-                enforceMinRequiredBalance, minBalanceForInterestCalculation, 
onHoldFunds,
-                nominalAnnualInterestRateOverdraft, 
minOverdraftForInterestCalculation);
+                enforceMinRequiredBalance, minBalanceForInterestCalculation, 
onHoldFunds, nominalAnnualInterestRateOverdraft,
+                minOverdraftForInterestCalculation, withHoldTax, taxGroup);
     }
 
     public static SavingsAccountData lookup(final Long accountId, final String 
accountNo, final EnumOptionData depositType) {
@@ -178,6 +182,8 @@ public class SavingsAccountData {
 
         final Collection<SavingsAccountChargeData> charges = null;
         final Collection<ChargeData> chargeOptions = null;
+        final boolean withHoldTax = false;
+        final TaxGroupData taxGroup = null;
 
         return new SavingsAccountData(accountId, accountNo, depositType, 
externalId, groupId, groupName, clientId, clientName, productId,
                 productName, fieldOfficerId, fieldOfficerName, status, 
timeline, currency, nominalAnnualInterestRate, interestPeriodType,
@@ -186,8 +192,8 @@ public class SavingsAccountData {
                 fieldOfficerOptions, interestCompoundingPeriodTypeOptions, 
interestPostingPeriodTypeOptions,
                 interestCalculationTypeOptions, 
interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions,
                 withdrawalFeeTypeOptions, charges, chargeOptions, 
allowOverdraft, overdraftLimit, minRequiredBalance,
-                enforceMinRequiredBalance, minBalanceForInterestCalculation, 
onHoldFunds,
-                nominalAnnualInterestRateOverdraft, 
minOverdraftForInterestCalculation);
+                enforceMinRequiredBalance, minBalanceForInterestCalculation, 
onHoldFunds, nominalAnnualInterestRateOverdraft,
+                minOverdraftForInterestCalculation, withHoldTax, taxGroup);
     }
 
     public static SavingsAccountData lookupWithProductDetails(final Long 
accountId, final String accountNo,
@@ -239,6 +245,8 @@ public class SavingsAccountData {
 
         final Collection<SavingsAccountChargeData> charges = null;
         final Collection<ChargeData> chargeOptions = null;
+        final boolean withHoldTax = false;
+        final TaxGroupData taxGroup = null;
 
         return new SavingsAccountData(accountId, accountNo, depositType, 
externalId, groupId, groupName, clientId, clientName, productId,
                 productName, fieldOfficerId, fieldOfficerName, status, 
timeline, currency, nominalAnnualInterestRate, interestPeriodType,
@@ -247,8 +255,8 @@ public class SavingsAccountData {
                 fieldOfficerOptions, interestCompoundingPeriodTypeOptions, 
interestPostingPeriodTypeOptions,
                 interestCalculationTypeOptions, 
interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions,
                 withdrawalFeeTypeOptions, charges, chargeOptions, 
allowOverdraft, overdraftLimit, minRequiredBalance,
-                enforceMinRequiredBalance, minBalanceForInterestCalculation, 
onHoldFunds,
-                nominalAnnualInterestRateOverdraft, 
minOverdraftForInterestCalculation);
+                enforceMinRequiredBalance, minBalanceForInterestCalculation, 
onHoldFunds, nominalAnnualInterestRateOverdraft,
+                minOverdraftForInterestCalculation, withHoldTax, taxGroup);
     }
 
     public static SavingsAccountData withTemplateOptions(final 
SavingsAccountData account, final SavingsAccountData template,
@@ -281,7 +289,8 @@ public class SavingsAccountData {
                 template.interestCalculationDaysInYearTypeOptions, 
template.lockinPeriodFrequencyTypeOptions,
                 template.withdrawalFeeTypeOptions, charges, 
template.chargeOptions, account.allowOverdraft, account.overdraftLimit,
                 account.minRequiredBalance, account.enforceMinRequiredBalance, 
account.minBalanceForInterestCalculation,
-                account.onHoldFunds, 
account.nominalAnnualInterestRateOverdraft, 
account.minOverdraftForInterestCalculation);
+                account.onHoldFunds, 
account.nominalAnnualInterestRateOverdraft, 
account.minOverdraftForInterestCalculation,
+                account.withHoldTax, account.taxGroup);
     }
 
     public static SavingsAccountData withTemplateOptions(final 
SavingsAccountData account,
@@ -304,7 +313,8 @@ public class SavingsAccountData {
                 interestCalculationTypeOptions, 
interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions,
                 withdrawalFeeTypeOptions, charges, chargeOptions, 
account.allowOverdraft, account.overdraftLimit,
                 account.minRequiredBalance, account.enforceMinRequiredBalance, 
account.minBalanceForInterestCalculation,
-                account.onHoldFunds, 
account.nominalAnnualInterestRateOverdraft, 
account.minOverdraftForInterestCalculation);
+                account.onHoldFunds, 
account.nominalAnnualInterestRateOverdraft, 
account.minOverdraftForInterestCalculation,
+                account.withHoldTax, account.taxGroup);
     }
 
     public static SavingsAccountData withClientTemplate(final Long clientId, 
final String clientName, final Long groupId,
@@ -343,6 +353,8 @@ public class SavingsAccountData {
         final boolean enforceMinRequiredBalance = false;
         final BigDecimal minBalanceForInterestCalculation = null;
         final BigDecimal onHoldFunds = null;
+        final boolean withHoldTax = false;
+        final TaxGroupData taxGroup = null;
 
         final SavingsAccountSummaryData summary = null;
         final Collection<SavingsAccountTransactionData> transactions = null;
@@ -366,8 +378,8 @@ public class SavingsAccountData {
                 fieldOfficerOptions, interestCompoundingPeriodTypeOptions, 
interestPostingPeriodTypeOptions,
                 interestCalculationTypeOptions, 
interestCalculationDaysInYearTypeOptions, lockinPeriodFrequencyTypeOptions,
                 withdrawalFeeTypeOptions, charges, chargeOptions, 
allowOverdraft, overdraftLimit, minRequiredBalance,
-                enforceMinRequiredBalance, minBalanceForInterestCalculation, 
onHoldFunds,
-                nominalAnnualInterestRateOverdraft, 
minOverdraftForInterestCalculation);
+                enforceMinRequiredBalance, minBalanceForInterestCalculation, 
onHoldFunds, nominalAnnualInterestRateOverdraft,
+                minOverdraftForInterestCalculation, withHoldTax, taxGroup);
     }
 
     private SavingsAccountData(final Long id, final String accountNo, final 
EnumOptionData depositType, final String externalId,
@@ -388,7 +400,8 @@ public class SavingsAccountData {
             final Collection<SavingsAccountChargeData> charges, final 
Collection<ChargeData> chargeOptions, final boolean allowOverdraft,
             final BigDecimal overdraftLimit, final BigDecimal 
minRequiredBalance, final boolean enforceMinRequiredBalance,
             final BigDecimal minBalanceForInterestCalculation, final 
BigDecimal onHoldFunds,
-            final BigDecimal nominalAnnualInterestRateOverdraft, final 
BigDecimal minOverdraftForInterestCalculation) {
+            final BigDecimal nominalAnnualInterestRateOverdraft, final 
BigDecimal minOverdraftForInterestCalculation,
+            final boolean withHoldTax, final TaxGroupData taxGroup) {
         this.id = id;
         this.accountNo = accountNo;
         this.depositType = depositType;
@@ -446,6 +459,8 @@ public class SavingsAccountData {
         this.enforceMinRequiredBalance = enforceMinRequiredBalance;
         this.minBalanceForInterestCalculation = 
minBalanceForInterestCalculation;
         this.onHoldFunds = onHoldFunds;
+        this.withHoldTax = withHoldTax;
+        this.taxGroup = taxGroup;
     }
 
     private SavingsAccountChargeData getWithdrawalFee() {

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataValidator.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataValidator.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataValidator.java
index 1f895ad..586ef25 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataValidator.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataValidator.java
@@ -42,6 +42,7 @@ import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.nominalA
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.overdraftLimitParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.productIdParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.submittedOnDateParamName;
+import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.withHoldTaxParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.withdrawalFeeForTransfersParamName;
 
 import java.lang.reflect.Type;
@@ -205,6 +206,11 @@ public class SavingsAccountDataValidator {
             
baseDataValidator.reset().parameter(withdrawalFeeForTransfersParamName).value(isWithdrawalFeeApplicableForTransfers)
                     .ignoreIfNull().validateForBooleanValue();
         }
+        
+        if (this.fromApiJsonHelper.parameterExists(withHoldTaxParamName, 
element)) {
+            final String withHoldTax = 
this.fromApiJsonHelper.extractStringNamed(withHoldTaxParamName, element);
+            
baseDataValidator.reset().parameter(withHoldTaxParamName).value(withHoldTax).ignoreIfNull().validateForBooleanValue();
+        }
 
         validateSavingsCharges(element, baseDataValidator);
 
@@ -384,6 +390,11 @@ public class SavingsAccountDataValidator {
             
baseDataValidator.reset().parameter(withdrawalFeeForTransfersParamName).value(isWithdrawalFeeApplicableForTransfers)
                     .ignoreIfNull().validateForBooleanValue();
         }
+        
+        if (this.fromApiJsonHelper.parameterExists(withHoldTaxParamName, 
element)) {
+            final String withHoldTax = 
this.fromApiJsonHelper.extractStringNamed(withHoldTaxParamName, element);
+            
baseDataValidator.reset().parameter(withHoldTaxParamName).value(withHoldTax).ignoreIfNull().validateForBooleanValue();
+        }
 
         validateOverdraftParams(baseDataValidator, element);
         throwExceptionIfValidationWarningsExist(dataValidationErrors);

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountStatusEnumData.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountStatusEnumData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountStatusEnumData.java
index 215a475..7e7bd76 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountStatusEnumData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountStatusEnumData.java
@@ -46,10 +46,12 @@ public class SavingsAccountStatusEnumData {
     private final boolean transferInProgress;
     @SuppressWarnings("unused")
     private final boolean transferOnHold;
+    @SuppressWarnings("unused")
+    private final boolean matured;
 
     public SavingsAccountStatusEnumData(final Long id, final String code, 
final String value, final boolean submittedAndPendingApproval,
             final boolean approved, final boolean rejected, final boolean 
withdrawnByApplicant, final boolean active, final boolean closed,
-            final boolean prematureClosed, final boolean transferInProgress, 
final boolean transferOnHold) {
+            final boolean prematureClosed, final boolean transferInProgress, 
final boolean transferOnHold, final boolean matured) {
         this.id = id;
         this.code = code;
         this.value = value;
@@ -62,6 +64,7 @@ public class SavingsAccountStatusEnumData {
         this.prematureClosed = prematureClosed;
         this.transferInProgress = transferInProgress;
         this.transferOnHold = transferOnHold;
+        this.matured = matured;
     }
 
     public Long id() {

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSummaryData.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSummaryData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSummaryData.java
index 627169a..e2d3d0e 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSummaryData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSummaryData.java
@@ -39,11 +39,12 @@ public class SavingsAccountSummaryData {
     private final BigDecimal totalFeeCharge;
     private final BigDecimal totalPenaltyCharge;
     private final BigDecimal totalOverdraftInterestDerived;
+    private final BigDecimal totalWithholdTax;
 
     public SavingsAccountSummaryData(final CurrencyData currency, final 
BigDecimal totalDeposits, final BigDecimal totalWithdrawals,
             final BigDecimal totalWithdrawalFees, final BigDecimal 
totalAnnualFees, final BigDecimal totalInterestEarned,
             final BigDecimal totalInterestPosted, final BigDecimal 
accountBalance, final BigDecimal totalFeeCharge,
-            final BigDecimal totalPenaltyCharge, final BigDecimal 
totalOverdraftInterestDerived) {
+            final BigDecimal totalPenaltyCharge, final BigDecimal 
totalOverdraftInterestDerived,final BigDecimal totalWithholdTax) {
         this.currency = currency;
         this.totalDeposits = totalDeposits;
         this.totalWithdrawals = totalWithdrawals;
@@ -55,5 +56,6 @@ public class SavingsAccountSummaryData {
         this.totalFeeCharge = totalFeeCharge;
         this.totalPenaltyCharge = totalPenaltyCharge;
         this.totalOverdraftInterestDerived = totalOverdraftInterestDerived;
+        this.totalWithholdTax = totalWithholdTax;
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java
index 014bc32..d4b9cf1 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java
@@ -41,6 +41,7 @@ public class SavingsAccountTransactionEnumData {
     private final boolean overdraftInterest;
     private final boolean writtenoff;
     private final boolean overdraftFee = true;
+    private final boolean withholdTax;
 
     public SavingsAccountTransactionEnumData(final Long id, final String code, 
final String value) {
         this.id = id;
@@ -58,6 +59,7 @@ public class SavingsAccountTransactionEnumData {
         this.rejectTransfer = 
Long.valueOf(SavingsAccountTransactionType.REJECT_TRANSFER.getValue()).equals(this.id);
         this.writtenoff = 
Long.valueOf(SavingsAccountTransactionType.WRITTEN_OFF.getValue()).equals(this.id);
         this.overdraftInterest = 
Long.valueOf(SavingsAccountTransactionType.OVERDRAFT_INTEREST.getValue()).equals(this.id);
+        this.withholdTax = 
Long.valueOf(SavingsAccountTransactionType.WITHHOLD_TAX.getValue()).equals(this.id);
         // this.overdraftFee =
         // 
Long.valueOf(SavingsAccountTransactionType.OVERDRAFT_INTEREST.getValue()).equals(this.id);
     }
@@ -122,4 +124,8 @@ public class SavingsAccountTransactionEnumData {
         return this.overdraftFee;
     }
 
+    public boolean isWithholdTax() {
+        return this.withholdTax;
+    }
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductData.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductData.java
index 94c6ed6..6741164 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductData.java
@@ -31,6 +31,7 @@ import 
org.apache.fineract.infrastructure.core.data.EnumOptionData;
 import org.apache.fineract.organisation.monetary.data.CurrencyData;
 import org.apache.fineract.portfolio.charge.data.ChargeData;
 import org.apache.fineract.portfolio.paymenttype.data.PaymentTypeData;
+import org.apache.fineract.portfolio.tax.data.TaxGroupData;
 
 /**
  * Immutable data object represent a savings product.
@@ -56,6 +57,10 @@ public class SavingsProductData {
     private final BigDecimal minRequiredBalance;
     private final boolean enforceMinRequiredBalance;
     private final BigDecimal minBalanceForInterestCalculation;
+    private final BigDecimal nominalAnnualInterestRateOverdraft;
+    private final BigDecimal minOverdraftForInterestCalculation;
+    private final boolean withHoldTax;
+    private final TaxGroupData taxGroup;
 
     // accounting
     private final EnumOptionData accountingRule;
@@ -80,8 +85,7 @@ public class SavingsProductData {
     private final Map<String, List<GLAccountData>> accountingMappingOptions;
     private final Collection<ChargeData> chargeOptions;
     private final Collection<ChargeData> penaltyOptions;
-       private final BigDecimal nominalAnnualInterestRateOverdraft;
-       private final BigDecimal minOverdraftForInterestCalculation;
+    private final Collection<TaxGroupData> taxGroupOptions;
 
     public static SavingsProductData template(final CurrencyData currency, 
final EnumOptionData interestCompoundingPeriodType,
             final EnumOptionData interestPostingPeriodType, final 
EnumOptionData interestCalculationType,
@@ -93,7 +97,7 @@ public class SavingsProductData {
             final Collection<EnumOptionData> lockinPeriodFrequencyTypeOptions, 
final Collection<EnumOptionData> withdrawalFeeTypeOptions,
             final Collection<PaymentTypeData> paymentTypeOptions, final 
Collection<EnumOptionData> accountingRuleOptions,
             final Map<String, List<GLAccountData>> accountingMappingOptions, 
final Collection<ChargeData> chargeOptions,
-            final Collection<ChargeData> penaltyOptions) {
+            final Collection<ChargeData> penaltyOptions, final 
Collection<TaxGroupData> taxGroupOptions) {
 
         final Long id = null;
         final String name = null;
@@ -116,7 +120,8 @@ public class SavingsProductData {
         final BigDecimal minBalanceForInterestCalculation = null;
         final BigDecimal nominalAnnualInterestRateOverdraft = null;
         final BigDecimal minOverdraftForInterestCalculation = null;
-
+        final boolean withHoldTax = false;
+        final TaxGroupData taxGroup = null;
 
         return new SavingsProductData(id, name, shortName, description, 
currency, nominalAnnualInterestRate, interestCompoundingPeriodType,
                 interestPostingPeriodType, interestCalculationType, 
interestCalculationDaysInYearType, minRequiredOpeningBalance,
@@ -126,7 +131,8 @@ public class SavingsProductData {
                 lockinPeriodFrequencyTypeOptions, withdrawalFeeTypeOptions, 
paymentTypeOptions, accountingRuleOptions,
                 accountingMappingOptions, charges, chargeOptions, 
penaltyOptions, feeToIncomeAccountMappings,
                 penaltyToIncomeAccountMappings, allowOverdraft, 
overdraftLimit, minRequiredBalance, enforceMinRequiredBalance,
-                minBalanceForInterestCalculation, 
nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation);
+                minBalanceForInterestCalculation, 
nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation, 
withHoldTax,
+                taxGroup, taxGroupOptions);
     }
 
     public static SavingsProductData withCharges(final SavingsProductData 
product, final Collection<ChargeData> charges) {
@@ -141,12 +147,16 @@ public class SavingsProductData {
                 product.accountingRuleOptions, 
product.accountingMappingOptions, charges, product.chargeOptions, 
product.penaltyOptions,
                 product.feeToIncomeAccountMappings, 
product.penaltyToIncomeAccountMappings, product.allowOverdraft, 
product.overdraftLimit,
                 product.minRequiredBalance, product.enforceMinRequiredBalance, 
product.minBalanceForInterestCalculation,
-                product.nominalAnnualInterestRateOverdraft, 
product.minOverdraftForInterestCalculation);
+                product.nominalAnnualInterestRateOverdraft, 
product.minOverdraftForInterestCalculation, product.withHoldTax,
+                product.taxGroup, product.taxGroupOptions);
     }
 
     /**
      * Returns a {@link SavingsProductData} that contains and exist
      * {@link SavingsProductData} data with further template data for 
dropdowns.
+     * 
+     * @param taxGroupOptions
+     *            TODO
      */
     public static SavingsProductData withTemplate(final SavingsProductData 
existingProduct, final Collection<CurrencyData> currencyOptions,
             final Collection<EnumOptionData> 
interestCompoundingPeriodTypeOptions,
@@ -156,7 +166,7 @@ public class SavingsProductData {
             final Collection<EnumOptionData> lockinPeriodFrequencyTypeOptions, 
final Collection<EnumOptionData> withdrawalFeeTypeOptions,
             final Collection<PaymentTypeData> paymentTypeOptions, final 
Collection<EnumOptionData> accountingRuleOptions,
             final Map<String, List<GLAccountData>> accountingMappingOptions, 
final Collection<ChargeData> chargeOptions,
-            final Collection<ChargeData> penaltyOptions) {
+            final Collection<ChargeData> penaltyOptions, 
Collection<TaxGroupData> taxGroupOptions) {
 
         return new SavingsProductData(existingProduct.id, 
existingProduct.name, existingProduct.shortName, existingProduct.description,
                 existingProduct.currency, 
existingProduct.nominalAnnualInterestRate, 
existingProduct.interestCompoundingPeriodType,
@@ -171,7 +181,7 @@ public class SavingsProductData {
                 existingProduct.feeToIncomeAccountMappings, 
existingProduct.penaltyToIncomeAccountMappings, existingProduct.allowOverdraft,
                 existingProduct.overdraftLimit, 
existingProduct.minRequiredBalance, existingProduct.enforceMinRequiredBalance,
                 existingProduct.minBalanceForInterestCalculation, 
existingProduct.nominalAnnualInterestRateOverdraft,
-                existingProduct.minOverdraftForInterestCalculation);
+                existingProduct.minOverdraftForInterestCalculation, 
existingProduct.withHoldTax, existingProduct.taxGroup, taxGroupOptions);
     }
 
     public static SavingsProductData withAccountingDetails(final 
SavingsProductData existingProduct,
@@ -206,7 +216,8 @@ public class SavingsProductData {
                 penaltyToIncomeAccountMappings, 
existingProduct.allowOverdraft, existingProduct.overdraftLimit,
                 existingProduct.minRequiredBalance, 
existingProduct.enforceMinRequiredBalance,
                 existingProduct.minBalanceForInterestCalculation, 
existingProduct.nominalAnnualInterestRateOverdraft,
-                existingProduct.minOverdraftForInterestCalculation);
+                existingProduct.minOverdraftForInterestCalculation, 
existingProduct.withHoldTax, existingProduct.taxGroup,
+                existingProduct.taxGroupOptions);
     }
 
     public static SavingsProductData instance(final Long id, final String 
name, final String shortName, final String description,
@@ -215,8 +226,9 @@ public class SavingsProductData {
             final EnumOptionData interestCalculationDaysInYearType, final 
BigDecimal minRequiredOpeningBalance,
             final Integer lockinPeriodFrequency, final EnumOptionData 
lockinPeriodFrequencyType, final boolean withdrawalFeeForTransfers,
             final EnumOptionData accountingType, final boolean allowOverdraft, 
final BigDecimal overdraftLimit,
-            final BigDecimal minRequiredBalance, final boolean 
enforceMinRequiredBalance, final BigDecimal minBalanceForInterestCalculation,
-            final BigDecimal nominalAnnualInterestRateOverdraft, final 
BigDecimal minOverdraftForInterestCalculation) {
+            final BigDecimal minRequiredBalance, final boolean 
enforceMinRequiredBalance,
+            final BigDecimal minBalanceForInterestCalculation, final 
BigDecimal nominalAnnualInterestRateOverdraft,
+            final BigDecimal minOverdraftForInterestCalculation, final boolean 
withHoldTax, final TaxGroupData taxGroup) {
 
         final Map<String, Object> accountingMappings = null;
         final Collection<PaymentTypeToGLAccountMapper> 
paymentChannelToFundSourceMappings = null;
@@ -236,6 +248,7 @@ public class SavingsProductData {
         final Collection<ChargeData> charges = null;
         final Collection<ChargeToGLAccountMapper> feeToIncomeAccountMappings = 
null;
         final Collection<ChargeToGLAccountMapper> 
penaltyToIncomeAccountMappings = null;
+        final Collection<TaxGroupData> taxGroupOptions = null;
 
         return new SavingsProductData(id, name, shortName, description, 
currency, nominalAnnualInterestRate, interestCompoundingPeriodType,
                 interestPostingPeriodType, interestCalculationType, 
interestCalculationDaysInYearType, minRequiredOpeningBalance,
@@ -245,7 +258,8 @@ public class SavingsProductData {
                 lockinPeriodFrequencyTypeOptions, withdrawalFeeTypeOptions, 
paymentTypeOptions, accountingRuleOptions,
                 accountingMappingOptions, charges, chargeOptions, 
penaltyOptions, feeToIncomeAccountMappings,
                 penaltyToIncomeAccountMappings, allowOverdraft, 
overdraftLimit, minRequiredBalance, enforceMinRequiredBalance,
-                minBalanceForInterestCalculation, 
nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation);
+                minBalanceForInterestCalculation, 
nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation, 
withHoldTax,
+                taxGroup, taxGroupOptions);
     }
 
     public static SavingsProductData lookup(final Long id, final String name) {
@@ -272,6 +286,8 @@ public class SavingsProductData {
         final BigDecimal minRequiredBalance = null;
         final boolean enforceMinRequiredBalance = false;
         final BigDecimal minBalanceForInterestCalculation = null;
+        final boolean withHoldTax = false;
+        final TaxGroupData taxGroup = null;
 
         final Collection<CurrencyData> currencyOptions = null;
         final Collection<EnumOptionData> interestCompoundingPeriodTypeOptions 
= null;
@@ -288,6 +304,7 @@ public class SavingsProductData {
         final Collection<ChargeData> penaltyOptions = null;
         final Collection<ChargeToGLAccountMapper> feeToIncomeAccountMappings = 
null;
         final Collection<ChargeToGLAccountMapper> 
penaltyToIncomeAccountMappings = null;
+        final Collection<TaxGroupData> taxGroupOptions = null;
 
         return new SavingsProductData(id, name, shortName, description, 
currency, nominalAnnualInterestRate, interestCompoundingPeriodType,
                 interestPostingPeriodType, interestCalculationType, 
interestCalculationDaysInYearType, minRequiredOpeningBalance,
@@ -297,7 +314,8 @@ public class SavingsProductData {
                 lockinPeriodFrequencyTypeOptions, withdrawalFeeTypeOptions, 
paymentTypeOptions, accountingRuleOptions,
                 accountingMappingOptions, charges, chargeOptions, 
penaltyOptions, feeToIncomeAccountMappings,
                 penaltyToIncomeAccountMappings, allowOverdraft, 
overdraftLimit, minRequiredBalance, enforceMinRequiredBalance,
-                minBalanceForInterestCalculation, 
nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation);
+                minBalanceForInterestCalculation, 
nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation, 
withHoldTax,
+                taxGroup, taxGroupOptions);
     }
 
     private SavingsProductData(final Long id, final String name, final String 
shortName, final String description,
@@ -318,8 +336,9 @@ public class SavingsProductData {
             final Collection<ChargeToGLAccountMapper> 
feeToIncomeAccountMappings,
             final Collection<ChargeToGLAccountMapper> 
penaltyToIncomeAccountMappings, final boolean allowOverdraft,
             final BigDecimal overdraftLimit, final BigDecimal 
minRequiredBalance, final boolean enforceMinRequiredBalance,
-            final BigDecimal minBalanceForInterestCalculation,
-            final BigDecimal nominalAnnualInterestRateOverdraft, final 
BigDecimal minOverdraftForInterestCalculation) {
+            final BigDecimal minBalanceForInterestCalculation, final 
BigDecimal nominalAnnualInterestRateOverdraft,
+            final BigDecimal minOverdraftForInterestCalculation, final boolean 
withHoldTax, final TaxGroupData taxGroup,
+            final Collection<TaxGroupData> taxGroupOptions) {
         this.id = id;
         this.name = name;
         this.shortName = shortName;
@@ -369,6 +388,9 @@ public class SavingsProductData {
         this.minBalanceForInterestCalculation = 
minBalanceForInterestCalculation;
         this.nominalAnnualInterestRateOverdraft = 
nominalAnnualInterestRateOverdraft;
         this.minOverdraftForInterestCalculation = 
minOverdraftForInterestCalculation;
+        this.taxGroup = taxGroup;
+        this.withHoldTax = withHoldTax;
+        this.taxGroupOptions = taxGroupOptions;
     }
 
     public boolean hasAccountingEnabled() {

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductDataValidator.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductDataValidator.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductDataValidator.java
index af0b124..912a0c0 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductDataValidator.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductDataValidator.java
@@ -42,6 +42,8 @@ import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.nominalA
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.overdraftLimitParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.shortNameParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.withdrawalFeeForTransfersParamName;
+import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.withHoldTaxParamName;
+import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.taxGroupIdParamName;
 
 import java.lang.reflect.Type;
 import java.math.BigDecimal;
@@ -295,6 +297,8 @@ public class SavingsProductDataValidator {
                     .ignoreIfNull().zeroOrPositiveAmount();
         }
 
+        validateTaxWithHoldingParams(baseDataValidator, element, true);
+
         throwExceptionIfValidationWarningsExist(dataValidationErrors);
     }
 
@@ -460,6 +464,8 @@ public class SavingsProductDataValidator {
                     .ignoreIfNull().zeroOrPositiveAmount();
         }
 
+        validateTaxWithHoldingParams(baseDataValidator, element, false);
+
         throwExceptionIfValidationWarningsExist(dataValidationErrors);
     }
 
@@ -553,13 +559,42 @@ public class SavingsProductDataValidator {
         }
 
         if 
(this.fromApiJsonHelper.parameterExists(nominalAnnualInterestRateOverdraftParamName,
 element)) {
-            final BigDecimal nominalAnnualInterestRateOverdraft = 
this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(nominalAnnualInterestRateOverdraftParamName,
 element);
-            
baseDataValidator.reset().parameter(nominalAnnualInterestRateOverdraftParamName).value(nominalAnnualInterestRateOverdraft).ignoreIfNull().zeroOrPositiveAmount();
+            final BigDecimal nominalAnnualInterestRateOverdraft = 
this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(
+                    nominalAnnualInterestRateOverdraftParamName, element);
+            
baseDataValidator.reset().parameter(nominalAnnualInterestRateOverdraftParamName).value(nominalAnnualInterestRateOverdraft)
+                    .ignoreIfNull().zeroOrPositiveAmount();
         }
 
         if 
(this.fromApiJsonHelper.parameterExists(minOverdraftForInterestCalculationParamName,
 element)) {
-            final BigDecimal minOverdraftForInterestCalculation = 
this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(minOverdraftForInterestCalculationParamName,
 element);
-            
baseDataValidator.reset().parameter(minOverdraftForInterestCalculationParamName).value(minOverdraftForInterestCalculation).ignoreIfNull().zeroOrPositiveAmount();
+            final BigDecimal minOverdraftForInterestCalculation = 
this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(
+                    minOverdraftForInterestCalculationParamName, element);
+            
baseDataValidator.reset().parameter(minOverdraftForInterestCalculationParamName).value(minOverdraftForInterestCalculation)
+                    .ignoreIfNull().zeroOrPositiveAmount();
+        }
+
+    }
+
+    private void validateTaxWithHoldingParams(final DataValidatorBuilder 
baseDataValidator, final JsonElement element,
+            final boolean isCreate) {
+        if (this.fromApiJsonHelper.parameterExists(withHoldTaxParamName, 
element)) {
+            final String withHoldTax = 
this.fromApiJsonHelper.extractStringNamed(withHoldTaxParamName, element);
+            
baseDataValidator.reset().parameter(withHoldTaxParamName).value(withHoldTax).ignoreIfNull().validateForBooleanValue();
+        }
+        Boolean withHoldTax = 
this.fromApiJsonHelper.extractBooleanNamed(withHoldTaxParamName, element);
+        if (withHoldTax == null) {
+            withHoldTax = false;
+        }
+
+        if (this.fromApiJsonHelper.parameterExists(taxGroupIdParamName, 
element)) {
+            final Long taxGroupId = 
this.fromApiJsonHelper.extractLongNamed(taxGroupIdParamName, element);
+            
baseDataValidator.reset().parameter(taxGroupIdParamName).value(taxGroupId).ignoreIfNull().longGreaterThanZero();
+            if (withHoldTax) {
+                
baseDataValidator.reset().parameter(taxGroupIdParamName).value(taxGroupId).notBlank();
+            }
+
+        } else if (withHoldTax && isCreate) {
+            final Long taxGroupId = null;
+            
baseDataValidator.reset().parameter(taxGroupIdParamName).value(taxGroupId).notBlank();
         }
 
     }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountAssembler.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountAssembler.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountAssembler.java
index c8b7605..2cffa6b 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountAssembler.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountAssembler.java
@@ -48,10 +48,12 @@ import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.minRequi
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.nominalAnnualInterestRateParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.productIdParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.submittedOnDateParamName;
+import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.withHoldTaxParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.withdrawalFeeForTransfersParamName;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Date;
 import java.util.Locale;
@@ -60,6 +62,7 @@ import java.util.Set;
 import org.apache.commons.lang.StringUtils;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.exception.InvalidJsonException;
+import 
org.apache.fineract.infrastructure.core.exception.UnsupportedParameterException;
 import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper;
 import org.apache.fineract.infrastructure.core.service.DateUtils;
 import 
org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
@@ -166,6 +169,7 @@ public class DepositAccountAssembler {
         }
 
         if (product == null) { throw new 
SavingsProductNotFoundException(productId); }
+        
 
         Client client = null;
         Group group = null;
@@ -286,6 +290,14 @@ public class DepositAccountAssembler {
         if (productChart != null) {
             accountChart = DepositAccountInterestRateChart.from(productChart);
         }
+        
+        boolean withHoldTax = product.withHoldTax();
+        if (command.parameterExists(withHoldTaxParamName)) {
+            withHoldTax = 
command.booleanPrimitiveValueOfParameterNamed(withHoldTaxParamName);
+            if(withHoldTax && product.getTaxGroup()  == null){
+                throw new 
UnsupportedParameterException(Arrays.asList(withHoldTaxParamName));
+            }
+        }
 
         SavingsAccount account = null;
         if (depositAccountType.isFixedDeposit()) {
@@ -297,7 +309,7 @@ public class DepositAccountAssembler {
                     accountNo, externalId, accountType, submittedOnDate, 
submittedBy, interestRate, interestCompoundingPeriodType,
                     interestPostingPeriodType, interestCalculationType, 
interestCalculationDaysInYearType, minRequiredOpeningBalance,
                     lockinPeriodFrequency, lockinPeriodFrequencyType, 
iswithdrawalFeeApplicableForTransfer, charges,
-                    accountTermAndPreClosure, accountChart);
+                    accountTermAndPreClosure, accountChart, withHoldTax);
             accountTermAndPreClosure.updateAccountReference(fdAccount);
             fdAccount.validateDomainRules();
             account = fdAccount;
@@ -315,7 +327,7 @@ public class DepositAccountAssembler {
                     fieldOfficer, accountNo, externalId, accountType, 
submittedOnDate, submittedBy, interestRate,
                     interestCompoundingPeriodType, interestPostingPeriodType, 
interestCalculationType, interestCalculationDaysInYearType,
                     minRequiredOpeningBalance, lockinPeriodFrequency, 
lockinPeriodFrequencyType, iswithdrawalFeeApplicableForTransfer,
-                    charges, accountTermAndPreClosure, accountRecurringDetail, 
accountChart);
+                    charges, accountTermAndPreClosure, accountRecurringDetail, 
accountChart, withHoldTax);
 
             accountTermAndPreClosure.updateAccountReference(rdAccount);
             accountRecurringDetail.updateAccountReference(rdAccount);

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountDomainServiceJpa.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountDomainServiceJpa.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountDomainServiceJpa.java
index 0f2a1fa..2bd27c2 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountDomainServiceJpa.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountDomainServiceJpa.java
@@ -25,6 +25,7 @@ import static 
org.apache.fineract.portfolio.savings.DepositsApiConstants.transfe
 import java.math.BigDecimal;
 import java.math.MathContext;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
@@ -164,6 +165,9 @@ public class DepositAccountDomainServiceJpa implements 
DepositAccountDomainServi
         final boolean isPreMatureClosure = false;
         final Set<Long> existingTransactionIds = new HashSet<>();
         final Set<Long> existingReversedTransactionIds = new HashSet<>();
+        /***
+         * Update account transactionIds for post journal entries.
+         */
         updateExistingTransactionsDetails(account, existingTransactionIds, 
existingReversedTransactionIds);
         /*
          * <<<<<<< HEAD final SavingsAccountTransactionDTO transactionDTO = new
@@ -207,16 +211,13 @@ public class DepositAccountDomainServiceJpa implements 
DepositAccountDomainServi
                     null, null, null, 
AccountTransferType.ACCOUNT_TRANSFER.getValue(), null, null, null, null, 
toSavingsAccount, account,
                     isAccountTransfer, isExceptionForBalanceCheck);
             
this.accountTransfersWritePlatformService.transferFunds(accountTransferDTO);
+            updateAlreadyPostedTransactions(existingTransactionIds, account);  
         } else {
             final SavingsAccountTransaction withdrawal = 
this.handleWithdrawal(account, fmt, closedDate, account.getAccountBalance(),
                     paymentDetail, false, isRegularTransaction);
             savingsTransactionId = withdrawal.getId();
         }
 
-        /***
-         * Update account transactionIds for post journal entries.
-         */
-        updateExistingTransactionsDetails(account, existingTransactionIds, 
existingReversedTransactionIds);
         account.close(user, command, tenantsTodayDate, changes);
         this.savingsAccountRepository.save(account);
 
@@ -239,6 +240,9 @@ public class DepositAccountDomainServiceJpa implements 
DepositAccountDomainServi
         final boolean isPreMatureClosure = false;
         final Set<Long> existingTransactionIds = new HashSet<>();
         final Set<Long> existingReversedTransactionIds = new HashSet<>();
+        /***
+         * Update account transactionIds for post journal entries.
+         */
         updateExistingTransactionsDetails(account, existingTransactionIds, 
existingReversedTransactionIds);
 
         final MathContext mc = MathContext.DECIMAL64;
@@ -282,16 +286,13 @@ public class DepositAccountDomainServiceJpa implements 
DepositAccountDomainServi
                     null, null, null, 
AccountTransferType.ACCOUNT_TRANSFER.getValue(), null, null, null, null, 
toSavingsAccount, account,
                     isRegularTransaction, isExceptionForBalanceCheck);
             
this.accountTransfersWritePlatformService.transferFunds(accountTransferDTO);
+            updateAlreadyPostedTransactions(existingTransactionIds, account);  
         } else {
             final SavingsAccountTransaction withdrawal = 
this.handleWithdrawal(account, fmt, closedDate, account.getAccountBalance(),
                     paymentDetail, false, isRegularTransaction);
             savingsTransactionId = withdrawal.getId();
         }
 
-        /***
-         * Update account transactionIds for post journal entries.
-         */
-        updateExistingTransactionsDetails(account, existingTransactionIds, 
existingReversedTransactionIds);
         account.close(user, command, tenantsTodayDate, changes);
 
         this.savingsAccountRepository.save(account);
@@ -348,12 +349,17 @@ public class DepositAccountDomainServiceJpa implements 
DepositAccountDomainServi
         final boolean isPreMatureClosure = true;
         final Set<Long> existingTransactionIds = new HashSet<>();
         final Set<Long> existingReversedTransactionIds = new HashSet<>();
+        /***
+         * Update account transactionIds for post journal entries.
+         */
         updateExistingTransactionsDetails(account, existingTransactionIds, 
existingReversedTransactionIds);
 
         final LocalDate closedDate = 
command.localDateValueOfParameterNamed(SavingsApiConstants.closedOnDateParamName);
         final Locale locale = command.extractLocale();
         final DateTimeFormatter fmt = 
DateTimeFormat.forPattern(command.dateFormat()).withLocale(locale);
         Long savingsTransactionId = null;
+       
+        
         // post interest
         account.postPreMaturityInterest(closedDate, isPreMatureClosure, 
isSavingsInterestPostingAtCurrentPeriodEnd,
                 financialYearBeginningMonth);
@@ -372,16 +378,14 @@ public class DepositAccountDomainServiceJpa implements 
DepositAccountDomainServi
                     null, null, null, 
AccountTransferType.ACCOUNT_TRANSFER.getValue(), null, null, null, null, 
toSavingsAccount, account,
                     isRegularTransaction, isExceptionForBalanceCheck);
             
this.accountTransfersWritePlatformService.transferFunds(accountTransferDTO);
+            updateAlreadyPostedTransactions(existingTransactionIds, account);  
        
         } else {
             final SavingsAccountTransaction withdrawal = 
this.handleWithdrawal(account, fmt, closedDate, account.getAccountBalance(),
                     paymentDetail, false, isRegularTransaction);
             savingsTransactionId = withdrawal.getId();
         }
 
-        /***
-         * Update account transactionIds for post journal entries.
-         */
-        updateExistingTransactionsDetails(account, existingTransactionIds, 
existingReversedTransactionIds);
+      
         account.prematureClosure(user, command, tenantsTodayDate, changes);
 
         this.savingsAccountRepository.save(account);
@@ -404,6 +408,9 @@ public class DepositAccountDomainServiceJpa implements 
DepositAccountDomainServi
         boolean isRegularTransaction = false;
         final Set<Long> existingTransactionIds = new HashSet<>();
         final Set<Long> existingReversedTransactionIds = new HashSet<>();
+        /***
+         * Update account transactionIds for post journal entries.
+         */
         updateExistingTransactionsDetails(account, existingTransactionIds, 
existingReversedTransactionIds);
 
         final LocalDate closedDate = 
command.localDateValueOfParameterNamed(SavingsApiConstants.closedOnDateParamName);
@@ -428,16 +435,13 @@ public class DepositAccountDomainServiceJpa implements 
DepositAccountDomainServi
                     null, null, null, 
AccountTransferType.ACCOUNT_TRANSFER.getValue(), null, null, null, null, 
toSavingsAccount, account,
                     isRegularTransaction, isExceptionForBalanceCheck);
             
this.accountTransfersWritePlatformService.transferFunds(accountTransferDTO);
+            updateAlreadyPostedTransactions(existingTransactionIds, account);  
         } else {
             final SavingsAccountTransaction withdrawal = 
this.handleWithdrawal(account, fmt, closedDate, account.getAccountBalance(),
                     paymentDetail, false, isRegularTransaction);
             savingsTransactionId = withdrawal.getId();
         }
 
-        /***
-         * Update account transactionIds for post journal entries.
-         */
-        updateExistingTransactionsDetails(account, existingTransactionIds, 
existingReversedTransactionIds);
         account.prematureClosure(user, command, tenantsTodayDate, changes);
         this.savingsAccountRepository.save(account);
         postJournalEntries(account, existingTransactionIds, 
existingReversedTransactionIds, isAccountTransfer);
@@ -460,4 +464,17 @@ public class DepositAccountDomainServiceJpa implements 
DepositAccountDomainServi
                 existingTransactionIds, existingReversedTransactionIds, 
isAccountTransfer);
         
this.journalEntryWritePlatformService.createJournalEntriesForSavings(accountingBridgeData);
     }
+
+    private void updateAlreadyPostedTransactions(final Set<Long> 
existingTransactionIds, final SavingsAccount savingsAccount) {
+        List<SavingsAccountTransaction> transactions = 
savingsAccount.getTransactions();
+        int size = transactions.size();
+        for (int i = size - 1;; i--) {
+            SavingsAccountTransaction transaction = transactions.get(i);
+            if (transaction.isWithdrawal() || transaction.isWithdrawalFee()) {
+                existingTransactionIds.add(transaction.getId());
+            } else {
+                break;
+            }
+        }
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositProductAssembler.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositProductAssembler.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositProductAssembler.java
index dcd446c..3506f25 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositProductAssembler.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositProductAssembler.java
@@ -36,6 +36,7 @@ import static 
org.apache.fineract.portfolio.savings.DepositsApiConstants.minDepo
 import static 
org.apache.fineract.portfolio.savings.DepositsApiConstants.preClosurePenalApplicableParamName;
 import static 
org.apache.fineract.portfolio.savings.DepositsApiConstants.preClosurePenalInterestOnTypeIdParamName;
 import static 
org.apache.fineract.portfolio.savings.DepositsApiConstants.preClosurePenalInterestParamName;
+import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.withHoldTaxParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.chargesParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.currencyCodeParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.descriptionParamName;
@@ -52,6 +53,7 @@ import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.minBalan
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.nameParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.nominalAnnualInterestRateParamName;
 import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.shortNameParamName;
+import static 
org.apache.fineract.portfolio.savings.SavingsApiConstants.taxGroupIdParamName;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
@@ -77,6 +79,8 @@ import 
org.apache.fineract.portfolio.savings.SavingsInterestCalculationDaysInYea
 import org.apache.fineract.portfolio.savings.SavingsInterestCalculationType;
 import org.apache.fineract.portfolio.savings.SavingsPeriodFrequencyType;
 import org.apache.fineract.portfolio.savings.SavingsPostingInterestPeriodType;
+import org.apache.fineract.portfolio.tax.domain.TaxGroup;
+import org.apache.fineract.portfolio.tax.domain.TaxGroupRepositoryWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -88,11 +92,14 @@ public class DepositProductAssembler {
 
     private final ChargeRepositoryWrapper chargeRepository;
     private final InterestRateChartAssembler chartAssembler;
+    private final TaxGroupRepositoryWrapper taxGroupRepository;
 
     @Autowired
-    public DepositProductAssembler(final ChargeRepositoryWrapper 
chargeRepository, final InterestRateChartAssembler chartAssembler) {
+    public DepositProductAssembler(final ChargeRepositoryWrapper 
chargeRepository, final InterestRateChartAssembler chartAssembler,
+            final TaxGroupRepositoryWrapper taxGroupRepository) {
         this.chargeRepository = chargeRepository;
         this.chartAssembler = chartAssembler;
+        this.taxGroupRepository = taxGroupRepository;
     }
 
     public FixedDepositProduct assembleFixedDepositProduct(final JsonCommand 
command) {
@@ -162,10 +169,18 @@ public class DepositProductAssembler {
         if (interestRate == null) {
             interestRate = BigDecimal.ZERO;
         }
+        boolean withHoldTax = 
command.booleanPrimitiveValueOfParameterNamed(withHoldTaxParamName);
+
+        final Long taxGroupId = 
command.longValueOfParameterNamed(taxGroupIdParamName);
+        TaxGroup taxGroup = null;
+        if (taxGroupId != null) {
+            taxGroup = 
this.taxGroupRepository.findOneWithNotFoundDetection(taxGroupId);
+        }
+
         FixedDepositProduct fixedDepositProduct = 
FixedDepositProduct.createNew(name, shortName, description, currency, 
interestRate,
                 interestCompoundingPeriodType, interestPostingPeriodType, 
interestCalculationType, interestCalculationDaysInYearType,
                 lockinPeriodFrequency, lockinPeriodFrequencyType, 
accountingRuleType, charges, productTermAndPreClosure, charts,
-                minBalanceForInterestCalculation);
+                minBalanceForInterestCalculation, withHoldTax, taxGroup);
 
         // update product reference
         productTermAndPreClosure.updateProductReference(fixedDepositProduct);
@@ -250,10 +265,13 @@ public class DepositProductAssembler {
             interestRate = BigDecimal.ZERO;
         }
 
+        final boolean withHoldTax = 
command.booleanPrimitiveValueOfParameterNamed(withHoldTaxParamName);
+        final TaxGroup taxGroup = assembleTaxGroup(command);
+
         RecurringDepositProduct recurringDepositProduct = 
RecurringDepositProduct.createNew(name, shortName, description, currency,
                 interestRate, interestCompoundingPeriodType, 
interestPostingPeriodType, interestCalculationType,
                 interestCalculationDaysInYearType, lockinPeriodFrequency, 
lockinPeriodFrequencyType, accountingRuleType, charges,
-                productTermAndPreClosure, productRecurringDetail, charts, 
minBalanceForInterestCalculation);
+                productTermAndPreClosure, productRecurringDetail, charts, 
minBalanceForInterestCalculation, taxGroup, withHoldTax);
 
         // update product reference
         
productTermAndPreClosure.updateProductReference(recurringDepositProduct);
@@ -491,4 +509,13 @@ public class DepositProductAssembler {
 
         return depositRecurringDetail;
     }
+
+    public TaxGroup assembleTaxGroup(final JsonCommand command) {
+        final Long taxGroupId = 
command.longValueOfParameterNamed(taxGroupIdParamName);
+        TaxGroup taxGroup = null;
+        if (taxGroupId != null) {
+            taxGroup = 
this.taxGroupRepository.findOneWithNotFoundDetection(taxGroupId);
+        }
+        return taxGroup;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositAccount.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositAccount.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositAccount.java
index f713836..1cbc725 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositAccount.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositAccount.java
@@ -94,7 +94,7 @@ public class FixedDepositAccount extends SavingsAccount {
             final SavingsInterestCalculationDaysInYearType 
interestCalculationDaysInYearType, final BigDecimal minRequiredOpeningBalance,
             final Integer lockinPeriodFrequency, final 
SavingsPeriodFrequencyType lockinPeriodFrequencyType,
             final boolean withdrawalFeeApplicableForTransfer, final 
Set<SavingsAccountCharge> savingsAccountCharges,
-            final DepositAccountTermAndPreClosure accountTermAndPreClosure, 
final DepositAccountInterestRateChart chart) {
+            final DepositAccountTermAndPreClosure accountTermAndPreClosure, 
final DepositAccountInterestRateChart chart, boolean withHoldTax) {
 
         final SavingsAccountStatusType status = 
SavingsAccountStatusType.SUBMITTED_AND_PENDING_APPROVAL;
         final boolean allowOverdraft = false;
@@ -103,7 +103,7 @@ public class FixedDepositAccount extends SavingsAccount {
                 accountType, submittedOnDate, submittedBy, interestRate, 
interestCompoundingPeriodType, interestPostingPeriodType,
                 interestCalculationType, interestCalculationDaysInYearType, 
minRequiredOpeningBalance, lockinPeriodFrequency,
                 lockinPeriodFrequencyType, withdrawalFeeApplicableForTransfer, 
savingsAccountCharges, accountTermAndPreClosure, chart,
-                allowOverdraft, overdraftLimit);
+                allowOverdraft, overdraftLimit, withHoldTax);
 
         return account;
     }
@@ -117,12 +117,12 @@ public class FixedDepositAccount extends SavingsAccount {
             final Integer lockinPeriodFrequency, final 
SavingsPeriodFrequencyType lockinPeriodFrequencyType,
             final boolean withdrawalFeeApplicableForTransfer, final 
Set<SavingsAccountCharge> savingsAccountCharges,
             final DepositAccountTermAndPreClosure accountTermAndPreClosure, 
DepositAccountInterestRateChart chart,
-            final boolean allowOverdraft, final BigDecimal overdraftLimit) {
+            final boolean allowOverdraft, final BigDecimal overdraftLimit, 
boolean withHoldTax) {
 
         super(client, group, product, fieldOfficer, accountNo, externalId, 
status, accountType, submittedOnDate, submittedBy,
                 nominalAnnualInterestRate, interestCompoundingPeriodType, 
interestPostingPeriodType, interestCalculationType,
                 interestCalculationDaysInYearType, minRequiredOpeningBalance, 
lockinPeriodFrequency, lockinPeriodFrequencyType,
-                withdrawalFeeApplicableForTransfer, savingsAccountCharges, 
allowOverdraft, overdraftLimit);
+                withdrawalFeeApplicableForTransfer, savingsAccountCharges, 
allowOverdraft, overdraftLimit, withHoldTax);
 
         this.accountTermAndPreClosure = accountTermAndPreClosure;
         this.chart = chart;
@@ -525,7 +525,7 @@ public class FixedDepositAccount extends SavingsAccount {
                 }
             }
         }
-
+        recalucateDailyBalanceDetails = 
applyWithholdTaxForDepositAccounts(interestPostingUpToDate, 
recalucateDailyBalanceDetails);
         if (recalucateDailyBalanceDetails) {
             // update existing transactions so derived balance fields are
             // correct.
@@ -555,6 +555,8 @@ public class FixedDepositAccount extends SavingsAccount {
             recalucateDailyBalance = true;
         }
 
+        recalucateDailyBalance = 
applyWithholdTaxForDepositAccounts(accountCloseDate, recalucateDailyBalance);
+
         if (recalucateDailyBalance) {
             // update existing transactions so derived balance fields are
             // correct.
@@ -768,11 +770,12 @@ public class FixedDepositAccount extends SavingsAccount {
         final Integer lockinPeriodFrequency = this.lockinPeriodFrequency;
         final boolean withdrawalFeeApplicableForTransfer = false;
         final String accountNumber = null;
-        final FixedDepositAccount reInvestedAccount = FixedDepositAccount
-                .createNewApplicationForSubmittal(client, group, product, 
savingsOfficer, accountNumber, externalId, accountType,
-                        getClosedOnDate(), closedBy, interestRate, 
compoundingPeriodType, postingPeriodType, interestCalculationType,
-                        daysInYearType, minRequiredOpeningBalance, 
lockinPeriodFrequency, lockinPeriodFrequencyType,
-                        withdrawalFeeApplicableForTransfer, 
savingsAccountCharges, newAccountTermAndPreClosure, newChart);
+        final boolean withHoldTax = this.withHoldTax;
+        final FixedDepositAccount reInvestedAccount = 
FixedDepositAccount.createNewApplicationForSubmittal(client, group, product,
+                savingsOfficer, accountNumber, externalId, accountType, 
getClosedOnDate(), closedBy, interestRate, compoundingPeriodType,
+                postingPeriodType, interestCalculationType, daysInYearType, 
minRequiredOpeningBalance, lockinPeriodFrequency,
+                lockinPeriodFrequencyType, withdrawalFeeApplicableForTransfer, 
savingsAccountCharges, newAccountTermAndPreClosure,
+                newChart, withHoldTax);
 
         newAccountTermAndPreClosure.updateAccountReference(reInvestedAccount);
         newChart.updateDepositAccountReference(reInvestedAccount);

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositProduct.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositProduct.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositProduct.java
index 9e4e075..65fc582 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositProduct.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositProduct.java
@@ -59,6 +59,7 @@ import 
org.apache.fineract.portfolio.savings.SavingsInterestCalculationDaysInYea
 import org.apache.fineract.portfolio.savings.SavingsInterestCalculationType;
 import org.apache.fineract.portfolio.savings.SavingsPeriodFrequencyType;
 import org.apache.fineract.portfolio.savings.SavingsPostingInterestPeriodType;
+import org.apache.fineract.portfolio.tax.domain.TaxGroup;
 import org.joda.time.LocalDate;
 
 import com.google.gson.JsonArray;
@@ -89,7 +90,7 @@ public class FixedDepositProduct extends SavingsProduct {
             final SavingsInterestCalculationDaysInYearType 
interestCalculationDaysInYearType, final Integer lockinPeriodFrequency,
             final SavingsPeriodFrequencyType lockinPeriodFrequencyType, final 
AccountingRuleType accountingRuleType,
             final Set<Charge> charges, final DepositProductTermAndPreClosure 
productTermAndPreClosure, final Set<InterestRateChart> charts,
-            BigDecimal minBalanceForInterestCalculation) {
+            BigDecimal minBalanceForInterestCalculation, boolean withHoldTax, 
TaxGroup taxGroup) {
 
         final BigDecimal minRequiredOpeningBalance = null;
         final boolean withdrawalFeeApplicableForTransfer = false;
@@ -99,7 +100,8 @@ public class FixedDepositProduct extends SavingsProduct {
         return new FixedDepositProduct(name, shortName, description, currency, 
interestRate, interestCompoundingPeriodType,
                 interestPostingPeriodType, interestCalculationType, 
interestCalculationDaysInYearType, minRequiredOpeningBalance,
                 lockinPeriodFrequency, lockinPeriodFrequencyType, 
withdrawalFeeApplicableForTransfer, accountingRuleType, charges,
-                productTermAndPreClosure, charts, allowOverdraft, 
overdraftLimit, minBalanceForInterestCalculation);
+                productTermAndPreClosure, charts, allowOverdraft, 
overdraftLimit, minBalanceForInterestCalculation, withHoldTax,
+                taxGroup);
     }
 
     protected FixedDepositProduct(final String name, final String shortName, 
final String description, final MonetaryCurrency currency,
@@ -109,12 +111,13 @@ public class FixedDepositProduct extends SavingsProduct {
             final Integer lockinPeriodFrequency, final 
SavingsPeriodFrequencyType lockinPeriodFrequencyType,
             final boolean withdrawalFeeApplicableForTransfer, final 
AccountingRuleType accountingRuleType, final Set<Charge> charges,
             final DepositProductTermAndPreClosure productTermAndPreClosure, 
final Set<InterestRateChart> charts,
-            final boolean allowOverdraft, final BigDecimal overdraftLimit, 
final BigDecimal minBalanceForInterestCalculation) {
+            final boolean allowOverdraft, final BigDecimal overdraftLimit, 
final BigDecimal minBalanceForInterestCalculation,
+            boolean withHoldTax, TaxGroup taxGroup) {
 
         super(name, shortName, description, currency, interestRate, 
interestCompoundingPeriodType, interestPostingPeriodType,
                 interestCalculationType, interestCalculationDaysInYearType, 
minRequiredOpeningBalance, lockinPeriodFrequency,
                 lockinPeriodFrequencyType, withdrawalFeeApplicableForTransfer, 
accountingRuleType, charges, allowOverdraft, overdraftLimit,
-                minBalanceForInterestCalculation);
+                minBalanceForInterestCalculation, withHoldTax, taxGroup);
 
         if (charts != null) {
             this.charts = charts;
@@ -198,7 +201,8 @@ public class FixedDepositProduct extends SavingsProduct {
                         }
                     } else {
                         // assemble chart
-                        final InterestRateChart newChart = 
this.chartAssembler.assembleFrom(chartElement, this.currency().getCode(), 
baseDataValidator);
+                        final InterestRateChart newChart = 
this.chartAssembler.assembleFrom(chartElement, this.currency().getCode(),
+                                baseDataValidator);
                         this.addChart(newChart);
                     }
                 }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/3015747f/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositAccount.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositAccount.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositAccount.java
index 1bf4e52..cc67fe2 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositAccount.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositAccount.java
@@ -106,7 +106,7 @@ public class RecurringDepositAccount extends SavingsAccount 
{
             final Integer lockinPeriodFrequency, final 
SavingsPeriodFrequencyType lockinPeriodFrequencyType,
             final boolean withdrawalFeeApplicableForTransfer, final 
Set<SavingsAccountCharge> savingsAccountCharges,
             final DepositAccountTermAndPreClosure accountTermAndPreClosure, 
final DepositAccountRecurringDetail recurringDetail,
-            final DepositAccountInterestRateChart chart) {
+            final DepositAccountInterestRateChart chart, final boolean 
withHoldTax) {
 
         final boolean allowOverdraft = false;
         final BigDecimal overdraftLimit = new BigDecimal(0);
@@ -116,7 +116,7 @@ public class RecurringDepositAccount extends SavingsAccount 
{
                 submittedOnDate, submittedBy, interestRate, 
interestCompoundingPeriodType, interestPostingPeriodType,
                 interestCalculationType, interestCalculationDaysInYearType, 
minRequiredOpeningBalance, lockinPeriodFrequency,
                 lockinPeriodFrequencyType, withdrawalFeeApplicableForTransfer, 
savingsAccountCharges, accountTermAndPreClosure,
-                recurringDetail, chart, allowOverdraft, overdraftLimit);
+                recurringDetail, chart, allowOverdraft, overdraftLimit, 
withHoldTax);
     }
 
     public static RecurringDepositAccount createNewActivatedAccount(final 
Client client, final Group group, final SavingsProduct product,
@@ -128,7 +128,7 @@ public class RecurringDepositAccount extends SavingsAccount 
{
             final Integer lockinPeriodFrequency, final 
SavingsPeriodFrequencyType lockinPeriodFrequencyType,
             final boolean withdrawalFeeApplicableForTransfer, final 
Set<SavingsAccountCharge> savingsAccountCharges,
             final DepositAccountTermAndPreClosure accountTermAndPreClosure, 
final DepositAccountRecurringDetail recurringDetail,
-            final DepositAccountInterestRateChart chart) {
+            final DepositAccountInterestRateChart chart, final boolean 
withHoldTax) {
 
         final boolean allowOverdraft = false;
         final BigDecimal overdraftLimit = new BigDecimal(0);
@@ -138,7 +138,7 @@ public class RecurringDepositAccount extends SavingsAccount 
{
                 submittedOnDate, submittedBy, interestRate, 
interestCompoundingPeriodType, interestPostingPeriodType,
                 interestCalculationType, interestCalculationDaysInYearType, 
minRequiredOpeningBalance, lockinPeriodFrequency,
                 lockinPeriodFrequencyType, withdrawalFeeApplicableForTransfer, 
savingsAccountCharges, accountTermAndPreClosure,
-                recurringDetail, chart, allowOverdraft, overdraftLimit);
+                recurringDetail, chart, allowOverdraft, overdraftLimit, 
withHoldTax);
     }
 
     private RecurringDepositAccount(final Client client, final Group group, 
final SavingsProduct product, final Staff fieldOfficer,
@@ -150,12 +150,13 @@ public class RecurringDepositAccount extends 
SavingsAccount {
             final Integer lockinPeriodFrequency, final 
SavingsPeriodFrequencyType lockinPeriodFrequencyType,
             final boolean withdrawalFeeApplicableForTransfer, final 
Set<SavingsAccountCharge> savingsAccountCharges,
             final DepositAccountTermAndPreClosure accountTermAndPreClosure, 
final DepositAccountRecurringDetail recurringDetail,
-            final DepositAccountInterestRateChart chart, final boolean 
allowOverdraft, final BigDecimal overdraftLimit) {
+            final DepositAccountInterestRateChart chart, final boolean 
allowOverdraft, final BigDecimal overdraftLimit,
+            final boolean withHoldTax) {
 
         super(client, group, product, fieldOfficer, accountNo, externalId, 
status, accountType, submittedOnDate, submittedBy,
                 nominalAnnualInterestRate, interestCompoundingPeriodType, 
interestPostingPeriodType, interestCalculationType,
                 interestCalculationDaysInYearType, minRequiredOpeningBalance, 
lockinPeriodFrequency, lockinPeriodFrequencyType,
-                withdrawalFeeApplicableForTransfer, savingsAccountCharges, 
allowOverdraft, overdraftLimit);
+                withdrawalFeeApplicableForTransfer, savingsAccountCharges, 
allowOverdraft, overdraftLimit, withHoldTax);
 
         this.accountTermAndPreClosure = accountTermAndPreClosure;
         this.recurringDetail = recurringDetail;
@@ -632,7 +633,7 @@ public class RecurringDepositAccount extends SavingsAccount 
{
                 }
             }
         }
-
+        applyWithholdTaxForDepositAccounts(interestPostingUpToDate, 
recalucateDailyBalanceDetails);
         if (recalucateDailyBalanceDetails) {
             // update existing transactions so derived balance fields are
             // correct.
@@ -663,6 +664,8 @@ public class RecurringDepositAccount extends SavingsAccount 
{
             recalucateDailyBalance = true;
         }
 
+        applyWithholdTaxForDepositAccounts(accountCloseDate, 
recalucateDailyBalance);
+
         if (recalucateDailyBalance) {
             // update existing transactions so derived balance fields are
             // correct.
@@ -1083,7 +1086,7 @@ public class RecurringDepositAccount extends 
SavingsAccount {
                 accountNumber, externalId, accountType, getClosedOnDate(), 
closedBy, interestRate, compoundingPeriodType,
                 postingPeriodType, interestCalculationType, daysInYearType, 
minRequiredOpeningBalance, lockinPeriodFrequency,
                 lockinPeriodFrequencyType, withdrawalFeeApplicableForTransfer, 
savingsAccountCharges, newAccountTermAndPreClosure,
-                recurringDetail, newChart);
+                recurringDetail, newChart, withHoldTax);
 
         rdAccount.setDatesFrom(now);
         newAccountTermAndPreClosure.updateAccountReference(rdAccount);


Reply via email to