killbill-memoizeit

Changes

Details

diff --git a/invoice/src/main/java/org/killbill/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java b/invoice/src/main/java/org/killbill/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java
index 7949310..910a525 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java
@@ -80,6 +80,17 @@ public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
     }
 
     @Override
+    public List<InvoicePayment> getInvoicePaymentsByAccount(final UUID accountId, final TenantContext context) {
+        return ImmutableList.<InvoicePayment>copyOf(Collections2.transform(dao.getInvoicePaymentsByAccount(internalCallContextFactory.createInternalTenantContext(accountId, ObjectType.ACCOUNT, context)),
+                                                                           new Function<InvoicePaymentModelDao, InvoicePayment>() {
+                                                                               @Override
+                                                                               public InvoicePayment apply(final InvoicePaymentModelDao input) {
+                                                                                   return new DefaultInvoicePayment(input);
+                                                                               }
+                                                                           }));
+    }
+
+    @Override
     public InvoicePayment getInvoicePaymentForAttempt(final UUID paymentId, final TenantContext context) {
         final List<InvoicePayment> invoicePayments = getInvoicePayments(paymentId, context);
         if (invoicePayments.size() == 0) {
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java b/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java
index 5675180..34474c8 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java
@@ -117,6 +117,17 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
     }
 
     @Override
+    public Invoice getInvoiceByPayment(final UUID paymentId, final TenantContext context) throws InvoiceApiException {
+        final InternalTenantContext tenantContext = internalCallContextFactory.createInternalTenantContext(context);
+        final UUID invoiceId = dao.getInvoiceIdByPaymentId(paymentId, tenantContext);
+        if (invoiceId == null) {
+            throw new InvoiceApiException(ErrorCode.INVOICE_NOT_FOUND, invoiceId);
+        }
+        final InvoiceModelDao invoiceModelDao = invoiceId != null ? dao.getById(invoiceId, tenantContext) : null;
+        return new DefaultInvoice(invoiceModelDao);
+    }
+
+    @Override
     public Pagination<Invoice> getInvoices(final Long offset, final Long limit, final TenantContext context) {
         return getEntityPaginationNoException(limit,
                                               new SourcePaginationBuilder<InvoiceModelDao, InvoiceApiException>() {
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
index a434e57..784a39a 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
@@ -126,6 +126,7 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
         });
     }
 
+
     @Override
     public List<InvoiceModelDao> getAllInvoicesByAccount(final InternalTenantContext context) {
         return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<InvoiceModelDao>>() {
@@ -347,6 +348,16 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
     }
 
     @Override
+    public List<InvoicePaymentModelDao> getInvoicePaymentsByAccount(final InternalTenantContext context) {
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<InvoicePaymentModelDao>>() {
+            @Override
+            public List<InvoicePaymentModelDao> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                return entitySqlDaoWrapperFactory.become(InvoicePaymentSqlDao.class).getByAccountRecordId(context);
+            }
+        });
+    }
+
+    @Override
     public InvoicePaymentModelDao createRefund(final UUID paymentId, final BigDecimal requestedRefundAmount, final boolean isInvoiceAdjusted,
                                                final Map<UUID, BigDecimal> invoiceItemIdsWithNullAmounts, final String transactionExternalKey,
                                                final InternalCallContext context) throws InvoiceApiException {
@@ -359,7 +370,13 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
 
                 final InvoiceSqlDao transInvoiceDao = entitySqlDaoWrapperFactory.become(InvoiceSqlDao.class);
 
-                final InvoicePaymentModelDao payment = transactional.getByPaymentId(paymentId.toString(), context);
+                final List<InvoicePaymentModelDao> paymentsForId = transactional.getByPaymentId(paymentId.toString(), context);
+                final InvoicePaymentModelDao payment = Iterables.tryFind(paymentsForId, new Predicate<InvoicePaymentModelDao>() {
+                    @Override
+                    public boolean apply(final InvoicePaymentModelDao input) {
+                        return input.getType() == InvoicePaymentType.ATTEMPT;
+                    }
+                }).orNull();
                 if (payment == null) {
                     throw new InvoiceApiException(ErrorCode.INVOICE_PAYMENT_BY_ATTEMPT_NOT_FOUND, paymentId);
                 }
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceDao.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceDao.java
index 081ca54..8fa500d 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceDao.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceDao.java
@@ -52,6 +52,8 @@ public interface InvoiceDao extends EntityDao<InvoiceModelDao, Invoice, InvoiceA
 
     List<InvoicePaymentModelDao> getInvoicePayments(UUID paymentId, InternalTenantContext context);
 
+    List<InvoicePaymentModelDao> getInvoicePaymentsByAccount(InternalTenantContext context);
+
     BigDecimal getAccountBalance(UUID accountId, InternalTenantContext context);
 
     public BigDecimal getAccountCBA(UUID accountId, InternalTenantContext context);
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.java
index 755f4a2..be618d6 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.java
@@ -40,7 +40,7 @@ import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper;
 public interface InvoicePaymentSqlDao extends EntitySqlDao<InvoicePaymentModelDao, InvoicePayment> {
 
     @SqlQuery
-    public InvoicePaymentModelDao getByPaymentId(@Bind("paymentId") final String paymentId,
+    public List<InvoicePaymentModelDao> getByPaymentId(@Bind("paymentId") final String paymentId,
                                                  @BindBean final InternalTenantContext context);
 
     @SqlBatch(transactional = false)
diff --git a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg
index 8d1383d..fe0410f 100644
--- a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg
+++ b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg
@@ -35,6 +35,7 @@ getByPaymentId() ::= <<
   FROM <tableName()>
   WHERE payment_id = :paymentId
   <AND_CHECK_TENANT()>
+  <defaultOrderBy()>
   ;
 >>
 
@@ -43,6 +44,7 @@ getPaymentsForCookieId() ::= <<
   FROM <tableName()>
   WHERE payment_cookie_id = :paymentCookieId
   <AND_CHECK_TENANT()>
+  <defaultOrderBy()>
   ;
 >>
 
@@ -51,6 +53,7 @@ getPaymentsForInvoice() ::= <<
   FROM <tableName()>
   WHERE invoice_id = :invoiceId
   <AND_CHECK_TENANT()>
+  <defaultOrderBy()>
   ;
 >>
 
@@ -59,6 +62,7 @@ getInvoicePayments() ::= <<
     FROM <tableName()>
     WHERE payment_id = :paymentId
     <AND_CHECK_TENANT()>
+   <defaultOrderBy()>
     ;
 >>
 
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/api/MockInvoicePaymentApi.java b/invoice/src/test/java/org/killbill/billing/invoice/api/MockInvoicePaymentApi.java
index d284698..3e5098f 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/api/MockInvoicePaymentApi.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/api/MockInvoicePaymentApi.java
@@ -74,6 +74,11 @@ public class MockInvoicePaymentApi implements InvoicePaymentApi {
     }
 
     @Override
+    public List<InvoicePayment> getInvoicePaymentsByAccount(final UUID uuid, final TenantContext tenantContext) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
     public InvoicePayment getInvoicePaymentForAttempt(final UUID paymentId, final TenantContext context) {
         for (final InvoicePayment invoicePayment : invoicePayments) {
             if (paymentId.equals(invoicePayment.getPaymentId()) && invoicePayment.getType() == InvoicePaymentType.ATTEMPT) {
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/dao/MockInvoiceDao.java b/invoice/src/test/java/org/killbill/billing/invoice/dao/MockInvoiceDao.java
index f55afe8..6c3e872 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/dao/MockInvoiceDao.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/dao/MockInvoiceDao.java
@@ -33,14 +33,17 @@ import org.killbill.billing.callcontext.InternalTenantContext;
 import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.invoice.api.Invoice;
 import org.killbill.billing.invoice.api.InvoiceApiException;
+import org.killbill.billing.invoice.api.InvoicePaymentType;
 import org.killbill.billing.invoice.api.user.DefaultInvoiceCreationEvent;
 import org.killbill.billing.util.entity.DefaultPagination;
 import org.killbill.billing.util.entity.Pagination;
 import org.killbill.billing.util.entity.dao.MockEntityDaoBase;
 import org.killbill.bus.api.PersistentBus;
 
+import com.google.common.base.Predicate;
 import com.google.common.collect.BiMap;
 import com.google.common.collect.HashBiMap;
+import com.google.common.collect.Iterables;
 import com.google.inject.Inject;
 
 public class MockInvoiceDao extends MockEntityDaoBase<InvoiceModelDao, Invoice, InvoiceApiException> implements InvoiceDao {
@@ -124,7 +127,6 @@ public class MockInvoiceDao extends MockEntityDaoBase<InvoiceModelDao, Invoice, 
     @Override
     public List<InvoiceModelDao> getInvoicesByAccount(final LocalDate fromDate, final InternalTenantContext context) {
         final List<InvoiceModelDao> invoicesForAccount = new ArrayList<InvoiceModelDao>();
-
         synchronized (monitor) {
             final UUID accountId = accountRecordIds.inverse().get(context.getAccountRecordId());
             for (final InvoiceModelDao invoice : getAll(context)) {
@@ -199,6 +201,23 @@ public class MockInvoiceDao extends MockEntityDaoBase<InvoiceModelDao, Invoice, 
     }
 
     @Override
+    public List<InvoicePaymentModelDao> getInvoicePaymentsByAccount(final InternalTenantContext context) {
+
+        throw new UnsupportedOperationException();
+/*
+        InvoicePaymentModelDao does not export accountId ?
+
+        final List<InvoicePaymentModelDao> invoicesForAccount = new ArrayList<InvoicePaymentModelDao>();
+        synchronized (monitor) {
+            final UUID accountId = accountRecordIds.inverse().get(context.getAccountRecordId());
+            for (final InvoicePaymentModelDao payment : payments.values()) {
+            }
+        }
+        return null;
+*/
+    }
+
+    @Override
     public void notifyOfPayment(final InvoicePaymentModelDao invoicePayment, final InternalCallContext context) {
         synchronized (monitor) {
             payments.put(invoicePayment.getId(), invoicePayment);
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/AccountTimelineJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/AccountTimelineJson.java
index 9a111e2..c6adaab 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/AccountTimelineJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/AccountTimelineJson.java
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 
@@ -32,6 +33,7 @@ import org.killbill.billing.invoice.api.InvoiceItem;
 import org.killbill.billing.invoice.api.InvoiceItemType;
 import org.killbill.billing.invoice.api.InvoicePayment;
 import org.killbill.billing.payment.api.DirectPayment;
+import org.killbill.billing.payment.api.DirectPaymentTransaction;
 import org.killbill.billing.util.audit.AccountAuditLogs;
 import org.killbill.billing.util.audit.AuditLog;
 
@@ -57,44 +59,14 @@ public class AccountTimelineJson {
         this.payments = payments;
     }
 
-    private String getBundleExternalKey(final UUID invoiceId, final List<Invoice> invoices, final List<SubscriptionBundle> bundles) {
-        for (final Invoice cur : invoices) {
-            if (cur.getId().equals(invoiceId)) {
-                return getBundleExternalKey(cur, bundles);
-            }
-        }
-        return null;
-    }
-
-    private String getBundleExternalKey(final Invoice invoice, final List<SubscriptionBundle> bundles) {
-        final Set<UUID> b = new HashSet<UUID>();
-        for (final InvoiceItem cur : invoice.getInvoiceItems()) {
-            b.add(cur.getBundleId());
-        }
-        boolean first = true;
-        final StringBuilder tmp = new StringBuilder();
-        for (final UUID cur : b) {
-            for (final SubscriptionBundle bt : bundles) {
-                if (bt.getId().equals(cur)) {
-                    if (!first) {
-                        tmp.append(",");
-                    }
-                    tmp.append(bt.getExternalKey());
-                    first = false;
-                    break;
-                }
-            }
-        }
-        return tmp.toString();
-    }
 
     public AccountTimelineJson(final Account account, final List<Invoice> invoices, final List<DirectPayment> payments,
-                               final List<SubscriptionBundle> bundles, final Multimap<UUID, DirectPayment> refundsByPayment,
-                               final Multimap<UUID, InvoicePayment> chargebacksByPayment, final AccountAuditLogs accountAuditLogs) {
+                               final Map<UUID, UUID> invoiceIdByPayment, final List<SubscriptionBundle> bundles,
+                                final Multimap<UUID, DirectPaymentTransaction> refundsByPayment,
+                               final Multimap<UUID, DirectPaymentTransaction> chargebacksByPayment, final AccountAuditLogs accountAuditLogs) {
         this.account = new AccountJson(account, null, null, accountAuditLogs);
         this.bundles = new LinkedList<BundleJson>();
         for (final SubscriptionBundle bundle : bundles) {
-            final List<AuditLog> bundleAuditLogs = accountAuditLogs.getAuditLogsForBundle(bundle.getId());
             final BundleJson jsonWithSubscriptions = new BundleJson(bundle, accountAuditLogs);
             this.bundles.add(jsonWithSubscriptions);
         }
@@ -122,23 +94,22 @@ public class AccountTimelineJson {
         this.payments = new LinkedList<PaymentJson>();
         for (final DirectPayment payment : payments) {
             final List<RefundJson> refunds = new ArrayList<RefundJson>();
-            for (final DirectPayment refund : refundsByPayment.get(payment.getId())) {
+            for (final DirectPaymentTransaction refund : refundsByPayment.get(payment.getId())) {
                 // STEPH add adjusted invoice items? and also audit_logs
-                //final List<AuditLog> auditLogs = accountAuditLogs.getAuditLogsForRefund(refund.getId());
-                // refunds.add(new RefundJson(refund, null, auditLogs));
+                final List<AuditLog> auditLogs = accountAuditLogs.getAuditLogsForPaymentTransaction(refund.getId());
+                refunds.add(new RefundJson(refund, null, auditLogs));
             }
 
             final List<ChargebackJson> chargebacks = new ArrayList<ChargebackJson>();
-            for (final InvoicePayment chargeback : chargebacksByPayment.get(payment.getId())) {
-                // STEPH
-                //final List<AuditLog> auditLogs = accountAuditLogs.getAuditLogsForChargeback(chargeback.getId());
-                //chargebacks.add(new ChargebackJson(payment.getAccountId(), chargeback, auditLogs));
+            for (final DirectPaymentTransaction chargeback : chargebacksByPayment.get(payment.getId())) {
+                final List<AuditLog> auditLogs = accountAuditLogs.getAuditLogsForPaymentTransaction(chargeback.getId());
+                chargebacks.add(new ChargebackJson(payment.getAccountId(), chargeback, auditLogs));
             }
 
             final List<AuditLog> auditLogs = accountAuditLogs.getAuditLogsForPayment(payment.getId());
+            final UUID invoiceId = invoiceIdByPayment.get(payment.getId());
             this.payments.add(new PaymentJson(payment,
-                                              // TODO [PAYMENT]
-                                              null, //getBundleExternalKey(payment.getInvoiceId(), invoices, bundles),
+                                              getBundleExternalKey(invoiceId, invoices, bundles),
                                               refunds,
                                               chargebacks,
                                               auditLogs));
@@ -208,4 +179,38 @@ public class AccountTimelineJson {
         result = 31 * result + (payments != null ? payments.hashCode() : 0);
         return result;
     }
+
+    private String getBundleExternalKey(final UUID invoiceId, final List<Invoice> invoices, final List<SubscriptionBundle> bundles) {
+        if (invoiceId == null) {
+            return null;
+        }
+        for (final Invoice cur : invoices) {
+            if (cur.getId().equals(invoiceId)) {
+                return getBundleExternalKey(cur, bundles);
+            }
+        }
+        return null;
+    }
+
+    private String getBundleExternalKey(final Invoice invoice, final List<SubscriptionBundle> bundles) {
+        final Set<UUID> b = new HashSet<UUID>();
+        for (final InvoiceItem cur : invoice.getInvoiceItems()) {
+            b.add(cur.getBundleId());
+        }
+        boolean first = true;
+        final StringBuilder tmp = new StringBuilder();
+        for (final UUID cur : b) {
+            for (final SubscriptionBundle bt : bundles) {
+                if (bt.getId().equals(cur)) {
+                    if (!first) {
+                        tmp.append(",");
+                    }
+                    tmp.append(bt.getExternalKey());
+                    first = false;
+                    break;
+                }
+            }
+        }
+        return tmp.toString();
+    }
 }
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/ChargebackJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/ChargebackJson.java
index ee42e75..b1437be 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/ChargebackJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/ChargebackJson.java
@@ -25,6 +25,7 @@ import javax.annotation.Nullable;
 import org.joda.time.DateTime;
 
 import org.killbill.billing.invoice.api.InvoicePayment;
+import org.killbill.billing.payment.api.DirectPaymentTransaction;
 import org.killbill.billing.util.audit.AuditLog;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -33,6 +34,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 public class ChargebackJson extends JsonBase {
 
     private final String chargebackId;
+    private final String chargedBackTransactionId;
     private final String accountId;
     private final DateTime requestedDate;
     private final DateTime effectiveDate;
@@ -43,6 +45,7 @@ public class ChargebackJson extends JsonBase {
     @JsonCreator
     public ChargebackJson(@JsonProperty("chargebackId") final String chargebackId,
                           @JsonProperty("accountId") final String accountId,
+                          @JsonProperty("chargedBackTransactionId") final String chargedBackTransactionId,
                           @JsonProperty("requestedDate") final DateTime requestedDate,
                           @JsonProperty("effectiveDate") final DateTime effectiveDate,
                           @JsonProperty("amount") final BigDecimal chargebackAmount,
@@ -52,6 +55,7 @@ public class ChargebackJson extends JsonBase {
         super(auditLogs);
         this.chargebackId = chargebackId;
         this.accountId = accountId;
+        this.chargedBackTransactionId = chargedBackTransactionId;
         this.requestedDate = requestedDate;
         this.effectiveDate = effectiveDate;
         this.amount = chargebackAmount;
@@ -59,13 +63,13 @@ public class ChargebackJson extends JsonBase {
         this.currency = currency;
     }
 
-    public ChargebackJson(final UUID accountId, final InvoicePayment chargeback) {
+    public ChargebackJson(final UUID accountId, final DirectPaymentTransaction chargeback) {
         this(accountId, chargeback, null);
     }
 
-    public ChargebackJson(final UUID accountId, final InvoicePayment chargeback, @Nullable final List<AuditLog> auditLogs) {
-        this(chargeback.getId().toString(), accountId.toString(), chargeback.getPaymentDate(), chargeback.getPaymentDate(),
-               chargeback.getAmount().negate(), chargeback.getPaymentId().toString(), chargeback.getCurrency().toString(), toAuditLogJson(auditLogs));
+    public ChargebackJson(final UUID accountId, final DirectPaymentTransaction chargeback, @Nullable final List<AuditLog> auditLogs) {
+        this(chargeback.getId().toString(), accountId.toString(), chargeback.getExternalKey(), chargeback.getCreatedDate(), chargeback.getEffectiveDate(),
+               chargeback.getAmount().negate(), chargeback.getDirectPaymentId().toString(), chargeback.getCurrency().toString(), toAuditLogJson(auditLogs));
     }
 
     public String getChargebackId() {
@@ -96,6 +100,10 @@ public class ChargebackJson extends JsonBase {
         return paymentId;
     }
 
+    public String getChargedBackTransactionId() {
+        return chargedBackTransactionId;
+    }
+
     @Override
     public boolean equals(final Object o) {
         if (this == o) {
@@ -124,6 +132,9 @@ public class ChargebackJson extends JsonBase {
         if (paymentId != null ? !paymentId.equals(that.paymentId) : that.paymentId != null) {
             return false;
         }
+        if (chargedBackTransactionId != null ? !chargedBackTransactionId.equals(that.chargedBackTransactionId) : that.chargedBackTransactionId != null) {
+            return false;
+        }
         if (currency != null ? !currency.equals(that.currency) : that.currency != null) {
             return false;
         }
@@ -138,6 +149,7 @@ public class ChargebackJson extends JsonBase {
     public int hashCode() {
         int result = chargebackId != null ? chargebackId.hashCode() : 0;
         result = 31 * result + (accountId != null ? accountId.hashCode() : 0);
+        result = 31 * result + (chargedBackTransactionId != null ? chargedBackTransactionId.hashCode() : 0);
         result = 31 * result + (requestedDate != null ? requestedDate.hashCode() : 0);
         result = 31 * result + (effectiveDate != null ? effectiveDate.hashCode() : 0);
         result = 31 * result + (amount != null ? amount.hashCode() : 0);
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PaymentJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PaymentJson.java
index 7b509da..17ec357 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PaymentJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PaymentJson.java
@@ -33,8 +33,12 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class PaymentJson extends JsonBase {
 
-    private final BigDecimal paidAmount;
-    private final BigDecimal amount;
+    private final BigDecimal authAmount;
+    private final BigDecimal captureAmount;
+    private final BigDecimal purchaseAmount;
+    private final BigDecimal creditAmount;
+    private final BigDecimal refundAmount;
+    private final Boolean isVoid;
     private final String accountId;
     private final String invoiceId;
     private final String paymentId;
@@ -52,8 +56,12 @@ public class PaymentJson extends JsonBase {
     private final List<ChargebackJson> chargebacks;
 
     @JsonCreator
-    public PaymentJson(@JsonProperty("amount") final BigDecimal amount,
-                       @JsonProperty("paidAmount") final BigDecimal paidAmount,
+    public PaymentJson(@JsonProperty("authAmount") final BigDecimal authAmount,
+                       @JsonProperty("captureAmount") final BigDecimal captureAmount,
+                       @JsonProperty("purchaseAmount") final BigDecimal purchaseAmount,
+                       @JsonProperty("creditAmount") final BigDecimal creditAmount,
+                       @JsonProperty("refundAmount") final BigDecimal refundAmount,
+                       @JsonProperty("isVoid") final Boolean isVoid,
                        @JsonProperty("accountId") final String accountId,
                        @JsonProperty("invoiceId") final String invoiceId,
                        @JsonProperty("paymentId") final String paymentId,
@@ -71,8 +79,12 @@ public class PaymentJson extends JsonBase {
                        @JsonProperty("chargebacks") final List<ChargebackJson> chargebacks,
                        @JsonProperty("auditLogs") @Nullable final List<AuditLogJson> auditLogs) {
         super(auditLogs);
-        this.amount = amount;
-        this.paidAmount = paidAmount;
+        this.authAmount = authAmount;
+        this.captureAmount = captureAmount;
+        this.purchaseAmount = purchaseAmount;
+        this.creditAmount = creditAmount;
+        this.refundAmount = refundAmount;
+        this.isVoid = isVoid;
         this.invoiceId = invoiceId;
         this.accountId = accountId;
         this.paymentId = paymentId;
@@ -98,19 +110,27 @@ public class PaymentJson extends JsonBase {
     public PaymentJson(final DirectPayment payment, final String bundleExternalKey,
                        final List<RefundJson> refunds, final List<ChargebackJson> chargebacks,
                        @Nullable final List<AuditLog> auditLogs) {
-        this(payment.getAuthAmount() /* TODO [PAYMENT] payment.getAmount() */,
-             payment.getCapturedAmount() /* TODO [PAYMENT] payment.getPaidAmount() */,
+        this(payment.getAuthAmount(),
+             payment.getCapturedAmount(),
+             payment.getPurchasedAmount(),
+             payment.getCreditedAmount(),
+             payment.getRefundedAmount(),
+             payment.isAuthVoided(),
              payment.getAccountId().toString(),
-             null /* TODO [PAYMENT] payment.getInvoiceId().toString() */, payment.getId().toString(),
+             null,
+             payment.getId().toString(),
              payment.getPaymentNumber().toString(),
              payment.getPaymentMethodId().toString(),
              payment.getCreatedDate(), payment.getCreatedDate(),
-             1 /* TODO [PAYMENT] payment.getAttempts().size() */,
+             1,
              payment.getCurrency().toString(),
              null /*payment.getPaymentStatus().toString() */,
              null /*payment.getAttempts().get(payment.getAttempts().size() - 1).getGatewayErrorCode() */,
              null /*payment.getAttempts().get(payment.getAttempts().size() - 1).getGatewayErrorMsg() */,
-             bundleExternalKey, refunds, chargebacks, toAuditLogJson(auditLogs));
+             bundleExternalKey,
+             refunds,
+             chargebacks,
+             toAuditLogJson(auditLogs));
     }
 
     public PaymentJson(final DirectPayment payment, final List<AuditLog> auditLogs) {
@@ -121,12 +141,28 @@ public class PaymentJson extends JsonBase {
         return bundleKeys;
     }
 
-    public BigDecimal getPaidAmount() {
-        return paidAmount;
+    public BigDecimal getAuthAmount() {
+        return authAmount;
     }
 
-    public BigDecimal getAmount() {
-        return amount;
+    public BigDecimal getCaptureAmount() {
+        return captureAmount;
+    }
+
+    public BigDecimal getPurchaseAmount() {
+        return purchaseAmount;
+    }
+
+    public BigDecimal getCreditAmount() {
+        return creditAmount;
+    }
+
+    public BigDecimal getRefundAmount() {
+        return refundAmount;
+    }
+
+    public Boolean getIsVoid() {
+        return isVoid;
     }
 
     public String getAccountId() {
@@ -188,8 +224,12 @@ public class PaymentJson extends JsonBase {
     @Override
     public String toString() {
         return "PaymentJson{" +
-               "paidAmount=" + paidAmount +
-               ", amount=" + amount +
+               "authAmount=" + authAmount +
+               ", captureAmount=" + captureAmount +
+               ", purchaseAmount=" + purchaseAmount +
+               ", creditAmount=" + creditAmount +
+               ", refundAmount=" + refundAmount +
+               ", isVoid=" + isVoid +
                ", accountId='" + accountId + '\'' +
                ", invoiceId='" + invoiceId + '\'' +
                ", paymentId='" + paymentId + '\'' +
@@ -222,7 +262,22 @@ public class PaymentJson extends JsonBase {
         if (accountId != null ? !accountId.equals(that.accountId) : that.accountId != null) {
             return false;
         }
-        if (amount != null ? amount.compareTo(that.amount) != 0 : that.amount != null) {
+        if (authAmount != null ? authAmount.compareTo(that.authAmount) != 0 : that.authAmount != null) {
+            return false;
+        }
+        if (captureAmount != null ? captureAmount.compareTo(that.captureAmount) != 0 : that.captureAmount != null) {
+            return false;
+        }
+        if (purchaseAmount != null ? purchaseAmount.compareTo(that.purchaseAmount) != 0 : that.purchaseAmount != null) {
+            return false;
+        }
+        if (creditAmount != null ? creditAmount.compareTo(that.creditAmount) != 0 : that.creditAmount != null) {
+            return false;
+        }
+        if (refundAmount != null ? refundAmount.compareTo(that.refundAmount) != 0 : that.refundAmount != null) {
+            return false;
+        }
+        if (isVoid != null ? !isVoid.equals(that.isVoid) : that.isVoid != null) {
             return false;
         }
         if (bundleKeys != null ? !bundleKeys.equals(that.bundleKeys) : that.bundleKeys != null) {
@@ -246,9 +301,6 @@ public class PaymentJson extends JsonBase {
         if (invoiceId != null ? !invoiceId.equals(that.invoiceId) : that.invoiceId != null) {
             return false;
         }
-        if (paidAmount != null ? paidAmount.compareTo(that.paidAmount) != 0 : that.paidAmount != null) {
-            return false;
-        }
         if (paymentId != null ? !paymentId.equals(that.paymentId) : that.paymentId != null) {
             return false;
         }
@@ -275,8 +327,12 @@ public class PaymentJson extends JsonBase {
 
     @Override
     public int hashCode() {
-        int result = paidAmount != null ? paidAmount.hashCode() : 0;
-        result = 31 * result + (amount != null ? amount.hashCode() : 0);
+        int result = authAmount != null ? authAmount.hashCode() : 0;
+        result = 31 * result + (captureAmount != null ? captureAmount.hashCode() : 0);
+        result = 31 * result + (purchaseAmount != null ? purchaseAmount.hashCode() : 0);
+        result = 31 * result + (creditAmount != null ? creditAmount.hashCode() : 0);
+        result = 31 * result + (refundAmount != null ? refundAmount.hashCode() : 0);
+        result = 31 * result + (isVoid != null ? isVoid.hashCode() : 0);
         result = 31 * result + (accountId != null ? accountId.hashCode() : 0);
         result = 31 * result + (invoiceId != null ? invoiceId.hashCode() : 0);
         result = 31 * result + (paymentId != null ? paymentId.hashCode() : 0);
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
index acd2457..e025dc0 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
@@ -23,10 +23,13 @@ import java.net.URI;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 
+import javax.annotation.Nullable;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
@@ -82,6 +85,7 @@ import org.killbill.billing.overdue.OverdueUserApi;
 import org.killbill.billing.overdue.config.api.OverdueException;
 import org.killbill.billing.payment.api.DirectPayment;
 import org.killbill.billing.payment.api.DirectPaymentApi;
+import org.killbill.billing.payment.api.DirectPaymentTransaction;
 import org.killbill.billing.payment.api.PaymentApiException;
 import org.killbill.billing.payment.api.PaymentMethod;
 import org.killbill.billing.payment.api.PluginProperty;
@@ -122,8 +126,6 @@ public class AccountResource extends JaxRsResourceBase {
     private final SubscriptionApi subscriptionApi;
     private final InvoiceUserApi invoiceApi;
     private final InvoicePaymentApi invoicePaymentApi;
-    private final DirectPaymentApi paymentApi;
-    private final DirectPaymentApi directPaymentApi;
     private final OverdueUserApi overdueApi;
 
     @Inject
@@ -132,7 +134,6 @@ public class AccountResource extends JaxRsResourceBase {
                            final InvoiceUserApi invoiceApi,
                            final InvoicePaymentApi invoicePaymentApi,
                            final DirectPaymentApi paymentApi,
-                           final DirectPaymentApi directPaymentApi,
                            final TagUserApi tagUserApi,
                            final AuditUserApi auditUserApi,
                            final CustomFieldUserApi customFieldUserApi,
@@ -140,12 +141,10 @@ public class AccountResource extends JaxRsResourceBase {
                            final OverdueUserApi overdueApi,
                            final Clock clock,
                            final Context context) {
-        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountApi, clock, context);
+        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountApi, paymentApi, clock, context);
         this.subscriptionApi = subscriptionApi;
         this.invoiceApi = invoiceApi;
         this.invoicePaymentApi = invoicePaymentApi;
-        this.paymentApi = paymentApi;
-        this.directPaymentApi = directPaymentApi;
         this.overdueApi = overdueApi;
     }
 
@@ -336,17 +335,17 @@ public class AccountResource extends JaxRsResourceBase {
         final List<DirectPayment> payments = paymentApi.getAccountPayments(accountId, false, ImmutableList.<PluginProperty>of(), tenantContext);
 
         // Get the refunds
-        final List<DirectPayment> refunds = null; // STEPH paymentApi.getAccountRefunds(account, tenantContext);
-        final Multimap<UUID, DirectPayment> refundsByPayment = ArrayListMultimap.<UUID, DirectPayment>create();
-        for (final DirectPayment refund : refunds) {
-            refundsByPayment.put(refund.getId(), refund);
+        final Iterable<DirectPaymentTransaction> refunds = getDirectPaymentTransactions(payments, TransactionType.REFUND);
+        final Multimap<UUID, DirectPaymentTransaction> refundsByPayment = ArrayListMultimap.<UUID, DirectPaymentTransaction>create();
+        for (final DirectPaymentTransaction refund : refunds) {
+            refundsByPayment.put(refund.getDirectPaymentId(), refund);
         }
 
         // Get the chargebacks
-        final List<InvoicePayment> chargebacks = invoicePaymentApi.getChargebacksByAccountId(accountId, tenantContext);
-        final Multimap<UUID, InvoicePayment> chargebacksByPayment = ArrayListMultimap.<UUID, InvoicePayment>create();
-        for (final InvoicePayment chargeback : chargebacks) {
-            chargebacksByPayment.put(chargeback.getPaymentId(), chargeback);
+        final Iterable<DirectPaymentTransaction> chargebacks = getDirectPaymentTransactions(payments, TransactionType.CHARGEBACK);
+        final Multimap<UUID, DirectPaymentTransaction> chargebacksByPayment = ArrayListMultimap.<UUID, DirectPaymentTransaction>create();
+        for (final DirectPaymentTransaction chargeback : chargebacks) {
+            chargebacksByPayment.put(chargeback.getDirectPaymentId(), chargeback);
         }
 
         // Get the bundles
@@ -355,7 +354,12 @@ public class AccountResource extends JaxRsResourceBase {
         // Get all audit logs
         final AccountAuditLogs accountAuditLogs = auditUserApi.getAccountAuditLogs(accountId, auditMode.getLevel(), tenantContext);
 
-        final AccountTimelineJson json = new AccountTimelineJson(account, invoices, payments, bundles,
+        final List<InvoicePayment> invoicePayments = invoicePaymentApi.getInvoicePaymentsByAccount(accountId, tenantContext);
+        final Map<UUID, UUID> invoicesIdByPayment = new HashMap<UUID, UUID>();
+        for (InvoicePayment cur : invoicePayments) {
+            invoicesIdByPayment.put(cur.getPaymentId(), cur.getInvoiceId());
+        }
+        final AccountTimelineJson json = new AccountTimelineJson(account, invoices, payments, invoicesIdByPayment, bundles,
                                                                  refundsByPayment, chargebacksByPayment,
                                                                  accountAuditLogs);
         return Response.status(Status.OK).entity(json).build();
@@ -499,11 +503,7 @@ public class AccountResource extends JaxRsResourceBase {
             final BigDecimal amountToPay = (remainingRequestPayment.compareTo(invoice.getBalance()) >= 0) ?
                                            invoice.getBalance() : remainingRequestPayment;
             if (amountToPay.compareTo(BigDecimal.ZERO) > 0) {
-                if (externalPayment) {
-                    // STEPH paymentApi.createExternalPayment(account, invoice.getId(), amountToPay, callContext);
-                } else {
-                    // STEPH  paymentApi.createPayment(account, invoice.getId(), amountToPay, pluginProperties, callContext);
-                }
+                createPurchaseForInvoice(account, invoice.getId(), amountToPay, externalPayment, callContext);
             }
             remainingRequestPayment = remainingRequestPayment.subtract(amountToPay);
             if (remainingRequestPayment.compareTo(BigDecimal.ZERO) == 0) {
@@ -520,6 +520,7 @@ public class AccountResource extends JaxRsResourceBase {
         return Response.status(Status.OK).build();
     }
 
+
     @POST
     @Path("/{accountId:" + UUID_PATTERN + "}/" + PAYMENT_METHODS)
     @Consumes(APPLICATION_JSON)
@@ -550,7 +551,7 @@ public class AccountResource extends JaxRsResourceBase {
         final UUID paymentMethodId = paymentApi.addPaymentMethod(data.getExternalKey(), account, data.getPluginName(), isDefault, data.getPluginDetail(), pluginProperties, callContext);
         if (payAllUnpaidInvoices && unpaidInvoices.size() > 0) {
             for (final Invoice invoice : unpaidInvoices) {
-                // STEPH paymentApi.createPayment(account, invoice.getId(), invoice.getBalance(), pluginProperties, callContext);
+                createPurchaseForInvoice(account, invoice.getId(), invoice.getBalance(), false, callContext);
             }
         }
         return uriBuilder.buildResponse(PaymentMethodResource.class, "getPaymentMethod", paymentMethodId, uriInfo.getBaseUri().toString());
@@ -601,7 +602,7 @@ public class AccountResource extends JaxRsResourceBase {
         if (payAllUnpaidInvoices) {
             final Collection<Invoice> unpaidInvoices = invoiceApi.getUnpaidInvoicesByAccountId(account.getId(), clock.getUTCToday(), callContext);
             for (final Invoice invoice : unpaidInvoices) {
-                // STEPH paymentApi.createPayment(account, invoice.getId(), invoice.getBalance(), pluginProperties, callContext);
+                createPurchaseForInvoice(account, invoice.getId(), invoice.getBalance(), false, callContext);
             }
         }
         return Response.status(Status.OK).build();
@@ -619,7 +620,7 @@ public class AccountResource extends JaxRsResourceBase {
                                                 @javax.ws.rs.core.Context final HttpServletRequest request) throws PaymentApiException {
         final UUID accountId = UUID.fromString(accountIdStr);
         final TenantContext tenantContext = context.createContext(request);
-        final List<DirectPayment> payments = directPaymentApi.getAccountPayments(accountId, withPluginInfo, ImmutableList.<PluginProperty>of(), tenantContext);
+        final List<DirectPayment> payments = paymentApi.getAccountPayments(accountId, withPluginInfo, ImmutableList.<PluginProperty>of(), tenantContext);
         final AccountAuditLogs accountAuditLogs = auditUserApi.getAccountAuditLogs(accountId, auditMode.getLevel(), tenantContext);
         final List<DirectPaymentJson> result = ImmutableList.copyOf(Iterables.transform(payments, new Function<DirectPayment, DirectPaymentJson>() {
             @Override
@@ -655,17 +656,17 @@ public class AccountResource extends JaxRsResourceBase {
         final DirectPayment result;
         switch (transactionType) {
             case AUTHORIZE:
-                result = directPaymentApi.createAuthorization(account, paymentMethodId, directPaymentId, json.getAmount(), currency,
+                result = paymentApi.createAuthorization(account, paymentMethodId, directPaymentId, json.getAmount(), currency,
                                                               json.getDirectPaymentExternalKey(), json.getDirectTransactionExternalKey(),
                                                               pluginProperties, callContext);
                 break;
             case PURCHASE:
-                result = directPaymentApi.createPurchase(account, paymentMethodId, directPaymentId, json.getAmount(), currency,
+                result = paymentApi.createPurchase(account, paymentMethodId, directPaymentId, json.getAmount(), currency,
                                                          json.getDirectPaymentExternalKey(), json.getDirectTransactionExternalKey(),
                                                          pluginProperties, callContext);
                 break;
             case CREDIT:
-                result = directPaymentApi.createCredit(account, paymentMethodId, directPaymentId, json.getAmount(), currency,
+                result = paymentApi.createCredit(account, paymentMethodId, directPaymentId, json.getAmount(), currency,
                                                        json.getDirectPaymentExternalKey(), json.getDirectTransactionExternalKey(),
                                                        pluginProperties, callContext);
                 break;
@@ -682,11 +683,15 @@ public class AccountResource extends JaxRsResourceBase {
     @Path("/{accountId:" + UUID_PATTERN + "}/" + CHARGEBACKS)
     @Produces(APPLICATION_JSON)
     public Response getChargebacksForAccount(@PathParam("accountId") final String accountIdStr,
-                                             @javax.ws.rs.core.Context final HttpServletRequest request) {
+                                             @javax.ws.rs.core.Context final HttpServletRequest request) throws PaymentApiException {
+
         final UUID accountId = UUID.fromString(accountIdStr);
-        final List<InvoicePayment> chargebacks = invoicePaymentApi.getChargebacksByAccountId(accountId, context.createContext(request));
+        final TenantContext tenantContext = context.createContext(request);
+
+        final List<DirectPayment> payments = paymentApi.getAccountPayments(accountId, false, ImmutableList.<PluginProperty>of(), tenantContext);
+        final Iterable<DirectPaymentTransaction> transactions = getDirectPaymentTransactions(payments, TransactionType.CHARGEBACK);
         final List<ChargebackJson> chargebacksJson = new ArrayList<ChargebackJson>();
-        for (final InvoicePayment chargeback : chargebacks) {
+        for (final DirectPaymentTransaction chargeback : transactions) {
             chargebacksJson.add(new ChargebackJson(accountId, chargeback));
         }
         return Response.status(Response.Status.OK).entity(chargebacksJson).build();
@@ -703,15 +708,16 @@ public class AccountResource extends JaxRsResourceBase {
         final TenantContext tenantContext = context.createContext(request);
 
         final Account account = accountUserApi.getAccountById(UUID.fromString(accountId), tenantContext);
-        final List<DirectPayment> refunds = null; // STEPH paymentApi.getAccountRefunds(account, tenantContext);
-        final List<RefundJson> result = new ArrayList<RefundJson>(Collections2.transform(refunds, new Function<DirectPayment, RefundJson>() {
+
+        final List<DirectPayment> payments = paymentApi.getAccountPayments(account.getId(), false, ImmutableList.<PluginProperty>of(), tenantContext);
+        final Iterable<DirectPaymentTransaction> transactions = getDirectPaymentTransactions(payments, TransactionType.REFUND);
+
+        final Iterable<RefundJson> result = Iterables.transform(transactions, new Function<DirectPaymentTransaction, RefundJson>() {
             @Override
-            public RefundJson apply(final DirectPayment input) {
-                // TODO Return adjusted items and audits
-                return null; // STEPH new RefundJson(input, null, null);
+            public RefundJson apply(final DirectPaymentTransaction input) {
+                return new RefundJson(input, null, null);
             }
-        }));
-
+        });
         return Response.status(Status.OK).entity(result).build();
     }
 
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/BundleResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/BundleResource.java
index f3f72a3..9683bd1 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/BundleResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/BundleResource.java
@@ -45,6 +45,7 @@ import org.killbill.billing.ObjectType;
 import org.killbill.billing.account.api.AccountApiException;
 import org.killbill.billing.account.api.AccountUserApi;
 import org.killbill.billing.catalog.api.BillingActionPolicy;
+import org.killbill.billing.payment.api.DirectPaymentApi;
 import org.killbill.clock.Clock;
 import org.killbill.billing.entitlement.api.EntitlementApi;
 import org.killbill.billing.entitlement.api.EntitlementApiException;
@@ -88,9 +89,10 @@ public class BundleResource extends JaxRsResourceBase {
                           final AccountUserApi accountUserApi,
                           final SubscriptionApi subscriptionApi,
                           final EntitlementApi entitlementApi,
+                          final DirectPaymentApi paymentApi,
                           final Clock clock,
                           final Context context) {
-        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, clock, context);
+        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, paymentApi, clock, context);
         this.entitlementApi = entitlementApi;
         this.subscriptionApi = subscriptionApi;
     }
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CatalogResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CatalogResource.java
index 6976296..ab6bb58 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CatalogResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CatalogResource.java
@@ -32,6 +32,7 @@ import org.killbill.billing.catalog.api.CatalogApiException;
 import org.killbill.billing.catalog.api.CatalogService;
 import org.killbill.billing.catalog.api.Listing;
 import org.killbill.billing.catalog.api.StaticCatalog;
+import org.killbill.billing.payment.api.DirectPaymentApi;
 import org.killbill.clock.Clock;
 import org.killbill.billing.jaxrs.json.CatalogJsonSimple;
 import org.killbill.billing.jaxrs.json.PlanDetailJson;
@@ -61,9 +62,10 @@ public class CatalogResource extends JaxRsResourceBase {
                            final CustomFieldUserApi customFieldUserApi,
                            final AuditUserApi auditUserApi,
                            final AccountUserApi accountUserApi,
+                           final DirectPaymentApi paymentApi,
                            final Clock clock,
                            final Context context) {
-        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, clock, context);
+        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, paymentApi, clock, context);
         this.catalogService = catalogService;
     }
 
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/ChargebackResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/ChargebackResource.java
index 4145098..55615cb 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/ChargebackResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/ChargebackResource.java
@@ -31,19 +31,26 @@ import javax.ws.rs.core.UriInfo;
 
 import org.killbill.billing.ErrorCode;
 import org.killbill.billing.ObjectType;
+import org.killbill.billing.account.api.Account;
+import org.killbill.billing.account.api.AccountApiException;
 import org.killbill.billing.account.api.AccountUserApi;
-import org.killbill.clock.Clock;
+import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.invoice.api.InvoiceApiException;
 import org.killbill.billing.invoice.api.InvoicePayment;
 import org.killbill.billing.invoice.api.InvoicePaymentApi;
 import org.killbill.billing.jaxrs.json.ChargebackJson;
 import org.killbill.billing.jaxrs.util.Context;
 import org.killbill.billing.jaxrs.util.JaxrsUriBuilder;
+import org.killbill.billing.payment.api.DirectPayment;
+import org.killbill.billing.payment.api.DirectPaymentApi;
+import org.killbill.billing.payment.api.DirectPaymentTransaction;
+import org.killbill.billing.payment.api.PaymentApiException;
 import org.killbill.billing.util.api.AuditUserApi;
 import org.killbill.billing.util.api.CustomFieldUserApi;
 import org.killbill.billing.util.api.TagUserApi;
 import org.killbill.billing.util.callcontext.CallContext;
 import org.killbill.billing.util.callcontext.TenantContext;
+import org.killbill.clock.Clock;
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -54,36 +61,18 @@ import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 @Path(JaxrsResource.CHARGEBACKS_PATH)
 public class ChargebackResource extends JaxRsResourceBase {
 
-    private final InvoicePaymentApi invoicePaymentApi;
-
     @Inject
-    public ChargebackResource(final InvoicePaymentApi invoicePaymentApi,
-                              final JaxrsUriBuilder uriBuilder,
+    public ChargebackResource(final JaxrsUriBuilder uriBuilder,
                               final TagUserApi tagUserApi,
                               final CustomFieldUserApi customFieldUserApi,
                               final AuditUserApi auditUserApi,
                               final AccountUserApi accountUserApi,
+                              final DirectPaymentApi paymentApi,
                               final Clock clock,
                               final Context context) {
-        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, clock, context);
-        this.invoicePaymentApi = invoicePaymentApi;
-    }
-
-    @GET
-    @Path("/{chargebackId:" + UUID_PATTERN + "}")
-    @Produces(APPLICATION_JSON)
-    public Response getChargeback(@PathParam("chargebackId") final String chargebackId,
-                                  @javax.ws.rs.core.Context final HttpServletRequest request) throws InvoiceApiException {
-        final TenantContext tenantContext = context.createContext(request);
-        final InvoicePayment chargeback = invoicePaymentApi.getChargebackById(UUID.fromString(chargebackId), tenantContext);
-        final UUID accountId = invoicePaymentApi.getAccountIdFromInvoicePaymentId(chargeback.getId(), tenantContext);
-        final ChargebackJson chargebackJson = new ChargebackJson(accountId, chargeback);
-
-        return Response.status(Response.Status.OK).entity(chargebackJson).build();
+        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, paymentApi, clock, context);
     }
 
-
-
     @POST
     @Consumes(APPLICATION_JSON)
     @Produces(APPLICATION_JSON)
@@ -92,20 +81,18 @@ public class ChargebackResource extends JaxRsResourceBase {
                                      @HeaderParam(HDR_REASON) final String reason,
                                      @HeaderParam(HDR_COMMENT) final String comment,
                                      @javax.ws.rs.core.Context final HttpServletRequest request,
-                                     @javax.ws.rs.core.Context final UriInfo uriInfo) throws InvoiceApiException {
+                                     @javax.ws.rs.core.Context final UriInfo uriInfo) throws InvoiceApiException, AccountApiException, PaymentApiException {
+
         final CallContext callContext = context.createContext(createdBy, reason, comment, request);
+        final Account account = accountUserApi.getAccountById(UUID.fromString(json.getAccountId()), callContext);
 
-        final InvoicePayment invoicePayment = invoicePaymentApi.getInvoicePaymentForAttempt(UUID.fromString(json.getPaymentId()), callContext);
-        if (invoicePayment == null) {
-            throw new InvoiceApiException(ErrorCode.INVOICE_PAYMENT_NOT_FOUND, json.getPaymentId());
-        }
-        final InvoicePayment chargeBack = invoicePaymentApi.createChargeback(invoicePayment.getId(), json.getAmount(),
-                                                                             callContext);
-        return uriBuilder.buildResponse(uriInfo, ChargebackResource.class, "getChargeback", chargeBack.getId());
+        final DirectPayment payment = paymentApi.notifyChargeback(account, UUID.fromString(json.getChargedBackTransactionId()), json.getChargedBackTransactionId(), json.getAmount(),
+                                                                  Currency.valueOf(json.getCurrency()), callContext);
+        return uriBuilder.buildResponse(uriInfo, DirectPaymentResource.class, "getDirectPayment", payment.getId());
     }
 
     @Override
     protected ObjectType getObjectType() {
-        return ObjectType.INVOICE_PAYMENT;
+        return ObjectType.TRANSACTION;
     }
 }
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CreditResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CreditResource.java
index d570776..c2a81db 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CreditResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CreditResource.java
@@ -35,6 +35,7 @@ import org.killbill.billing.ObjectType;
 import org.killbill.billing.account.api.Account;
 import org.killbill.billing.account.api.AccountApiException;
 import org.killbill.billing.account.api.AccountUserApi;
+import org.killbill.billing.payment.api.DirectPaymentApi;
 import org.killbill.clock.Clock;
 import org.killbill.billing.invoice.api.Invoice;
 import org.killbill.billing.invoice.api.InvoiceApiException;
@@ -68,9 +69,10 @@ public class CreditResource extends JaxRsResourceBase {
                           final TagUserApi tagUserApi,
                           final CustomFieldUserApi customFieldUserApi,
                           final AuditUserApi auditUserApi,
+                          final DirectPaymentApi paymentApi,
                           final Clock clock,
                           final Context context) {
-        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, clock, context);
+        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, paymentApi, clock, context);
         this.invoiceUserApi = invoiceUserApi;
         this.accountUserApi = accountUserApi;
     }
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CustomFieldResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CustomFieldResource.java
index 683240a..a2d75b0 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CustomFieldResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CustomFieldResource.java
@@ -30,6 +30,7 @@ import javax.ws.rs.core.Response;
 
 import org.killbill.billing.ObjectType;
 import org.killbill.billing.account.api.AccountUserApi;
+import org.killbill.billing.payment.api.DirectPaymentApi;
 import org.killbill.clock.Clock;
 import org.killbill.billing.jaxrs.json.CustomFieldJson;
 import org.killbill.billing.jaxrs.util.Context;
@@ -60,9 +61,10 @@ public class CustomFieldResource extends JaxRsResourceBase {
                                final CustomFieldUserApi customFieldUserApi,
                                final AuditUserApi auditUserApi,
                                final AccountUserApi accountUserApi,
+                               final DirectPaymentApi paymentApi,
                                final Clock clock,
                                final Context context) {
-        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, clock, context);
+        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, paymentApi, clock, context);
     }
 
     @GET
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/DirectPaymentResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/DirectPaymentResource.java
index 8651604..707efe1 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/DirectPaymentResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/DirectPaymentResource.java
@@ -39,6 +39,7 @@ import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
+import org.killbill.billing.ObjectType;
 import org.killbill.billing.account.api.Account;
 import org.killbill.billing.account.api.AccountApiException;
 import org.killbill.billing.account.api.AccountUserApi;
@@ -69,19 +70,16 @@ import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 @Path(JaxrsResource.DIRECT_PAYMENTS_PATH)
 public class DirectPaymentResource extends JaxRsResourceBase {
 
-    private final DirectPaymentApi directPaymentApi;
-
     @Inject
     public DirectPaymentResource(final JaxrsUriBuilder uriBuilder,
                                  final TagUserApi tagUserApi,
                                  final CustomFieldUserApi customFieldUserApi,
                                  final AuditUserApi auditUserApi,
                                  final AccountUserApi accountUserApi,
-                                 final DirectPaymentApi directPaymentApi,
+                                 final DirectPaymentApi paymentApi,
                                  final Clock clock,
                                  final Context context) {
-        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, clock, context);
-        this.directPaymentApi = directPaymentApi;
+        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, paymentApi, clock, context);
     }
 
     @GET
@@ -95,7 +93,7 @@ public class DirectPaymentResource extends JaxRsResourceBase {
         final Iterable<PluginProperty> pluginProperties = extractPluginProperties(pluginPropertiesString);
         final UUID directPaymentIdId = UUID.fromString(directPaymentIdStr);
         final TenantContext tenantContext = context.createContext(request);
-        final DirectPayment directPayment = directPaymentApi.getPayment(directPaymentIdId, withPluginInfo, pluginProperties, tenantContext);
+        final DirectPayment directPayment = paymentApi.getPayment(directPaymentIdId, withPluginInfo, pluginProperties, tenantContext);
         final AccountAuditLogs accountAuditLogs = auditUserApi.getAccountAuditLogs(directPayment.getAccountId(), auditMode.getLevel(), tenantContext);
         final DirectPaymentJson result = new DirectPaymentJson(directPayment, accountAuditLogs);
 
@@ -117,9 +115,9 @@ public class DirectPaymentResource extends JaxRsResourceBase {
 
         final Pagination<DirectPayment> directPayments;
         if (Strings.isNullOrEmpty(pluginName)) {
-            directPayments = directPaymentApi.getPayments(offset, limit, withPluginInfo, pluginProperties, tenantContext);
+            directPayments = paymentApi.getPayments(offset, limit, withPluginInfo, pluginProperties, tenantContext);
         } else {
-            directPayments = directPaymentApi.getPayments(offset, limit, pluginName, withPluginInfo, pluginProperties, tenantContext);
+            directPayments = paymentApi.getPayments(offset, limit, pluginName, withPluginInfo, pluginProperties, tenantContext);
         }
 
         final URI nextPageUri = uriBuilder.nextPage(DirectPaymentResource.class, "getDirectPayments", directPayments.getNextOffset(), limit, ImmutableMap.<String, String>of(QUERY_PAYMENT_METHOD_PLUGIN_NAME, Strings.nullToEmpty(pluginName),
@@ -159,9 +157,9 @@ public class DirectPaymentResource extends JaxRsResourceBase {
         // Search the plugin(s)
         final Pagination<DirectPayment> directPayments;
         if (Strings.isNullOrEmpty(pluginName)) {
-            directPayments = directPaymentApi.searchPayments(searchKey, offset, limit, withPluginInfo, pluginProperties, tenantContext);
+            directPayments = paymentApi.searchPayments(searchKey, offset, limit, withPluginInfo, pluginProperties, tenantContext);
         } else {
-            directPayments = directPaymentApi.searchPayments(searchKey, offset, limit, pluginName, withPluginInfo, pluginProperties, tenantContext);
+            directPayments = paymentApi.searchPayments(searchKey, offset, limit, pluginName, withPluginInfo, pluginProperties, tenantContext);
         }
 
         final URI nextPageUri = uriBuilder.nextPage(DirectPaymentResource.class, "searchDirectPayments", directPayments.getNextOffset(), limit, ImmutableMap.<String, String>of("searchKey", searchKey,
@@ -200,12 +198,12 @@ public class DirectPaymentResource extends JaxRsResourceBase {
         final Iterable<PluginProperty> pluginProperties = extractPluginProperties(pluginPropertiesString);
         final CallContext callContext = context.createContext(createdBy, reason, comment, request);
         final UUID directPaymentId = UUID.fromString(directPaymentIdStr);
-        final DirectPayment initialPayment = directPaymentApi.getPayment(directPaymentId, false, pluginProperties, callContext);
+        final DirectPayment initialPayment = paymentApi.getPayment(directPaymentId, false, pluginProperties, callContext);
 
         final Account account = accountUserApi.getAccountById(initialPayment.getAccountId(), callContext);
         final Currency currency = json.getCurrency() == null ? account.getCurrency() : Currency.valueOf(json.getCurrency());
 
-        final DirectPayment payment = directPaymentApi.createCapture(account, directPaymentId, json.getAmount(), currency,
+        final DirectPayment payment = paymentApi.createCapture(account, directPaymentId, json.getAmount(), currency,
                                                                      json.getDirectTransactionExternalKey(), pluginProperties, callContext);
         return uriBuilder.buildResponse(uriInfo, DirectPaymentResource.class, "getDirectPayment", payment.getId());
     }
@@ -225,13 +223,13 @@ public class DirectPaymentResource extends JaxRsResourceBase {
         final Iterable<PluginProperty> pluginProperties = extractPluginProperties(pluginPropertiesString);
         final CallContext callContext = context.createContext(createdBy, reason, comment, request);
         final UUID directPaymentId = UUID.fromString(directPaymentIdStr);
-        final DirectPayment initialPayment = directPaymentApi.getPayment(directPaymentId, false, pluginProperties, callContext);
+        final DirectPayment initialPayment = paymentApi.getPayment(directPaymentId, false, pluginProperties, callContext);
 
         final Account account = accountUserApi.getAccountById(initialPayment.getAccountId(), callContext);
         final Currency currency = json.getCurrency() == null ? account.getCurrency() : Currency.valueOf(json.getCurrency());
 
-        final DirectPayment payment = directPaymentApi.createRefund(account, directPaymentId, json.getAmount(), currency,
-                                                                    json.getDirectTransactionExternalKey(), pluginProperties, callContext);
+        final DirectPayment payment = paymentApi.createRefund(account, directPaymentId, json.getAmount(), currency,
+                                                              json.getDirectTransactionExternalKey(), pluginProperties, callContext);
         return uriBuilder.buildResponse(uriInfo, DirectPaymentResource.class, "getDirectPayment", payment.getId());
     }
 
@@ -250,11 +248,17 @@ public class DirectPaymentResource extends JaxRsResourceBase {
         final Iterable<PluginProperty> pluginProperties = extractPluginProperties(pluginPropertiesString);
         final CallContext callContext = context.createContext(createdBy, reason, comment, request);
         final UUID directPaymentId = UUID.fromString(directPaymentIdStr);
-        final DirectPayment initialPayment = directPaymentApi.getPayment(directPaymentId, false, pluginProperties, callContext);
+        final DirectPayment initialPayment = paymentApi.getPayment(directPaymentId, false, pluginProperties, callContext);
 
         final Account account = accountUserApi.getAccountById(initialPayment.getAccountId(), callContext);
 
-        final DirectPayment payment = directPaymentApi.createVoid(account, directPaymentId, json.getDirectTransactionExternalKey(), pluginProperties, callContext);
+        final DirectPayment payment = paymentApi.createVoid(account, directPaymentId, json.getDirectTransactionExternalKey(), pluginProperties, callContext);
         return uriBuilder.buildResponse(uriInfo, DirectPaymentResource.class, "getDirectPayment", payment.getId());
     }
+
+    @Override
+    protected ObjectType getObjectType() {
+        return ObjectType.PAYMENT;
+    }
+
 }
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/ExportResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/ExportResource.java
index ffe7334..46982e6 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/ExportResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/ExportResource.java
@@ -31,6 +31,7 @@ import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.StreamingOutput;
 
 import org.killbill.billing.account.api.AccountUserApi;
+import org.killbill.billing.payment.api.DirectPaymentApi;
 import org.killbill.clock.Clock;
 import org.killbill.billing.jaxrs.util.Context;
 import org.killbill.billing.jaxrs.util.JaxrsUriBuilder;
@@ -57,9 +58,10 @@ public class ExportResource extends JaxRsResourceBase {
                           final CustomFieldUserApi customFieldUserApi,
                           final AuditUserApi auditUserApi,
                           final AccountUserApi accountUserApi,
+                          final DirectPaymentApi paymentApi,
                           final Clock clock,
                           final Context context) {
-        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, clock, context);
+        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, paymentApi, clock, context);
         this.exportUserApi = exportUserApi;
     }
 
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoicePaymentResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoicePaymentResource.java
index f392104..d538f32 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoicePaymentResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoicePaymentResource.java
@@ -45,6 +45,7 @@ import org.killbill.billing.ObjectType;
 import org.killbill.billing.account.api.Account;
 import org.killbill.billing.account.api.AccountApiException;
 import org.killbill.billing.account.api.AccountUserApi;
+import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.invoice.api.InvoiceApiException;
 import org.killbill.billing.invoice.api.InvoicePayment;
 import org.killbill.billing.invoice.api.InvoicePaymentApi;
@@ -74,6 +75,7 @@ import org.killbill.clock.Clock;
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.inject.Inject;
 
@@ -84,22 +86,17 @@ public class InvoicePaymentResource extends JaxRsResourceBase {
 
     private static final String ID_PARAM_NAME = "paymentId";
 
-    private final DirectPaymentApi paymentApi;
-    private final InvoicePaymentApi invoicePaymentApi;
 
     @Inject
     public InvoicePaymentResource(final AccountUserApi accountUserApi,
                                   final DirectPaymentApi paymentApi,
-                                  final InvoicePaymentApi invoicePaymentApi,
                                   final JaxrsUriBuilder uriBuilder,
                                   final TagUserApi tagUserApi,
                                   final CustomFieldUserApi customFieldUserApi,
                                   final AuditUserApi auditUserApi,
                                   final Clock clock,
                                   final Context context) {
-        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, clock, context);
-        this.paymentApi = paymentApi;
-        this.invoicePaymentApi = invoicePaymentApi;
+        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, paymentApi, clock, context);
     }
 
 
@@ -115,31 +112,34 @@ public class InvoicePaymentResource extends JaxRsResourceBase {
                                  @HeaderParam(HDR_COMMENT) final String comment,
                                  @javax.ws.rs.core.Context final UriInfo uriInfo,
                                  @javax.ws.rs.core.Context final HttpServletRequest request) throws PaymentApiException, AccountApiException {
-        final Iterable<PluginProperty> pluginProperties = extractPluginProperties(pluginPropertiesString);
-        final CallContext callContext = context.createContext(createdBy, reason, comment, request);
 
+
+        final CallContext callContext = context.createContext(createdBy, reason, comment, request);
         final UUID paymentUuid = UUID.fromString(paymentId);
-        final DirectPayment payment = paymentApi.getPayment(paymentUuid, false, pluginProperties, callContext);
-        final Account account = accountUserApi.getAccountById(payment.getAccountId(), callContext);
+        final DirectPayment payment = paymentApi.getPayment(paymentUuid, false, ImmutableList.<PluginProperty>of(), callContext);
+        final Account account= accountUserApi.getAccountById(payment.getAccountId(), callContext);
 
-        final DirectPayment result;
+        final Iterable<PluginProperty> pluginProperties;
+        final String transactionExternalKey = UUID.randomUUID().toString();
         if (json.isAdjusted()) {
             if (json.getAdjustments() != null && json.getAdjustments().size() > 0) {
                 final Map<UUID, BigDecimal> adjustments = new HashMap<UUID, BigDecimal>();
                 for (final InvoiceItemJson item : json.getAdjustments()) {
                     adjustments.put(UUID.fromString(item.getInvoiceItemId()), item.getAmount());
                 }
-                result = null; // STEPH  paymentApi.createRefundWithItemsAdjustments(account, paymentUuid, adjustments, pluginProperties, callContext);
+                pluginProperties = extractPluginProperties(pluginPropertiesString,
+                                                           new PluginProperty("IPCD_REF_IDS_AMOUNTS", true, false),
+                                                           new PluginProperty("IPCD_REFUND_WITH_ADJUSTMENTS", adjustments, false));
             } else {
-                // Invoice adjustment
-                result = null; // STEPH  paymentApi.createRefundWithAdjustment(account, paymentUuid, json.getAmount(), pluginProperties, callContext);
+                pluginProperties = extractPluginProperties(pluginPropertiesString,
+                                                           new PluginProperty("IPCD_REF_IDS_AMOUNTS", true, false));
             }
         } else {
-            // Refund without adjustment
-            result = null;//  STEPH paymentApi.createRefund(account, paymentUuid, json.getAmount(), pluginProperties, callContext);
+            pluginProperties = extractPluginProperties(pluginPropertiesString);
         }
-
-        return null; // STEPH uriBuilder.buildResponse(RefundResource.class, "getRefund", result.getId(), uriInfo.getBaseUri().toString());
+        final DirectPayment result = paymentApi.createRefundWithPaymentControl(account, payment.getId(), null, account.getCurrency(), transactionExternalKey,
+                                                                               pluginProperties, createInvoicePaymentControlPluginApiPaymentOptions(false), callContext);
+        return uriBuilder.buildResponse(DirectPaymentResource.class, "getDirectPayment", result.getId(), uriInfo.getBaseUri().toString());
     }
 
     @GET
@@ -226,6 +226,6 @@ public class InvoicePaymentResource extends JaxRsResourceBase {
 
     @Override
     protected ObjectType getObjectType() {
-        return ObjectType.INVOICE_PAYMENT;
+        return ObjectType.PAYMENT;
     }
 }
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java
index 864aa3b..a89d229 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java
@@ -57,6 +57,7 @@ import org.killbill.billing.invoice.api.Invoice;
 import org.killbill.billing.invoice.api.InvoiceApiException;
 import org.killbill.billing.invoice.api.InvoiceItem;
 import org.killbill.billing.invoice.api.InvoiceNotifier;
+import org.killbill.billing.invoice.api.InvoicePayment;
 import org.killbill.billing.invoice.api.InvoiceUserApi;
 import org.killbill.billing.jaxrs.json.CustomFieldJson;
 import org.killbill.billing.jaxrs.json.InvoiceItemJson;
@@ -100,7 +101,6 @@ public class InvoiceResource extends JaxRsResourceBase {
     private static final String ID_PARAM_NAME = "invoiceId";
 
     private final InvoiceUserApi invoiceApi;
-    private final DirectPaymentApi paymentApi;
     private final InvoiceNotifier invoiceNotifier;
 
     @Inject
@@ -114,9 +114,8 @@ public class InvoiceResource extends JaxRsResourceBase {
                            final CustomFieldUserApi customFieldUserApi,
                            final AuditUserApi auditUserApi,
                            final Context context) {
-        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, clock, context);
+        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, paymentApi, clock, context);
         this.invoiceApi = invoiceApi;
-        this.paymentApi = paymentApi;
         this.invoiceNotifier = invoiceNotifier;
     }
 
@@ -355,9 +354,8 @@ public class InvoiceResource extends JaxRsResourceBase {
             for (final InvoiceItem externalCharge : createdExternalCharges) {
                 if (!paidInvoices.contains(externalCharge.getInvoiceId())) {
                     paidInvoices.add(externalCharge.getInvoiceId());
-
                     final Invoice invoice = invoiceApi.getInvoice(externalCharge.getInvoiceId(), callContext);
-                    // STEPH paymentApi.createPurchaseWithPaymentControl(account, invoice.getId(), invoice.getBalance(), pluginProperties, callContext);
+                    createPurchaseForInvoice(account, invoice.getId(), invoice.getBalance(), false, callContext);
                 }
             }
         }
@@ -378,12 +376,18 @@ public class InvoiceResource extends JaxRsResourceBase {
     @Produces(APPLICATION_JSON)
     public Response getPayments(@PathParam("invoiceId") final String invoiceId,
                                 @QueryParam(QUERY_AUDIT) @DefaultValue("NONE") final AuditMode auditMode,
-                                @javax.ws.rs.core.Context final HttpServletRequest request) throws PaymentApiException {
+                                @QueryParam(QUERY_WITH_PLUGIN_INFO) @DefaultValue("false") final Boolean withPluginInfo,
+                                @javax.ws.rs.core.Context final HttpServletRequest request) throws PaymentApiException, InvoiceApiException {
         final TenantContext tenantContext = context.createContext(request);
 
-        final List<DirectPayment> payments = null; // STEPH paymentApi.getInvoicePayments(UUID.fromString(invoiceId), tenantContext);
+        final Invoice invoice = invoiceApi.getInvoice(UUID.fromString(invoiceId), tenantContext);
+        final List<DirectPayment> payments = new ArrayList<DirectPayment>();
+        for (InvoicePayment cur : invoice.getPayments()) {
+            final DirectPayment payment = paymentApi.getPayment(cur.getId(), withPluginInfo, ImmutableList.<PluginProperty>of(), tenantContext);
+            payments.add(payment);
+        }
         final List<PaymentJson> result = new ArrayList<PaymentJson>(payments.size());
-        if (payments.size() == 0) {
+        if (payments.isEmpty()) {
             return Response.status(Status.OK).entity(result).build();
         }
 
@@ -415,14 +419,8 @@ public class InvoiceResource extends JaxRsResourceBase {
         final CallContext callContext = context.createContext(createdBy, reason, comment, request);
 
         final Account account = accountUserApi.getAccountById(UUID.fromString(payment.getAccountId()), callContext);
-
         final UUID invoiceId = UUID.fromString(payment.getInvoiceId());
-        if (externalPayment) {
-            // STEPH paymentApi.createExternalPayment(account, invoiceId, payment.getAmount(), callContext);
-        } else {
-            // STEPH  paymentApi.createPayment(account, invoiceId, payment.getAmount(), pluginProperties, callContext);
-        }
-
+        createPurchaseForInvoice(account, invoiceId, payment.getPurchaseAmount(), externalPayment, callContext);
         return uriBuilder.buildResponse(uriInfo, InvoiceResource.class, "getPayments", payment.getInvoiceId());
     }
 
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxRsResourceBase.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxRsResourceBase.java
index e102b77..cc2afcc 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxRsResourceBase.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxRsResourceBase.java
@@ -21,8 +21,10 @@ package org.killbill.billing.jaxrs.resources;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
+import java.math.BigDecimal;
 import java.net.URI;
 import java.net.URLDecoder;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.LinkedList;
@@ -47,12 +49,19 @@ import org.killbill.billing.ObjectType;
 import org.killbill.billing.account.api.Account;
 import org.killbill.billing.account.api.AccountApiException;
 import org.killbill.billing.account.api.AccountUserApi;
+import org.killbill.billing.invoice.api.Invoice;
 import org.killbill.billing.jaxrs.json.CustomFieldJson;
 import org.killbill.billing.jaxrs.json.JsonBase;
 import org.killbill.billing.jaxrs.json.TagJson;
 import org.killbill.billing.jaxrs.util.Context;
 import org.killbill.billing.jaxrs.util.JaxrsUriBuilder;
+import org.killbill.billing.payment.api.DirectPayment;
+import org.killbill.billing.payment.api.DirectPaymentApi;
+import org.killbill.billing.payment.api.DirectPaymentTransaction;
+import org.killbill.billing.payment.api.PaymentApiException;
+import org.killbill.billing.payment.api.PaymentOptions;
 import org.killbill.billing.payment.api.PluginProperty;
+import org.killbill.billing.payment.api.TransactionType;
 import org.killbill.billing.util.api.AuditUserApi;
 import org.killbill.billing.util.api.CustomFieldApiException;
 import org.killbill.billing.util.api.CustomFieldUserApi;
@@ -93,6 +102,7 @@ public abstract class JaxRsResourceBase implements JaxrsResource {
     protected final CustomFieldUserApi customFieldUserApi;
     protected final AuditUserApi auditUserApi;
     protected final AccountUserApi accountUserApi;
+    protected final DirectPaymentApi paymentApi;
     protected final Context context;
     protected final Clock clock;
 
@@ -104,6 +114,7 @@ public abstract class JaxRsResourceBase implements JaxrsResource {
                              final CustomFieldUserApi customFieldUserApi,
                              final AuditUserApi auditUserApi,
                              final AccountUserApi accountUserApi,
+                             final DirectPaymentApi paymentApi,
                              final Clock clock,
                              final Context context) {
         this.uriBuilder = uriBuilder;
@@ -111,6 +122,7 @@ public abstract class JaxRsResourceBase implements JaxrsResource {
         this.customFieldUserApi = customFieldUserApi;
         this.auditUserApi = auditUserApi;
         this.accountUserApi = accountUserApi;
+        this.paymentApi = paymentApi;
         this.clock = clock;
         this.context = context;
     }
@@ -314,7 +326,7 @@ public abstract class JaxRsResourceBase implements JaxrsResource {
         return null;
     }
 
-    protected Iterable<PluginProperty> extractPluginProperties(@Nullable final Iterable<String> pluginProperties) {
+    protected Iterable<PluginProperty> extractPluginProperties(@Nullable final Iterable<String> pluginProperties, PluginProperty...additionalProperties) {
         final Collection<PluginProperty> properties = new LinkedList<PluginProperty>();
         if (pluginProperties == null) {
             return properties;
@@ -326,6 +338,51 @@ public abstract class JaxRsResourceBase implements JaxrsResource {
             final String value = property.size() == 1 ? null : Joiner.on("=").join(property.subList(1, property.size()));
             properties.add(new PluginProperty(key, value, false));
         }
+        for (PluginProperty  cur : additionalProperties) {
+            properties.add(cur);
+        }
         return properties;
     }
+
+    protected void createPurchaseForInvoice(final Account account, final UUID invoiceId, final BigDecimal amountToPay, final Boolean externalPayment, final CallContext callContext) throws PaymentApiException {
+
+        final List<PluginProperty> properties = new ArrayList<PluginProperty>();
+        final String paymentExternalKey = UUID.randomUUID().toString();
+        final String transactionExternalKey = UUID.randomUUID().toString();
+        final PluginProperty invoiceProperty = new PluginProperty("IPCD_INVOICE_ID" /* InvoicePaymentControlPluginApi.PROP_IPCD_INVOICE_ID (contract with plugin)  */,
+                                                                  invoiceId.toString(), false);
+        properties.add(invoiceProperty);
+
+        paymentApi.createPurchaseWithPaymentControl(account, account.getPaymentMethodId(), null, amountToPay, account.getCurrency(), paymentExternalKey, transactionExternalKey,
+                                                    properties, createInvoicePaymentControlPluginApiPaymentOptions(externalPayment), callContext);
+    }
+
+
+    protected PaymentOptions createInvoicePaymentControlPluginApiPaymentOptions(final boolean isExternalPayment) {
+        return new PaymentOptions() {
+            @Override
+            public boolean isExternalPayment() {
+                return isExternalPayment;
+            }
+            @Override
+            public String getPaymentControlPluginName() {
+                /* Contract with plugin */
+                return "__INVOICE_PAYMENT_CONTROL_PLUGIN__";
+            }
+        };
+    }
+
+    protected Iterable<DirectPaymentTransaction> getDirectPaymentTransactions(final List<DirectPayment> payments, final TransactionType transactionType) {
+        return Iterables.concat(Iterables.transform(payments, new Function<DirectPayment, Iterable<DirectPaymentTransaction>>() {
+            @Override
+            public Iterable<DirectPaymentTransaction> apply(final DirectPayment input) {
+                return Iterables.filter(input.getTransactions(), new Predicate<DirectPaymentTransaction>() {
+                    @Override
+                    public boolean apply(final DirectPaymentTransaction input) {
+                        return input.getTransactionType() == transactionType;
+                    }
+                });
+            }
+        }));
+    }
 }
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentGatewayResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentGatewayResource.java
index 1e0d6df..12ab453 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentGatewayResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentGatewayResource.java
@@ -41,6 +41,7 @@ import org.killbill.billing.jaxrs.json.HostedPaymentPageFormDescriptorJson;
 import org.killbill.billing.jaxrs.json.PluginPropertyJson;
 import org.killbill.billing.jaxrs.util.Context;
 import org.killbill.billing.jaxrs.util.JaxrsUriBuilder;
+import org.killbill.billing.payment.api.DirectPaymentApi;
 import org.killbill.billing.payment.api.PaymentApiException;
 import org.killbill.billing.payment.api.PaymentGatewayApi;
 import org.killbill.billing.payment.api.PluginProperty;
@@ -72,9 +73,10 @@ public class PaymentGatewayResource extends JaxRsResourceBase {
                                   final AuditUserApi auditUserApi,
                                   final AccountUserApi accountUserApi,
                                   final PaymentGatewayApi paymentGatewayApi,
+                                  final DirectPaymentApi paymentApi,
                                   final Clock clock,
                                   final Context context) {
-        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, clock, context);
+        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, paymentApi, clock, context);
         this.paymentGatewayApi = paymentGatewayApi;
     }
 
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentMethodResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentMethodResource.java
index aad539a..3effcae 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentMethodResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentMethodResource.java
@@ -69,19 +69,16 @@ import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 @Path(JaxrsResource.PAYMENT_METHODS_PATH)
 public class PaymentMethodResource extends JaxRsResourceBase {
 
-    private final DirectPaymentApi paymentApi;
-
     @Inject
-    public PaymentMethodResource(final DirectPaymentApi paymentApi,
-                                 final AccountUserApi accountUserApi,
+    public PaymentMethodResource(final AccountUserApi accountUserApi,
                                  final JaxrsUriBuilder uriBuilder,
                                  final TagUserApi tagUserApi,
                                  final CustomFieldUserApi customFieldUserApi,
                                  final AuditUserApi auditUserApi,
+                                 final DirectPaymentApi paymentApi,
                                  final Clock clock,
                                  final Context context) {
-        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, clock, context);
-        this.paymentApi = paymentApi;
+        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, paymentApi, clock, context);
     }
 
     @GET
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PluginResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PluginResource.java
index 17a30f5..169be7e 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PluginResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PluginResource.java
@@ -45,6 +45,7 @@ import javax.ws.rs.Path;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
 
+import org.killbill.billing.payment.api.DirectPaymentApi;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -78,9 +79,10 @@ public class PluginResource extends JaxRsResourceBase {
                           final CustomFieldUserApi customFieldUserApi,
                           final AuditUserApi auditUserApi,
                           final AccountUserApi accountUserApi,
+                          final DirectPaymentApi paymentApi,
                           final Clock clock,
                           final Context context) {
-        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, clock, context);
+        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, paymentApi, clock, context);
         this.osgiServlet = osgiServlet;
     }
 
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SecurityResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SecurityResource.java
index 94e561f..520e3aa 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SecurityResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SecurityResource.java
@@ -31,6 +31,7 @@ import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.subject.Subject;
 
 import org.killbill.billing.account.api.AccountUserApi;
+import org.killbill.billing.payment.api.DirectPaymentApi;
 import org.killbill.clock.Clock;
 import org.killbill.billing.jaxrs.json.SubjectJson;
 import org.killbill.billing.jaxrs.util.Context;
@@ -61,9 +62,10 @@ public class SecurityResource extends JaxRsResourceBase {
                             final CustomFieldUserApi customFieldUserApi,
                             final AuditUserApi auditUserApi,
                             final AccountUserApi accountUserApi,
+                            final DirectPaymentApi paymentApi,
                             final Clock clock,
                             final Context context) {
-        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, clock, context);
+        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, paymentApi, clock, context);
         this.securityApi = securityApi;
     }
 
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java
index ffe4e1f..372be81 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java
@@ -38,6 +38,7 @@ import javax.ws.rs.core.Response.Status;
 import javax.ws.rs.core.UriInfo;
 
 import org.joda.time.LocalDate;
+import org.killbill.billing.payment.api.DirectPaymentApi;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -100,9 +101,10 @@ public class SubscriptionResource extends JaxRsResourceBase {
                                 final EntitlementApi entitlementApi,
                                 final SubscriptionApi subscriptionApi,
                                 final AccountUserApi accountUserApi,
+                                final DirectPaymentApi paymentApi,
                                 final Clock clock,
                                 final Context context) {
-        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, clock, context);
+        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, paymentApi, clock, context);
         this.killbillHandler = killbillHandler;
         this.entitlementApi = entitlementApi;
         this.subscriptionApi = subscriptionApi;
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TagDefinitionResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TagDefinitionResource.java
index 4c51f68..b3956e8 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TagDefinitionResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TagDefinitionResource.java
@@ -38,6 +38,7 @@ import javax.ws.rs.core.UriInfo;
 
 import org.killbill.billing.ObjectType;
 import org.killbill.billing.account.api.AccountUserApi;
+import org.killbill.billing.payment.api.DirectPaymentApi;
 import org.killbill.clock.Clock;
 import org.killbill.billing.jaxrs.json.TagDefinitionJson;
 import org.killbill.billing.jaxrs.util.Context;
@@ -66,9 +67,10 @@ public class TagDefinitionResource extends JaxRsResourceBase {
                                  final CustomFieldUserApi customFieldUserApi,
                                  final AuditUserApi auditUserApi,
                                  final AccountUserApi accountUserApi,
+                                 final DirectPaymentApi paymentApi,
                                  final Clock clock,
                                  final Context context) {
-        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, clock, context);
+        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, paymentApi, clock, context);
     }
 
     @GET
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TagResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TagResource.java
index b07d467..b480c6d 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TagResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TagResource.java
@@ -33,6 +33,7 @@ import javax.ws.rs.core.Response;
 
 import org.killbill.billing.ObjectType;
 import org.killbill.billing.account.api.AccountUserApi;
+import org.killbill.billing.payment.api.DirectPaymentApi;
 import org.killbill.clock.Clock;
 import org.killbill.billing.jaxrs.json.TagJson;
 import org.killbill.billing.jaxrs.util.Context;
@@ -64,9 +65,10 @@ public class TagResource extends JaxRsResourceBase {
                        final CustomFieldUserApi customFieldUserApi,
                        final AuditUserApi auditUserApi,
                        final AccountUserApi accountUserApi,
+                       final DirectPaymentApi paymentApi,
                        final Clock clock,
                        final Context context) {
-        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, clock, context);
+        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, paymentApi, clock, context);
     }
 
     @GET
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TenantResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TenantResource.java
index e20cfce..d7d0791 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TenantResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TenantResource.java
@@ -37,6 +37,7 @@ import javax.ws.rs.core.UriInfo;
 
 import org.killbill.billing.ObjectType;
 import org.killbill.billing.account.api.AccountUserApi;
+import org.killbill.billing.payment.api.DirectPaymentApi;
 import org.killbill.clock.Clock;
 import org.killbill.billing.jaxrs.json.TenantJson;
 import org.killbill.billing.jaxrs.json.TenantKeyJson;
@@ -71,9 +72,10 @@ public class TenantResource extends JaxRsResourceBase {
                           final CustomFieldUserApi customFieldUserApi,
                           final AuditUserApi auditUserApi,
                           final AccountUserApi accountUserApi,
+                          final DirectPaymentApi paymentApi,
                           final Clock clock,
                           final Context context) {
-        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, clock, context);
+        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, paymentApi, clock, context);
         this.tenantApi = tenantApi;
     }
 
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TestResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TestResource.java
index d00a32c..58f2214 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TestResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TestResource.java
@@ -38,6 +38,7 @@ import org.killbill.billing.ObjectType;
 import org.killbill.billing.account.api.AccountUserApi;
 import org.killbill.billing.jaxrs.util.Context;
 import org.killbill.billing.jaxrs.util.JaxrsUriBuilder;
+import org.killbill.billing.payment.api.DirectPaymentApi;
 import org.killbill.billing.util.api.AuditUserApi;
 import org.killbill.billing.util.api.CustomFieldUserApi;
 import org.killbill.billing.util.api.RecordIdApi;
@@ -78,9 +79,9 @@ public class TestResource extends JaxRsResourceBase {
     @Inject
     public TestResource(final JaxrsUriBuilder uriBuilder, final TagUserApi tagUserApi, final CustomFieldUserApi customFieldUserApi,
                         final AuditUserApi auditUserApi, final AccountUserApi accountUserApi, final RecordIdApi recordIdApi,
-                        final NotificationQueueService notificationQueueService,
+                        final NotificationQueueService notificationQueueService, final DirectPaymentApi paymentApi,
                         final Clock clock, final Context context) {
-        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, clock, context);
+        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, paymentApi, clock, context);
         this.notificationQueueService = notificationQueueService;
         this.recordIdApi = recordIdApi;
     }
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/UsageResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/UsageResource.java
index 1d8d781..746d481 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/UsageResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/UsageResource.java
@@ -37,6 +37,7 @@ import org.killbill.billing.account.api.AccountUserApi;
 import org.killbill.billing.jaxrs.json.UsageJson;
 import org.killbill.billing.jaxrs.util.Context;
 import org.killbill.billing.jaxrs.util.JaxrsUriBuilder;
+import org.killbill.billing.payment.api.DirectPaymentApi;
 import org.killbill.billing.usage.api.RolledUpUsage;
 import org.killbill.billing.usage.api.UsageUserApi;
 import org.killbill.billing.util.api.AuditUserApi;
@@ -62,9 +63,10 @@ public class UsageResource extends JaxRsResourceBase {
                          final AuditUserApi auditUserApi,
                          final AccountUserApi accountUserApi,
                          final UsageUserApi usageUserApi,
+                         final DirectPaymentApi paymentApi,
                          final Clock clock,
                          final Context context) {
-        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, clock, context);
+        super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, paymentApi, clock, context);
         this.usageUserApi = usageUserApi;
     }
 
diff --git a/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestBundleTimelineJson.java b/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestBundleTimelineJson.java
index ad73b3a..5250ee6 100644
--- a/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestBundleTimelineJson.java
+++ b/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestBundleTimelineJson.java
@@ -28,6 +28,7 @@ import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.jaxrs.JaxrsTestSuiteNoDB;
 
 import com.google.common.collect.ImmutableList;
+import com.sun.org.apache.xpath.internal.operations.Bool;
 
 public class TestBundleTimelineJson extends JaxrsTestSuiteNoDB {
 
@@ -85,8 +86,11 @@ public class TestBundleTimelineJson extends JaxrsTestSuiteNoDB {
         final UUID paymentId = UUID.randomUUID();
         final Integer paymentNumber = 17;
         final UUID paymentMethodId = UUID.randomUUID();
-        final BigDecimal paidAmount = BigDecimal.TEN;
-        final BigDecimal amount = BigDecimal.ZERO;
+        final BigDecimal authAmount = BigDecimal.TEN;
+        final BigDecimal captureAmount = BigDecimal.ZERO;
+        final BigDecimal purchasedAMount = BigDecimal.ZERO;
+        final BigDecimal creditAmount = BigDecimal.ZERO;
+        final BigDecimal refundAmount = BigDecimal.ZERO;
         final DateTime paymentRequestedDate = clock.getUTCNow();
         final DateTime paymentEffectiveDate = clock.getUTCNow();
         final Integer retryCount = Integer.MAX_VALUE;
@@ -94,7 +98,7 @@ public class TestBundleTimelineJson extends JaxrsTestSuiteNoDB {
         final String status = UUID.randomUUID().toString();
         final String gatewayErrorCode = "OK";
         final String gatewayErrorMsg = "Excellent...";
-        return new PaymentJson(amount, paidAmount, accountId.toString(), invoiceId.toString(), paymentId.toString(), paymentNumber.toString(),
+        return new PaymentJson(authAmount, captureAmount, purchasedAMount, creditAmount, refundAmount, Boolean.FALSE, accountId.toString(), invoiceId.toString(), paymentId.toString(), paymentNumber.toString(),
                                      paymentMethodId.toString(), paymentRequestedDate, paymentEffectiveDate, retryCount, currency, status,
                                      gatewayErrorCode, gatewayErrorMsg, null, null, null, null);
     }
diff --git a/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestChargebackJson.java b/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestChargebackJson.java
index ee430ca..979e216 100644
--- a/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestChargebackJson.java
+++ b/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestChargebackJson.java
@@ -37,13 +37,15 @@ public class TestChargebackJson extends JaxrsTestSuiteNoDB {
         final DateTime effectiveDate = new DateTime(DateTimeZone.UTC);
         final BigDecimal chargebackAmount = BigDecimal.TEN;
         final String chargebackId = UUID.randomUUID().toString();
+        final String chargedBackTransactionId = UUID.randomUUID().toString();
         final String accountId = UUID.randomUUID().toString();
         final String paymentId = UUID.randomUUID().toString();
         final String currency = "USD";
         final List<AuditLogJson> auditLogs = createAuditLogsJson(clock.getUTCNow());
-        final ChargebackJson chargebackJson = new ChargebackJson(chargebackId, accountId, requestedDate, effectiveDate, chargebackAmount,
+        final ChargebackJson chargebackJson = new ChargebackJson(chargebackId, accountId, chargedBackTransactionId, requestedDate, effectiveDate, chargebackAmount,
                                                                    paymentId, currency, auditLogs);
         Assert.assertEquals(chargebackJson.getChargebackId(), chargebackId);
+        Assert.assertEquals(chargebackJson.getChargedBackTransactionId(), chargedBackTransactionId);
         Assert.assertEquals(chargebackJson.getRequestedDate(), requestedDate);
         Assert.assertEquals(chargebackJson.getEffectiveDate(), effectiveDate);
         Assert.assertEquals(chargebackJson.getAmount(), chargebackAmount);
diff --git a/jaxrs/src/test/java/org/killbill/billing/jaxrs/TestDateConversion.java b/jaxrs/src/test/java/org/killbill/billing/jaxrs/TestDateConversion.java
index 62e9ef0..320ac1c 100644
--- a/jaxrs/src/test/java/org/killbill/billing/jaxrs/TestDateConversion.java
+++ b/jaxrs/src/test/java/org/killbill/billing/jaxrs/TestDateConversion.java
@@ -38,7 +38,7 @@ public class TestDateConversion extends JaxRsResourceBase {
     final DateTimeZone dateTimeZone = DateTimeZone.forOffsetHours(-8);
 
     public TestDateConversion() throws AccountApiException {
-        super(null, null, null, null, Mockito.mock(AccountUserApi.class), new ClockMock(), null);
+        super(null, null, null, null, Mockito.mock(AccountUserApi.class), null, new ClockMock(),  null);
         final Account account = Mockito.mock(Account.class);
         Mockito.when(account.getTimeZone()).thenReturn(dateTimeZone);
         Mockito.when(accountUserApi.getAccountById(accountId, null)).thenReturn(account);
diff --git a/payment/src/main/java/org/killbill/billing/payment/api/DefaultDirectPaymentApi.java b/payment/src/main/java/org/killbill/billing/payment/api/DefaultDirectPaymentApi.java
index 949decd..800a79d 100644
--- a/payment/src/main/java/org/killbill/billing/payment/api/DefaultDirectPaymentApi.java
+++ b/payment/src/main/java/org/killbill/billing/payment/api/DefaultDirectPaymentApi.java
@@ -224,7 +224,7 @@ public class DefaultDirectPaymentApi implements DirectPaymentApi {
     }
 
     @Override
-    public void notifyChargeback(final Account account, final UUID directPaymentTransactionId, final String chargebackTransactionExternalKey, final BigDecimal amount, final Currency currency, final CallContext callContext) throws PaymentApiException {
+    public DirectPayment notifyChargeback(final Account account, final UUID directPaymentTransactionId, final String chargebackTransactionExternalKey, final BigDecimal amount, final Currency currency, final CallContext callContext) throws PaymentApiException {
 
         checkNullParameter(account, "account");
         checkNullParameter(amount, "amount");
@@ -234,7 +234,7 @@ public class DefaultDirectPaymentApi implements DirectPaymentApi {
         checkPositiveAmount(amount);
 
         final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-        directPaymentProcessor.notifyPaymentPaymentOfChargeback(account, directPaymentTransactionId, chargebackTransactionExternalKey, amount, currency, callContext, internalCallContext);
+        return directPaymentProcessor.notifyPaymentPaymentOfChargeback(account, directPaymentTransactionId, chargebackTransactionExternalKey, amount, currency, callContext, internalCallContext);
     }
 
     @Override
diff --git a/payment/src/main/java/org/killbill/billing/payment/control/InvoicePaymentControlPluginApi.java b/payment/src/main/java/org/killbill/billing/payment/control/InvoicePaymentControlPluginApi.java
index 253c810..76784c3 100644
--- a/payment/src/main/java/org/killbill/billing/payment/control/InvoicePaymentControlPluginApi.java
+++ b/payment/src/main/java/org/killbill/billing/payment/control/InvoicePaymentControlPluginApi.java
@@ -74,12 +74,13 @@ import com.google.common.collect.Iterables;
 
 public final class InvoicePaymentControlPluginApi implements PaymentControlPluginApi {
 
-    public final static String PLUGIN_NAME = "__INVOICE_PAYMENT_CONTROL_PLUGIN__";
     public final static String CREATED_BY = "InvoicePaymentControlPluginApi";
 
-    public static final String PROP_IPCD_INVOICE_ID = "INVOICE_ID";
-    public static final String PROP_IPCD_REFUND_IDS_WITH_AMOUNT_KEY = "REF_IDS_AMOUNTS";
-    public static final String PROP_IPCD_REFUND_WITH_ADJUSTMENTS = "REFUND_WITH_ADJUSTMENTS";
+    /* Don't change value String for properties as they are referenced from jaxrs without the constants which are not accessible */
+    public final static String PLUGIN_NAME = "__INVOICE_PAYMENT_CONTROL_PLUGIN__";
+    public static final String PROP_IPCD_INVOICE_ID = "IPCD_INVOICE_ID";
+    public static final String PROP_IPCD_REFUND_IDS_WITH_AMOUNT_KEY = "IPCD_REF_IDS_AMOUNTS";
+    public static final String PROP_IPCD_REFUND_WITH_ADJUSTMENTS = "IPCD_REFUND_WITH_ADJUSTMENTS";
 
     private final PaymentConfig paymentConfig;
     private final InvoiceInternalApi invoiceApi;
diff --git a/payment/src/main/java/org/killbill/billing/payment/core/DirectPaymentProcessor.java b/payment/src/main/java/org/killbill/billing/payment/core/DirectPaymentProcessor.java
index 1043979..042ff7a 100644
--- a/payment/src/main/java/org/killbill/billing/payment/core/DirectPaymentProcessor.java
+++ b/payment/src/main/java/org/killbill/billing/payment/core/DirectPaymentProcessor.java
@@ -274,7 +274,7 @@ public class DirectPaymentProcessor extends ProcessorBase {
                                                                  transactionModelDao.getGatewayErrorCode(), transactionModelDao.getGatewayErrorMsg(), internalCallContext);
     }
 
-    public void notifyPaymentPaymentOfChargeback(final Account account, final UUID transactionId, final String chargebackTransactionExternalKey, final BigDecimal amount, final Currency currency, final CallContext callContext, final InternalCallContext internalCallContext) throws PaymentApiException {
+    public DirectPayment notifyPaymentPaymentOfChargeback(final Account account, final UUID transactionId, final String chargebackTransactionExternalKey, final BigDecimal amount, final Currency currency, final CallContext callContext, final InternalCallContext internalCallContext) throws PaymentApiException {
 
         validateUniqueTransactionExternalKey(chargebackTransactionExternalKey, internalCallContext);
 
@@ -293,6 +293,7 @@ public class DirectPaymentProcessor extends ProcessorBase {
                                                                  chargebackTransaction.getAmount(), chargebackTransaction.getCurrency(),
                                                                  chargebackTransaction.getGatewayErrorCode(), chargebackTransaction.getGatewayErrorMsg(), internalCallContext);
 
+        return getPayment(transactionModelDao.getPaymentId(), false, ImmutableList.<PluginProperty>of(), callContext, internalCallContext);
     }
 
     public DirectPayment getPayment(final UUID directPaymentId, final boolean withPluginInfo, final Iterable<PluginProperty> properties, final TenantContext tenantContext, final InternalTenantContext internalTenantContext) throws PaymentApiException {