Removing dependency to java money library.
diff --git a/service/build.gradle b/service/build.gradle
index 7fe4315..adf4a9a 100644
--- a/service/build.gradle
+++ b/service/build.gradle
@@ -63,9 +63,6 @@
             [group: 'org.apache.fineract.cn', name: 'mariadb', version: versions.frameworkmariadb],
             [group: 'org.apache.fineract.cn', name: 'command', version: versions.frameworkcommand],
             [group: 'org.hibernate', name: 'hibernate-validator', version: versions.validator],
-            [group: 'org.javamoney.lib', name: 'javamoney-calc', version: versions.javamoneylib],
-            [group: 'javax.money', name: 'money-api', version: '1.0.1'],
-            [group: 'org.javamoney', name: 'moneta', version: '1.0.1'],
             [group: 'net.jodah', name: 'expiringmap', version: versions.expiringmap],
     )
 }
diff --git a/service/src/main/java/org/apache/fineract/cn/individuallending/internal/service/AnnuityPayment.java b/service/src/main/java/org/apache/fineract/cn/individuallending/internal/service/AnnuityPayment.java
index 581aa5f..15abe0e 100644
--- a/service/src/main/java/org/apache/fineract/cn/individuallending/internal/service/AnnuityPayment.java
+++ b/service/src/main/java/org/apache/fineract/cn/individuallending/internal/service/AnnuityPayment.java
@@ -18,21 +18,18 @@
  */
 package org.apache.fineract.cn.individuallending.internal.service;
 
-import org.javamoney.calc.CalculationContext;
-import org.javamoney.calc.common.Rate;
 
+import java.math.MathContext;
 import javax.annotation.Nonnegative;
 import javax.annotation.Nonnull;
-import javax.money.MonetaryAmount;
-import javax.money.MonetaryOperator;
 import java.math.BigDecimal;
 import java.util.Objects;
 
 /**
  * @author Myrle Krantz
  */
-public final class AnnuityPayment implements MonetaryOperator {
-  private Rate rate;
+public final class AnnuityPayment {
+  private BigDecimal rate;
   private int periods;
 
   /**
@@ -41,7 +38,7 @@
    * @param rate    the target rate, not null.
    * @param periods the periods, >= 0.
    */
-  private AnnuityPayment(final @Nonnull Rate rate, final @Nonnegative int periods)
+  private AnnuityPayment(final @Nonnull BigDecimal rate, final @Nonnegative int periods)
   {
     this.rate = Objects.requireNonNull(rate);
     if (periods < 0) {
@@ -50,31 +47,35 @@
     this.periods = periods;
   }
 
-  public static AnnuityPayment of(final @Nonnull Rate rate, final @Nonnegative int periods)
+  public static AnnuityPayment of(final @Nonnull BigDecimal rate, final @Nonnegative int periods)
   {
     return new AnnuityPayment(rate, periods);
   }
 
-  public static MonetaryAmount calculate(
-      final @Nonnull MonetaryAmount amount,
-      final @Nonnull Rate rate,
-      final @Nonnegative int periods)
+  public static BigDecimal calculate(
+      final @Nonnull BigDecimal amount,
+      final @Nonnull BigDecimal rate,
+      final @Nonnegative int periods,
+      final @Nonnegative int precision)
   {
     Objects.requireNonNull(amount, "Amount required");
     Objects.requireNonNull(rate, "Rate required");
-    if (rate.get().compareTo(BigDecimal.ZERO) == 0)
-      return amount.divide(periods);
+    if (rate.compareTo(BigDecimal.ZERO) == 0)
+      return amount.divide(BigDecimal.valueOf(periods), precision, BigDecimal.ROUND_HALF_EVEN);
 
     // AP(m) = m*r / [ (1-((1 + r).pow(-n))) ]
 
-    return amount.multiply(rate.get()).divide(
-            BigDecimal.ONE.subtract((BigDecimal.ONE.add(rate.get())
-                    .pow(-1 * periods, CalculationContext.mathContext()))));
+    return amount.multiply(rate).divide(
+            BigDecimal.ONE.subtract((BigDecimal.ONE.add(rate)
+                    .pow(-1 * periods, MathContext.DECIMAL64))),
+        precision, BigDecimal.ROUND_HALF_EVEN);
   }
 
-  @Override
-  public MonetaryAmount apply(final @Nonnull MonetaryAmount amount) {
-    return calculate(amount, rate, periods);
+  public BigDecimal apply(
+      final @Nonnull BigDecimal amount,
+      final @Nonnegative int precision)
+  {
+    return calculate(amount, rate, periods, precision);
   }
 
   @Override
diff --git a/service/src/main/java/org/apache/fineract/cn/individuallending/internal/service/costcomponent/CostComponentService.java b/service/src/main/java/org/apache/fineract/cn/individuallending/internal/service/costcomponent/CostComponentService.java
index 25a943a..e01629a 100644
--- a/service/src/main/java/org/apache/fineract/cn/individuallending/internal/service/costcomponent/CostComponentService.java
+++ b/service/src/main/java/org/apache/fineract/cn/individuallending/internal/service/costcomponent/CostComponentService.java
@@ -26,10 +26,6 @@
 import org.apache.fineract.cn.individuallending.internal.service.schedule.Period;
 import org.apache.fineract.cn.individuallending.internal.service.schedule.ScheduledCharge;
 import org.apache.fineract.cn.portfolio.api.v1.domain.ChargeDefinition;
-import org.javamoney.calc.common.Rate;
-import org.javamoney.moneta.Money;
-
-import javax.money.MonetaryAmount;
 import java.math.BigDecimal;
 import java.time.Clock;
 import java.time.LocalDate;
@@ -214,11 +210,12 @@
         AccountDesignators.CUSTOMER_LOAN_PRINCIPAL,
         AccountDesignators.CUSTOMER_LOAN_FEES).negate();
 
-    final MonetaryAmount presentValue = AnnuityPayment.calculate(
-        Money.of(finalDisbursementSize, "XXX"),
-        Rate.of(geometricMeanAccrualRate),
-        periodCount);
-    return BigDecimal.valueOf(presentValue.getNumber().doubleValueExact()).setScale(minorCurrencyUnitDigits, BigDecimal.ROUND_HALF_EVEN);
+    final BigDecimal presentValue = AnnuityPayment.calculate(
+        finalDisbursementSize,
+        geometricMeanAccrualRate,
+        periodCount,
+        minorCurrencyUnitDigits);
+    return presentValue.setScale(minorCurrencyUnitDigits, BigDecimal.ROUND_HALF_EVEN);
   }
 
   private static boolean isIncurralActionForAccruedCharge(final ChargeDefinition chargeDefinition, final Action action) {