killbill-aplcache

Initial renaming from 'direct'Payment/Transaction -> Payment/Transaction

6/20/2014 5:58:28 PM

Changes

payment/src/main/resources/org/killbill/billing/payment/dao/DirectPaymentSqlDao.sql.stg 83(+0 -83)

Details

diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/util/AuditChecker.java b/beatrix/src/test/java/org/killbill/billing/beatrix/util/AuditChecker.java
index 2593ad3..afe8fad 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/util/AuditChecker.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/util/AuditChecker.java
@@ -35,7 +35,7 @@ import org.killbill.billing.invoice.dao.InvoiceItemSqlDao;
 import org.killbill.billing.invoice.dao.InvoiceSqlDao;
 import org.killbill.billing.payment.api.DirectPayment;
 import org.killbill.billing.payment.api.DirectPaymentTransaction;
-import org.killbill.billing.payment.dao.DirectPaymentSqlDao;
+import org.killbill.billing.payment.dao.PaymentSqlDao;
 import org.killbill.billing.subscription.engine.dao.BundleSqlDao;
 import org.killbill.billing.subscription.engine.dao.SubscriptionEventSqlDao;
 import org.killbill.billing.subscription.engine.dao.SubscriptionSqlDao;
@@ -168,7 +168,7 @@ public class AuditChecker {
     public void checkPaymentCreated(final DirectPayment payment, final CallContext context) {
         final List<AuditLog> invoiceLogs = getAuditLogForPayment(payment, context);
         Assert.assertEquals(invoiceLogs.size(), 1);
-        checkAuditLog(ChangeType.INSERT, context, invoiceLogs.get(0), payment.getId(), DirectPaymentSqlDao.class, false, false);
+        checkAuditLog(ChangeType.INSERT, context, invoiceLogs.get(0), payment.getId(), PaymentSqlDao.class, false, false);
 
         for (DirectPaymentTransaction cur : payment.getTransactions()) {
             final List<AuditLog> auditLogs = getAuditLogForPaymentTransaction(payment, cur, context);
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 28d7c45..3679b03 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
@@ -40,8 +40,8 @@ import org.killbill.billing.payment.api.PluginProperty;
 import org.killbill.billing.payment.api.TransactionType;
 import org.killbill.billing.payment.control.dao.InvoicePaymentControlDao;
 import org.killbill.billing.payment.control.dao.PluginAutoPayOffModelDao;
-import org.killbill.billing.payment.dao.DirectPaymentModelDao;
-import org.killbill.billing.payment.dao.DirectPaymentTransactionModelDao;
+import org.killbill.billing.payment.dao.PaymentModelDao;
+import org.killbill.billing.payment.dao.PaymentTransactionModelDao;
 import org.killbill.billing.payment.dao.PaymentDao;
 import org.killbill.billing.payment.glue.PaymentModule;
 import org.killbill.billing.payment.retry.BaseRetryService.RetryServiceScheduler;
@@ -194,7 +194,7 @@ public final class InvoicePaymentControlPluginApi implements PaymentControlPlugi
                                                  " aborted: requested refund amount is = " + paymentControlPluginContext.getAmount());
         }
 
-        final DirectPaymentModelDao directPayment = paymentDao.getDirectPayment(paymentControlPluginContext.getPaymentId(), internalContext);
+        final PaymentModelDao directPayment = paymentDao.getDirectPayment(paymentControlPluginContext.getPaymentId(), internalContext);
         if (directPayment == null) {
             throw new PaymentControlApiException();
         }
@@ -263,11 +263,11 @@ public final class InvoicePaymentControlPluginApi implements PaymentControlPlugi
             return null;
         }
 
-        final List<DirectPaymentTransactionModelDao> purchasedTransactions = getPurchasedTransactions(paymentExternalKey, internalContext);
+        final List<PaymentTransactionModelDao> purchasedTransactions = getPurchasedTransactions(paymentExternalKey, internalContext);
         if (purchasedTransactions.size() == 0) {
             return null;
         }
-        final DirectPaymentTransactionModelDao lastTransaction = purchasedTransactions.get(purchasedTransactions.size() - 1);
+        final PaymentTransactionModelDao lastTransaction = purchasedTransactions.get(purchasedTransactions.size() - 1);
         switch (lastTransaction.getPaymentStatus()) {
             case PAYMENT_FAILURE_ABORTED:
                 return getNextRetryDateForPaymentFailure(purchasedTransactions);
@@ -281,7 +281,7 @@ public final class InvoicePaymentControlPluginApi implements PaymentControlPlugi
         }
     }
 
