http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java
index 6c70d7c..7eccf9a 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java
@@ -55,7 +55,7 @@ import 
org.apache.fineract.portfolio.loanaccount.domain.LoanLifecycleStateMachin
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallmentRepository;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleTransactionProcessorFactory;
-import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository;
+import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanRescheduleRequestToTermVariationMapping;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanSummaryWrapper;
@@ -104,7 +104,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl 
implements LoanResche
     private final LoanScheduleHistoryWritePlatformService 
loanScheduleHistoryWritePlatformService;
     private final LoanTransactionRepository loanTransactionRepository;
     private final JournalEntryWritePlatformService 
journalEntryWritePlatformService;
-    private final LoanRepository loanRepository;
+    private final LoanRepositoryWrapper loanRepositoryWrapper;
     private final LoanAssembler loanAssembler;
     private final LoanUtilService loanUtilService;
     private final LoanRepaymentScheduleTransactionProcessorFactory 
loanRepaymentScheduleTransactionProcessorFactory;
@@ -129,7 +129,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl 
implements LoanResche
             final LoanRepaymentScheduleHistoryRepository 
loanRepaymentScheduleHistoryRepository,
             final LoanScheduleHistoryWritePlatformService 
loanScheduleHistoryWritePlatformService,
             final LoanTransactionRepository loanTransactionRepository,
-            final JournalEntryWritePlatformService 
journalEntryWritePlatformService, final LoanRepository loanRepository,
+            final JournalEntryWritePlatformService 
journalEntryWritePlatformService, final LoanRepositoryWrapper 
loanRepositoryWrapper,
             final LoanAssembler loanAssembler, final LoanUtilService 
loanUtilService,
             final LoanRepaymentScheduleTransactionProcessorFactory 
loanRepaymentScheduleTransactionProcessorFactory,
             final LoanScheduleGeneratorFactory loanScheduleFactory, final 
LoanSummaryWrapper loanSummaryWrapper,
@@ -145,7 +145,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl 
implements LoanResche
         this.loanScheduleHistoryWritePlatformService = 
loanScheduleHistoryWritePlatformService;
         this.loanTransactionRepository = loanTransactionRepository;
         this.journalEntryWritePlatformService = 
journalEntryWritePlatformService;
-        this.loanRepository = loanRepository;
+        this.loanRepositoryWrapper = loanRepositoryWrapper;
         this.loanAssembler = loanAssembler;
         this.loanUtilService = loanUtilService;
         this.loanRepaymentScheduleTransactionProcessorFactory = 
loanRepaymentScheduleTransactionProcessorFactory;
@@ -281,7 +281,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl 
implements LoanResche
 
             // create a new entry in the m_loan_reschedule_request table
             this.loanRescheduleRequestRepository.save(loanRescheduleRequest);
-            this.loanRepository.save(loan);
+            this.loanRepositoryWrapper.save(loan);
 
             return new 
CommandProcessingResultBuilder().withCommandId(jsonCommand.commandId()).withEntityId(loanRescheduleRequest.getId())
                     .withLoanId(loan.getId()).build();
@@ -508,7 +508,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl 
implements LoanResche
                     
this.repaymentScheduleInstallmentRepository.save(installment);
                 }
             }
