killbill-aplcache

Changes

payment/src/main/java/com/ning/billing/payment/util/EventBusFuture.java 75(+0 -75)

payment/src/main/java/com/ning/billing/payment/util/EventBusRequest.java 23(+0 -23)

payment/src/main/java/com/ning/billing/payment/util/EventBusResponse.java 23(+0 -23)

payment/src/test/java/com/ning/billing/payment/util/TestSyncWaitOnEventBus.java 121(+0 -121)

pom.xml 2(+1 -1)

Details

diff --git a/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountChangeNotification.java b/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountChangeNotification.java
index 203a0f4..85401d7 100644
--- a/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountChangeNotification.java
+++ b/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountChangeNotification.java
@@ -17,7 +17,7 @@
 package com.ning.billing.account.api.user;
 
 import com.ning.billing.account.api.Account;
-import com.ning.billing.account.api.AccountChangeNotification;
+import com.ning.billing.account.api.AccountChangeEvent;
 import com.ning.billing.account.api.ChangedField;
 import com.ning.billing.account.api.DefaultChangedField;
 
@@ -25,7 +25,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
 
-public class DefaultAccountChangeNotification implements AccountChangeNotification {
+public class DefaultAccountChangeNotification implements AccountChangeEvent {
 	
 	private final UUID userToken;
     private final List<ChangedField> changedFields;
diff --git a/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountCreationEvent.java b/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountCreationEvent.java
index 8ce9342..9e5a9f1 100644
--- a/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountCreationEvent.java
+++ b/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountCreationEvent.java
@@ -17,13 +17,13 @@
 package com.ning.billing.account.api.user;
 
 import com.ning.billing.account.api.Account;
-import com.ning.billing.account.api.AccountCreationNotification;
+import com.ning.billing.account.api.AccountCreationEvent;
 import com.ning.billing.account.api.AccountData;
 import com.ning.billing.util.bus.BusEvent.BusEventType;
 
 import java.util.UUID;
 
-public class DefaultAccountCreationEvent implements AccountCreationNotification {
+public class DefaultAccountCreationEvent implements AccountCreationEvent {
 	
 	private final UUID userToken;	
     private final UUID id;
diff --git a/account/src/main/java/com/ning/billing/account/dao/AuditedAccountDao.java b/account/src/main/java/com/ning/billing/account/dao/AuditedAccountDao.java
index 57a9da4..b9a2b31 100644
--- a/account/src/main/java/com/ning/billing/account/dao/AuditedAccountDao.java
+++ b/account/src/main/java/com/ning/billing/account/dao/AuditedAccountDao.java
@@ -33,8 +33,8 @@ import com.google.inject.Inject;
 import com.ning.billing.ErrorCode;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
-import com.ning.billing.account.api.AccountChangeNotification;
-import com.ning.billing.account.api.AccountCreationNotification;
+import com.ning.billing.account.api.AccountChangeEvent;
+import com.ning.billing.account.api.AccountCreationEvent;
 import com.ning.billing.account.api.user.DefaultAccountChangeNotification;
 import com.ning.billing.account.api.user.DefaultAccountCreationEvent;
 import com.ning.billing.util.customfield.CustomField;
@@ -134,7 +134,7 @@ public class AuditedAccountDao implements AccountDao {
 
                     saveTagsFromWithinTransaction(account, transactionalDao, context);
                     saveCustomFieldsFromWithinTransaction(account, transactionalDao, context);
-                    AccountCreationNotification creationEvent = new DefaultAccountCreationEvent(account, context.getUserToken());
+                    AccountCreationEvent creationEvent = new DefaultAccountCreationEvent(account, context.getUserToken());
                     eventBus.post(creationEvent);
                     return null;
                 }
@@ -180,7 +180,7 @@ public class AuditedAccountDao implements AccountDao {
                     saveTagsFromWithinTransaction(account, accountSqlDao, context);
                     saveCustomFieldsFromWithinTransaction(account, accountSqlDao, context);
 
-                    AccountChangeNotification changeEvent = new DefaultAccountChangeNotification(account.getId(), context.getUserToken(), currentAccount, account);
+                    AccountChangeEvent changeEvent = new DefaultAccountChangeNotification(account.getId(), context.getUserToken(), currentAccount, account);
                     if (changeEvent.hasChanges()) {
                         eventBus.post(changeEvent);
                     }
diff --git a/account/src/test/java/com/ning/billing/account/dao/MockAccountDao.java b/account/src/test/java/com/ning/billing/account/dao/MockAccountDao.java
index c449a50..8761c81 100644
--- a/account/src/test/java/com/ning/billing/account/dao/MockAccountDao.java
+++ b/account/src/test/java/com/ning/billing/account/dao/MockAccountDao.java
@@ -25,7 +25,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import com.google.inject.Inject;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
-import com.ning.billing.account.api.AccountChangeNotification;
+import com.ning.billing.account.api.AccountChangeEvent;
 import com.ning.billing.account.api.user.DefaultAccountChangeNotification;
 import com.ning.billing.account.api.user.DefaultAccountCreationEvent;
 import com.ning.billing.util.callcontext.CallContext;
@@ -87,7 +87,7 @@ public class MockAccountDao implements AccountDao {
     public void update(Account account, CallContext context) {
         Account currentAccount = accounts.put(account.getId().toString(), account);
 
-        AccountChangeNotification changeEvent = new DefaultAccountChangeNotification(account.getId(), null, currentAccount, account);
+        AccountChangeEvent changeEvent = new DefaultAccountChangeNotification(account.getId(), null, currentAccount, account);
         if (changeEvent.hasChanges()) {
             try {
                 eventBus.post(changeEvent);
diff --git a/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java b/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java
index 3c3bab3..2d52ca8 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java
@@ -19,10 +19,10 @@ package com.ning.billing.analytics;
 import com.google.common.eventbus.Subscribe;
 import com.google.inject.Inject;
 import com.ning.billing.account.api.AccountApiException;
-import com.ning.billing.account.api.AccountChangeNotification;
-import com.ning.billing.account.api.AccountCreationNotification;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition;
-import com.ning.billing.invoice.api.InvoiceCreationNotification;
+import com.ning.billing.account.api.AccountChangeEvent;
+import com.ning.billing.account.api.AccountCreationEvent;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition;
+import com.ning.billing.invoice.api.InvoiceCreationEvent;
 import com.ning.billing.payment.api.PaymentError;
 import com.ning.billing.payment.api.PaymentInfo;
 
@@ -37,7 +37,7 @@ public class AnalyticsListener {
     }
 
     @Subscribe
-    public void handleSubscriptionTransitionChange(final SubscriptionTransition event) throws AccountApiException {
+    public void handleSubscriptionTransitionChange(final SubscriptionEventTransition event) throws AccountApiException {
         switch (event.getTransitionType()) {
             // A susbcription enters either through migration or as newly created subscription
             case MIGRATE_ENTITLEMENT:
@@ -66,12 +66,12 @@ public class AnalyticsListener {
     }
 
     @Subscribe
-    public void handleAccountCreation(final AccountCreationNotification event) {
+    public void handleAccountCreation(final AccountCreationEvent event) {
         bacRecorder.accountCreated(event.getData());
     }
 
     @Subscribe
-    public void handleAccountChange(final AccountChangeNotification event) {
+    public void handleAccountChange(final AccountChangeEvent event) {
         if (!event.hasChanges()) {
             return;
         }
@@ -80,7 +80,7 @@ public class AnalyticsListener {
     }
 
     @Subscribe
-    public void handleInvoice(final InvoiceCreationNotification event) {
+    public void handleInvoice(final InvoiceCreationEvent event) {
         bacRecorder.accountUpdated(event.getAccountId());
     }
 
diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
index 09fbc96..2bb02ea 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
@@ -24,7 +24,7 @@ import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionDao;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition;
 import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -48,39 +48,39 @@ public class BusinessSubscriptionTransitionRecorder
         this.accountApi = accountApi;
     }
 
-    public void subscriptionCreated(final SubscriptionTransition created) throws AccountApiException
+    public void subscriptionCreated(final SubscriptionEventTransition created) throws AccountApiException
     {
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionCreated(created.getNextPlan());
         recordTransition(event, created);
     }
 
-    public void subscriptionRecreated(final SubscriptionTransition recreated) throws AccountApiException
+    public void subscriptionRecreated(final SubscriptionEventTransition recreated) throws AccountApiException
     {
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionRecreated(recreated.getNextPlan());
         recordTransition(event, recreated);
     }
 
 
-    public void subscriptionCancelled(final SubscriptionTransition cancelled) throws AccountApiException
+    public void subscriptionCancelled(final SubscriptionEventTransition cancelled) throws AccountApiException
     {
         // cancelled.getNextPlan() is null here - need to look at the previous one to create the correct event name
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionCancelled(cancelled.getPreviousPlan());
         recordTransition(event, cancelled);
     }
 
-    public void subscriptionChanged(final SubscriptionTransition changed) throws AccountApiException
+    public void subscriptionChanged(final SubscriptionEventTransition changed) throws AccountApiException
     {
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionChanged(changed.getNextPlan());
         recordTransition(event, changed);
     }
 
-    public void subscriptionPhaseChanged(final SubscriptionTransition phaseChanged) throws AccountApiException
+    public void subscriptionPhaseChanged(final SubscriptionEventTransition phaseChanged) throws AccountApiException
     {
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionPhaseChanged(phaseChanged.getNextPlan(), phaseChanged.getNextState());
         recordTransition(event, phaseChanged);
     }
 
-    public void recordTransition(final BusinessSubscriptionEvent event, final SubscriptionTransition transition) throws AccountApiException
+    public void recordTransition(final BusinessSubscriptionEvent event, final SubscriptionEventTransition transition) throws AccountApiException
     {
         Currency currency = null;
         String transitionKey = null;
diff --git a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
index 56ce8ff..a086b35 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
@@ -42,7 +42,7 @@ import org.testng.annotations.Test;
 
 import com.google.inject.Inject;
 import com.ning.billing.account.api.Account;
-import com.ning.billing.account.api.AccountCreationNotification;
+import com.ning.billing.account.api.AccountCreationEvent;
 import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.account.api.user.DefaultAccountCreationEvent;
 import com.ning.billing.analytics.AnalyticsTestModule;
@@ -67,15 +67,16 @@ import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition;
 import com.ning.billing.entitlement.api.user.SubscriptionTransitionData;
 import com.ning.billing.entitlement.events.EntitlementEvent;
 import com.ning.billing.entitlement.events.user.ApiEventType;
-import com.ning.billing.invoice.api.InvoiceCreationNotification;
+import com.ning.billing.invoice.api.InvoiceCreationEvent;
 import com.ning.billing.invoice.api.user.DefaultInvoiceCreationNotification;
 import com.ning.billing.invoice.dao.InvoiceDao;
 import com.ning.billing.invoice.model.DefaultInvoice;
 import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
+import com.ning.billing.payment.api.DefaultPaymentInfo;
 import com.ning.billing.payment.api.PaymentAttempt;
 import com.ning.billing.payment.api.PaymentInfo;
 import com.ning.billing.payment.dao.PaymentDao;
@@ -132,11 +133,11 @@ public class TestAnalyticsService {
     @Inject
     private MysqlTestingHelper helper;
 
-    private SubscriptionTransition transition;
+    private SubscriptionEventTransition transition;
     private BusinessSubscriptionTransition expectedTransition;
 
-    private AccountCreationNotification accountCreationNotification;
-    private InvoiceCreationNotification invoiceCreationNotification;
+    private AccountCreationEvent accountCreationNotification;
+    private InvoiceCreationEvent invoiceCreationNotification;
     private PaymentInfo paymentInfoNotification;
 
     @BeforeMethod(groups = "slow")
@@ -260,7 +261,7 @@ public class TestAnalyticsService {
         invoiceCreationNotification = new DefaultInvoiceCreationNotification(invoice.getId(), account.getId(),
                 INVOICE_AMOUNT, ACCOUNT_CURRENCY, clock.getUTCNow(), null);
 
-        paymentInfoNotification = new PaymentInfo.Builder().setPaymentId(UUID.randomUUID().toString()).setPaymentMethod(PAYMENT_METHOD).setCardCountry(CARD_COUNTRY).build();
+        paymentInfoNotification = new DefaultPaymentInfo.Builder().setPaymentId(UUID.randomUUID().toString()).setPaymentMethod(PAYMENT_METHOD).setCardCountry(CARD_COUNTRY).build();
         final PaymentAttempt paymentAttempt = new PaymentAttempt(UUID.randomUUID(), invoice.getId(), account.getId(), BigDecimal.TEN,
                 ACCOUNT_CURRENCY, clock.getUTCNow(), clock.getUTCNow(), paymentInfoNotification.getPaymentId(), 1);
         paymentDao.createPaymentAttempt(paymentAttempt, context);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/MockSubscription.java b/analytics/src/test/java/com/ning/billing/analytics/MockSubscription.java
index 5edd023..6a83560 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/MockSubscription.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/MockSubscription.java
@@ -23,7 +23,7 @@ import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.Subscription;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.customfield.CustomField;
 
@@ -129,7 +129,7 @@ public class MockSubscription implements Subscription
     }
 
     @Override
-    public SubscriptionTransition getPendingTransition() {
+    public SubscriptionEventTransition getPendingTransition() {
         throw new UnsupportedOperationException();
     }
 
@@ -144,7 +144,7 @@ public class MockSubscription implements Subscription
 	}
 
     @Override
-    public SubscriptionTransition getPreviousTransition() {
+    public SubscriptionEventTransition getPreviousTransition() {
         return null;
     }
 
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/billing/BillingEvent.java b/api/src/main/java/com/ning/billing/entitlement/api/billing/BillingEvent.java
index 6340560..4f2e0d9 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/billing/BillingEvent.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/billing/BillingEvent.java
@@ -24,7 +24,7 @@ import com.ning.billing.catalog.api.InternationalPrice;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.entitlement.api.user.Subscription;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition.SubscriptionTransitionType;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition.SubscriptionTransitionType;
 
 import java.math.BigDecimal;
 
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java b/api/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java
index ec94f9d..5515898 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java
@@ -68,7 +68,7 @@ public interface Subscription extends ExtendedEntity {
 
     public ProductCategory getCategory();
 
-    public SubscriptionTransition getPendingTransition();
+    public SubscriptionEventTransition getPendingTransition();
 
-    public SubscriptionTransition getPreviousTransition();
+    public SubscriptionEventTransition getPreviousTransition();
 }
diff --git a/api/src/main/java/com/ning/billing/payment/api/DefaultPaymentError.java b/api/src/main/java/com/ning/billing/payment/api/DefaultPaymentError.java
new file mode 100644
index 0000000..07dbf75
--- /dev/null
+++ b/api/src/main/java/com/ning/billing/payment/api/DefaultPaymentError.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright 2010-2011 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.UUID;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonTypeInfo;
+import org.codehaus.jackson.annotate.JsonTypeInfo.Id;
+
+import com.ning.billing.util.bus.BusEvent;
+import com.ning.billing.util.bus.BusEvent.BusEventType;
+
+@JsonTypeInfo(use = Id.NAME, property = "error")
+public class DefaultPaymentError implements PaymentError {
+	
+    private final String type;
+    private final String message;
+    private final UUID accountId;
+    private final UUID invoiceId;
+    private final UUID userToken;
+
+    public DefaultPaymentError(final DefaultPaymentError src, final UUID accountId, final UUID invoiceId) {
+        this.type = src.type;
+        this.message = src.message;
+        this.accountId = accountId;
+        this.invoiceId = invoiceId;
+        this.userToken = src.userToken;
+    }
+
+    public DefaultPaymentError(String type, String message, UUID accountId, UUID invoiceId, UUID userToken) {
+        this.type = type;
+        this.message = message;
+        this.accountId = accountId;
+        this.invoiceId = invoiceId;
+        this.userToken = userToken;        
+    }
+
+    public DefaultPaymentError(String type, String message) {
+    	this(type, message, null, null, null);
+    }
+
+    @JsonIgnore
+	@Override
+	public BusEventType getBusEventType() {
+		return BusEventType.PAYMENT_ERROR;
+	}
+
+    @Override
+    public UUID getUserToken() {
+    	return userToken;
+    }
+
+    @Override
+    public String getType() {
+        return type;
+    }
+
+    @Override
+    public String getMessage() {
+        return message;
+    }
+
+    @Override
+    public UUID getInvoiceId() {
+        return invoiceId;
+    }
+
+    @Override
+    public UUID getAccountId() {
+        return accountId;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((accountId == null) ? 0 : accountId.hashCode());
+        result = prime * result + ((invoiceId == null) ? 0 : invoiceId.hashCode());
+        result = prime * result + ((message == null) ? 0 : message.hashCode());
+        result = prime * result + ((type == null) ? 0 : type.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        DefaultPaymentError other = (DefaultPaymentError) obj;
+        if (accountId == null) {
+            if (other.accountId != null)
+                return false;
+        }
+        else if (!accountId.equals(other.accountId))
+            return false;
+        if (invoiceId == null) {
+            if (other.invoiceId != null)
+                return false;
+        }
+        else if (!invoiceId.equals(other.invoiceId))
+            return false;
+        if (message == null) {
+            if (other.message != null)
+                return false;
+        }
+        else if (!message.equals(other.message))
+            return false;
+        if (type == null) {
+            if (other.type != null)
+                return false;
+        }
+        else if (!type.equals(other.type))
+            return false;
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "PaymentError [type=" + type + ", message=" + message + ", accountId=" + accountId + ", invoiceId=" + invoiceId + "]";
+    }
+}
diff --git a/api/src/main/java/com/ning/billing/payment/api/DefaultPaymentInfo.java b/api/src/main/java/com/ning/billing/payment/api/DefaultPaymentInfo.java
new file mode 100644
index 0000000..ee4e235
--- /dev/null
+++ b/api/src/main/java/com/ning/billing/payment/api/DefaultPaymentInfo.java
@@ -0,0 +1,394 @@
+/*
+ * Copyright 2010-2011 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.math.BigDecimal;
+import java.util.UUID;
+
+import org.codehaus.jackson.annotate.JsonCreator;
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+
+import com.google.common.base.Objects;
+import com.ning.billing.util.bus.BusEvent;
+import com.ning.billing.util.bus.BusEvent.BusEventType;
+
+public class DefaultPaymentInfo implements PaymentInfo {
+	
+
+    private final String paymentId;
+    private final BigDecimal amount;
+    private final BigDecimal refundAmount;
+    private final String paymentNumber;
+    private final String bankIdentificationNumber;
+    private final String status;
+    private final String type;
+    private final String referenceId;
+    private final String paymentMethodId;
+    private final String paymentMethod;
+    private final String cardType;
+    private final String cardCountry;
+	private final UUID userToken;
+    private final DateTime effectiveDate;
+    private final DateTime createdDate;
+    private final DateTime updatedDate;
+
+    @JsonCreator
+    public DefaultPaymentInfo(@JsonProperty("paymentId") String paymentId,
+                       @JsonProperty("amount") BigDecimal amount,
+                       @JsonProperty("refundAmount") BigDecimal refundAmount,
+                       @JsonProperty("bankIdentificationNumber") String bankIdentificationNumber,
+                       @JsonProperty("paymentNumber") String paymentNumber,
+                       @JsonProperty("status") String status,
+                       @JsonProperty("type") String type,
+                       @JsonProperty("referenceId") String referenceId,
+                       @JsonProperty("paymentMethodId") String paymentMethodId,
+                       @JsonProperty("paymentMethod") String paymentMethod,
+                       @JsonProperty("cardType") String cardType,
+                       @JsonProperty("cardCountry") String cardCountry,
+                       @JsonProperty("userToken") UUID userToken,
+                       @JsonProperty("effectiveDate") DateTime effectiveDate,
+                       @JsonProperty("createdDate") DateTime createdDate,
+                       @JsonProperty("updatedDate") DateTime updatedDate) {
+        this.paymentId = paymentId;
+        this.amount = amount;
+        this.refundAmount = refundAmount;
+        this.bankIdentificationNumber = bankIdentificationNumber;
+        this.paymentNumber = paymentNumber;
+        this.status = status;
+        this.type = type;
+        this.referenceId = referenceId;
+        this.paymentMethodId = paymentMethodId;
+        this.paymentMethod = paymentMethod;
+        this.cardType = cardType;
+        this.cardCountry = cardCountry;
+        this.userToken = userToken;
+        this.effectiveDate = effectiveDate;
+        this.createdDate = createdDate == null ? new DateTime(DateTimeZone.UTC) : createdDate;
+        this.updatedDate = updatedDate == null ? new DateTime(DateTimeZone.UTC) : updatedDate;
+    }
+
+    public DefaultPaymentInfo(DefaultPaymentInfo src) {
+        this(src.paymentId,
+             src.amount,
+             src.refundAmount,
+             src.bankIdentificationNumber,
+             src.paymentNumber,
+             src.status,
+             src.type,
+             src.referenceId,
+             src.paymentMethodId,
+             src.paymentMethod,
+             src.cardType,
+             src.cardCountry,
+             src.userToken,
+             src.effectiveDate,
+             src.createdDate,
+             src.updatedDate);
+    }
+    
+    @JsonIgnore
+	@Override
+	public BusEventType getBusEventType() {
+		return BusEventType.PAYMENT_INFO;
+	}
+
+    @Override
+    public UUID getUserToken() {
+    	return userToken;
+    }
+
+    public Builder cloner() {
+        return new Builder(this);
+    }
+
+    @Override
+    public String getPaymentId() {
+        return paymentId;
+    }
+
+    @Override
+    public BigDecimal getAmount() {
+        return amount;
+    }
+
+    @Override
+    public String getBankIdentificationNumber() {
+        return bankIdentificationNumber;
+    }
+
+    @Override
+    public DateTime getCreatedDate() {
+        return createdDate;
+    }
+
+    @Override
+    public DateTime getEffectiveDate() {
+        return effectiveDate;
+    }
+
+    @Override
+    public String getPaymentNumber() {
+        return paymentNumber;
+    }
+
+    @Override
+    public String getPaymentMethod() {
+        return paymentMethod;
+    }
+
+    @Override
+    public String getCardType() {
+        return cardType;
+    }
+
+    @Override
+    public String getCardCountry() {
+        return cardCountry;
+    }
+
+    @Override
+    public String getReferenceId() {
+        return referenceId;
+    }
+
+    @Override
+    public String getPaymentMethodId() {
+        return paymentMethodId;
+    }
+
+    @Override
+    public BigDecimal getRefundAmount() {
+        return refundAmount;
+    }
+
+    @Override
+    public String getStatus() {
+        return status;
+    }
+
+    @Override
+    public String getType() {
+        return type;
+    }
+
+    @Override
+    public DateTime getUpdatedDate() {
+        return updatedDate;
+    }
+
+    public static class Builder {
+        private String paymentId;
+        private BigDecimal amount;
+        private BigDecimal refundAmount;
+        private String paymentNumber;
+        private String bankIdentificationNumber;
+        private String type;
+        private String status;
+        private String referenceId;
+        private String paymentMethodId;
+        private String paymentMethod;
+        private String cardType;
+        private String cardCountry;
+        private UUID userToken;
+        private DateTime effectiveDate;
+        private DateTime createdDate;
+        private DateTime updatedDate;
+
+        public Builder() {
+        }
+
+        public Builder(DefaultPaymentInfo src) {
+            this.paymentId = src.paymentId;
+            this.amount = src.amount;
+            this.refundAmount = src.refundAmount;
+            this.paymentNumber = src.paymentNumber;
+            this.bankIdentificationNumber = src.bankIdentificationNumber;
+            this.type = src.type;
+            this.status = src.status;
+            this.effectiveDate = src.effectiveDate;
+            this.referenceId = src.referenceId;
+            this.paymentMethodId = src.paymentMethodId;
+            this.paymentMethod = src.paymentMethod;
+            this.cardType = src.cardType;
+            this.cardCountry = src.cardCountry;
+            this.userToken = src.userToken;
+            this.createdDate = src.createdDate;
+            this.updatedDate = src.updatedDate;
+        }
+
+        public Builder setPaymentId(String paymentId) {
+            this.paymentId = paymentId;
+            return this;
+        }
+
+        public Builder setAmount(BigDecimal amount) {
+            this.amount = amount;
+            return this;
+        }
+
+        public Builder setBankIdentificationNumber(String bankIdentificationNumber) {
+            this.bankIdentificationNumber = bankIdentificationNumber;
+            return this;
+        }
+
+        public Builder setUserToken(UUID userToken) {
+            this.userToken = userToken;
+            return this;
+        }
+
+        public Builder setCreatedDate(DateTime createdDate) {
+            this.createdDate = createdDate;
+            return this;
+        }
+
+        public Builder setEffectiveDate(DateTime effectiveDate) {
+            this.effectiveDate = effectiveDate;
+            return this;
+        }
+
+        public Builder setPaymentNumber(String paymentNumber) {
+            this.paymentNumber = paymentNumber;
+            return this;
+        }
+
+        public Builder setReferenceId(String referenceId) {
+            this.referenceId = referenceId;
+            return this;
+        }
+
+        public Builder setRefundAmount(BigDecimal refundAmount) {
+            this.refundAmount = refundAmount;
+            return this;
+        }
+
+        public Builder setStatus(String status) {
+            this.status = status;
+            return this;
+        }
+
+        public Builder setType(String type) {
+            this.type = type;
+            return this;
+        }
+
+        public Builder setPaymentMethodId(String paymentMethodId) {
+            this.paymentMethodId = paymentMethodId;
+            return this;
+        }
+
+        public Builder setPaymentMethod(String paymentMethod) {
+            this.paymentMethod = paymentMethod;
+            return this;
+        }
+
+        public Builder setCardType(String cardType) {
+            this.cardType = cardType;
+            return this;
+        }
+
+        public Builder setCardCountry(String cardCountry) {
+            this.cardCountry = cardCountry;
+            return this;
+        }
+
+        public Builder setUpdatedDate(DateTime updatedDate) {
+            this.updatedDate = updatedDate;
+            return this;
+        }
+
+        public PaymentInfo build() {
+            return new DefaultPaymentInfo(paymentId,
+                                   amount,
+                                   refundAmount,
+                                   bankIdentificationNumber,
+                                   paymentNumber,
+                                   status,
+                                   type,
+                                   referenceId,
+                                   paymentMethodId,
+                                   paymentMethod,
+                                   cardType,
+                                   cardCountry,
+                                   userToken,
+                                   effectiveDate,
+                                   createdDate,
+                                   updatedDate);
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(paymentId,
+                                amount,
+                                refundAmount,
+                                bankIdentificationNumber,
+                                paymentNumber,
+                                status,
+                                type,
+                                referenceId,
+                                paymentMethodId,
+                                paymentMethod,
+                                cardType,
+                                cardCountry,
+                                effectiveDate,
+                                createdDate,
+                                updatedDate);
+    }
+
+    @Override
+    public boolean equals(final Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        final DefaultPaymentInfo that = (DefaultPaymentInfo) o;
+
+        if (amount != null ? !(amount.compareTo(that.amount) == 0) : that.amount != null) return false;
+        if (bankIdentificationNumber != null ? !bankIdentificationNumber.equals(that.bankIdentificationNumber) : that.bankIdentificationNumber != null)
+            return false;
+        if (cardCountry != null ? !cardCountry.equals(that.cardCountry) : that.cardCountry != null) return false;
+        if (cardType != null ? !cardType.equals(that.cardType) : that.cardType != null) return false;
+        if (createdDate != null ? !(getUnixTimestamp(createdDate) == getUnixTimestamp(that.createdDate)) : that.createdDate != null) return false;
+        if (effectiveDate != null ? !(getUnixTimestamp(effectiveDate) == getUnixTimestamp(that.effectiveDate)) : that.effectiveDate != null)
+            return false;
+        if (paymentId != null ? !paymentId.equals(that.paymentId) : that.paymentId != null) return false;
+        if (paymentMethod != null ? !paymentMethod.equals(that.paymentMethod) : that.paymentMethod != null)
+            return false;
+        if (paymentMethodId != null ? !paymentMethodId.equals(that.paymentMethodId) : that.paymentMethodId != null)
+            return false;
+        if (paymentNumber != null ? !paymentNumber.equals(that.paymentNumber) : that.paymentNumber != null)
+            return false;
+        if (referenceId != null ? !referenceId.equals(that.referenceId) : that.referenceId != null) return false;
+        if (refundAmount != null ? !refundAmount.equals(that.refundAmount) : that.refundAmount != null) return false;
+        if (status != null ? !status.equals(that.status) : that.status != null) return false;
+        if (type != null ? !type.equals(that.type) : that.type != null) return false;
+        if (updatedDate != null ? !(getUnixTimestamp(updatedDate) == getUnixTimestamp(that.updatedDate)) : that.updatedDate != null) return false;
+
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "PaymentInfo [paymentId=" + paymentId + ", amount=" + amount + ", refundAmount=" + refundAmount + ", paymentNumber=" + paymentNumber + ", bankIdentificationNumber=" + bankIdentificationNumber + ", status=" + status + ", type=" + type + ", referenceId=" + referenceId + ", paymentMethodId=" + paymentMethodId + ", paymentMethod=" + paymentMethod + ", cardType=" + cardType + ", cardCountry=" + cardCountry + ", effectiveDate=" + effectiveDate + ", createdDate=" + createdDate + ", updatedDate=" + updatedDate + "]";
+    }
+
+    private static long getUnixTimestamp(final DateTime dateTime) {
+        return dateTime.getMillis() / 1000;
+    }
+}
diff --git a/api/src/main/java/com/ning/billing/payment/api/PaymentError.java b/api/src/main/java/com/ning/billing/payment/api/PaymentError.java
index 31e2594..b8cb28d 100644
--- a/api/src/main/java/com/ning/billing/payment/api/PaymentError.java
+++ b/api/src/main/java/com/ning/billing/payment/api/PaymentError.java
@@ -1,4 +1,4 @@
-/*
+/* 
  * Copyright 2010-2011 Ning, Inc.
  *
  * Ning licenses this file to you under the Apache License, version 2.0
@@ -13,123 +13,19 @@
  * License for the specific language governing permissions and limitations
  * under the License.
  */
-
 package com.ning.billing.payment.api;
-import java.util.UUID;
 
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonTypeInfo;
-import org.codehaus.jackson.annotate.JsonTypeInfo.Id;
+import java.util.UUID;
 
 import com.ning.billing.util.bus.BusEvent;
-import com.ning.billing.util.bus.BusEvent.BusEventType;
-
-@JsonTypeInfo(use = Id.NAME, property = "error")
-public class PaymentError implements BusEvent {
-	
-    private final String type;
-    private final String message;
-    private final UUID accountId;
-    private final UUID invoiceId;
-    private final UUID userToken;
-
-    public PaymentError(final PaymentError src, final UUID accountId, final UUID invoiceId) {
-        this.type = src.type;
-        this.message = src.message;
-        this.accountId = accountId;
-        this.invoiceId = invoiceId;
-        this.userToken = src.userToken;
-    }
-
-    public PaymentError(String type, String message, UUID accountId, UUID invoiceId, UUID userToken) {
-        this.type = type;
-        this.message = message;
-        this.accountId = accountId;
-        this.invoiceId = invoiceId;
-        this.userToken = userToken;        
-    }
-
-    public PaymentError(String type, String message) {
-    	this(type, message, null, null, null);
-    }
-
-    @JsonIgnore
-	@Override
-	public BusEventType getBusEventType() {
-		return BusEventType.PAYMENT_ERROR;
-	}
-
-    @Override
-    public UUID getUserToken() {
-    	return userToken;
-    }
-
-    
-    public String getType() {
-        return type;
-    }
-
-    public String getMessage() {
-        return message;
-    }
 
-    public UUID getInvoiceId() {
-        return invoiceId;
-    }
+public interface PaymentError extends BusEvent {
 
-    public UUID getAccountId() {
-        return accountId;
-    }
+    public String getType();
 
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((accountId == null) ? 0 : accountId.hashCode());
-        result = prime * result + ((invoiceId == null) ? 0 : invoiceId.hashCode());
-        result = prime * result + ((message == null) ? 0 : message.hashCode());
-        result = prime * result + ((type == null) ? 0 : type.hashCode());
-        return result;
-    }
+    public String getMessage();
 
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        PaymentError other = (PaymentError) obj;
-        if (accountId == null) {
-            if (other.accountId != null)
-                return false;
-        }
-        else if (!accountId.equals(other.accountId))
-            return false;
-        if (invoiceId == null) {
-            if (other.invoiceId != null)
-                return false;
-        }
-        else if (!invoiceId.equals(other.invoiceId))
-            return false;
-        if (message == null) {
-            if (other.message != null)
-                return false;
-        }
-        else if (!message.equals(other.message))
-            return false;
-        if (type == null) {
-            if (other.type != null)
-                return false;
-        }
-        else if (!type.equals(other.type))
-            return false;
-        return true;
-    }
+    public UUID getInvoiceId();
 
-    @Override
-    public String toString() {
-        return "PaymentError [type=" + type + ", message=" + message + ", accountId=" + accountId + ", invoiceId=" + invoiceId + "]";
-    }
+    public UUID getAccountId();
 }
diff --git a/api/src/main/java/com/ning/billing/payment/api/PaymentInfo.java b/api/src/main/java/com/ning/billing/payment/api/PaymentInfo.java
index ad62544..c2ca970 100644
--- a/api/src/main/java/com/ning/billing/payment/api/PaymentInfo.java
+++ b/api/src/main/java/com/ning/billing/payment/api/PaymentInfo.java
@@ -1,4 +1,4 @@
-/*
+/* 
  * Copyright 2010-2011 Ning, Inc.
  *
  * Ning licenses this file to you under the Apache License, version 2.0
@@ -13,367 +13,42 @@
  * License for the specific language governing permissions and limitations
  * under the License.
  */
-
 package com.ning.billing.payment.api;
 
 import java.math.BigDecimal;
-import java.util.UUID;
-
-import org.codehaus.jackson.annotate.JsonCreator;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
 import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
 
-import com.google.common.base.Objects;
 import com.ning.billing.util.bus.BusEvent;
-import com.ning.billing.util.bus.BusEvent.BusEventType;
-
-public class PaymentInfo implements BusEvent {
-	
-
-    private final String paymentId;
-    private final BigDecimal amount;
-    private final BigDecimal refundAmount;
-    private final String paymentNumber;
-    private final String bankIdentificationNumber;
-    private final String status;
-    private final String type;
-    private final String referenceId;
-    private final String paymentMethodId;
-    private final String paymentMethod;
-    private final String cardType;
-    private final String cardCountry;
-	private final UUID userToken;
-    private final DateTime effectiveDate;
-    private final DateTime createdDate;
-    private final DateTime updatedDate;
-
-    @JsonCreator
-    public PaymentInfo(@JsonProperty("paymentId") String paymentId,
-                       @JsonProperty("amount") BigDecimal amount,
-                       @JsonProperty("refundAmount") BigDecimal refundAmount,
-                       @JsonProperty("bankIdentificationNumber") String bankIdentificationNumber,
-                       @JsonProperty("paymentNumber") String paymentNumber,
-                       @JsonProperty("status") String status,
-                       @JsonProperty("type") String type,
-                       @JsonProperty("referenceId") String referenceId,
-                       @JsonProperty("paymentMethodId") String paymentMethodId,
-                       @JsonProperty("paymentMethod") String paymentMethod,
-                       @JsonProperty("cardType") String cardType,
-                       @JsonProperty("cardCountry") String cardCountry,
-                       @JsonProperty("userToken") UUID userToken,
-                       @JsonProperty("effectiveDate") DateTime effectiveDate,
-                       @JsonProperty("createdDate") DateTime createdDate,
-                       @JsonProperty("updatedDate") DateTime updatedDate) {
-        this.paymentId = paymentId;
-        this.amount = amount;
-        this.refundAmount = refundAmount;
-        this.bankIdentificationNumber = bankIdentificationNumber;
-        this.paymentNumber = paymentNumber;
-        this.status = status;
-        this.type = type;
-        this.referenceId = referenceId;
-        this.paymentMethodId = paymentMethodId;
-        this.paymentMethod = paymentMethod;
-        this.cardType = cardType;
-        this.cardCountry = cardCountry;
-        this.userToken = userToken;
-        this.effectiveDate = effectiveDate;
-        this.createdDate = createdDate == null ? new DateTime(DateTimeZone.UTC) : createdDate;
-        this.updatedDate = updatedDate == null ? new DateTime(DateTimeZone.UTC) : updatedDate;
-    }
-
-    public PaymentInfo(PaymentInfo src) {
-        this(src.paymentId,
-             src.amount,
-             src.refundAmount,
-             src.bankIdentificationNumber,
-             src.paymentNumber,
-             src.status,
-             src.type,
-             src.referenceId,
-             src.paymentMethodId,
-             src.paymentMethod,
-             src.cardType,
-             src.cardCountry,
-             src.userToken,
-             src.effectiveDate,
-             src.createdDate,
-             src.updatedDate);
-    }
-    
-    @JsonIgnore
-	@Override
-	public BusEventType getBusEventType() {
-		return BusEventType.PAYMENT_INFO;
-	}
-
-    @Override
-    public UUID getUserToken() {
-    	return userToken;
-    }
-
-    public Builder cloner() {
-        return new Builder(this);
-    }
-
-    public String getPaymentId() {
-        return paymentId;
-    }
-
-    public BigDecimal getAmount() {
-        return amount;
-    }
-
-    public String getBankIdentificationNumber() {
-        return bankIdentificationNumber;
-    }
-
-    public DateTime getCreatedDate() {
-        return createdDate;
-    }
-
-    public DateTime getEffectiveDate() {
-        return effectiveDate;
-    }
-
-    public String getPaymentNumber() {
-        return paymentNumber;
-    }
-
-    public String getPaymentMethod() {
-        return paymentMethod;
-    }
-
-    public String getCardType() {
-        return cardType;
-    }
-
-    public String getCardCountry() {
-        return cardCountry;
-    }
-
-    public String getReferenceId() {
-        return referenceId;
-    }
-
-    public String getPaymentMethodId() {
-        return paymentMethodId;
-    }
-
-    public BigDecimal getRefundAmount() {
-        return refundAmount;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public DateTime getUpdatedDate() {
-        return updatedDate;
-    }
-
-    public static class Builder {
-        private String paymentId;
-        private BigDecimal amount;
-        private BigDecimal refundAmount;
-        private String paymentNumber;
-        private String bankIdentificationNumber;
-        private String type;
-        private String status;
-        private String referenceId;
-        private String paymentMethodId;
-        private String paymentMethod;
-        private String cardType;
-        private String cardCountry;
-        private UUID userToken;
-        private DateTime effectiveDate;
-        private DateTime createdDate;
-        private DateTime updatedDate;
-
-        public Builder() {
-        }
-
-        public Builder(PaymentInfo src) {
-            this.paymentId = src.paymentId;
-            this.amount = src.amount;
-            this.refundAmount = src.refundAmount;
-            this.paymentNumber = src.paymentNumber;
-            this.bankIdentificationNumber = src.bankIdentificationNumber;
-            this.type = src.type;
-            this.status = src.status;
-            this.effectiveDate = src.effectiveDate;
-            this.referenceId = src.referenceId;
-            this.paymentMethodId = src.paymentMethodId;
-            this.paymentMethod = src.paymentMethod;
-            this.cardType = src.cardType;
-            this.cardCountry = src.cardCountry;
-            this.userToken = src.userToken;
-            this.createdDate = src.createdDate;
-            this.updatedDate = src.updatedDate;
-        }
-
-        public Builder setPaymentId(String paymentId) {
-            this.paymentId = paymentId;
-            return this;
-        }
-
-        public Builder setAmount(BigDecimal amount) {
-            this.amount = amount;
-            return this;
-        }
-
-        public Builder setBankIdentificationNumber(String bankIdentificationNumber) {
-            this.bankIdentificationNumber = bankIdentificationNumber;
-            return this;
-        }
-
-        public Builder setUserToken(UUID userToken) {
-            this.userToken = userToken;
-            return this;
-        }
-
-        public Builder setCreatedDate(DateTime createdDate) {
-            this.createdDate = createdDate;
-            return this;
-        }
-
-        public Builder setEffectiveDate(DateTime effectiveDate) {
-            this.effectiveDate = effectiveDate;
-            return this;
-        }
-
-        public Builder setPaymentNumber(String paymentNumber) {
-            this.paymentNumber = paymentNumber;
-            return this;
-        }
-
-        public Builder setReferenceId(String referenceId) {
-            this.referenceId = referenceId;
-            return this;
-        }
 
-        public Builder setRefundAmount(BigDecimal refundAmount) {
-            this.refundAmount = refundAmount;
-            return this;
-        }
+public interface PaymentInfo extends BusEvent {
 
-        public Builder setStatus(String status) {
-            this.status = status;
-            return this;
-        }
+    public String getPaymentId();
 
-        public Builder setType(String type) {
-            this.type = type;
-            return this;
-        }
+    public BigDecimal getAmount();
 
-        public Builder setPaymentMethodId(String paymentMethodId) {
-            this.paymentMethodId = paymentMethodId;
-            return this;
-        }
+    public String getBankIdentificationNumber();
 
-        public Builder setPaymentMethod(String paymentMethod) {
-            this.paymentMethod = paymentMethod;
-            return this;
-        }
+    public DateTime getCreatedDate();
 
-        public Builder setCardType(String cardType) {
-            this.cardType = cardType;
-            return this;
-        }
+    public DateTime getEffectiveDate();
 
-        public Builder setCardCountry(String cardCountry) {
-            this.cardCountry = cardCountry;
-            return this;
-        }
+    public String getPaymentNumber();
 
-        public Builder setUpdatedDate(DateTime updatedDate) {
-            this.updatedDate = updatedDate;
-            return this;
-        }
+    public String getPaymentMethod();
 
-        public PaymentInfo build() {
-            return new PaymentInfo(paymentId,
-                                   amount,
-                                   refundAmount,
-                                   bankIdentificationNumber,
-                                   paymentNumber,
-                                   status,
-                                   type,
-                                   referenceId,
-                                   paymentMethodId,
-                                   paymentMethod,
-                                   cardType,
-                                   cardCountry,
-                                   userToken,
-                                   effectiveDate,
-                                   createdDate,
-                                   updatedDate);
-        }
-    }
+    public String getCardType();
 
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(paymentId,
-                                amount,
-                                refundAmount,
-                                bankIdentificationNumber,
-                                paymentNumber,
-                                status,
-                                type,
-                                referenceId,
-                                paymentMethodId,
-                                paymentMethod,
-                                cardType,
-                                cardCountry,
-                                effectiveDate,
-                                createdDate,
-                                updatedDate);
-    }
+    public String getCardCountry();
 
-    @Override
-    public boolean equals(final Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
+    public String getReferenceId();
 
-        final PaymentInfo that = (PaymentInfo) o;
+    public String getPaymentMethodId();
 
-        if (amount != null ? !(amount.compareTo(that.amount) == 0) : that.amount != null) return false;
-        if (bankIdentificationNumber != null ? !bankIdentificationNumber.equals(that.bankIdentificationNumber) : that.bankIdentificationNumber != null)
-            return false;
-        if (cardCountry != null ? !cardCountry.equals(that.cardCountry) : that.cardCountry != null) return false;
-        if (cardType != null ? !cardType.equals(that.cardType) : that.cardType != null) return false;
-        if (createdDate != null ? !(getUnixTimestamp(createdDate) == getUnixTimestamp(that.createdDate)) : that.createdDate != null) return false;
-        if (effectiveDate != null ? !(getUnixTimestamp(effectiveDate) == getUnixTimestamp(that.effectiveDate)) : that.effectiveDate != null)
-            return false;
-        if (paymentId != null ? !paymentId.equals(that.paymentId) : that.paymentId != null) return false;
-        if (paymentMethod != null ? !paymentMethod.equals(that.paymentMethod) : that.paymentMethod != null)
-            return false;
-        if (paymentMethodId != null ? !paymentMethodId.equals(that.paymentMethodId) : that.paymentMethodId != null)
-            return false;
-        if (paymentNumber != null ? !paymentNumber.equals(that.paymentNumber) : that.paymentNumber != null)
-            return false;
-        if (referenceId != null ? !referenceId.equals(that.referenceId) : that.referenceId != null) return false;
-        if (refundAmount != null ? !refundAmount.equals(that.refundAmount) : that.refundAmount != null) return false;
-        if (status != null ? !status.equals(that.status) : that.status != null) return false;
-        if (type != null ? !type.equals(that.type) : that.type != null) return false;
-        if (updatedDate != null ? !(getUnixTimestamp(updatedDate) == getUnixTimestamp(that.updatedDate)) : that.updatedDate != null) return false;
+    public BigDecimal getRefundAmount();
 
-        return true;
-    }
+    public String getStatus();
 
-    @Override
-    public String toString() {
-        return "PaymentInfo [paymentId=" + paymentId + ", amount=" + amount + ", refundAmount=" + refundAmount + ", paymentNumber=" + paymentNumber + ", bankIdentificationNumber=" + bankIdentificationNumber + ", status=" + status + ", type=" + type + ", referenceId=" + referenceId + ", paymentMethodId=" + paymentMethodId + ", paymentMethod=" + paymentMethod + ", cardType=" + cardType + ", cardCountry=" + cardCountry + ", effectiveDate=" + effectiveDate + ", createdDate=" + createdDate + ", updatedDate=" + updatedDate + "]";
-    }
+    public String getType();
 
-    private static long getUnixTimestamp(final DateTime dateTime) {
-        return dateTime.getMillis() / 1000;
-    }
+    public DateTime getUpdatedDate();
 }
diff --git a/api/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestWaiter.java b/api/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestWaiter.java
index c80034c..b66d677 100644
--- a/api/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestWaiter.java
+++ b/api/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestWaiter.java
@@ -19,11 +19,11 @@ import java.util.List;
 import java.util.UUID;
 import java.util.concurrent.TimeoutException;
 
-import com.ning.billing.account.api.AccountChangeNotification;
-import com.ning.billing.account.api.AccountCreationNotification;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition;
-import com.ning.billing.invoice.api.EmptyInvoiceNotification;
-import com.ning.billing.invoice.api.InvoiceCreationNotification;
+import com.ning.billing.account.api.AccountChangeEvent;
+import com.ning.billing.account.api.AccountCreationEvent;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition;
+import com.ning.billing.invoice.api.EmptyInvoiceEvent;
+import com.ning.billing.invoice.api.InvoiceCreationEvent;
 import com.ning.billing.payment.api.PaymentError;
 import com.ning.billing.payment.api.PaymentInfo;
 import com.ning.billing.util.bus.BusEvent;
@@ -32,15 +32,15 @@ public interface CompletionUserRequestWaiter {
 
     public List<BusEvent> waitForCompletion(final long timeoutMilliSec) throws InterruptedException, TimeoutException;
     
-    public void onAccountCreation(final AccountCreationNotification curEvent);
+    public void onAccountCreation(final AccountCreationEvent curEvent);
 
-    public void onAccountChange(final AccountChangeNotification curEvent);
+    public void onAccountChange(final AccountChangeEvent curEvent);
 
-    public void onSubscriptionTransition(final SubscriptionTransition curEvent);    
+    public void onSubscriptionTransition(final SubscriptionEventTransition curEvent);    
 
-    public void onInvoiceCreation(final InvoiceCreationNotification curEvent);    
+    public void onInvoiceCreation(final InvoiceCreationEvent curEvent);    
     
-    public void onEmptyInvoice(final EmptyInvoiceNotification curEvent);        
+    public void onEmptyInvoice(final EmptyInvoiceEvent curEvent);        
 
     public void onPaymentInfo(final PaymentInfo curEvent);    
 
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestBusHandler.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestBusHandler.java
index 01c3f52..9eb5fb8 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestBusHandler.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestBusHandler.java
@@ -27,8 +27,8 @@ import org.testng.Assert;
 
 import com.google.common.base.Joiner;
 import com.google.common.eventbus.Subscribe;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition;
-import com.ning.billing.invoice.api.InvoiceCreationNotification;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition;
+import com.ning.billing.invoice.api.InvoiceCreationEvent;
 import com.ning.billing.payment.api.PaymentError;
 import com.ning.billing.payment.api.PaymentInfo;
 
@@ -59,7 +59,7 @@ public class TestBusHandler {
     }
 
     @Subscribe
-    public void handleEntitlementEvents(SubscriptionTransition event) {
+    public void handleEntitlementEvents(SubscriptionEventTransition event) {
         log.info(String.format("TestBusHandler Got subscription event %s", event.toString()));
         switch (event.getTransitionType()) {
         case MIGRATE_ENTITLEMENT:
@@ -96,7 +96,7 @@ public class TestBusHandler {
     }
 
     @Subscribe
-    public void handleInvoiceEvents(InvoiceCreationNotification event) {
+    public void handleInvoiceEvents(InvoiceCreationEvent event) {
         log.info(String.format("TestBusHandler Got Invoice event %s", event.toString()));
         assertEqualsNicely(NextEvent.INVOICE);
         notifyIfStackEmpty();
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/alignment/PlanAligner.java b/entitlement/src/main/java/com/ning/billing/entitlement/alignment/PlanAligner.java
index 82a83bf..a982a26 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/alignment/PlanAligner.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/alignment/PlanAligner.java
@@ -21,7 +21,7 @@ import com.ning.billing.ErrorCode;
 import com.ning.billing.catalog.api.*;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.SubscriptionData;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition;
 import com.ning.billing.entitlement.exceptions.EntitlementError;
 import com.ning.billing.util.clock.DefaultClock;
 import org.joda.time.DateTime;
@@ -119,7 +119,7 @@ public class PlanAligner  {
     public TimedPhase getNextTimedPhase(final SubscriptionData subscription, final DateTime requestedDate, final DateTime effectiveDate) {
         try {
 
-            SubscriptionTransition lastPlanTransition = subscription.getInitialTransitionForCurrentPlan();
+            SubscriptionEventTransition lastPlanTransition = subscription.getInitialTransitionForCurrentPlan();
             if (effectiveDate.isBefore(lastPlanTransition.getEffectiveTransitionTime())) {
                 throw new EntitlementError(String.format("Cannot specify an effectiveDate prior to last Plan Change, subscription = %s, effectiveDate = %s",
                         subscription.getId(), effectiveDate));
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultBillingEvent.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultBillingEvent.java
index 2a4d8ec..bc89040 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultBillingEvent.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultBillingEvent.java
@@ -24,8 +24,8 @@ import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.entitlement.api.user.Subscription;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition.SubscriptionTransitionType;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition.SubscriptionTransitionType;
 import com.ning.billing.entitlement.api.user.SubscriptionTransitionData;
 
 import java.math.BigDecimal;
@@ -45,7 +45,7 @@ public class DefaultBillingEvent implements BillingEvent {
     final private SubscriptionTransitionType type;
     final private Long totalOrdering;
 
-    public DefaultBillingEvent(SubscriptionTransition transition, Subscription subscription, int billCycleDay, Currency currency) throws CatalogApiException {
+    public DefaultBillingEvent(SubscriptionEventTransition transition, Subscription subscription, int billCycleDay, Currency currency) throws CatalogApiException {
         this.billCycleDay = billCycleDay;
         this.subscription = subscription;
         effectiveDate = transition.getEffectiveTransitionTime();
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultEntitlementBillingApi.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultEntitlementBillingApi.java
index f6feeac..8c3e83f 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultEntitlementBillingApi.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/DefaultEntitlementBillingApi.java
@@ -55,8 +55,8 @@ import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.entitlement.api.user.SubscriptionData;
 import com.ning.billing.entitlement.api.user.SubscriptionFactory;
 import com.ning.billing.entitlement.api.user.SubscriptionFactory.SubscriptionBuilder;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition.SubscriptionTransitionType;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition.SubscriptionTransitionType;
 import com.ning.billing.entitlement.engine.dao.EntitlementDao;
 import com.ning.billing.entitlement.engine.dao.SubscriptionSqlDao;
 
@@ -92,7 +92,7 @@ public class DefaultEntitlementBillingApi implements EntitlementBillingApi {
         	List<Subscription> subscriptions = entitlementDao.getSubscriptions(subscriptionFactory, bundle.getId());
 
         	for (final Subscription subscription: subscriptions) {
-        		for (final SubscriptionTransition transition : ((SubscriptionData) subscription).getBillingTransitions()) {
+        		for (final SubscriptionEventTransition transition : ((SubscriptionData) subscription).getBillingTransitions()) {
         			try {
         				BillingEvent event = new DefaultBillingEvent(transition, subscription, calculateBcd(bundle, subscription, transition, accountId), currency);
         				result.add(event);
@@ -114,7 +114,7 @@ public class DefaultEntitlementBillingApi implements EntitlementBillingApi {
     }
 
     private int calculateBcd(final SubscriptionBundle bundle, final Subscription subscription,
-                             final SubscriptionTransition transition, final UUID accountId) throws CatalogApiException, AccountApiException {
+                             final SubscriptionEventTransition transition, final UUID accountId) throws CatalogApiException, AccountApiException {
     	Catalog catalog = catalogService.getFullCatalog();
     	Plan plan =  (transition.getTransitionType() != SubscriptionTransitionType.CANCEL) ?
     	        transition.getNextPlan() : transition.getPreviousPlan();
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionApiService.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionApiService.java
index ffeebea..1187273 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionApiService.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionApiService.java
@@ -294,7 +294,7 @@ public class SubscriptionApiService {
             throw new EntitlementUserApiException(ErrorCode.ENT_INVALID_REQUESTED_FUTURE_DATE, requestedDate.toString());
         }
 
-        SubscriptionTransition previousTransition = subscription.getPreviousTransition();
+        SubscriptionEventTransition previousTransition = subscription.getPreviousTransition();
         if (previousTransition.getEffectiveTransitionTime().isAfter(requestedDate)) {
             throw new EntitlementUserApiException(ErrorCode.ENT_INVALID_REQUESTED_DATE,
                     requestedDate.toString(), previousTransition.getEffectiveTransitionTime());
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java
index 7561cfb..103860f 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java
@@ -25,7 +25,7 @@ import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.entitlement.api.user.SubscriptionFactory.SubscriptionBuilder;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition.SubscriptionTransitionType;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition.SubscriptionTransitionType;
 import com.ning.billing.entitlement.api.user.SubscriptionTransitionDataIterator.Kind;
 import com.ning.billing.entitlement.api.user.SubscriptionTransitionDataIterator.Order;
 import com.ning.billing.entitlement.api.user.SubscriptionTransitionDataIterator.TimeLimit;
@@ -155,7 +155,7 @@ public class SubscriptionData extends ExtendedEntityBase implements Subscription
 
     @Override
     public DateTime getEndDate() {
-        SubscriptionTransition latestTransition = getPreviousTransition();
+        SubscriptionEventTransition latestTransition = getPreviousTransition();
         if (latestTransition.getNextState() == SubscriptionState.CANCELLED) {
             return latestTransition.getEffectiveTransitionTime();
         }
@@ -185,12 +185,12 @@ public class SubscriptionData extends ExtendedEntityBase implements Subscription
         return apiService.recreatePlan(this, spec, requestedDate, context);
     }
 
-    public List<SubscriptionTransition> getBillingTransitions() {
+    public List<SubscriptionEventTransition> getBillingTransitions() {
 
         if (transitions == null) {
             return Collections.emptyList();
         }
-        List<SubscriptionTransition> result = new ArrayList<SubscriptionTransition>();
+        List<SubscriptionEventTransition> result = new ArrayList<SubscriptionEventTransition>();
         SubscriptionTransitionDataIterator it = new SubscriptionTransitionDataIterator(clock, transitions,
                 Order.ASC_FROM_PAST, Kind.BILLING, Visibility.ALL, TimeLimit.ALL);
         while (it.hasNext()) {
@@ -200,7 +200,7 @@ public class SubscriptionData extends ExtendedEntityBase implements Subscription
     }
 
     @Override
-    public SubscriptionTransition getPendingTransition() {
+    public SubscriptionEventTransition getPendingTransition() {
 
         if (transitions == null) {
             return null;
@@ -211,7 +211,7 @@ public class SubscriptionData extends ExtendedEntityBase implements Subscription
     }
 
     @Override
-    public SubscriptionTransition getPreviousTransition() {
+    public SubscriptionEventTransition getPreviousTransition() {
         if (transitions == null) {
             return null;
         }
@@ -220,11 +220,11 @@ public class SubscriptionData extends ExtendedEntityBase implements Subscription
         return it.hasNext() ? it.next() : null;
     }
 
-    public SubscriptionTransition getTransitionFromEvent(final EntitlementEvent event, final int seqId) {
+    public SubscriptionEventTransition getTransitionFromEvent(final EntitlementEvent event, final int seqId) {
         if (transitions == null || event == null) {
             return null;
         }
-        for (SubscriptionTransition cur : transitions) {
+        for (SubscriptionEventTransition cur : transitions) {
             if (cur.getId().equals(event.getId())) {
                 return new SubscriptionTransitionData((SubscriptionTransitionData) cur, seqId);
             }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransitionData.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransitionData.java
index f455f60..80990cb 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransitionData.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransitionData.java
@@ -28,7 +28,7 @@ import org.joda.time.DateTime;
 
 import java.util.UUID;
 
-public class SubscriptionTransitionData implements SubscriptionTransition {
+public class SubscriptionTransitionData implements SubscriptionEventTransition {
 
 
     private final long totalOrdering;
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransitionDataIterator.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransitionDataIterator.java
index fbab9b2..3e5e961 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransitionDataIterator.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransitionDataIterator.java
@@ -19,7 +19,7 @@ package com.ning.billing.entitlement.api.user;
 import java.util.Iterator;
 import java.util.LinkedList;
 
-import com.ning.billing.entitlement.api.user.SubscriptionTransition.SubscriptionTransitionType;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition.SubscriptionTransitionType;
 import com.ning.billing.entitlement.exceptions.EntitlementError;
 import com.ning.billing.util.clock.Clock;
 
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/addon/AddonUtils.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/addon/AddonUtils.java
index b2c9405..e7c5139 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/addon/AddonUtils.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/addon/AddonUtils.java
@@ -29,7 +29,7 @@ import com.ning.billing.catalog.api.Product;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.Subscription.SubscriptionState;
 import com.ning.billing.entitlement.api.user.SubscriptionData;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition;
 import com.ning.billing.entitlement.exceptions.EntitlementError;
 
 public class AddonUtils {
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/events/user/ApiEventType.java b/entitlement/src/main/java/com/ning/billing/entitlement/events/user/ApiEventType.java
index a279f52..27d5b61 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/events/user/ApiEventType.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/events/user/ApiEventType.java
@@ -16,7 +16,7 @@
 
 package com.ning.billing.entitlement.events.user;
 
-import com.ning.billing.entitlement.api.user.SubscriptionTransition.SubscriptionTransitionType;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition.SubscriptionTransitionType;
 
 
 public enum ApiEventType {
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/ApiTestListener.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/ApiTestListener.java
index 8d8e00c..694613e 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/ApiTestListener.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/ApiTestListener.java
@@ -18,7 +18,7 @@ package com.ning.billing.entitlement.api;
 
 import com.google.common.base.Joiner;
 import com.google.common.eventbus.Subscribe;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition;
 import com.ning.billing.util.bus.Bus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -52,7 +52,7 @@ public class ApiTestListener {
     }
 
     @Subscribe
-    public void handleEntitlementEvent(SubscriptionTransition event) {
+    public void handleEntitlementEvent(SubscriptionEventTransition event) {
         switch (event.getTransitionType()) {
         case MIGRATE_ENTITLEMENT:
             subscriptionMigrated(event);
@@ -142,33 +142,33 @@ public class ApiTestListener {
     }
 
 
-    public void subscriptionMigrated(SubscriptionTransition migrated) {
+    public void subscriptionMigrated(SubscriptionEventTransition migrated) {
         log.debug("-> Got event MIGRATED");
         assertEqualsNicely(NextEvent.MIGRATE_ENTITLEMENT);
         notifyIfStackEmpty();
     }
 
-    public void subscriptionCreated(SubscriptionTransition created) {
+    public void subscriptionCreated(SubscriptionEventTransition created) {
         log.debug("-> Got event CREATED");
         assertEqualsNicely(NextEvent.CREATE);
         notifyIfStackEmpty();
     }
 
-    public void subscriptionReCreated(SubscriptionTransition recreated) {
+    public void subscriptionReCreated(SubscriptionEventTransition recreated) {
         log.debug("-> Got event RE_CREATED");
         assertEqualsNicely(NextEvent.RE_CREATE);
         notifyIfStackEmpty();
     }
 
 
-    public void subscriptionCancelled(SubscriptionTransition cancelled) {
+    public void subscriptionCancelled(SubscriptionEventTransition cancelled) {
         log.debug("-> Got event CANCEL");
         assertEqualsNicely(NextEvent.CANCEL);
         notifyIfStackEmpty();
     }
 
 
-    public void subscriptionChanged(SubscriptionTransition changed) {
+    public void subscriptionChanged(SubscriptionEventTransition changed) {
         log.debug("-> Got event CHANGE");
         assertEqualsNicely(NextEvent.CHANGE);
         notifyIfStackEmpty();
@@ -176,13 +176,13 @@ public class ApiTestListener {
 
 
     public void subscriptionPhaseChanged(
-            SubscriptionTransition phaseChanged) {
+            SubscriptionEventTransition phaseChanged) {
         log.debug("-> Got event PHASE");
         assertEqualsNicely(NextEvent.PHASE);
         notifyIfStackEmpty();
     }
 
-    public void subscriptionMigratedBilling(SubscriptionTransition migrated) {
+    public void subscriptionMigratedBilling(SubscriptionEventTransition migrated) {
         log.debug("-> Got event MIGRATED_BLLING");
         assertEqualsNicely(NextEvent.MIGRATE_BILLING);
         notifyIfStackEmpty();
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/billing/TestDefaultBillingEvent.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/billing/TestDefaultBillingEvent.java
index 7209239..0c16089 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/billing/TestDefaultBillingEvent.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/billing/TestDefaultBillingEvent.java
@@ -38,7 +38,7 @@ import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.entitlement.api.user.Subscription;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition.SubscriptionTransitionType;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition.SubscriptionTransitionType;
 import com.ning.billing.mock.BrainDeadProxyFactory;
 import com.ning.billing.mock.BrainDeadProxyFactory.ZombieControl;
 
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/billing/TestDefaultEntitlementBillingApi.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/billing/TestDefaultEntitlementBillingApi.java
index 79c786c..3650bf9 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/billing/TestDefaultEntitlementBillingApi.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/billing/TestDefaultEntitlementBillingApi.java
@@ -55,7 +55,7 @@ import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.entitlement.api.user.SubscriptionBundleData;
 import com.ning.billing.entitlement.api.user.SubscriptionData;
 import com.ning.billing.entitlement.api.user.SubscriptionFactory.SubscriptionBuilder;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition;
 import com.ning.billing.entitlement.api.user.SubscriptionTransitionData;
 import com.ning.billing.entitlement.engine.dao.EntitlementDao;
 import com.ning.billing.entitlement.events.EntitlementEvent.EventType;
@@ -74,7 +74,7 @@ public class TestDefaultEntitlementBillingApi {
 	private CatalogService catalogService;
 	private ArrayList<SubscriptionBundle> bundles;
 	private ArrayList<Subscription> subscriptions;
-	private ArrayList<SubscriptionTransition> transitions;
+	private ArrayList<SubscriptionEventTransition> transitions;
 	private EntitlementDao dao;
 
 	private Clock clock;
@@ -101,7 +101,7 @@ public class TestDefaultEntitlementBillingApi {
 		bundles.add(bundle);
 
 
-		transitions = new ArrayList<SubscriptionTransition>();
+		transitions = new ArrayList<SubscriptionEventTransition>();
 		subscriptions = new ArrayList<Subscription>();
 
 		SubscriptionBuilder builder = new SubscriptionBuilder();
@@ -109,7 +109,7 @@ public class TestDefaultEntitlementBillingApi {
 		builder.setStartDate(subscriptionStartDate).setId(oneId);
 		subscription = new SubscriptionData(builder) {
 		    @Override
-            public List<SubscriptionTransition> getBillingTransitions() {
+            public List<SubscriptionEventTransition> getBillingTransitions() {
 		    	return transitions;
 		    }
 		};
@@ -151,7 +151,7 @@ public class TestDefaultEntitlementBillingApi {
 		Plan nextPlan = catalogService.getFullCatalog().findPlan("shotgun-annual", now);
 		PlanPhase nextPhase = nextPlan.getAllPhases()[0]; // The trial has no billing period
 		String nextPriceList = PriceListSet.DEFAULT_PRICELIST_NAME;
-		SubscriptionTransition t = new SubscriptionTransitionData(
+		SubscriptionEventTransition t = new SubscriptionTransitionData(
 				zeroId, oneId, twoId, EventType.API_USER, ApiEventType.CREATE, then, now, null, null, null, null, SubscriptionState.ACTIVE, nextPlan, nextPhase, nextPriceList, 1, null, true);
 		transitions.add(t);
 
@@ -173,7 +173,7 @@ public class TestDefaultEntitlementBillingApi {
 		Plan nextPlan = catalogService.getFullCatalog().findPlan("shotgun-annual", now);
 		PlanPhase nextPhase = nextPlan.getAllPhases()[1];
 		String nextPriceList = PriceListSet.DEFAULT_PRICELIST_NAME;
-		SubscriptionTransition t = new SubscriptionTransitionData(
+		SubscriptionEventTransition t = new SubscriptionTransitionData(
 				zeroId, oneId, twoId, EventType.API_USER, ApiEventType.CREATE, then, now, null, null, null, null, SubscriptionState.ACTIVE, nextPlan, nextPhase, nextPriceList, 1, null, true);
 		transitions.add(t);
 
@@ -198,7 +198,7 @@ public class TestDefaultEntitlementBillingApi {
 		Plan nextPlan = catalogService.getFullCatalog().findPlan("shotgun-monthly", now);
 		PlanPhase nextPhase = nextPlan.getAllPhases()[1];
 		String nextPriceList = PriceListSet.DEFAULT_PRICELIST_NAME;
-		SubscriptionTransition t = new SubscriptionTransitionData(
+		SubscriptionEventTransition t = new SubscriptionTransitionData(
 				zeroId, oneId, twoId, EventType.API_USER, ApiEventType.CREATE, then, now, null, null, null, null, SubscriptionState.ACTIVE, nextPlan, nextPhase, nextPriceList, 1, null, true);
 		transitions.add(t);
 
@@ -220,7 +220,7 @@ public class TestDefaultEntitlementBillingApi {
 		Plan nextPlan = catalogService.getFullCatalog().findPlan("laser-scope-monthly", now);
 		PlanPhase nextPhase = nextPlan.getAllPhases()[0];
 		String nextPriceList = PriceListSet.DEFAULT_PRICELIST_NAME;
-		SubscriptionTransition t = new SubscriptionTransitionData(
+		SubscriptionEventTransition t = new SubscriptionTransitionData(
 				zeroId, oneId, twoId, EventType.API_USER, ApiEventType.CREATE, then, now, null, null, null, null, SubscriptionState.ACTIVE, nextPlan, nextPhase, nextPriceList, 1, null, true);
 		transitions.add(t);
 
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/TestApiBase.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/TestApiBase.java
index 8b93cd6..808e457 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/TestApiBase.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/TestApiBase.java
@@ -63,7 +63,7 @@ import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.entitlement.api.user.SubscriptionData;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition;
 import com.ning.billing.entitlement.engine.core.Engine;
 import com.ning.billing.entitlement.engine.dao.EntitlementDao;
 import com.ning.billing.entitlement.engine.dao.MockEntitlementDao;
@@ -423,8 +423,8 @@ public abstract class TestApiBase {
         }
     }
 
-    protected void printSubscriptionTransitions(List<SubscriptionTransition> transitions) {
-        for (SubscriptionTransition cur : transitions) {
+    protected void printSubscriptionTransitions(List<SubscriptionEventTransition> transitions) {
+        for (SubscriptionEventTransition cur : transitions) {
             log.debug("Transition " + cur);
         }
     }
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiAddOn.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiAddOn.java
index 927ea08..14d6653 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiAddOn.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiAddOn.java
@@ -338,7 +338,7 @@ public class TestUserApiAddOn extends TestApiBase {
            assertEquals(aoSubscription.getBundleStartDate(), baseSubscription.getBundleStartDate());
 
            // CHECK next AO PHASE EVENT IS INDEED A MONTH AFTER BP STARTED => BUNDLE ALIGNMENT
-           SubscriptionTransition aoPendingTranstion = aoSubscription.getPendingTransition();
+           SubscriptionEventTransition aoPendingTranstion = aoSubscription.getPendingTransition();
 
            if (expAlignement == PlanAlignmentCreate.START_OF_BUNDLE) {
                assertEquals(aoPendingTranstion.getEffectiveTransitionTime(), baseSubscription.getStartDate().plusMonths(1));
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java
index f7f8c41..d8a34c9 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java
@@ -467,7 +467,7 @@ public abstract class TestUserApiChangePlan extends TestApiBase {
             subscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(subscription.getId());
 
             DateTime expectedNextPhaseDate =  subscription.getStartDate().plusDays(30).plusMonths(6);
-            SubscriptionTransition nextPhase = subscription.getPendingTransition();
+            SubscriptionEventTransition nextPhase = subscription.getPendingTransition();
             DateTime nextPhaseEffectiveDate = nextPhase.getEffectiveTransitionTime();
 
             assertEquals(nextPhaseEffectiveDate, expectedNextPhaseDate);
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultEmptyInvoiceNotification.java b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultEmptyInvoiceNotification.java
index 2cba6fb..5d57b2c 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultEmptyInvoiceNotification.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultEmptyInvoiceNotification.java
@@ -19,9 +19,9 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 
-import com.ning.billing.invoice.api.EmptyInvoiceNotification;
+import com.ning.billing.invoice.api.EmptyInvoiceEvent;
 
-public class DefaultEmptyInvoiceNotification implements EmptyInvoiceNotification {
+public class DefaultEmptyInvoiceNotification implements EmptyInvoiceEvent {
 
     private final UUID accountId;
     private final DateTime processingDate;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceCreationNotification.java b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceCreationNotification.java
index cb8bff3..815ce51 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceCreationNotification.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceCreationNotification.java
@@ -22,10 +22,10 @@ import java.util.UUID;
 import org.joda.time.DateTime;
 
 import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.invoice.api.InvoiceCreationNotification;
+import com.ning.billing.invoice.api.InvoiceCreationEvent;
 import com.ning.billing.util.bus.BusEvent.BusEventType;
 
-public class DefaultInvoiceCreationNotification implements InvoiceCreationNotification {
+public class DefaultInvoiceCreationNotification implements InvoiceCreationEvent {
 	
     private final UUID invoiceId;
     private final UUID accountId;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
index 4b1c4f8..beadd47 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
@@ -43,7 +43,7 @@ import org.slf4j.LoggerFactory;
 import com.google.inject.Inject;
 import com.ning.billing.entitlement.api.billing.EntitlementBillingApi;
 import com.ning.billing.invoice.api.Invoice;
-import com.ning.billing.invoice.api.InvoiceCreationNotification;
+import com.ning.billing.invoice.api.InvoiceCreationEvent;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoicePayment;
 import com.ning.billing.invoice.api.user.DefaultInvoiceCreationNotification;
@@ -191,7 +191,7 @@ public class DefaultInvoiceDao implements InvoiceDao {
         });
 
         // TODO: move this inside the transaction once the bus is persistent
-        InvoiceCreationNotification event;
+        InvoiceCreationEvent event;
         event = new DefaultInvoiceCreationNotification(invoice.getId(), invoice.getAccountId(),
                                                       invoice.getBalance(), invoice.getCurrency(),
                                                       invoice.getInvoiceDate(),
diff --git a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
index eecde79..7d1253c 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
@@ -38,7 +38,7 @@ import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.entitlement.api.billing.BillingEvent;
 import com.ning.billing.entitlement.api.billing.EntitlementBillingApi;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoiceItem;
@@ -84,7 +84,7 @@ public class InvoiceDispatcher {
         VERBOSE_OUTPUT = (verboseOutputValue != null) && Boolean.parseBoolean(verboseOutputValue);
     }
 
-    public void processSubscription(final SubscriptionTransition transition,
+    public void processSubscription(final SubscriptionEventTransition transition,
                                     final CallContext context) throws InvoiceApiException {
         UUID subscriptionId = transition.getSubscriptionId();
         DateTime targetDate = transition.getEffectiveTransitionTime();
diff --git a/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java b/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
index cf84664..b02c3e8 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
@@ -28,7 +28,7 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.eventbus.Subscribe;
 import com.google.inject.Inject;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition;
 import com.ning.billing.invoice.api.InvoiceApiException;
 
 public class InvoiceListener {
@@ -43,7 +43,7 @@ public class InvoiceListener {
     }
 
     @Subscribe
-    public void handleSubscriptionTransition(final SubscriptionTransition transition) {
+    public void handleSubscriptionTransition(final SubscriptionEventTransition transition) {
         try {
             if (transition.getRemainingEventsForUserOperation() > 0) {
                 // Skip invoice generation as there is more coming...
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java b/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
index 27126ee..512f559 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
@@ -53,7 +53,7 @@ import com.ning.billing.entitlement.api.billing.BillingModeType;
 import com.ning.billing.entitlement.api.billing.DefaultBillingEvent;
 import com.ning.billing.entitlement.api.billing.EntitlementBillingApi;
 import com.ning.billing.entitlement.api.user.Subscription;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition.SubscriptionTransitionType;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition.SubscriptionTransitionType;
 import com.ning.billing.invoice.InvoiceDispatcher;
 import com.ning.billing.invoice.TestInvoiceDispatcher;
 import com.ning.billing.invoice.api.Invoice;
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
index ad329bc..907c8e3 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
@@ -30,7 +30,7 @@ import com.ning.billing.entitlement.api.billing.BillingEvent;
 import com.ning.billing.entitlement.api.billing.BillingModeType;
 import com.ning.billing.entitlement.api.billing.DefaultBillingEvent;
 import com.ning.billing.entitlement.api.user.Subscription;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition.SubscriptionTransitionType;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition.SubscriptionTransitionType;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoiceItem;
diff --git a/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java b/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java
index 6d9f62f..b77f758 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java
@@ -53,7 +53,7 @@ import com.ning.billing.entitlement.api.billing.BillingModeType;
 import com.ning.billing.entitlement.api.billing.DefaultBillingEvent;
 import com.ning.billing.entitlement.api.billing.EntitlementBillingApi;
 import com.ning.billing.entitlement.api.user.Subscription;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition.SubscriptionTransitionType;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition.SubscriptionTransitionType;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoiceUserApi;
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
index 8c3baf3..da29ce7 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
@@ -33,7 +33,7 @@ import com.ning.billing.entitlement.api.billing.DefaultBillingEvent;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.SubscriptionData;
 import com.ning.billing.entitlement.api.user.SubscriptionFactory.SubscriptionBuilder;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition.SubscriptionTransitionType;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition.SubscriptionTransitionType;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.model.BillingEventSet;
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/SubscriptionResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/SubscriptionResource.java
index 7ae0513..3099f9d 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/SubscriptionResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/SubscriptionResource.java
@@ -49,9 +49,9 @@ import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.Subscription;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition;
-import com.ning.billing.invoice.api.EmptyInvoiceNotification;
-import com.ning.billing.invoice.api.InvoiceCreationNotification;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition;
+import com.ning.billing.invoice.api.EmptyInvoiceEvent;
+import com.ning.billing.invoice.api.InvoiceCreationEvent;
 import com.ning.billing.jaxrs.json.SubscriptionJson;
 import com.ning.billing.jaxrs.util.Context;
 import com.ning.billing.jaxrs.util.JaxrsUriBuilder;
@@ -237,17 +237,17 @@ public class SubscriptionResource implements BaseJaxrsResource{
             super(userToken);
         }
         @Override
-        public void onSubscriptionTransition(SubscriptionTransition curEvent) {
+        public void onSubscriptionTransition(SubscriptionEventTransition curEvent) {
             log.info(String.format("Got event SubscriptionTransition token = %s, type = %s, remaining = %d ", 
                     curEvent.getUserToken(), curEvent.getTransitionType(),  curEvent.getRemainingEventsForUserOperation())); 
         }
         @Override
-        public void onEmptyInvoice(final EmptyInvoiceNotification curEvent) {
+        public void onEmptyInvoice(final EmptyInvoiceEvent curEvent) {
             log.info(String.format("Got event EmptyInvoiceNotification token = %s ", curEvent.getUserToken())); 
             notifyForCompletion();
         }
         @Override
-        public void onInvoiceCreation(InvoiceCreationNotification curEvent) {
+        public void onInvoiceCreation(InvoiceCreationEvent curEvent) {
             log.info(String.format("Got event InvoiceCreationNotification token = %s ", curEvent.getUserToken())); 
             if (curEvent.getAmountOwed().compareTo(BigDecimal.ZERO) <= 0) {
                 notifyForCompletion();
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 4223ece..ab171ae 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
@@ -140,8 +140,8 @@ public class DefaultPaymentApi implements PaymentApi {
 
     @Override
     public Either<PaymentError, PaymentInfo> createPaymentForPaymentAttempt(UUID paymentAttemptId, CallContext context) {
+        
         PaymentAttempt paymentAttempt = paymentDao.getPaymentAttemptById(paymentAttemptId);
-
         if (paymentAttempt != null) {
             Invoice invoice = invoicePaymentApi.getInvoice(paymentAttempt.getInvoiceId());
             Account account = accountUserApi.getAccountById(paymentAttempt.getAccountId());
@@ -150,11 +150,11 @@ public class DefaultPaymentApi implements PaymentApi {
                 if (invoice.getBalance().compareTo(BigDecimal.ZERO) <= 0 ) {
                     // TODO: send a notification that invoice was ignored?
                     log.info("Received invoice for payment with outstanding amount of 0 {} ", invoice);
-                    return Either.left(new PaymentError("invoice_balance_0",
-                                                        "Invoice balance was 0 or less",
-                                                        paymentAttempt.getAccountId(),
-                                                        paymentAttempt.getInvoiceId(),
-                                                        context.getUserToken()));
+                    return Either.left((PaymentError) new DefaultPaymentError("invoice_balance_0",
+                            "Invoice balance was 0 or less",
+                            paymentAttempt.getAccountId(),
+                            paymentAttempt.getInvoiceId(),
+                            context.getUserToken()));
                 }
                 else {
                     PaymentAttempt newPaymentAttempt = new PaymentAttempt.Builder(paymentAttempt)
@@ -167,11 +167,11 @@ public class DefaultPaymentApi implements PaymentApi {
                 }
             }
         }
-        return Either.left(new PaymentError("retry_payment_error",
-                                            "Could not load payment attempt, invoice or account for id " + paymentAttemptId,
-                                            paymentAttempt.getAccountId(),
-                                            paymentAttempt.getInvoiceId(),
-                                            context.getUserToken()));
+        return Either.left((PaymentError) new DefaultPaymentError("retry_payment_error",
+                "Could not load payment attempt, invoice or account for id " + paymentAttemptId,
+                paymentAttempt.getAccountId(),
+                paymentAttempt.getInvoiceId(),
+                context.getUserToken()));
     }
 
     @Override
@@ -186,7 +186,7 @@ public class DefaultPaymentApi implements PaymentApi {
             if (invoice.getBalance().compareTo(BigDecimal.ZERO) <= 0 ) {
                 // TODO: send a notification that invoice was ignored?
                 log.info("Received invoice for payment with balance of 0 {} ", invoice);
-                Either<PaymentError, PaymentInfo> result = Either.left(new PaymentError("invoice_balance_0",
+                Either<PaymentError, PaymentInfo> result = Either.left((PaymentError) new DefaultPaymentError("invoice_balance_0",
                                                                                         "Invoice balance was 0 or less",
                                                                                         account.getId(),
                                                                                         UUID.fromString(invoiceId),
@@ -195,7 +195,7 @@ public class DefaultPaymentApi implements PaymentApi {
             }
             else if (invoice.isMigrationInvoice()) {
             	log.info("Received invoice for payment that is a migration invoice - don't know how to handle those yet: {}", invoice);
-            	Either<PaymentError, PaymentInfo> result = Either.left(new PaymentError("migration invoice",
+            	Either<PaymentError, PaymentInfo> result = Either.left((PaymentError) new DefaultPaymentError("migration invoice",
                         "Invoice balance was a migration invoice",
                         account.getId(),
                         UUID.fromString(invoiceId),
diff --git a/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java b/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java
index fed137e..76b48af 100644
--- a/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java
+++ b/payment/src/main/java/com/ning/billing/payment/dao/PaymentSqlDao.java
@@ -42,6 +42,7 @@ import org.skife.jdbi.v2.tweak.ResultSetMapper;
 import org.skife.jdbi.v2.unstable.BindIn;
 
 import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.payment.api.DefaultPaymentInfo;
 import com.ning.billing.payment.api.PaymentAttempt;
 import com.ning.billing.payment.api.PaymentInfo;
 
@@ -194,7 +195,7 @@ public interface PaymentSqlDao extends Transactional<PaymentSqlDao>, CloseMe, Tr
 
             UUID userToken = null; //rs.getString("user_token") != null ? UUID.fromString(rs.getString("user_token")) : null;
             
-            return new PaymentInfo(paymentId,
+            return new DefaultPaymentInfo(paymentId,
                                    amount,
                                    refundAmount,
                                    bankIdentificationNumber,
diff --git a/payment/src/main/java/com/ning/billing/payment/provider/NoOpPaymentProviderPlugin.java b/payment/src/main/java/com/ning/billing/payment/provider/NoOpPaymentProviderPlugin.java
index c583415..58ecd00 100644
--- a/payment/src/main/java/com/ning/billing/payment/provider/NoOpPaymentProviderPlugin.java
+++ b/payment/src/main/java/com/ning/billing/payment/provider/NoOpPaymentProviderPlugin.java
@@ -25,6 +25,8 @@ import org.joda.time.DateTimeZone;
 
 import com.ning.billing.account.api.Account;
 import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.payment.api.DefaultPaymentError;
+import com.ning.billing.payment.api.DefaultPaymentInfo;
 import com.ning.billing.payment.api.Either;
 import com.ning.billing.payment.api.PaymentError;
 import com.ning.billing.payment.api.PaymentInfo;
@@ -35,7 +37,7 @@ public class NoOpPaymentProviderPlugin implements PaymentProviderPlugin {
 
     @Override
     public Either<PaymentError, PaymentInfo> processInvoice(Account account, Invoice invoice) {
-        PaymentInfo payment = new PaymentInfo.Builder()
+        PaymentInfo payment = new DefaultPaymentInfo.Builder()
                                              .setPaymentId(UUID.randomUUID().toString())
                                              .setAmount(invoice.getBalance())
                                              .setStatus("Processed")
@@ -53,7 +55,7 @@ public class NoOpPaymentProviderPlugin implements PaymentProviderPlugin {
 
     @Override
     public Either<PaymentError, String> createPaymentProviderAccount(Account account) {
-        return Either.left(new PaymentError("unsupported",
+        return Either.left((PaymentError) new DefaultPaymentError("unsupported",
                                             "Account creation not supported in this plugin",
                                             account.getId(),
                                             null, null));
diff --git a/payment/src/main/java/com/ning/billing/payment/RequestProcessor.java b/payment/src/main/java/com/ning/billing/payment/RequestProcessor.java
index e8034a1..77c12e3 100644
--- a/payment/src/main/java/com/ning/billing/payment/RequestProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/RequestProcessor.java
@@ -31,7 +31,7 @@ import com.google.common.eventbus.Subscribe;
 import com.google.inject.Inject;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountUserApi;
-import com.ning.billing.invoice.api.InvoiceCreationNotification;
+import com.ning.billing.invoice.api.InvoiceCreationEvent;
 import com.ning.billing.payment.api.Either;
 import com.ning.billing.payment.api.PaymentApi;
 import com.ning.billing.payment.api.PaymentError;
@@ -62,7 +62,7 @@ public class RequestProcessor {
     }
 
     @Subscribe
-    public void receiveInvoice(InvoiceCreationNotification event) {
+    public void receiveInvoice(InvoiceCreationEvent event) {
         log.info("Received invoice creation notification for account {} and invoice {}", event.getAccountId(), event.getInvoiceId());
         try {
             final Account account = accountUserApi.getAccountById(event.getAccountId());
diff --git a/payment/src/test/java/com/ning/billing/payment/dao/MockPaymentDao.java b/payment/src/test/java/com/ning/billing/payment/dao/MockPaymentDao.java
index 7c8239f..ae62011 100644
--- a/payment/src/test/java/com/ning/billing/payment/dao/MockPaymentDao.java
+++ b/payment/src/test/java/com/ning/billing/payment/dao/MockPaymentDao.java
@@ -29,6 +29,7 @@ import org.apache.commons.collections.CollectionUtils;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
 import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.payment.api.DefaultPaymentInfo;
 import com.ning.billing.payment.api.PaymentAttempt;
 import com.ning.billing.payment.api.PaymentInfo;
 
@@ -97,7 +98,7 @@ public class MockPaymentDao implements PaymentDao {
 
     @Override
     public void updatePaymentInfo(String paymentMethodType, String paymentId, String cardType, String cardCountry, CallContext context) {
-        PaymentInfo existingPayment = payments.get(paymentId);
+        DefaultPaymentInfo existingPayment = (DefaultPaymentInfo) payments.get(paymentId);
         if (existingPayment != null) {
             PaymentInfo payment = existingPayment.cloner()
                     .setPaymentMethod(paymentMethodType)
diff --git a/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDao.java b/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDao.java
index 472fc2f..aeb327a 100644
--- a/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDao.java
+++ b/payment/src/test/java/com/ning/billing/payment/dao/TestPaymentDao.java
@@ -34,6 +34,7 @@ import org.testng.annotations.Test;
 
 import com.ning.billing.account.api.AccountApiException;
 import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.payment.api.DefaultPaymentInfo;
 import com.ning.billing.payment.api.PaymentAttempt;
 import com.ning.billing.payment.api.PaymentInfo;
 
@@ -43,7 +44,7 @@ public abstract class TestPaymentDao {
 
     @Test
     public void testCreatePayment() {
-        PaymentInfo paymentInfo = new PaymentInfo.Builder().setPaymentId(UUID.randomUUID().toString())
+        PaymentInfo paymentInfo = new DefaultPaymentInfo.Builder().setPaymentId(UUID.randomUUID().toString())
                 .setAmount(BigDecimal.TEN)
                 .setStatus("Processed")
                 .setBankIdentificationNumber("1234")
@@ -59,7 +60,7 @@ public abstract class TestPaymentDao {
 
     @Test
     public void testUpdatePaymentInfo() {
-        PaymentInfo paymentInfo = new PaymentInfo.Builder().setPaymentId(UUID.randomUUID().toString())
+        PaymentInfo paymentInfo = new DefaultPaymentInfo.Builder().setPaymentId(UUID.randomUUID().toString())
                 .setAmount(BigDecimal.TEN)
                 .setStatus("Processed")
                 .setBankIdentificationNumber("1234")
@@ -118,7 +119,7 @@ public abstract class TestPaymentDao {
 
         Assert.assertEquals(attempt3, attempt4);
 
-        PaymentInfo originalPaymentInfo = new PaymentInfo.Builder().setPaymentId(paymentId)
+        PaymentInfo originalPaymentInfo = new DefaultPaymentInfo.Builder().setPaymentId(paymentId)
                 .setAmount(invoiceAmount)
                 .setStatus("Processed")
                 .setBankIdentificationNumber("1234")
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 ff505c1..5a39a5c 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
@@ -34,6 +34,8 @@ import com.google.common.collect.Collections2;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.payment.api.CreditCardPaymentMethodInfo;
+import com.ning.billing.payment.api.DefaultPaymentError;
+import com.ning.billing.payment.api.DefaultPaymentInfo;
 import com.ning.billing.payment.api.Either;
 import com.ning.billing.payment.api.PaymentError;
 import com.ning.billing.payment.api.PaymentInfo;
@@ -60,10 +62,10 @@ public class MockPaymentProviderPlugin implements PaymentProviderPlugin {
     @Override
     public Either<PaymentError, PaymentInfo> processInvoice(Account account, Invoice invoice) {
         if (makeNextInvoiceFail.getAndSet(false)) {
-            return Either.left(new PaymentError("unknown", "test error", account.getId(), invoice.getId(), null));
+            return Either.left((PaymentError) new DefaultPaymentError("unknown", "test error", account.getId(), invoice.getId(), null));
         }
         else {
-            PaymentInfo payment = new PaymentInfo.Builder().setPaymentId(UUID.randomUUID().toString())
+            PaymentInfo payment = new DefaultPaymentInfo.Builder().setPaymentId(UUID.randomUUID().toString())
                                                  .setAmount(invoice.getBalance())
                                                  .setStatus("Processed")
                                                  .setBankIdentificationNumber("1234")
@@ -83,7 +85,7 @@ public class MockPaymentProviderPlugin implements PaymentProviderPlugin {
         PaymentInfo payment = payments.get(paymentId);
 
         if (payment == null) {
-            return Either.left(new PaymentError("notfound", "No payment found for id " + paymentId, null, null, null));
+            return Either.left((PaymentError) new DefaultPaymentError("notfound", "No payment found for id " + paymentId, null, null, null));
         }
         else {
             return Either.right(payment);
@@ -102,7 +104,7 @@ public class MockPaymentProviderPlugin implements PaymentProviderPlugin {
             return Either.right(id);
         }
         else {
-            return Either.left(new PaymentError("unknown", "Did not get account to create payment provider account", null, null, null));
+            return Either.left((PaymentError)  new DefaultPaymentError("unknown", "Did not get account to create payment provider account", null, null, null));
         }
     }
 
@@ -112,7 +114,7 @@ public class MockPaymentProviderPlugin implements PaymentProviderPlugin {
             return Either.right(accounts.get(accountKey));
         }
         else {
-            return Either.left(new PaymentError("unknown", "Did not get account for accountKey " + accountKey, null, null, null));
+            return Either.left((PaymentError) new DefaultPaymentError("unknown", "Did not get account for accountKey " + accountKey, null, null, null));
         }
     }
 
@@ -144,7 +146,7 @@ public class MockPaymentProviderPlugin implements PaymentProviderPlugin {
                     realPaymentMethod = new CreditCardPaymentMethodInfo.Builder(ccPaymentMethod).setId(paymentMethodId).build();
                 }
                 if (realPaymentMethod == null) {
-                    return Either.left(new PaymentError("unsupported", "Payment method " + paymentMethod.getType() + " not supported by the plugin", null, null, null));
+                    return Either.left((PaymentError)  new DefaultPaymentError("unsupported", "Payment method " + paymentMethod.getType() + " not supported by the plugin", null, null, null));
                 }
                 else {
                     if (shouldBeDefault) {
@@ -155,11 +157,11 @@ public class MockPaymentProviderPlugin implements PaymentProviderPlugin {
                 }
             }
                 else {
-                    return Either.left(new PaymentError("noaccount", "Could not retrieve account for accountKey " + accountKey, null, null, null));
+                    return Either.left((PaymentError)  new DefaultPaymentError("noaccount", "Could not retrieve account for accountKey " + accountKey, null, null, null));
                 }
         }
         else {
-            return Either.left(new PaymentError("unknown", "Could not create add payment method " + paymentMethod + " for " + accountKey, null, null, null));
+            return Either.left((PaymentError)  new DefaultPaymentError("unknown", "Could not create add payment method " + paymentMethod + " for " + accountKey, null, null, null));
         }
     }
 
@@ -203,7 +205,7 @@ public class MockPaymentProviderPlugin implements PaymentProviderPlugin {
                 realPaymentMethod = new CreditCardPaymentMethodInfo.Builder(ccPaymentMethod).build();
             }
             if (realPaymentMethod == null) {
-                return Either.left(new PaymentError("unsupported", "Payment method " + paymentMethod.getType() + " not supported by the plugin", null, null, null));
+                return Either.left((PaymentError)  new DefaultPaymentError("unsupported", "Payment method " + paymentMethod.getType() + " not supported by the plugin", null, null, null));
             }
             else {
                 paymentMethods.put(paymentMethod.getId(), paymentMethod);
@@ -211,7 +213,7 @@ public class MockPaymentProviderPlugin implements PaymentProviderPlugin {
             }
         }
         else {
-            return Either.left(new PaymentError("unknown", "Could not create add payment method " + paymentMethod + " for " + accountKey, null, null, null));
+            return Either.left((PaymentError)  new DefaultPaymentError("unknown", "Could not create add payment method " + paymentMethod + " for " + accountKey, null, null, null));
         }
     }
 
@@ -221,11 +223,11 @@ public class MockPaymentProviderPlugin implements PaymentProviderPlugin {
         if (paymentMethodInfo != null) {
             if (Boolean.FALSE.equals(paymentMethodInfo.getDefaultMethod()) || paymentMethodInfo.getDefaultMethod() == null) {
                 if (paymentMethods.remove(paymentMethodId) == null) {
-                    return Either.left(new PaymentError("unknown", "Did not get any result back", null, null, null));
+                    return Either.left((PaymentError) new DefaultPaymentError("unknown", "Did not get any result back", null, null, null));
                 }
             }
             else {
-                return Either.left(new PaymentError("error", "Cannot delete default payment method", null, null, null));
+                return Either.left((PaymentError) new DefaultPaymentError("error", "Cannot delete default payment method", null, null, null));
             }
         }
         return Either.right(null);
@@ -234,7 +236,7 @@ public class MockPaymentProviderPlugin implements PaymentProviderPlugin {
     @Override
     public Either<PaymentError, PaymentMethodInfo> getPaymentMethodInfo(String paymentMethodId) {
         if (paymentMethodId == null) {
-            return Either.left(new PaymentError("unknown", "Could not retrieve payment method for paymentMethodId " + paymentMethodId, null, null, null));
+            return Either.left((PaymentError) new DefaultPaymentError("unknown", "Could not retrieve payment method for paymentMethodId " + paymentMethodId, null, null, null));
         }
 
         return Either.right(paymentMethods.get(paymentMethodId));

pom.xml 2(+1 -1)

diff --git a/pom.xml b/pom.xml
index b50bc5f..da10442 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,7 +18,7 @@
     <groupId>com.ning.billing</groupId>
     <artifactId>killbill</artifactId>
     <packaging>pom</packaging>
-    <version>0.1.8-SNAPSHOT</version>
+    <version>0.1.11-SNAPSHOT</version>
     <name>killbill</name>
     <description>Library for managing recurring subscriptions and the associated billing</description>
     <url>http://github.com/ning/killbill</url>
diff --git a/util/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestBase.java b/util/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestBase.java
index d1e5efa..d188438 100644
--- a/util/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestBase.java
+++ b/util/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestBase.java
@@ -20,11 +20,11 @@ import java.util.List;
 import java.util.UUID;
 import java.util.concurrent.TimeoutException;
 
-import com.ning.billing.account.api.AccountChangeNotification;
-import com.ning.billing.account.api.AccountCreationNotification;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition;
-import com.ning.billing.invoice.api.EmptyInvoiceNotification;
-import com.ning.billing.invoice.api.InvoiceCreationNotification;
+import com.ning.billing.account.api.AccountChangeEvent;
+import com.ning.billing.account.api.AccountCreationEvent;
+import com.ning.billing.entitlement.api.user.SubscriptionEventTransition;
+import com.ning.billing.invoice.api.EmptyInvoiceEvent;
+import com.ning.billing.invoice.api.InvoiceCreationEvent;
 import com.ning.billing.payment.api.PaymentError;
 import com.ning.billing.payment.api.PaymentInfo;
 import com.ning.billing.util.bus.BusEvent;
@@ -97,19 +97,19 @@ public abstract class CompletionUserRequestBase implements CompletionUserRequest
         
         switch(curEvent.getBusEventType()) {
         case ACCOUNT_CREATE:
-            onAccountCreation((AccountCreationNotification) curEvent);
+            onAccountCreation((AccountCreationEvent) curEvent);
             break;
         case ACCOUNT_CHANGE:
-            onAccountChange((AccountChangeNotification) curEvent);
+            onAccountChange((AccountChangeEvent) curEvent);
             break;
         case SUBSCRIPTION_TRANSITION:
-            onSubscriptionTransition((SubscriptionTransition) curEvent);
+            onSubscriptionTransition((SubscriptionEventTransition) curEvent);
             break;
         case INVOICE_EMPTY:
-            onEmptyInvoice((EmptyInvoiceNotification) curEvent);
+            onEmptyInvoice((EmptyInvoiceEvent) curEvent);
             break;
         case INVOICE_CREATION:
-            onInvoiceCreation((InvoiceCreationNotification) curEvent);
+            onInvoiceCreation((InvoiceCreationEvent) curEvent);
             break;
         case PAYMENT_INFO:
             onPaymentInfo((PaymentInfo) curEvent);
@@ -127,23 +127,23 @@ public abstract class CompletionUserRequestBase implements CompletionUserRequest
      * Default no-op implementation so as to not have to implement all callbacks
      */
     @Override
-    public void onAccountCreation(final AccountCreationNotification curEvent) {
+    public void onAccountCreation(final AccountCreationEvent curEvent) {
     }
 
     @Override
-    public void onAccountChange(final AccountChangeNotification curEvent) {
+    public void onAccountChange(final AccountChangeEvent curEvent) {
     }
 
     @Override
-    public void onSubscriptionTransition(final SubscriptionTransition curEvent) {
+    public void onSubscriptionTransition(final SubscriptionEventTransition curEvent) {
     }
 
     @Override
-    public void onEmptyInvoice(final EmptyInvoiceNotification curEvent) {
+    public void onEmptyInvoice(final EmptyInvoiceEvent curEvent) {
     }
     
     @Override
-    public void onInvoiceCreation(final InvoiceCreationNotification curEvent) {
+    public void onInvoiceCreation(final InvoiceCreationEvent curEvent) {
     }
 
     @Override