killbill-memoizeit

Ongoing work for payment/invoicePayment APIs * Remove RefundJson

6/29/2014 9:02:44 PM

Changes

invoice/src/test/java/org/killbill/billing/invoice/tests/TestChargeBacks.java 151(+0 -151)

jaxrs/src/main/java/org/killbill/billing/jaxrs/json/RefundJson.java 252(+0 -252)

jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestRefundJson.java 88(+0 -88)

Details

diff --git a/api/src/main/java/org/killbill/billing/invoice/api/InvoiceInternalApi.java b/api/src/main/java/org/killbill/billing/invoice/api/InvoiceInternalApi.java
index 96d9248..729304b 100644
--- a/api/src/main/java/org/killbill/billing/invoice/api/InvoiceInternalApi.java
+++ b/api/src/main/java/org/killbill/billing/invoice/api/InvoiceInternalApi.java
@@ -63,6 +63,9 @@ public interface InvoiceInternalApi {
     public InvoicePayment createRefund(UUID paymentId, BigDecimal amount, boolean isInvoiceAdjusted, final Map<UUID, BigDecimal> invoiceItemIdsWithAmounts,
                                        String transactionExternalKey, InternalCallContext context) throws InvoiceApiException;
 
+
+    public InvoicePayment createChargeback(UUID paymentId, BigDecimal amount, Currency currency, InternalCallContext context) throws InvoiceApiException;
+
     /**
      * Rebalance CBA for account which have credit and unpaid invoices
      *
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java
index 630681e..8089022 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java
@@ -521,11 +521,14 @@ public class TestIntegrationBase extends BeatrixTestSuiteWithEmbeddedDB {
         doCallAndCheckForCompletion(new Function<Void, Void>() {
             @Override
             public Void apply(@Nullable final Void input) {
+                /*
                 try {
-                    invoicePaymentApi.createChargeback(payment.getId(), payment.getAmount(), callContext);
+                    // STEPH to be fixed with chargeback code
+                    //invoicePaymentApi.createChargeback(payment.getId(), payment.getAmount(), callContext);
                 } catch (final InvoiceApiException e) {
                     fail(e.toString());
                 }
+                */
                 return null;
             }
         }, events);
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 910a525..fc0cbb8 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
@@ -16,27 +16,19 @@
 
 package org.killbill.billing.invoice.api.invoice;
 
-import java.math.BigDecimal;
 import java.util.List;
 import java.util.UUID;
 
 import org.killbill.billing.ObjectType;
-import org.killbill.billing.invoice.api.Invoice;
-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.invoice.api.InvoicePaymentType;
 import org.killbill.billing.invoice.dao.InvoiceDao;
-import org.killbill.billing.invoice.dao.InvoiceModelDao;
 import org.killbill.billing.invoice.dao.InvoicePaymentModelDao;
-import org.killbill.billing.invoice.model.DefaultInvoice;
 import org.killbill.billing.invoice.model.DefaultInvoicePayment;
-import org.killbill.billing.util.callcontext.CallContext;
 import org.killbill.billing.util.callcontext.InternalCallContextFactory;
 import org.killbill.billing.util.callcontext.TenantContext;
 
 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.inject.Inject;
@@ -53,22 +45,6 @@ public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
     }
 
     @Override
-    public List<Invoice> getAllInvoicesByAccount(final UUID accountId, final TenantContext context) {
-        return ImmutableList.<Invoice>copyOf(Collections2.transform(dao.getAllInvoicesByAccount(internalCallContextFactory.createInternalTenantContext(accountId, context)),
-                                                                    new Function<InvoiceModelDao, Invoice>() {
-                                                                        @Override
-                                                                        public Invoice apply(final InvoiceModelDao input) {
-                                                                            return new DefaultInvoice(input);
-                                                                        }
-                                                                    }));
-    }
-
-    @Override
-    public Invoice getInvoice(final UUID invoiceId, final TenantContext context) throws InvoiceApiException {
-        return new DefaultInvoice(dao.getById(invoiceId, internalCallContextFactory.createInternalTenantContext(invoiceId, ObjectType.INVOICE, context)));
-    }
-
-    @Override
     public List<InvoicePayment> getInvoicePayments(final UUID paymentId, final TenantContext context) {
         return ImmutableList.<InvoicePayment>copyOf(Collections2.transform(dao.getInvoicePayments(paymentId, internalCallContextFactory.createInternalTenantContext(paymentId, ObjectType.PAYMENT, context)),
                                                                            new Function<InvoicePaymentModelDao, InvoicePayment>() {
@@ -76,7 +52,8 @@ public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
                                                                                public InvoicePayment apply(final InvoicePaymentModelDao input) {
                                                                                    return new DefaultInvoicePayment(input);
                                                                                }
-                                                                           }));
+                                                                           }
+                                                                          ));
     }
 
     @Override
@@ -87,67 +64,7 @@ public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
                                                                                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) {
-            return null;
-        }
-        return Collections2.filter(invoicePayments, new Predicate<InvoicePayment>() {
-            @Override
-            public boolean apply(final InvoicePayment input) {
-                return input.getType() == InvoicePaymentType.ATTEMPT;
-            }
-        }).iterator().next();
-    }
-
-    @Override
-    public BigDecimal getRemainingAmountPaid(final UUID invoicePaymentId, final TenantContext context) {
-        return dao.getRemainingAmountPaid(invoicePaymentId, internalCallContextFactory.createInternalTenantContext(invoicePaymentId, ObjectType.INVOICE_PAYMENT, context));
-    }
-
-    @Override
-    public List<InvoicePayment> getChargebacksByAccountId(final UUID accountId, final TenantContext context) {
-        return ImmutableList.<InvoicePayment>copyOf(Collections2.transform(dao.getChargebacksByAccountId(accountId, internalCallContextFactory.createInternalTenantContext(accountId, context)),
-                                                                           new Function<InvoicePaymentModelDao, InvoicePayment>() {
-                                                                               @Override
-                                                                               public InvoicePayment apply(final InvoicePaymentModelDao input) {
-                                                                                   return new DefaultInvoicePayment(input);
-                                                                               }
-                                                                           }));
-    }
-
-    @Override
-    public List<InvoicePayment> getChargebacksByPaymentId(final UUID paymentId, final TenantContext context) {
-        return ImmutableList.<InvoicePayment>copyOf(Collections2.transform(dao.getChargebacksByPaymentId(paymentId, internalCallContextFactory.createInternalTenantContext(paymentId, ObjectType.PAYMENT, context)),
-                                                                           new Function<InvoicePaymentModelDao, InvoicePayment>() {
-                                                                               @Override
-                                                                               public InvoicePayment apply(final InvoicePaymentModelDao input) {
-                                                                                   return new DefaultInvoicePayment(input);
-                                                                               }
-                                                                           }));
-    }
-
-    @Override
-    public InvoicePayment getChargebackById(final UUID chargebackId, final TenantContext context) throws InvoiceApiException {
-        return new DefaultInvoicePayment(dao.getChargebackById(chargebackId, internalCallContextFactory.createInternalTenantContext(chargebackId, ObjectType.INVOICE_PAYMENT, context)));
-    }
-
-    @Override
-    public UUID getAccountIdFromInvoicePaymentId(final UUID invoicePaymentId, final TenantContext context) throws InvoiceApiException {
-        return dao.getAccountIdFromInvoicePaymentId(invoicePaymentId, internalCallContextFactory.createInternalTenantContext(invoicePaymentId, ObjectType.INVOICE_PAYMENT, context));
-    }
-
-    @Override
-    public InvoicePayment createChargeback(final UUID invoicePaymentId, final CallContext context) throws InvoiceApiException {
-        return createChargeback(invoicePaymentId, null, context);
-    }
-
-    @Override
-    public InvoicePayment createChargeback(final UUID invoicePaymentId, final BigDecimal amount, final CallContext context) throws InvoiceApiException {
-        return new DefaultInvoicePayment(dao.postChargeback(invoicePaymentId, amount, internalCallContextFactory.createInternalCallContext(invoicePaymentId, ObjectType.INVOICE_PAYMENT, context)));
+                                                                           }
+                                                                          ));
     }
 }
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java b/invoice/src/main/java/org/killbill/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java
index 98c329c..8b1aa7b 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/api/svcs/DefaultInvoiceInternalApi.java
@@ -141,6 +141,12 @@ public class DefaultInvoiceInternalApi implements InvoiceInternalApi {
     }
 
     @Override