-    private DateTime getNextRetryDateForPaymentFailure(final List<DirectPaymentTransactionModelDao> purchasedTransactions) {
+    private DateTime getNextRetryDateForPaymentFailure(final List<PaymentTransactionModelDao> purchasedTransactions) {
 
         DateTime result = null;
         final List<Integer> retryDays = paymentConfig.getPaymentRetryDays();
@@ -300,7 +300,7 @@ public final class InvoicePaymentControlPluginApi implements PaymentControlPlugi
         return result;
     }
 
-    private DateTime getNextRetryDateForPluginFailure(final List<DirectPaymentTransactionModelDao> purchasedTransactions) {
+    private DateTime getNextRetryDateForPluginFailure(final List<PaymentTransactionModelDao> purchasedTransactions) {
 
         DateTime result = null;
         final int attemptsInState = getNumberAttemptsInState(purchasedTransactions, PaymentStatus.PLUGIN_FAILURE_ABORTED);
@@ -317,13 +317,13 @@ public final class InvoicePaymentControlPluginApi implements PaymentControlPlugi
         return result;
     }
 
-    private int getNumberAttemptsInState(final Collection<DirectPaymentTransactionModelDao> allTransactions, final PaymentStatus... statuses) {
+    private int getNumberAttemptsInState(final Collection<PaymentTransactionModelDao> allTransactions, final PaymentStatus... statuses) {
         if (allTransactions == null || allTransactions.size() == 0) {
             return 0;
         }
-        return Collections2.filter(allTransactions, new Predicate<DirectPaymentTransactionModelDao>() {
+        return Collections2.filter(allTransactions, new Predicate<PaymentTransactionModelDao>() {
             @Override
-            public boolean apply(final DirectPaymentTransactionModelDao input) {
+            public boolean apply(final PaymentTransactionModelDao input) {
                 for (final PaymentStatus cur : statuses) {
                     if (input.getPaymentStatus() == cur) {
                         return true;
@@ -334,18 +334,18 @@ public final class InvoicePaymentControlPluginApi implements PaymentControlPlugi
         }).size();
     }
 
-    private List<DirectPaymentTransactionModelDao> getPurchasedTransactions(final String paymentExternalKey, final InternalCallContext internalContext) {
-        final DirectPaymentModelDao payment = paymentDao.getDirectPaymentByExternalKey(paymentExternalKey, internalContext);
+    private List<PaymentTransactionModelDao> getPurchasedTransactions(final String paymentExternalKey, final InternalCallContext internalContext) {
+        final PaymentModelDao payment = paymentDao.getDirectPaymentByExternalKey(paymentExternalKey, internalContext);
         if (payment == null) {
             return Collections.emptyList();
         }
-        final List<DirectPaymentTransactionModelDao> transactions = paymentDao.getDirectTransactionsForDirectPayment(payment.getId(), internalContext);
+        final List<PaymentTransactionModelDao> transactions = paymentDao.getDirectTransactionsForDirectPayment(payment.getId(), internalContext);
         if (transactions == null || transactions.size() == 0) {
             return Collections.emptyList();
         }
-        return ImmutableList.copyOf(Iterables.filter(transactions, new Predicate<DirectPaymentTransactionModelDao>() {
+        return ImmutableList.copyOf(Iterables.filter(transactions, new Predicate<PaymentTransactionModelDao>() {
             @Override
-            public boolean apply(final DirectPaymentTransactionModelDao input) {
+            public boolean apply(final PaymentTransactionModelDao input) {
                 return input.getTransactionType() == TransactionType.PURCHASE;
             }
         }));
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 adbaa16..dddbe88 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
@@ -51,8 +51,8 @@ import org.killbill.billing.payment.api.PaymentStatus;
 import org.killbill.billing.payment.api.PluginProperty;
 import org.killbill.billing.payment.api.TransactionType;
 import org.killbill.billing.payment.core.sm.DirectPaymentAutomatonRunner;
-import org.killbill.billing.payment.dao.DirectPaymentModelDao;
-import org.killbill.billing.payment.dao.DirectPaymentTransactionModelDao;
+import org.killbill.billing.payment.dao.PaymentModelDao;
+import org.killbill.billing.payment.dao.PaymentTransactionModelDao;
 import org.killbill.billing.payment.dao.PaymentDao;
 import org.killbill.billing.payment.plugin.api.PaymentPluginApi;
 import org.killbill.billing.payment.plugin.api.PaymentPluginApiException;
@@ -223,14 +223,14 @@ public class DirectPaymentProcessor extends ProcessorBase {
     }
 
     public List<DirectPayment> getAccountPayments(final UUID accountId, final InternalTenantContext tenantContext) throws PaymentApiException {
-        final List<DirectPaymentModelDao> paymentsModelDao = paymentDao.getDirectPaymentsForAccount(accountId, tenantContext);
-        final List<DirectPaymentTransactionModelDao> transactionsModelDao = paymentDao.getDirectTransactionsForAccount(accountId, tenantContext);
+        final List<PaymentModelDao> paymentsModelDao = paymentDao.getDirectPaymentsForAccount(accountId, tenantContext);
+        final List<PaymentTransactionModelDao> transactionsModelDao = paymentDao.getDirectTransactionsForAccount(accountId, tenantContext);
 
-        return Lists.<DirectPaymentModelDao, DirectPayment>transform(paymentsModelDao,
-                                                                     new Function<DirectPaymentModelDao, DirectPayment>() {
+        return Lists.<PaymentModelDao, DirectPayment>transform(paymentsModelDao,
+                                                                     new Function<PaymentModelDao, DirectPayment>() {
                                                                          @Override
-                                                                         public DirectPayment apply(final DirectPaymentModelDao curDirectPaymentModelDao) {
-                                                                             return toDirectPayment(curDirectPaymentModelDao, transactionsModelDao, null);
+                                                                         public DirectPayment apply(final PaymentModelDao curPaymentModelDao) {
+                                                                             return toDirectPayment(curPaymentModelDao, transactionsModelDao, null);
                                                                          }
                                                                      }
                                                                     );
@@ -238,29 +238,29 @@ public class DirectPaymentProcessor extends ProcessorBase {
 
     public void notifyPendingPaymentOfStateChanged(final Account account, UUID transactionId, final boolean isSuccess, final CallContext callContext, final InternalCallContext internalCallContext) throws PaymentApiException {
 
-        final DirectPaymentTransactionModelDao transactionModelDao = paymentDao.getDirectPaymentTransaction(transactionId, internalCallContext);
+        final PaymentTransactionModelDao transactionModelDao = paymentDao.getDirectPaymentTransaction(transactionId, internalCallContext);
         if (transactionModelDao.getPaymentStatus() != PaymentStatus.PENDING) {
-            throw new PaymentApiException(ErrorCode.PAYMENT_NO_SUCH_SUCCESS_PAYMENT, transactionModelDao.getDirectPaymentId());
+            throw new PaymentApiException(ErrorCode.PAYMENT_NO_SUCH_SUCCESS_PAYMENT, transactionModelDao.getPaymentId());
 
         }
-        final DirectPaymentModelDao paymentModelDao = paymentDao.getDirectPayment(transactionModelDao.getDirectPaymentId(), internalCallContext);
+        final PaymentModelDao paymentModelDao = paymentDao.getDirectPayment(transactionModelDao.getPaymentId(), internalCallContext);
         Preconditions.checkState(paymentModelDao != null);
 
         final PaymentStatus newStatus = isSuccess ? PaymentStatus.SUCCESS : PaymentStatus.PAYMENT_FAILURE_ABORTED;
         // STEPH This works if the pending transaction we are trying to update matches is the one that gave the state to the payment. Also can we have multiple PENDING for a given payment?
-        final State currentPaymentState = directPaymentAutomatonRunner.fetchNextState(paymentModelDao.getCurrentStateName(), isSuccess);
+        final State currentPaymentState = directPaymentAutomatonRunner.fetchNextState(paymentModelDao.getStateName(), isSuccess);
         // STEPH : should we insert a new transaction row to keep the PENDING one?
-        paymentDao.updateDirectPaymentAndTransactionOnCompletion(transactionModelDao.getDirectPaymentId(), currentPaymentState.getName(), transactionModelDao.getId(), newStatus,
+        paymentDao.updateDirectPaymentAndTransactionOnCompletion(transactionModelDao.getPaymentId(), currentPaymentState.getName(), transactionModelDao.getId(), newStatus,
                                                                  transactionModelDao.getProcessedAmount(), transactionModelDao.getProcessedCurrency(),
                                                                  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 {
-        final DirectPaymentTransactionModelDao transactionModelDao = paymentDao.getDirectPaymentTransaction(transactionId, internalCallContext);
+        final PaymentTransactionModelDao transactionModelDao = paymentDao.getDirectPaymentTransaction(transactionId, internalCallContext);
         Preconditions.checkState(transactionModelDao != null);
 
         final DateTime utcNow = clock.getUTCNow();
-        final DirectPaymentTransactionModelDao chargebackTransaction = new DirectPaymentTransactionModelDao(utcNow, utcNow, chargebackTransactionExternalKey, transactionModelDao.getId(),
+        final PaymentTransactionModelDao chargebackTransaction = new PaymentTransactionModelDao(utcNow, utcNow, chargebackTransactionExternalKey, transactionModelDao.getId(),
 
                                                                                                             TransactionType.CHARGEBACK, utcNow, PaymentStatus.SUCCESS, amount, currency, null, null);
         final State currentPaymentState = directPaymentAutomatonRunner.fetchNextState("CHARGEBACK_INIT", true);
@@ -274,7 +274,7 @@ public class DirectPaymentProcessor extends ProcessorBase {
     }
 
     public DirectPayment getPayment(final UUID directPaymentId, final boolean withPluginInfo, final Iterable<PluginProperty> properties, final TenantContext tenantContext, final InternalTenantContext internalTenantContext) throws PaymentApiException {
-        final DirectPaymentModelDao paymentModelDao = paymentDao.getDirectPayment(directPaymentId, internalTenantContext);
+        final PaymentModelDao paymentModelDao = paymentDao.getDirectPayment(directPaymentId, internalTenantContext);
         if (paymentModelDao == null) {
             return null;
         }
@@ -282,7 +282,7 @@ public class DirectPaymentProcessor extends ProcessorBase {
     }
 
     public DirectPayment getPaymentByExternalKey(final String paymentExternalKey, final boolean withPluginInfo, final Iterable<PluginProperty> properties, final TenantContext tenantContext, final InternalTenantContext internalTenantContext) throws PaymentApiException {
-        final DirectPaymentModelDao paymentModelDao = paymentDao.getDirectPaymentByExternalKey(paymentExternalKey, internalTenantContext);
+        final PaymentModelDao paymentModelDao = paymentDao.getDirectPaymentByExternalKey(paymentExternalKey, internalTenantContext);
         if (paymentModelDao == null) {
             return null;
         }
@@ -308,16 +308,16 @@ public class DirectPaymentProcessor extends ProcessorBase {
         final PaymentPluginApi pluginApi = getPaymentPluginApi(pluginName);
 
         return getEntityPagination(limit,
-                                   new SourcePaginationBuilder<DirectPaymentModelDao, PaymentApiException>() {
+                                   new SourcePaginationBuilder<PaymentModelDao, PaymentApiException>() {
                                        @Override
-                                       public Pagination<DirectPaymentModelDao> build() {
+                                       public Pagination<PaymentModelDao> build() {
                                            // Find all payments for all accounts
                                            return paymentDao.getDirectPayments(pluginName, offset, limit, internalTenantContext);
                                        }
                                    },
-                                   new Function<DirectPaymentModelDao, DirectPayment>() {
+                                   new Function<PaymentModelDao, DirectPayment>() {
                                        @Override
-                                       public DirectPayment apply(final DirectPaymentModelDao paymentModelDao) {
+                                       public DirectPayment apply(final PaymentModelDao paymentModelDao) {
                                            List<PaymentTransactionInfoPlugin> pluginInfo = null;
                                            try {
                                                pluginInfo = pluginApi.getPaymentInfo(paymentModelDao.getAccountId(), paymentModelDao.getId(), properties, tenantContext);
@@ -389,26 +389,26 @@ public class DirectPaymentProcessor extends ProcessorBase {
     }
 
     public DirectPayment toDirectPayment(final UUID directPaymentId, @Nullable final List<PaymentTransactionInfoPlugin> pluginTransactions, final InternalTenantContext tenantContext) {
-        final DirectPaymentModelDao paymentModelDao = paymentDao.getDirectPayment(directPaymentId, tenantContext);
+        final PaymentModelDao paymentModelDao = paymentDao.getDirectPayment(directPaymentId, tenantContext);
         if (paymentModelDao == null) {
             log.warn("Unable to find direct payment id " + directPaymentId);
             return null;
         }
 
         final InternalTenantContext tenantContextWithAccountRecordId = internalCallContextFactory.createInternalTenantContext(paymentModelDao.getAccountId(), tenantContext);
-        final List<DirectPaymentTransactionModelDao> transactionsForAccount = paymentDao.getDirectTransactionsForAccount(paymentModelDao.getAccountId(), tenantContextWithAccountRecordId);
+        final List<PaymentTransactionModelDao> transactionsForAccount = paymentDao.getDirectTransactionsForAccount(paymentModelDao.getAccountId(), tenantContextWithAccountRecordId);
 
         return toDirectPayment(paymentModelDao, transactionsForAccount, pluginTransactions);
     }
 
-    private DirectPayment getDirectPayment(final DirectPaymentModelDao paymentModelDao, final boolean withPluginInfo, final Iterable<PluginProperty> properties, final TenantContext context, final InternalTenantContext tenantContext) throws PaymentApiException {
+    private DirectPayment getDirectPayment(final PaymentModelDao paymentModelDao, final boolean withPluginInfo, final Iterable<PluginProperty> properties, final TenantContext context, final InternalTenantContext tenantContext) throws PaymentApiException {
         final InternalTenantContext tenantContextWithAccountRecordId;
         if (tenantContext.getAccountRecordId() == null) {
             tenantContextWithAccountRecordId = internalCallContextFactory.createInternalTenantContext(paymentModelDao.getAccountId(), tenantContext);
         } else {
             tenantContextWithAccountRecordId = tenantContext;
         }
-        final List<DirectPaymentTransactionModelDao> transactionsForDirectPayment = paymentDao.getDirectTransactionsForDirectPayment(paymentModelDao.getId(), tenantContextWithAccountRecordId);
+        final List<PaymentTransactionModelDao> transactionsForDirectPayment = paymentDao.getDirectTransactionsForDirectPayment(paymentModelDao.getId(), tenantContextWithAccountRecordId);
 
         final PaymentPluginApi plugin = withPluginInfo ? getPaymentProviderPlugin(paymentModelDao.getPaymentMethodId(), tenantContext) : null;
         List<PaymentTransactionInfoPlugin> pluginInfo = null;
@@ -422,7 +422,7 @@ public class DirectPaymentProcessor extends ProcessorBase {
         return toDirectPayment(paymentModelDao, transactionsForDirectPayment, pluginInfo);
     }
 
-    private DirectPayment toDirectPayment(final DirectPaymentModelDao curDirectPaymentModelDao, final Iterable<DirectPaymentTransactionModelDao> transactionsModelDao, @Nullable final List<PaymentTransactionInfoPlugin> pluginTransactions) {
+    private DirectPayment toDirectPayment(final PaymentModelDao curPaymentModelDao, final Iterable<PaymentTransactionModelDao> transactionsModelDao, @Nullable final List<PaymentTransactionInfoPlugin> pluginTransactions) {
         final Ordering<DirectPaymentTransaction> perPaymentTransactionOrdering = Ordering.<DirectPaymentTransaction>from(new Comparator<DirectPaymentTransaction>() {
             @Override
             public int compare(final DirectPaymentTransaction o1, final DirectPaymentTransaction o2) {
@@ -430,16 +430,16 @@ public class DirectPaymentProcessor extends ProcessorBase {
             }
         });
 
-        final Iterable<DirectPaymentTransactionModelDao> filteredTransactions = Iterables.filter(transactionsModelDao, new Predicate<DirectPaymentTransactionModelDao>() {
+        final Iterable<PaymentTransactionModelDao> filteredTransactions = Iterables.filter(transactionsModelDao, new Predicate<PaymentTransactionModelDao>() {
             @Override
-            public boolean apply(final DirectPaymentTransactionModelDao curDirectPaymentTransactionModelDao) {
-                return curDirectPaymentTransactionModelDao.getDirectPaymentId().equals(curDirectPaymentModelDao.getId());
+            public boolean apply(final PaymentTransactionModelDao curDirectPaymentTransactionModelDao) {
+                return curDirectPaymentTransactionModelDao.getPaymentId().equals(curPaymentModelDao.getId());
             }
         });
 
-        final Iterable<DirectPaymentTransaction> transactions = Iterables.transform(filteredTransactions, new Function<DirectPaymentTransactionModelDao, DirectPaymentTransaction>() {
+        final Iterable<DirectPaymentTransaction> transactions = Iterables.transform(filteredTransactions, new Function<PaymentTransactionModelDao, DirectPaymentTransaction>() {
             @Override
-            public DirectPaymentTransaction apply(final DirectPaymentTransactionModelDao input) {
+            public DirectPaymentTransaction apply(final PaymentTransactionModelDao input) {
 
                 final PaymentTransactionInfoPlugin info = pluginTransactions != null ?
                                                           Iterables.tryFind(pluginTransactions, new Predicate<PaymentTransactionInfoPlugin>() {
@@ -449,7 +449,7 @@ public class DirectPaymentProcessor extends ProcessorBase {
                                                               }
                                                           }).orNull() : null;
 
-                return new DefaultDirectPaymentTransaction(input.getId(), input.getTransactionExternalKey(), input.getCreatedDate(), input.getUpdatedDate(), input.getDirectPaymentId(),
+                return new DefaultDirectPaymentTransaction(input.getId(), input.getTransactionExternalKey(), input.getCreatedDate(), input.getUpdatedDate(), input.getPaymentId(),
                                                            input.getTransactionType(), input.getEffectiveDate(), input.getPaymentStatus(), input.getAmount(), input.getCurrency(),
                                                            input.getProcessedAmount(), input.getProcessedCurrency(),
                                                            input.getGatewayErrorCode(), input.getGatewayErrorMsg(), info);
@@ -457,8 +457,8 @@ public class DirectPaymentProcessor extends ProcessorBase {
         });
 
         final List<DirectPaymentTransaction> sortedTransactions = perPaymentTransactionOrdering.immutableSortedCopy(transactions);
-        return new DefaultDirectPayment(curDirectPaymentModelDao.getId(), curDirectPaymentModelDao.getCreatedDate(), curDirectPaymentModelDao.getUpdatedDate(), curDirectPaymentModelDao.getAccountId(),
-                                        curDirectPaymentModelDao.getPaymentMethodId(), curDirectPaymentModelDao.getPaymentNumber(), curDirectPaymentModelDao.getExternalKey(), sortedTransactions);
+        return new DefaultDirectPayment(curPaymentModelDao.getId(), curPaymentModelDao.getCreatedDate(), curPaymentModelDao.getUpdatedDate(), curPaymentModelDao.getAccountId(),
+                                        curPaymentModelDao.getPaymentMethodId(), curPaymentModelDao.getPaymentNumber(), curPaymentModelDao.getExternalKey(), sortedTransactions);
     }
 
     private void postPaymentEvent(final Account account, final DirectPayment directPayment, final String transactionExternalKey, final InternalCallContext context) {
diff --git a/payment/src/main/java/org/killbill/billing/payment/core/PluginControlledPaymentProcessor.java b/payment/src/main/java/org/killbill/billing/payment/core/PluginControlledPaymentProcessor.java
index 488c4fd..6a448d0 100644
--- a/payment/src/main/java/org/killbill/billing/payment/core/PluginControlledPaymentProcessor.java
+++ b/payment/src/main/java/org/killbill/billing/payment/core/PluginControlledPaymentProcessor.java
@@ -38,8 +38,8 @@ import org.killbill.billing.payment.api.PaymentApiException;
 import org.killbill.billing.payment.api.PluginProperty;
 import org.killbill.billing.payment.api.TransactionType;
 import org.killbill.billing.payment.core.sm.PluginControlledDirectPaymentAutomatonRunner;
-import org.killbill.billing.payment.dao.DirectPaymentModelDao;
-import org.killbill.billing.payment.dao.DirectPaymentTransactionModelDao;
+import org.killbill.billing.payment.dao.PaymentModelDao;
+import org.killbill.billing.payment.dao.PaymentTransactionModelDao;
 import org.killbill.billing.payment.dao.PaymentAttemptModelDao;
 import org.killbill.billing.payment.dao.PaymentDao;
 import org.killbill.billing.payment.dao.PluginPropertyModelDao;
@@ -175,8 +175,8 @@ public class PluginControlledPaymentProcessor extends ProcessorBase {
         try {
 
             final PaymentAttemptModelDao attempt = paymentDao.getPaymentAttemptByExternalKey(transactionExternalKey, internalCallContext);
-            final DirectPaymentTransactionModelDao transaction = paymentDao.getDirectPaymentTransactionByExternalKey(transactionExternalKey, internalCallContext);
-            final DirectPaymentModelDao payment = paymentDao.getDirectPayment(transaction.getDirectPaymentId(), internalCallContext);
+            final PaymentTransactionModelDao transaction = paymentDao.getDirectPaymentTransactionByExternalKey(transactionExternalKey, internalCallContext);
+            final PaymentModelDao payment = paymentDao.getDirectPayment(transaction.getPaymentId(), internalCallContext);
 
             final List<PluginPropertyModelDao> properties = paymentDao.getProperties(transactionExternalKey, internalCallContext);
 
diff --git a/payment/src/main/java/org/killbill/billing/payment/core/sm/DirectPaymentAutomatonDAOHelper.java b/payment/src/main/java/org/killbill/billing/payment/core/sm/DirectPaymentAutomatonDAOHelper.java
index 8f0c1bc..a6e8977 100644
--- a/payment/src/main/java/org/killbill/billing/payment/core/sm/DirectPaymentAutomatonDAOHelper.java
+++ b/payment/src/main/java/org/killbill/billing/payment/core/sm/DirectPaymentAutomatonDAOHelper.java
@@ -29,8 +29,8 @@ import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.osgi.api.OSGIServiceRegistration;
 import org.killbill.billing.payment.api.PaymentApiException;
 import org.killbill.billing.payment.api.PaymentStatus;
-import org.killbill.billing.payment.dao.DirectPaymentModelDao;
-import org.killbill.billing.payment.dao.DirectPaymentTransactionModelDao;
+import org.killbill.billing.payment.dao.PaymentModelDao;
+import org.killbill.billing.payment.dao.PaymentTransactionModelDao;
 import org.killbill.billing.payment.dao.PaymentDao;
 import org.killbill.billing.payment.dao.PaymentMethodModelDao;
 import org.killbill.billing.payment.plugin.api.PaymentPluginApi;
@@ -59,15 +59,15 @@ public class DirectPaymentAutomatonDAOHelper {
     }
 
     public void createNewDirectPaymentTransaction() {
-        final DirectPaymentTransactionModelDao paymentTransactionModelDao;
+        final PaymentTransactionModelDao paymentTransactionModelDao;
         if (directPaymentStateContext.getDirectPaymentId() == null) {
-            final DirectPaymentModelDao newPaymentModelDao = buildNewDirectPaymentModelDao();
-            final DirectPaymentTransactionModelDao newPaymentTransactionModelDao = buildNewDirectPaymentTransactionModelDao(newPaymentModelDao.getId());
+            final PaymentModelDao newPaymentModelDao = buildNewDirectPaymentModelDao();
+            final PaymentTransactionModelDao newPaymentTransactionModelDao = buildNewDirectPaymentTransactionModelDao(newPaymentModelDao.getId());
 
-            final DirectPaymentModelDao paymentModelDao = paymentDao.insertDirectPaymentWithFirstTransaction(newPaymentModelDao, newPaymentTransactionModelDao, internalCallContext);
+            final PaymentModelDao paymentModelDao = paymentDao.insertDirectPaymentWithFirstTransaction(newPaymentModelDao, newPaymentTransactionModelDao, internalCallContext);
             paymentTransactionModelDao = paymentDao.getDirectTransactionsForDirectPayment(paymentModelDao.getId(), internalCallContext).get(0);
         } else {
-            final DirectPaymentTransactionModelDao newPaymentTransactionModelDao = buildNewDirectPaymentTransactionModelDao(directPaymentStateContext.getDirectPaymentId());
+            final PaymentTransactionModelDao newPaymentTransactionModelDao = buildNewDirectPaymentTransactionModelDao(directPaymentStateContext.getDirectPaymentId());
             paymentTransactionModelDao = paymentDao.updateDirectPaymentWithNewTransaction(directPaymentStateContext.getDirectPaymentId(), newPaymentTransactionModelDao, internalCallContext);
         }
 
@@ -114,8 +114,8 @@ public class DirectPaymentAutomatonDAOHelper {
         return getPaymentPluginApi(methodDao.getPluginName());
     }
 
-    public DirectPaymentModelDao getDirectPayment() throws PaymentApiException {
-        final DirectPaymentModelDao paymentModelDao;
+    public PaymentModelDao getDirectPayment() throws PaymentApiException {
+        final PaymentModelDao paymentModelDao;
         paymentModelDao = paymentDao.getDirectPayment(directPaymentStateContext.getDirectPaymentId(), internalCallContext);
         if (paymentModelDao == null) {
             throw new PaymentApiException(ErrorCode.PAYMENT_NO_SUCH_PAYMENT, directPaymentStateContext.getDirectPaymentId());
@@ -123,25 +123,25 @@ public class DirectPaymentAutomatonDAOHelper {
         return paymentModelDao;
     }
 
-    private DirectPaymentModelDao buildNewDirectPaymentModelDao() {
+    private PaymentModelDao buildNewDirectPaymentModelDao() {
         final DateTime createdDate = utcNow;
         final DateTime updatedDate = utcNow;
 
-        return new DirectPaymentModelDao(createdDate,
+        return new PaymentModelDao(createdDate,
                                          updatedDate,
                                          directPaymentStateContext.getAccount().getId(),
                                          directPaymentStateContext.getPaymentMethodId(),
                                          directPaymentStateContext.getDirectPaymentExternalKey());
     }
 
-    private DirectPaymentTransactionModelDao buildNewDirectPaymentTransactionModelDao(final UUID directPaymentId) {
+    private PaymentTransactionModelDao buildNewDirectPaymentTransactionModelDao(final UUID directPaymentId) {
         final DateTime createdDate = utcNow;
         final DateTime updatedDate = utcNow;
         final DateTime effectiveDate = utcNow;
         final String gatewayErrorCode = null;
         final String gatewayErrorMsg = null;
 
-        return new DirectPaymentTransactionModelDao(createdDate,
+        return new PaymentTransactionModelDao(createdDate,
                                                     updatedDate,
                                                     directPaymentStateContext.getDirectPaymentTransactionExternalKey(),
                                                     directPaymentId,
diff --git a/payment/src/main/java/org/killbill/billing/payment/core/sm/DirectPaymentAutomatonRunner.java b/payment/src/main/java/org/killbill/billing/payment/core/sm/DirectPaymentAutomatonRunner.java
index 8ec77e5..d7bc194 100644
--- a/payment/src/main/java/org/killbill/billing/payment/core/sm/DirectPaymentAutomatonRunner.java
+++ b/payment/src/main/java/org/killbill/billing/payment/core/sm/DirectPaymentAutomatonRunner.java
@@ -45,7 +45,7 @@ import org.killbill.billing.osgi.api.OSGIServiceRegistration;
 import org.killbill.billing.payment.api.PaymentApiException;
 import org.killbill.billing.payment.api.PluginProperty;
 import org.killbill.billing.payment.api.TransactionType;
-import org.killbill.billing.payment.dao.DirectPaymentModelDao;
+import org.killbill.billing.payment.dao.PaymentModelDao;
 import org.killbill.billing.payment.dao.PaymentDao;
 import org.killbill.billing.payment.dispatcher.PluginDispatcher;
 import org.killbill.billing.payment.glue.PaymentModule;
@@ -123,9 +123,9 @@ public class DirectPaymentAutomatonRunner {
         final String currentStateMachineName;
         final String currentStateName;
         if (directPaymentId != null) {
-            final DirectPaymentModelDao directPaymentModelDao = daoHelper.getDirectPayment();
-            nonNullPaymentMethodId = directPaymentModelDao.getPaymentMethodId();
-            currentStateName = directPaymentModelDao.getCurrentStateName();
+            final PaymentModelDao paymentModelDao = daoHelper.getDirectPayment();
+            nonNullPaymentMethodId = paymentModelDao.getPaymentMethodId();
+            currentStateName = paymentModelDao.getStateName();
             currentStateMachineName = getStateMachineName(currentStateName);
 
             // Check for illegal states (should never happen)
diff --git a/payment/src/main/java/org/killbill/billing/payment/core/sm/DirectPaymentLeavingStateCallback.java b/payment/src/main/java/org/killbill/billing/payment/core/sm/DirectPaymentLeavingStateCallback.java
index bf9f6bc..223837f 100644
--- a/payment/src/main/java/org/killbill/billing/payment/core/sm/DirectPaymentLeavingStateCallback.java
+++ b/payment/src/main/java/org/killbill/billing/payment/core/sm/DirectPaymentLeavingStateCallback.java
@@ -17,12 +17,9 @@
 
 package org.killbill.billing.payment.core.sm;
 
-import java.util.List;
-
 import org.killbill.automaton.State;
 import org.killbill.automaton.State.LeavingStateCallback;
 import org.killbill.billing.payment.api.PaymentApiException;
-import org.killbill.billing.payment.dao.DirectPaymentTransactionModelDao;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/payment/src/main/java/org/killbill/billing/payment/core/sm/DirectPaymentStateContext.java b/payment/src/main/java/org/killbill/billing/payment/core/sm/DirectPaymentStateContext.java
index dcc542e..3c303e7 100644
--- a/payment/src/main/java/org/killbill/billing/payment/core/sm/DirectPaymentStateContext.java
+++ b/payment/src/main/java/org/killbill/billing/payment/core/sm/DirectPaymentStateContext.java
@@ -27,7 +27,7 @@ import org.killbill.billing.callcontext.InternalCallContext;
 import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.payment.api.PluginProperty;
 import org.killbill.billing.payment.api.TransactionType;
-import org.killbill.billing.payment.dao.DirectPaymentTransactionModelDao;
+import org.killbill.billing.payment.dao.PaymentTransactionModelDao;
 import org.killbill.billing.payment.plugin.api.PaymentTransactionInfoPlugin;
 import org.killbill.billing.util.callcontext.CallContext;
 
@@ -37,7 +37,7 @@ public class DirectPaymentStateContext {
     protected UUID paymentMethodId;
 
     // Stateful objects created by the callbacks and passed to the other following callbacks in the automaton
-    protected DirectPaymentTransactionModelDao directPaymentTransactionModelDao;
+    protected PaymentTransactionModelDao directPaymentTransactionModelDao;
     protected PaymentTransactionInfoPlugin paymentInfoPlugin;
     protected BigDecimal amount;
     protected UUID transactionPaymentId;
@@ -87,11 +87,11 @@ public class DirectPaymentStateContext {
         this.paymentMethodId = paymentMethodId;
     }
 
-    public DirectPaymentTransactionModelDao getDirectPaymentTransactionModelDao() {
+    public PaymentTransactionModelDao getDirectPaymentTransactionModelDao() {
         return directPaymentTransactionModelDao;
     }
 
-    public void setDirectPaymentTransactionModelDao(final DirectPaymentTransactionModelDao directPaymentTransactionModelDao) {
+    public void setDirectPaymentTransactionModelDao(final PaymentTransactionModelDao directPaymentTransactionModelDao) {
         this.directPaymentTransactionModelDao = directPaymentTransactionModelDao;
     }
 
@@ -104,7 +104,7 @@ public class DirectPaymentStateContext {
     }
 
     public UUID getDirectPaymentId() {
-        return directPaymentId != null ? directPaymentId : (directPaymentTransactionModelDao != null ? directPaymentTransactionModelDao.getDirectPaymentId() : null);
+        return directPaymentId != null ? directPaymentId : (directPaymentTransactionModelDao != null ? directPaymentTransactionModelDao.getPaymentId() : null);
     }
 
     public UUID getTransactionPaymentId() {
diff --git a/payment/src/main/java/org/killbill/billing/payment/core/sm/PaymentPluginOperation.java b/payment/src/main/java/org/killbill/billing/payment/core/sm/PaymentPluginOperation.java
new file mode 100644
index 0000000..6316a0c
--- /dev/null
+++ b/payment/src/main/java/org/killbill/billing/payment/core/sm/PaymentPluginOperation.java
@@ -0,0 +1,4 @@
+package org.killbill.billing.payment.core.sm;
+
+public class PaymentPluginOperation {
+}
diff --git a/payment/src/main/java/org/killbill/billing/payment/core/sm/RetryLeavingStateCallback.java b/payment/src/main/java/org/killbill/billing/payment/core/sm/RetryLeavingStateCallback.java
index e7961c5..6b1721c 100644
--- a/payment/src/main/java/org/killbill/billing/payment/core/sm/RetryLeavingStateCallback.java
+++ b/payment/src/main/java/org/killbill/billing/payment/core/sm/RetryLeavingStateCallback.java
@@ -23,7 +23,7 @@ import org.killbill.automaton.State;
 import org.killbill.automaton.State.LeavingStateCallback;
 import org.killbill.billing.payment.api.PluginProperty;
 import org.killbill.billing.payment.api.TransactionType;
-import org.killbill.billing.payment.dao.DirectPaymentModelDao;
+import org.killbill.billing.payment.dao.PaymentModelDao;
 import org.killbill.billing.payment.dao.PaymentAttemptModelDao;
 import org.killbill.billing.payment.dao.PaymentDao;
 import org.killbill.billing.payment.dao.PluginPropertyModelDao;
@@ -60,7 +60,7 @@ public class RetryLeavingStateCallback implements LeavingStateCallback {
         Preconditions.checkState(stateContext.getDirectPaymentExternalKey() != null || /* AUTH, PURCHASE, CREDIT calls will provide the payment  */
                                  stateContext.getDirectPaymentId() != null);
         if (stateContext.getDirectPaymentExternalKey() == null) {
-            final DirectPaymentModelDao payment = paymentDao.getDirectPayment(stateContext.getDirectPaymentId(), stateContext.internalCallContext);
+            final PaymentModelDao payment = paymentDao.getDirectPayment(stateContext.getDirectPaymentId(), stateContext.internalCallContext);
             Preconditions.checkState(payment != null);
             stateContext.setDirectPaymentExternalKey(payment.getExternalKey());
         }
diff --git a/payment/src/main/java/org/killbill/billing/payment/core/sm/retryPluginOperation.java b/payment/src/main/java/org/killbill/billing/payment/core/sm/retryPluginOperation.java
new file mode 100644
index 0000000..80f9881
--- /dev/null
+++ b/payment/src/main/java/org/killbill/billing/payment/core/sm/retryPluginOperation.java
@@ -0,0 +1,4 @@
+package org.killbill.billing.payment.core.sm;
+
+public class retryPluginOperation {
+}
diff --git a/payment/src/main/java/org/killbill/billing/payment/dao/DefaultPaymentDao.java b/payment/src/main/java/org/killbill/billing/payment/dao/DefaultPaymentDao.java
index 6d0e499..52acd01 100644
--- a/payment/src/main/java/org/killbill/billing/payment/dao/DefaultPaymentDao.java
+++ b/payment/src/main/java/org/killbill/billing/payment/dao/DefaultPaymentDao.java
@@ -139,36 +139,36 @@ public class DefaultPaymentDao implements PaymentDao {
     }
 
     @Override
-    public DirectPaymentTransactionModelDao getDirectPaymentTransactionByExternalKey(final String transactionExternalKey, final InternalTenantContext context) {
-        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<DirectPaymentTransactionModelDao>() {
+    public PaymentTransactionModelDao getDirectPaymentTransactionByExternalKey(final String transactionExternalKey, final InternalTenantContext context) {
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<PaymentTransactionModelDao>() {
             @Override
-            public DirectPaymentTransactionModelDao inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
-                return entitySqlDaoWrapperFactory.become(DirectTransactionSqlDao.class).getDirectPaymentTransactionByExternalKey(transactionExternalKey, context);
+            public PaymentTransactionModelDao inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                return entitySqlDaoWrapperFactory.become(TransactionSqlDao.class).getPaymentTransactionByExternalKey(transactionExternalKey, context);
             }
         });
     }
 
     @Override
-    public DirectPaymentModelDao getDirectPaymentByExternalKey(final String paymentExternalKey, final InternalTenantContext context) {
-        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<DirectPaymentModelDao>() {
+    public PaymentModelDao getDirectPaymentByExternalKey(final String paymentExternalKey, final InternalTenantContext context) {
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<PaymentModelDao>() {
             @Override
-            public DirectPaymentModelDao inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
-                return entitySqlDaoWrapperFactory.become(DirectPaymentSqlDao.class).getDirectPaymentByExternalKey(paymentExternalKey, context);
+            public PaymentModelDao inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                return entitySqlDaoWrapperFactory.become(PaymentSqlDao.class).getPaymentByExternalKey(paymentExternalKey, context);
             }
         });
     }
 
     @Override
-    public Pagination<DirectPaymentModelDao> getDirectPayments(final String pluginName, final Long offset, final Long limit, final InternalTenantContext context) {
-        return paginationHelper.getPagination(DirectPaymentSqlDao.class,
-                                              new PaginationIteratorBuilder<DirectPaymentModelDao, DirectPayment, DirectPaymentSqlDao>() {
+    public Pagination<PaymentModelDao> getDirectPayments(final String pluginName, final Long offset, final Long limit, final InternalTenantContext context) {
+        return paginationHelper.getPagination(PaymentSqlDao.class,
+                                              new PaginationIteratorBuilder<PaymentModelDao, DirectPayment, PaymentSqlDao>() {
                                                   @Override
-                                                  public Long getCount(final DirectPaymentSqlDao directPaymentSqlDao, final InternalTenantContext context) {
+                                                  public Long getCount(final PaymentSqlDao directPaymentSqlDao, final InternalTenantContext context) {
                                                       return directPaymentSqlDao.getCountByPluginName(pluginName, context);
                                                   }
 
                                                   @Override
-                                                  public Iterator<DirectPaymentModelDao> build(final DirectPaymentSqlDao directPaymentSqlDao, final Long limit, final InternalTenantContext context) {
+                                                  public Iterator<PaymentModelDao> build(final PaymentSqlDao directPaymentSqlDao, final Long limit, final InternalTenantContext context) {
                                                       return directPaymentSqlDao.getByPluginName(pluginName, offset, limit, context);
                                                   }
                                               },
@@ -179,30 +179,30 @@ public class DefaultPaymentDao implements PaymentDao {
     }
 
     @Override
-    public DirectPaymentModelDao insertDirectPaymentWithFirstTransaction(final DirectPaymentModelDao directPayment, final DirectPaymentTransactionModelDao directPaymentTransaction, final InternalCallContext context) {
+    public PaymentModelDao insertDirectPaymentWithFirstTransaction(final PaymentModelDao directPayment, final PaymentTransactionModelDao directPaymentTransaction, final InternalCallContext context) {
 
-        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<DirectPaymentModelDao>() {
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<PaymentModelDao>() {
 
             @Override
-            public DirectPaymentModelDao inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
-                final DirectPaymentSqlDao directPaymentSqlDao = entitySqlDaoWrapperFactory.become(DirectPaymentSqlDao.class);
+            public PaymentModelDao inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                final PaymentSqlDao directPaymentSqlDao = entitySqlDaoWrapperFactory.become(PaymentSqlDao.class);
                 directPaymentSqlDao.create(directPayment, context);
-                entitySqlDaoWrapperFactory.become(DirectTransactionSqlDao.class).create(directPaymentTransaction, context);
+                entitySqlDaoWrapperFactory.become(TransactionSqlDao.class).create(directPaymentTransaction, context);
                 return directPaymentSqlDao.getById(directPayment.getId().toString(), context);
             }
         });
     }
 
     @Override
-    public DirectPaymentTransactionModelDao updateDirectPaymentWithNewTransaction(final UUID directPaymentId, final DirectPaymentTransactionModelDao directPaymentTransaction, final InternalCallContext context) {
-        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<DirectPaymentTransactionModelDao>() {
+    public PaymentTransactionModelDao updateDirectPaymentWithNewTransaction(final UUID directPaymentId, final PaymentTransactionModelDao directPaymentTransaction, final InternalCallContext context) {
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<PaymentTransactionModelDao>() {
             @Override
-            public DirectPaymentTransactionModelDao inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
-                final DirectTransactionSqlDao transactional = entitySqlDaoWrapperFactory.become(DirectTransactionSqlDao.class);
+            public PaymentTransactionModelDao inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                final TransactionSqlDao transactional = entitySqlDaoWrapperFactory.become(TransactionSqlDao.class);
                 transactional.create(directPaymentTransaction, context);
-                final DirectPaymentTransactionModelDao directPaymentTransactionModelDao = transactional.getById(directPaymentTransaction.getId().toString(), context);
+                final PaymentTransactionModelDao directPaymentTransactionModelDao = transactional.getById(directPaymentTransaction.getId().toString(), context);
 
-                entitySqlDaoWrapperFactory.become(DirectPaymentSqlDao.class).updateDirectPaymentForNewTransaction(directPaymentId.toString(), context);
+                entitySqlDaoWrapperFactory.become(PaymentSqlDao.class).updatePaymentForNewTransaction(directPaymentId.toString(), context);
 
                 return directPaymentTransactionModelDao;
             }
@@ -219,11 +219,11 @@ public class DefaultPaymentDao implements PaymentDao {
 
             @Override
             public Void inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
-                entitySqlDaoWrapperFactory.become(DirectTransactionSqlDao.class).updateTransactionStatus(directTransactionId.toString(),
+                entitySqlDaoWrapperFactory.become(TransactionSqlDao.class).updateTransactionStatus(directTransactionId.toString(),
                                                                                                          processedAmount, processedCurrency == null ? null : processedCurrency.toString(),
                                                                                                          paymentStatus == null ? null : paymentStatus.toString(),
                                                                                                          gatewayErrorCode, gatewayErrorMsg, context);
-                entitySqlDaoWrapperFactory.become(DirectPaymentSqlDao.class).updateCurrentPaymentStateName(directPaymentId.toString(), currentPaymentStateName, context);
+                entitySqlDaoWrapperFactory.become(PaymentSqlDao.class).updatePaymentStateName(directPaymentId.toString(), currentPaymentStateName, context);
                 return null;
             }
         });
@@ -231,53 +231,53 @@ public class DefaultPaymentDao implements PaymentDao {
     }
 
     @Override
-    public DirectPaymentModelDao getDirectPayment(final UUID directPaymentId, final InternalTenantContext context) {
-        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<DirectPaymentModelDao>() {
+    public PaymentModelDao getDirectPayment(final UUID directPaymentId, final InternalTenantContext context) {
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<PaymentModelDao>() {
             @Override
-            public DirectPaymentModelDao inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
-                return entitySqlDaoWrapperFactory.become(DirectPaymentSqlDao.class).getById(directPaymentId.toString(), context);
+            public PaymentModelDao inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                return entitySqlDaoWrapperFactory.become(PaymentSqlDao.class).getById(directPaymentId.toString(), context);
             }
         });
     }
 
     @Override
-    public DirectPaymentTransactionModelDao getDirectPaymentTransaction(final UUID directTransactionId, final InternalTenantContext context) {
-        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<DirectPaymentTransactionModelDao>() {
+    public PaymentTransactionModelDao getDirectPaymentTransaction(final UUID directTransactionId, final InternalTenantContext context) {
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<PaymentTransactionModelDao>() {
             @Override
-            public DirectPaymentTransactionModelDao inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
-                return entitySqlDaoWrapperFactory.become(DirectTransactionSqlDao.class).getById(directTransactionId.toString(), context);
+            public PaymentTransactionModelDao inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                return entitySqlDaoWrapperFactory.become(TransactionSqlDao.class).getById(directTransactionId.toString(), context);
             }
         });
     }
 
     @Override
-    public List<DirectPaymentModelDao> getDirectPaymentsForAccount(final UUID accountId, final InternalTenantContext context) {
+    public List<PaymentModelDao> getDirectPaymentsForAccount(final UUID accountId, final InternalTenantContext context) {
         Preconditions.checkArgument(context.getAccountRecordId() != null);
-        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<DirectPaymentModelDao>>() {
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<PaymentModelDao>>() {
             @Override
-            public List<DirectPaymentModelDao> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
-                return entitySqlDaoWrapperFactory.become(DirectPaymentSqlDao.class).getByAccountRecordId(context);
+            public List<PaymentModelDao> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                return entitySqlDaoWrapperFactory.become(PaymentSqlDao.class).getByAccountRecordId(context);
             }
         });
     }
 
     @Override
-    public List<DirectPaymentTransactionModelDao> getDirectTransactionsForAccount(final UUID accountId, final InternalTenantContext context) {
+    public List<PaymentTransactionModelDao> getDirectTransactionsForAccount(final UUID accountId, final InternalTenantContext context) {
         Preconditions.checkArgument(context.getAccountRecordId() != null);
-        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<DirectPaymentTransactionModelDao>>() {
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<PaymentTransactionModelDao>>() {
             @Override
-            public List<DirectPaymentTransactionModelDao> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
-                return entitySqlDaoWrapperFactory.become(DirectTransactionSqlDao.class).getByAccountRecordId(context);
+            public List<PaymentTransactionModelDao> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                return entitySqlDaoWrapperFactory.become(TransactionSqlDao.class).getByAccountRecordId(context);
             }
         });
     }
 
     @Override
-    public List<DirectPaymentTransactionModelDao> getDirectTransactionsForDirectPayment(final UUID directPaymentId, final InternalTenantContext context) {
-        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<DirectPaymentTransactionModelDao>>() {
+    public List<PaymentTransactionModelDao> getDirectTransactionsForDirectPayment(final UUID directPaymentId, final InternalTenantContext context) {
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<PaymentTransactionModelDao>>() {
             @Override
-            public List<DirectPaymentTransactionModelDao> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
-                return entitySqlDaoWrapperFactory.become(DirectTransactionSqlDao.class).getByDirectPaymentId(directPaymentId, context);
+            public List<PaymentTransactionModelDao> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                return entitySqlDaoWrapperFactory.become(TransactionSqlDao.class).getByPaymentId(directPaymentId, context);
             }
         });
     }
diff --git a/payment/src/main/java/org/killbill/billing/payment/dao/PaymentAttemptModelDao.java b/payment/src/main/java/org/killbill/billing/payment/dao/PaymentAttemptModelDao.java
index 32a1116..bb4ce79 100644
--- a/payment/src/main/java/org/killbill/billing/payment/dao/PaymentAttemptModelDao.java
+++ b/payment/src/main/java/org/killbill/billing/payment/dao/PaymentAttemptModelDao.java
@@ -22,14 +22,14 @@ import javax.annotation.Nullable;
 
 import org.joda.time.DateTime;
 import org.killbill.billing.entity.EntityBase;
-import org.killbill.billing.payment.api.PaymentAttempt;
 import org.killbill.billing.util.dao.TableName;
+import org.killbill.billing.util.entity.Entity;
 import org.killbill.billing.util.entity.dao.EntityModelDao;
 
-public class PaymentAttemptModelDao extends EntityBase implements EntityModelDao<PaymentAttempt> {
+public class PaymentAttemptModelDao extends EntityBase implements EntityModelDao<Entity> {
 
     private String paymentExternalKey;
-    private UUID directTransactionId;
+    private UUID transactionId;
     private String transactionExternalKey;
     private String stateName;
     private String operationName;
@@ -38,11 +38,11 @@ public class PaymentAttemptModelDao extends EntityBase implements EntityModelDao
     public PaymentAttemptModelDao() { /* For the DAO mapper */ }
 
     public PaymentAttemptModelDao(final UUID id, @Nullable final DateTime createdDate, @Nullable final DateTime updatedDate,
-                                  final String paymentExternalKey, final UUID directTransactionId, final String externalKey, final String stateName, final String operationName,
+                                  final String paymentExternalKey, final UUID transactionId, final String externalKey, final String stateName, final String operationName,
                                   final String pluginName) {
         super(id, createdDate, updatedDate);
         this.paymentExternalKey = paymentExternalKey;
-        this.directTransactionId = directTransactionId;
+        this.transactionId = transactionId;
         this.transactionExternalKey = externalKey;
         this.stateName = stateName;
         this.operationName = operationName;
@@ -50,9 +50,9 @@ public class PaymentAttemptModelDao extends EntityBase implements EntityModelDao
     }
 
     public PaymentAttemptModelDao(@Nullable final DateTime createdDate, @Nullable final DateTime updatedDate,
-                                  final String paymentExternalKey, final UUID directTransactionId, final String externalKey, final String stateName, final String operationName,
+                                  final String paymentExternalKey, final UUID transactionId, final String externalKey, final String stateName, final String operationName,
                                   final String pluginName) {
-        this(UUID.randomUUID(), createdDate, updatedDate, paymentExternalKey, directTransactionId, externalKey, stateName, operationName, pluginName);
+        this(UUID.randomUUID(), createdDate, updatedDate, paymentExternalKey, transactionId, externalKey, stateName, operationName, pluginName);
     }
 
     public String getPaymentExternalKey() {
@@ -63,12 +63,12 @@ public class PaymentAttemptModelDao extends EntityBase implements EntityModelDao
         this.paymentExternalKey = paymentExternalKey;
     }
 
-    public UUID getDirectTransactionId() {
-        return directTransactionId;
+    public UUID getTransactionId() {
+        return transactionId;
     }
 
-    public void setDirectTransactionId(final UUID directTransactionId) {
-        this.directTransactionId = directTransactionId;
+    public void setTransactionId(final UUID transactionId) {
+        this.transactionId = transactionId;
     }
 
     public String getTransactionExternalKey() {
@@ -117,7 +117,7 @@ public class PaymentAttemptModelDao extends EntityBase implements EntityModelDao
 
         final PaymentAttemptModelDao that = (PaymentAttemptModelDao) o;
 
-        if (directTransactionId != null ? !directTransactionId.equals(that.directTransactionId) : that.directTransactionId != null) {
+        if (transactionId != null ? !transactionId.equals(that.transactionId) : that.transactionId != null) {
             return false;
         }
         if (paymentExternalKey != null ? !paymentExternalKey.equals(that.paymentExternalKey) : that.paymentExternalKey != null) {
@@ -141,7 +141,7 @@ public class PaymentAttemptModelDao extends EntityBase implements EntityModelDao
     @Override
     public int hashCode() {
         int result = super.hashCode();
-        result = 31 * result + (directTransactionId != null ? directTransactionId.hashCode() : 0);
+        result = 31 * result + (transactionId != null ? transactionId.hashCode() : 0);
         result = 31 * result + (paymentExternalKey != null ? paymentExternalKey.hashCode() : 0);
         result = 31 * result + (transactionExternalKey != null ? transactionExternalKey.hashCode() : 0);
         result = 31 * result + (stateName != null ? stateName.hashCode() : 0);
diff --git a/payment/src/main/java/org/killbill/billing/payment/dao/PaymentAttemptSqlDao.java b/payment/src/main/java/org/killbill/billing/payment/dao/PaymentAttemptSqlDao.java
index 672a49e..cb406d6 100644
--- a/payment/src/main/java/org/killbill/billing/payment/dao/PaymentAttemptSqlDao.java
+++ b/payment/src/main/java/org/killbill/billing/payment/dao/PaymentAttemptSqlDao.java
@@ -23,6 +23,7 @@ import org.killbill.billing.callcontext.InternalCallContext;
 import org.killbill.billing.callcontext.InternalTenantContext;
 import org.killbill.billing.payment.api.PaymentAttempt;
 import org.killbill.billing.util.audit.ChangeType;
+import org.killbill.billing.util.entity.Entity;
 import org.killbill.billing.util.entity.dao.Audited;
 import org.killbill.billing.util.entity.dao.EntitySqlDao;
 import org.killbill.billing.util.entity.dao.EntitySqlDaoStringTemplate;
@@ -32,12 +33,12 @@ import org.skife.jdbi.v2.sqlobject.SqlQuery;
 import org.skife.jdbi.v2.sqlobject.SqlUpdate;
 
 @EntitySqlDaoStringTemplate
-public interface PaymentAttemptSqlDao extends EntitySqlDao<PaymentAttemptModelDao, PaymentAttempt> {
+public interface PaymentAttemptSqlDao extends EntitySqlDao<PaymentAttemptModelDao, Entity> {
 
     @SqlUpdate
     @Audited(ChangeType.UPDATE)
     void updateAttempt(@Bind("id") final String attemptId,
-                       @Bind("directTransactionId") final String transactionId,
+                       @Bind("transactionId") final String transactionId,
                        @Bind("stateName") final String stateName,
                        @BindBean final InternalCallContext context);
 
diff --git a/payment/src/main/java/org/killbill/billing/payment/dao/PaymentDao.java b/payment/src/main/java/org/killbill/billing/payment/dao/PaymentDao.java
index 338e798..ac4e99b 100644
--- a/payment/src/main/java/org/killbill/billing/payment/dao/PaymentDao.java
+++ b/payment/src/main/java/org/killbill/billing/payment/dao/PaymentDao.java
@@ -39,15 +39,15 @@ public interface PaymentDao {
 
     public PaymentAttemptModelDao getPaymentAttemptByExternalKey(String externalKey, InternalTenantContext context);
 
-    public DirectPaymentTransactionModelDao getDirectPaymentTransactionByExternalKey(String transactionExternalKey, InternalTenantContext context);
+    public PaymentTransactionModelDao getDirectPaymentTransactionByExternalKey(String transactionExternalKey, InternalTenantContext context);
 
-    public DirectPaymentModelDao getDirectPaymentByExternalKey(String externalKey, InternalTenantContext context);
+    public PaymentModelDao getDirectPaymentByExternalKey(String externalKey, InternalTenantContext context);
 
-    public Pagination<DirectPaymentModelDao> getDirectPayments(String pluginName, Long offset, Long limit, InternalTenantContext context);
+    public Pagination<PaymentModelDao> getDirectPayments(String pluginName, Long offset, Long limit, InternalTenantContext context);
 
-    public DirectPaymentModelDao insertDirectPaymentWithFirstTransaction(DirectPaymentModelDao directPayment, DirectPaymentTransactionModelDao directPaymentTransaction, InternalCallContext context);
+    public PaymentModelDao insertDirectPaymentWithFirstTransaction(PaymentModelDao directPayment, PaymentTransactionModelDao directPaymentTransaction, InternalCallContext context);
 
-    public DirectPaymentTransactionModelDao updateDirectPaymentWithNewTransaction(UUID directPaymentId, DirectPaymentTransactionModelDao directPaymentTransaction, InternalCallContext context);
+    public PaymentTransactionModelDao updateDirectPaymentWithNewTransaction(UUID directPaymentId, PaymentTransactionModelDao directPaymentTransaction, InternalCallContext context);
 
     public void updateDirectPaymentAndTransactionOnCompletion(UUID directPaymentId, String currentPaymentStateName,
                                                               UUID directTransactionId, PaymentStatus paymentStatus,
@@ -55,15 +55,15 @@ public interface PaymentDao {
                                                               String gatewayErrorCode, String gatewayErrorMsg,
                                                               InternalCallContext context);
 
-    public DirectPaymentModelDao getDirectPayment(UUID directPaymentId, InternalTenantContext context);
+    public PaymentModelDao getDirectPayment(UUID directPaymentId, InternalTenantContext context);
 
-    public DirectPaymentTransactionModelDao getDirectPaymentTransaction(UUID directTransactionId, InternalTenantContext context);
+    public PaymentTransactionModelDao getDirectPaymentTransaction(UUID directTransactionId, InternalTenantContext context);
 
-    public List<DirectPaymentModelDao> getDirectPaymentsForAccount(UUID accountId, InternalTenantContext context);
+    public List<PaymentModelDao> getDirectPaymentsForAccount(UUID accountId, InternalTenantContext context);
 
-    public List<DirectPaymentTransactionModelDao> getDirectTransactionsForAccount(UUID accountId, InternalTenantContext context);
+    public List<PaymentTransactionModelDao> getDirectTransactionsForAccount(UUID accountId, InternalTenantContext context);
 
-    public List<DirectPaymentTransactionModelDao> getDirectTransactionsForDirectPayment(UUID directPaymentId, InternalTenantContext context);
+    public List<PaymentTransactionModelDao> getDirectTransactionsForDirectPayment(UUID directPaymentId, InternalTenantContext context);
 
     public PaymentAttemptModelDao getPaymentAttempt(UUID attemptId, InternalTenantContext context);
 
diff --git a/payment/src/main/resources/org/killbill/billing/payment/dao/PaymentAttemptSqlDao.sql.stg b/payment/src/main/resources/org/killbill/billing/payment/dao/PaymentAttemptSqlDao.sql.stg
index 94f8d9b..1dddcb0 100644
--- a/payment/src/main/resources/org/killbill/billing/payment/dao/PaymentAttemptSqlDao.sql.stg
+++ b/payment/src/main/resources/org/killbill/billing/payment/dao/PaymentAttemptSqlDao.sql.stg
@@ -7,7 +7,7 @@ historyTableName() ::= "payment_attempt_history"
 
 tableFields(prefix) ::= <<
   <prefix>payment_external_key
-, <prefix>direct_transaction_id
+, <prefix>transaction_id
 , <prefix>transaction_external_key
 , <prefix>state_name
 , <prefix>operation_name
@@ -20,7 +20,7 @@ tableFields(prefix) ::= <<
 
 tableValues() ::= <<
   :paymentExternalKey
-, :directTransactionId
+, :transactionId
 , :transactionExternalKey
 , :stateName
 , :operationName
@@ -55,7 +55,7 @@ where payment_external_key = :paymentExternalKey
 updateAttempt() ::= <<
 update <tableName()>
 set state_name = :stateName
-, direct_transaction_id = :directTransactionId
+, transaction_id = :transactionId
 , updated_by = :updatedBy
 , updated_date = :createdDate
 where id = :id
diff --git a/payment/src/main/resources/org/killbill/billing/payment/dao/PaymentSqlDao.sql.stg b/payment/src/main/resources/org/killbill/billing/payment/dao/PaymentSqlDao.sql.stg
index 88bb4b0..b6c7c24 100644
--- a/payment/src/main/resources/org/killbill/billing/payment/dao/PaymentSqlDao.sql.stg
+++ b/payment/src/main/resources/org/killbill/billing/payment/dao/PaymentSqlDao.sql.stg
@@ -1,24 +1,22 @@
 group PaymentSqlDao: EntitySqlDao;
 
+tableName() ::= "payments"
+
+historyTableName() ::= "payment_history"
 
 extraTableFieldsWithComma(prefix) ::= <<
 , <prefix>record_id as payment_number
 >>
 
 defaultOrderBy(prefix) ::= <<
-order by <prefix>effective_date ASC, <recordIdField(prefix)> ASC
+order by <prefix>created_date ASC, <recordIdField(prefix)> ASC
 >>
 
 tableFields(prefix) ::= <<
   <prefix>account_id
-, <prefix>invoice_id
 , <prefix>payment_method_id
-, <prefix>amount
-, <prefix>currency
-, <prefix>processed_amount
-, <prefix>processed_currency
-, <prefix>effective_date
-, <prefix>payment_status
+, <prefix>external_key
+, <prefix>state_name
 , <prefix>created_by
 , <prefix>created_date
 , <prefix>updated_by
@@ -27,76 +25,27 @@ tableFields(prefix) ::= <<
 
 tableValues() ::= <<
   :accountId
-, :invoiceId
 , :paymentMethodId
-, :amount
-, :currency
-, :processedAmount
-, :processedCurrency
-, :effectiveDate
-, :paymentStatus
+, :externalKey
+, :stateName
 , :createdBy
 , :createdDate
 , :updatedBy
 , :updatedDate
 >>
 
-tableName() ::= "payments"
-
-historyTableName() ::= "payment_history"
-
-
-getPaymentsForAccount() ::= <<
-select <allTableFields()>
-, record_id as payment_number
-from payments
-where account_id = :accountId
-<AND_CHECK_TENANT()>
-<defaultOrderBy()>
-;
->>
-
-getPaymentsForInvoice() ::= <<
-select <allTableFields()>
-, record_id as payment_number
-from payments
-where invoice_id = :invoiceId
-<AND_CHECK_TENANT()>
-<defaultOrderBy()>
-;
->>
-
-
-getLastPaymentForAccountAndPaymentMethod() ::= <<
-select <allTableFields()>
-, record_id as payment_number
-from payments
-where account_id = :accountId
-and payment_method_id = :paymentMethodId
-<AND_CHECK_TENANT()>
-order by effective_date desc limit 1
-;
->>
-
-
-updatePaymentStatus() ::= <<
-update payments
-set payment_status = :paymentStatus
-, processed_amount = :processedAmount
-, processed_currency = :processedCurrency
-, updated_by = :updatedBy
+updatePaymentForNewTransaction() ::= <<
+update <tableName()>
+set updated_by = :updatedBy
 , updated_date = :createdDate
 where id = :id
 <AND_CHECK_TENANT()>
 ;
 >>
 
-
-updatePaymentForNewAttempt() ::= <<
+updatePaymentStateName() ::= <<
 update <tableName()>
-set amount = :amount
-, effective_date = :effectiveDate
-, payment_method_id= :paymentMethodId
+set state_name = :stateName
 , updated_by = :updatedBy
 , updated_date = :createdDate
 where id = :id
@@ -104,6 +53,15 @@ where id = :id
 ;
 >>
 
+getPaymentByExternalKey() ::= <<
+select
+<allTableFields("")>
+from <tableName()>
+where external_key = :externalKey
+;
+>>
+
+
 getByPluginName() ::= <<
 select
 <allTableFields("t.")>
diff --git a/payment/src/main/resources/org/killbill/billing/payment/ddl.sql b/payment/src/main/resources/org/killbill/billing/payment/ddl.sql
index 0595b3d..1bcb82b 100644
--- a/payment/src/main/resources/org/killbill/billing/payment/ddl.sql
+++ b/payment/src/main/resources/org/killbill/billing/payment/ddl.sql
@@ -6,11 +6,11 @@ CREATE TABLE payment_attempts (
     record_id int(11) unsigned NOT NULL AUTO_INCREMENT,
     id char(36) NOT NULL,
     payment_external_key char(128) NOT NULL,
-    direct_transaction_id char(36),
+    transaction_id char(36),
     transaction_external_key char(128) NOT NULL,
     state_name varchar(32) NOT NULL,
     operation_name varchar(32) NOT NULL,
-    plugin_name varchar(50),
+    plugin_name varchar(50) NOT NULL,
     created_by varchar(50) NOT NULL,
     created_date datetime NOT NULL,
     updated_by varchar(50) NOT NULL,
@@ -20,7 +20,7 @@ CREATE TABLE payment_attempts (
     PRIMARY KEY (record_id)
 ) /*! CHARACTER SET utf8 COLLATE utf8_bin */;
 CREATE UNIQUE INDEX payment_attempts_id ON payment_attempts(id);
-CREATE INDEX payment_attempts_payment ON payment_attempts(direct_transaction_id);
+CREATE INDEX payment_attempts_payment ON payment_attempts(transaction_id);
 CREATE INDEX payment_attempts_payment_key ON payment_attempts(payment_external_key);
 CREATE INDEX payment_attempts_payment_transaction_key ON payment_attempts(transaction_external_key);
 CREATE INDEX payment_attempts_tenant_account_record_id ON payment_attempts(tenant_record_id, account_record_id);
@@ -31,11 +31,11 @@ CREATE TABLE payment_attempt_history (
     id char(36) NOT NULL,
     target_record_id int(11) unsigned NOT NULL,
     payment_external_key char(128) NOT NULL,
-    direct_transaction_id char(36),
+    transaction_id char(36),
     transaction_external_key char(128) NOT NULL,
     state_name varchar(32) NOT NULL,
     operation_name varchar(32) NOT NULL,
-    plugin_name varchar(50),
+    plugin_name varchar(50) NOT NULL,
     change_type char(6) NOT NULL,
     created_by varchar(50) NOT NULL,
     created_date datetime NOT NULL,
@@ -53,7 +53,7 @@ CREATE TABLE payment_methods (
     record_id int(11) unsigned NOT NULL AUTO_INCREMENT,
     id char(36) NOT NULL,
     account_id char(36) NOT NULL,
-    plugin_name varchar(50) DEFAULT NULL,
+    plugin_name varchar(50) NOT NULL,
     is_active bool DEFAULT true,
     created_by varchar(50) NOT NULL,
     created_date datetime NOT NULL,
@@ -64,6 +64,7 @@ CREATE TABLE payment_methods (
     PRIMARY KEY (record_id)
 ) /*! CHARACTER SET utf8 COLLATE utf8_bin */;
 CREATE UNIQUE INDEX payment_methods_id ON payment_methods(id);
+CREATE INDEX payment_methods_plugin_name ON payment_methods(plugin_name);
 CREATE INDEX payment_methods_active_accnt ON payment_methods(is_active, account_id);
 CREATE INDEX payment_methods_tenant_account_record_id ON payment_methods(tenant_record_id, account_record_id);
 
@@ -73,7 +74,7 @@ CREATE TABLE payment_method_history (
     id char(36) NOT NULL,
     target_record_id int(11) unsigned NOT NULL,
     account_id char(36) NOT NULL,
-    plugin_name varchar(50) DEFAULT NULL,
+    plugin_name varchar(50) NOT NULL,
     is_active bool DEFAULT true,
     change_type char(6) NOT NULL,
     created_by varchar(50) NOT NULL,
@@ -88,16 +89,14 @@ CREATE INDEX payment_method_history_target_record_id ON payment_method_history(t
 CREATE INDEX payment_method_history_tenant_account_record_id ON payment_method_history(tenant_record_id, account_record_id);
 
 
-DROP TABLE IF EXISTS direct_payments;
-CREATE TABLE direct_payments (
+DROP TABLE IF EXISTS payments;
+CREATE TABLE payments (
     record_id int(11) unsigned NOT NULL AUTO_INCREMENT,
     id char(36) NOT NULL,
     account_id char(36) NOT NULL,
     payment_method_id char(36) NOT NULL,
     external_key varchar(255) NOT NULL,
-    current_state_name varchar(255),
-    ext_first_payment_ref_id varchar(128),
-    ext_second_payment_ref_id varchar(128),
+    state_name varchar(64) NOT NULL,
     created_by varchar(50) NOT NULL,
     created_date datetime NOT NULL,
     updated_by varchar(50) NOT NULL,
@@ -106,23 +105,21 @@ CREATE TABLE direct_payments (
     tenant_record_id int(11) unsigned DEFAULT NULL,
     PRIMARY KEY (record_id)
 ) /*! CHARACTER SET utf8 COLLATE utf8_bin */;
-CREATE UNIQUE INDEX direct_payments_id ON direct_payments(id);
-CREATE UNIQUE INDEX direct_payments_key ON direct_payments(external_key);
-CREATE INDEX direct_payments_accnt ON direct_payments(account_id);
-CREATE INDEX direct_payments_tenant_account_record_id ON direct_payments(tenant_record_id, account_record_id);
+CREATE UNIQUE INDEX payments_id ON payments(id);
+CREATE UNIQUE INDEX payments_key ON payments(external_key);
+CREATE INDEX payments_accnt ON payments(account_id);
+CREATE INDEX payments_tenant_account_record_id ON payments(tenant_record_id, account_record_id);
 
 
-DROP TABLE IF EXISTS direct_payment_history;
-CREATE TABLE direct_payment_history (
+DROP TABLE IF EXISTS payment_history;
+CREATE TABLE payment_history (
     record_id int(11) unsigned NOT NULL AUTO_INCREMENT,
     id char(36) NOT NULL,
     target_record_id int(11) unsigned NOT NULL,
     account_id char(36) NOT NULL,
     payment_method_id char(36) NOT NULL,
     external_key varchar(255) NOT NULL,
-    current_state_name varchar(255),
-    ext_first_payment_ref_id varchar(128),
-    ext_second_payment_ref_id varchar(128),
+    state_name varchar(64) NOT NULL,
     change_type char(6) NOT NULL,
     created_by varchar(50) NOT NULL,
     created_date datetime NOT NULL,
@@ -132,27 +129,25 @@ CREATE TABLE direct_payment_history (
     tenant_record_id int(11) unsigned DEFAULT NULL,
     PRIMARY KEY(record_id)
 ) /*! CHARACTER SET utf8 COLLATE utf8_bin */;
-CREATE INDEX direct_payment_history_target_record_id ON direct_payment_history(target_record_id);
-CREATE INDEX direct_payment_history_tenant_account_record_id ON direct_payment_history(tenant_record_id, account_record_id);
+CREATE INDEX payment_history_target_record_id ON payment_history(target_record_id);
+CREATE INDEX payment_history_tenant_account_record_id ON payment_history(tenant_record_id, account_record_id);
 
 
-DROP TABLE IF EXISTS direct_transactions;
-CREATE TABLE direct_transactions (
+DROP TABLE IF EXISTS transactions;
+CREATE TABLE transactions (
     record_id int(11) unsigned NOT NULL AUTO_INCREMENT,
     id char(36) NOT NULL,
     transaction_external_key varchar(255) NOT NULL,
     transaction_type varchar(32) NOT NULL,
     effective_date datetime NOT NULL,
-    payment_status varchar(50),
+    transaction_status varchar(50) NOT NULL,
     amount numeric(15,9),
     currency char(3),
     processed_amount numeric(15,9),
     processed_currency char(3),
-    direct_payment_id char(36) NOT NULL,
+    payment_id char(36) NOT NULL,
     gateway_error_code varchar(32),
     gateway_error_msg varchar(256),
-    ext_first_payment_ref_id varchar(128),
-    ext_second_payment_ref_id varchar(128),
     created_by varchar(50) NOT NULL,
     created_date datetime NOT NULL,
     updated_by varchar(50) NOT NULL,
@@ -161,29 +156,27 @@ CREATE TABLE direct_transactions (
     tenant_record_id int(11) unsigned DEFAULT NULL,
     PRIMARY KEY (record_id)
 ) /*! CHARACTER SET utf8 COLLATE utf8_bin */;
-CREATE UNIQUE INDEX direct_transactions_id ON direct_transactions(id);
-CREATE INDEX direct_transactions_direct_id ON direct_transactions(direct_payment_id);
-CREATE UNIQUE INDEX direct_transactions_direct_key ON direct_transactions(transaction_external_key, payment_status);
-CREATE INDEX direct_transactions_tenant_account_record_id ON direct_transactions(tenant_record_id, account_record_id);
+CREATE UNIQUE INDEX transactions_id ON transactions(id);
+CREATE INDEX transactions_id ON transactions(payment_id);
+CREATE INDEX transactions_key ON transactions(transaction_external_key);
+CREATE INDEX transactions_tenant_account_record_id ON transactions(tenant_record_id, account_record_id);
 
-DROP TABLE IF EXISTS direct_transaction_history;
-CREATE TABLE direct_transaction_history (
+DROP TABLE IF EXISTS transaction_history;
+CREATE TABLE transaction_history (
     record_id int(11) unsigned NOT NULL AUTO_INCREMENT,
     id char(36) NOT NULL,
     transaction_external_key varchar(255) NOT NULL,
     target_record_id int(11) unsigned NOT NULL,
     transaction_type varchar(32) NOT NULL,
     effective_date datetime NOT NULL,
-    payment_status varchar(50),
+    transaction_status varchar(50) NOT NULL,
     amount numeric(15,9),
     currency char(3),
     processed_amount numeric(15,9),
     processed_currency char(3),
-    direct_payment_id char(36) NOT NULL,
+    payment_id char(36) NOT NULL,
     gateway_error_code varchar(32),
     gateway_error_msg varchar(256),
-    ext_first_payment_ref_id varchar(128),
-    ext_second_payment_ref_id varchar(128),
     change_type char(6) NOT NULL,
     created_by varchar(50) NOT NULL,
     created_date datetime NOT NULL,
@@ -193,8 +186,8 @@ CREATE TABLE direct_transaction_history (
     tenant_record_id int(11) unsigned DEFAULT NULL,
     PRIMARY KEY (record_id)
 ) /*! CHARACTER SET utf8 COLLATE utf8_bin */;
-CREATE INDEX direct_transaction_history_target_record_id ON direct_transaction_history(target_record_id);
-CREATE INDEX direct_transaction_history_tenant_account_record_id ON direct_transaction_history(tenant_record_id, account_record_id);
+CREATE INDEX transaction_history_target_record_id ON transaction_history(target_record_id);
+CREATE INDEX transaction_history_tenant_account_record_id ON transaction_history(tenant_record_id, account_record_id);
 
 DROP TABLE IF EXISTS payment_plugin_properties;
 CREATE TABLE payment_plugin_properties (
@@ -215,16 +208,21 @@ CREATE INDEX payment_plugin_properties_ext ON payment_plugin_properties(transact
 DROP TABLE IF EXISTS _invoice_payment_control_plugin_auto_pay_off;
 CREATE TABLE _invoice_payment_control_plugin_auto_pay_off (
     record_id int(11) unsigned NOT NULL AUTO_INCREMENT,
-    payment_external_key varchar(255),
-    transaction_external_key varchar(255),
+    id char(36) NOT NULL,
+    payment_external_key varchar(255) NOT NULL,
+    transaction_external_key varchar(255) NOT NULL,
     account_id char(36) NOT NULL,
-    plugin_name varchar(50) DEFAULT NULL,
+    plugin_name varchar(50) NOT NULL,
     payment_id char(36),
     payment_method_id char(36) NOT NULL,
     amount numeric(15,9),
     currency char(3),
     created_by varchar(50) NOT NULL,
     created_date datetime NOT NULL,
+    updated_by varchar(50) NOT NULL,
+    updated_date datetime NOT NULL,
+    account_record_id int(11) unsigned DEFAULT NULL,
+    tenant_record_id int(11) unsigned DEFAULT NULL,
     PRIMARY KEY (record_id)
 ) /*! CHARACTER SET utf8 COLLATE utf8_bin */;
 CREATE INDEX _invoice_payment_control_plugin_auto_pay_off_account ON _invoice_payment_control_plugin_auto_pay_off(account_id);
diff --git a/payment/src/test/java/org/killbill/billing/payment/core/sm/MockRetryAuthorizeOperationCallback.java b/payment/src/test/java/org/killbill/billing/payment/core/sm/MockRetryAuthorizeOperationCallback.java
index 3a799cf..e009298 100644
--- a/payment/src/test/java/org/killbill/billing/payment/core/sm/MockRetryAuthorizeOperationCallback.java
+++ b/payment/src/test/java/org/killbill/billing/payment/core/sm/MockRetryAuthorizeOperationCallback.java
@@ -27,8 +27,8 @@ import org.killbill.billing.payment.api.DirectPaymentTransaction;
 import org.killbill.billing.payment.api.PaymentApiException;
 import org.killbill.billing.payment.api.PaymentStatus;
 import org.killbill.billing.payment.core.DirectPaymentProcessor;
-import org.killbill.billing.payment.dao.DirectPaymentModelDao;
-import org.killbill.billing.payment.dao.DirectPaymentTransactionModelDao;
+import org.killbill.billing.payment.dao.PaymentModelDao;
+import org.killbill.billing.payment.dao.PaymentTransactionModelDao;
 import org.killbill.billing.payment.dao.PaymentDao;
 import org.killbill.billing.payment.dispatcher.PluginDispatcher;
 import org.killbill.billing.retry.plugin.api.PaymentControlPluginApi;
@@ -58,13 +58,13 @@ public class MockRetryAuthorizeOperationCallback extends RetryAuthorizeOperation
                 throw new RuntimeException(exception);
             }
         }
-        final DirectPaymentModelDao payment = new DirectPaymentModelDao(clock.getUTCNow(),
+        final PaymentModelDao payment = new PaymentModelDao(clock.getUTCNow(),
                                                                         clock.getUTCNow(),
                                                                         directPaymentStateContext.account.getId(),
                                                                         directPaymentStateContext.paymentMethodId,
                                                                         directPaymentStateContext.directPaymentExternalKey);
 
-        final DirectPaymentTransactionModelDao transaction = new DirectPaymentTransactionModelDao(clock.getUTCNow(),
+        final PaymentTransactionModelDao transaction = new PaymentTransactionModelDao(clock.getUTCNow(),
                                                                                                   clock.getUTCNow(),
                                                                                                   directPaymentStateContext.directPaymentTransactionExternalKey,
                                                                                                   directPaymentStateContext.directPaymentId,
@@ -75,12 +75,12 @@ public class MockRetryAuthorizeOperationCallback extends RetryAuthorizeOperation
                                                                                                   directPaymentStateContext.currency,
                                                                                                   "",
                                                                                                   "");
-        final DirectPaymentModelDao paymentModelDao = paymentDao.insertDirectPaymentWithFirstTransaction(payment, transaction, directPaymentStateContext.internalCallContext);
+        final PaymentModelDao paymentModelDao = paymentDao.insertDirectPaymentWithFirstTransaction(payment, transaction, directPaymentStateContext.internalCallContext);
         final DirectPaymentTransaction convertedTransaction = new DefaultDirectPaymentTransaction(transaction.getId(),
                                                                                                   transaction.getTransactionExternalKey(),
                                                                                                   transaction.getCreatedDate(),
                                                                                                   transaction.getUpdatedDate(),
-                                                                                                  transaction.getDirectPaymentId(),
+                                                                                                  transaction.getPaymentId(),
                                                                                                   transaction.getTransactionType(),
                                                                                                   transaction.getEffectiveDate(),
                                                                                                   transaction.getPaymentStatus(),
diff --git a/payment/src/test/java/org/killbill/billing/payment/core/sm/TestDirectPaymentAutomatonDAOHelper.java b/payment/src/test/java/org/killbill/billing/payment/core/sm/TestDirectPaymentAutomatonDAOHelper.java
index de4d65b..2562aed 100644
--- a/payment/src/test/java/org/killbill/billing/payment/core/sm/TestDirectPaymentAutomatonDAOHelper.java
+++ b/payment/src/test/java/org/killbill/billing/payment/core/sm/TestDirectPaymentAutomatonDAOHelper.java
@@ -30,7 +30,7 @@ import org.killbill.billing.payment.api.PaymentApiException;
 import org.killbill.billing.payment.api.PaymentStatus;
 import org.killbill.billing.payment.api.PluginProperty;
 import org.killbill.billing.payment.api.TransactionType;
-import org.killbill.billing.payment.dao.DirectPaymentModelDao;
+import org.killbill.billing.payment.dao.PaymentModelDao;
 import org.killbill.billing.payment.plugin.api.PaymentTransactionInfoPlugin;
 import org.killbill.billing.payment.plugin.api.PaymentPluginStatus;
 import org.mockito.Mockito;
@@ -66,9 +66,9 @@ public class TestDirectPaymentAutomatonDAOHelper extends PaymentTestSuiteWithEmb
         final DirectPaymentAutomatonDAOHelper daoHelper = createDAOHelper(null, directPaymentExternalKey, directPaymentTransactionExternalKey, amount, currency);
         daoHelper.createNewDirectPaymentTransaction();
 
-        final DirectPaymentModelDao directPayment1 = daoHelper.getDirectPayment();
+        final PaymentModelDao directPayment1 = daoHelper.getDirectPayment();
         Assert.assertEquals(directPayment1.getExternalKey(), directPaymentExternalKey);
-        Assert.assertNull(directPayment1.getCurrentStateName());
+        Assert.assertNull(directPayment1.getStateName());
         Assert.assertEquals(directPaymentStateContext.getDirectPaymentTransactionModelDao().getTransactionExternalKey(), directPaymentTransactionExternalKey);
         Assert.assertEquals(directPaymentStateContext.getDirectPaymentTransactionModelDao().getAmount().compareTo(amount), 0);
         Assert.assertEquals(directPaymentStateContext.getDirectPaymentTransactionModelDao().getCurrency(), currency);
@@ -82,10 +82,10 @@ public class TestDirectPaymentAutomatonDAOHelper extends PaymentTestSuiteWithEmb
         Mockito.when(paymentInfoPlugin.getGatewayError()).thenReturn(UUID.randomUUID().toString());
         daoHelper.processPaymentInfoPlugin(PaymentStatus.SUCCESS, paymentInfoPlugin, "SOME_STATE");
 
-        final DirectPaymentModelDao directPayment2 = daoHelper.getDirectPayment();
+        final PaymentModelDao directPayment2 = daoHelper.getDirectPayment();
         Assert.assertEquals(directPayment2.getExternalKey(), directPaymentExternalKey);
-        Assert.assertEquals(directPayment2.getCurrentStateName(), "SOME_STATE");
-        Assert.assertEquals(directPaymentStateContext.getDirectPaymentTransactionModelDao().getDirectPaymentId(), directPayment2.getId());
+        Assert.assertEquals(directPayment2.getStateName(), "SOME_STATE");
+        Assert.assertEquals(directPaymentStateContext.getDirectPaymentTransactionModelDao().getPaymentId(), directPayment2.getId());
         Assert.assertEquals(directPaymentStateContext.getDirectPaymentTransactionModelDao().getTransactionExternalKey(), directPaymentTransactionExternalKey);
         Assert.assertEquals(directPaymentStateContext.getDirectPaymentTransactionModelDao().getPaymentStatus(), PaymentStatus.SUCCESS);
         Assert.assertEquals(directPaymentStateContext.getDirectPaymentTransactionModelDao().getAmount().compareTo(amount), 0);
diff --git a/payment/src/test/java/org/killbill/billing/payment/core/sm/TestDirectPaymentEnteringStateCallback.java b/payment/src/test/java/org/killbill/billing/payment/core/sm/TestDirectPaymentEnteringStateCallback.java
index d040cc6..c13bc17 100644
--- a/payment/src/test/java/org/killbill/billing/payment/core/sm/TestDirectPaymentEnteringStateCallback.java
+++ b/payment/src/test/java/org/killbill/billing/payment/core/sm/TestDirectPaymentEnteringStateCallback.java
@@ -31,7 +31,7 @@ import org.killbill.billing.payment.api.PaymentApiException;
 import org.killbill.billing.payment.api.PaymentStatus;
 import org.killbill.billing.payment.api.PluginProperty;
 import org.killbill.billing.payment.api.TransactionType;
-import org.killbill.billing.payment.dao.DirectPaymentTransactionModelDao;
+import org.killbill.billing.payment.dao.PaymentTransactionModelDao;
 import org.killbill.billing.payment.plugin.api.PaymentTransactionInfoPlugin;
 import org.killbill.billing.payment.plugin.api.PaymentPluginStatus;
 import org.mockito.Mockito;
@@ -93,7 +93,7 @@ public class TestDirectPaymentEnteringStateCallback extends PaymentTestSuiteWith
         callback.enteringState(state, operationCallback, operationResult, leavingStateCallback);
 
         // Verify the updated transaction
-        final DirectPaymentTransactionModelDao directPaymentTransaction = paymentDao.getDirectPaymentTransaction(directPaymentStateContext.getDirectPaymentTransactionModelDao().getId(), internalCallContext);
+        final PaymentTransactionModelDao directPaymentTransaction = paymentDao.getDirectPaymentTransaction(directPaymentStateContext.getDirectPaymentTransactionModelDao().getId(), internalCallContext);
         Assert.assertEquals(directPaymentTransaction.getAmount().compareTo(directPaymentStateContext.getAmount()), 0);
         Assert.assertEquals(directPaymentTransaction.getCurrency(), directPaymentStateContext.getCurrency());
         Assert.assertEquals(directPaymentTransaction.getProcessedAmount().compareTo(paymentInfoPlugin.getAmount()), 0);
diff --git a/payment/src/test/java/org/killbill/billing/payment/core/sm/TestDirectPaymentLeavingStateCallback.java b/payment/src/test/java/org/killbill/billing/payment/core/sm/TestDirectPaymentLeavingStateCallback.java
index f232c8f..f97f903 100644
--- a/payment/src/test/java/org/killbill/billing/payment/core/sm/TestDirectPaymentLeavingStateCallback.java
+++ b/payment/src/test/java/org/killbill/billing/payment/core/sm/TestDirectPaymentLeavingStateCallback.java
@@ -30,8 +30,8 @@ import org.killbill.billing.payment.api.PaymentApiException;
 import org.killbill.billing.payment.api.PaymentStatus;
 import org.killbill.billing.payment.api.PluginProperty;
 import org.killbill.billing.payment.api.TransactionType;
-import org.killbill.billing.payment.dao.DirectPaymentModelDao;
-import org.killbill.billing.payment.dao.DirectPaymentTransactionModelDao;
+import org.killbill.billing.payment.dao.PaymentModelDao;
+import org.killbill.billing.payment.dao.PaymentTransactionModelDao;
 import org.mockito.Mockito;
 import org.testng.Assert;
 import org.testng.annotations.Test;
@@ -55,9 +55,9 @@ public class TestDirectPaymentLeavingStateCallback extends PaymentTestSuiteWithE
         verifyDirectPaymentTransaction();
 
         // Verify a new payment was created
-        final DirectPaymentModelDao directPayment = paymentDao.getDirectPayment(directPaymentStateContext.getDirectPaymentTransactionModelDao().getDirectPaymentId(), internalCallContext);
+        final PaymentModelDao directPayment = paymentDao.getDirectPayment(directPaymentStateContext.getDirectPaymentTransactionModelDao().getPaymentId(), internalCallContext);
         Assert.assertEquals(directPayment.getExternalKey(), directPaymentStateContext.getDirectPaymentExternalKey());
-        Assert.assertNull(directPayment.getCurrentStateName());
+        Assert.assertNull(directPayment.getStateName());
 
         // Verify the direct payment has only one transaction
         Assert.assertEquals(paymentDao.getDirectTransactionsForDirectPayment(directPayment.getId(), internalCallContext).size(), 1);
@@ -81,7 +81,7 @@ public class TestDirectPaymentLeavingStateCallback extends PaymentTestSuiteWithE
     }
 
     private void verifyDirectPaymentTransaction() {
-        Assert.assertNotNull(directPaymentStateContext.getDirectPaymentTransactionModelDao().getDirectPaymentId());
+        Assert.assertNotNull(directPaymentStateContext.getDirectPaymentTransactionModelDao().getPaymentId());
         Assert.assertEquals(directPaymentStateContext.getDirectPaymentTransactionModelDao().getTransactionExternalKey(), directPaymentStateContext.getDirectPaymentTransactionExternalKey());
         Assert.assertEquals(directPaymentStateContext.getDirectPaymentTransactionModelDao().getPaymentStatus(), PaymentStatus.UNKNOWN);
         Assert.assertEquals(directPaymentStateContext.getDirectPaymentTransactionModelDao().getAmount().compareTo(directPaymentStateContext.getAmount()), 0);
@@ -110,7 +110,7 @@ public class TestDirectPaymentLeavingStateCallback extends PaymentTestSuiteWithE
 
         if (directPaymentId != null) {
             // Create the first payment manually
-            final DirectPaymentModelDao newPaymentModelDao = new DirectPaymentModelDao(directPaymentId,
+            final PaymentModelDao newPaymentModelDao = new PaymentModelDao(directPaymentId,
                                                                                        clock.getUTCNow(),
                                                                                        clock.getUTCNow(),
                                                                                        directPaymentStateContext.getAccount().getId(),
@@ -118,7 +118,7 @@ public class TestDirectPaymentLeavingStateCallback extends PaymentTestSuiteWithE
                                                                                        1,
                                                                                        directPaymentStateContext.getDirectPaymentExternalKey(),
                                                                                        null, null);
-            final DirectPaymentTransactionModelDao newPaymentTransactionModelDao = new DirectPaymentTransactionModelDao(clock.getUTCNow(),
+            final PaymentTransactionModelDao newPaymentTransactionModelDao = new PaymentTransactionModelDao(clock.getUTCNow(),
                                                                                                                         clock.getUTCNow(),
                                                                                                                         directPaymentStateContext.getDirectPaymentTransactionExternalKey(),
                                                                                                                         directPaymentId,
diff --git a/payment/src/test/java/org/killbill/billing/payment/core/sm/TestRetryableDirectPayment.java b/payment/src/test/java/org/killbill/billing/payment/core/sm/TestRetryableDirectPayment.java
index 6c4ecf1..fdec68a 100644
--- a/payment/src/test/java/org/killbill/billing/payment/core/sm/TestRetryableDirectPayment.java
+++ b/payment/src/test/java/org/killbill/billing/payment/core/sm/TestRetryableDirectPayment.java
@@ -39,8 +39,8 @@ import org.killbill.billing.payment.api.PluginProperty;
 import org.killbill.billing.payment.api.TransactionType;
 import org.killbill.billing.payment.core.DirectPaymentProcessor;
 import org.killbill.billing.payment.core.PluginControlledPaymentProcessor;
-import org.killbill.billing.payment.dao.DirectPaymentModelDao;
-import org.killbill.billing.payment.dao.DirectPaymentTransactionModelDao;
+import org.killbill.billing.payment.dao.PaymentModelDao;
+import org.killbill.billing.payment.dao.PaymentTransactionModelDao;
 import org.killbill.billing.payment.dao.MockPaymentDao;
 import org.killbill.billing.payment.dao.PaymentAttemptModelDao;
 import org.killbill.billing.payment.dao.PaymentDao;
@@ -588,8 +588,8 @@ public class TestRetryableDirectPayment extends PaymentTestSuiteNoDB {
         final UUID directPaymentId = UUID.randomUUID();
         paymentDao.insertPaymentAttemptWithProperties(new PaymentAttemptModelDao(utcNow, utcNow, directPaymentExternalKey, directTransactionId, directPaymentTransactionExternalKey, state.getName(), TransactionType.AUTHORIZE.name(), null),
                                                       ImmutableList.<PluginPropertyModelDao>of(), internalCallContext);
-        paymentDao.insertDirectPaymentWithFirstTransaction(new DirectPaymentModelDao(directPaymentId, utcNow, utcNow, account.getId(), paymentMethodId, -1, directPaymentExternalKey, null, null),
-                                                           new DirectPaymentTransactionModelDao(directTransactionId, directPaymentTransactionExternalKey, utcNow, utcNow, directPaymentId, TransactionType.AUTHORIZE, utcNow, PaymentStatus.PAYMENT_FAILURE, amount, currency, "bla", "foo", null, null),
+        paymentDao.insertDirectPaymentWithFirstTransaction(new PaymentModelDao(directPaymentId, utcNow, utcNow, account.getId(), paymentMethodId, -1, directPaymentExternalKey, null, null),
+                                                           new PaymentTransactionModelDao(directTransactionId, directPaymentTransactionExternalKey, utcNow, utcNow, directPaymentId, TransactionType.AUTHORIZE, utcNow, PaymentStatus.PAYMENT_FAILURE, amount, currency, "bla", "foo"),
                                                            internalCallContext);
 
         processor.retryPaymentTransaction(directPaymentTransactionExternalKey, MockPaymentControlProviderPlugin.PLUGIN_NAME, internalCallContext);
@@ -619,9 +619,9 @@ public class TestRetryableDirectPayment extends PaymentTestSuiteNoDB {
         final UUID directPaymentId = UUID.randomUUID();
         paymentDao.insertPaymentAttemptWithProperties(new PaymentAttemptModelDao(utcNow, utcNow, directPaymentExternalKey, directTransactionId, directPaymentTransactionExternalKey, state.getName(), TransactionType.AUTHORIZE.name(), null),
                                                       ImmutableList.<PluginPropertyModelDao>of(), internalCallContext);
-        paymentDao.insertDirectPaymentWithFirstTransaction(new DirectPaymentModelDao(directPaymentId, utcNow, utcNow, account.getId(), paymentMethodId, -1, directPaymentExternalKey, null, null),
-                                                           new DirectPaymentTransactionModelDao(directTransactionId, directPaymentTransactionExternalKey, utcNow, utcNow, directPaymentId, TransactionType.AUTHORIZE, utcNow,
-                                                                                                PaymentStatus.PAYMENT_FAILURE, amount, currency, "bla", "foo", null, null),
+        paymentDao.insertDirectPaymentWithFirstTransaction(new PaymentModelDao(directPaymentId, utcNow, utcNow, account.getId(), paymentMethodId, -1, directPaymentExternalKey, null, null),
+                                                           new PaymentTransactionModelDao(directTransactionId, directPaymentTransactionExternalKey, utcNow, utcNow, directPaymentId, TransactionType.AUTHORIZE, utcNow,
+                                                                                                PaymentStatus.PAYMENT_FAILURE, amount, currency, "bla", "foo"),
                                                            internalCallContext
                                                           );
 
@@ -657,9 +657,9 @@ public class TestRetryableDirectPayment extends PaymentTestSuiteNoDB {
             final UUID directPaymentId = UUID.randomUUID();
             paymentDao.insertPaymentAttemptWithProperties(new PaymentAttemptModelDao(utcNow, utcNow, directPaymentExternalKey, directTransactionId, directPaymentTransactionExternalKey, state.getName(), TransactionType.AUTHORIZE.name(), null),
                                                           ImmutableList.<PluginPropertyModelDao>of(), internalCallContext);
-            paymentDao.insertDirectPaymentWithFirstTransaction(new DirectPaymentModelDao(directPaymentId, utcNow, utcNow, account.getId(), paymentMethodId, -1, directPaymentExternalKey, null, null),
-                                                               new DirectPaymentTransactionModelDao(directTransactionId, directPaymentTransactionExternalKey, utcNow, utcNow, directPaymentId, TransactionType.AUTHORIZE, utcNow,
-                                                                                                    PaymentStatus.PAYMENT_FAILURE, amount, currency, "bla", "foo", null, null),
+            paymentDao.insertDirectPaymentWithFirstTransaction(new PaymentModelDao(directPaymentId, utcNow, utcNow, account.getId(), paymentMethodId, -1, directPaymentExternalKey, null, null),
+                                                               new PaymentTransactionModelDao(directTransactionId, directPaymentTransactionExternalKey, utcNow, utcNow, directPaymentId, TransactionType.AUTHORIZE, utcNow,
+                                                                                                    PaymentStatus.PAYMENT_FAILURE, amount, currency, "bla", "foo"),
                                                                internalCallContext
                                                               );
 
diff --git a/payment/src/test/java/org/killbill/billing/payment/dao/MockPaymentDao.java b/payment/src/test/java/org/killbill/billing/payment/dao/MockPaymentDao.java
index d8cb9c5..7ed075f 100644
--- a/payment/src/test/java/org/killbill/billing/payment/dao/MockPaymentDao.java
+++ b/payment/src/test/java/org/killbill/billing/payment/dao/MockPaymentDao.java
@@ -37,8 +37,8 @@ import com.google.common.collect.Iterables;
 
 public class MockPaymentDao implements PaymentDao {
 
-    private final Map<UUID, DirectPaymentModelDao> payments = new HashMap<UUID, DirectPaymentModelDao>();
-    private final Map<UUID, DirectPaymentTransactionModelDao> transactions = new HashMap<UUID, DirectPaymentTransactionModelDao>();
+    private final Map<UUID, PaymentModelDao> payments = new HashMap<UUID, PaymentModelDao>();
+    private final Map<UUID, PaymentTransactionModelDao> transactions = new HashMap<UUID, PaymentTransactionModelDao>();
     private final Map<String, PaymentAttemptModelDao> attempts = new HashMap<String, PaymentAttemptModelDao>();
 
     public void reset() {
@@ -67,7 +67,7 @@ public class MockPaymentDao implements PaymentDao {
             for (PaymentAttemptModelDao cur : attempts.values()) {
                 if (cur.getId().equals(paymentAttemptId)) {
                     cur.setStateName(state);
-                    cur.setDirectTransactionId(transactionId);
+                    cur.setTransactionId(transactionId);
                     success = true;
                     break;
                 }
@@ -97,9 +97,9 @@ public class MockPaymentDao implements PaymentDao {
     }
 
     @Override
-    public DirectPaymentTransactionModelDao getDirectPaymentTransactionByExternalKey(final String transactionExternalKey, final InternalTenantContext context) {
+    public PaymentTransactionModelDao getDirectPaymentTransactionByExternalKey(final String transactionExternalKey, final InternalTenantContext context) {
         synchronized (this) {
-            for (DirectPaymentTransactionModelDao cur : transactions.values()) {
+            for (PaymentTransactionModelDao cur : transactions.values()) {
                 if (cur.getTransactionExternalKey().equals(transactionExternalKey)) {
                     return cur;
                 }
@@ -109,9 +109,9 @@ public class MockPaymentDao implements PaymentDao {
     }
 
     @Override
-    public DirectPaymentModelDao getDirectPaymentByExternalKey(final String externalKey, final InternalTenantContext context) {
+    public PaymentModelDao getDirectPaymentByExternalKey(final String externalKey, final InternalTenantContext context) {
         synchronized (this) {
-            for (DirectPaymentModelDao cur : payments.values()) {
+            for (PaymentModelDao cur : payments.values()) {
                 if (cur.getExternalKey().equals(externalKey)) {
                     return cur;
                 }
@@ -121,12 +121,12 @@ public class MockPaymentDao implements PaymentDao {
     }
 
     @Override
-    public Pagination<DirectPaymentModelDao> getDirectPayments(final String pluginName, final Long offset, final Long limit, final InternalTenantContext context) {
+    public Pagination<PaymentModelDao> getDirectPayments(final String pluginName, final Long offset, final Long limit, final InternalTenantContext context) {
         return null;
     }
 
     @Override
-    public DirectPaymentModelDao insertDirectPaymentWithFirstTransaction(final DirectPaymentModelDao directPayment, final DirectPaymentTransactionModelDao directPaymentTransaction, final InternalCallContext context) {
+    public PaymentModelDao insertDirectPaymentWithFirstTransaction(final PaymentModelDao directPayment, final PaymentTransactionModelDao directPaymentTransaction, final InternalCallContext context) {
         synchronized (this) {
             payments.put(directPayment.getId(), directPayment);
             transactions.put(directPaymentTransaction.getId(), directPaymentTransaction);
@@ -135,7 +135,7 @@ public class MockPaymentDao implements PaymentDao {
     }
 
     @Override
-    public DirectPaymentTransactionModelDao updateDirectPaymentWithNewTransaction(final UUID directPaymentId, final DirectPaymentTransactionModelDao directPaymentTransaction, final InternalCallContext context) {
+    public PaymentTransactionModelDao updateDirectPaymentWithNewTransaction(final UUID directPaymentId, final PaymentTransactionModelDao directPaymentTransaction, final InternalCallContext context) {
         synchronized (this) {
             transactions.put(directPaymentTransaction.getId(), directPaymentTransaction);
         }
@@ -145,11 +145,11 @@ public class MockPaymentDao implements PaymentDao {
     @Override
     public void updateDirectPaymentAndTransactionOnCompletion(final UUID directPaymentId, final String currentPaymentStateName, final UUID directTransactionId, final PaymentStatus paymentStatus, final BigDecimal processedAmount, final Currency processedCurrency, final String gatewayErrorCode, final String gatewayErrorMsg, final InternalCallContext context) {
         synchronized (this) {
-            final DirectPaymentModelDao payment = payments.get(directPaymentId);
+            final PaymentModelDao payment = payments.get(directPaymentId);
             if (payment != null) {
-                payment.setCurrentStateName(currentPaymentStateName);
+                payment.setStateName(currentPaymentStateName);
             }
-            final DirectPaymentTransactionModelDao transaction = transactions.get(directTransactionId);
+            final PaymentTransactionModelDao transaction = transactions.get(directTransactionId);
             if (transaction != null) {
                 transaction.setPaymentStatus(paymentStatus);
                 transaction.setProcessedAmount(processedAmount);
@@ -161,25 +161,25 @@ public class MockPaymentDao implements PaymentDao {
     }
 
     @Override
-    public DirectPaymentModelDao getDirectPayment(final UUID directPaymentId, final InternalTenantContext context) {
+    public PaymentModelDao getDirectPayment(final UUID directPaymentId, final InternalTenantContext context) {
         synchronized (this) {
             return payments.get(directPaymentId);
         }
     }
 
     @Override
-    public DirectPaymentTransactionModelDao getDirectPaymentTransaction(final UUID directTransactionId, final InternalTenantContext context) {
+    public PaymentTransactionModelDao getDirectPaymentTransaction(final UUID directTransactionId, final InternalTenantContext context) {
         synchronized (this) {
             return transactions.get(directTransactionId);
         }
     }
 
     @Override
-    public List<DirectPaymentModelDao> getDirectPaymentsForAccount(final UUID accountId, final InternalTenantContext context) {
+    public List<PaymentModelDao> getDirectPaymentsForAccount(final UUID accountId, final InternalTenantContext context) {
         synchronized (this) {
-            return ImmutableList.copyOf(Iterables.filter(payments.values(), new Predicate<DirectPaymentModelDao>() {
+            return ImmutableList.copyOf(Iterables.filter(payments.values(), new Predicate<PaymentModelDao>() {
                 @Override
-                public boolean apply(final DirectPaymentModelDao input) {
+                public boolean apply(final PaymentModelDao input) {
                     return input.getAccountId().equals(accountId);
                 }
             }));
@@ -187,12 +187,12 @@ public class MockPaymentDao implements PaymentDao {
     }
 
     @Override
-    public List<DirectPaymentTransactionModelDao> getDirectTransactionsForAccount(final UUID accountId, final InternalTenantContext context) {
+    public List<PaymentTransactionModelDao> getDirectTransactionsForAccount(final UUID accountId, final InternalTenantContext context) {
         synchronized (this) {
-            return ImmutableList.copyOf(Iterables.filter(transactions.values(), new Predicate<DirectPaymentTransactionModelDao>() {
+            return ImmutableList.copyOf(Iterables.filter(transactions.values(), new Predicate<PaymentTransactionModelDao>() {
                 @Override
-                public boolean apply(final DirectPaymentTransactionModelDao input) {
-                    final DirectPaymentModelDao payment = payments.get(input.getDirectPaymentId());
+                public boolean apply(final PaymentTransactionModelDao input) {
+                    final PaymentModelDao payment = payments.get(input.getPaymentId());
                     if (payment != null) {
                         return payment.getAccountId().equals(accountId);
                     } else {
@@ -204,12 +204,12 @@ public class MockPaymentDao implements PaymentDao {
     }
 
     @Override
-    public List<DirectPaymentTransactionModelDao> getDirectTransactionsForDirectPayment(final UUID directPaymentId, final InternalTenantContext context) {
+    public List<PaymentTransactionModelDao> getDirectTransactionsForDirectPayment(final UUID directPaymentId, final InternalTenantContext context) {
         synchronized (this) {
-            return ImmutableList.copyOf(Iterables.filter(transactions.values(), new Predicate<DirectPaymentTransactionModelDao>() {
+            return ImmutableList.copyOf(Iterables.filter(transactions.values(), new Predicate<PaymentTransactionModelDao>() {
                 @Override
-                public boolean apply(final DirectPaymentTransactionModelDao input) {
-                    return input.getDirectPaymentId().equals(directPaymentId);
+                public boolean apply(final PaymentTransactionModelDao input) {
+                    return input.getPaymentId().equals(directPaymentId);
                 }
             }));
         }
diff --git a/payment/src/test/java/org/killbill/billing/payment/dao/TestDefaultPaymentDao.java b/payment/src/test/java/org/killbill/billing/payment/dao/TestDefaultPaymentDao.java
index 377a7ec..968e241 100644
--- a/payment/src/test/java/org/killbill/billing/payment/dao/TestDefaultPaymentDao.java
+++ b/payment/src/test/java/org/killbill/billing/payment/dao/TestDefaultPaymentDao.java
@@ -42,26 +42,26 @@ public class TestDefaultPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
         // We need to create specific call contexts to make the account_record_id magic work
         final InternalCallContext accountCallContext = new InternalCallContext(internalCallContext, (long) accountNb);
 
-        final DirectPaymentModelDao specifiedFirstDirectPaymentModelDao = generateDirectPaymentModelDao(accountId);
-        final DirectPaymentTransactionModelDao specifiedFirstDirectPaymentTransactionModelDao = generateDirectPaymentTransactionModelDao(specifiedFirstDirectPaymentModelDao.getId());
+        final PaymentModelDao specifiedFirstPaymentModelDao = generateDirectPaymentModelDao(accountId);
+        final PaymentTransactionModelDao specifiedFirstDirectPaymentTransactionModelDao = generateDirectPaymentTransactionModelDao(specifiedFirstPaymentModelDao.getId());
 
         // Create and verify the payment and transaction
-        final DirectPaymentModelDao firstDirectPaymentModelDao = paymentDao.insertDirectPaymentWithFirstTransaction(specifiedFirstDirectPaymentModelDao, specifiedFirstDirectPaymentTransactionModelDao, accountCallContext);
-        verifyDirectPayment(firstDirectPaymentModelDao, specifiedFirstDirectPaymentModelDao);
-        verifyDirectPaymentAndTransactions(accountCallContext, specifiedFirstDirectPaymentModelDao, specifiedFirstDirectPaymentTransactionModelDao);
+        final PaymentModelDao firstPaymentModelDao = paymentDao.insertDirectPaymentWithFirstTransaction(specifiedFirstPaymentModelDao, specifiedFirstDirectPaymentTransactionModelDao, accountCallContext);
+        verifyDirectPayment(firstPaymentModelDao, specifiedFirstPaymentModelDao);
+        verifyDirectPaymentAndTransactions(accountCallContext, specifiedFirstPaymentModelDao, specifiedFirstDirectPaymentTransactionModelDao);
 
         // Create a second transaction for the same payment
-        final DirectPaymentTransactionModelDao specifiedSecondDirectPaymentTransactionModelDao = generateDirectPaymentTransactionModelDao(specifiedFirstDirectPaymentModelDao.getId());
-        final DirectPaymentTransactionModelDao secondDirectTransactionModelDao = paymentDao.updateDirectPaymentWithNewTransaction(specifiedFirstDirectPaymentTransactionModelDao.getDirectPaymentId(), specifiedSecondDirectPaymentTransactionModelDao, accountCallContext);
+        final PaymentTransactionModelDao specifiedSecondDirectPaymentTransactionModelDao = generateDirectPaymentTransactionModelDao(specifiedFirstPaymentModelDao.getId());
+        final PaymentTransactionModelDao secondDirectTransactionModelDao = paymentDao.updateDirectPaymentWithNewTransaction(specifiedFirstDirectPaymentTransactionModelDao.getPaymentId(), specifiedSecondDirectPaymentTransactionModelDao, accountCallContext);
         verifyDirectPaymentTransaction(secondDirectTransactionModelDao, specifiedSecondDirectPaymentTransactionModelDao);
-        verifyDirectPaymentAndTransactions(accountCallContext, specifiedFirstDirectPaymentModelDao, specifiedFirstDirectPaymentTransactionModelDao, specifiedSecondDirectPaymentTransactionModelDao);
+        verifyDirectPaymentAndTransactions(accountCallContext, specifiedFirstPaymentModelDao, specifiedFirstDirectPaymentTransactionModelDao, specifiedSecondDirectPaymentTransactionModelDao);
 
         // Update the latest transaction
         final BigDecimal processedAmount = new BigDecimal("902341.23232");
         final Currency processedCurrency = Currency.USD;
         final String gatewayErrorCode = UUID.randomUUID().toString().substring(0, 5);
         final String gatewayErrorMsg = UUID.randomUUID().toString();
-        paymentDao.updateDirectPaymentAndTransactionOnCompletion(specifiedSecondDirectPaymentTransactionModelDao.getDirectPaymentId(),
+        paymentDao.updateDirectPaymentAndTransactionOnCompletion(specifiedSecondDirectPaymentTransactionModelDao.getPaymentId(),
                                                                  "SOME_ERRORED_STATE",
                                                                  specifiedSecondDirectPaymentTransactionModelDao.getId(),
                                                                  PaymentStatus.PAYMENT_FAILURE_ABORTED,
@@ -71,54 +71,54 @@ public class TestDefaultPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
                                                                  gatewayErrorMsg,
                                                                  accountCallContext);
 
-        final DirectPaymentTransactionModelDao updatedSecondDirectPaymentTransactionModelDao = paymentDao.getDirectPaymentTransaction(specifiedSecondDirectPaymentTransactionModelDao.getId(), accountCallContext);
+        final PaymentTransactionModelDao updatedSecondDirectPaymentTransactionModelDao = paymentDao.getDirectPaymentTransaction(specifiedSecondDirectPaymentTransactionModelDao.getId(), accountCallContext);
         Assert.assertEquals(updatedSecondDirectPaymentTransactionModelDao.getPaymentStatus(), PaymentStatus.PAYMENT_FAILURE_ABORTED);
         Assert.assertEquals(updatedSecondDirectPaymentTransactionModelDao.getGatewayErrorMsg(), gatewayErrorMsg);
         Assert.assertEquals(updatedSecondDirectPaymentTransactionModelDao.getGatewayErrorMsg(), gatewayErrorMsg);
 
         // Create multiple payments for that account
         for (int i = 0; i < 3; i++) {
-            final DirectPaymentModelDao directPaymentModelDao = generateDirectPaymentModelDao(accountId);
-            final DirectPaymentTransactionModelDao directPaymentTransactionModelDao = generateDirectPaymentTransactionModelDao(directPaymentModelDao.getId());
+            final PaymentModelDao paymentModelDao = generateDirectPaymentModelDao(accountId);
+            final PaymentTransactionModelDao directPaymentTransactionModelDao = generateDirectPaymentTransactionModelDao(paymentModelDao.getId());
 
-            final DirectPaymentModelDao insertedDirectPaymentModelDao = paymentDao.insertDirectPaymentWithFirstTransaction(directPaymentModelDao, directPaymentTransactionModelDao, accountCallContext);
-            verifyDirectPayment(insertedDirectPaymentModelDao, directPaymentModelDao);
+            final PaymentModelDao insertedPaymentModelDao = paymentDao.insertDirectPaymentWithFirstTransaction(paymentModelDao, directPaymentTransactionModelDao, accountCallContext);
+            verifyDirectPayment(insertedPaymentModelDao, paymentModelDao);
         }
-        Assert.assertEquals(paymentDao.getDirectPaymentsForAccount(specifiedFirstDirectPaymentModelDao.getAccountId(), accountCallContext).size(), 4);
+        Assert.assertEquals(paymentDao.getDirectPaymentsForAccount(specifiedFirstPaymentModelDao.getAccountId(), accountCallContext).size(), 4);
     }
 
-    private void verifyDirectPaymentAndTransactions(final InternalCallContext accountCallContext, final DirectPaymentModelDao specifiedFirstDirectPaymentModelDao, final DirectPaymentTransactionModelDao... specifiedFirstDirectPaymentTransactionModelDaos) {
-        for (final DirectPaymentTransactionModelDao specifiedFirstDirectPaymentTransactionModelDao : specifiedFirstDirectPaymentTransactionModelDaos) {
-            final DirectPaymentTransactionModelDao firstDirectTransactionModelDao = paymentDao.getDirectPaymentTransaction(specifiedFirstDirectPaymentTransactionModelDao.getId(), accountCallContext);
+    private void verifyDirectPaymentAndTransactions(final InternalCallContext accountCallContext, final PaymentModelDao specifiedFirstPaymentModelDao, final PaymentTransactionModelDao... specifiedFirstDirectPaymentTransactionModelDaos) {
+        for (final PaymentTransactionModelDao specifiedFirstDirectPaymentTransactionModelDao : specifiedFirstDirectPaymentTransactionModelDaos) {
+            final PaymentTransactionModelDao firstDirectTransactionModelDao = paymentDao.getDirectPaymentTransaction(specifiedFirstDirectPaymentTransactionModelDao.getId(), accountCallContext);
             verifyDirectPaymentTransaction(firstDirectTransactionModelDao, specifiedFirstDirectPaymentTransactionModelDao);
         }
 
         // Retrieve the payment directly
-        final DirectPaymentModelDao secondDirectPaymentModelDao = paymentDao.getDirectPayment(specifiedFirstDirectPaymentModelDao.getId(), accountCallContext);
-        verifyDirectPayment(secondDirectPaymentModelDao, specifiedFirstDirectPaymentModelDao);
+        final PaymentModelDao secondPaymentModelDao = paymentDao.getDirectPayment(specifiedFirstPaymentModelDao.getId(), accountCallContext);
+        verifyDirectPayment(secondPaymentModelDao, specifiedFirstPaymentModelDao);
 
         // Retrieve the payments for the account
-        final List<DirectPaymentModelDao> paymentsForAccount = paymentDao.getDirectPaymentsForAccount(specifiedFirstDirectPaymentModelDao.getAccountId(), accountCallContext);
+        final List<PaymentModelDao> paymentsForAccount = paymentDao.getDirectPaymentsForAccount(specifiedFirstPaymentModelDao.getAccountId(), accountCallContext);
         Assert.assertEquals(paymentsForAccount.size(), 1);
-        verifyDirectPayment(paymentsForAccount.get(0), specifiedFirstDirectPaymentModelDao);
+        verifyDirectPayment(paymentsForAccount.get(0), specifiedFirstPaymentModelDao);
 
         // Retrieve the transactions for the account
-        final List<DirectPaymentTransactionModelDao> transactionsForAccount = paymentDao.getDirectTransactionsForAccount(specifiedFirstDirectPaymentModelDao.getAccountId(), accountCallContext);
+        final List<PaymentTransactionModelDao> transactionsForAccount = paymentDao.getDirectTransactionsForAccount(specifiedFirstPaymentModelDao.getAccountId(), accountCallContext);
         Assert.assertEquals(transactionsForAccount.size(), specifiedFirstDirectPaymentTransactionModelDaos.length);
         for (int i = 0; i < specifiedFirstDirectPaymentTransactionModelDaos.length; i++) {
             verifyDirectPaymentTransaction(transactionsForAccount.get(i), specifiedFirstDirectPaymentTransactionModelDaos[i]);
         }
 
         // Retrieve the transactions for the payment
-        final List<DirectPaymentTransactionModelDao> transactionsForPayment = paymentDao.getDirectTransactionsForDirectPayment(specifiedFirstDirectPaymentModelDao.getId(), accountCallContext);
+        final List<PaymentTransactionModelDao> transactionsForPayment = paymentDao.getDirectTransactionsForDirectPayment(specifiedFirstPaymentModelDao.getId(), accountCallContext);
         Assert.assertEquals(transactionsForPayment.size(), specifiedFirstDirectPaymentTransactionModelDaos.length);
         for (int i = 0; i < specifiedFirstDirectPaymentTransactionModelDaos.length; i++) {
             verifyDirectPaymentTransaction(transactionsForPayment.get(i), specifiedFirstDirectPaymentTransactionModelDaos[i]);
         }
     }
 
-    private DirectPaymentTransactionModelDao generateDirectPaymentTransactionModelDao(final UUID directPaymentId) {
-        return new DirectPaymentTransactionModelDao(UUID.randomUUID(),
+    private PaymentTransactionModelDao generateDirectPaymentTransactionModelDao(final UUID directPaymentId) {
+        return new PaymentTransactionModelDao(UUID.randomUUID(),
                                                     UUID.randomUUID().toString(),
                                                     clock.getUTCNow(),
                                                     clock.getUTCNow(),
@@ -129,12 +129,12 @@ public class TestDefaultPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
                                                     new BigDecimal("192.32910002"),
                                                     Currency.EUR,
                                                     UUID.randomUUID().toString().substring(0, 5),
-                                                    UUID.randomUUID().toString(),
-                                                    null, null);
+                                                    UUID.randomUUID().toString()
+        );
     }
 
-    private DirectPaymentModelDao generateDirectPaymentModelDao(final UUID accountId) {
-        return new DirectPaymentModelDao(UUID.randomUUID(),
+    private PaymentModelDao generateDirectPaymentModelDao(final UUID accountId) {
+        return new PaymentModelDao(UUID.randomUUID(),
                                          clock.getUTCNow(),
                                          clock.getUTCNow(),
                                          accountId,
@@ -144,15 +144,15 @@ public class TestDefaultPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
                                          null, null);
     }
 
-    private void verifyDirectPayment(final DirectPaymentModelDao loadedDirectPaymentModelDao, final DirectPaymentModelDao specifiedDirectPaymentModelDao) {
-        Assert.assertEquals(loadedDirectPaymentModelDao.getAccountId(), specifiedDirectPaymentModelDao.getAccountId());
-        Assert.assertTrue(loadedDirectPaymentModelDao.getPaymentNumber() > 0);
-        Assert.assertEquals(loadedDirectPaymentModelDao.getPaymentMethodId(), specifiedDirectPaymentModelDao.getPaymentMethodId());
-        Assert.assertEquals(loadedDirectPaymentModelDao.getExternalKey(), specifiedDirectPaymentModelDao.getExternalKey());
+    private void verifyDirectPayment(final PaymentModelDao loadedPaymentModelDao, final PaymentModelDao specifiedPaymentModelDao) {
+        Assert.assertEquals(loadedPaymentModelDao.getAccountId(), specifiedPaymentModelDao.getAccountId());
+        Assert.assertTrue(loadedPaymentModelDao.getPaymentNumber() > 0);
+        Assert.assertEquals(loadedPaymentModelDao.getPaymentMethodId(), specifiedPaymentModelDao.getPaymentMethodId());
+        Assert.assertEquals(loadedPaymentModelDao.getExternalKey(), specifiedPaymentModelDao.getExternalKey());
     }
 
-    private void verifyDirectPaymentTransaction(final DirectPaymentTransactionModelDao loadedDirectPaymentTransactionModelDao, final DirectPaymentTransactionModelDao specifiedDirectPaymentTransactionModelDao) {
-        Assert.assertEquals(loadedDirectPaymentTransactionModelDao.getDirectPaymentId(), specifiedDirectPaymentTransactionModelDao.getDirectPaymentId());
+    private void verifyDirectPaymentTransaction(final PaymentTransactionModelDao loadedDirectPaymentTransactionModelDao, final PaymentTransactionModelDao specifiedDirectPaymentTransactionModelDao) {
+        Assert.assertEquals(loadedDirectPaymentTransactionModelDao.getPaymentId(), specifiedDirectPaymentTransactionModelDao.getPaymentId());
         Assert.assertEquals(loadedDirectPaymentTransactionModelDao.getTransactionExternalKey(), specifiedDirectPaymentTransactionModelDao.getTransactionExternalKey());
         Assert.assertEquals(loadedDirectPaymentTransactionModelDao.getTransactionType(), specifiedDirectPaymentTransactionModelDao.getTransactionType());
         Assert.assertEquals(loadedDirectPaymentTransactionModelDao.getEffectiveDate().compareTo(specifiedDirectPaymentTransactionModelDao.getEffectiveDate()), 0);
diff --git a/payment/src/test/java/org/killbill/billing/payment/dao/TestPaymentDao.java b/payment/src/test/java/org/killbill/billing/payment/dao/TestPaymentDao.java
index d2cdab5..60d9e1b 100644
--- a/payment/src/test/java/org/killbill/billing/payment/dao/TestPaymentDao.java
+++ b/payment/src/test/java/org/killbill/billing/payment/dao/TestPaymentDao.java
@@ -103,78 +103,78 @@ public class TestPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
 
         final DateTime utcNow = clock.getUTCNow();
 
-        final DirectPaymentModelDao paymentModelDao = new DirectPaymentModelDao(utcNow, utcNow, accountId, paymentMethodId, externalKey);
-        final DirectPaymentTransactionModelDao transactionModelDao = new DirectPaymentTransactionModelDao(utcNow, utcNow, transactionExternalKey,
+        final PaymentModelDao paymentModelDao = new PaymentModelDao(utcNow, utcNow, accountId, paymentMethodId, externalKey);
+        final PaymentTransactionModelDao transactionModelDao = new PaymentTransactionModelDao(utcNow, utcNow, transactionExternalKey,
                                                                                                           paymentModelDao.getId(), TransactionType.AUTHORIZE, utcNow,
                                                                                                           PaymentStatus.SUCCESS, BigDecimal.TEN, Currency.AED,
                                                                                                           "success", "");
 
-        final DirectPaymentModelDao savedPayment = paymentDao.insertDirectPaymentWithFirstTransaction(paymentModelDao, transactionModelDao, internalCallContext);
+        final PaymentModelDao savedPayment = paymentDao.insertDirectPaymentWithFirstTransaction(paymentModelDao, transactionModelDao, internalCallContext);
         assertEquals(savedPayment.getId(), paymentModelDao.getId());
         assertEquals(savedPayment.getAccountId(), paymentModelDao.getAccountId());
         assertEquals(savedPayment.getExternalKey(), paymentModelDao.getExternalKey());
         assertEquals(savedPayment.getPaymentMethodId(), paymentModelDao.getPaymentMethodId());
-        assertNull(savedPayment.getCurrentStateName());
+        assertNull(savedPayment.getStateName());
 
-        final DirectPaymentModelDao savedPayment2 = paymentDao.getDirectPayment(savedPayment.getId(), internalCallContext);
+        final PaymentModelDao savedPayment2 = paymentDao.getDirectPayment(savedPayment.getId(), internalCallContext);
         assertEquals(savedPayment2.getId(), paymentModelDao.getId());
         assertEquals(savedPayment2.getAccountId(), paymentModelDao.getAccountId());
         assertEquals(savedPayment2.getExternalKey(), paymentModelDao.getExternalKey());
         assertEquals(savedPayment2.getPaymentMethodId(), paymentModelDao.getPaymentMethodId());
-        assertNull(savedPayment2.getCurrentStateName());
+        assertNull(savedPayment2.getStateName());
 
-        final DirectPaymentModelDao savedPayment3 = paymentDao.getDirectPaymentByExternalKey(externalKey, internalCallContext);
+        final PaymentModelDao savedPayment3 = paymentDao.getDirectPaymentByExternalKey(externalKey, internalCallContext);
         assertEquals(savedPayment3.getId(), paymentModelDao.getId());
         assertEquals(savedPayment3.getAccountId(), paymentModelDao.getAccountId());
         assertEquals(savedPayment3.getExternalKey(), paymentModelDao.getExternalKey());
         assertEquals(savedPayment3.getPaymentMethodId(), paymentModelDao.getPaymentMethodId());
-        assertNull(savedPayment3.getCurrentStateName());
+        assertNull(savedPayment3.getStateName());
 
-        final DirectPaymentTransactionModelDao savedTransaction = paymentDao.getDirectPaymentTransaction(transactionModelDao.getId(), internalCallContext);
+        final PaymentTransactionModelDao savedTransaction = paymentDao.getDirectPaymentTransaction(transactionModelDao.getId(), internalCallContext);
         assertEquals(savedTransaction.getTransactionExternalKey(), transactionExternalKey);
-        assertEquals(savedTransaction.getDirectPaymentId(), paymentModelDao.getId());
+        assertEquals(savedTransaction.getPaymentId(), paymentModelDao.getId());
         assertEquals(savedTransaction.getTransactionType(), TransactionType.AUTHORIZE);
         assertEquals(savedTransaction.getPaymentStatus(), PaymentStatus.SUCCESS);
         assertEquals(savedTransaction.getAmount().compareTo(BigDecimal.TEN), 0);
         assertEquals(savedTransaction.getCurrency(), Currency.AED);
 
-        final DirectPaymentTransactionModelDao savedTransaction2 = paymentDao.getDirectPaymentTransactionByExternalKey(transactionExternalKey, internalCallContext);
+        final PaymentTransactionModelDao savedTransaction2 = paymentDao.getDirectPaymentTransactionByExternalKey(transactionExternalKey, internalCallContext);
         assertEquals(savedTransaction2.getTransactionExternalKey(), transactionExternalKey);
-        assertEquals(savedTransaction2.getDirectPaymentId(), paymentModelDao.getId());
+        assertEquals(savedTransaction2.getPaymentId(), paymentModelDao.getId());
         assertEquals(savedTransaction2.getTransactionType(), TransactionType.AUTHORIZE);
         assertEquals(savedTransaction2.getPaymentStatus(), PaymentStatus.SUCCESS);
         assertEquals(savedTransaction2.getAmount().compareTo(BigDecimal.TEN), 0);
         assertEquals(savedTransaction2.getCurrency(), Currency.AED);
 
-        final DirectPaymentTransactionModelDao transactionModelDao2 = new DirectPaymentTransactionModelDao(utcNow, utcNow, transactionExternalKey2,
+        final PaymentTransactionModelDao transactionModelDao2 = new PaymentTransactionModelDao(utcNow, utcNow, transactionExternalKey2,
                                                                                                            paymentModelDao.getId(), TransactionType.AUTHORIZE, utcNow,
                                                                                                            PaymentStatus.UNKNOWN, BigDecimal.TEN, Currency.AED,
                                                                                                            "success", "");
 
-        final DirectPaymentTransactionModelDao savedTransactionModelDao2 = paymentDao.updateDirectPaymentWithNewTransaction(savedPayment.getId(), transactionModelDao2, internalCallContext);
+        final PaymentTransactionModelDao savedTransactionModelDao2 = paymentDao.updateDirectPaymentWithNewTransaction(savedPayment.getId(), transactionModelDao2, internalCallContext);
         assertEquals(savedTransactionModelDao2.getTransactionExternalKey(), transactionExternalKey2);
-        assertEquals(savedTransactionModelDao2.getDirectPaymentId(), paymentModelDao.getId());
+        assertEquals(savedTransactionModelDao2.getPaymentId(), paymentModelDao.getId());
         assertEquals(savedTransactionModelDao2.getTransactionType(), TransactionType.AUTHORIZE);
         assertEquals(savedTransactionModelDao2.getPaymentStatus(), PaymentStatus.UNKNOWN);
         assertEquals(savedTransactionModelDao2.getAmount().compareTo(BigDecimal.TEN), 0);
         assertEquals(savedTransactionModelDao2.getCurrency(), Currency.AED);
 
-        final List<DirectPaymentTransactionModelDao> transactions = paymentDao.getDirectTransactionsForDirectPayment(savedPayment.getId(), internalCallContext);
+        final List<PaymentTransactionModelDao> transactions = paymentDao.getDirectTransactionsForDirectPayment(savedPayment.getId(), internalCallContext);
         assertEquals(transactions.size(), 2);
 
         paymentDao.updateDirectPaymentAndTransactionOnCompletion(savedPayment.getId(), "AUTH_SUCCESS", transactionModelDao2.getId(), PaymentStatus.SUCCESS,
                                                                  BigDecimal.ONE, Currency.USD, null, "nothing", internalCallContext);
 
-        final DirectPaymentModelDao savedPayment4 = paymentDao.getDirectPayment(savedPayment.getId(), internalCallContext);
+        final PaymentModelDao savedPayment4 = paymentDao.getDirectPayment(savedPayment.getId(), internalCallContext);
         assertEquals(savedPayment4.getId(), paymentModelDao.getId());
         assertEquals(savedPayment4.getAccountId(), paymentModelDao.getAccountId());
         assertEquals(savedPayment4.getExternalKey(), paymentModelDao.getExternalKey());
         assertEquals(savedPayment4.getPaymentMethodId(), paymentModelDao.getPaymentMethodId());
-        assertEquals(savedPayment4.getCurrentStateName(), "AUTH_SUCCESS");
+        assertEquals(savedPayment4.getStateName(), "AUTH_SUCCESS");
 
-        final DirectPaymentTransactionModelDao savedTransactionModelDao4 = paymentDao.getDirectPaymentTransaction(savedTransactionModelDao2.getId(), internalCallContext);
+        final PaymentTransactionModelDao savedTransactionModelDao4 = paymentDao.getDirectPaymentTransaction(savedTransactionModelDao2.getId(), internalCallContext);
         assertEquals(savedTransactionModelDao4.getTransactionExternalKey(), transactionExternalKey2);
-        assertEquals(savedTransactionModelDao4.getDirectPaymentId(), paymentModelDao.getId());
+        assertEquals(savedTransactionModelDao4.getPaymentId(), paymentModelDao.getId());
         assertEquals(savedTransactionModelDao4.getTransactionType(), TransactionType.AUTHORIZE);
         assertEquals(savedTransactionModelDao4.getPaymentStatus(), PaymentStatus.SUCCESS);
         assertEquals(savedTransactionModelDao4.getAmount().compareTo(BigDecimal.TEN), 0);
@@ -186,10 +186,10 @@ public class TestPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
         assertNull(savedTransactionModelDao4.getExtFirstPaymentRefId());
         assertNull(savedTransactionModelDao4.getExtSecondPaymentRefId());
 
-        final List<DirectPaymentModelDao> payments = paymentDao.getDirectPaymentsForAccount(accountId, internalCallContext);
+        final List<PaymentModelDao> payments = paymentDao.getDirectPaymentsForAccount(accountId, internalCallContext);
         assertEquals(payments.size(), 1);
 
-        final List<DirectPaymentTransactionModelDao> transactions2 =paymentDao.getDirectTransactionsForAccount(accountId, internalCallContext);
+        final List<PaymentTransactionModelDao> transactions2 =paymentDao.getDirectTransactionsForAccount(accountId, internalCallContext);
         assertEquals(transactions2.size(), 2);
     }
 
diff --git a/payment/src/test/java/org/killbill/billing/payment/TestRetryService.java b/payment/src/test/java/org/killbill/billing/payment/TestRetryService.java
index 55f7c60..0b5b7ee 100644
--- a/payment/src/test/java/org/killbill/billing/payment/TestRetryService.java
+++ b/payment/src/test/java/org/killbill/billing/payment/TestRetryService.java
@@ -32,7 +32,7 @@ import org.killbill.billing.payment.api.DirectPayment;
 import org.killbill.billing.payment.api.PaymentApiException;
 import org.killbill.billing.payment.api.PluginProperty;
 import org.killbill.billing.payment.control.InvoicePaymentControlPluginApi;
-import org.killbill.billing.payment.dao.DirectPaymentTransactionModelDao;
+import org.killbill.billing.payment.dao.PaymentTransactionModelDao;
 import org.killbill.billing.payment.dao.PaymentAttemptModelDao;
 import org.killbill.billing.payment.glue.DefaultPaymentService;
 import org.killbill.billing.payment.provider.MockPaymentProviderPlugin;
@@ -143,7 +143,7 @@ public class TestRetryService extends PaymentTestSuiteNoDB {
         List<PaymentAttemptModelDao> attempts = paymentDao.getPaymentAttempts(payment.getExternalKey(), internalCallContext);
         assertEquals(attempts.size(), 1);
 
-        final List<DirectPaymentTransactionModelDao> transactions = paymentDao.getDirectTransactionsForDirectPayment(payment.getId(), internalCallContext);
+        final List<PaymentTransactionModelDao> transactions = paymentDao.getDirectTransactionsForDirectPayment(payment.getId(), internalCallContext);
         assertEquals(transactions.size(), 1);
 
         for (int curFailure = 0; curFailure < maxTries; curFailure++) {
diff --git a/util/src/main/java/org/killbill/billing/util/dao/TableName.java b/util/src/main/java/org/killbill/billing/util/dao/TableName.java
index 4e00bb2..fa391a0 100644
--- a/util/src/main/java/org/killbill/billing/util/dao/TableName.java
+++ b/util/src/main/java/org/killbill/billing/util/dao/TableName.java
@@ -41,10 +41,8 @@ public enum TableName {
     PAYMENTS("payments", ObjectType.PAYMENT, PAYMENT_HISTORY),
     PAYMENT_METHOD_HISTORY("payment_method_history"),
     PAYMENT_METHODS("payment_methods", ObjectType.PAYMENT_METHOD, PAYMENT_METHOD_HISTORY),
-    DIRECT_PAYMENT_HISTORY("direct_payment_history"),
-    DIRECT_PAYMENTS("direct_payments", ObjectType.DIRECT_PAYMENT, DIRECT_PAYMENT_HISTORY),
-    DIRECT_TRANSACTION_HISTORY("direct_transaction_history"),
-    DIRECT_TRANSACTIONS("direct_transactions", ObjectType.DIRECT_TRANSACTION, DIRECT_TRANSACTION_HISTORY),
+    TRANSACTION_HISTORY("transaction_history"),
+    TRANSACTIONS("transactions", ObjectType.TRANSACTION, TRANSACTION_HISTORY),
     SUBSCRIPTIONS("subscriptions", ObjectType.SUBSCRIPTION),
     SUBSCRIPTION_EVENTS("subscription_events", ObjectType.SUBSCRIPTION_EVENT),
     REFUND_HISTORY("refund_history"),