killbill-uncached

Changes

Details

diff --git a/api/src/main/java/com/ning/billing/ErrorCode.java b/api/src/main/java/com/ning/billing/ErrorCode.java
index 50e4fde..aff1bd1 100644
--- a/api/src/main/java/com/ning/billing/ErrorCode.java
+++ b/api/src/main/java/com/ning/billing/ErrorCode.java
@@ -271,6 +271,7 @@ public enum ErrorCode {
 
     PAYMENT_PLUGIN_TIMEOUT(7100, "Plugin timeout for account %s and invoice %s"),
     PAYMENT_PLUGIN_ACCOUNT_INIT(7101, "Account initialization for account %s and plugin % s failed: %s"),
+    PAYMENT_PLUGIN_GET_PAYMENT_INFO(7102, "Failed to retrieve payment plugin info for payment %s: %s"),
 
     /*
     *
diff --git a/api/src/main/java/com/ning/billing/payment/api/Payment.java b/api/src/main/java/com/ning/billing/payment/api/Payment.java
index a1edee9..2c31f46 100644
--- a/api/src/main/java/com/ning/billing/payment/api/Payment.java
+++ b/api/src/main/java/com/ning/billing/payment/api/Payment.java
@@ -22,6 +22,7 @@ import java.util.UUID;
 import org.joda.time.DateTime;
 
 import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.payment.plugin.api.PaymentInfoPlugin;
 import com.ning.billing.util.entity.Entity;
 
 public interface Payment extends Entity {
@@ -50,6 +51,8 @@ public interface Payment extends Entity {
 
     public String getExtSecondPaymentIdRef();
 
+    public PaymentInfoPlugin getPaymentInfoPlugin();
+
     public interface PaymentAttempt extends Entity {
 
         public UUID getId();
@@ -62,4 +65,6 @@ public interface Payment extends Entity {
 
         public PaymentStatus getPaymentStatus();
     }
+
+
 }
diff --git a/api/src/main/java/com/ning/billing/payment/api/PaymentApi.java b/api/src/main/java/com/ning/billing/payment/api/PaymentApi.java
index 23778b8..b1413ae 100644
--- a/api/src/main/java/com/ning/billing/payment/api/PaymentApi.java
+++ b/api/src/main/java/com/ning/billing/payment/api/PaymentApi.java
@@ -28,14 +28,28 @@ import com.ning.billing.util.callcontext.TenantContext;
 
 public interface PaymentApi {
 
+    /**
+     * @param account   the account
+     * @param invoiceId the invoice id
+     * @param amount    the amount to pay
+     * @param context   the call context
+     * @return the payment
+     * @throws PaymentApiException
+     */
     public Payment createPayment(Account account, UUID invoiceId, BigDecimal amount, CallContext context)
             throws PaymentApiException;
 
+    /**
+     * @param account   the account
+     * @param invoiceId the invoice id
+     * @param amount    the amount to pay
+     * @param context   the call context
+     * @return the payment
+     * @throws PaymentApiException
+     */
     public Payment createExternalPayment(Account account, UUID invoiceId, BigDecimal amount, CallContext context)
             throws PaymentApiException;
 
-    public Refund getRefund(UUID refundId, TenantContext context)
-            throws PaymentApiException;
 
     /**
      * Create a refund for a given payment. The associated invoice is not adjusted.
@@ -51,6 +65,15 @@ public interface PaymentApi {
             throws PaymentApiException;
 
     /**
+     * @param refundId       the refund id
+     * @param withPluginInfo whether to fetch plugin info
+     * @param context        the call context  @return the refund
+     * @throws PaymentApiException
+     */
+    public Refund getRefund(UUID refundId, final boolean withPluginInfo, TenantContext context)
+            throws PaymentApiException;
+
+    /**
      * Create a refund for a given payment. The associated invoice is adjusted.
      *
      * @param account      account to refund
@@ -91,41 +114,117 @@ public interface PaymentApi {
     public Refund createRefundWithItemsAdjustments(Account account, UUID paymentId, Map<UUID, BigDecimal> invoiceItemIdsWithAmounts, CallContext context)
             throws PaymentApiException;
 
+    /**
+     * @param account the account
+     * @param context the call context
+     * @return the list of refund on this account
+     * @throws PaymentApiException
+     */
     public List<Refund> getAccountRefunds(Account account, TenantContext context)
             throws PaymentApiException;
 
+    /**
+     * @param paymentId the payment id
+     * @param context   the call context
+     * @return the list of refund on this account
+     * @throws PaymentApiException
+     */
     public List<Refund> getPaymentRefunds(UUID paymentId, TenantContext context)
             throws PaymentApiException;
 
+
+    /**
+     * @param invoiceId the invoice id
+     * @param context   the call context
+     * @return the list of payment on this invoice
+     * @throws PaymentApiException
+     */
     public List<Payment> getInvoicePayments(UUID invoiceId, TenantContext context)
             throws PaymentApiException;
 
+    /**
+     * @param accountId the account id
+     * @param context   the call context
+     * @return the list of payment on this account
+     * @throws PaymentApiException
+     */
     public List<Payment> getAccountPayments(UUID accountId, TenantContext context)
             throws PaymentApiException;
 
-    public Payment getPayment(UUID paymentId, TenantContext context)
+    /**
+     * @param paymentId      the payment id
+     * @param withPluginInfo whether to fetch plugin info
+     * @param context        the call context
+     * @return the payment
+     * @throws PaymentApiException
+     */
+    public Payment getPayment(UUID paymentId, final boolean withPluginInfo, TenantContext context)
             throws PaymentApiException;
 
-    /*
-     * Payment method Apis
+    /**
+     * @return a list of all the payment plugins registered
      */
     public Set<String> getAvailablePlugins();
 
+    /**
+     * @param pluginName        the plugin name
+     * @param account           the account
+     * @param setDefault        whether this should be set as a default payment method
+     * @param paymentMethodInfo the details for the payment method
+     * @param context           the call context
+     * @return the uuid of the payment method
+     * @throws PaymentApiException
+     */
     public UUID addPaymentMethod(String pluginName, Account account, boolean setDefault, PaymentMethodPlugin paymentMethodInfo, CallContext context)
             throws PaymentApiException;
 
+    /**
+     * @param account        the account id
+     * @param withPluginInfo whether we want to retrieve the plugin info for that payment method
+     * @param context        the call context
+     * @return the list of payment methods
+     * @throws PaymentApiException
+     */
     public List<PaymentMethod> getPaymentMethods(Account account, final boolean withPluginInfo, TenantContext context)
             throws PaymentApiException;
 
+    /**
+     * @param paymentMethodId the payment methid id
+     * @param withPluginInfo  whether we want to retrieve the plugin info for that payment method
+     * @param context         the call context
+     * @return the payment method
+     * @throws PaymentApiException
+     */
     public PaymentMethod getPaymentMethodById(UUID paymentMethodId, final boolean withPluginInfo, TenantContext context)
             throws PaymentApiException;
 
+    /**
+     * @param account         the account
+     * @param paymentMethodId the id of the payment  method
+     * @param deleteDefaultPaymentMethodWithAutoPayOff
+     *                        whether to allow deletion of default payment method and set account into AUTO_PAY_OFF
+     * @param context         the call context
+     * @throws PaymentApiException
+     */
     public void deletedPaymentMethod(Account account, UUID paymentMethodId, boolean deleteDefaultPaymentMethodWithAutoPayOff, CallContext context)
             throws PaymentApiException;
 
+    /**
+     * @param account         the account
+     * @param paymentMethodId the payment method id
+     * @param context         the call context
+     * @throws PaymentApiException
+     */
     public void setDefaultPaymentMethod(Account account, UUID paymentMethodId, CallContext context)
             throws PaymentApiException;
 
+    /**
+     * @param pluginName the name of the plugin
+     * @param account    the account
+     * @param context    the call context
+     * @return the list of payment methods for that account
+     * @throws PaymentApiException
+     */
     public List<PaymentMethod> refreshPaymentMethods(String pluginName, Account account, CallContext context)
             throws PaymentApiException;
 
diff --git a/api/src/main/java/com/ning/billing/payment/api/PaymentMethodPlugin.java b/api/src/main/java/com/ning/billing/payment/api/PaymentMethodPlugin.java
index 0433003..1c3d2a1 100644
--- a/api/src/main/java/com/ning/billing/payment/api/PaymentMethodPlugin.java
+++ b/api/src/main/java/com/ning/billing/payment/api/PaymentMethodPlugin.java
@@ -21,14 +21,104 @@ import java.util.List;
 public interface PaymentMethodPlugin {
 
 
+    /**
+     *
+     * @return the id from the plugin
+     */
     public String getExternalPaymentMethodId();
 
+    /**
+     *
+     * @return whether plugin sees that PM as being the default
+     */
     public boolean isDefaultPaymentMethod();
 
+    /**
+     *
+     * @return the list of key/value pair set by the plugin
+     */
     public List<PaymentMethodKVInfo> getProperties();
 
+    /**
+     *
+     * @param key the key for which to get the value
+     * @return the value associated with the key
+     */
     public String getValueString(String key);
 
+    /**
+     *
+     * @return the payment method type name if applicable
+     */
+    public String getType();
+
+    /**
+     *
+     * @return the credit card name if applicable
+     */
+    public String getCCName();
+
+    /**
+     *
+     * @return the credit card type if applicable
+     */
+    public String getCCType();
+
+    /**
+     *
+     * @return the credit card expiration month
+     */
+    public String getCCExprirationMonth();
+
+    /**
+     *
+     * @return the credit card expiration year
+     */
+    public String getCCExprirationYear();
+
+    /**
+     *
+     * @return the credit card last 4 numbers
+     */
+    public String getCCLast4();
+
+    /**
+     *
+     * @return the address line 1
+     */
+    public String getAddress1();
+
+    /**
+     *
+     * @return the address line 2
+     */
+    public String getAddress2();
+
+    /**
+     *
+     * @return the city
+     */
+    public String getCity();
+
+    /**
+     *
+     * @return the state
+     */
+    public String getState();
+
+    /**
+     *
+     * @return the zip
+     */
+    public String getZip();
+
+    /**
+     *
+     * @return the country
+     */
+    public String getCountry();
+
+
     public class PaymentMethodKVInfo {
 
         private final String key;
@@ -53,6 +143,8 @@ public interface PaymentMethodPlugin {
             return isUpdatable;
         }
 
+
+
         @Override
         public String toString() {
             final StringBuilder sb = new StringBuilder();
diff --git a/api/src/main/java/com/ning/billing/payment/api/Refund.java b/api/src/main/java/com/ning/billing/payment/api/Refund.java
index 8c3e66b..da6d3a8 100644
--- a/api/src/main/java/com/ning/billing/payment/api/Refund.java
+++ b/api/src/main/java/com/ning/billing/payment/api/Refund.java
@@ -22,6 +22,7 @@ import java.util.UUID;
 import org.joda.time.DateTime;
 
 import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.payment.plugin.api.RefundInfoPlugin;
 import com.ning.billing.util.entity.Entity;
 
 public interface Refund extends Entity {
@@ -37,4 +38,6 @@ public interface Refund extends Entity {
     public Currency getCurrency();
 
     public DateTime getEffectiveDate();
+
+    public RefundInfoPlugin getPluginDetail();
 }
diff --git a/api/src/main/java/com/ning/billing/payment/plugin/api/PaymentInfoPlugin.java b/api/src/main/java/com/ning/billing/payment/plugin/api/PaymentInfoPlugin.java
index 50a2ac9..13965bc 100644
--- a/api/src/main/java/com/ning/billing/payment/plugin/api/PaymentInfoPlugin.java
+++ b/api/src/main/java/com/ning/billing/payment/plugin/api/PaymentInfoPlugin.java
@@ -57,4 +57,17 @@ public interface PaymentInfoPlugin {
      * @return gateway error code, if any
      */
     public String getGatewayErrorCode();
+
+    /**
+     *
+     * @return the first payment reference id
+     */
+    public String getFirstPaymentReferenceId();
+
+    /**
+     *
+     * @return the first payment reference id
+     */
+    public String getSecondPaymentReferenceId();
+
 }
diff --git a/api/src/main/java/com/ning/billing/payment/plugin/api/PaymentPluginApi.java b/api/src/main/java/com/ning/billing/payment/plugin/api/PaymentPluginApi.java
index f2d0687..935c8ed 100644
--- a/api/src/main/java/com/ning/billing/payment/plugin/api/PaymentPluginApi.java
+++ b/api/src/main/java/com/ning/billing/payment/plugin/api/PaymentPluginApi.java
@@ -30,25 +30,25 @@ public interface PaymentPluginApi {
     /**
      * Charge a specific amount in the Gateway. Required.
      *
-     * @param kbAccountId        killbill accountId
-     * @param kbPaymentId        killbill payment id (for reference)
-     * @param kbPaymentMethodId  killbill payment method id
-     * @param amount             amount to charge
-     * @param currency           currency
-     * @param context            call context
+     * @param kbAccountId       killbill accountId
+     * @param kbPaymentId       killbill payment id (for reference)
+     * @param kbPaymentMethodId killbill payment method id
+     * @param amount            amount to charge
+     * @param currency          currency
+     * @param context           call context
      * @return information about the payment in the gateway
      * @throws PaymentPluginApiException
      */
     public PaymentInfoPlugin processPayment(UUID kbAccountId, UUID kbPaymentId, UUID kbPaymentMethodId, BigDecimal amount, Currency currency, CallContext context)
             throws PaymentPluginApiException;
 
+
     /**
      * Retrieve information about a given payment. Optional (not all gateways will support it).
      *
-     *
-     * @param kbAccountId      killbill accountId
-     * @param kbPaymentId      killbill payment id (for reference)
-     * @param context          call context
+     * @param kbAccountId killbill accountId
+     * @param kbPaymentId killbill payment id (for reference)
+     * @param context     call context
      * @return information about the payment in the gateway
      * @throws PaymentPluginApiException
      */
@@ -58,21 +58,32 @@ public interface PaymentPluginApi {
     /**
      * Process a refund against a given payment. Required.
      *
-     *
-     * @param kbAccountId      killbill accountId
-     * @param kbPaymentId      killbill payment id (for reference)
-     * @param refundAmount     refund amount
-     * @param currency         currency
-     * @param context          call context
+     * @param kbAccountId  killbill accountId
+     * @param kbPaymentId  killbill payment id (for reference)
+     * @param refundAmount refund amount
+     * @param currency     currency
+     * @param context      call context
      * @return information about the refund in the gateway
      * @throws PaymentPluginApiException
      */
     public RefundInfoPlugin processRefund(UUID kbAccountId, UUID kbPaymentId, BigDecimal refundAmount, Currency currency, CallContext context)
             throws PaymentPluginApiException;
 
+
+    /**
+     * @param kbAccountId killbill account id
+     * @param kbPaymentId killbill payment id
+     * @param context     call context
+     * @return information about the refunds in the gateway
+     * @throws PaymentPluginApiException
+     */
+    public List<RefundInfoPlugin> getRefundInfo(UUID kbAccountId, UUID kbPaymentId, CallContext context)
+            throws PaymentPluginApiException;
+
+
     /**
      * Add a payment method for a Killbill account in the gateway. Optional.
-     *
+     * <p/>
      * Note: the payment method doesn't exist yet in Killbill when receiving the call in
      * the plugin (kbPaymentMethodId is a placeholder).
      *
@@ -88,9 +99,9 @@ public interface PaymentPluginApi {
     /**
      * Delete a payment method in the gateway. Optional.
      *
-     * @param kbAccountId        killbill accountId
-     * @param kbPaymentMethodId      killbill payment method id
-     * @param context                call context
+     * @param kbAccountId       killbill accountId
+     * @param kbPaymentMethodId killbill payment method id
+     * @param context           call context
      * @throws PaymentPluginApiException
      */
     public void deletePaymentMethod(UUID kbAccountId, UUID kbPaymentMethodId, CallContext context)
@@ -111,25 +122,24 @@ public interface PaymentPluginApi {
     /**
      * Set a payment method as default in the gateway. Optional.
      *
-     * @param kbAccountId        killbill accountId
-     * @param kbPaymentMethodId      killbill payment method id
-     * @param context                call context
+     * @param kbAccountId       killbill accountId
+     * @param kbPaymentMethodId killbill payment method id
+     * @param context           call context
      * @throws PaymentPluginApiException
      */
     public void setDefaultPaymentMethod(UUID kbAccountId, UUID kbPaymentMethodId, CallContext context)
             throws PaymentPluginApiException;
 
     /**
-     *
      * This is used to see the view of paymentMethods kept by the plugin or the view of
      * existing payment method on the gateway.
-     *
+     * <p/>
      * Sometimes payment methods have to be added directly to the gateway for PCI compliance issues
      * and so Killbill needs to refresh its state.
      *
-     * @param kbAccountId           killbill accountId
-     * @param refreshFromGateway    fetch the list of existing  payment methods from gateway-- if supported
-     * @param context               call context
+     * @param kbAccountId        killbill accountId
+     * @param refreshFromGateway fetch the list of existing  payment methods from gateway-- if supported
+     * @param context            call context
      * @return
      */
     public List<PaymentMethodInfoPlugin> getPaymentMethods(UUID kbAccountId, boolean refreshFromGateway, CallContext context)
@@ -138,8 +148,8 @@ public interface PaymentPluginApi {
     /**
      * This is used after Killbill decided to refresh its state from the gateway
      *
-     * @param kbAccountId        killbill accountId
-     * @param paymentMethods        the list of payment methods
+     * @param kbAccountId    killbill accountId
+     * @param paymentMethods the list of payment methods
      */
     public void resetPaymentMethods(UUID kbAccountId, List<PaymentMethodInfoPlugin> paymentMethods)
             throws PaymentPluginApiException;
diff --git a/api/src/main/java/com/ning/billing/payment/plugin/api/RefundInfoPlugin.java b/api/src/main/java/com/ning/billing/payment/plugin/api/RefundInfoPlugin.java
index c0c6662..4ac0695 100644
--- a/api/src/main/java/com/ning/billing/payment/plugin/api/RefundInfoPlugin.java
+++ b/api/src/main/java/com/ning/billing/payment/plugin/api/RefundInfoPlugin.java
@@ -57,4 +57,10 @@ public interface RefundInfoPlugin {
      * @return gateway error code, if any
      */
     public String getGatewayErrorCode();
+
+    /**
+     *
+     * @return the reference id
+     */
+    public String getReferenceId();
 }
diff --git a/beatrix/src/main/java/com/ning/billing/beatrix/extbus/BeatrixListener.java b/beatrix/src/main/java/com/ning/billing/beatrix/extbus/BeatrixListener.java
index 4ffc2bb..07b4cf7 100644
--- a/beatrix/src/main/java/com/ning/billing/beatrix/extbus/BeatrixListener.java
+++ b/beatrix/src/main/java/com/ning/billing/beatrix/extbus/BeatrixListener.java
@@ -46,6 +46,9 @@ import com.ning.billing.util.events.OverdueChangeInternalEvent;
 import com.ning.billing.util.events.PaymentErrorInternalEvent;
 import com.ning.billing.util.events.PaymentInfoInternalEvent;
 import com.ning.billing.util.events.SubscriptionInternalEvent;
+import com.ning.billing.util.events.UserTagCreationInternalEvent;
+import com.ning.billing.util.events.UserTagDefinitionCreationInternalEvent;
+import com.ning.billing.util.events.UserTagDefinitionDeletionInternalEvent;
 import com.ning.billing.util.svcsapi.bus.InternalBus.EventBusException;
 
 import com.google.common.eventbus.Subscribe;
@@ -153,14 +156,26 @@ public class BeatrixListener {
             break;
 
        case USER_TAG_CREATION:
+           UserTagCreationInternalEvent realUserTagEventCr = (UserTagCreationInternalEvent) event;
+           objectType = ObjectType.TAG;
+           objectId = realUserTagEventCr.getTagId();
+           eventBusType = ExtBusEventType.TAG_CREATION;
+           break;
+
        case CONTROL_TAG_CREATION:
            ControlTagCreationInternalEvent realTagEventCr = (ControlTagCreationInternalEvent) event;
            objectType = ObjectType.TAG;
            objectId = realTagEventCr.getTagId();
            eventBusType = ExtBusEventType.TAG_CREATION;
-            break;
+           break;
 
        case USER_TAG_DELETION:
+           UserTagDefinitionDeletionInternalEvent realUserTagEventDel = (UserTagDefinitionDeletionInternalEvent) event;
+           objectType = ObjectType.TAG;
+           objectId = null; // TODO missing..
+           eventBusType = ExtBusEventType.TAG_DELETION;
+           break;
+
        case CONTROL_TAG_DELETION:
            ControlTagDeletionInternalEvent realTagEventDel = (ControlTagDeletionInternalEvent) event;
            objectType = ObjectType.TAG;
diff --git a/beatrix/src/main/java/com/ning/billing/beatrix/extbus/dao/ExtBusSqlDao.java b/beatrix/src/main/java/com/ning/billing/beatrix/extbus/dao/ExtBusSqlDao.java
index 913b94a..6a40311 100644
--- a/beatrix/src/main/java/com/ning/billing/beatrix/extbus/dao/ExtBusSqlDao.java
+++ b/beatrix/src/main/java/com/ning/billing/beatrix/extbus/dao/ExtBusSqlDao.java
@@ -83,16 +83,24 @@ public interface ExtBusSqlDao extends Transactional<ExtBusSqlDao>, CloseMe {
 
         @Override
         public void bind(@SuppressWarnings("rawtypes") final SQLStatement stmt, final Bind bind, final ExtBusEventEntry evt) {
-            stmt.bind("eventType", evt.getExtBusType().toString());
-            stmt.bind("objectId", evt.getObjectId().toString());
-            stmt.bind("objectType", evt.getObjectType().toString());
+            stmt.bind("eventType", extractWithNullValue(evt.getExtBusType().toString()));
+            stmt.bind("objectId", extractWithNullValue(evt.getObjectId().toString()));
+            stmt.bind("objectType", extractWithNullValue(evt.getObjectType().toString()));
             stmt.bind("userToken", getUUIDString(evt.getUserToken()));
             stmt.bind("createdDate", getDate(new DateTime()));
-            stmt.bind("creatingOwner", evt.getCreatedOwner());
+            stmt.bind("creatingOwner", extractWithNullValue(evt.getCreatedOwner()));
             stmt.bind("processingAvailableDate", getDate(evt.getNextAvailableDate()));
-            stmt.bind("processingOwner", evt.getOwner());
+            stmt.bind("processingOwner", extractWithNullValue(evt.getOwner()));
             stmt.bind("processingState", PersistentQueueEntryLifecycleState.AVAILABLE.toString());
         }
+
+        private String extractWithNullValue(Object obj) {
+            if (obj == null) {
+                return null;
+            }
+            return obj.toString();
+        }
+
     }
 
     public static class ExtBusSqlMapper extends MapperBase implements ResultSetMapper<ExtBusEventEntry> {
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueBase.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueBase.java
index 3594ec2..f035a12 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueBase.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueBase.java
@@ -13,11 +13,8 @@
  * License for the specific language governing permissions and limitations
  * under the License.
  */
-package com.ning.billing.beatrix.integration.overdue;
 
-import static com.jayway.awaitility.Awaitility.await;
-import static java.util.concurrent.TimeUnit.SECONDS;
-import static org.testng.Assert.assertNotNull;
+package com.ning.billing.beatrix.integration.overdue;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
@@ -35,8 +32,13 @@ import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.overdue.config.OverdueConfig;
 import com.ning.billing.payment.api.PaymentMethodPlugin;
+import com.ning.billing.payment.api.TestPaymentMethodPluginBase;
 import com.ning.billing.util.config.catalog.XMLLoader;
 
+import static com.jayway.awaitility.Awaitility.await;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.testng.Assert.assertNotNull;
+
 public abstract class TestOverdueBase extends TestIntegrationBase {
 
 
@@ -48,31 +50,11 @@ public abstract class TestOverdueBase extends TestIntegrationBase {
 
     public abstract String getOverdueConfig();
 
-    final PaymentMethodPlugin paymentMethodPlugin = new PaymentMethodPlugin() {
-        @Override
-        public boolean isDefaultPaymentMethod() {
-            return false;
-        }
-
-        @Override
-        public String getValueString(final String key) {
-            return null;
-        }
-
-        @Override
-        public List<PaymentMethodKVInfo> getProperties() {
-            return null;
-        }
-
-        @Override
-        public String getExternalPaymentMethodId() {
-            return UUID.randomUUID().toString();
-        }
-    };
+    final PaymentMethodPlugin paymentMethodPlugin = new TestPaymentMethodPluginBase();
 
     @Override
     @BeforeMethod(groups = "slow")
-    public void beforeMethod( ) throws Exception {
+    public void beforeMethod() throws Exception {
         super.beforeMethod();
         final String configXml = getOverdueConfig();
         final InputStream is = new ByteArrayInputStream(configXml.getBytes());
@@ -110,6 +92,4 @@ public abstract class TestOverdueBase extends TestIntegrationBase {
             Assert.assertEquals(blockingApi.getBlockingStateFor(bundle, internalCallContext).getStateName(), expected, "Got exception: " + e.toString());
         }
     }
-
-
 }
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueIntegration.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueIntegration.java
index 5ad8c97..94f8e77 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueIntegration.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueIntegration.java
@@ -366,7 +366,7 @@ public class TestOverdueIntegration extends TestOverdueBase {
         checkODState(DefaultBlockingState.CLEAR_STATE_NAME);
 
         // Now, refund the second (first non-zero dollar) invoice
-        final Payment payment = paymentApi.getPayment(invoiceUserApi.getInvoicesByAccount(account.getId(), callContext).get(1).getPayments().get(0).getPaymentId(), callContext);
+        final Payment payment = paymentApi.getPayment(invoiceUserApi.getInvoicesByAccount(account.getId(), callContext).get(1).getPayments().get(0).getPaymentId(), false, callContext);
         refundPaymentAndCheckForCompletion(account, payment, NextEvent.INVOICE_ADJUSTMENT);
         // We should now be in OD1
         checkODState("OD1");
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationBase.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationBase.java
index 8ca8e55..9c83c43 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationBase.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationBase.java
@@ -79,6 +79,7 @@ import com.ning.billing.payment.api.Payment;
 import com.ning.billing.payment.api.PaymentApi;
 import com.ning.billing.payment.api.PaymentApiException;
 import com.ning.billing.payment.api.PaymentMethodPlugin;
+import com.ning.billing.payment.api.TestPaymentMethodPluginBase;
 import com.ning.billing.payment.provider.MockPaymentProviderPlugin;
 import com.ning.billing.util.api.TagUserApi;
 import com.ning.billing.util.config.OSGIConfig;
@@ -331,32 +332,18 @@ public class TestIntegrationBase extends BeatrixTestSuiteWithEmbeddedDB implemen
         return accountUserApi.getAccountById(account.getId(), callContext);
     }
 
+    private class TestPaymentMethodPlugin extends TestPaymentMethodPluginBase {
+        @Override
+        public List<PaymentMethodKVInfo> getProperties() {
+            PaymentMethodKVInfo prop = new PaymentMethodKVInfo("whatever", "cool", Boolean.TRUE);
+            List<PaymentMethodKVInfo> res = new ArrayList<PaymentMethodKVInfo>();
+            res.add(prop);
+            return res;
+        }
+    }
 
     protected PaymentMethodPlugin createPaymentMethodPlugin() {
-        return new PaymentMethodPlugin() {
-            @Override
-            public boolean isDefaultPaymentMethod() {
-                return false;
-            }
-
-            @Override
-            public String getValueString(final String key) {
-                return null;
-            }
-
-            @Override
-            public List<PaymentMethodKVInfo> getProperties() {
-                PaymentMethodKVInfo prop = new PaymentMethodKVInfo("whatever", "cool", Boolean.TRUE);
-                List<PaymentMethodKVInfo> res = new ArrayList<PaymentMethodKVInfo>();
-                res.add(prop);
-                return res;
-            }
-
-            @Override
-            public String getExternalPaymentMethodId() {
-                return UUID.randomUUID().toString();
-            }
-        };
+        return new TestPaymentMethodPlugin();
     }
 
     protected AccountData getAccountData(final int billingDay) {
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentMethodJson.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentMethodJson.java
index 29dbb7b..1a7e1c9 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentMethodJson.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentMethodJson.java
@@ -121,6 +121,78 @@ public class PaymentMethodJson {
                     }
 
                     @Override
+                    public String getType() {
+                        // N/A
+                        return null;
+                    }
+
+                    @Override
+                    public String getCCName() {
+                        // N/A
+                        return null;
+                    }
+
+                    @Override
+                    public String getCCType() {
+                        // N/A
+                        return null;
+                    }
+
+                    @Override
+                    public String getCCExprirationMonth() {
+                        // N/A
+                        return null;
+                    }
+
+                    @Override
+                    public String getCCExprirationYear() {
+                        // N/A
+                        return null;
+                    }
+
+                    @Override
+                    public String getCCLast4() {
+                        // N/A
+                        return null;
+                    }
+
+                    @Override
+                    public String getAddress1() {
+                        // N/A
+                        return null;
+                    }
+
+                    @Override
+                    public String getAddress2() {
+                        // N/A
+                        return null;
+                    }
+
+                    @Override
+                    public String getCity() {
+                        // N/A
+                        return null;
+                    }
+
+                    @Override
+                    public String getState() {
+                        // N/A
+                        return null;
+                    }
+
+                    @Override
+                    public String getZip() {
+                        // N/A
+                        return null;
+                    }
+
+                    @Override
+                    public String getCountry() {
+                        // N/A
+                        return null;
+                    }
+
+                    @Override
                     public String getExternalPaymentMethodId() {
                         return pluginInfo.getExternalPaymentId();
                     }
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/PaymentResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/PaymentResource.java
index a694f3f..4d41e06 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/PaymentResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/PaymentResource.java
@@ -106,7 +106,7 @@ public class PaymentResource extends JaxRsResourceBase {
         final TenantContext tenantContext = context.createContext(request);
 
         final UUID paymentId = UUID.fromString(paymentIdString);
-        final Payment payment = paymentApi.getPayment(paymentId, tenantContext);
+        final Payment payment = paymentApi.getPayment(paymentId, false, tenantContext);
 
         final PaymentJsonSimple paymentJsonSimple;
         if (withRefundsAndChargebacks) {
@@ -167,7 +167,7 @@ public class PaymentResource extends JaxRsResourceBase {
         final CallContext callContext = context.createContext(createdBy, reason, comment, request);
 
         final UUID paymentUuid = UUID.fromString(paymentId);
-        final Payment payment = paymentApi.getPayment(paymentUuid, callContext);
+        final Payment payment = paymentApi.getPayment(paymentUuid, false, callContext);
         final Account account = accountApi.getAccountById(payment.getAccountId(), callContext);
 
         final Refund result;
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/RefundResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/RefundResource.java
index 1db623d..5a0bade 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/RefundResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/RefundResource.java
@@ -62,7 +62,7 @@ public class RefundResource extends JaxRsResourceBase {
     @Produces(APPLICATION_JSON)
     public Response getRefund(@PathParam("refundId") final String refundId,
                               @javax.ws.rs.core.Context final HttpServletRequest request) throws PaymentApiException {
-        final Refund refund = paymentApi.getRefund(UUID.fromString(refundId), context.createContext(request));
+        final Refund refund = paymentApi.getRefund(UUID.fromString(refundId), false, context.createContext(request));
         // TODO Return adjusted items and audits
         return Response.status(Status.OK).entity(new RefundJson(refund, null, null)).build();
     }
diff --git a/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/JRubyPaymentPlugin.java b/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/JRubyPaymentPlugin.java
index ddd411e..37e8f37 100644
--- a/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/JRubyPaymentPlugin.java
+++ b/osgi-bundles/bundles/jruby/src/main/java/com/ning/billing/osgi/bundles/jruby/JRubyPaymentPlugin.java
@@ -104,6 +104,16 @@ public class JRubyPaymentPlugin extends JRubyPlugin implements PaymentPluginApi 
     }
 
     @Override
+    public List<RefundInfoPlugin> getRefundInfo(final UUID kbAccountId, final UUID kbPaymentId, final CallContext context) throws PaymentPluginApiException {
+        return callWithRuntimeAndChecking(new PluginCallback()  {
+            @Override
+            public List<RefundInfoPlugin> doCall(final Ruby runtime) throws PaymentPluginApiException {
+                return ((PaymentPluginApi) pluginInstance).getRefundInfo(kbAccountId, kbPaymentId, context);
+            }
+        });
+    }
+
+    @Override
     public void addPaymentMethod(final UUID kbAccountId, final UUID kbPaymentMethodId, final PaymentMethodPlugin paymentMethodProps, final boolean setDefault, final CallContext context) throws PaymentPluginApiException {
 
         callWithRuntimeAndChecking(new PluginCallback() {
diff --git a/osgi-bundles/tests/beatrix/src/test/java/com/ning/billing/osgi/bundles/test/TestPaymentPluginApi.java b/osgi-bundles/tests/beatrix/src/test/java/com/ning/billing/osgi/bundles/test/TestPaymentPluginApi.java
index ee22e5a..7ca9201 100644
--- a/osgi-bundles/tests/beatrix/src/test/java/com/ning/billing/osgi/bundles/test/TestPaymentPluginApi.java
+++ b/osgi-bundles/tests/beatrix/src/test/java/com/ning/billing/osgi/bundles/test/TestPaymentPluginApi.java
@@ -17,6 +17,7 @@
 package com.ning.billing.osgi.bundles.test;
 
 import java.math.BigDecimal;
+import java.util.Collections;
 import java.util.List;
 import java.util.UUID;
 
@@ -71,6 +72,16 @@ public class TestPaymentPluginApi implements PaymentPluginApi {
             public String getGatewayErrorCode() {
                 return null;
             }
+
+            @Override
+            public String getFirstPaymentReferenceId() {
+                return null;
+            }
+
+            @Override
+            public String getSecondPaymentReferenceId() {
+                return null;
+            }
         };
     }
 
@@ -85,6 +96,11 @@ public class TestPaymentPluginApi implements PaymentPluginApi {
     }
 
     @Override
+    public List<RefundInfoPlugin> getRefundInfo(final UUID kbAccountId, final UUID kbPaymentId, final CallContext context) {
+        return Collections.<RefundInfoPlugin>emptyList();
+    }
+
+    @Override
     public void addPaymentMethod(final UUID kbAccountId, final UUID kbPaymentMethodId, final PaymentMethodPlugin paymentMethodProps, final boolean setDefault, final CallContext context) throws PaymentPluginApiException {
     }
 
diff --git a/osgi-bundles/tests/payment/src/test/java/com/ning/billing/osgi/bundles/test/TestPaymentPluginApi.java b/osgi-bundles/tests/payment/src/test/java/com/ning/billing/osgi/bundles/test/TestPaymentPluginApi.java
index 82acb4b..66959e9 100644
--- a/osgi-bundles/tests/payment/src/test/java/com/ning/billing/osgi/bundles/test/TestPaymentPluginApi.java
+++ b/osgi-bundles/tests/payment/src/test/java/com/ning/billing/osgi/bundles/test/TestPaymentPluginApi.java
@@ -17,6 +17,7 @@
 package com.ning.billing.osgi.bundles.test;
 
 import java.math.BigDecimal;
+import java.util.Collections;
 import java.util.List;
 import java.util.UUID;
 
@@ -71,6 +72,16 @@ public class TestPaymentPluginApi implements PaymentPluginApiWithTestControl {
             public String getGatewayErrorCode() {
                 return null;
             }
+
+            @Override
+            public String getFirstPaymentReferenceId() {
+                return null;
+            }
+
+            @Override
+            public String getSecondPaymentReferenceId() {
+                return null;
+            }
         });
     }
 
@@ -103,6 +114,16 @@ public class TestPaymentPluginApi implements PaymentPluginApiWithTestControl {
             public String getGatewayErrorCode() {
                 return null;
             }
+
+            @Override
+            public String getFirstPaymentReferenceId() {
+                return null;
+            }
+
+            @Override
+            public String getSecondPaymentReferenceId() {
+                return null;
+            }
         });
     }
 
@@ -135,10 +156,20 @@ public class TestPaymentPluginApi implements PaymentPluginApiWithTestControl {
             public String getGatewayErrorCode() {
                 return null;
             }
+
+            @Override
+            public String getReferenceId() {
+                return null;
+            }
         });
     }
 
     @Override
+    public List<RefundInfoPlugin> getRefundInfo(final UUID kbAccountId, final UUID kbPaymentId, final CallContext context) {
+        return Collections.<RefundInfoPlugin>emptyList();
+    }
+
+    @Override
     public void addPaymentMethod(final UUID kbAccountId, final UUID kbPaymentMethodId, final PaymentMethodPlugin paymentMethodProps, final boolean setDefault, final CallContext context) throws PaymentPluginApiException {
     }
 
diff --git a/payment/src/main/java/com/ning/billing/payment/api/DefaultPayment.java b/payment/src/main/java/com/ning/billing/payment/api/DefaultPayment.java
index a9ed30d..a036ed0 100644
--- a/payment/src/main/java/com/ning/billing/payment/api/DefaultPayment.java
+++ b/payment/src/main/java/com/ning/billing/payment/api/DefaultPayment.java
@@ -31,6 +31,7 @@ import com.ning.billing.payment.dao.PaymentAttemptModelDao;
 import com.ning.billing.payment.dao.PaymentModelDao;
 import com.ning.billing.payment.dao.RefundModelDao;
 import com.ning.billing.payment.dao.RefundModelDao.RefundStatus;
+import com.ning.billing.payment.plugin.api.PaymentInfoPlugin;
 import com.ning.billing.util.entity.EntityBase;
 
 import com.google.common.base.Function;
@@ -50,11 +51,14 @@ public class DefaultPayment extends EntityBase implements Payment {
     private final String extFirstPaymentIdRef;
     private final String extSecondPaymentIdRef;
     private final List<PaymentAttempt> attempts;
+    private final PaymentInfoPlugin paymentPluginInfo;
 
     private DefaultPayment(final UUID id, @Nullable final DateTime createdDate, @Nullable final DateTime updatedDate, final UUID accountId, final UUID invoiceId,
                            final UUID paymentMethodId, final BigDecimal amount, final BigDecimal paidAmount, final Currency currency,
                            final DateTime effectiveDate, final Integer paymentNumber,
-                           final PaymentStatus paymentStatus, final String paymentError, final String extFirstPaymentIdRef,
+                           final PaymentStatus paymentStatus, final String paymentError,
+                           final PaymentInfoPlugin paymentPluginInfo,
+                           final String extFirstPaymentIdRef,
                            final String extSecondPaymentIdRef, final List<PaymentAttempt> attempts) {
         super(id, createdDate, updatedDate);
         this.accountId = accountId;
@@ -69,9 +73,10 @@ public class DefaultPayment extends EntityBase implements Payment {
         this.extFirstPaymentIdRef = extFirstPaymentIdRef;
         this.extSecondPaymentIdRef = extSecondPaymentIdRef;
         this.attempts = attempts;
+        this.paymentPluginInfo = paymentPluginInfo;
     }
 
-    public DefaultPayment(final PaymentModelDao src, final List<PaymentAttemptModelDao> attempts, final List<RefundModelDao> refunds) {
+    public DefaultPayment(final PaymentModelDao src, final PaymentInfoPlugin paymentPluginInfo, final List<PaymentAttemptModelDao> attempts, final List<RefundModelDao> refunds) {
         this(src.getId(),
              src.getCreatedDate(),
              src.getUpdatedDate(),
@@ -85,6 +90,7 @@ public class DefaultPayment extends EntityBase implements Payment {
              src.getPaymentNumber(),
              src.getPaymentStatus(),
              null,
+             paymentPluginInfo,
              src.getExtFirstPaymentRefId(),
              src.getExtSecondPaymentRefId(),
              toPaymentAttempts(attempts));
@@ -146,6 +152,11 @@ public class DefaultPayment extends EntityBase implements Payment {
     }
 
     @Override
+    public PaymentInfoPlugin getPaymentInfoPlugin() {
+        return paymentPluginInfo;
+    }
+
+    @Override
     public List<PaymentAttempt> getAttempts() {
         return attempts;
     }
diff --git a/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentApi.java b/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentApi.java
index 8777ae4..b996ecf 100644
--- a/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentApi.java
+++ b/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentApi.java
@@ -67,8 +67,8 @@ public class DefaultPaymentApi implements PaymentApi {
     }
 
     @Override
-    public Payment getPayment(final UUID paymentId, final TenantContext context) throws PaymentApiException {
-        final Payment payment = paymentProcessor.getPayment(paymentId, internalCallContextFactory.createInternalTenantContext(context));
+    public Payment getPayment(final UUID paymentId, final boolean withPluginInfo, final TenantContext context) throws PaymentApiException {
+        final Payment payment = paymentProcessor.getPayment(paymentId, withPluginInfo, internalCallContextFactory.createInternalTenantContext(context));
         if (payment == null) {
             throw new PaymentApiException(ErrorCode.PAYMENT_NO_SUCH_PAYMENT, paymentId);
         }
@@ -87,8 +87,8 @@ public class DefaultPaymentApi implements PaymentApi {
     }
 
     @Override
-    public Refund getRefund(final UUID refundId, final TenantContext context) throws PaymentApiException {
-        return refundProcessor.getRefund(refundId, internalCallContextFactory.createInternalTenantContext(context));
+    public Refund getRefund(final UUID refundId, final boolean withPluginInfo, final TenantContext context) throws PaymentApiException {
+        return refundProcessor.getRefund(refundId, withPluginInfo, internalCallContextFactory.createInternalTenantContext(context));
     }
 
     @Override
diff --git a/payment/src/main/java/com/ning/billing/payment/api/DefaultRefund.java b/payment/src/main/java/com/ning/billing/payment/api/DefaultRefund.java
index 5cc7297..6d512ca 100644
--- a/payment/src/main/java/com/ning/billing/payment/api/DefaultRefund.java
+++ b/payment/src/main/java/com/ning/billing/payment/api/DefaultRefund.java
@@ -24,6 +24,7 @@ import javax.annotation.Nullable;
 import org.joda.time.DateTime;
 
 import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.payment.plugin.api.RefundInfoPlugin;
 import com.ning.billing.util.entity.EntityBase;
 
 public class DefaultRefund extends EntityBase implements Refund {
@@ -71,6 +72,12 @@ public class DefaultRefund extends EntityBase implements Refund {
     }
 
     @Override
+    public RefundInfoPlugin getPluginDetail() {
+        // TODO not implemented
+        return null;
+    }
+
+    @Override
     public String toString() {
         final StringBuilder sb = new StringBuilder();
         sb.append("DefaultRefund");
diff --git a/payment/src/main/java/com/ning/billing/payment/api/svcs/DefaultPaymentInternalApi.java b/payment/src/main/java/com/ning/billing/payment/api/svcs/DefaultPaymentInternalApi.java
index 673ea85..8368304 100644
--- a/payment/src/main/java/com/ning/billing/payment/api/svcs/DefaultPaymentInternalApi.java
+++ b/payment/src/main/java/com/ning/billing/payment/api/svcs/DefaultPaymentInternalApi.java
@@ -44,7 +44,7 @@ public class DefaultPaymentInternalApi implements PaymentInternalApi {
 
     @Override
     public Payment getPayment(final UUID paymentId, final InternalTenantContext context) throws PaymentApiException {
-        final Payment payment = paymentProcessor.getPayment(paymentId, context);
+        final Payment payment = paymentProcessor.getPayment(paymentId, false, context);
         if (payment == null) {
             throw new PaymentApiException(ErrorCode.PAYMENT_NO_SUCH_PAYMENT, paymentId);
         }
diff --git a/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java b/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
index f33a55e..7e2663f 100644
--- a/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
@@ -117,12 +117,21 @@ public class PaymentProcessor extends ProcessorBase {
         this.voidPluginDispatcher = new PluginDispatcher<Void>(executor);
     }
 
-    public Payment getPayment(final UUID paymentId, final InternalTenantContext context) {
+    public Payment getPayment(final UUID paymentId, final boolean withPluginInfo, final InternalTenantContext context) throws PaymentApiException {
         final PaymentModelDao model = paymentDao.getPayment(paymentId, context);
         if (model == null) {
             return null;
         }
-        return getPayments(Collections.singletonList(model), context).get(0);
+        final PaymentPluginApi plugin = withPluginInfo ? getPaymentProviderPlugin(model.getPaymentMethodId(), context) : null;
+        PaymentInfoPlugin pluginInfo = null;
+        if (plugin != null) {
+            try {
+                pluginInfo = plugin.getPaymentInfo(model.getAccountId(), paymentId, context.toTenantContext());
+            } catch (PaymentPluginApiException e) {
+                throw new PaymentApiException(ErrorCode.PAYMENT_PLUGIN_GET_PAYMENT_INFO, paymentId, e.toString());
+            }
+        }
+        return fromPaymentModelDao(model, pluginInfo, context);
     }
 
 
@@ -141,14 +150,19 @@ public class PaymentProcessor extends ProcessorBase {
         }
         final List<Payment> result = new LinkedList<Payment>();
         for (final PaymentModelDao cur : payments) {
-            final List<PaymentAttemptModelDao> attempts = paymentDao.getAttemptsForPayment(cur.getId(), context);
-            final List<RefundModelDao> refunds = paymentDao.getRefundsForPayment(cur.getId(), context);
-            final Payment entry = new DefaultPayment(cur, attempts, refunds);
+            final Payment entry = fromPaymentModelDao(cur, null, context);
             result.add(entry);
         }
         return result;
     }
 
+    private Payment fromPaymentModelDao(final PaymentModelDao input, final PaymentInfoPlugin pluginInfo, final InternalTenantContext context) {
+        final List<PaymentAttemptModelDao> attempts = paymentDao.getAttemptsForPayment(input.getId(), context);
+        final List<RefundModelDao> refunds = paymentDao.getRefundsForPayment(input.getId(), context);
+        final Payment payment = new DefaultPayment(input, pluginInfo, attempts, refunds);
+        return payment;
+    }
+
     public void process_AUTO_PAY_OFF_removal(final Account account, final InternalCallContext context) throws PaymentApiException {
 
         try {
@@ -388,7 +402,7 @@ public class PaymentProcessor extends ProcessorBase {
         final PaymentAttemptModelDao attempt = new PaymentAttemptModelDao(account.getId(), invoice.getId(), paymentInfo.getId(), paymentStatus, clock.getUTCNow(), requestedAmount);
 
         paymentDao.insertPaymentWithAttempt(paymentInfo, attempt, context);
-        return new DefaultPayment(paymentInfo, Collections.singletonList(attempt), Collections.<RefundModelDao>emptyList());
+        return fromPaymentModelDao(paymentInfo, null, context);
     }
 
     private Payment processNewPaymentWithAccountLocked(final UUID paymentMethodId, final PaymentPluginApi plugin, final Account account, final Invoice invoice,
@@ -416,15 +430,16 @@ public class PaymentProcessor extends ProcessorBase {
         if (paymentConfig.isPaymentOff()) {
             paymentDao.updateStatusForPaymentWithAttempt(paymentInput.getId(), PaymentStatus.PAYMENT_SYSTEM_OFF, null, null, attemptInput.getId(), context);
             allAttempts = paymentDao.getAttemptsForPayment(paymentInput.getId(), context);
-            return new DefaultPayment(paymentInput, allAttempts, Collections.<RefundModelDao>emptyList());
+            return new DefaultPayment(paymentInput, null, allAttempts, Collections.<RefundModelDao>emptyList());
         }
 
         PaymentModelDao payment = null;
         BusInternalEvent event = null;
         PaymentStatus paymentStatus;
+        final PaymentInfoPlugin paymentPluginInfo;
         try {
 
-            final PaymentInfoPlugin paymentPluginInfo = plugin.processPayment(account.getId(), paymentInput.getId(), paymentInput.getPaymentMethodId(), attemptInput.getRequestedAmount(), account.getCurrency(), context.toCallContext());
+            paymentPluginInfo = plugin.processPayment(account.getId(), paymentInput.getId(), paymentInput.getPaymentMethodId(), attemptInput.getRequestedAmount(), account.getCurrency(), context.toCallContext());
             switch (paymentPluginInfo.getStatus()) {
                 case PROCESSED:
                     // Update Payment/PaymentAttempt status
@@ -491,7 +506,8 @@ public class PaymentProcessor extends ProcessorBase {
                 postPaymentEvent(event, account.getId(), context);
             }
         }
-        return new DefaultPayment(payment, allAttempts, Collections.<RefundModelDao>emptyList());
+
+        return new DefaultPayment(payment, paymentPluginInfo, allAttempts, Collections.<RefundModelDao>emptyList());
     }
 
     private PaymentStatus scheduleRetryOnPluginFailure(final UUID paymentId, final InternalTenantContext context) {
diff --git a/payment/src/main/java/com/ning/billing/payment/core/RefundProcessor.java b/payment/src/main/java/com/ning/billing/payment/core/RefundProcessor.java
index 6778994..86068e9 100644
--- a/payment/src/main/java/com/ning/billing/payment/core/RefundProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/core/RefundProcessor.java
@@ -183,7 +183,7 @@ public class RefundProcessor extends ProcessorBase {
         throw new IllegalArgumentException("Unable to find invoice item for id " + itemId);
     }
 
-    public Refund getRefund(final UUID refundId, final InternalTenantContext context)
+    public Refund getRefund(final UUID refundId, final boolean withPluginInfo /* not yet implemented */ , final InternalTenantContext context)
             throws PaymentApiException {
         RefundModelDao result = paymentDao.getRefund(refundId, context);
         if (result == null) {
diff --git a/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpPaymentInfoPlugin.java b/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpPaymentInfoPlugin.java
index bf10051..6c52b9d 100644
--- a/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpPaymentInfoPlugin.java
+++ b/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpPaymentInfoPlugin.java
@@ -70,6 +70,16 @@ public class DefaultNoOpPaymentInfoPlugin implements PaymentInfoPlugin {
     }
 
     @Override
+    public String getFirstPaymentReferenceId() {
+        return null;
+    }
+
+    @Override
+    public String getSecondPaymentReferenceId() {
+        return null;
+    }
+
+    @Override
     public String toString() {
         final StringBuilder sb = new StringBuilder();
         sb.append("DefaultNoOpPaymentInfoPlugin");
diff --git a/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpPaymentMethodPlugin.java b/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpPaymentMethodPlugin.java
index a124373..9f135da 100644
--- a/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpPaymentMethodPlugin.java
+++ b/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpPaymentMethodPlugin.java
@@ -75,6 +75,66 @@ public class DefaultNoOpPaymentMethodPlugin implements PaymentMethodPlugin {
     }
 
     @Override
+    public String getType() {
+        return "noop";
+    }
+
+    @Override
+    public String getCCName() {
+        return null;
+    }
+
+    @Override
+    public String getCCType() {
+        return null;
+    }
+
+    @Override
+    public String getCCExprirationMonth() {
+        return null;
+    }
+
+    @Override
+    public String getCCExprirationYear() {
+        return null;
+    }
+
+    @Override
+    public String getCCLast4() {
+        return null;
+    }
+
+    @Override
+    public String getAddress1() {
+        return null;
+    }
+
+    @Override
+    public String getAddress2() {
+        return null;
+    }
+
+    @Override
+    public String getCity() {
+        return null;
+    }
+
+    @Override
+    public String getState() {
+        return null;
+    }
+
+    @Override
+    public String getZip() {
+        return null;
+    }
+
+    @Override
+    public String getCountry() {
+        return null;
+    }
+
+    @Override
     public String toString() {
         final StringBuilder sb = new StringBuilder();
         sb.append("DefaultNoOpPaymentMethodPlugin");
diff --git a/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpPaymentProviderPlugin.java b/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpPaymentProviderPlugin.java
index bc046b0..f31b1fd 100644
--- a/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpPaymentProviderPlugin.java
+++ b/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpPaymentProviderPlugin.java
@@ -37,6 +37,7 @@ import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.TenantContext;
 import com.ning.billing.util.clock.Clock;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.LinkedListMultimap;
 import com.google.common.collect.Multimap;
 import com.google.inject.Inject;
@@ -178,4 +179,9 @@ public class DefaultNoOpPaymentProviderPlugin implements NoOpPaymentPluginApi {
 
         return refundInfoPlugin;
     }
+
+    @Override
+    public List<RefundInfoPlugin> getRefundInfo(final UUID kbAccountId, final UUID kbPaymentId, final CallContext context) {
+        return ImmutableList.<RefundInfoPlugin>copyOf(refunds.get(kbPaymentId.toString()));
+    }
 }
diff --git a/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpRefundInfoPlugin.java b/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpRefundInfoPlugin.java
index d9b9805..0be96d2 100644
--- a/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpRefundInfoPlugin.java
+++ b/payment/src/main/java/com/ning/billing/payment/provider/DefaultNoOpRefundInfoPlugin.java
@@ -70,6 +70,11 @@ public class DefaultNoOpRefundInfoPlugin implements RefundInfoPlugin {
     }
 
     @Override
+    public String getReferenceId() {
+        return null;
+    }
+
+    @Override
     public String toString() {
         final StringBuilder sb = new StringBuilder();
         sb.append("DefaultNoOpRefundInfoPlugin");
diff --git a/payment/src/test/java/com/ning/billing/payment/provider/MockPaymentProviderPlugin.java b/payment/src/test/java/com/ning/billing/payment/provider/MockPaymentProviderPlugin.java
index 33497c4..6aebbd2 100644
--- a/payment/src/test/java/com/ning/billing/payment/provider/MockPaymentProviderPlugin.java
+++ b/payment/src/test/java/com/ning/billing/payment/provider/MockPaymentProviderPlugin.java
@@ -17,6 +17,7 @@
 package com.ning.billing.payment.provider;
 
 import java.math.BigDecimal;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
@@ -24,7 +25,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.payment.api.DefaultPaymentMethodPlugin;
+import com.ning.billing.payment.api.TestPaymentMethodPlugin;
 import com.ning.billing.payment.api.PaymentMethodPlugin;
 import com.ning.billing.payment.plugin.api.NoOpPaymentPluginApi;
 import com.ning.billing.payment.plugin.api.PaymentInfoPlugin;
@@ -115,7 +116,7 @@ public class MockPaymentProviderPlugin implements NoOpPaymentPluginApi {
     @Override
     public void addPaymentMethod(final UUID kbAccountId, final UUID kbPaymentMethodId, final PaymentMethodPlugin paymentMethodProps, final boolean setDefault, final CallContext context) throws PaymentPluginApiException {
         // externalPaymentMethodId is set to a random value
-        final PaymentMethodPlugin realWithID = new DefaultPaymentMethodPlugin(paymentMethodProps, UUID.randomUUID().toString());
+        final PaymentMethodPlugin realWithID = new TestPaymentMethodPlugin(paymentMethodProps, UUID.randomUUID().toString());
         paymentMethods.put(kbPaymentMethodId.toString(), realWithID);
 
         final PaymentMethodInfoPlugin realInfoWithID = new DefaultPaymentMethodInfoPlugin(kbAccountId, kbPaymentMethodId, setDefault, UUID.randomUUID().toString());
@@ -173,4 +174,9 @@ public class MockPaymentProviderPlugin implements NoOpPaymentPluginApi {
 
         return refundInfoPlugin;
     }
+
+    @Override
+    public List<RefundInfoPlugin> getRefundInfo(final UUID kbAccountId, final UUID kbPaymentId, final CallContext context) throws PaymentPluginApiException {
+        return Collections.<RefundInfoPlugin>emptyList();
+    }
 }
diff --git a/util/src/test/java/com/ning/billing/payment/api/TestPaymentMethodPluginBase.java b/util/src/test/java/com/ning/billing/payment/api/TestPaymentMethodPluginBase.java
new file mode 100644
index 0000000..da02ef1
--- /dev/null
+++ b/util/src/test/java/com/ning/billing/payment/api/TestPaymentMethodPluginBase.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2010-2013 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.payment.api;
+
+import java.util.List;
+import java.util.UUID;
+
+import com.google.common.collect.ImmutableList;
+
+public class TestPaymentMethodPluginBase implements PaymentMethodPlugin {
+
+    @Override
+    public String getExternalPaymentMethodId() {
+        return UUID.randomUUID().toString();
+    }
+
+    @Override
+    public boolean isDefaultPaymentMethod() {
+        return false;
+    }
+
+    @Override
+    public String getValueString(final String key) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getType() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getCCName() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getCCType() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getCCExprirationMonth() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getCCExprirationYear() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getCCLast4() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getAddress1() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getAddress2() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getCity() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getState() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getZip() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getCountry() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public List<PaymentMethodKVInfo> getProperties() {
+        return ImmutableList.<PaymentMethodKVInfo>of();
+    }
+}