+    public InvoicePayment createChargeback(final UUID paymentId, final BigDecimal amount, final Currency currency, final InternalCallContext context) throws InvoiceApiException {
+        // STEPH not implemented yet
+        return null;
+    }
+
+    @Override
     public void consumeExistingCBAOnAccountWithUnpaidInvoices(final UUID accountId, final InternalCallContext context) throws InvoiceApiException {
         dao.consumeExstingCBAOnAccountWithUnpaidInvoices(accountId, context);
     }
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/api/invoice/TestDefaultInvoicePaymentApi.java b/invoice/src/test/java/org/killbill/billing/invoice/api/invoice/TestDefaultInvoicePaymentApi.java
index cf642fe..197f811 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/api/invoice/TestDefaultInvoicePaymentApi.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/api/invoice/TestDefaultInvoicePaymentApi.java
@@ -17,20 +17,18 @@
 package org.killbill.billing.invoice.api.invoice;
 
 import java.math.BigDecimal;
-import java.math.RoundingMode;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
 import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.invoice.InvoiceTestSuiteWithEmbeddedDB;
 import org.killbill.billing.invoice.api.Invoice;
 import org.killbill.billing.invoice.api.InvoiceApiException;
 import org.killbill.billing.invoice.api.InvoicePayment;
 import org.killbill.billing.invoice.api.InvoicePaymentType;
+import org.testng.Assert;
+import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -112,7 +110,7 @@ public class TestDefaultInvoicePaymentApi extends InvoiceTestSuiteWithEmbeddedDB
         final InvoicePayment payment = createAndPersistPayment(invoiceInternalApi, clock, invoice.getId(), invoiceAmount, CURRENCY, internalCallContext);
 
         // Verify the initial invoice balance
-        final BigDecimal initialInvoiceBalance = invoicePaymentApi.getInvoice(invoice.getId(), callContext).getBalance();
+        final BigDecimal initialInvoiceBalance = invoiceInternalApi.getInvoiceById(invoice.getId(), internalCallContext).getBalance();
         Assert.assertEquals(initialInvoiceBalance.compareTo(BigDecimal.ZERO), 0);
 
         // Create a full refund with no adjustment
@@ -125,7 +123,7 @@ public class TestDefaultInvoicePaymentApi extends InvoiceTestSuiteWithEmbeddedDB
         Assert.assertEquals(refund.getType(), InvoicePaymentType.REFUND);
 
         // Verify the current invoice balance
-        final BigDecimal newInvoiceBalance = invoicePaymentApi.getInvoice(invoice.getId(), callContext).getBalance();
+        final BigDecimal newInvoiceBalance = invoiceInternalApi.getInvoiceById(invoice.getId(), internalCallContext).getBalance();
         Assert.assertEquals(newInvoiceBalance.compareTo(finalInvoiceAmount), 0);
     }
 }
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java b/invoice/src/test/java/org/killbill/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
index 066a99c..5784606 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
@@ -101,14 +101,6 @@ public class TestDefaultInvoiceMigrationApi extends InvoiceTestSuiteWithEmbedded
         Assert.assertEquals(unpaid.size(), 2);
     }
 
-    // Check migration invoice IS returned for payment api calls
-    @Test(groups = "slow")
-    public void testPaymentApi() {
-        final List<Invoice> allByAccount = invoicePaymentApi.getAllInvoicesByAccount(accountId, callContext);
-        Assert.assertEquals(allByAccount.size(), 2);
-        Assert.assertTrue(checkContains(allByAccount, regularInvoiceId));
-        Assert.assertTrue(checkContains(allByAccount, migrationInvoiceId));
-    }
 
     // ACCOUNT balance should reflect total of migration and non-migration invoices
     @Test(groups = "slow")
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 3e5098f..4b86b35 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
@@ -16,19 +16,11 @@
 
 package org.killbill.billing.invoice.api;
 