-            this.loanRepository.saveAndFlush(loan);
+            this.loanRepositoryWrapper.saveAndFlush(loan);
         } catch (final DataIntegrityViolationException e) {
             final Throwable realCause = e.getCause();
             final List<ApiParameterError> dataValidationErrors = new 
ArrayList<>();

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualWritePlatformServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualWritePlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualWritePlatformServiceImpl.java
index 5ac0b64..9fdde8f 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualWritePlatformServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualWritePlatformServiceImpl.java
@@ -42,7 +42,7 @@ import 
org.apache.fineract.portfolio.loanaccount.data.LoanScheduleAccrualData;
 import org.apache.fineract.portfolio.loanaccount.data.LoanTransactionData;
 import org.apache.fineract.portfolio.loanaccount.data.LoanTransactionEnumData;
 import org.apache.fineract.portfolio.loanaccount.domain.Loan;
-import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository;
+import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType;
 import 
org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException;
 import 
org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanSchedulePeriodData;
@@ -64,21 +64,21 @@ public class LoanAccrualWritePlatformServiceImpl implements 
LoanAccrualWritePlat
     private final DataSource dataSource;
     private final JournalEntryWritePlatformService 
journalEntryWritePlatformService;
     private final AppUserRepositoryWrapper userRepository;
-    private final LoanRepository loanRepository;
+    private final LoanRepositoryWrapper loanRepositoryWrapper;
     private final ApplicationCurrencyRepositoryWrapper 
applicationCurrencyRepository;
 
     @Autowired
     public LoanAccrualWritePlatformServiceImpl(final RoutingDataSource 
dataSource, final LoanReadPlatformService loanReadPlatformService,
             final JournalEntryWritePlatformService 
journalEntryWritePlatformService,
             final LoanChargeReadPlatformService loanChargeReadPlatformService, 
final AppUserRepositoryWrapper userRepository,
-            final LoanRepository loanRepository, final 
ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository) {
+            final LoanRepositoryWrapper loanRepositoryWrapper, final 
ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository) {
         this.loanReadPlatformService = loanReadPlatformService;
         this.dataSource = dataSource;
         this.jdbcTemplate = new JdbcTemplate(this.dataSource);
         this.journalEntryWritePlatformService = 
journalEntryWritePlatformService;
         this.loanChargeReadPlatformService = loanChargeReadPlatformService;
         this.userRepository = userRepository;
-        this.loanRepository = loanRepository;
+        this.loanRepositoryWrapper = loanRepositoryWrapper;
         this.applicationCurrencyRepository = applicationCurrencyRepository;
     }
 
@@ -487,14 +487,14 @@ public class LoanAccrualWritePlatformServiceImpl 
implements LoanAccrualWritePlat
     @Transactional
     public void addIncomeAndAccrualTransactions(Long loanId) throws Exception {
         if (loanId != null) {
-            Loan loan = this.loanRepository.findOne(loanId);
+            Loan loan = 
this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true);
             if (loan == null) { throw new LoanNotFoundException(loanId); }
             final List<Long> existingTransactionIds = new ArrayList<>();
             final List<Long> existingReversedTransactionIds = new 
ArrayList<>();
             existingTransactionIds.addAll(loan.findExistingTransactionIds());
             
existingReversedTransactionIds.addAll(loan.findExistingReversedTransactionIds());
             
loan.processIncomeTransactions(this.userRepository.fetchSystemUser());
-            this.loanRepository.saveAndFlush(loan);
+            this.loanRepositoryWrapper.saveAndFlush(loan);
             postJournalEntries(loan, existingTransactionIds, 
existingReversedTransactionIds);
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/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 585dbd9..7070218 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
@@ -41,8 +41,6 @@ import 
org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
 import 
org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder;
 import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder;
 import 
org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException;
-import 
org.apache.fineract.infrastructure.core.exceptionmapper.PlatformDomainRuleExceptionMapper;
-import 
org.apache.fineract.infrastructure.entityaccess.exception.NotOfficeSpecificProductException;
 import 
org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException;
 import 
org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
 import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper;
@@ -52,6 +50,7 @@ import 
org.apache.fineract.infrastructure.entityaccess.domain.FineractEntityRela
 import 
org.apache.fineract.infrastructure.entityaccess.domain.FineractEntityRelationRepository;
 import 
org.apache.fineract.infrastructure.entityaccess.domain.FineractEntityToEntityMapping;
 import 
org.apache.fineract.infrastructure.entityaccess.domain.FineractEntityToEntityMappingRepository;
+import 
org.apache.fineract.infrastructure.entityaccess.exception.NotOfficeSpecificProductException;
 import 
org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
 import org.apache.fineract.organisation.staff.domain.Staff;
 import org.apache.fineract.portfolio.account.domain.AccountAssociationType;
@@ -85,11 +84,21 @@ import 
org.apache.fineract.portfolio.group.exception.GroupNotActiveException;
 import org.apache.fineract.portfolio.loanaccount.api.LoanApiConstants;
 import org.apache.fineract.portfolio.loanaccount.data.LoanChargeData;
 import org.apache.fineract.portfolio.loanaccount.data.ScheduleGeneratorDTO;
-import org.apache.fineract.portfolio.loanaccount.domain.*;
+import 
org.apache.fineract.portfolio.loanaccount.domain.DefaultLoanLifecycleStateMachine;
+import org.apache.fineract.portfolio.loanaccount.domain.Loan;
+import org.apache.fineract.portfolio.loanaccount.domain.LoanCharge;
+import 
org.apache.fineract.portfolio.loanaccount.domain.LoanDisbursementDetails;
+import 
org.apache.fineract.portfolio.loanaccount.domain.LoanLifecycleStateMachine;
+import 
org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment;
+import 
org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallmentRepository;
+import 
org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleTransactionProcessorFactory;
+import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper;
+import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus;
+import org.apache.fineract.portfolio.loanaccount.domain.LoanSummaryWrapper;
+import org.apache.fineract.portfolio.loanaccount.domain.LoanTopupDetails;
 import 
org.apache.fineract.portfolio.loanaccount.exception.LoanApplicationDateException;
 import 
org.apache.fineract.portfolio.loanaccount.exception.LoanApplicationNotInSubmittedAndPendingApprovalStateCannotBeDeleted;
 import 
org.apache.fineract.portfolio.loanaccount.exception.LoanApplicationNotInSubmittedAndPendingApprovalStateCannotBeModified;
-import 
org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException;
 import 
org.apache.fineract.portfolio.loanaccount.loanschedule.domain.AprCalculator;
 import 
org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanApplicationTerms;
 import 
org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleModel;
@@ -132,7 +141,7 @@ public class 
LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
     private final LoanApplicationTransitionApiJsonValidator 
loanApplicationTransitionApiJsonValidator;
     private final LoanProductDataValidator 
loanProductCommandFromApiJsonDeserializer;
     private final LoanApplicationCommandFromApiJsonHelper 
fromApiJsonDeserializer;
-    private final LoanRepository loanRepository;
+    private final LoanRepositoryWrapper loanRepositoryWrapper;
     private final NoteRepository noteRepository;
     private final LoanScheduleCalculationPlatformService 
calculationPlatformService;
     private final LoanAssembler loanAssembler;
@@ -167,7 +176,8 @@ public class 
LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
             final LoanApplicationCommandFromApiJsonHelper 
fromApiJsonDeserializer,
             final LoanProductDataValidator 
loanProductCommandFromApiJsonDeserializer, final AprCalculator aprCalculator,
             final LoanAssembler loanAssembler, final LoanChargeAssembler 
loanChargeAssembler,
-            final CollateralAssembler loanCollateralAssembler, final 
LoanRepository loanRepository, final NoteRepository noteRepository,
+            final CollateralAssembler loanCollateralAssembler, final 
LoanRepositoryWrapper loanRepositoryWrapper,
+            final NoteRepository noteRepository,
             final LoanScheduleCalculationPlatformService 
calculationPlatformService, final ClientRepositoryWrapper clientRepository,
             final LoanProductRepository loanProductRepository, final 
AccountNumberGenerator accountNumberGenerator,
             final LoanSummaryWrapper loanSummaryWrapper, final 
GroupRepositoryWrapper groupRepository,
@@ -190,7 +200,7 @@ public class 
LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
         this.loanAssembler = loanAssembler;
         this.loanChargeAssembler = loanChargeAssembler;
         this.loanCollateralAssembler = loanCollateralAssembler;
-        this.loanRepository = loanRepository;
+        this.loanRepositoryWrapper = loanRepositoryWrapper ;
         this.noteRepository = noteRepository;
         this.calculationPlatformService = calculationPlatformService;
         this.clientRepository = clientRepository;
@@ -289,7 +299,7 @@ public class 
LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
 
                 if(newLoanApplication.isTopup()){
                     final Long loanIdToClose = 
command.longValueOfParameterNamed(LoanApiConstants.loanIdToClose);
-                    final Loan loanToClose = 
this.loanRepository.findNonClosedLoanThatBelongsToClient(loanIdToClose, 
clientId);
+                    final Loan loanToClose = 
this.loanRepositoryWrapper.findNonClosedLoanThatBelongsToClient(loanIdToClose, 
clientId);
                     if(loanToClose == null){
                         throw new 
GeneralPlatformDomainRuleException("error.msg.loan.loanIdToClose.no.active.loan.associated.to.client.found",
                                 "loanIdToClose is invalid, No Active Loan 
associated with the given Client ID found.");
@@ -330,7 +340,7 @@ public class 
LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
                 }
             }
 
-            this.loanRepository.save(newLoanApplication);
+            this.loanRepositoryWrapper.save(newLoanApplication);
 
             if (loanProduct.isInterestRecalculationEnabled()) {
                 
this.fromApiJsonDeserializer.validateLoanForInterestRecalculation(newLoanApplication);
@@ -341,7 +351,7 @@ public class 
LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
                 final AccountNumberFormat accountNumberFormat = 
this.accountNumberFormatRepository
                         .findByAccountType(EntityAccountType.LOAN);
                 
newLoanApplication.updateAccountNo(this.accountNumberGenerator.generate(newLoanApplication,
 accountNumberFormat));
-                this.loanRepository.save(newLoanApplication);
+                this.loanRepositoryWrapper.save(newLoanApplication);
             }
 
             final String submittedOnNote = 
command.stringValueOfParameterNamed("submittedOnNote");
@@ -552,7 +562,7 @@ public class 
LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
                 LoanChargeData chargeData = new LoanChargeData(charge.getId(), 
charge.getDueLocalDate(), charge.amountOrPercentage());
                 chargesMap.put(charge.getId(), chargeData);
             }
-            Set<LoanDisbursementDetails> disbursementDetails = 
this.loanUtilService.fetchDisbursementData(command.parsedJson()
+            List<LoanDisbursementDetails> disbursementDetails = 
this.loanUtilService.fetchDisbursementData(command.parsedJson()
                     .getAsJsonObject());
 
             /**
@@ -684,7 +694,7 @@ public class 
LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
                         if(existingLoanTopupDetails != null){
                             existingLoanIdToClose = 
existingLoanTopupDetails.getLoanIdToClose();
                         }
-                        final Loan loanToClose = 
this.loanRepository.findNonClosedLoanThatBelongsToClient(loanIdToClose, 
existingLoanApplication.getClientId());
+                        final Loan loanToClose = 
this.loanRepositoryWrapper.findNonClosedLoanThatBelongsToClient(loanIdToClose, 
existingLoanApplication.getClientId());
                         if(loanToClose == null){
                             throw new 
GeneralPlatformDomainRuleException("error.msg.loan.loanIdToClose.no.active.loan.associated.to.client.found",
                                     "loanIdToClose is invalid, No Active Loan 
associated with the given Client ID found.");
@@ -960,7 +970,7 @@ public class 
LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
             // updating loan interest recalculation details throwing null
             // pointer exception after saveAndFlush
             // 
http://stackoverflow.com/questions/17151757/hibernate-cascade-update-gives-null-pointer/17334374#17334374
-            this.loanRepository.save(existingLoanApplication);
+            this.loanRepositoryWrapper.save(existingLoanApplication);
 
             if (productRelatedDetail.isInterestRecalculationEnabled()) {
                 
this.fromApiJsonDeserializer.validateLoanForInterestRecalculation(existingLoanApplication);
@@ -1023,7 +1033,7 @@ public class 
LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
         final List<Note> relatedNotes = 
this.noteRepository.findByLoanId(loan.getId());
         this.noteRepository.deleteInBatch(relatedNotes);
 
-        this.loanRepository.delete(loanId);
+        this.loanRepositoryWrapper.delete(loanId);
 
         return new CommandProcessingResultBuilder() //
                 .withEntityId(loanId) //
@@ -1100,7 +1110,7 @@ public class 
LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
 
             if(loan.isTopup() && loan.getClientId() != null){
                 final Long loanIdToClose = 
loan.getTopupLoanDetails().getLoanIdToClose();
-                final Loan loanToClose = 
this.loanRepository.findNonClosedLoanThatBelongsToClient(loanIdToClose, 
loan.getClientId());
+                final Loan loanToClose = 
this.loanRepositoryWrapper.findNonClosedLoanThatBelongsToClient(loanIdToClose, 
loan.getClientId());
                 if(loanToClose == null){
                     throw new 
GeneralPlatformDomainRuleException("error.msg.loan.to.be.closed.with.topup.is.not.active",
                             "Loan to be closed with this topup is not 
active.");
@@ -1205,7 +1215,7 @@ public class 
LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
 
         final Map<String, Object> changes = 
loan.loanApplicationRejection(currentUser, command, 
defaultLoanLifecycleStateMachine());
         if (!changes.isEmpty()) {
-            this.loanRepository.save(loan);
+            this.loanRepositoryWrapper.save(loan);
 
             final String noteText = 
command.stringValueOfParameterNamed("note");
             if (StringUtils.isNotBlank(noteText)) {
@@ -1239,7 +1249,7 @@ public class 
LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
         final Map<String, Object> changes = 
loan.loanApplicationWithdrawnByApplicant(currentUser, command,
                 defaultLoanLifecycleStateMachine());
         if (!changes.isEmpty()) {
-            this.loanRepository.save(loan);
+            this.loanRepositoryWrapper.save(loan);
 
             final String noteText = 
command.stringValueOfParameterNamed("note");
             if (StringUtils.isNotBlank(noteText)) {
@@ -1260,8 +1270,7 @@ public class 
LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
     }
 
     private Loan retrieveLoanBy(final Long loanId) {
-        final Loan loan = this.loanRepository.findOne(loanId);
-        if (loan == null) { throw new LoanNotFoundException(loanId); }
+        final Loan loan = 
this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true);
         loan.setHelpers(defaultLoanLifecycleStateMachine(), 
this.loanSummaryWrapper, this.loanRepaymentScheduleTransactionProcessorFactory);
         return loan;
     }
@@ -1311,7 +1320,7 @@ public class 
LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
                     
this.repaymentScheduleInstallmentRepository.save(installment);
                 }
             }
-            this.loanRepository.saveAndFlush(loan);
+            this.loanRepositoryWrapper.saveAndFlush(loan);
         } catch (final DataIntegrityViolationException e) {
             final Throwable realCause = e.getCause();
             final List<ApiParameterError> dataValidationErrors = new 
ArrayList<>();

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAssembler.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAssembler.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAssembler.java
index 93df756..2d124bf 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAssembler.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAssembler.java
@@ -138,7 +138,7 @@ public class LoanAssembler {
     }
 
     public Loan assembleFrom(final Long accountId) {
-        final Loan loanAccount = 
this.loanRepository.findOneWithNotFoundDetection(accountId);
+        final Loan loanAccount = 
this.loanRepository.findOneWithNotFoundDetection(accountId, true);
         loanAccount.setHelpers(defaultLoanLifecycleStateMachine(), 
this.loanSummaryWrapper,
                 this.loanRepaymentScheduleTransactionProcessorFactory);
 
@@ -181,7 +181,7 @@ public class LoanAssembler {
         if (loanPurposeId != null) {
             loanPurpose = 
this.codeValueRepository.findOneWithNotFoundDetection(loanPurposeId);
         }
-        Set<LoanDisbursementDetails> disbursementDetails = null;
+        List<LoanDisbursementDetails> disbursementDetails = null;
         BigDecimal fixedEmiAmount = null;
         if (loanProduct.isMultiDisburseLoan() || 
loanProduct.canDefineInstallmentAmount()) {
             fixedEmiAmount = 
this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(LoanApiConstants.emiAmountParameterName,
 element);

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/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 13b3839..67bd9aa 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
@@ -65,7 +65,7 @@ public class LoanChargeAssembler {
         this.loanProductRepository = loanProductRepository;
     }
 
-    public Set<LoanCharge> fromParsedJson(final JsonElement element, 
Set<LoanDisbursementDetails> disbursementDetails) {
+    public Set<LoanCharge> fromParsedJson(final JsonElement element, 
List<LoanDisbursementDetails> disbursementDetails) {
         JsonArray jsonDisbursement = 
this.fromApiJsonHelper.extractJsonArrayNamed("disbursementData", element);
         List<Long> disbursementChargeIds = new ArrayList<>();
 

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java
index 0050675..75a44ea 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java
@@ -93,6 +93,7 @@ import org.apache.fineract.portfolio.loanaccount.domain.Loan;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleTransactionProcessorFactory;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository;
+import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanSubStatus;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariationType;
@@ -132,7 +133,7 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService {
 
     private final JdbcTemplate jdbcTemplate;
     private final PlatformSecurityContext context;
-    private final LoanRepository loanRepository;
+    private final LoanRepositoryWrapper loanRepositoryWrapper ;
     private final ApplicationCurrencyRepositoryWrapper 
applicationCurrencyRepository;
     private final LoanProductReadPlatformService 
loanProductReadPlatformService;
     private final ClientReadPlatformService clientReadPlatformService;
@@ -155,8 +156,7 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService {
     private final AccountDetailsReadPlatformService 
accountDetailsReadPlatformService;
 
     @Autowired
-    public LoanReadPlatformServiceImpl(final PlatformSecurityContext context, 
final LoanRepository loanRepository,
-            final ApplicationCurrencyRepositoryWrapper 
applicationCurrencyRepository,
+    public LoanReadPlatformServiceImpl(final PlatformSecurityContext context, 
final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository,
             final LoanProductReadPlatformService 
loanProductReadPlatformService, final ClientReadPlatformService 
clientReadPlatformService,
             final GroupReadPlatformService groupReadPlatformService, final 
LoanDropdownReadPlatformService loanDropdownReadPlatformService,
             final FundReadPlatformService fundReadPlatformService, final 
ChargeReadPlatformService chargeReadPlatformService,
@@ -166,9 +166,10 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService {
             final LoanRepaymentScheduleTransactionProcessorFactory 
loanRepaymentScheduleTransactionProcessorFactory,
             final FloatingRatesReadPlatformService 
floatingRatesReadPlatformService, final LoanUtilService loanUtilService,
             final ConfigurationDomainService configurationDomainService,
-            final AccountDetailsReadPlatformService 
accountDetailsReadPlatformService) {
+            final AccountDetailsReadPlatformService 
accountDetailsReadPlatformService,
+            final LoanRepositoryWrapper loanRepositoryWrapper) {
         this.context = context;
-        this.loanRepository = loanRepository;
+        this.loanRepositoryWrapper = loanRepositoryWrapper ;
         this.applicationCurrencyRepository = applicationCurrencyRepository;
         this.loanProductReadPlatformService = loanProductReadPlatformService;
         this.clientReadPlatformService = clientReadPlatformService;
@@ -401,8 +402,7 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService {
 
         this.context.authenticatedUser();
 
-        final Loan loan = this.loanRepository.findOne(loanId);
-        if (loan == null) { throw new LoanNotFoundException(loanId); }
+        final Loan loan = 
this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true);
         loan.setHelpers(null, null, 
loanRepaymentScheduleTransactionProcessorFactory);
 
         final MonetaryCurrency currency = loan.getCurrency();
@@ -434,9 +434,7 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService {
         // TODO - KW -OPTIMIZE - write simple sql query to fetch back overdue
         // interest that can be waived along with the date of repayment period
         // interest is overdue.
-        final Loan loan = this.loanRepository.findOne(loanId);
-        if (loan == null) { throw new LoanNotFoundException(loanId); }
-
+        final Loan loan = 
this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true);
         final MonetaryCurrency currency = loan.getCurrency();
         final ApplicationCurrency applicationCurrency = 
this.applicationCurrencyRepository.findOneWithNotFoundDetection(currency);
         final CurrencyData currencyData = applicationCurrency.toData();
@@ -467,18 +465,13 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService {
 
     @Override
     public LoanApprovalData retrieveApprovalTemplate(final Long loanId) {
-
-        final Loan loan = this.loanRepository.findOne(loanId);
-        if (loan == null) { throw new LoanNotFoundException(loanId); }
-
+        final Loan loan = 
this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true);
         return new LoanApprovalData(loan.getProposedPrincipal(), 
DateUtils.getLocalDateOfTenant());
-
     }
 
     @Override
     public LoanTransactionData retrieveDisbursalTemplate(final Long loanId, 
boolean paymentDetailsRequired) {
-        final Loan loan = this.loanRepository.findOne(loanId);
-        if (loan == null) { throw new LoanNotFoundException(loanId); }
+        final Loan loan = 
this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true);
         final LoanTransactionEnumData transactionType = 
LoanEnumerations.transactionType(LoanTransactionType.DISBURSEMENT);
         Collection<PaymentTypeData> paymentOptions = null;
         if (paymentDetailsRequired) {
@@ -1721,8 +1714,7 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService {
 
     @Override
     public LoanTransactionData retrieveRecoveryPaymentTemplate(Long loanId) {
-        final Loan loan = this.loanRepository.findOne(loanId);
-        if (loan == null) { throw new LoanNotFoundException(loanId); }
+        final Loan loan = 
this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true);
         final LoanTransactionEnumData transactionType = 
LoanEnumerations.transactionType(LoanTransactionType.RECOVERY_REPAYMENT);
         final Collection<PaymentTypeData> paymentOptions = 
this.paymentTypeReadPlatformService.retrieveAllPaymentTypes();
         BigDecimal outstandingLoanBalance = null;
@@ -1961,9 +1953,7 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService {
 
         // TODO - KW - OPTIMIZE - write simple sql query to fetch back date of
         // possible next transaction date.
-        final Loan loan = this.loanRepository.findOne(loanId);
-        if (loan == null) { throw new LoanNotFoundException(loanId); }
-
+        final Loan loan = 
this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true);
         final MonetaryCurrency currency = loan.getCurrency();
         final ApplicationCurrency applicationCurrency = 
this.applicationCurrencyRepository.findOneWithNotFoundDetection(currency);
 
@@ -2047,8 +2037,7 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService {
     public LoanTransactionData retrieveLoanForeclosureTemplate(final Long 
loanId, final LocalDate transactionDate) {
         this.context.authenticatedUser();
 
-        final Loan loan = this.loanRepository.findOne(loanId);
-        if (loan == null) { throw new LoanNotFoundException(loanId); }
+        final Loan loan = 
this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true);
         loan.validateForForeclosure(transactionDate);
         final MonetaryCurrency currency = loan.getCurrency();
         final ApplicationCurrency applicationCurrency = 
this.applicationCurrencyRepository.findOneWithNotFoundDetection(currency);

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanUtilService.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanUtilService.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanUtilService.java
index e17312e..ec85b83 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanUtilService.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanUtilService.java
@@ -19,6 +19,7 @@
 package org.apache.fineract.portfolio.loanaccount.service;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
@@ -289,10 +290,10 @@ public class LoanUtilService {
         return calculatedRepaymentsStartingFromDate;
     }
     
-    public Set<LoanDisbursementDetails> fetchDisbursementData(final JsonObject 
command) {
+    public List<LoanDisbursementDetails> fetchDisbursementData(final 
JsonObject command) {
         final Locale locale = 
this.fromApiJsonHelper.extractLocaleParameter(command);
         final String dateFormat = 
this.fromApiJsonHelper.extractDateFormatParameter(command);
-        Set<LoanDisbursementDetails> disbursementDatas = new HashSet<>();
+        List<LoanDisbursementDetails> disbursementDatas = new ArrayList<>();
         if (command.has(LoanApiConstants.disbursementDataParameterName)) {
             final JsonArray disbursementDataArray = 
command.getAsJsonArray(LoanApiConstants.disbursementDataParameterName);
             if (disbursementDataArray != null && disbursementDataArray.size() 
> 0) {

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformService.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformService.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformService.java
index b21c9a8..858133d 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformService.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformService.java
@@ -30,6 +30,7 @@ import org.apache.fineract.portfolio.calendar.domain.Calendar;
 import org.apache.fineract.portfolio.calendar.domain.CalendarInstance;
 import 
org.apache.fineract.portfolio.collectionsheet.command.CollectionSheetBulkDisbursalCommand;
 import 
org.apache.fineract.portfolio.collectionsheet.command.CollectionSheetBulkRepaymentCommand;
+import org.apache.fineract.portfolio.loanaccount.domain.Loan;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction;
 import 
org.apache.fineract.portfolio.loanaccount.loanschedule.data.OverdueLoanScheduleData;
 import org.joda.time.LocalDate;
@@ -76,13 +77,13 @@ public interface LoanWritePlatformService {
 
     void applyHolidaysToLoans();
 
-    LoanTransaction initiateLoanTransfer(Long accountId, LocalDate 
transferDate);
+    LoanTransaction initiateLoanTransfer(Loan loan, LocalDate transferDate);
 
-    LoanTransaction withdrawLoanTransfer(Long accountId, LocalDate 
transferDate);
+    LoanTransaction withdrawLoanTransfer(final Loan loan, LocalDate 
transferDate);
 
-    void rejectLoanTransfer(Long accountId);
+    void rejectLoanTransfer(final Loan loan);
 
-    LoanTransaction acceptLoanTransfer(Long accountId, LocalDate transferDate, 
Office acceptedInOffice, Staff loanOfficer);
+    LoanTransaction acceptLoanTransfer(Loan loan, LocalDate transferDate, 
Office acceptedInOffice, Staff loanOfficer);
 
     CommandProcessingResult payLoanCharge(Long loanId, Long loanChargeId, 
JsonCommand command, boolean isChargeIdIncludedInJson);
 

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
index 3630ee4..8850bf4 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
@@ -135,7 +135,7 @@ import 
org.apache.fineract.portfolio.loanaccount.domain.LoanOverdueInstallmentCh
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallmentRepository;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleTransactionProcessorFactory;
-import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository;
+import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanSubStatus;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanSummaryWrapper;
@@ -143,7 +143,16 @@ import 
org.apache.fineract.portfolio.loanaccount.domain.LoanTrancheDisbursementC
 import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType;
-import org.apache.fineract.portfolio.loanaccount.exception.*;
+import 
org.apache.fineract.portfolio.loanaccount.exception.DateMismatchException;
+import 
org.apache.fineract.portfolio.loanaccount.exception.ExceedingTrancheCountException;
+import 
org.apache.fineract.portfolio.loanaccount.exception.InvalidPaidInAdvanceAmountException;
+import 
org.apache.fineract.portfolio.loanaccount.exception.LoanDisbursalException;
+import 
org.apache.fineract.portfolio.loanaccount.exception.LoanForeclosureException;
+import 
org.apache.fineract.portfolio.loanaccount.exception.LoanMultiDisbursementException;
+import 
org.apache.fineract.portfolio.loanaccount.exception.LoanOfficerAssignmentException;
+import 
org.apache.fineract.portfolio.loanaccount.exception.LoanOfficerUnassignmentException;
+import 
org.apache.fineract.portfolio.loanaccount.exception.LoanTransactionNotFoundException;
+import 
org.apache.fineract.portfolio.loanaccount.exception.MultiDisbursementDataRequiredException;
 import 
org.apache.fineract.portfolio.loanaccount.guarantor.service.GuarantorDomainService;
 import 
org.apache.fineract.portfolio.loanaccount.loanschedule.data.OverdueLoanScheduleData;
 import 
org.apache.fineract.portfolio.loanaccount.loanschedule.domain.DefaultScheduledDateGenerator;
@@ -190,7 +199,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
     private final PlatformSecurityContext context;
     private final LoanEventApiJsonValidator loanEventApiJsonValidator;
     private final LoanUpdateCommandFromApiJsonDeserializer 
loanUpdateCommandFromApiJsonDeserializer;
-    private final LoanRepository loanRepository;
+    private final LoanRepositoryWrapper loanRepositoryWrapper ;
     private final LoanAccountDomainService loanAccountDomainService;
     private final NoteRepository noteRepository;
     private final LoanTransactionRepository loanTransactionRepository;
@@ -229,7 +238,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
     public LoanWritePlatformServiceJpaRepositoryImpl(final 
PlatformSecurityContext context,
             final LoanEventApiJsonValidator loanEventApiJsonValidator,
             final LoanUpdateCommandFromApiJsonDeserializer 
loanUpdateCommandFromApiJsonDeserializer, final LoanAssembler loanAssembler,
-            final LoanRepository loanRepository, final 
LoanAccountDomainService loanAccountDomainService,
+            final LoanAccountDomainService loanAccountDomainService,
             final LoanTransactionRepository loanTransactionRepository, final 
NoteRepository noteRepository,
             final ChargeRepositoryWrapper chargeRepository, final 
LoanChargeRepository loanChargeRepository,
             final ApplicationCurrencyRepositoryWrapper 
applicationCurrencyRepository,
@@ -252,11 +261,12 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
             final BusinessEventNotifierService businessEventNotifierService, 
final GuarantorDomainService guarantorDomainService,
             final LoanUtilService loanUtilService, final LoanSummaryWrapper 
loanSummaryWrapper,
             final LoanRepaymentScheduleTransactionProcessorFactory 
transactionProcessingStrategy,
-            final CodeValueRepositoryWrapper codeValueRepository) {
+            final CodeValueRepositoryWrapper codeValueRepository,
+            final LoanRepositoryWrapper loanRepositoryWrapper) {
         this.context = context;
         this.loanEventApiJsonValidator = loanEventApiJsonValidator;
         this.loanAssembler = loanAssembler;
-        this.loanRepository = loanRepository;
+        this.loanRepositoryWrapper = loanRepositoryWrapper ;
         this.loanAccountDomainService = loanAccountDomainService;
         this.loanTransactionRepository = loanTransactionRepository;
         this.noteRepository = noteRepository;
@@ -360,7 +370,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
 
             if(loan.isTopup() && loan.getClientId() != null){
                 final Long loanIdToClose = 
loan.getTopupLoanDetails().getLoanIdToClose();
-                final Loan loanToClose = 
this.loanRepository.findNonClosedLoanThatBelongsToClient(loanIdToClose, 
loan.getClientId());
+                final Loan loanToClose = 
this.loanRepositoryWrapper.findNonClosedLoanThatBelongsToClient(loanIdToClose, 
loan.getClientId());
                 if(loanToClose == null){
                     throw new 
GeneralPlatformDomainRuleException("error.msg.loan.to.be.closed.with.topup.is.not.active",
                             "Loan to be closed with this topup is not 
active.");
@@ -545,7 +555,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
                     
this.repaymentScheduleInstallmentRepository.save(installment);
                 }
             }
-            this.loanRepository.saveAndFlush(loan);
+            this.loanRepositoryWrapper.saveAndFlush(loan);
         } catch (final DataIntegrityViolationException e) {
             final Throwable realCause = e.getCause();
             final List<ApiParameterError> dataValidationErrors = new 
ArrayList<>();
@@ -566,7 +576,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
                     
this.repaymentScheduleInstallmentRepository.save(installment);
                 }
             }
-            this.loanRepository.save(loan);
+            this.loanRepositoryWrapper.save(loan);
         } catch (final DataIntegrityViolationException e) {
             final Throwable realCause = e.getCause();
             final List<ApiParameterError> dataValidationErrors = new 
ArrayList<>();
@@ -814,8 +824,8 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
         final boolean allowTransactionsOnHoliday = 
this.configurationDomainService.allowTransactionsOnHolidayEnabled();
         for (final SingleRepaymentCommand singleLoanRepaymentCommand : 
repaymentCommand) {
             if (singleLoanRepaymentCommand != null) {
-                Loan loans = 
this.loanRepository.findOne(singleLoanRepaymentCommand.getLoanId());
-                final List<Holiday> holidays = 
this.holidayRepository.findByOfficeIdAndGreaterThanDate(loans.getOfficeId(),
+                Loan loan = 
this.loanRepositoryWrapper.findOneWithNotFoundDetection(singleLoanRepaymentCommand.getLoanId());
+                final List<Holiday> holidays = 
this.holidayRepository.findByOfficeIdAndGreaterThanDate(loan.getOfficeId(),
                         
singleLoanRepaymentCommand.getTransactionDate().toDate());
                 final WorkingDays workingDays = 
this.workingDaysRepository.findOne();
                 final boolean allowTransactionsOnNonWorkingDay = 
this.configurationDomainService.allowTransactionsOnNonWorkingDayEnabled();
@@ -823,9 +833,9 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
                 isHolidayEnabled = 
this.configurationDomainService.isRescheduleRepaymentsOnHolidaysEnabled();
                 holidayDetailDTO = new HolidayDetailDTO(isHolidayEnabled, 
holidays, workingDays, allowTransactionsOnHoliday,
                         allowTransactionsOnNonWorkingDay);
-                
loans.validateRepaymentDateIsOnHoliday(singleLoanRepaymentCommand.getTransactionDate(),
+                
loan.validateRepaymentDateIsOnHoliday(singleLoanRepaymentCommand.getTransactionDate(),
                         holidayDetailDTO.isAllowTransactionsOnHoliday(), 
holidayDetailDTO.getHolidays());
-                
loans.validateRepaymentDateIsOnNonWorkingDay(singleLoanRepaymentCommand.getTransactionDate(),
+                
loan.validateRepaymentDateIsOnNonWorkingDay(singleLoanRepaymentCommand.getTransactionDate(),
                         holidayDetailDTO.getWorkingDays(), 
holidayDetailDTO.isAllowTransactionsOnNonWorkingDay());
                 isHolidayValidationDone = true;
                 break;
@@ -962,7 +972,8 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
         }
 
         Collection<Long> transactionIds = new ArrayList<>();
-        for (LoanTransaction transaction : loan.getLoanTransactions()) {
+        List<LoanTransaction> transactions = loan.getLoanTransactions() ;
+        for (LoanTransaction transaction : transactions) {
             if (transaction.isRefund() && transaction.isNotReversed()) {
                 transactionIds.add(transaction.getId());
             }
@@ -1277,7 +1288,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
                 .build();
     }
 
-    private void validateAddingNewChargeAllowed(Set<LoanDisbursementDetails> 
loanDisburseDetails) {
+    private void validateAddingNewChargeAllowed(List<LoanDisbursementDetails> 
loanDisburseDetails) {
         boolean pendingDisbursementAvailable = false;
         for (LoanDisbursementDetails disbursementDetail : loanDisburseDetails) 
{
             if (disbursementDetail.actualDisbursementDate() == null) {
@@ -1299,7 +1310,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
         final Loan loan = this.loanAssembler.assembleFrom(loanId);
         checkClientOrGroupActive(loan);
 
-        Set<LoanDisbursementDetails> loanDisburseDetails = 
loan.getDisbursementDetails();
+        List<LoanDisbursementDetails> loanDisburseDetails = 
loan.getDisbursementDetails();
         final Long chargeDefinitionId = 
command.longValueOfParameterNamed("chargeId");
         final Charge chargeDefinition = 
this.chargeRepository.findOneWithNotFoundDetection(chargeDefinitionId);
 
@@ -1823,11 +1834,10 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
 
     @Transactional
     @Override
-    public LoanTransaction initiateLoanTransfer(final Long accountId, final 
LocalDate transferDate) {
+    public LoanTransaction initiateLoanTransfer(final Loan loan, final 
LocalDate transferDate) {
 
         AppUser currentUser = getAppUserIfPresent();
-
-        final Loan loan = this.loanAssembler.assembleFrom(accountId);
+        this.loanAssembler.setHelpers(loan);
         checkClientOrGroupActive(loan);
         
this.businessEventNotifierService.notifyBusinessEventToBeExecuted(BUSINESS_EVENTS.LOAN_INITIATE_TRANSFER,
                 constructEntityMap(BUSINESS_ENTITY.LOAN, loan));
@@ -1851,12 +1861,10 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
 
     @Transactional
     @Override
-    public LoanTransaction acceptLoanTransfer(final Long accountId, final 
LocalDate transferDate, final Office acceptedInOffice,
+    public LoanTransaction acceptLoanTransfer(final Loan loan, final LocalDate 
transferDate, final Office acceptedInOffice,
             final Staff loanOfficer) {
-
         AppUser currentUser = getAppUserIfPresent();
-
-        final Loan loan = this.loanAssembler.assembleFrom(accountId);
+        this.loanAssembler.setHelpers(loan) ;
         
this.businessEventNotifierService.notifyBusinessEventToBeExecuted(BUSINESS_EVENTS.LOAN_ACCEPT_TRANSFER,
                 constructEntityMap(BUSINESS_ENTITY.LOAN, loan));
         final List<Long> existingTransactionIds = new 
ArrayList<>(loan.findExistingTransactionIds());
@@ -1886,11 +1894,9 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
 
     @Transactional
     @Override
-    public LoanTransaction withdrawLoanTransfer(final Long accountId, final 
LocalDate transferDate) {
-
+    public LoanTransaction withdrawLoanTransfer(final Loan loan, final 
LocalDate transferDate) {
         AppUser currentUser = getAppUserIfPresent();
-
-        final Loan loan = this.loanAssembler.assembleFrom(accountId);
+        this.loanAssembler.setHelpers(loan);
         
this.businessEventNotifierService.notifyBusinessEventToBeExecuted(BUSINESS_EVENTS.LOAN_WITHDRAW_TRANSFER,
                 constructEntityMap(BUSINESS_ENTITY.LOAN, loan));
 
@@ -1914,8 +1920,8 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
 
     @Transactional
     @Override
-    public void rejectLoanTransfer(final Long accountId) {
-        final Loan loan = this.loanAssembler.assembleFrom(accountId);
+    public void rejectLoanTransfer(final Loan loan) {
+        this.loanAssembler.setHelpers(loan);
         
this.businessEventNotifierService.notifyBusinessEventToBeExecuted(BUSINESS_EVENTS.LOAN_REJECT_TRANSFER,
                 constructEntityMap(BUSINESS_ENTITY.LOAN, loan));
         loan.setLoanStatus(LoanStatus.TRANSFER_ON_HOLD.getValue());
@@ -1988,7 +1994,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
             
this.businessEventNotifierService.notifyBusinessEventWasExecuted(BUSINESS_EVENTS.LOAN_REASSIGN_OFFICER,
                     constructEntityMap(BUSINESS_ENTITY.LOAN, loan));
         }
-        this.loanRepository.flush();
+        this.loanRepositoryWrapper.flush();
 
         return new CommandProcessingResultBuilder() //
                 .withCommandId(command.commandId()) //
@@ -2070,7 +2076,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
             loanIds.add(calendarInstance.getEntityId());
         }
 
-        final List<Loan> loans = 
this.loanRepository.findByIdsAndLoanStatusAndLoanType(loanIds, loanStatuses, 
loanTypes);
+        final List<Loan> loans = 
this.loanRepositoryWrapper.findByIdsAndLoanStatusAndLoanType(loanIds, 
loanStatuses, loanTypes);
         List<Holiday> holidays = null;
         final LocalDate recalculateFrom = null;
         // loop through each loan to reschedule the repayment dates
@@ -2116,19 +2122,19 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
         final List<Loan> loansToUpdate;
         if (loan.isGroupLoan()) {
             if (loan.loanProduct().isIncludeInBorrowerCycle()) {
-                loansToUpdate = 
this.loanRepository.getGroupLoansToUpdateLoanCounter(loan.getCurrentLoanCounter(),
 loan.getGroupId(),
+                loansToUpdate = 
this.loanRepositoryWrapper.getGroupLoansToUpdateLoanCounter(loan.getCurrentLoanCounter(),
 loan.getGroupId(),
                         AccountType.GROUP.getValue());
             } else {
-                loansToUpdate = 
this.loanRepository.getGroupLoansToUpdateLoanProductCounter(loan.getLoanProductLoanCounter(),
+                loansToUpdate = 
this.loanRepositoryWrapper.getGroupLoansToUpdateLoanProductCounter(loan.getLoanProductLoanCounter(),
                         loan.getGroupId(), AccountType.GROUP.getValue());
             }
 
         } else {
             if (loan.loanProduct().isIncludeInBorrowerCycle()) {
-                loansToUpdate = this.loanRepository
+                loansToUpdate = this.loanRepositoryWrapper
                         
.getClientOrJLGLoansToUpdateLoanCounter(loan.getCurrentLoanCounter(), 
loan.getClientId());
             } else {
-                loansToUpdate = 
this.loanRepository.getClientLoansToUpdateLoanProductCounter(loan.getLoanProductLoanCounter(),
+                loansToUpdate = 
this.loanRepositoryWrapper.getClientLoansToUpdateLoanProductCounter(loan.getLoanProductLoanCounter(),
                         loan.getClientId());
             }
 
@@ -2144,13 +2150,13 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
     private void updateLoanCounters(final Loan loan, final LocalDate 
actualDisbursementDate) {
 
         if (loan.isGroupLoan()) {
-            final List<Loan> loansToUpdateForLoanCounter = 
this.loanRepository.getGroupLoansDisbursedAfter(actualDisbursementDate.toDate(),
+            final List<Loan> loansToUpdateForLoanCounter = 
this.loanRepositoryWrapper.getGroupLoansDisbursedAfter(actualDisbursementDate.toDate(),
                     loan.getGroupId(), AccountType.GROUP.getValue());
             final Integer newLoanCounter = getNewGroupLoanCounter(loan);
             final Integer newLoanProductCounter = 
getNewGroupLoanProductCounter(loan);
             updateLoanCounter(loan, loansToUpdateForLoanCounter, 
newLoanCounter, newLoanProductCounter);
         } else {
-            final List<Loan> loansToUpdateForLoanCounter = 
this.loanRepository.getClientOrJLGLoansDisbursedAfter(
+            final List<Loan> loansToUpdateForLoanCounter = 
this.loanRepositoryWrapper.getClientOrJLGLoansDisbursedAfter(
                     actualDisbursementDate.toDate(), loan.getClientId());
             final Integer newLoanCounter = getNewClientOrJLGLoanCounter(loan);
             final Integer newLoanProductCounter = 
getNewClientOrJLGLoanProductCounter(loan);
@@ -2160,7 +2166,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
 
     private Integer getNewGroupLoanCounter(final Loan loan) {
 
-        Integer maxClientLoanCounter = 
this.loanRepository.getMaxGroupLoanCounter(loan.getGroupId(), 
AccountType.GROUP.getValue());
+        Integer maxClientLoanCounter = 
this.loanRepositoryWrapper.getMaxGroupLoanCounter(loan.getGroupId(), 
AccountType.GROUP.getValue());
         if (maxClientLoanCounter == null) {
             maxClientLoanCounter = 1;
         } else {
@@ -2171,7 +2177,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
 
     private Integer getNewGroupLoanProductCounter(final Loan loan) {
 
-        Integer maxLoanProductLoanCounter = 
this.loanRepository.getMaxGroupLoanProductCounter(loan.loanProduct().getId(),
+        Integer maxLoanProductLoanCounter = 
this.loanRepositoryWrapper.getMaxGroupLoanProductCounter(loan.loanProduct().getId(),
                 loan.getGroupId(), AccountType.GROUP.getValue());
         if (maxLoanProductLoanCounter == null) {
             maxLoanProductLoanCounter = 1;
@@ -2211,12 +2217,12 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
             loan.updateClientLoanCounter(null);
         }
         loan.updateLoanProductLoanCounter(newLoanProductCounter);
-        this.loanRepository.save(loansToUpdateForLoanCounter);
+        this.loanRepositoryWrapper.save(loansToUpdateForLoanCounter);
     }
 
     private Integer getNewClientOrJLGLoanCounter(final Loan loan) {
 
-        Integer maxClientLoanCounter = 
this.loanRepository.getMaxClientOrJLGLoanCounter(loan.getClientId());
+        Integer maxClientLoanCounter = 
this.loanRepositoryWrapper.getMaxClientOrJLGLoanCounter(loan.getClientId());
         if (maxClientLoanCounter == null) {
             maxClientLoanCounter = 1;
         } else {
@@ -2227,7 +2233,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
 
     private Integer getNewClientOrJLGLoanProductCounter(final Loan loan) {
 
-        Integer maxLoanProductLoanCounter = 
this.loanRepository.getMaxClientOrJLGLoanProductCounter(loan.loanProduct().getId(),
+        Integer maxLoanProductLoanCounter = 
this.loanRepositoryWrapper.getMaxClientOrJLGLoanProductCounter(loan.loanProduct().getId(),
                 loan.getClientId());
         if (maxLoanProductLoanCounter == null) {
             maxLoanProductLoanCounter = 1;
@@ -2256,7 +2262,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
                 }
             }
         }
-        this.loanRepository.save(loansToUpdate);
+        this.loanRepositoryWrapper.save(loansToUpdate);
     }
 
     @Transactional
@@ -2285,17 +2291,17 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
             // get all loans
             final List<Loan> loans = new ArrayList<>();
             // get all individual and jlg loans
-            
loans.addAll(this.loanRepository.findByClientOfficeIdsAndLoanStatus(officeIds, 
loanStatuses));
+            
loans.addAll(this.loanRepositoryWrapper.findByClientOfficeIdsAndLoanStatus(officeIds,
 loanStatuses));
             // FIXME: AA optimize to get all client and group loans belongs to 
a
             // office id
             // get all group loans
-            
loans.addAll(this.loanRepository.findByGroupOfficeIdsAndLoanStatus(officeIds, 
loanStatuses));
+            
loans.addAll(this.loanRepositoryWrapper.findByGroupOfficeIdsAndLoanStatus(officeIds,
 loanStatuses));
 
             for (final Loan loan : loans) {
                 // apply holiday
                 loan.applyHolidayToRepaymentScheduleDates(holiday);
             }
-            this.loanRepository.save(loans);
+            this.loanRepositoryWrapper.save(loans);
             holiday.processed();
         }
         this.holidayRepository.save(holidays);
@@ -2307,10 +2313,10 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
         final Long productId = loan.loanProduct().getId();
 
         if (loan.isGroupLoan()) {
-            activeLoansLoanProductIds = 
this.loanRepository.findActiveLoansLoanProductIdsByGroup(loan.getGroupId(),
+            activeLoansLoanProductIds = 
this.loanRepositoryWrapper.findActiveLoansLoanProductIdsByGroup(loan.getGroupId(),
                     LoanStatus.ACTIVE.getValue());
         } else {
-            activeLoansLoanProductIds = 
this.loanRepository.findActiveLoansLoanProductIdsByClient(loan.getClientId(),
+            activeLoansLoanProductIds = 
this.loanRepositoryWrapper.findActiveLoansLoanProductIdsByClient(loan.getClientId(),
                     LoanStatus.ACTIVE.getValue());
         }
         checkForProductMixRestrictions(activeLoansLoanProductIds, productId, 
loan.loanProduct().productName());

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/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 723de30..6e0ab74 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
@@ -28,7 +28,6 @@ import 
org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
 import 
org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder;
 import 
org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
 import 
org.apache.fineract.infrastructure.entityaccess.domain.FineractEntityAccessType;
-import 
org.apache.fineract.infrastructure.entityaccess.domain.FineractEntityType;
 import 
org.apache.fineract.infrastructure.entityaccess.service.FineractEntityAccessUtil;
 import 
org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
 import org.apache.fineract.portfolio.charge.domain.Charge;
@@ -38,7 +37,7 @@ import 
org.apache.fineract.portfolio.floatingrates.domain.FloatingRateRepository
 import org.apache.fineract.portfolio.fund.domain.Fund;
 import org.apache.fineract.portfolio.fund.domain.FundRepository;
 import org.apache.fineract.portfolio.fund.exception.FundNotFoundException;
-import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository;
+import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionProcessingStrategyRepository;
 import 
org.apache.fineract.portfolio.loanaccount.exception.LoanTransactionProcessingStrategyNotFoundException;
 import 
org.apache.fineract.portfolio.loanaccount.loanschedule.domain.AprCalculator;
@@ -75,7 +74,7 @@ public class LoanProductWritePlatformServiceJpaRepositoryImpl 
implements LoanPro
     private final ProductToGLAccountMappingWritePlatformService 
accountMappingWritePlatformService;
     private final FineractEntityAccessUtil fineractEntityAccessUtil;
     private final FloatingRateRepositoryWrapper floatingRateRepository;
-    private final LoanRepository loanRepository;
+    private final LoanRepositoryWrapper loanRepositoryWrapper;
 
     @Autowired
     public LoanProductWritePlatformServiceJpaRepositoryImpl(final 
PlatformSecurityContext context,
@@ -86,7 +85,7 @@ public class LoanProductWritePlatformServiceJpaRepositoryImpl 
implements LoanPro
             final ProductToGLAccountMappingWritePlatformService 
accountMappingWritePlatformService,
             final FineractEntityAccessUtil fineractEntityAccessUtil,
             final FloatingRateRepositoryWrapper floatingRateRepository,
-            final LoanRepository loanRepository) {
+            final LoanRepositoryWrapper loanRepositoryWrapper) {
         this.context = context;
         this.fromApiJsonDeserializer = fromApiJsonDeserializer;
         this.loanProductRepository = loanProductRepository;
@@ -97,7 +96,7 @@ public class LoanProductWritePlatformServiceJpaRepositoryImpl 
implements LoanPro
         this.accountMappingWritePlatformService = 
accountMappingWritePlatformService;
         this.fineractEntityAccessUtil = fineractEntityAccessUtil;
         this.floatingRateRepository = floatingRateRepository;
-        this.loanRepository = loanRepository;
+        this.loanRepositoryWrapper = loanRepositoryWrapper;
     }
 
     @Transactional
@@ -182,7 +181,7 @@ public class 
LoanProductWritePlatformServiceJpaRepositoryImpl implements LoanPro
             validateInputDates(command);
 
             if(anyChangeInCriticalFloatingRateLinkedParams(command, product) 
-                       && 
this.loanRepository.doNonClosedLoanAccountsExistForProduct(product.getId())){
+                       && 
this.loanRepositoryWrapper.doNonClosedLoanAccountsExistForProduct(product.getId())){
                throw new 
LoanProductCannotBeModifiedDueToNonClosedLoansException(product.getId());
             }
             

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/service/MeetingWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/service/MeetingWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/service/MeetingWritePlatformServiceJpaRepositoryImpl.java
index 5ed8e10..495c3c6 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/service/MeetingWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/service/MeetingWritePlatformServiceJpaRepositoryImpl.java
@@ -37,7 +37,6 @@ import 
org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
 import 
org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder;
 import 
org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
 import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper;
-import org.apache.fineract.portfolio.calendar.data.CalendarData;
 import org.apache.fineract.portfolio.calendar.domain.Calendar;
 import org.apache.fineract.portfolio.calendar.domain.CalendarEntityType;
 import org.apache.fineract.portfolio.calendar.domain.CalendarInstance;
@@ -45,9 +44,8 @@ import 
org.apache.fineract.portfolio.calendar.domain.CalendarInstanceRepository;
 import org.apache.fineract.portfolio.calendar.domain.CalendarRepository;
 import 
org.apache.fineract.portfolio.calendar.exception.CalendarInstanceNotFoundException;
 import 
org.apache.fineract.portfolio.calendar.exception.CalendarNotFoundException;
-import 
org.apache.fineract.portfolio.calendar.service.CalendarReadPlatformService;
 import org.apache.fineract.portfolio.client.domain.Client;
-import org.apache.fineract.portfolio.client.domain.ClientRepository;
+import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper;
 import org.apache.fineract.portfolio.group.domain.Group;
 import org.apache.fineract.portfolio.group.domain.GroupRepository;
 import org.apache.fineract.portfolio.group.exception.ClientNotInGroupException;
@@ -73,28 +71,26 @@ public class MeetingWritePlatformServiceJpaRepositoryImpl 
implements MeetingWrit
     private final MeetingDataValidator meetingDataValidator;
     private final CalendarInstanceRepository calendarInstanceRepository;
     private final CalendarRepository calendarRepository;
-    private final ClientRepository clientRepository;
+    private final ClientRepositoryWrapper clientRepositoryWrapper;
     private final GroupRepository groupRepository;
     private final FromJsonHelper fromApiJsonHelper;
     private final ConfigurationDomainService configurationDomainService;
-    private final CalendarReadPlatformService calendarReadPlatformService;
 
     @Autowired
     public MeetingWritePlatformServiceJpaRepositoryImpl(final 
MeetingRepositoryWrapper meetingRepositoryWrapper,
             final MeetingRepository meetingRepository, final 
MeetingDataValidator meetingDataValidator,
             final CalendarInstanceRepository calendarInstanceRepository, final 
CalendarRepository calendarRepository,
-            final ClientRepository clientRepository, final GroupRepository 
groupRepository, final FromJsonHelper fromApiJsonHelper,
-            final ConfigurationDomainService configurationDomainService, final 
CalendarReadPlatformService calendarReadPlatformService) {
+            final ClientRepositoryWrapper clientRepositoryWrapper, final 
GroupRepository groupRepository, final FromJsonHelper fromApiJsonHelper,
+            final ConfigurationDomainService configurationDomainService) {
         this.meetingRepositoryWrapper = meetingRepositoryWrapper;
         this.meetingRepository = meetingRepository;
         this.meetingDataValidator = meetingDataValidator;
         this.calendarInstanceRepository = calendarInstanceRepository;
         this.calendarRepository = calendarRepository;
-        this.clientRepository = clientRepository;
+        this.clientRepositoryWrapper = clientRepositoryWrapper;
         this.groupRepository = groupRepository;
         this.fromApiJsonHelper = fromApiJsonHelper;
         this.configurationDomainService = configurationDomainService;
-        this.calendarReadPlatformService = calendarReadPlatformService;
     }
 
     @Override
@@ -203,7 +199,7 @@ public class MeetingWritePlatformServiceJpaRepositoryImpl 
implements MeetingWrit
                     final Integer attendanceTypeId = 
this.fromApiJsonHelper.extractIntegerSansLocaleNamed(attendanceTypeParamName,
                             attendanceElement);
 
-                    final Client client = 
this.clientRepository.findOne(clientId);
+                    final Client client = 
this.clientRepositoryWrapper.findOneWithNotFoundDetection(clientId, true);
 
                     if (meeting.isGroupEntity() && 
!client.isChildOfGroup(meeting.entityId())) {
                         throw new ClientNotInGroupException(clientId, 
meeting.entityId());

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/service/NoteWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/service/NoteWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/service/NoteWritePlatformServiceJpaRepositoryImpl.java
index ec77f82..b570034 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/service/NoteWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/service/NoteWritePlatformServiceJpaRepositoryImpl.java
@@ -31,7 +31,7 @@ import org.apache.fineract.portfolio.group.domain.Group;
 import org.apache.fineract.portfolio.group.domain.GroupRepository;
 import org.apache.fineract.portfolio.group.exception.GroupNotFoundException;
 import org.apache.fineract.portfolio.loanaccount.domain.Loan;
-import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository;
+import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository;
 import 
org.apache.fineract.portfolio.loanaccount.exception.LoanNotFoundException;
@@ -51,14 +51,13 @@ public class NoteWritePlatformServiceJpaRepositoryImpl 
implements NoteWritePlatf
     private final NoteRepository noteRepository;
     private final ClientRepositoryWrapper clientRepository;
     private final GroupRepository groupRepository;
-    // private final SavingAccountRepository savingAccountRepository;
-    private final LoanRepository loanRepository;
+    private final LoanRepositoryWrapper loanRepository;
     private final LoanTransactionRepository loanTransactionRepository;
     private final NoteCommandFromApiJsonDeserializer fromApiJsonDeserializer;
 
     @Autowired
     public NoteWritePlatformServiceJpaRepositoryImpl(final NoteRepository 
noteRepository, final ClientRepositoryWrapper clientRepository,
-            final GroupRepository groupRepository, final LoanRepository 
loanRepository,
+            final GroupRepository groupRepository, final LoanRepositoryWrapper 
loanRepository,
             final LoanTransactionRepository loanTransactionRepository, final 
NoteCommandFromApiJsonDeserializer fromApiJsonDeserializer) {
         this.noteRepository = noteRepository;
         this.clientRepository = clientRepository;
@@ -118,9 +117,7 @@ public class NoteWritePlatformServiceJpaRepositoryImpl 
implements NoteWritePlatf
 
         final Long resourceId = command.getLoanId();
 
-        final Loan loan = this.loanRepository.findOne(resourceId);
-        if (loan == null) { throw new LoanNotFoundException(resourceId); }
-
+        final Loan loan = 
this.loanRepository.findOneWithNotFoundDetection(resourceId);
         final String note = command.stringValueOfParameterNamed("note");
         final Note newNote = Note.loanNote(loan, note);
 
@@ -291,10 +288,8 @@ public class NoteWritePlatformServiceJpaRepositoryImpl 
implements NoteWritePlatf
 
         final NoteType type = NoteType.LOAN;
 
-        final Loan loan = this.loanRepository.findOne(resourceId);
-        if (loan == null) { throw new LoanNotFoundException(resourceId); }
+        final Loan loan = 
this.loanRepository.findOneWithNotFoundDetection(resourceId);
         final Note noteForUpdate = 
this.noteRepository.findByLoanIdAndId(resourceId, noteId);
-
         if (noteForUpdate == null) { throw new NoteNotFoundException(noteId, 
resourceId, type.name().toLowerCase()); }
 
         final Map<String, Object> changes = noteForUpdate.update(command);

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataDTO.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataDTO.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataDTO.java
index c7506d3..6b213b8 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataDTO.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataDTO.java
@@ -20,7 +20,6 @@ package org.apache.fineract.portfolio.savings.data;
 
 import org.apache.fineract.portfolio.client.domain.Client;
 import org.apache.fineract.portfolio.group.domain.Group;
-import org.apache.fineract.portfolio.savings.domain.SavingsProduct;
 import org.apache.fineract.useradministration.domain.AppUser;
 import org.joda.time.LocalDate;
 import org.joda.time.format.DateTimeFormatter;
@@ -29,16 +28,16 @@ public class SavingsAccountDataDTO {
 
     private final Client client;
     private final Group group;
-    private final SavingsProduct savingsProduct;
+    private final Long savingsProductId;
     private final LocalDate applicationDate;
     private final AppUser appliedBy;
     private final DateTimeFormatter fmt;
 
-    public SavingsAccountDataDTO(final Client client, final Group group, final 
SavingsProduct savingsProduct,
+    public SavingsAccountDataDTO(final Client client, final Group group, final 
Long savingsProductId,
             final LocalDate applicationDate, final AppUser appliedBy, final 
DateTimeFormatter fmt) {
         this.client = client;
         this.group = group;
-        this.savingsProduct = savingsProduct;
+        this.savingsProductId = savingsProductId;
         this.applicationDate = applicationDate;
         this.appliedBy = appliedBy;
         this.fmt = fmt;
@@ -52,8 +51,8 @@ public class SavingsAccountDataDTO {
         return this.group;
     }
 
-    public SavingsProduct getSavingsProduct() {
-        return this.savingsProduct;
+    public Long getSavingsProduct() {
+        return this.savingsProductId;
     }
 
     public LocalDate getApplicationDate() {

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/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 2cffa6b..efc2e58 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
@@ -177,7 +177,8 @@ public class DepositAccountAssembler {
         AccountType accountType = AccountType.INVALID;
         final Long clientId = 
this.fromApiJsonHelper.extractLongNamed(clientIdParamName, element);
         if (clientId != null) {
-            client = 
this.clientRepository.findOneWithNotFoundDetection(clientId);
+            final boolean isCalendarInherited = 
command.booleanPrimitiveValueOfParameterNamed(isCalendarInheritedParamName);
+            client = 
this.clientRepository.findOneWithNotFoundDetection(clientId, 
isCalendarInherited); //we need group collection if isCalendarInherited is true
             accountType = AccountType.INDIVIDUAL;
             if (client.isNotActive()) { throw new 
ClientNotActiveException(clientId); }
         }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/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 2954027..f28fe6a 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
@@ -30,7 +30,6 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.Date;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -89,13 +88,9 @@ public class RecurringDepositAccount extends SavingsAccount {
     @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = 
"account")
     private DepositAccountInterestRateChart chart;
 
-    @OneToMany(cascade = CascadeType.ALL, mappedBy = "account", orphanRemoval 
= true, fetch=FetchType.EAGER)
-    private Set<RecurringDepositScheduleInstallment> 
depositScheduleInstallments = new HashSet<>();
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "account", orphanRemoval 
= true, fetch=FetchType.LAZY)
+    private List<RecurringDepositScheduleInstallment> 
depositScheduleInstallments = new ArrayList<>();
 
-    private transient List<RecurringDepositScheduleInstallment> 
sortedDepositInstallments = null ;
-    
-    private transient boolean isDepositScheduleInstallmentDirty = false ;
-    
     protected RecurringDepositAccount() {
         //
     }
@@ -1127,7 +1122,6 @@ public class RecurringDepositAccount extends 
SavingsAccount {
 
     public void generateSchedule(final PeriodFrequencyType frequency, final 
Integer recurringEvery, final Calendar calendar) {
         this.depositScheduleInstallments.clear();
-        this.isDepositScheduleInstallmentDirty = true ;
         LocalDate installmentDate = null;
         if (this.isCalendarInherited()) {
             installmentDate = CalendarUtils.getNextScheduleDate(calendar, 
accountSubmittedOrActivationDate());
@@ -1159,17 +1153,11 @@ public class RecurringDepositAccount extends 
SavingsAccount {
     }
 
     private List<RecurringDepositScheduleInstallment> 
depositScheduleInstallments() {
-        if(this.isDepositScheduleInstallmentDirty || 
this.sortedDepositInstallments == null) {
-            this.sortedDepositInstallments = new 
ArrayList<>(this.depositScheduleInstallments) ;
-            this.sortedDepositInstallments.sort(new 
RecurringDepositScheduleInstallmentComparator());
-            this.isDepositScheduleInstallmentDirty = false ;
-        }
-        return this.sortedDepositInstallments ;
+        return this.depositScheduleInstallments ;
     }
 
     private void addDepositScheduleInstallment(final 
RecurringDepositScheduleInstallment installment) {
         this.depositScheduleInstallments.add(installment) ;
-        isDepositScheduleInstallmentDirty = true ;
     }
     
     public boolean isCalendarInherited() {
@@ -1220,4 +1208,10 @@ public class RecurringDepositAccount extends 
SavingsAccount {
            return comparsion ;
         }
     }
+    
+    @Override
+    public void loadLazyCollections() {
+        this.depositScheduleInstallments.size() ;
+        super.loadLazyCollections();
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/025ff9c7/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 ad0809e..3af57f5 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
@@ -292,18 +292,14 @@ public class SavingsAccount extends 
AbstractPersistable<Long> {
     protected SavingsAccountSummary summary;
 
     @OrderBy(value = "dateOf, createdDate, id")
-    @OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", 
orphanRemoval = true, fetch=FetchType.EAGER)
-    protected final Set<SavingsAccountTransaction> transactions = new 
HashSet<>();
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", 
orphanRemoval = true, fetch=FetchType.LAZY)
+    protected final List<SavingsAccountTransaction> transactions = new 
ArrayList<>();
     
-    private transient List<SavingsAccountTransaction> orderedTransactions = 
null ;
-    
-    private transient boolean isTransactionsDirty = false ;
-    
-    @OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", 
orphanRemoval = true, fetch=FetchType.EAGER)
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", 
orphanRemoval = true, fetch=FetchType.LAZY)
     protected Set<SavingsAccountCharge> charges = new HashSet<>();
 
-    @OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", 
orphanRemoval = true, fetch=FetchType.EAGER)
-    private Set<SavingsOfficerAssignmentHistory> savingsOfficerHistory;
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "savingsAccount", 
orphanRemoval = true, fetch=FetchType.LAZY)
+    private Set<SavingsOfficerAssignmentHistory> savingsOfficerHistory = new 
HashSet<>();
 
     @Transient
     protected boolean accountNumberRequiresAutoGeneration = false;
@@ -419,7 +415,7 @@ public class SavingsAccount extends 
AbstractPersistable<Long> {
         this.enforceMinRequiredBalance = enforceMinRequiredBalance;
         this.minRequiredBalance = minRequiredBalance;
         this.minBalanceForInterestCalculation = 
product.minBalanceForInterestCalculation();
-        this.savingsOfficerHistory = null;
+        //this.savingsOfficerHistory = null;
         this.withHoldTax = withHoldTax;
         this.taxGroup = product.getTaxGroup();
     }
@@ -2266,17 +2262,11 @@ public class SavingsAccount extends 
AbstractPersistable<Long> {
     }
 
     public List<SavingsAccountTransaction> getTransactions() {
-        if(this.orderedTransactions == null || isTransactionsDirty) {
-            this.orderedTransactions = new ArrayList<>(this.transactions) ;
-            this.orderedTransactions.sort(new 
SavingsAccountTransactionComparator());
-            this.isTransactionsDirty = false ;
-        }
-        return orderedTransactions;
+        return this.transactions;
     }
 
     public void addTransaction(final SavingsAccountTransaction transaction) {
         this.transactions.add(transaction);
-        this.isTransactionsDirty = true ;
     }
     
     public void setStatus(final Integer status) {
@@ -2800,4 +2790,10 @@ public class SavingsAccount extends 
AbstractPersistable<Long> {
         recalculateDailyBalances(Money.zero(this.currency), transactionDate);
                this.summary.updateSummary(this.currency, 
this.savingsAccountTransactionSummaryWrapper, this.transactions);
        }
+       
+    public void loadLazyCollections() {
+        transactions.size();
+        charges.size();
+        savingsOfficerHistory.size();
+    }
 }
\ No newline at end of file

Reply via email to