http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRescheduleRequestToTermVariationMapping.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRescheduleRequestToTermVariationMapping.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRescheduleRequestToTermVariationMapping.java
index af9a8e2..e6976a8 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRescheduleRequestToTermVariationMapping.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRescheduleRequestToTermVariationMapping.java
@@ -23,11 +23,12 @@ import javax.persistence.Entity;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name="m_loan_reschedule_request_term_variations_mapping")
-public class LoanRescheduleRequestToTermVariationMapping extends 
AbstractPersistable<Long> {
+public class LoanRescheduleRequestToTermVariationMapping extends 
AbstractPersistableCustom<Long> {
     
     
     @ManyToOne(optional = false, cascade = CascadeType.PERSIST)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariations.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariations.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariations.java
index 6dbadad..6171a02 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariations.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariations.java
@@ -30,15 +30,16 @@ import javax.persistence.OneToOne;
 import javax.persistence.Table;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
+
 import org.apache.fineract.infrastructure.core.data.EnumOptionData;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 import org.apache.fineract.portfolio.loanaccount.data.LoanTermVariationsData;
 import org.apache.fineract.portfolio.loanproduct.service.LoanEnumerations;
 import org.joda.time.LocalDate;
-import org.springframework.data.jpa.domain.AbstractPersistable;
 
 @Entity
 @Table(name = "m_loan_term_variations")
-public class LoanTermVariations extends AbstractPersistable<Long> {
+public class LoanTermVariations extends AbstractPersistableCustom<Long> {
 
     @ManyToOne(optional = false)
     @JoinColumn(name = "loan_id", nullable = false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTopupDetails.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTopupDetails.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTopupDetails.java
index 106654e..1708bb3 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTopupDetails.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTopupDetails.java
@@ -18,16 +18,19 @@
  */
 package org.apache.fineract.portfolio.loanaccount.domain;
 
-import org.apache.fineract.portfolio.account.domain.AccountTransferDetails;
-import org.springframework.data.jpa.domain.AbstractPersistable;
-import org.springframework.stereotype.Component;
-
-import javax.persistence.*;
 import java.math.BigDecimal;
 
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
+
 @Entity
 @Table(name = "m_loan_topup")
-public class LoanTopupDetails  extends AbstractPersistable<Long> {
+public class LoanTopupDetails  extends AbstractPersistableCustom<Long> {
 
         @OneToOne
         @JoinColumn(name = "loan_id", nullable = false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTrancheCharge.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTrancheCharge.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTrancheCharge.java
index 35860c8..5c6a8a6 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTrancheCharge.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTrancheCharge.java
@@ -24,12 +24,12 @@ import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 import org.apache.fineract.portfolio.charge.domain.Charge;
-import org.springframework.data.jpa.domain.AbstractPersistable;
 
 @Entity
 @Table(name = "m_loan_tranche_charges")
-public class LoanTrancheCharge extends AbstractPersistable<Long> {
+public class LoanTrancheCharge extends AbstractPersistableCustom<Long> {
 
     @ManyToOne(cascade = CascadeType.ALL, optional = false)
     @JoinColumn(name = "loan_id", nullable = false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTrancheDisbursementCharge.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTrancheDisbursementCharge.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTrancheDisbursementCharge.java
index fa65d0d..d2258ce 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTrancheDisbursementCharge.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTrancheDisbursementCharge.java
@@ -23,11 +23,12 @@ import javax.persistence.Entity;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name="m_loan_tranche_disbursement_charge")
-public class LoanTrancheDisbursementCharge extends AbstractPersistable<Long> {
+public class LoanTrancheDisbursementCharge extends 
AbstractPersistableCustom<Long> {
     
     @ManyToOne
     @JoinColumn(name = "loan_charge_id", referencedColumnName = "id", nullable 
= false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransaction.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransaction.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransaction.java
index 7b16a5c..3dc1cb7 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransaction.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransaction.java
@@ -40,6 +40,7 @@ import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 import javax.persistence.UniqueConstraint;
 
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 import org.apache.fineract.infrastructure.core.service.DateUtils;
 import org.apache.fineract.organisation.monetary.data.CurrencyData;
 import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
@@ -54,7 +55,6 @@ import 
org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail;
 import org.apache.fineract.useradministration.domain.AppUser;
 import org.joda.time.LocalDate;
 import org.joda.time.LocalDateTime;
-import org.springframework.data.jpa.domain.AbstractPersistable;
 
 /**
  * All monetary transactions against a loan are modelled through this entity.
@@ -62,7 +62,7 @@ import 
org.springframework.data.jpa.domain.AbstractPersistable;
  */
 @Entity
 @Table(name = "m_loan_transaction", uniqueConstraints = { 
@UniqueConstraint(columnNames = { "external_id" }, name = "external_id_UNIQUE") 
})
-public final class LoanTransaction extends AbstractPersistable<Long> {
+public class LoanTransaction extends AbstractPersistableCustom<Long> {
 
     @ManyToOne(optional = false)
     @JoinColumn(name = "loan_id", nullable = false)
@@ -77,15 +77,15 @@ public final class LoanTransaction extends 
AbstractPersistable<Long> {
     private PaymentDetail paymentDetail;
 
     @Column(name = "transaction_type_enum", nullable = false)
-    private final Integer typeOf;
+    private Integer typeOf;
 
     @Temporal(TemporalType.DATE)
     @Column(name = "transaction_date", nullable = false)
-    private final Date dateOf;
+    private Date dateOf;
 
     @Temporal(TemporalType.DATE)
     @Column(name = "submitted_on_date", nullable = false)
-    private final Date submittedOnDate;
+    private Date submittedOnDate;
 
     @Column(name = "amount", scale = 6, precision = 19, nullable = false)
     private BigDecimal amount;
@@ -118,9 +118,9 @@ public final class LoanTransaction extends 
AbstractPersistable<Long> {
     @Column(name = "created_date", nullable = false)
     private Date createdDate;
 
-    @ManyToOne
+    @ManyToOne(fetch=FetchType.LAZY)
     @JoinColumn(name = "appuser_id", nullable = true)
-    private final AppUser appUser;
+    private AppUser appUser;
 
     @OneToMany(cascade = CascadeType.ALL, mappedBy = "loanTransaction", 
orphanRemoval = true, fetch=FetchType.EAGER)
     private Set<LoanChargePaidBy> loanChargesPaid = new HashSet<>();
@@ -136,12 +136,12 @@ public final class LoanTransaction extends 
AbstractPersistable<Long> {
     private Set<LoanTransactionToRepaymentScheduleMapping> 
loanTransactionToRepaymentScheduleMappings = new HashSet<>();
 
     protected LoanTransaction() {
-        this.loan = null;
+       /* this.loan = null;
         this.dateOf = null;
         this.typeOf = null;
         this.submittedOnDate = DateUtils.getDateOfTenant();
         this.createdDate = new Date();
-        this.appUser = null;
+        this.appUser = null;*/
     }
 
     public static LoanTransaction incomePosting(final Loan loan, final Office 
office, final Date dateOf, final BigDecimal amount,

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionToRepaymentScheduleMapping.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionToRepaymentScheduleMapping.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionToRepaymentScheduleMapping.java
index 78d19cc..7e4685c 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionToRepaymentScheduleMapping.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionToRepaymentScheduleMapping.java
@@ -27,13 +27,13 @@ import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
 import org.apache.fineract.organisation.monetary.domain.Money;
-import org.springframework.data.jpa.domain.AbstractPersistable;
 
 @Entity
 @Table(name = "m_loan_transaction_repayment_schedule_mapping")
-public class LoanTransactionToRepaymentScheduleMapping extends 
AbstractPersistable<Long> {
+public class LoanTransactionToRepaymentScheduleMapping extends 
AbstractPersistableCustom<Long> {
 
     @ManyToOne(optional = false, cascade = CascadeType.PERSIST)
     @JoinColumn(name = "loan_repayment_schedule_id", nullable = false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/domain/Guarantor.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/domain/Guarantor.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/domain/Guarantor.java
index b52e4e7..730f60a 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/domain/Guarantor.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/domain/Guarantor.java
@@ -40,11 +40,11 @@ import 
org.apache.fineract.infrastructure.codes.domain.CodeValue;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.portfolio.loanaccount.domain.Loan;
 import 
org.apache.fineract.portfolio.loanaccount.guarantor.GuarantorConstants.GUARANTOR_JSON_INPUT_PARAMS;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_guarantor")
-public class Guarantor extends AbstractPersistable<Long> {
+public class Guarantor extends AbstractPersistableCustom<Long> {
 
     @ManyToOne
     @JoinColumn(name = "loan_id", nullable = false)
@@ -101,7 +101,7 @@ public class Guarantor extends AbstractPersistable<Long> {
     private boolean active;
 
     @OneToMany(cascade = CascadeType.ALL, mappedBy = "guarantor", 
orphanRemoval = true, fetch=FetchType.EAGER)
-    private final List<GuarantorFundingDetails> guarantorFundDetails = new 
ArrayList<>();
+    private List<GuarantorFundingDetails> guarantorFundDetails = new 
ArrayList<>();
 
     protected Guarantor() {
 

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/domain/GuarantorFundingDetails.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/domain/GuarantorFundingDetails.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/domain/GuarantorFundingDetails.java
index 0179cb2..993c0d7 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/domain/GuarantorFundingDetails.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/domain/GuarantorFundingDetails.java
@@ -34,11 +34,11 @@ import javax.persistence.Table;
 import org.apache.fineract.portfolio.account.domain.AccountAssociations;
 import org.apache.fineract.portfolio.loanaccount.domain.Loan;
 import org.apache.fineract.portfolio.savings.domain.SavingsAccount;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_guarantor_funding_details")
-public class GuarantorFundingDetails extends AbstractPersistable<Long> {
+public class GuarantorFundingDetails extends AbstractPersistableCustom<Long> {
 
     @ManyToOne
     @JoinColumn(name = "guarantor_id", nullable = false)
@@ -64,7 +64,7 @@ public class GuarantorFundingDetails extends 
AbstractPersistable<Long> {
     private BigDecimal amountTransfered;
 
     @OneToMany(cascade = CascadeType.ALL, mappedBy = 
"guarantorFundingDetails", orphanRemoval = true, fetch=FetchType.EAGER)
-    private final List<GuarantorFundingTransaction> 
guarantorFundingTransactions = new ArrayList<>();
+    private List<GuarantorFundingTransaction> guarantorFundingTransactions = 
new ArrayList<>();
 
     protected GuarantorFundingDetails() {}
 

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/domain/GuarantorFundingTransaction.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/domain/GuarantorFundingTransaction.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/domain/GuarantorFundingTransaction.java
index aa12fb8..2c6edb1 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/domain/GuarantorFundingTransaction.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/domain/GuarantorFundingTransaction.java
@@ -29,11 +29,11 @@ import javax.persistence.Table;
 
 import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction;
 import 
org.apache.fineract.portfolio.savings.domain.DepositAccountOnHoldTransaction;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_guarantor_transaction")
-public class GuarantorFundingTransaction extends AbstractPersistable<Long> {
+public class GuarantorFundingTransaction extends 
AbstractPersistableCustom<Long> {
 
     @ManyToOne
     @JoinColumn(name = "guarantor_fund_detail_id", nullable = false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/domain/GuarantorFundingTransactionRepository.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/domain/GuarantorFundingTransactionRepository.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/domain/GuarantorFundingTransactionRepository.java
index adb7523..4e4f7a0 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/domain/GuarantorFundingTransactionRepository.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/domain/GuarantorFundingTransactionRepository.java
@@ -28,7 +28,7 @@ import org.springframework.data.repository.query.Param;
 public interface GuarantorFundingTransactionRepository extends 
JpaRepository<GuarantorFundingTransaction, Long>,
         JpaSpecificationExecutor<GuarantorFundingTransaction> {
 
-    @Query("from GuarantorFundingTransaction ft where ft.loanTransaction.id in 
(:loanTransactions)")
+    @Query("select ft from GuarantorFundingTransaction ft where 
ft.loanTransaction.id in (:loanTransactions)")
     List<GuarantorFundingTransaction> 
fetchGuarantorFundingTransactions(@Param("loanTransactions") List<Long> 
loanTransactions);
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java
index d249e35..bf4a64b 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java
@@ -1373,32 +1373,32 @@ public abstract class AbstractLoanScheduleGenerator 
implements LoanScheduleGener
                         params.getActualRepaymentDate(), applicableVariations);
                 Money interest = principalInterestForThisPeriod.interest();
                 totalInterest = totalInterest.plus(interest);
-
-                Money uncompounded = params.getUnCompoundedAmount();
-                Money compounded = uncompounded.zero();
-                for (Map.Entry<LocalDate, Money> mapEntry : 
params.getCompoundingMap().entrySet()) {
-                    if 
(mapEntry.getKey().isAfter(params.getPeriodStartDate())) {
-                        compounded = compounded.plus(mapEntry.getValue());
-                    }
-                }
-                if (compounded.isGreaterThanZero() && 
startDate.isEqual(additionalPeriodsStartDate)) {
-                    
params.setCompoundedInLastInstallment(uncompoundedFromLastInstallment);// 
uncompounded in last installment
-                    additionalPeriodsStartDate = 
additionalPeriodsStartDate.plusDays(1);
-                }
-                Money compoundedForThisPeriod = compounded.minus(uncompounded);
-                Money uncompoundedForThisPeriod = 
interest.minus(compoundedForThisPeriod);
-                params.setUnCompoundedAmount(uncompoundedForThisPeriod);
-                LocalDate compoundingDate = params.getPeriodStartDate();
-                if (loanApplicationTerms.allowCompoundingOnEod()) {
-                    compoundingDate = compoundingDate.minusDays(1);
-                }
-                compoundingDate = getNextCompoundScheduleDate(compoundingDate, 
loanApplicationTerms, holidayDetailDTO);
-                if(compoundingDate.isEqual(params.getActualRepaymentDate())){
-                    params.getCompoundingMap().put(compoundingDate, 
uncompoundedForThisPeriod);
-                    
params.setUnCompoundedAmount(uncompoundedForThisPeriod.zero());
-                }
                 
-
+                
if(loanApplicationTerms.getInterestRecalculationCompoundingMethod().isCompoundingEnabled())
 {
+                       Money uncompounded = params.getUnCompoundedAmount();
+                       Money compounded = uncompounded.zero();
+                       for (Map.Entry<LocalDate, Money> mapEntry : 
params.getCompoundingMap().entrySet()) {
+                               if 
(mapEntry.getKey().isAfter(params.getPeriodStartDate())) {
+                                       compounded = 
compounded.plus(mapEntry.getValue());
+                               }
+                       }
+                       if (compounded.isGreaterThanZero() && 
startDate.isEqual(additionalPeriodsStartDate)) {
+                               
params.setCompoundedInLastInstallment(uncompoundedFromLastInstallment);// 
uncompounded in last installment
+                               additionalPeriodsStartDate = 
additionalPeriodsStartDate.plusDays(1);
+                       }
+                       Money compoundedForThisPeriod = 
compounded.minus(uncompounded);
+                       Money uncompoundedForThisPeriod = 
interest.minus(compoundedForThisPeriod);
+                       params.setUnCompoundedAmount(uncompoundedForThisPeriod);
+                       LocalDate compoundingDate = params.getPeriodStartDate();
+                       if (loanApplicationTerms.allowCompoundingOnEod()) {
+                               compoundingDate = compoundingDate.minusDays(1);
+                       }
+                       compoundingDate = 
getNextCompoundScheduleDate(compoundingDate, loanApplicationTerms, 
holidayDetailDTO);
+                       
if(compoundingDate.isEqual(params.getActualRepaymentDate())){
+                               params.getCompoundingMap().put(compoundingDate, 
uncompoundedForThisPeriod);
+                               
params.setUnCompoundedAmount(uncompoundedForThisPeriod.zero());
+                       }
+                }
             }
             params.setPeriodStartDate(params.getActualRepaymentDate());
         } while (params.getActualRepaymentDate().isBefore(currentDate) && 
!outstanding.isZero());

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanRepaymentScheduleHistory.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanRepaymentScheduleHistory.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanRepaymentScheduleHistory.java
index 4f962aa..baef5c6 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanRepaymentScheduleHistory.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanRepaymentScheduleHistory.java
@@ -33,11 +33,11 @@ import javax.persistence.TemporalType;
 import org.apache.fineract.portfolio.loanaccount.domain.Loan;
 import 
org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanRescheduleRequest;
 import org.apache.fineract.useradministration.domain.AppUser;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_loan_repayment_schedule_history")
-public class LoanRepaymentScheduleHistory extends AbstractPersistable<Long> {
+public class LoanRepaymentScheduleHistory extends 
AbstractPersistableCustom<Long> {
 
     @ManyToOne(optional = false)
     @JoinColumn(name = "loan_id")

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/domain/LoanRescheduleRequest.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/domain/LoanRescheduleRequest.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/domain/LoanRescheduleRequest.java
index 8a0a844..188d20a 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/domain/LoanRescheduleRequest.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/domain/LoanRescheduleRequest.java
@@ -41,11 +41,11 @@ import 
org.apache.fineract.portfolio.loanaccount.domain.LoanStatus;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariations;
 import org.apache.fineract.useradministration.domain.AppUser;
 import org.joda.time.LocalDate;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_loan_reschedule_request")
-public class LoanRescheduleRequest extends AbstractPersistable<Long> {
+public class LoanRescheduleRequest extends AbstractPersistableCustom<Long> {
        
     @ManyToOne
     @JoinColumn(name = "loan_id", nullable = false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java
index 7070218..b697797 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java
@@ -26,7 +26,11 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import javax.persistence.EntityExistsException;
+import javax.persistence.PersistenceException;
+
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.exception.ExceptionUtils;
 import 
org.apache.fineract.infrastructure.accountnumberformat.domain.AccountNumberFormat;
 import 
org.apache.fineract.infrastructure.accountnumberformat.domain.AccountNumberFormatRepositoryWrapper;
 import 
org.apache.fineract.infrastructure.accountnumberformat.domain.EntityAccountType;
@@ -413,8 +417,12 @@ public class 
LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
                     .withLoanId(newLoanApplication.getId()) //
                     .build();
         } catch (final DataIntegrityViolationException dve) {
-            handleDataIntegrityIssues(command, dve);
+            handleDataIntegrityIssues(command, dve.getMostSpecificCause(), 
dve);
             return CommandProcessingResult.empty();
+        }catch(final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+            handleDataIntegrityIssues(command, throwable, dve);
+               return CommandProcessingResult.empty();
         }
     }
 
@@ -989,8 +997,12 @@ public class 
LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
                     .withLoanId(existingLoanApplication.getId()) //
                     .with(changes).build();
         } catch (final DataIntegrityViolationException dve) {
-            handleDataIntegrityIssues(command, dve);
+            handleDataIntegrityIssues(command, dve.getMostSpecificCause(), 
dve);
             return CommandProcessingResult.empty();
+        }catch (final PersistenceException dve) {
+            Throwable throwable = ExceptionUtils.getRootCause(dve.getCause()) ;
+            handleDataIntegrityIssues(command, throwable, dve);
+               return CommandProcessingResult.empty();
         }
     }
 
@@ -998,16 +1010,14 @@ public class 
LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
      * Guaranteed to throw an exception no matter what the data integrity issue
      * is.
      */
-    private void handleDataIntegrityIssues(final JsonCommand command, final 
DataIntegrityViolationException dve) {
-
-        final Throwable realCause = dve.getMostSpecificCause();
-        if (realCause.getMessage().contains("loan_account_no_UNIQUE")) {
+    private void handleDataIntegrityIssues(final JsonCommand command, final 
Throwable realCause, final Exception dve) {
+       
+        if (realCause.getMessage().contains("loan_account_no_UNIQUE") || 
realCause.getCause().getMessage().contains("loan_account_no_UNIQUE")) {
 
             final String accountNo = 
command.stringValueOfParameterNamed("accountNo");
             throw new 
PlatformDataIntegrityException("error.msg.loan.duplicate.accountNo", "Loan with 
accountNo `" + accountNo
                     + "` already exists", "accountNo", accountNo);
-        } else if (realCause.getMessage().contains("loan_externalid_UNIQUE")) {
-
+        } else if (realCause.getMessage().contains("loan_externalid_UNIQUE") 
|| realCause.getCause().getMessage().contains("loan_externalid_UNIQUE")) {
             final String externalId = 
command.stringValueOfParameterNamed("externalId");
             throw new 
PlatformDataIntegrityException("error.msg.loan.duplicate.externalId", "Loan 
with externalId `" + externalId
                     + "` already exists", "externalId", externalId);
@@ -1017,7 +1027,7 @@ public class 
LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
         throw new 
PlatformDataIntegrityException("error.msg.unknown.data.integrity.issue", 
"Unknown data integrity issue with resource.");
     }
 
-    private void logAsErrorUnexpectedDataIntegrityException(final 
DataIntegrityViolationException dve) {
+    private void logAsErrorUnexpectedDataIntegrityException(final Exception 
dve) {
         logger.error(dve.getMessage(), dve);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanArrearsAgingServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanArrearsAgingServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanArrearsAgingServiceImpl.java
index f1db739..6a39299 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanArrearsAgingServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanArrearsAgingServiceImpl.java
@@ -19,7 +19,6 @@
 package org.apache.fineract.portfolio.loanaccount.service;
 
 import java.math.BigDecimal;
-import java.math.BigInteger;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.ArrayList;

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeAssembler.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeAssembler.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeAssembler.java
index 67bd9aa..a49bb97 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeAssembler.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeAssembler.java
@@ -204,13 +204,12 @@ public class LoanChargeAssembler {
                     } else {
                         final Long loanChargeId = id;
                         final LoanCharge loanCharge = 
this.loanChargeRepository.findOne(loanChargeId);
-                        if (disbursementChargeIds.contains(loanChargeId) && 
loanCharge == null) {
-                            // throw new
-                            // LoanChargeNotFoundException(loanChargeId);
-                        }
                         if (loanCharge != null) {
-                            loanCharge.update(amount, dueDate, 
numberOfRepayments);
-                            loanCharges.add(loanCharge);
+                            if(!loanCharge.isTrancheDisbursementCharge()
+                                    || 
disbursementChargeIds.contains(loanChargeId)){
+                                loanCharge.update(amount, dueDate, 
numberOfRepayments);
+                                loanCharges.add(loanCharge);
+                            }
                         }
                     }
                 }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProduct.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProduct.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProduct.java
index f461b17..05173e4 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProduct.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProduct.java
@@ -61,7 +61,7 @@ import org.apache.fineract.portfolio.fund.domain.Fund;
 import 
org.apache.fineract.portfolio.loanaccount.loanschedule.domain.AprCalculator;
 import org.apache.fineract.portfolio.loanproduct.LoanProductConstants;
 import org.joda.time.LocalDate;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
@@ -79,7 +79,7 @@ import com.google.gson.JsonObject;
 @Table(name = "m_product_loan", uniqueConstraints = { 
@UniqueConstraint(columnNames = { "name" }, name = "unq_name"),
         @UniqueConstraint(columnNames = { "external_id" }, name = 
"external_id_UNIQUE"),
         @UniqueConstraint(columnNames = { "short_name" }, name = 
"unq_short_name") })
-public class LoanProduct extends AbstractPersistable<Long> {
+public class LoanProduct extends AbstractPersistableCustom<Long> {
 
     @ManyToOne
     @JoinColumn(name = "fund_id", nullable = true)
@@ -103,7 +103,7 @@ public class LoanProduct extends AbstractPersistable<Long> {
     private List<Charge> charges;
 
     @Embedded
-    private final LoanProductRelatedDetail loanProductRelatedDetail;
+    private LoanProductRelatedDetail loanProductRelatedDetail;
 
     @Embedded
     private LoanProductMinMaxConstraints loanProductMinMaxConstraints;

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductBorrowerCycleVariations.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductBorrowerCycleVariations.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductBorrowerCycleVariations.java
index 676377f..85f103d 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductBorrowerCycleVariations.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductBorrowerCycleVariations.java
@@ -26,11 +26,11 @@ import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_product_loan_variations_borrower_cycle")
-public class LoanProductBorrowerCycleVariations extends 
AbstractPersistable<Long> {
+public class LoanProductBorrowerCycleVariations extends 
AbstractPersistableCustom<Long> {
 
     @ManyToOne
     @JoinColumn(name = "loan_product_id", nullable = false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductConfigurableAttributes.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductConfigurableAttributes.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductConfigurableAttributes.java
index 3e2a8f2..2d0893a 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductConfigurableAttributes.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductConfigurableAttributes.java
@@ -25,15 +25,15 @@ import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 import org.apache.fineract.portfolio.loanproduct.LoanProductConstants;
-import org.springframework.data.jpa.domain.AbstractPersistable;
 
 @Entity
 @Table(name = "m_product_loan_configurable_attributes")
-public class LoanProductConfigurableAttributes extends 
AbstractPersistable<Long> {
+public class LoanProductConfigurableAttributes extends 
AbstractPersistableCustom<Long> {
 
     @ManyToOne
-    @JoinColumn(name = "loan_product_id", nullable = true)
+    @JoinColumn(name = "loan_product_id", nullable = false)
     private LoanProduct loanProduct;
 
     @Column(name = "amortization_method_enum", nullable = true)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductFloatingRates.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductFloatingRates.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductFloatingRates.java
index 0c2f476..42adbc1 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductFloatingRates.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductFloatingRates.java
@@ -34,11 +34,11 @@ import 
org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.portfolio.floatingrates.data.FloatingRateDTO;
 import org.apache.fineract.portfolio.floatingrates.data.FloatingRatePeriodData;
 import org.apache.fineract.portfolio.floatingrates.domain.FloatingRate;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_product_loan_floating_rates")
-public class LoanProductFloatingRates extends AbstractPersistable<Long> {
+public class LoanProductFloatingRates extends AbstractPersistableCustom<Long> {
 
     @OneToOne
     @JoinColumn(name = "loan_product_id", nullable = false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductGuaranteeDetails.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductGuaranteeDetails.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductGuaranteeDetails.java
index bc590d3..a6a96e5 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductGuaranteeDetails.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductGuaranteeDetails.java
@@ -29,7 +29,7 @@ import javax.persistence.Table;
 
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.portfolio.loanproduct.LoanProductConstants;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 /**
  * Entity for capturing interest recalculation settings
@@ -39,7 +39,7 @@ import 
org.springframework.data.jpa.domain.AbstractPersistable;
 
 @Entity
 @Table(name = "m_product_loan_guarantee_details")
-public class LoanProductGuaranteeDetails extends AbstractPersistable<Long> {
+public class LoanProductGuaranteeDetails extends 
AbstractPersistableCustom<Long> {
 
     @OneToOne
     @JoinColumn(name = "loan_product_id", nullable = false)
@@ -48,10 +48,10 @@ public class LoanProductGuaranteeDetails extends 
AbstractPersistable<Long> {
     @Column(name = "mandatory_guarantee", scale = 6, precision = 19, nullable 
= false)
     private BigDecimal mandatoryGuarantee;
 
-    @Column(name = "minimum_guarantee_from_own_funds", scale = 6, precision = 
19, nullable = false)
+    @Column(name = "minimum_guarantee_from_own_funds", scale = 6, precision = 
19, nullable = true)
     private BigDecimal minimumGuaranteeFromOwnFunds;
 
-    @Column(name = "minimum_guarantee_from_guarantor_funds", scale = 6, 
precision = 19, nullable = false)
+    @Column(name = "minimum_guarantee_from_guarantor_funds", scale = 6, 
precision = 19, nullable = true)
     private BigDecimal minimumGuaranteeFromGuarantor;
 
     protected LoanProductGuaranteeDetails() {

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductInterestRecalculationDetails.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductInterestRecalculationDetails.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductInterestRecalculationDetails.java
index 1b5a34f..e70a14f 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductInterestRecalculationDetails.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductInterestRecalculationDetails.java
@@ -28,7 +28,7 @@ import javax.persistence.Table;
 
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.portfolio.loanproduct.LoanProductConstants;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 /**
  * Entity for capturing interest recalculation settings
@@ -38,7 +38,7 @@ import 
org.springframework.data.jpa.domain.AbstractPersistable;
 
 @Entity
 @Table(name = "m_product_loan_recalculation_details")
-public class LoanProductInterestRecalculationDetails extends 
AbstractPersistable<Long> {
+public class LoanProductInterestRecalculationDetails extends 
AbstractPersistableCustom<Long> {
 
     @OneToOne
     @JoinColumn(name = "product_id", nullable = false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductTrancheDetails.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductTrancheDetails.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductTrancheDetails.java
index c12e742..b0eac9f 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductTrancheDetails.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductTrancheDetails.java
@@ -33,10 +33,10 @@ public class LoanProductTrancheDetails {
     @Column(name = "allow_multiple_disbursals")
     private boolean multiDisburseLoan;
 
-    @Column(name = "max_disbursals", nullable = false)
+    @Column(name = "max_disbursals", nullable = true)
     private Integer maxTrancheCount;
 
-    @Column(name = "max_outstanding_loan_balance", scale = 6, precision = 19, 
nullable = false)
+    @Column(name = "max_outstanding_loan_balance", scale = 6, precision = 19, 
nullable = true)
     private BigDecimal outstandingLoanBalance;
 
     protected LoanProductTrancheDetails() {

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductVariableInstallmentConfig.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductVariableInstallmentConfig.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductVariableInstallmentConfig.java
index 538e452..afde1df 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductVariableInstallmentConfig.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductVariableInstallmentConfig.java
@@ -29,11 +29,11 @@ import javax.persistence.Table;
 
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.portfolio.loanproduct.LoanProductConstants;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_product_loan_variable_installment_config")
-public class LoanProductVariableInstallmentConfig extends 
AbstractPersistable<Long> {
+public class LoanProductVariableInstallmentConfig extends 
AbstractPersistableCustom<Long> {
 
     @OneToOne
     @JoinColumn(name = "loan_product_id", nullable = false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanTransactionProcessingStrategy.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanTransactionProcessingStrategy.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanTransactionProcessingStrategy.java
index 775f4b9..91df333 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanTransactionProcessingStrategy.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanTransactionProcessingStrategy.java
@@ -23,11 +23,11 @@ import javax.persistence.Entity;
 import javax.persistence.Table;
 
 import 
org.apache.fineract.portfolio.loanproduct.data.TransactionProcessingStrategyData;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "ref_loan_transaction_processing_strategy")
-public class LoanTransactionProcessingStrategy extends 
AbstractPersistable<Long> {
+public class LoanTransactionProcessingStrategy extends 
AbstractPersistableCustom<Long> {
 
     @Column(name = "code", unique = true)
     private String code;

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/productmix/domain/ProductMix.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/productmix/domain/ProductMix.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/productmix/domain/ProductMix.java
index c042761..2bea8cd 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/productmix/domain/ProductMix.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/productmix/domain/ProductMix.java
@@ -24,11 +24,11 @@ import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 
 import org.apache.fineract.portfolio.loanproduct.domain.LoanProduct;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_product_mix")
-public class ProductMix extends AbstractPersistable<Long> {
+public class ProductMix extends AbstractPersistableCustom<Long> {
 
     @ManyToOne
     @JoinColumn(name = "product_id", nullable = false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/productmix/domain/ProductMixRepository.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/productmix/domain/ProductMixRepository.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/productmix/domain/ProductMixRepository.java
index f4fb6d9..8b9908f 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/productmix/domain/ProductMixRepository.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/productmix/domain/ProductMixRepository.java
@@ -27,9 +27,9 @@ import org.springframework.data.repository.query.Param;
 
 public interface ProductMixRepository extends JpaRepository<ProductMix, Long>, 
JpaSpecificationExecutor<ProductMix> {
 
-    public static final String GET_PRODUCTMIXES_BY_PRODUCTID_SCHEMA = "from 
ProductMix pm where pm.product.id = :productId";
+    public static final String GET_PRODUCTMIXES_BY_PRODUCTID_SCHEMA = "select 
pm from ProductMix pm where pm.product.id = :productId";
     public static final String GET_RESTRICTED_PRODUCTIDS_SCHEMA = "Select 
pm.restrictedProduct.id from ProductMix pm where pm.product.id = :productId";
-    public static final String GET_RESTRICTED_PRODUCTS_SCHEMA = "from 
ProductMix pm where pm.restrictedProduct.id = :restrictedProductId";
+    public static final String GET_RESTRICTED_PRODUCTS_SCHEMA = "select pm 
from ProductMix pm where pm.restrictedProduct.id = :restrictedProductId";
 
     @Query(GET_PRODUCTMIXES_BY_PRODUCTID_SCHEMA)
     List<ProductMix> findByProductId(@Param("productId") Long productId);

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java
index 6e0ab74..424b3ac 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java
@@ -22,6 +22,9 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
+import javax.persistence.PersistenceException;
+
+import org.apache.commons.lang.exception.ExceptionUtils;
 import 
org.apache.fineract.accounting.producttoaccountmapping.service.ProductToGLAccountMappingWritePlatformService;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
@@ -143,8 +146,12 @@ public class 
LoanProductWritePlatformServiceJpaRepositoryImpl implements LoanPro
                     .build();
 
         } catch (final DataIntegrityViolationException dve) {
-            handleDataIntegrityIssues(command, dve);
+            handleDataIntegrityIssues(command, dve.getMostSpecificCause(), 
dve);
             return CommandProcessingResult.empty();
+        }catch(final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+            handleDataIntegrityIssues(command, throwable, dve);
+               return CommandProcessingResult.empty();
         }
 
     }
@@ -230,8 +237,12 @@ public class 
LoanProductWritePlatformServiceJpaRepositoryImpl implements LoanPro
                     .build();
 
         } catch (final DataIntegrityViolationException dve) {
-            handleDataIntegrityIssues(command, dve);
+            handleDataIntegrityIssues(command, dve.getMostSpecificCause(), 
dve);
             return new CommandProcessingResult(Long.valueOf(-1));
+        }catch(final PersistenceException dve) {
+               Throwable throwable = 
ExceptionUtils.getRootCause(dve.getCause()) ;
+            handleDataIntegrityIssues(command, throwable, dve);
+               return CommandProcessingResult.empty();
         }
 
     }
@@ -281,21 +292,19 @@ public class 
LoanProductWritePlatformServiceJpaRepositoryImpl implements LoanPro
      * Guaranteed to throw an exception no matter what the data integrity issue
      * is.
      */
-    private void handleDataIntegrityIssues(final JsonCommand command, final 
DataIntegrityViolationException dve) {
-
-        final Throwable realCause = dve.getMostSpecificCause();
+    private void handleDataIntegrityIssues(final JsonCommand command, final 
Throwable realCause, final Exception dve) {
 
-        if (realCause.getMessage().contains("external_id")) {
+        if (realCause.getMessage().contains("'external_id'")) {
 
             final String externalId = 
command.stringValueOfParameterNamed("externalId");
             throw new 
PlatformDataIntegrityException("error.msg.product.loan.duplicate.externalId", 
"Loan Product with externalId `"
                     + externalId + "` already exists", "externalId", 
externalId);
-        } else if (realCause.getMessage().contains("unq_name")) {
+        } else if (realCause.getMessage().contains("'unq_name'")) {
 
             final String name = command.stringValueOfParameterNamed("name");
             throw new 
PlatformDataIntegrityException("error.msg.product.loan.duplicate.name", "Loan 
product with name `" + name
                     + "` already exists", "name", name);
-        } else if (realCause.getMessage().contains("unq_short_name")) {
+        } else if (realCause.getMessage().contains("'unq_short_name'")) {
 
             final String shortName = 
command.stringValueOfParameterNamed("shortName");
             throw new 
PlatformDataIntegrityException("error.msg.product.loan.duplicate.short.name", 
"Loan product with short name `"
@@ -320,7 +329,7 @@ public class 
LoanProductWritePlatformServiceJpaRepositoryImpl implements LoanPro
         }
     }
 
-    private void logAsErrorUnexpectedDataIntegrityException(final 
DataIntegrityViolationException dve) {
+    private void logAsErrorUnexpectedDataIntegrityException(final Exception 
dve) {
         logger.error(dve.getMessage(), dve);
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/attendance/domain/ClientAttendance.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/attendance/domain/ClientAttendance.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/attendance/domain/ClientAttendance.java
index d463190..663f954 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/attendance/domain/ClientAttendance.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/attendance/domain/ClientAttendance.java
@@ -27,11 +27,11 @@ import javax.persistence.UniqueConstraint;
 
 import org.apache.fineract.portfolio.client.domain.Client;
 import org.apache.fineract.portfolio.meeting.domain.Meeting;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_client_attendance", uniqueConstraints = { 
@UniqueConstraint(columnNames = { "client_id", "meeting_id" }, name = 
"unique_client_meeting_attendance") })
-public class ClientAttendance extends AbstractPersistable<Long> {
+public class ClientAttendance extends AbstractPersistableCustom<Long> {
 
     @ManyToOne
     @JoinColumn(name = "client_id", nullable = false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/domain/Meeting.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/domain/Meeting.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/domain/Meeting.java
index e33459e..b61f867 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/domain/Meeting.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/domain/Meeting.java
@@ -51,11 +51,11 @@ import 
org.apache.fineract.portfolio.calendar.exception.NotValidRecurringDateExc
 import 
org.apache.fineract.portfolio.meeting.attendance.domain.ClientAttendance;
 import org.apache.fineract.portfolio.meeting.exception.MeetingDateException;
 import org.joda.time.LocalDate;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_meeting", uniqueConstraints = { @UniqueConstraint(columnNames 
= { "calendar_instance_id", "meeting_date" }, name = 
"unique_calendar_instance_id_meeting_date") })
-public class Meeting extends AbstractPersistable<Long> {
+public class Meeting extends AbstractPersistableCustom<Long> {
 
     @ManyToOne
     @JoinColumn(name = "calendar_instance_id", nullable = false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/domain/Note.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/domain/Note.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/domain/Note.java
index e835fb0..d5499d4 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/domain/Note.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/domain/Note.java
@@ -44,7 +44,7 @@ public class Note extends AbstractAuditableCustom<AppUser, 
Long> {
 
     @ManyToOne
     @JoinColumn(name = "client_id", nullable = true)
-    private final Client client;
+    private Client client;
 
     @ManyToOne
     @JoinColumn(name = "group_id", nullable = true)
@@ -62,7 +62,7 @@ public class Note extends AbstractAuditableCustom<AppUser, 
Long> {
     private String note;
 
     @Column(name = "note_type_enum")
-    private final Integer noteTypeId;
+    private Integer noteTypeId;
 
     @ManyToOne
     @JoinColumn(name = "savings_account_id", nullable = true)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymentdetail/domain/PaymentDetail.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymentdetail/domain/PaymentDetail.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymentdetail/domain/PaymentDetail.java
index e660221..c02bc9d 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymentdetail/domain/PaymentDetail.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymentdetail/domain/PaymentDetail.java
@@ -32,11 +32,11 @@ import 
org.apache.fineract.portfolio.paymentdetail.PaymentDetailConstants;
 import org.apache.fineract.portfolio.paymentdetail.data.PaymentDetailData;
 import org.apache.fineract.portfolio.paymenttype.data.PaymentTypeData;
 import org.apache.fineract.portfolio.paymenttype.domain.PaymentType;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_payment_detail")
-public final class PaymentDetail extends AbstractPersistable<Long> {
+public final class PaymentDetail extends AbstractPersistableCustom<Long> {
 
     @ManyToOne
     @JoinColumn(name = "payment_type_id", nullable = false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/domain/PaymentType.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/domain/PaymentType.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/domain/PaymentType.java
index 0a5dc08..0cdf6bc 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/domain/PaymentType.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/domain/PaymentType.java
@@ -29,11 +29,11 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import 
org.apache.fineract.portfolio.paymenttype.api.PaymentTypeApiResourceConstants;
 import org.apache.fineract.portfolio.paymenttype.data.PaymentTypeData;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_payment_type")
-public class PaymentType extends AbstractPersistable<Long> {
+public class PaymentType extends AbstractPersistableCustom<Long> {
 
     @Column(name = "value")
     private String name;

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountInterestIncentive.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountInterestIncentive.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountInterestIncentive.java
index 73ba98f..e9d3315 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountInterestIncentive.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountInterestIncentive.java
@@ -25,11 +25,11 @@ import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 
 import 
org.apache.fineract.portfolio.interestratechart.domain.InterestIncentivesFields;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_deposit_account_interest_incentives")
-public class DepositAccountInterestIncentive extends AbstractPersistable<Long> 
{
+public class DepositAccountInterestIncentive extends 
AbstractPersistableCustom<Long> {
 
     @ManyToOne
     @JoinColumn(name = "deposit_account_interest_rate_slab_id", nullable = 
false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountInterestIncentives.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountInterestIncentives.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountInterestIncentives.java
index 868968c..f9ac7f4 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountInterestIncentives.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountInterestIncentives.java
@@ -24,12 +24,12 @@ import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 import 
org.apache.fineract.portfolio.interestratechart.domain.InterestIncentivesFields;
-import org.springframework.data.jpa.domain.AbstractPersistable;
 
 @Entity
 @Table(name = "m_savings_interest_incentives")
-public class DepositAccountInterestIncentives extends 
AbstractPersistable<Long> {
+public class DepositAccountInterestIncentives extends 
AbstractPersistableCustom<Long> {
 
     @ManyToOne
     @JoinColumn(name = "deposit_account_interest_rate_slab_id", nullable = 
false)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountInterestRateChart.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountInterestRateChart.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountInterestRateChart.java
index 94bd39d..e124036 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountInterestRateChart.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountInterestRateChart.java
@@ -31,6 +31,7 @@ import javax.persistence.OneToMany;
 import javax.persistence.OneToOne;
 import javax.persistence.Table;
 
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 import org.apache.fineract.portfolio.client.domain.Client;
 import 
org.apache.fineract.portfolio.interestratechart.domain.InterestRateChart;
 import 
org.apache.fineract.portfolio.interestratechart.domain.InterestRateChartFields;
@@ -39,11 +40,10 @@ import 
org.apache.fineract.portfolio.interestratechart.incentive.AttributeIncent
 import 
org.apache.fineract.portfolio.interestratechart.incentive.AttributeIncentiveCalculationFactory;
 import org.apache.fineract.portfolio.interestratechart.incentive.IncentiveDTO;
 import org.joda.time.LocalDate;
-import org.springframework.data.jpa.domain.AbstractPersistable;
 
 @Entity
 @Table(name = "m_savings_account_interest_rate_chart")
-public class DepositAccountInterestRateChart extends AbstractPersistable<Long> 
{
+public class DepositAccountInterestRateChart extends 
AbstractPersistableCustom<Long> {
 
     @Embedded
     private InterestRateChartFields chartFields;

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountInterestRateChartSlabs.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountInterestRateChartSlabs.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountInterestRateChartSlabs.java
index 0cca9c9..00e197d 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountInterestRateChartSlabs.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountInterestRateChartSlabs.java
@@ -30,14 +30,14 @@ import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
 
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 import 
org.apache.fineract.portfolio.interestratechart.domain.InterestIncentives;
 import 
org.apache.fineract.portfolio.interestratechart.domain.InterestRateChartSlab;
 import 
org.apache.fineract.portfolio.interestratechart.domain.InterestRateChartSlabFields;
-import org.springframework.data.jpa.domain.AbstractPersistable;
 
 @Entity
 @Table(name = "m_savings_account_interest_rate_slab")
-public class DepositAccountInterestRateChartSlabs extends 
AbstractPersistable<Long> {
+public class DepositAccountInterestRateChartSlabs extends 
AbstractPersistableCustom<Long> {
 
     @Embedded
     private InterestRateChartSlabFields slabFields;

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountOnHoldTransaction.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountOnHoldTransaction.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountOnHoldTransaction.java
index de0c76f..067630d 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountOnHoldTransaction.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountOnHoldTransaction.java
@@ -23,7 +23,7 @@ import org.apache.fineract.organisation.monetary.domain.Money;
 import 
org.apache.fineract.portfolio.loanaccount.guarantor.domain.GuarantorFundingTransaction;
 import 
org.apache.fineract.portfolio.savings.DepositAccountOnHoldTransactionType;
 import org.joda.time.LocalDate;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 import javax.persistence.CascadeType;
 import javax.persistence.Column;
@@ -39,7 +39,7 @@ import java.util.Date;
 
 @Entity
 @Table(name = "m_deposit_account_on_hold_transaction")
-public class DepositAccountOnHoldTransaction extends AbstractPersistable<Long> 
{
+public class DepositAccountOnHoldTransaction extends 
AbstractPersistableCustom<Long> {
 
     @ManyToOne
     @JoinColumn(name = "savings_account_id", nullable = true)

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountRecurringDetail.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountRecurringDetail.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountRecurringDetail.java
index ff719c5..28e1d1f 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountRecurringDetail.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountRecurringDetail.java
@@ -36,16 +36,16 @@ import javax.persistence.Table;
 
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.ApiParameterError;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 import 
org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException;
 import org.apache.fineract.infrastructure.core.service.DateUtils;
 import org.apache.fineract.organisation.monetary.domain.Money;
 import org.apache.fineract.portfolio.savings.DepositsApiConstants;
 import org.joda.time.LocalDate;
-import org.springframework.data.jpa.domain.AbstractPersistable;
 
 @Entity
 @Table(name = "m_deposit_account_recurring_detail")
-public class DepositAccountRecurringDetail extends AbstractPersistable<Long> {
+public class DepositAccountRecurringDetail extends 
AbstractPersistableCustom<Long> {
 
     @Column(name = "mandatory_recommended_deposit_amount", scale = 6, 
precision = 19, nullable = true)
     private BigDecimal mandatoryRecommendedDepositAmount;
@@ -54,9 +54,9 @@ public class DepositAccountRecurringDetail extends 
AbstractPersistable<Long> {
     private BigDecimal totalOverdueAmount;
 
     @Column(name = "is_calendar_inherited", nullable = false)
-    private final boolean isCalendarInherited;
+    private boolean isCalendarInherited;
 
-    @Column(name = "no_of_overdue_installments", nullable = false)
+    @Column(name = "no_of_overdue_installments", nullable = true)
     private Integer noOfOverdueInstallments;
 
     @Embedded

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountTermAndPreClosure.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountTermAndPreClosure.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountTermAndPreClosure.java
index b656afa..71e7bfa 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountTermAndPreClosure.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountTermAndPreClosure.java
@@ -42,6 +42,7 @@ import javax.persistence.TemporalType;
 
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 import org.apache.fineract.portfolio.savings.DepositAccountOnClosureType;
 import org.apache.fineract.portfolio.savings.SavingsPeriodFrequencyType;
 import org.apache.fineract.portfolio.savings.service.SavingsEnumerations;
@@ -50,11 +51,10 @@ import org.joda.time.LocalDate;
 import org.joda.time.Months;
 import org.joda.time.Weeks;
 import org.joda.time.Years;
-import org.springframework.data.jpa.domain.AbstractPersistable;
 
 @Entity
 @Table(name = "m_deposit_account_term_and_preclosure")
-public class DepositAccountTermAndPreClosure extends AbstractPersistable<Long> 
{
+public class DepositAccountTermAndPreClosure extends 
AbstractPersistableCustom<Long> {
 
     @Column(name = "deposit_amount", scale = 6, precision = 19, nullable = 
true)
     private BigDecimal depositAmount;
@@ -76,7 +76,7 @@ public class DepositAccountTermAndPreClosure extends 
AbstractPersistable<Long> {
     @Column(name = "deposit_period_frequency_enum", nullable = true)
     private Integer depositPeriodFrequency;
 
-    @Column(name = "on_account_closure_enum", nullable = false)
+    @Column(name = "on_account_closure_enum", nullable = true)
     private Integer onAccountClosureType;
 
     @Embedded

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositProductRecurringDetail.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositProductRecurringDetail.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositProductRecurringDetail.java
index 1fd2908..1cf3152 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositProductRecurringDetail.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositProductRecurringDetail.java
@@ -28,11 +28,11 @@ import javax.persistence.OneToOne;
 import javax.persistence.Table;
 
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_deposit_product_recurring_detail")
-public class DepositProductRecurringDetail extends AbstractPersistable<Long> {
+public class DepositProductRecurringDetail extends 
AbstractPersistableCustom<Long> {
 
     @Embedded
     private DepositRecurringDetail recurringDetail;

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositProductTermAndPreClosure.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositProductTermAndPreClosure.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositProductTermAndPreClosure.java
index 60fb99a..0a99f19 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositProductTermAndPreClosure.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositProductTermAndPreClosure.java
@@ -29,11 +29,11 @@ import javax.persistence.Table;
 
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder;
-import org.springframework.data.jpa.domain.AbstractPersistable;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 
 @Entity
 @Table(name = "m_deposit_product_term_and_preclosure")
-public class DepositProductTermAndPreClosure extends AbstractPersistable<Long> 
{
+public class DepositProductTermAndPreClosure extends 
AbstractPersistableCustom<Long> {
 
     @Embedded
     private DepositPreClosureDetail preClosureDetail;

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/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 1cbc725..3807d6e 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
@@ -817,4 +817,10 @@ public class FixedDepositAccount extends SavingsAccount {
     public BigDecimal minBalanceForInterestCalculation() {
         return null;
     }
+    
+    @Override
+    public void loadLazyCollections() {
+       super.loadLazyCollections();
+       this.chart.getId() ;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/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 f28fe6a..6ff9c99 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
@@ -1213,5 +1213,6 @@ public class RecurringDepositAccount extends 
SavingsAccount {
     public void loadLazyCollections() {
         this.depositScheduleInstallments.size() ;
         super.loadLazyCollections();
+        this.chart.getId() ;
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositScheduleInstallment.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositScheduleInstallment.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositScheduleInstallment.java
index af3d4d7..1f6ea3b 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositScheduleInstallment.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositScheduleInstallment.java
@@ -44,15 +44,15 @@ public class RecurringDepositScheduleInstallment extends 
AbstractAuditableCustom
     private RecurringDepositAccount account;
 
     @Column(name = "installment", nullable = false)
-    private final Integer installmentNumber;
+    private Integer installmentNumber;
 
     @Temporal(TemporalType.DATE)
     @Column(name = "fromdate", nullable = true)
-    private final Date fromDate;
+    private Date fromDate;
 
     @Temporal(TemporalType.DATE)
     @Column(name = "duedate", nullable = false)
-    private final Date dueDate;
+    private Date dueDate;
 
     @Column(name = "deposit_amount", scale = 6, precision = 19, nullable = 
true)
     private BigDecimal depositAmount;

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/9d7f1c21/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java
index 3af57f5..bc97a67 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java
@@ -76,6 +76,7 @@ import 
org.apache.fineract.infrastructure.core.data.DataValidatorBuilder;
 import org.apache.fineract.infrastructure.core.domain.LocalDateInterval;
 import 
org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException;
 import org.apache.fineract.infrastructure.core.service.DateUtils;
+import 
org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
 import 
org.apache.fineract.infrastructure.security.service.RandomPasswordGenerator;
 import org.apache.fineract.organisation.monetary.data.CurrencyData;
 import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
@@ -112,7 +113,6 @@ import 
org.apache.fineract.useradministration.domain.AppUser;
 import org.joda.time.LocalDate;
 import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
-import org.springframework.data.jpa.domain.AbstractPersistable;
 import org.springframework.util.CollectionUtils;
 
 import com.google.gson.JsonArray;
@@ -123,7 +123,7 @@ import com.google.gson.JsonArray;
 @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
 @DiscriminatorColumn(name = "deposit_type_enum", discriminatorType = 
DiscriminatorType.INTEGER)
 @DiscriminatorValue("100")
-public class SavingsAccount extends AbstractPersistable<Long> {
+public class SavingsAccount extends AbstractPersistableCustom<Long> {
 
     @Version
     int version;
@@ -293,7 +293,7 @@ public class SavingsAccount extends 
AbstractPersistable<Long> {
 
     @OrderBy(value = "dateOf, createdDate, id")
     @OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", 
orphanRemoval = true, fetch=FetchType.LAZY)
-    protected final List<SavingsAccountTransaction> transactions = new 
ArrayList<>();
+    protected List<SavingsAccountTransaction> transactions = new ArrayList<>();
     
     @OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", 
orphanRemoval = true, fetch=FetchType.LAZY)
     protected Set<SavingsAccountCharge> charges = new HashSet<>();
@@ -2425,7 +2425,7 @@ public class SavingsAccount extends 
AbstractPersistable<Long> {
         }
 
         // add new charge to savings account
-        charges().add(savingsAccountCharge);
+        this.charges.add(savingsAccountCharge);
 
     }
 
@@ -2573,7 +2573,7 @@ public class SavingsAccount extends 
AbstractPersistable<Long> {
     }
 
     public Set<SavingsAccountCharge> charges() {
-        return (this.charges == null) ? new HashSet<>() : this.charges;
+        return (this.charges == null) ? new HashSet<SavingsAccountCharge>() : 
this.charges;
     }
 
     public void validateAccountValuesWithProduct() {

Reply via email to