-import java.math.BigDecimal;
-import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.UUID;
 import java.util.concurrent.CopyOnWriteArrayList;
 
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
-
-import org.killbill.billing.catalog.api.Currency;
-import org.killbill.billing.invoice.model.DefaultInvoicePayment;
-import org.killbill.billing.util.callcontext.CallContext;
 import org.killbill.billing.util.callcontext.TenantContext;
 
 public class MockInvoicePaymentApi implements InvoicePaymentApi {
@@ -41,28 +33,6 @@ public class MockInvoicePaymentApi implements InvoicePaymentApi {
     }
 
     @Override
-    public List<Invoice> getAllInvoicesByAccount(final UUID accountId, final TenantContext context) {
-        final ArrayList<Invoice> result = new ArrayList<Invoice>();
-
-        for (final Invoice invoice : invoices) {
-            if (accountId.equals(invoice.getAccountId())) {
-                result.add(invoice);
-            }
-        }
-        return result;
-    }
-
-    @Override
-    public Invoice getInvoice(final UUID invoiceId, final TenantContext context) {
-        for (final Invoice invoice : invoices) {
-            if (invoiceId.equals(invoice.getId())) {
-                return invoice;
-            }
-        }
-        return null;
-    }
-
-    @Override
     public List<InvoicePayment> getInvoicePayments(final UUID paymentId, final TenantContext context) {
         final List<InvoicePayment> result = new LinkedList<InvoicePayment>();
         for (final InvoicePayment invoicePayment : invoicePayments) {
@@ -77,84 +47,4 @@ public class MockInvoicePaymentApi implements InvoicePaymentApi {
     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) {
-                return invoicePayment;
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public InvoicePayment createChargeback(final UUID invoicePaymentId, final BigDecimal amount, final CallContext context) throws InvoiceApiException {
-        InvoicePayment existingPayment = null;
-        for (final InvoicePayment payment : invoicePayments) {
-            if (payment.getId() == invoicePaymentId) {
-                existingPayment = payment;
-                break;
-            }
-        }
-
-        if (existingPayment != null) {
-            invoicePayments.add(new DefaultInvoicePayment(UUID.randomUUID(), InvoicePaymentType.CHARGED_BACK, null, null, DateTime.now(DateTimeZone.UTC), amount,
-                                                          existingPayment.getCurrency(), existingPayment.getProcessedCurrency(), null, existingPayment.getId()));
-        }
-
-        return existingPayment;
-    }
-
-    @Override
-    public InvoicePayment createChargeback(final UUID invoicePaymentId, final CallContext context) throws InvoiceApiException {
-        InvoicePayment existingPayment = null;
-        for (final InvoicePayment payment : invoicePayments) {
-            if (payment.getId() == invoicePaymentId) {
-                existingPayment = payment;
-            }
-        }
-
-        if (existingPayment != null) {
-            this.createChargeback(invoicePaymentId, existingPayment.getAmount(), context);
-        }
-
-        return existingPayment;
-    }
-
-    @Override
-    public BigDecimal getRemainingAmountPaid(final UUID invoicePaymentId, final TenantContext context) {
-        BigDecimal amount = BigDecimal.ZERO;
-        for (final InvoicePayment payment : invoicePayments) {
-            if (payment.getId().equals(invoicePaymentId)) {
-                amount = amount.add(payment.getAmount());
-            }
-
-            if (payment.getLinkedInvoicePaymentId().equals(invoicePaymentId)) {
-                amount = amount.add(payment.getAmount());
-            }
-        }
-
-        return amount;
-    }
-
-    @Override
-    public List<InvoicePayment> getChargebacksByAccountId(final UUID accountId, final TenantContext context) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public UUID getAccountIdFromInvoicePaymentId(final UUID uuid, final TenantContext context) throws InvoiceApiException {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public List<InvoicePayment> getChargebacksByPaymentId(final UUID paymentId, final TenantContext context) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public InvoicePayment getChargebackById(final UUID chargebackId, final TenantContext context) {
-        throw new UnsupportedOperationException();
-    }
 }
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/DirectPaymentJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/DirectPaymentJson.java
index 47a0888..c76e6bf 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/DirectPaymentJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/DirectPaymentJson.java
@@ -45,7 +45,7 @@ public class DirectPaymentJson extends JsonBase {
     private final BigDecimal creditedAmount;
     private final String currency;
     private final String paymentMethodId;
-    private final List<DirectTransactionJson> transactions;
+    private final List<? extends DirectTransactionJson> transactions;
 
     @JsonCreator
     public DirectPaymentJson(@JsonProperty("accountId") final String accountId,
@@ -59,7 +59,7 @@ public class DirectPaymentJson extends JsonBase {
                              @JsonProperty("creditedAmount") final BigDecimal creditedAmount,
                              @JsonProperty("currency") final String currency,
                              @JsonProperty("paymentMethodId") final String paymentMethodId,
-                             @JsonProperty("transactions") final List<DirectTransactionJson> transactions,
+                             @JsonProperty("transactions") final List<? extends DirectTransactionJson> transactions,
                              @JsonProperty("auditLogs") @Nullable final List<AuditLogJson> auditLogs) {
         super(auditLogs);
         this.accountId = accountId;
@@ -98,7 +98,7 @@ public class DirectPaymentJson extends JsonBase {
                                                             @Override
                                                             public DirectTransactionJson apply(final DirectPaymentTransaction directPaymentTransaction) {
                                                                 final List<AuditLog> auditLogsForDirectPaymentTransaction = accountAuditLogs == null ? null : accountAuditLogs.getAuditLogsForPaymentTransaction(directPaymentTransaction.getId());
-                                                                return new DirectTransactionJson(directPaymentTransaction, auditLogsForDirectPaymentTransaction);
+                                                                return new DirectTransactionJson(directPaymentTransaction, directPaymentExternalKey, auditLogsForDirectPaymentTransaction);
                                                             }
                                                         }
                                                        ));
@@ -148,7 +148,7 @@ public class DirectPaymentJson extends JsonBase {
         return paymentMethodId;
     }
 
-    public List<DirectTransactionJson> getTransactions() {
+    public List<? extends DirectTransactionJson> getTransactions() {
         return transactions;
     }
 
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/DirectTransactionJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/DirectTransactionJson.java
index 18c5ff3..4c4e777 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/DirectTransactionJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/DirectTransactionJson.java
@@ -33,6 +33,7 @@ public class DirectTransactionJson extends JsonBase {
     private final String transactionId;
     private final String transactionExternalKey;
     private final String paymentId;
+    private final String paymentExternalKey;
     private final String transactionType;
     private final DateTime effectiveDate;
     private final String status;
@@ -49,6 +50,7 @@ public class DirectTransactionJson extends JsonBase {
     public DirectTransactionJson(@JsonProperty("transactionId") final String transactionId,
                                  @JsonProperty("transactionExternalKey") final String transactionExternalKey,
                                  @JsonProperty("paymentId") final String directPaymentId,
+                                 @JsonProperty("paymentExternalKey") final String paymentExternalKey,
                                  @JsonProperty("transactionType") final String transactionType,
                                  @JsonProperty("amount") final BigDecimal amount,
                                  @JsonProperty("currency") final String currency,
@@ -64,6 +66,7 @@ public class DirectTransactionJson extends JsonBase {
         this.transactionId = transactionId;
         this.transactionExternalKey = transactionExternalKey;
         this.paymentId = directPaymentId;
+        this.paymentExternalKey = paymentExternalKey;
         this.transactionType = transactionType;
         this.effectiveDate = effectiveDate;
         this.status = status;
@@ -76,10 +79,11 @@ public class DirectTransactionJson extends JsonBase {
         this.properties = properties;
     }
 
-    public DirectTransactionJson(final DirectPaymentTransaction dpt, @Nullable final List<AuditLog> directTransactionLogs) {
+    public DirectTransactionJson(final DirectPaymentTransaction dpt, final String paymentExternalKey, @Nullable final List<AuditLog> directTransactionLogs) {
         this(dpt.getId().toString(),
              dpt.getExternalKey(),
              dpt.getDirectPaymentId().toString(),
+             paymentExternalKey,
              dpt.getTransactionType().toString(),
              dpt.getAmount(),
              dpt.getCurrency() != null ? dpt.getCurrency().toString() : null,
@@ -145,6 +149,10 @@ public class DirectTransactionJson extends JsonBase {
         return properties;
     }
 
+    public String getPaymentExternalKey() {
+        return paymentExternalKey;
+    }
+
     @Override
     public String toString() {
         final StringBuilder sb = new StringBuilder("DirectTransactionJson{");
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/InvoicePaymentJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/InvoicePaymentJson.java
index 004b453..0a60da5 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/InvoicePaymentJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/InvoicePaymentJson.java
@@ -34,6 +34,7 @@ public class InvoicePaymentJson extends DirectPaymentJson {
 
     private final String targetInvoiceId;
 
+
     @JsonCreator
     public InvoicePaymentJson(@JsonProperty("targetInvoiceId") final String targetInvoiceId,
                               @JsonProperty("accountId") final String accountId,
@@ -47,7 +48,7 @@ public class InvoicePaymentJson extends DirectPaymentJson {
                               @JsonProperty("creditedAmount") final BigDecimal creditedAmount,
                               @JsonProperty("currency") final String currency,
                               @JsonProperty("paymentMethodId") final String paymentMethodId,
-                              @JsonProperty("transactions") final List<DirectTransactionJson> transactions,
+                              @JsonProperty("transactions") final List<? extends DirectTransactionJson> transactions,
                               @JsonProperty("auditLogs") @Nullable final List<AuditLogJson> auditLogs) {
         super(accountId, paymentId, paymentNumber, paymentExternalKey, authAmount, capturedAmount, purchasedAmount, refundedAmount, creditedAmount, currency, paymentMethodId, transactions, auditLogs);
         this.targetInvoiceId = targetInvoiceId;
@@ -55,6 +56,7 @@ public class InvoicePaymentJson extends DirectPaymentJson {
 
     public InvoicePaymentJson(final DirectPayment dp, @Nullable final UUID invoiceId, @Nullable final AccountAuditLogs accountAuditLogs) {
         super(dp, accountAuditLogs);
+        // STEPH we should build InvoicePaymentTransactionJson instead of DirectTransactionJson here.
         this.targetInvoiceId = invoiceId != null ? invoiceId.toString() : null;
     }
 
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/InvoicePaymentTransactionJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/InvoicePaymentTransactionJson.java
new file mode 100644
index 0000000..98b0124
--- /dev/null
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/InvoicePaymentTransactionJson.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2014 Groupon, Inc
+ * Copyright 2014 The Billing Project, LLC
+ *
+ * The Billing Project licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.killbill.billing.jaxrs.json;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+import org.joda.time.DateTime;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class InvoicePaymentTransactionJson extends DirectTransactionJson {
+
+    private final Boolean isAdjusted;
+    private final List<InvoiceItemJson> adjustments;
+
+    @JsonCreator
+    public InvoicePaymentTransactionJson(@JsonProperty("transactionId") final String transactionId,
+                                         @JsonProperty("transactionExternalKey") final String transactionExternalKey,
+                                         @JsonProperty("paymentId") final String directPaymentId,
+                                         @JsonProperty("paymentExternalKey") final String paymentExternalKey,
+                                         @JsonProperty("transactionType") final String transactionType,
+                                         @JsonProperty("amount") final BigDecimal amount,
+                                         @JsonProperty("currency") final String currency,
+                                         @JsonProperty("effectiveDate") final DateTime effectiveDate,
+                                         @JsonProperty("status") final String status,
+                                         @JsonProperty("gatewayErrorCode") final String gatewayErrorCode,
+                                         @JsonProperty("gatewayErrorMsg") final String gatewayErrorMsg,
+                                         @JsonProperty("firstPaymentReferenceId") final String firstPaymentReferenceId,
+                                         @JsonProperty("secondPaymentReferenceId") final String secondPaymentReferenceId,
+                                         @JsonProperty("properties") final List<PluginPropertyJson> properties,
+                                         @JsonProperty("isAdjusted") final Boolean isAdjusted,
+                                         @JsonProperty("adjustments") final List<InvoiceItemJson> adjustments,
+                                         @JsonProperty("auditLogs") @Nullable final List<AuditLogJson> auditLogs) {
+        super(transactionId, transactionExternalKey, directPaymentId, paymentExternalKey, transactionType, amount, currency, effectiveDate, status,
+              gatewayErrorCode, gatewayErrorMsg, firstPaymentReferenceId, secondPaymentReferenceId, properties, auditLogs);
+        this.isAdjusted = isAdjusted;
+        this.adjustments = adjustments;
+    }
+
+    @JsonProperty("isAdjusted")
+    public Boolean isAdjusted() {
+        return isAdjusted;
+    }
+
+    public List<InvoiceItemJson> getAdjustments() {
+        return adjustments;
+    }
+
+    @Override
+    public boolean equals(final Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof InvoicePaymentTransactionJson)) {
+            return false;
+        }
+        if (!super.equals(o)) {
+            return false;
+        }
+
+        final InvoicePaymentTransactionJson that = (InvoicePaymentTransactionJson) o;
+
+        if (adjustments != null ? !adjustments.equals(that.adjustments) : that.adjustments != null) {
+            return false;
+        }
+        if (isAdjusted != null ? !isAdjusted.equals(that.isAdjusted) : that.isAdjusted != null) {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (isAdjusted != null ? isAdjusted.hashCode() : 0);
+        result = 31 * result + (adjustments != null ? adjustments.hashCode() : 0);
+        return result;
+    }
+}
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 732323e..f7a65cf 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
@@ -73,7 +73,6 @@ import org.killbill.billing.jaxrs.json.InvoiceJson;
 import org.killbill.billing.jaxrs.json.InvoicePaymentJson;
 import org.killbill.billing.jaxrs.json.OverdueStateJson;
 import org.killbill.billing.jaxrs.json.PaymentMethodJson;
-import org.killbill.billing.jaxrs.json.RefundJson;
 import org.killbill.billing.jaxrs.util.Context;
 import org.killbill.billing.jaxrs.util.JaxrsUriBuilder;
 import org.killbill.billing.overdue.OverdueApiException;
@@ -652,17 +651,17 @@ public class AccountResource extends JaxRsResourceBase {
         switch (transactionType) {
             case AUTHORIZE:
                 result = paymentApi.createAuthorization(account, paymentMethodId, directPaymentId, json.getAmount(), currency,
-                                                        json.getTransactionExternalKey(), json.getTransactionExternalKey(),
+                                                        json.getPaymentExternalKey(), json.getTransactionExternalKey(),
                                                         pluginProperties, callContext);
                 break;
             case PURCHASE:
                 result = paymentApi.createPurchase(account, paymentMethodId, directPaymentId, json.getAmount(), currency,
-                                                   json.getTransactionExternalKey(), json.getTransactionExternalKey(),
+                                                   json.getPaymentExternalKey(), json.getTransactionExternalKey(),
                                                    pluginProperties, callContext);
                 break;
             case CREDIT:
                 result = paymentApi.createCredit(account, paymentMethodId, directPaymentId, json.getAmount(), currency,
-                                                 json.getTransactionExternalKey(), json.getTransactionExternalKey(),
+                                                 json.getPaymentExternalKey(), json.getTransactionExternalKey(),
                                                  pluginProperties, callContext);
                 break;
             default:
@@ -693,31 +692,6 @@ public class AccountResource extends JaxRsResourceBase {
     }
 
     /*
-     * ************************** REFUNDS ********************************
-     */
-    @GET
-    @Path("/{accountId:" + UUID_PATTERN + "}/" + REFUNDS)
-    @Produces(APPLICATION_JSON)
-    public Response getRefunds(@PathParam("accountId") final String accountId,
-                               @javax.ws.rs.core.Context final HttpServletRequest request) throws AccountApiException, PaymentApiException {
-        final TenantContext tenantContext = context.createContext(request);
-
-        final Account account = accountUserApi.getAccountById(UUID.fromString(accountId), tenantContext);
-
-        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 DirectPaymentTransaction input) {
-                return new RefundJson(input, null, null);
-            }
-        });
-        final List<RefundJson> realResult = ImmutableList.copyOf(result);
-        return Response.status(Status.OK).entity(realResult).build();
-    }
-
-    /*
      * ************************** OVERDUE ********************************
      */
     @GET
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 1d6718d..5dd866f 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
@@ -42,11 +42,13 @@ 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.InvoicePayment;
+import org.killbill.billing.invoice.api.InvoicePaymentApi;
+import org.killbill.billing.invoice.api.InvoicePaymentType;
 import org.killbill.billing.jaxrs.json.CustomFieldJson;
-import org.killbill.billing.jaxrs.json.DirectPaymentJson;
 import org.killbill.billing.jaxrs.json.InvoiceItemJson;
 import org.killbill.billing.jaxrs.json.InvoicePaymentJson;
-import org.killbill.billing.jaxrs.json.RefundJson;
+import org.killbill.billing.jaxrs.json.InvoicePaymentTransactionJson;
 import org.killbill.billing.jaxrs.util.Context;
 import org.killbill.billing.jaxrs.util.JaxrsUriBuilder;
 import org.killbill.billing.payment.api.DirectPayment;
@@ -64,7 +66,9 @@ import org.killbill.billing.util.callcontext.CallContext;
 import org.killbill.billing.util.callcontext.TenantContext;
 import org.killbill.clock.Clock;
 
+import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
 import com.google.inject.Inject;
 
 import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
@@ -74,6 +78,7 @@ public class InvoicePaymentResource extends JaxRsResourceBase {
 
     private static final String ID_PARAM_NAME = "paymentId";
 
+    private final InvoicePaymentApi invoicePaymentApi;
 
     @Inject
     public InvoicePaymentResource(final AccountUserApi accountUserApi,
@@ -82,50 +87,58 @@ public class InvoicePaymentResource extends JaxRsResourceBase {
                                   final TagUserApi tagUserApi,
                                   final CustomFieldUserApi customFieldUserApi,
                                   final AuditUserApi auditUserApi,
+                                  final InvoicePaymentApi invoicePaymentApi,
                                   final Clock clock,
                                   final Context context) {
         super(uriBuilder, tagUserApi, customFieldUserApi, auditUserApi, accountUserApi, paymentApi, clock, context);
+        this.invoicePaymentApi = invoicePaymentApi;
     }
 
-
     @GET
     @Path("/{paymentId:" + UUID_PATTERN + "}/")
     @Produces(APPLICATION_JSON)
     public Response getInvoicePayment(@PathParam("paymentId") final String directPaymentIdStr,
-                                     @QueryParam(QUERY_WITH_PLUGIN_INFO) @DefaultValue("false") final Boolean withPluginInfo,
-                                     @QueryParam(QUERY_PLUGIN_PROPERTY) final List<String> pluginPropertiesString,
-                                     @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,
+                                      @QueryParam(QUERY_PLUGIN_PROPERTY) final List<String> pluginPropertiesString,
+                                      @QueryParam(QUERY_AUDIT) @DefaultValue("NONE") final AuditMode auditMode,
+                                      @javax.ws.rs.core.Context final HttpServletRequest request) throws PaymentApiException {
+
         final Iterable<PluginProperty> pluginProperties = extractPluginProperties(pluginPropertiesString);
         final UUID directPaymentIdId = UUID.fromString(directPaymentIdStr);
         final TenantContext tenantContext = context.createContext(request);
         final DirectPayment directPayment = paymentApi.getPayment(directPaymentIdId, withPluginInfo, pluginProperties, tenantContext);
         final AccountAuditLogs accountAuditLogs = auditUserApi.getAccountAuditLogs(directPayment.getAccountId(), auditMode.getLevel(), tenantContext);
-        final DirectPaymentJson paymentJson = new DirectPaymentJson(directPayment, accountAuditLogs);
-        // STEPH (API is broken need to also have the invoiceId)
-        //final InvoicePaymentJson result = new InvoicePaymentJson(directPayment, accountAuditLogs)
-        return Response.status(Response.Status.OK).entity(paymentJson).build();
-    }
 
+        final List<InvoicePayment> invoicePayments = invoicePaymentApi.getInvoicePayments(directPaymentIdId, tenantContext);
+        final InvoicePayment invoicePayment = Iterables.tryFind(invoicePayments, new Predicate<InvoicePayment>() {
+            @Override
+            public boolean apply(final InvoicePayment input) {
+                return input.getType() == InvoicePaymentType.ATTEMPT;
+            }
+        }).orNull();
+        final UUID invoiceId = invoicePayment != null ? invoicePayment.getInvoiceId() : null;
+
+        final InvoicePaymentJson result = new InvoicePaymentJson(directPayment, invoiceId, accountAuditLogs);
+        return Response.status(Response.Status.OK).entity(result).build();
+    }
 
     @POST
     @Path("/{paymentId:" + UUID_PATTERN + "}/" + REFUNDS)
     @Consumes(APPLICATION_JSON)
     @Produces(APPLICATION_JSON)
-    public Response createRefundWithAdjustments(final RefundJson json,
-                                 @PathParam("paymentId") final String paymentId,
-                                 @QueryParam(QUERY_PLUGIN_PROPERTY) final List<String> pluginPropertiesString,
-                                 @HeaderParam(HDR_CREATED_BY) final String createdBy,
-                                 @HeaderParam(HDR_REASON) final String reason,
-                                 @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 {
-
+    public Response createRefundWithAdjustments(final InvoicePaymentTransactionJson json,
+                                                @PathParam("paymentId") final String paymentId,
+                                                @QueryParam(QUERY_PLUGIN_PROPERTY) final List<String> pluginPropertiesString,
+                                                @HeaderParam(HDR_CREATED_BY) final String createdBy,
+                                                @HeaderParam(HDR_REASON) final String reason,
+                                                @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 CallContext callContext = context.createContext(createdBy, reason, comment, request);
         final UUID paymentUuid = UUID.fromString(paymentId);
         final DirectPayment payment = paymentApi.getPayment(paymentUuid, false, ImmutableList.<PluginProperty>of(), callContext);
-        final Account account= accountUserApi.getAccountById(payment.getAccountId(), callContext);
+        final Account account = accountUserApi.getAccountById(payment.getAccountId(), callContext);
 
         final Iterable<PluginProperty> pluginProperties;
         final String transactionExternalKey = UUID.randomUUID().toString();
@@ -146,12 +159,9 @@ public class InvoicePaymentResource extends JaxRsResourceBase {
             pluginProperties = extractPluginProperties(pluginPropertiesString);
         }
 
-
         final DirectPayment result = paymentApi.createRefundWithPaymentControl(account, payment.getId(), json.getAmount(), account.getCurrency(), transactionExternalKey,
                                                                                pluginProperties, createInvoicePaymentControlPluginApiPaymentOptions(false), callContext);
-
-        // STEPH should be changed to return InvoicePayment instead
-        return uriBuilder.buildResponse(DirectPaymentResource.class, "getDirectPayment", result.getId(), uriInfo.getBaseUri().toString());
+        return uriBuilder.buildResponse(InvoicePaymentResource.class, "getInvoicePayment", result.getId(), uriInfo.getBaseUri().toString());
     }
 
     @GET
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 98e7b0c..8e2922e 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
@@ -414,7 +414,7 @@ public class InvoiceResource extends JaxRsResourceBase {
         final UUID invoiceId = UUID.fromString(payment.getTargetInvoiceId());
         final DirectPayment result = createPurchaseForInvoice(account, invoiceId, payment.getPurchasedAmount(), externalPayment, callContext);
         // STEPH should that live in InvoicePayment instead?
-        return uriBuilder.buildResponse(uriInfo, DirectPaymentResource.class, "getDirectPayment", result.getId());
+        return uriBuilder.buildResponse(uriInfo, InvoicePaymentResource.class, "getInvoicePayment", result.getId());
     }
 
     @POST
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 0648bc6..cea1612 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
@@ -355,7 +355,8 @@ public abstract class JaxRsResourceBase implements JaxrsResource {
                                                                   invoiceId.toString(), false);
         properties.add(invoiceProperty);
 
-        return paymentApi.createPurchaseWithPaymentControl(account, account.getPaymentMethodId(), null, amountToPay, account.getCurrency(), paymentExternalKey, transactionExternalKey,
+        final UUID paymentMethodId = externalPayment ? null : account.getPaymentMethodId();
+        return paymentApi.createPurchaseWithPaymentControl(account, paymentMethodId, null, amountToPay, account.getCurrency(), paymentExternalKey, transactionExternalKey,
                                                     properties, createInvoicePaymentControlPluginApiPaymentOptions(externalPayment), callContext);
     }
 
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 800a79d..fe300c4 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
@@ -123,7 +123,7 @@ public class DefaultDirectPaymentApi implements DirectPaymentApi {
         checkNullParameter(properties, "plugin properties");
         checkPositiveAmount(amount);
 
-        if (paymentMethodId == null && paymentOptions.isExternalPayment()) {
+        if (paymentMethodId == null && !paymentOptions.isExternalPayment()) {
             throw new PaymentApiException(ErrorCode.PAYMENT_INVALID_PARAMETER, "paymentMethodId", "should not be null");
         }
 
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccount.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccount.java
index 2438903..fdca05c 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccount.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccount.java
@@ -33,14 +33,9 @@ import org.killbill.billing.client.model.Accounts;
 import org.killbill.billing.client.model.AuditLog;
 import org.killbill.billing.client.model.CustomField;
 import org.killbill.billing.client.model.InvoicePayments;
-import org.killbill.billing.client.model.Payment;
 import org.killbill.billing.client.model.PaymentMethod;
 import org.killbill.billing.client.model.PaymentMethodPluginDetail;
-import org.killbill.billing.client.model.Payments;
-import org.killbill.billing.client.model.Refund;
-import org.killbill.billing.client.model.Refunds;
 import org.killbill.billing.client.model.Tag;
-import org.killbill.billing.invoice.api.InvoicePayment;
 import org.killbill.billing.util.api.AuditLevel;
 import org.testng.Assert;
 import org.testng.annotations.Test;
@@ -186,10 +181,6 @@ public class TestAccount extends TestJaxrsBase {
         // Verify payments
         final InvoicePayments objFromJson = killBillClient.getPaymentsForAccount(accountJson.getAccountId());
         Assert.assertEquals(objFromJson.size(), 1);
-
-        // Verify refunds
-        final Refunds objRefundFromJson = killBillClient.getRefundsForAccount(accountJson.getAccountId());
-        Assert.assertEquals(objRefundFromJson.size(), 0);
     }
 
     @Test(groups = "slow", description = "Add tags to account")
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccountTimeline.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccountTimeline.java
index 0ab8c47..2c015fa 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccountTimeline.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccountTimeline.java
@@ -34,23 +34,15 @@ import org.killbill.billing.client.model.Credit;
 import org.killbill.billing.client.model.EventSubscription;
 import org.killbill.billing.client.model.Invoice;
 import org.killbill.billing.client.model.InvoicePayment;
+import org.killbill.billing.client.model.InvoicePaymentTransaction;
 import org.killbill.billing.client.model.Payment;
-import org.killbill.billing.client.model.Refund;
-import org.killbill.billing.client.model.Transaction;
-import org.killbill.billing.jaxrs.resources.JaxRsResourceBase;
-import org.killbill.billing.payment.api.DirectPayment;
-import org.killbill.billing.payment.api.DirectPaymentTransaction;
+import org.killbill.billing.client.model.PaymentTransaction;
 import org.killbill.billing.payment.api.TransactionType;
 import org.killbill.billing.util.api.AuditLevel;
 import org.killbill.billing.util.audit.ChangeType;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-
 public class TestAccountTimeline extends TestJaxrsBase {
 
     private static final String PAYMENT_REQUEST_PROCESSOR = "PaymentRequestProcessor";
@@ -95,7 +87,7 @@ public class TestAccountTimeline extends TestJaxrsBase {
         // Add refund
         final Payment postedPayment = killBillClient.getPaymentsForAccount(accountJson.getAccountId()).get(0);
         final BigDecimal refundAmount = BigDecimal.ONE;
-        final Refund refund = new Refund();
+        final InvoicePaymentTransaction refund = new InvoicePaymentTransaction();
         refund.setPaymentId(postedPayment.getPaymentId());
         refund.setAmount(refundAmount);
         killBillClient.createInvoicePaymentRefund(refund, createdBy, reason, comment);
@@ -126,24 +118,24 @@ public class TestAccountTimeline extends TestJaxrsBase {
             final AccountTimeline timeline = killBillClient.getAccountTimeline(accountId, auditLevel);
 
             Assert.assertEquals(timeline.getPayments().size(), 1);
-            final InvoicePayment payment =  timeline.getPayments().get(0);
+            final InvoicePayment payment = timeline.getPayments().get(0);
 
             // Verify payments
-            final List<Transaction> purchaseTransactions  = getDirectPaymentTransactions(timeline.getPayments(), TransactionType.PURCHASE.toString());
+            final List<PaymentTransaction> purchaseTransactions = getDirectPaymentTransactions(timeline.getPayments(), TransactionType.PURCHASE.toString());
             Assert.assertEquals(purchaseTransactions.size(), 1);
-            final Transaction purchaseTransaction = purchaseTransactions.get(0);
+            final PaymentTransaction purchaseTransaction = purchaseTransactions.get(0);
 
             // Verify refunds
-            final List<Transaction> refundTransactions  = getDirectPaymentTransactions(timeline.getPayments(), TransactionType.REFUND.toString());
+            final List<PaymentTransaction> refundTransactions = getDirectPaymentTransactions(timeline.getPayments(), TransactionType.REFUND.toString());
             Assert.assertEquals(refundTransactions.size(), 1);
-            final Transaction refundTransaction = refundTransactions.get(0);
+            final PaymentTransaction refundTransaction = refundTransactions.get(0);
             Assert.assertEquals(refundTransaction.getPaymentId(), payment.getPaymentId());
             Assert.assertEquals(refundTransaction.getAmount().compareTo(refundAmount), 0);
 
             // Verify chargebacks
-            final List<Transaction> chargebackTransactions  = getDirectPaymentTransactions(timeline.getPayments(), TransactionType.CHARGEBACK.toString());
+            final List<PaymentTransaction> chargebackTransactions = getDirectPaymentTransactions(timeline.getPayments(), TransactionType.CHARGEBACK.toString());
             Assert.assertEquals(chargebackTransactions.size(), 1);
-            final Transaction chargebackTransaction = chargebackTransactions.get(0);
+            final PaymentTransaction chargebackTransaction = chargebackTransactions.get(0);
             Assert.assertEquals(chargebackTransaction.getPaymentId(), payment.getPaymentId());
             Assert.assertEquals(chargebackTransaction.getAmount().compareTo(chargebackAmount), 0);
 
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoice.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoice.java
index f128262..0dcc69f 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoice.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoice.java
@@ -159,9 +159,8 @@ public class TestInvoice extends TestJaxrsBase {
             invoicePayment.setPurchasedAmount(cur.getBalance());
             invoicePayment.setAccountId(accountJson.getAccountId());
             invoicePayment.setTargetInvoiceId(cur.getInvoiceId());
-            final InvoicePayments objFromJson = null; // STEPH killBillClient.createInvoicePayment(invoicePayment, true, createdBy, reason, comment);
-            assertEquals(objFromJson.size(), 1);
-            assertEquals(cur.getBalance().compareTo(objFromJson.get(0).getPurchasedAmount()), 0);
+            final InvoicePayment objFromJson = killBillClient.createInvoicePayment(invoicePayment, true, createdBy, reason, comment);
+            assertEquals(cur.getBalance().compareTo(objFromJson.getPurchasedAmount()), 0);
         }
     }
 
@@ -171,8 +170,7 @@ public class TestInvoice extends TestJaxrsBase {
 
         // Verify we didn't get any invoicePayment
         final List<InvoicePayment> noPaymentsFromJson = killBillClient.getPaymentsForAccount(accountJson.getAccountId());
-        assertEquals(noPaymentsFromJson.size(), 1);
-        final UUID initialPaymentId = noPaymentsFromJson.get(0).getPaymentId();
+        assertEquals(noPaymentsFromJson.size(), 0);
 
         // Get the invoices
         final List<Invoice> invoices = killBillClient.getInvoicesForAccount(accountJson.getAccountId());
@@ -189,19 +187,12 @@ public class TestInvoice extends TestJaxrsBase {
 
         // Verify we indeed got the invoicePayment
         final List<InvoicePayment> paymentsFromJson = killBillClient.getPaymentsForAccount(accountJson.getAccountId());
-        assertEquals(paymentsFromJson.size(), 2);
-        Payment secondPayment = null;
-        for (final Payment cur : paymentsFromJson) {
-            if (!cur.getPaymentId().equals(initialPaymentId)) {
-                secondPayment = cur;
-                break;
-            }
-        }
-        assertNotNull(secondPayment);
-
+        assertEquals(paymentsFromJson.size(), 1);
+        assertEquals(paymentsFromJson.get(0).getPurchasedAmount().compareTo(BigDecimal.TEN), 0);
+        assertEquals(paymentsFromJson.get(0).getTargetInvoiceId(), invoiceId);
 
         // Check the PaymentMethod from paymentMethodId returned in the Payment object
-        final UUID paymentMethodId = secondPayment.getPaymentMethodId();
+        final UUID paymentMethodId = paymentsFromJson.get(0).getPaymentMethodId();
         final PaymentMethod paymentMethodJson = killBillClient.getPaymentMethod(paymentMethodId);
         assertEquals(paymentMethodJson.getPaymentMethodId(), paymentMethodId);
         assertEquals(paymentMethodJson.getAccountId(), accountJson.getAccountId());
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoicePayment.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoicePayment.java
index 6cb3db0..63ce378 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoicePayment.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoicePayment.java
@@ -28,12 +28,13 @@ import org.killbill.billing.client.model.Account;
 import org.killbill.billing.client.model.Invoice;
 import org.killbill.billing.client.model.InvoiceItem;
 import org.killbill.billing.client.model.InvoicePayment;
+import org.killbill.billing.client.model.InvoicePaymentTransaction;
 import org.killbill.billing.client.model.InvoicePayments;
 import org.killbill.billing.client.model.Payment;
 import org.killbill.billing.client.model.PaymentMethod;
 import org.killbill.billing.client.model.Payments;
-import org.killbill.billing.client.model.Refund;
-import org.killbill.billing.client.model.Transaction;
+import org.killbill.billing.client.model.InvoicePaymentTransaction;
+import org.killbill.billing.client.model.PaymentTransaction;
 import org.killbill.billing.payment.api.TransactionType;
 import org.testng.Assert;
 import org.testng.annotations.Test;
@@ -58,7 +59,7 @@ public class TestInvoicePayment extends TestJaxrsBase {
         final BigDecimal expectedInvoiceBalance = refundAmount;
 
         // Post and verify the refund
-        final Refund refund = new Refund();
+        final InvoicePaymentTransaction refund = new InvoicePaymentTransaction();
         refund.setPaymentId(invoicePaymentJson.getPaymentId());
         refund.setAmount(refundAmount);
         final Payment paymentAfterRefundJson = killBillClient.createInvoicePaymentRefund(refund, createdBy, reason, comment);
@@ -77,7 +78,7 @@ public class TestInvoicePayment extends TestJaxrsBase {
         final BigDecimal expectedInvoiceBalance = refundAmount;
 
         // Post and verify the refund
-        final Refund refund = new Refund();
+        final InvoicePaymentTransaction refund = new InvoicePaymentTransaction();
         refund.setPaymentId(paymentJson.getPaymentId());
         refund.setAmount(refundAmount);
         final Payment paymentAfterRefundJson = killBillClient.createInvoicePaymentRefund(refund, createdBy, reason, comment);
@@ -96,10 +97,10 @@ public class TestInvoicePayment extends TestJaxrsBase {
         final BigDecimal expectedInvoiceBalance = BigDecimal.ZERO;
 
         // Post and verify the refund
-        final Refund refund = new Refund();
+        final InvoicePaymentTransaction refund = new InvoicePaymentTransaction();
         refund.setPaymentId(paymentJson.getPaymentId());
         refund.setAmount(refundAmount);
-        refund.setAdjusted(true);
+        refund.setIsAdjusted(true);
         final Payment paymentAfterRefundJson = killBillClient.createInvoicePaymentRefund(refund, createdBy, reason, comment);
         verifyRefund(paymentJson, paymentAfterRefundJson, refundAmount);
 
@@ -116,10 +117,10 @@ public class TestInvoicePayment extends TestJaxrsBase {
         final BigDecimal expectedInvoiceBalance = BigDecimal.ZERO;
 
         // Post and verify the refund
-        final Refund refund = new Refund();
+        final InvoicePaymentTransaction refund = new InvoicePaymentTransaction();
         refund.setPaymentId(paymentJson.getPaymentId());
         refund.setAmount(refundAmount);
-        refund.setAdjusted(true);
+        refund.setIsAdjusted(true);
         final Payment paymentAfterRefundJson = killBillClient.createInvoicePaymentRefund(refund, createdBy, reason, comment);
         verifyRefund(paymentJson, paymentAfterRefundJson, refundAmount);
 
@@ -140,10 +141,10 @@ public class TestInvoicePayment extends TestJaxrsBase {
         final BigDecimal expectedInvoiceBalance = BigDecimal.ZERO;
 
         // Post and verify the refund
-        final Refund refund = new Refund();
+        final InvoicePaymentTransaction refund = new InvoicePaymentTransaction();
         refund.setPaymentId(paymentJson.getPaymentId());
         refund.setAmount(refundAmount);
-        refund.setAdjusted(true);
+        refund.setIsAdjusted(true);
         final InvoiceItem adjustment = new InvoiceItem();
         adjustment.setInvoiceItemId(itemToAdjust.getInvoiceItemId());
         /* null amount means full adjustment for that item */
@@ -168,9 +169,9 @@ public class TestInvoicePayment extends TestJaxrsBase {
         final BigDecimal expectedInvoiceBalance = BigDecimal.ZERO;
 
         // Post and verify the refund
-        final Refund refund = new Refund();
+        final InvoicePaymentTransaction refund = new InvoicePaymentTransaction();
         refund.setPaymentId(paymentJson.getPaymentId());
-        refund.setAdjusted(true);
+        refund.setIsAdjusted(true);
         final InvoiceItem adjustment = new InvoiceItem();
         adjustment.setInvoiceItemId(itemToAdjust.getInvoiceItemId());
         adjustment.setAmount(refundAmount);
@@ -187,7 +188,7 @@ public class TestInvoicePayment extends TestJaxrsBase {
         InvoicePayment lastPayment = setupScenarioWithPayment();
 
         for (int i = 0; i < 5; i++) {
-            final Refund refund = new Refund();
+            final InvoicePaymentTransaction refund = new InvoicePaymentTransaction();
             refund.setPaymentId(lastPayment.getPaymentId());
             refund.setAmount(lastPayment.getPurchasedAmount());
             killBillClient.createInvoicePaymentRefund(refund, createdBy, reason, comment);
@@ -203,7 +204,7 @@ public class TestInvoicePayment extends TestJaxrsBase {
         final InvoicePayments allPayments = killBillClient.getInvoicePaymentsForAccount(lastPayment.getAccountId());
         Assert.assertEquals(allPayments.size(), 6);
 
-        final List<Transaction> objRefundFromJson = getDirectPaymentTransactions(allPayments, TransactionType.REFUND.toString());
+        final List<PaymentTransaction> objRefundFromJson = getDirectPaymentTransactions(allPayments, TransactionType.REFUND.toString());
         Assert.assertEquals(objRefundFromJson.size(), 5);
 
         Payments paymentsPage = killBillClient.getPayments(0L, 1L);
@@ -235,17 +236,17 @@ public class TestInvoicePayment extends TestJaxrsBase {
         Assert.assertEquals(paymentMethodJson.getAccountId(), accountJson.getAccountId());
 
         // Verify the refunds
-        final List<Transaction> objRefundFromJson = getDirectPaymentTransactions(paymentsForAccount, TransactionType.REFUND.toString());
+        final List<PaymentTransaction> objRefundFromJson = getDirectPaymentTransactions(paymentsForAccount, TransactionType.REFUND.toString());
         Assert.assertEquals(objRefundFromJson.size(), 0);
         return paymentJson;
     }
 
     private void verifyRefund(final InvoicePayment paymentJson, final Payment paymentAfterRefund, final BigDecimal refundAmount) throws KillBillClientException {
 
-        final List<Transaction> transactions = getDirectPaymentTransactions(ImmutableList.of(paymentAfterRefund), TransactionType.REFUND.toString());
+        final List<PaymentTransaction> transactions = getDirectPaymentTransactions(ImmutableList.of(paymentAfterRefund), TransactionType.REFUND.toString());
         Assert.assertEquals(transactions.size(), 1);
 
-        final Transaction refund = transactions.get(0);
+        final PaymentTransaction refund = transactions.get(0);
         Assert.assertEquals(refund.getPaymentId(), paymentJson.getPaymentId());
         Assert.assertEquals(refund.getAmount().setScale(2, RoundingMode.HALF_UP), refundAmount.setScale(2, RoundingMode.HALF_UP));
         Assert.assertEquals(refund.getCurrency(), DEFAULT_CURRENCY);
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java
index 53a52b6..10f0368 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java
@@ -34,10 +34,9 @@ import org.killbill.billing.GuicyKillbillTestWithEmbeddedDBModule;
 import org.killbill.billing.api.TestApiListener;
 import org.killbill.billing.client.KillBillClient;
 import org.killbill.billing.client.KillBillHttpClient;
-import org.killbill.billing.client.model.InvoicePayment;
 import org.killbill.billing.client.model.Payment;
+import org.killbill.billing.client.model.PaymentTransaction;
 import org.killbill.billing.client.model.Tenant;
-import org.killbill.billing.client.model.Transaction;
 import org.killbill.billing.invoice.api.InvoiceNotifier;
 import org.killbill.billing.invoice.glue.DefaultInvoiceModule;
 import org.killbill.billing.invoice.notification.NullInvoiceNotifier;
@@ -257,13 +256,13 @@ public class TestJaxrsBase extends KillbillClient {
         }
     }
 
-    protected static <T extends Payment>  List<Transaction> getDirectPaymentTransactions(final List<T> payments, final String transactionType) {
-        return ImmutableList.copyOf(Iterables.concat(Iterables.transform(payments, new Function<T, Iterable<Transaction>>() {
+    protected static <T extends Payment> List<PaymentTransaction> getDirectPaymentTransactions(final List<T> payments, final String transactionType) {
+        return ImmutableList.copyOf(Iterables.concat(Iterables.transform(payments, new Function<T, Iterable<PaymentTransaction>>() {
             @Override
-            public Iterable<Transaction> apply(final T input) {
-                return Iterables.filter(input.getTransactions(), new Predicate<Transaction>() {
+            public Iterable<PaymentTransaction> apply(final T input) {
+                return Iterables.filter(input.getPaymentTransactions(), new Predicate<PaymentTransaction>() {
                     @Override
-                    public boolean apply(final Transaction input) {
+                    public boolean apply(final PaymentTransaction input) {
                         return input.getTransactionType().equals(transactionType);
                     }
                 });
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPayment.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPayment.java
index 6ce2786..50c88cb 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPayment.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPayment.java
@@ -29,7 +29,7 @@ import org.killbill.billing.client.model.Payment;
 import org.killbill.billing.client.model.PaymentMethod;
 import org.killbill.billing.client.model.PaymentMethodPluginDetail;
 import org.killbill.billing.client.model.Payments;
-import org.killbill.billing.client.model.Transaction;
+import org.killbill.billing.client.model.PaymentTransaction;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
@@ -51,7 +51,7 @@ public class TestPayment extends TestJaxrsBase {
                                           final String PaymentExternalKey, final int PaymentNb) throws Exception {
         // Authorization
         final String authTransactionExternalKey = UUID.randomUUID().toString();
-        final Transaction authTransaction = new Transaction();
+        final PaymentTransaction authTransaction = new PaymentTransaction();
         authTransaction.setAmount(BigDecimal.TEN);
         authTransaction.setCurrency(account.getCurrency());
         authTransaction.setPaymentExternalKey(PaymentExternalKey);
@@ -63,7 +63,7 @@ public class TestPayment extends TestJaxrsBase {
 
         // Capture 1
         final String capture1TransactionExternalKey = UUID.randomUUID().toString();
-        final Transaction captureTransaction = new Transaction();
+        final PaymentTransaction captureTransaction = new PaymentTransaction();
         captureTransaction.setPaymentId(authPayment.getPaymentId());
         captureTransaction.setAmount(BigDecimal.ONE);
         captureTransaction.setCurrency(account.getCurrency());
@@ -88,7 +88,7 @@ public class TestPayment extends TestJaxrsBase {
 
         // Refund
         final String refundTransactionExternalKey = UUID.randomUUID().toString();
-        final Transaction refundTransaction = new Transaction();
+        final PaymentTransaction refundTransaction = new PaymentTransaction();
         refundTransaction.setPaymentId(authPayment.getPaymentId());
         refundTransaction.setAmount(new BigDecimal("2"));
         refundTransaction.setCurrency(account.getCurrency());
@@ -132,21 +132,21 @@ public class TestPayment extends TestJaxrsBase {
         Assert.assertEquals(PaymentsForAccount.get(PaymentNb - 1), Payment);
     }
 
-    private void verifyPaymentTransaction(final UUID PaymentId, final Transaction Transaction,
+    private void verifyPaymentTransaction(final UUID PaymentId, final PaymentTransaction PaymentTransaction,
                                                 final String PaymentExternalKey, final String TransactionExternalKey,
                                                 final Account account, @Nullable final BigDecimal amount, final String transactionType) {
-        Assert.assertEquals(Transaction.getPaymentId(), PaymentId);
-        Assert.assertNotNull(Transaction.getTransactionId());
-        Assert.assertEquals(Transaction.getTransactionType(), transactionType);
-        Assert.assertEquals(Transaction.getStatus(), "SUCCESS");
+        Assert.assertEquals(PaymentTransaction.getPaymentId(), PaymentId);
+        Assert.assertNotNull(PaymentTransaction.getTransactionId());
+        Assert.assertEquals(PaymentTransaction.getTransactionType(), transactionType);
+        Assert.assertEquals(PaymentTransaction.getStatus(), "SUCCESS");
         if (amount == null) {
-            Assert.assertNull(Transaction.getAmount());
-            Assert.assertNull(Transaction.getCurrency());
+            Assert.assertNull(PaymentTransaction.getAmount());
+            Assert.assertNull(PaymentTransaction.getCurrency());
         } else {
-            Assert.assertEquals(Transaction.getAmount().compareTo(amount), 0);
-            Assert.assertEquals(Transaction.getCurrency(), account.getCurrency());
+            Assert.assertEquals(PaymentTransaction.getAmount().compareTo(amount), 0);
+            Assert.assertEquals(PaymentTransaction.getCurrency(), account.getCurrency());
         }
-        Assert.assertEquals(Transaction.getTransactionExternalKey(), TransactionExternalKey);
-        Assert.assertEquals(Transaction.getPaymentExternalKey(), PaymentExternalKey);
+        Assert.assertEquals(PaymentTransaction.getTransactionExternalKey(), TransactionExternalKey);
+        Assert.assertEquals(PaymentTransaction.getPaymentExternalKey(), PaymentExternalKey);
     }
 }