killbill-memoizeit

Changes

api/src/main/java/com/ning/billing/entitlement/api/timeline/RepairEntitlementEvent.java 31(+0 -31)

api/src/main/java/com/ning/billing/entitlement/api/user/RequestedSubscriptionEvent.java 20(+0 -20)

api/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionEvent.java 61(+0 -61)

api/src/main/java/com/ning/billing/invoice/api/InvoiceAdjustmentEvent.java 24(+0 -24)

api/src/main/java/com/ning/billing/invoice/api/InvoiceEvent.java 24(+0 -24)

api/src/main/java/com/ning/billing/invoice/api/NullInvoiceEvent.java 21(+0 -21)

api/src/main/java/com/ning/billing/overdue/OverdueChangeEvent.java 33(+0 -33)

api/src/main/java/com/ning/billing/payment/api/PaymentErrorEvent.java 31(+0 -31)

api/src/main/java/com/ning/billing/payment/api/PaymentInfoEvent.java 45(+0 -45)

api/src/main/java/com/ning/billing/util/tag/api/ControlTagCreationEvent.java 20(+0 -20)

api/src/main/java/com/ning/billing/util/tag/api/ControlTagDefinitionCreationEvent.java 20(+0 -20)

api/src/main/java/com/ning/billing/util/tag/api/ControlTagDefinitionDeletionEvent.java 20(+0 -20)

api/src/main/java/com/ning/billing/util/tag/api/ControlTagDeletionEvent.java 20(+0 -20)

api/src/main/java/com/ning/billing/util/tag/api/TagDefinitionEvent.java 28(+0 -28)

api/src/main/java/com/ning/billing/util/tag/api/TagEvent.java 34(+0 -34)

api/src/main/java/com/ning/billing/util/tag/api/UserTagCreationEvent.java 20(+0 -20)

api/src/main/java/com/ning/billing/util/tag/api/UserTagDefinitionCreationEvent.java 20(+0 -20)

api/src/main/java/com/ning/billing/util/tag/api/UserTagDefinitionDeletionEvent.java 20(+0 -20)

api/src/main/java/com/ning/billing/util/tag/api/UserTagDeletionEvent.java 20(+0 -20)

util/src/main/java/com/ning/billing/util/tag/api/svcs/DefaultTagInternalApi.java 60(+0 -60)

Details

diff --git a/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountChangeEvent.java b/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountChangeEvent.java
index bde268a..db97638 100644
--- a/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountChangeEvent.java
+++ b/account/src/main/java/com/ning/billing/account/api/user/DefaultAccountChangeEvent.java
@@ -21,16 +21,16 @@ import java.util.List;
 import java.util.UUID;
 
 import com.ning.billing.account.api.Account;
-import com.ning.billing.account.api.AccountChangeEvent;
 import com.ning.billing.account.api.ChangedField;
 import com.ning.billing.account.api.DefaultChangedField;
+import com.ning.billing.util.events.AccountChangeInternalEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 
-public class DefaultAccountChangeEvent implements AccountChangeEvent {
+public class DefaultAccountChangeEvent implements AccountChangeInternalEvent {
 
     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 69dcc9e..101ba6c 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
@@ -21,17 +21,17 @@ import java.util.UUID;
 import org.joda.time.DateTimeZone;
 
 import com.ning.billing.account.api.Account;
-import com.ning.billing.account.api.AccountCreationEvent;
 import com.ning.billing.account.api.AccountData;
 import com.ning.billing.account.api.BillCycleDay;
 import com.ning.billing.account.api.DefaultBillCycleDay;
 import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.util.events.AccountCreationInternalEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultAccountCreationEvent implements AccountCreationEvent {
+public class DefaultAccountCreationEvent implements AccountCreationInternalEvent {
 
     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 f0d9563..5df6129 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
@@ -29,8 +29,6 @@ import org.slf4j.LoggerFactory;
 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.AccountChangeEvent;
-import com.ning.billing.account.api.AccountCreationEvent;
 import com.ning.billing.account.api.user.DefaultAccountChangeEvent;
 import com.ning.billing.account.api.user.DefaultAccountCreationEvent;
 import com.ning.billing.util.ChangeType;
@@ -43,6 +41,8 @@ import com.ning.billing.util.dao.EntityAudit;
 import com.ning.billing.util.dao.EntityHistory;
 import com.ning.billing.util.dao.TableName;
 import com.ning.billing.util.entity.EntityPersistenceException;
+import com.ning.billing.util.events.AccountChangeInternalEvent;
+import com.ning.billing.util.events.AccountCreationInternalEvent;
 
 import com.google.inject.Inject;
 
@@ -116,7 +116,7 @@ public class AuditedAccountDao implements AccountDao {
                     final EntityAudit audit = new EntityAudit(TableName.ACCOUNT_HISTORY, historyRecordId, ChangeType.INSERT);
                     accountSqlDao.insertAuditFromTransaction(audit, rehydratedContext);
 
-                    final AccountCreationEvent creationEvent = new DefaultAccountCreationEvent(account, rehydratedContext.getUserToken());
+                    final AccountCreationInternalEvent creationEvent = new DefaultAccountCreationEvent(account, rehydratedContext.getUserToken());
                     try {
                         eventBus.postFromTransaction(creationEvent, transactionalDao, rehydratedContext);
                     } catch (EventBusException e) {
@@ -161,7 +161,7 @@ public class AuditedAccountDao implements AccountDao {
                     final EntityAudit audit = new EntityAudit(TableName.ACCOUNT_HISTORY, historyRecordId, ChangeType.UPDATE);
                     accountSqlDao.insertAuditFromTransaction(audit, context);
 
-                    final AccountChangeEvent changeEvent = new DefaultAccountChangeEvent(accountId, context.getUserToken(), currentAccount, account);
+                    final AccountChangeInternalEvent changeEvent = new DefaultAccountChangeEvent(accountId, context.getUserToken(), currentAccount, account);
                     if (changeEvent.hasChanges()) {
                         try {
                             eventBus.postFromTransaction(changeEvent, transactional, context);
@@ -210,7 +210,7 @@ public class AuditedAccountDao implements AccountDao {
                     final EntityAudit audit = new EntityAudit(TableName.ACCOUNT_HISTORY, historyRecordId, ChangeType.UPDATE);
                     accountSqlDao.insertAuditFromTransaction(audit, context);
 
-                    final AccountChangeEvent changeEvent = new DefaultAccountChangeEvent(accountId, context.getUserToken(), currentAccount, account);
+                    final AccountChangeInternalEvent changeEvent = new DefaultAccountChangeEvent(accountId, context.getUserToken(), currentAccount, account);
                     if (changeEvent.hasChanges()) {
                         try {
                             eventBus.postFromTransaction(changeEvent, transactional, context);
diff --git a/account/src/test/java/com/ning/billing/account/api/user/TestEventJson.java b/account/src/test/java/com/ning/billing/account/api/user/TestEventJson.java
index 34bc971..e72ade2 100644
--- a/account/src/test/java/com/ning/billing/account/api/user/TestEventJson.java
+++ b/account/src/test/java/com/ning/billing/account/api/user/TestEventJson.java
@@ -24,11 +24,11 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import com.ning.billing.account.AccountTestSuite;
-import com.ning.billing.account.api.AccountChangeEvent;
 import com.ning.billing.account.api.ChangedField;
 import com.ning.billing.account.api.DefaultBillCycleDay;
 import com.ning.billing.account.api.DefaultChangedField;
 import com.ning.billing.account.api.user.DefaultAccountCreationEvent.DefaultAccountData;
+import com.ning.billing.util.events.AccountChangeInternalEvent;
 import com.ning.billing.util.jackson.ObjectMapper;
 
 public class TestEventJson extends AccountTestSuite {
@@ -39,7 +39,7 @@ public class TestEventJson extends AccountTestSuite {
         final List<ChangedField> changes = new ArrayList<ChangedField>();
         changes.add(new DefaultChangedField("fieldXX", "valueX", "valueXXX"));
         changes.add(new DefaultChangedField("fieldYY", "valueY", "valueYYY"));
-        final AccountChangeEvent e = new DefaultAccountChangeEvent(UUID.randomUUID(), changes, UUID.randomUUID());
+        final AccountChangeInternalEvent e = new DefaultAccountChangeEvent(UUID.randomUUID(), changes, UUID.randomUUID());
 
         final String json = mapper.writeValueAsString(e);
 
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 ed5966b..c65d73b 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
@@ -23,7 +23,6 @@ import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 
 import com.ning.billing.account.api.Account;
-import com.ning.billing.account.api.AccountChangeEvent;
 import com.ning.billing.account.api.user.DefaultAccountChangeEvent;
 import com.ning.billing.account.api.user.DefaultAccountCreationEvent;
 import com.ning.billing.util.svcsapi.bus.Bus;
@@ -31,6 +30,7 @@ import com.ning.billing.util.svcsapi.bus.Bus.EventBusException;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.entity.EntityPersistenceException;
+import com.ning.billing.util.events.AccountChangeInternalEvent;
 
 import com.google.inject.Inject;
 
@@ -94,7 +94,7 @@ public class MockAccountDao implements AccountDao {
     public void update(final Account account, final InternalCallContext context) {
         final Account currentAccount = accounts.put(account.getId(), account);
 
-        final AccountChangeEvent changeEvent = new DefaultAccountChangeEvent(account.getId(), null, currentAccount, account);
+        final AccountChangeInternalEvent changeEvent = new DefaultAccountChangeEvent(account.getId(), null, currentAccount, account);
         if (changeEvent.hasChanges()) {
             try {
                 eventBus.post(changeEvent, context);
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 bb6961c..5c29bbf 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java
@@ -17,31 +17,31 @@
 package com.ning.billing.analytics;
 
 import com.ning.billing.account.api.AccountApiException;
-import com.ning.billing.account.api.AccountChangeEvent;
-import com.ning.billing.account.api.AccountCreationEvent;
-import com.ning.billing.entitlement.api.timeline.RepairEntitlementEvent;
-import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
-import com.ning.billing.entitlement.api.user.RequestedSubscriptionEvent;
-import com.ning.billing.invoice.api.InvoiceAdjustmentEvent;
-import com.ning.billing.invoice.api.InvoiceCreationEvent;
-import com.ning.billing.invoice.api.NullInvoiceEvent;
-import com.ning.billing.overdue.OverdueChangeEvent;
-import com.ning.billing.payment.api.PaymentErrorEvent;
-import com.ning.billing.payment.api.PaymentInfoEvent;
-import com.ning.billing.util.bus.BusEvent;
 import com.ning.billing.util.callcontext.CallOrigin;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.callcontext.UserType;
-import com.ning.billing.util.tag.api.ControlTagCreationEvent;
-import com.ning.billing.util.tag.api.ControlTagDefinitionCreationEvent;
-import com.ning.billing.util.tag.api.ControlTagDefinitionDeletionEvent;
-import com.ning.billing.util.tag.api.ControlTagDeletionEvent;
-import com.ning.billing.util.tag.api.UserTagCreationEvent;
-import com.ning.billing.util.tag.api.UserTagDefinitionCreationEvent;
-import com.ning.billing.util.tag.api.UserTagDefinitionDeletionEvent;
-import com.ning.billing.util.tag.api.UserTagDeletionEvent;
+import com.ning.billing.util.events.AccountChangeInternalEvent;
+import com.ning.billing.util.events.AccountCreationInternalEvent;
+import com.ning.billing.util.events.BusInternalEvent;
+import com.ning.billing.util.events.ControlTagCreationInternalEvent;
+import com.ning.billing.util.events.ControlTagDefinitionCreationInternalEvent;
+import com.ning.billing.util.events.ControlTagDefinitionDeletionInternalEvent;
+import com.ning.billing.util.events.ControlTagDeletionInternalEvent;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
+import com.ning.billing.util.events.InvoiceAdjustmentInternalEvent;
+import com.ning.billing.util.events.InvoiceCreationInternalEvent;
+import com.ning.billing.util.events.NullInvoiceInternalEvent;
+import com.ning.billing.util.events.OverdueChangeInternalEvent;
+import com.ning.billing.util.events.PaymentErrorInternalEvent;
+import com.ning.billing.util.events.PaymentInfoInternalEvent;
+import com.ning.billing.util.events.RepairEntitlementInternalEvent;
+import com.ning.billing.util.events.RequestedSubscriptionInternalEvent;
+import com.ning.billing.util.events.UserTagCreationInternalEvent;
+import com.ning.billing.util.events.UserTagDefinitionCreationInternalEvent;
+import com.ning.billing.util.events.UserTagDefinitionDeletionInternalEvent;
+import com.ning.billing.util.events.UserTagDeletionInternalEvent;
 
 import com.google.common.eventbus.Subscribe;
 import com.google.inject.Inject;
@@ -74,30 +74,30 @@ public class AnalyticsListener {
     }
 
     @Subscribe
-    public void handleEffectiveSubscriptionTransitionChange(final EffectiveSubscriptionEvent eventEffective) throws AccountApiException, EntitlementUserApiException {
+    public void handleEffectiveSubscriptionTransitionChange(final EffectiveSubscriptionInternalEvent eventEffective) throws AccountApiException, EntitlementUserApiException {
         // The event is used as a trigger to rebuild all transitions for this bundle
         bstDao.rebuildTransitionsForBundle(eventEffective.getBundleId(), createCallContext(eventEffective));
     }
 
     @Subscribe
-    public void handleRequestedSubscriptionTransitionChange(final RequestedSubscriptionEvent eventRequested) throws AccountApiException, EntitlementUserApiException {
+    public void handleRequestedSubscriptionTransitionChange(final RequestedSubscriptionInternalEvent eventRequested) throws AccountApiException, EntitlementUserApiException {
         // The event is used as a trigger to rebuild all transitions for this bundle
         bstDao.rebuildTransitionsForBundle(eventRequested.getBundleId(), createCallContext(eventRequested));
     }
 
     @Subscribe
-    public void handleRepairEntitlement(final RepairEntitlementEvent event) {
+    public void handleRepairEntitlement(final RepairEntitlementInternalEvent event) {
         // In case of repair, just rebuild all transitions
         bstDao.rebuildTransitionsForBundle(event.getBundleId(), createCallContext(event));
     }
 
     @Subscribe
-    public void handleAccountCreation(final AccountCreationEvent event) {
+    public void handleAccountCreation(final AccountCreationInternalEvent event) {
         bacDao.accountUpdated(event.getId(), createCallContext(event));
     }
 
     @Subscribe
-    public void handleAccountChange(final AccountChangeEvent event) {
+    public void handleAccountChange(final AccountChangeInternalEvent event) {
         if (!event.hasChanges()) {
             return;
         }
@@ -106,24 +106,24 @@ public class AnalyticsListener {
     }
 
     @Subscribe
-    public void handleInvoiceCreation(final InvoiceCreationEvent event) {
+    public void handleInvoiceCreation(final InvoiceCreationInternalEvent event) {
         // The event is used as a trigger to rebuild all invoices and invoice items for this account
         invoiceDao.rebuildInvoicesForAccount(event.getAccountId(), createCallContext(event));
     }
 
     @Subscribe
-    public void handleNullInvoice(final NullInvoiceEvent event) {
+    public void handleNullInvoice(final NullInvoiceInternalEvent event) {
         // Ignored for now
     }
 
     @Subscribe
-    public void handleInvoiceAdjustment(final InvoiceAdjustmentEvent event) {
+    public void handleInvoiceAdjustment(final InvoiceAdjustmentInternalEvent event) {
         // The event is used as a trigger to rebuild all invoices and invoice items for this account
         invoiceDao.rebuildInvoicesForAccount(event.getAccountId(), createCallContext(event));
     }
 
     @Subscribe
-    public void handlePaymentInfo(final PaymentInfoEvent paymentInfo) {
+    public void handlePaymentInfo(final PaymentInfoInternalEvent paymentInfo) {
         bipDao.invoicePaymentPosted(paymentInfo.getAccountId(),
                                     paymentInfo.getPaymentId(),
                                     paymentInfo.getExtFirstPaymentRefId(),
@@ -133,7 +133,7 @@ public class AnalyticsListener {
     }
 
     @Subscribe
-    public void handlePaymentError(final PaymentErrorEvent paymentError) {
+    public void handlePaymentError(final PaymentErrorInternalEvent paymentError) {
         bipDao.invoicePaymentPosted(paymentError.getAccountId(),
                                     paymentError.getPaymentId(),
                                     null,
@@ -143,51 +143,51 @@ public class AnalyticsListener {
     }
 
     @Subscribe
-    public void handleOverdueChange(final OverdueChangeEvent changeEvent) {
+    public void handleOverdueChange(final OverdueChangeInternalEvent changeEvent) {
         bosDao.overdueStatusChanged(changeEvent.getOverdueObjectType(), changeEvent.getOverdueObjectId(), createCallContext(changeEvent));
     }
 
     @Subscribe
-    public void handleControlTagCreation(final ControlTagCreationEvent event) {
+    public void handleControlTagCreation(final ControlTagCreationInternalEvent event) {
         tagDao.tagAdded(event.getObjectType(), event.getObjectId(), event.getTagDefinition().getName(), createCallContext(event));
     }
 
     @Subscribe
-    public void handleControlTagDeletion(final ControlTagDeletionEvent event) {
+    public void handleControlTagDeletion(final ControlTagDeletionInternalEvent event) {
         tagDao.tagRemoved(event.getObjectType(), event.getObjectId(), event.getTagDefinition().getName(), createCallContext(event));
     }
 
     @Subscribe
-    public void handleUserTagCreation(final UserTagCreationEvent event) {
+    public void handleUserTagCreation(final UserTagCreationInternalEvent event) {
         tagDao.tagAdded(event.getObjectType(), event.getObjectId(), event.getTagDefinition().getName(), createCallContext(event));
     }
 
     @Subscribe
-    public void handleUserTagDeletion(final UserTagDeletionEvent event) {
+    public void handleUserTagDeletion(final UserTagDeletionInternalEvent event) {
         tagDao.tagRemoved(event.getObjectType(), event.getObjectId(), event.getTagDefinition().getName(), createCallContext(event));
     }
 
     @Subscribe
-    public void handleControlTagDefinitionCreation(final ControlTagDefinitionCreationEvent event) {
+    public void handleControlTagDefinitionCreation(final ControlTagDefinitionCreationInternalEvent event) {
         // Ignored for now
     }
 
     @Subscribe
-    public void handleControlTagDefinitionDeletion(final ControlTagDefinitionDeletionEvent event) {
+    public void handleControlTagDefinitionDeletion(final ControlTagDefinitionDeletionInternalEvent event) {
         // Ignored for now
     }
 
     @Subscribe
-    public void handleUserTagDefinitionCreation(final UserTagDefinitionCreationEvent event) {
+    public void handleUserTagDefinitionCreation(final UserTagDefinitionCreationInternalEvent event) {
         // Ignored for now
     }
 
     @Subscribe
-    public void handleUserTagDefinitionDeletion(final UserTagDefinitionDeletionEvent event) {
+    public void handleUserTagDefinitionDeletion(final UserTagDefinitionDeletionInternalEvent event) {
         // Ignored for now
     }
 
-    private InternalCallContext createCallContext(final BusEvent event) {
+    private InternalCallContext createCallContext(final BusInternalEvent event) {
         return internalCallContextFactory.createInternalCallContext("AnalyticsService", CallOrigin.INTERNAL, UserType.SYSTEM, event.getUserToken());
     }
 }
diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionDao.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionDao.java
index 6c4a834..6a5c0e6 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionDao.java
@@ -34,13 +34,13 @@ import com.ning.billing.analytics.model.BusinessSubscriptionTransition;
 import com.ning.billing.catalog.api.CatalogService;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.entitlement.api.SubscriptionTransitionType;
-import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
 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.SubscriptionEvent;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
+import com.ning.billing.util.events.SubscriptionInternalEvent;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
 import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
 
@@ -98,7 +98,7 @@ public class BusinessSubscriptionTransitionDao {
 
                 final ArrayList<BusinessSubscriptionTransition> transitions = new ArrayList<BusinessSubscriptionTransition>();
                 for (final Subscription subscription : subscriptions) {
-                    for (final EffectiveSubscriptionEvent event : subscription.getAllTransitions()) {
+                    for (final EffectiveSubscriptionInternalEvent event : entitlementApi.getAllTransitions(subscription)) {
                         final BusinessSubscriptionEvent businessEvent = getBusinessSubscriptionFromEvent(event);
                         if (businessEvent == null) {
                             continue;
@@ -151,7 +151,7 @@ public class BusinessSubscriptionTransitionDao {
         });
     }
 
-    private BusinessSubscriptionEvent getBusinessSubscriptionFromEvent(final SubscriptionEvent event) throws AccountApiException, EntitlementUserApiException {
+    private BusinessSubscriptionEvent getBusinessSubscriptionFromEvent(final SubscriptionInternalEvent event) throws AccountApiException, EntitlementUserApiException {
         switch (event.getTransitionType()) {
             // A subscription enters either through migration or as newly created subscription
             case MIGRATE_ENTITLEMENT:
@@ -178,36 +178,36 @@ public class BusinessSubscriptionTransitionDao {
         }
     }
 
-    private BusinessSubscriptionEvent subscriptionMigrated(final SubscriptionEvent created) throws AccountApiException, EntitlementUserApiException {
+    private BusinessSubscriptionEvent subscriptionMigrated(final SubscriptionInternalEvent created) throws AccountApiException, EntitlementUserApiException {
         return BusinessSubscriptionEvent.subscriptionMigrated(created.getNextPlan(), catalogService.getFullCatalog(), created.getEffectiveTransitionTime(), created.getSubscriptionStartDate());
     }
 
-    private BusinessSubscriptionEvent subscriptionCreated(final SubscriptionEvent created) throws AccountApiException, EntitlementUserApiException {
+    private BusinessSubscriptionEvent subscriptionCreated(final SubscriptionInternalEvent created) throws AccountApiException, EntitlementUserApiException {
         return BusinessSubscriptionEvent.subscriptionCreated(created.getNextPlan(), catalogService.getFullCatalog(), created.getEffectiveTransitionTime(), created.getSubscriptionStartDate());
     }
 
-    private BusinessSubscriptionEvent subscriptionRecreated(final SubscriptionEvent recreated) throws AccountApiException, EntitlementUserApiException {
+    private BusinessSubscriptionEvent subscriptionRecreated(final SubscriptionInternalEvent recreated) throws AccountApiException, EntitlementUserApiException {
         return BusinessSubscriptionEvent.subscriptionRecreated(recreated.getNextPlan(), catalogService.getFullCatalog(), recreated.getEffectiveTransitionTime(), recreated.getSubscriptionStartDate());
     }
 
-    private BusinessSubscriptionEvent subscriptionTransfered(final SubscriptionEvent transfered) throws AccountApiException, EntitlementUserApiException {
+    private BusinessSubscriptionEvent subscriptionTransfered(final SubscriptionInternalEvent transfered) throws AccountApiException, EntitlementUserApiException {
         return BusinessSubscriptionEvent.subscriptionTransfered(transfered.getNextPlan(), catalogService.getFullCatalog(), transfered.getEffectiveTransitionTime(), transfered.getSubscriptionStartDate());
     }
 
-    private BusinessSubscriptionEvent subscriptionCancelled(final SubscriptionEvent cancelled) throws AccountApiException, EntitlementUserApiException {
+    private BusinessSubscriptionEvent subscriptionCancelled(final SubscriptionInternalEvent cancelled) throws AccountApiException, EntitlementUserApiException {
         // cancelled.getNextPlan() is null here - need to look at the previous one to create the correct event name
         return BusinessSubscriptionEvent.subscriptionCancelled(cancelled.getPreviousPlan(), catalogService.getFullCatalog(), cancelled.getEffectiveTransitionTime(), cancelled.getSubscriptionStartDate());
     }
 
-    private BusinessSubscriptionEvent subscriptionChanged(final SubscriptionEvent changed) throws AccountApiException, EntitlementUserApiException {
+    private BusinessSubscriptionEvent subscriptionChanged(final SubscriptionInternalEvent changed) throws AccountApiException, EntitlementUserApiException {
         return BusinessSubscriptionEvent.subscriptionChanged(changed.getNextPlan(), catalogService.getFullCatalog(), changed.getEffectiveTransitionTime(), changed.getSubscriptionStartDate());
     }
 
-    private BusinessSubscriptionEvent subscriptionPhaseChanged(final SubscriptionEvent phaseChanged) throws AccountApiException, EntitlementUserApiException {
+    private BusinessSubscriptionEvent subscriptionPhaseChanged(final SubscriptionInternalEvent phaseChanged) throws AccountApiException, EntitlementUserApiException {
         return BusinessSubscriptionEvent.subscriptionPhaseChanged(phaseChanged.getNextPlan(), phaseChanged.getNextState(), catalogService.getFullCatalog(), phaseChanged.getEffectiveTransitionTime(), phaseChanged.getSubscriptionStartDate());
     }
 
-    private BusinessSubscription createNextBusinessSubscription(final EffectiveSubscriptionEvent event, final BusinessSubscriptionEvent businessEvent, final Currency currency) {
+    private BusinessSubscription createNextBusinessSubscription(final EffectiveSubscriptionInternalEvent event, final BusinessSubscriptionEvent businessEvent, final Currency currency) {
         final BusinessSubscription nextSubscription;
         if (BusinessSubscriptionEvent.EventType.CANCEL.equals(businessEvent.getEventType()) ||
             BusinessSubscriptionEvent.EventType.SYSTEM_CANCEL.equals(businessEvent.getEventType())) {
@@ -221,7 +221,7 @@ public class BusinessSubscriptionTransitionDao {
         return nextSubscription;
     }
 
-    private BusinessSubscription createPreviousBusinessSubscription(final EffectiveSubscriptionEvent event,
+    private BusinessSubscription createPreviousBusinessSubscription(final EffectiveSubscriptionInternalEvent event,
                                                                     final BusinessSubscriptionEvent businessEvent,
                                                                     final ArrayList<BusinessSubscriptionTransition> transitions,
                                                                     final Currency currency) {
@@ -238,7 +238,7 @@ public class BusinessSubscriptionTransitionDao {
                                         catalogService.getFullCatalog());
     }
 
-    private BusinessSubscriptionTransition getPreviousBusinessSubscriptionTransitionForEvent(final EffectiveSubscriptionEvent event,
+    private BusinessSubscriptionTransition getPreviousBusinessSubscriptionTransitionForEvent(final EffectiveSubscriptionInternalEvent event,
                                                                                              final ArrayList<BusinessSubscriptionTransition> transitions) {
         BusinessSubscriptionTransition transition = null;
         for (final BusinessSubscriptionTransition candidate : transitions) {
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 5ec0dbd..58c42c6 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
@@ -31,7 +31,6 @@ import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
 
 import com.ning.billing.account.api.Account;
-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;
@@ -56,7 +55,6 @@ import com.ning.billing.catalog.api.PriceList;
 import com.ning.billing.catalog.api.Product;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.entitlement.api.user.DefaultEffectiveSubscriptionEvent;
-import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
 import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.Subscription;
@@ -65,7 +63,6 @@ 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.Invoice;
-import com.ning.billing.invoice.api.InvoiceCreationEvent;
 import com.ning.billing.invoice.api.user.DefaultInvoiceCreationEvent;
 import com.ning.billing.invoice.dao.InvoiceDao;
 import com.ning.billing.invoice.model.DefaultInvoice;
@@ -73,7 +70,6 @@ import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
 import com.ning.billing.mock.MockAccountBuilder;
 import com.ning.billing.mock.MockPlan;
 import com.ning.billing.payment.api.DefaultPaymentInfoEvent;
-import com.ning.billing.payment.api.PaymentInfoEvent;
 import com.ning.billing.payment.api.PaymentMethod;
 import com.ning.billing.payment.api.PaymentStatus;
 import com.ning.billing.payment.dao.PaymentAttemptModelDao;
@@ -81,6 +77,10 @@ import com.ning.billing.payment.dao.PaymentDao;
 import com.ning.billing.payment.dao.PaymentModelDao;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.clock.DefaultClock;
+import com.ning.billing.util.events.AccountCreationInternalEvent;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
+import com.ning.billing.util.events.InvoiceCreationInternalEvent;
+import com.ning.billing.util.events.PaymentInfoInternalEvent;
 import com.ning.billing.util.svcsapi.bus.Bus;
 
 import com.google.inject.Inject;
@@ -127,12 +127,12 @@ public class TestAnalyticsService extends AnalyticsTestSuiteWithEmbeddedDB {
     @Inject
     private BusinessAccountSqlDao accountSqlDao;
 
-    private EffectiveSubscriptionEvent transition;
+    private EffectiveSubscriptionInternalEvent transition;
     private BusinessSubscriptionTransition expectedTransition;
 
-    private AccountCreationEvent accountCreationNotification;
-    private InvoiceCreationEvent invoiceCreationNotification;
-    private PaymentInfoEvent paymentInfoNotification;
+    private AccountCreationInternalEvent accountCreationNotification;
+    private InvoiceCreationInternalEvent invoiceCreationNotification;
+    private PaymentInfoInternalEvent paymentInfoNotification;
 
     @Inject
     private CatalogService catalogService;
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java
index b36e075..0e39638 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java
@@ -30,11 +30,11 @@ import com.ning.billing.analytics.model.BusinessSubscriptionTransition;
 import com.ning.billing.catalog.api.Catalog;
 import com.ning.billing.catalog.api.CatalogService;
 import com.ning.billing.entitlement.api.SubscriptionTransitionType;
-import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.clock.DefaultClock;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
 import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
 
@@ -64,6 +64,8 @@ public class TestBusinessSubscriptionTransitionRecorder extends AnalyticsTestSui
         final EntitlementInternalApi entitlementApi = Mockito.mock(EntitlementInternalApi.class);
         Mockito.when(entitlementApi.getBundleFromId(Mockito.<UUID>any(), Mockito.<InternalTenantContext>any())).thenReturn(bundle);
 
+
+
         // Setup the account API
         final Account account = Mockito.mock(Account.class);
         Mockito.when(account.getExternalKey()).thenReturn(externalKey.toString());
@@ -71,7 +73,7 @@ public class TestBusinessSubscriptionTransitionRecorder extends AnalyticsTestSui
         Mockito.when(accountApi.getAccountById(Mockito.eq(bundle.getAccountId()), Mockito.<InternalTenantContext>any())).thenReturn(account);
 
         // Create an new subscription event
-        final EffectiveSubscriptionEvent eventEffective = Mockito.mock(EffectiveSubscriptionEvent.class);
+        final EffectiveSubscriptionInternalEvent eventEffective = Mockito.mock(EffectiveSubscriptionInternalEvent.class);
         Mockito.when(eventEffective.getId()).thenReturn(UUID.randomUUID());
         Mockito.when(eventEffective.getTransitionType()).thenReturn(SubscriptionTransitionType.CREATE);
         Mockito.when(eventEffective.getSubscriptionId()).thenReturn(subscriptionId);
@@ -82,7 +84,8 @@ public class TestBusinessSubscriptionTransitionRecorder extends AnalyticsTestSui
 
         final Subscription subscription = Mockito.mock(Subscription.class);
         Mockito.when(subscription.getId()).thenReturn(subscriptionId);
-        Mockito.when(subscription.getAllTransitions()).thenReturn(ImmutableList.<EffectiveSubscriptionEvent>of(eventEffective));
+        Mockito.when(entitlementApi.getAllTransitions(subscription)).thenReturn(ImmutableList.<EffectiveSubscriptionInternalEvent>of(eventEffective));
+
         Mockito.when(entitlementApi.getSubscriptionsForBundle(Mockito.<UUID>any(), Mockito.<InternalTenantContext>any())).thenReturn(ImmutableList.<Subscription>of(subscription));
 
         final BusinessSubscriptionTransitionDao dao = new BusinessSubscriptionTransitionDao(sqlDao, catalogService, entitlementApi, accountApi, new DefaultClock());
diff --git a/api/src/main/java/com/ning/billing/account/api/AccountChangeEvent.java b/api/src/main/java/com/ning/billing/account/api/AccountChangeEvent.java
index 1c78280..0a4ec43 100644
--- a/api/src/main/java/com/ning/billing/account/api/AccountChangeEvent.java
+++ b/api/src/main/java/com/ning/billing/account/api/AccountChangeEvent.java
@@ -13,18 +13,8 @@
  * License for the specific language governing permissions and limitations
  * under the License.
  */
-
 package com.ning.billing.account.api;
 
-import java.util.List;
-import java.util.UUID;
-
-import com.ning.billing.util.bus.BusEvent;
-
-public interface AccountChangeEvent extends BusEvent {
-    public UUID getAccountId();
-
-    public List<ChangedField> getChangedFields();
+public interface AccountChangeEvent {
 
-    public boolean hasChanges();
 }
diff --git a/api/src/main/java/com/ning/billing/account/api/AccountCreationEvent.java b/api/src/main/java/com/ning/billing/account/api/AccountCreationEvent.java
index 3749e5a..fc5900d 100644
--- a/api/src/main/java/com/ning/billing/account/api/AccountCreationEvent.java
+++ b/api/src/main/java/com/ning/billing/account/api/AccountCreationEvent.java
@@ -13,16 +13,8 @@
  * License for the specific language governing permissions and limitations
  * under the License.
  */
-
 package com.ning.billing.account.api;
 
-import java.util.UUID;
-
-import com.ning.billing.util.bus.BusEvent;
-
-public interface AccountCreationEvent extends BusEvent {
-
-    public UUID getId();
+public interface AccountCreationEvent {
 
-    public AccountData getData();
 }
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/user/EffectiveSubscriptionEvent.java b/api/src/main/java/com/ning/billing/entitlement/api/user/EffectiveSubscriptionEvent.java
index 84b03b4..c3c21b3 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/user/EffectiveSubscriptionEvent.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/user/EffectiveSubscriptionEvent.java
@@ -13,8 +13,8 @@
  * License for the specific language governing permissions and limitations
  * under the License.
  */
-
 package com.ning.billing.entitlement.api.user;
 
-public interface EffectiveSubscriptionEvent extends SubscriptionEvent {
+public interface EffectiveSubscriptionEvent {
+
 }
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 cde8803..e6fda16 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
@@ -78,6 +78,8 @@ public interface Subscription extends Entity, Blockable {
 
     public Plan getCurrentPlan();
 
+    public Plan getLastActivePlan();
+
     public PriceList getCurrentPriceList();
 
     public PlanPhase getCurrentPhase();
diff --git a/api/src/main/java/com/ning/billing/invoice/api/InvoiceCreationEvent.java b/api/src/main/java/com/ning/billing/invoice/api/InvoiceCreationEvent.java
index 43e2f97..10dc327 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/InvoiceCreationEvent.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/InvoiceCreationEvent.java
@@ -13,20 +13,8 @@
  * License for the specific language governing permissions and limitations
  * under the License.
  */
-
 package com.ning.billing.invoice.api;
 
-import java.math.BigDecimal;
-import java.util.UUID;
-
-import com.ning.billing.catalog.api.Currency;
-
-public interface InvoiceCreationEvent extends InvoiceEvent {
-
-    public UUID getInvoiceId();
-
-    public BigDecimal getAmountOwed();
-
-    public Currency getCurrency();
+public interface InvoiceCreationEvent {
 
 }
diff --git a/api/src/main/java/com/ning/billing/util/bus/BusEvent.java b/api/src/main/java/com/ning/billing/util/bus/BusEvent.java
index c1636e0..331adc3 100644
--- a/api/src/main/java/com/ning/billing/util/bus/BusEvent.java
+++ b/api/src/main/java/com/ning/billing/util/bus/BusEvent.java
@@ -13,34 +13,15 @@
  * License for the specific language governing permissions and limitations
  * under the License.
  */
-
 package com.ning.billing.util.bus;
 
 import java.util.UUID;
 
 public interface BusEvent {
-    public enum BusEventType {
-        ACCOUNT_CREATE,
-        ACCOUNT_CHANGE,
-        SUBSCRIPTION_TRANSITION,
-        BUNDLE_REPAIR,
-        INVOICE_EMPTY,
-        INVOICE_CREATION,
-        INVOICE_ADJUSTMENT,
-        PAYMENT_INFO,
-        PAYMENT_ERROR,
-        CONTROL_TAG_CREATION,
-        CONTROL_TAG_DELETION,
-        USER_TAG_CREATION,
-        USER_TAG_DELETION,
-        CONTROL_TAGDEFINITION_CREATION,
-        CONTROL_TAGDEFINITION_DELETION,
-        USER_TAGDEFINITION_CREATION,
-        USER_TAGDEFINITION_DELETION,
-        OVERDUE_CHANGE
-    }
-
-    public BusEventType getBusEventType();
 
     public UUID getUserToken();
+
+    public UUID getAccountId();
+
+    public UUID getTenantId();
 }
diff --git a/api/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestNotifier.java b/api/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestNotifier.java
index befa2d7..bb45681 100644
--- a/api/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestNotifier.java
+++ b/api/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestNotifier.java
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright 2010-2011 Ning, Inc.
  *
  * Ning licenses this file to you under the Apache License, version 2.0
@@ -17,6 +17,8 @@ package com.ning.billing.util.userrequest;
 
 import com.ning.billing.util.bus.BusEvent;
 
+
+
 public interface CompletionUserRequestNotifier {
 
     public void notifyForCompletion();
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 4b9a492..3925ac4 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
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright 2010-2011 Ning, Inc.
  *
  * Ning licenses this file to you under the Apache License, version 2.0
@@ -22,9 +22,7 @@ import com.ning.billing.account.api.AccountChangeEvent;
 import com.ning.billing.account.api.AccountCreationEvent;
 import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
 import com.ning.billing.invoice.api.InvoiceCreationEvent;
-import com.ning.billing.invoice.api.NullInvoiceEvent;
-import com.ning.billing.payment.api.PaymentErrorEvent;
-import com.ning.billing.payment.api.PaymentInfoEvent;
+import com.ning.billing.payment.api.PaymentEvent;
 import com.ning.billing.util.bus.BusEvent;
 
 public interface CompletionUserRequestWaiter {
@@ -39,9 +37,9 @@ public interface CompletionUserRequestWaiter {
 
     public void onInvoiceCreation(final InvoiceCreationEvent curEvent);
 
-    public void onEmptyInvoice(final NullInvoiceEvent curEvent);
+    public void onEmptyInvoice(final InvoiceCreationEvent curEvent);
 
-    public void onPaymentInfo(final PaymentInfoEvent curEvent);
+    public void onPaymentInfo(final PaymentEvent curEvent);
 
-    public void onPaymentError(final PaymentErrorEvent curEvent);
+    public void onPaymentError(final PaymentEvent curEvent);
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultEntitlementTimelineApi.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultEntitlementTimelineApi.java
index f7c6362..ed85264 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultEntitlementTimelineApi.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultEntitlementTimelineApi.java
@@ -35,7 +35,6 @@ import com.ning.billing.entitlement.api.SubscriptionFactory;
 import com.ning.billing.entitlement.api.SubscriptionTransitionType;
 import com.ning.billing.entitlement.api.timeline.SubscriptionTimeline.NewEvent;
 import com.ning.billing.entitlement.api.user.DefaultSubscriptionFactory.SubscriptionBuilder;
-import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.entitlement.api.user.SubscriptionBundleData;
@@ -47,6 +46,7 @@ import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.callcontext.TenantContext;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 
 import com.google.inject.Inject;
 import com.google.inject.name.Named;
@@ -350,7 +350,7 @@ public class DefaultEntitlementTimelineApi implements EntitlementTimelineApi {
         if (nbDeleted != deletedEvents.size()) {
             for (final SubscriptionTimeline.DeletedEvent d : deletedEvents) {
                 boolean found = false;
-                for (final EffectiveSubscriptionEvent cur : data.getAllTransitions()) {
+                for (final EffectiveSubscriptionInternalEvent cur : data.getAllTransitions()) {
                     if (cur.getId().equals(d.getEventId())) {
                         found = true;
                     }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultRepairEntitlementEvent.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultRepairEntitlementEvent.java
index 6496488..0d12164 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultRepairEntitlementEvent.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultRepairEntitlementEvent.java
@@ -19,11 +19,13 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 
+import com.ning.billing.util.events.RepairEntitlementInternalEvent;
+
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultRepairEntitlementEvent implements RepairEntitlementEvent {
+public class DefaultRepairEntitlementEvent implements RepairEntitlementInternalEvent {
 
     private final UUID userToken;
     private final UUID bundleId;
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultEffectiveSubscriptionEvent.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultEffectiveSubscriptionEvent.java
index 5b8a38f..79130d8 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultEffectiveSubscriptionEvent.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultEffectiveSubscriptionEvent.java
@@ -21,11 +21,12 @@ import java.util.UUID;
 import org.joda.time.DateTime;
 
 import com.ning.billing.entitlement.api.SubscriptionTransitionType;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultEffectiveSubscriptionEvent extends DefaultSubscriptionEvent implements EffectiveSubscriptionEvent {
+public class DefaultEffectiveSubscriptionEvent extends DefaultSubscriptionEvent implements EffectiveSubscriptionInternalEvent {
     public DefaultEffectiveSubscriptionEvent(final SubscriptionTransitionData in, final DateTime startDate) {
         super(in, startDate);
     }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultRequestedSubscriptionEvent.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultRequestedSubscriptionEvent.java
index 55b89d0..bd29096 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultRequestedSubscriptionEvent.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultRequestedSubscriptionEvent.java
@@ -22,11 +22,12 @@ import org.joda.time.DateTime;
 
 import com.ning.billing.entitlement.api.SubscriptionTransitionType;
 import com.ning.billing.entitlement.events.EntitlementEvent;
+import com.ning.billing.util.events.RequestedSubscriptionInternalEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultRequestedSubscriptionEvent extends DefaultSubscriptionEvent implements RequestedSubscriptionEvent {
+public class DefaultRequestedSubscriptionEvent extends DefaultSubscriptionEvent implements RequestedSubscriptionInternalEvent {
     public DefaultRequestedSubscriptionEvent(final SubscriptionTransitionData in, final DateTime startDate) {
         super(in, startDate);
     }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultSubscriptionApiService.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultSubscriptionApiService.java
index 42abdec..3361732 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultSubscriptionApiService.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultSubscriptionApiService.java
@@ -59,6 +59,7 @@ import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.clock.DefaultClock;
 import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 
 import com.google.inject.Inject;
 
@@ -364,7 +365,7 @@ public class DefaultSubscriptionApiService implements SubscriptionApiService {
             throw new EntitlementUserApiException(ErrorCode.ENT_INVALID_REQUESTED_FUTURE_DATE, requestedDate.toString());
         }
 
-        final EffectiveSubscriptionEvent previousTransition = subscription.getPreviousTransition();
+        final EffectiveSubscriptionInternalEvent previousTransition = subscription.getPreviousTransition();
         if (previousTransition != null && 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/DefaultSubscriptionEvent.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultSubscriptionEvent.java
index 71f79cc..15598e0 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultSubscriptionEvent.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultSubscriptionEvent.java
@@ -21,12 +21,13 @@ import java.util.UUID;
 import org.joda.time.DateTime;
 
 import com.ning.billing.entitlement.api.SubscriptionTransitionType;
+import com.ning.billing.util.events.SubscriptionInternalEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public abstract class DefaultSubscriptionEvent implements SubscriptionEvent {
+public abstract class DefaultSubscriptionEvent implements SubscriptionInternalEvent {
     private final Long totalOrdering;
     private final UUID subscriptionId;
     private final UUID bundleId;
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 b0ba8ea..430316a 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
@@ -53,6 +53,7 @@ import com.ning.billing.junction.api.BlockingState;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.entity.EntityBase;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 
 public class SubscriptionData extends EntityBase implements Subscription {
 
@@ -156,7 +157,7 @@ public class SubscriptionData extends EntityBase implements Subscription {
 
     @Override
     public DateTime getEndDate() {
-        final EffectiveSubscriptionEvent latestTransition = getPreviousTransition();
+        final EffectiveSubscriptionInternalEvent latestTransition = getPreviousTransition();
         if (latestTransition.getNextState() == SubscriptionState.CANCELLED) {
             return latestTransition.getEffectiveTransitionTime();
         }
@@ -239,7 +240,7 @@ public class SubscriptionData extends EntityBase implements Subscription {
     }
 
     @Override
-    public EffectiveSubscriptionEvent getPreviousTransition() {
+    public EffectiveSubscriptionInternalEvent getPreviousTransition() {
         final SubscriptionTransitionData data = getPreviousTransitionData();
         if (data == null) {
             return null;
@@ -348,12 +349,12 @@ public class SubscriptionData extends EntityBase implements Subscription {
     }
 
     @Override
-    public List<EffectiveSubscriptionEvent> getBillingTransitions() {
+    public List<EffectiveSubscriptionInternalEvent> getBillingTransitions() {
 
         if (transitions == null) {
             return Collections.emptyList();
         }
-        final List<EffectiveSubscriptionEvent> result = new ArrayList<EffectiveSubscriptionEvent>();
+        final List<EffectiveSubscriptionInternalEvent> result = new ArrayList<EffectiveSubscriptionInternalEvent>();
         final SubscriptionTransitionDataIterator it = new SubscriptionTransitionDataIterator(
                 clock, transitions, Order.ASC_FROM_PAST, Kind.BILLING,
                 Visibility.ALL, TimeLimit.ALL);
@@ -363,7 +364,7 @@ public class SubscriptionData extends EntityBase implements Subscription {
         return result;
     }
 
-    public EffectiveSubscriptionEvent getTransitionFromEvent(final EntitlementEvent event, final int seqId) {
+    public EffectiveSubscriptionInternalEvent getTransitionFromEvent(final EntitlementEvent event, final int seqId) {
         if (transitions == null || event == null) {
             return null;
         }
@@ -392,12 +393,12 @@ public class SubscriptionData extends EntityBase implements Subscription {
     }
 
     @Override
-    public List<EffectiveSubscriptionEvent> getAllTransitions() {
+    public List<EffectiveSubscriptionInternalEvent> getAllTransitions() {
         if (transitions == null) {
             return Collections.emptyList();
         }
 
-        final List<EffectiveSubscriptionEvent> result = new ArrayList<EffectiveSubscriptionEvent>();
+        final List<EffectiveSubscriptionInternalEvent> result = new ArrayList<EffectiveSubscriptionInternalEvent>();
         final SubscriptionTransitionDataIterator it = new SubscriptionTransitionDataIterator(clock, transitions, Order.ASC_FROM_PAST, Kind.ALL, Visibility.ALL, TimeLimit.ALL);
         while (it.hasNext()) {
             result.add(new DefaultEffectiveSubscriptionEvent(it.next(), alignStartDate));
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/AuditedEntitlementDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/AuditedEntitlementDao.java
index a939c1e..cb2caaa 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/AuditedEntitlementDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/AuditedEntitlementDao.java
@@ -46,7 +46,6 @@ import com.ning.billing.entitlement.api.migration.AccountMigrationData;
 import com.ning.billing.entitlement.api.migration.AccountMigrationData.BundleMigrationData;
 import com.ning.billing.entitlement.api.migration.AccountMigrationData.SubscriptionMigrationData;
 import com.ning.billing.entitlement.api.timeline.DefaultRepairEntitlementEvent;
-import com.ning.billing.entitlement.api.timeline.RepairEntitlementEvent;
 import com.ning.billing.entitlement.api.timeline.SubscriptionDataRepair;
 import com.ning.billing.entitlement.api.transfer.TransferCancelData;
 import com.ning.billing.entitlement.api.user.DefaultRequestedSubscriptionEvent;
@@ -74,6 +73,7 @@ import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.dao.EntityAudit;
 import com.ning.billing.util.dao.TableName;
+import com.ning.billing.util.events.RepairEntitlementInternalEvent;
 import com.ning.billing.util.notificationq.NotificationKey;
 import com.ning.billing.util.notificationq.NotificationQueue;
 import com.ning.billing.util.notificationq.NotificationQueueService;
@@ -636,7 +636,7 @@ public class AuditedEntitlementDao implements EntitlementDao {
 
                 try {
                     // Note: we don't send a requested change event here, but a repair event
-                    final RepairEntitlementEvent busEvent = new DefaultRepairEntitlementEvent(context.getUserToken(), accountId, bundleId, clock.getUTCNow());
+                    final RepairEntitlementInternalEvent busEvent = new DefaultRepairEntitlementEvent(context.getUserToken(), accountId, bundleId, clock.getUTCNow());
                     eventBus.postFromTransaction(busEvent, transactional, context);
                 } catch (EventBusException e) {
                     log.warn("Failed to post repair entitlement event for bundle " + bundleId, e);
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/alignment/TestPlanAligner.java b/entitlement/src/test/java/com/ning/billing/entitlement/alignment/TestPlanAligner.java
index 8ec636a..bd5696c 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/alignment/TestPlanAligner.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/alignment/TestPlanAligner.java
@@ -35,7 +35,6 @@ import com.ning.billing.catalog.api.PriceListSet;
 import com.ning.billing.catalog.io.VersionedCatalogLoader;
 import com.ning.billing.config.CatalogConfig;
 import com.ning.billing.entitlement.api.user.DefaultSubscriptionFactory;
-import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.SubscriptionData;
 import com.ning.billing.entitlement.events.EntitlementEvent;
@@ -44,6 +43,7 @@ import com.ning.billing.entitlement.events.user.ApiEventBuilder;
 import com.ning.billing.entitlement.events.user.ApiEventType;
 import com.ning.billing.entitlement.exceptions.EntitlementError;
 import com.ning.billing.util.clock.DefaultClock;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -203,7 +203,7 @@ public class TestPlanAligner extends KillbillTestSuite {
 
         subscriptionData.rebuildTransitions(ImmutableList.<EntitlementEvent>of(previousEvent, event), catalogService.getFullCatalog());
 
-        final List<EffectiveSubscriptionEvent> newTransitions = subscriptionData.getAllTransitions();
+        final List<EffectiveSubscriptionInternalEvent> newTransitions = subscriptionData.getAllTransitions();
         Assert.assertEquals(newTransitions.size(), 2);
         Assert.assertNull(newTransitions.get(0).getPreviousPhase());
         Assert.assertEquals(newTransitions.get(0).getNextPhase(), newTransitions.get(1).getPreviousPhase());
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 55dd482..02fe3b0 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
@@ -67,7 +67,6 @@ import com.ning.billing.entitlement.api.migration.EntitlementMigrationApi.Entitl
 import com.ning.billing.entitlement.api.migration.EntitlementMigrationApi.EntitlementSubscriptionMigrationCase;
 import com.ning.billing.entitlement.api.timeline.EntitlementTimelineApi;
 import com.ning.billing.entitlement.api.transfer.EntitlementTransferApi;
-import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
 import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
@@ -84,6 +83,7 @@ import com.ning.billing.util.svcsapi.bus.BusService;
 import com.ning.billing.util.bus.DefaultBusService;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.clock.ClockMock;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 import com.ning.billing.util.glue.RealImplementation;
 import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
 
@@ -397,8 +397,8 @@ public abstract class TestApiBase extends EntitlementTestSuiteWithEmbeddedDB imp
         }
     }
 
-    protected void printSubscriptionTransitions(final List<EffectiveSubscriptionEvent> transitions) {
-        for (final EffectiveSubscriptionEvent cur : transitions) {
+    protected void printSubscriptionTransitions(final List<EffectiveSubscriptionInternalEvent> transitions) {
+        for (final EffectiveSubscriptionInternalEvent cur : transitions) {
             log.debug("Transition " + cur);
         }
     }
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/TestEventJson.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/TestEventJson.java
index 53c266b..d40246b 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/TestEventJson.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/TestEventJson.java
@@ -24,10 +24,10 @@ import org.testng.annotations.Test;
 
 import com.ning.billing.entitlement.EntitlementTestSuite;
 import com.ning.billing.entitlement.api.timeline.DefaultRepairEntitlementEvent;
-import com.ning.billing.entitlement.api.timeline.RepairEntitlementEvent;
 import com.ning.billing.entitlement.api.user.DefaultEffectiveSubscriptionEvent;
-import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
 import com.ning.billing.entitlement.api.user.Subscription.SubscriptionState;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
+import com.ning.billing.util.events.RepairEntitlementInternalEvent;
 import com.ning.billing.util.jackson.ObjectMapper;
 
 public class TestEventJson extends EntitlementTestSuite {
@@ -36,7 +36,7 @@ public class TestEventJson extends EntitlementTestSuite {
     @Test(groups = "fast")
     public void testSubscriptionEvent() throws Exception {
 
-        final EffectiveSubscriptionEvent e = new DefaultEffectiveSubscriptionEvent(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), new DateTime(), new DateTime(),
+        final EffectiveSubscriptionInternalEvent e = new DefaultEffectiveSubscriptionEvent(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), new DateTime(), new DateTime(),
                                                                                    SubscriptionState.ACTIVE, "pro", "TRIAL", "DEFAULT", SubscriptionState.CANCELLED, null, null, null, 3L, UUID.randomUUID(), SubscriptionTransitionType.CANCEL, 0, new DateTime());
 
         final String json = mapper.writeValueAsString(e);
@@ -48,7 +48,7 @@ public class TestEventJson extends EntitlementTestSuite {
 
     @Test(groups = "fast")
     public void testRepairEntitlementEvent() throws Exception {
-        final RepairEntitlementEvent e = new DefaultRepairEntitlementEvent(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), new DateTime());
+        final RepairEntitlementInternalEvent e = new DefaultRepairEntitlementEvent(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), new DateTime());
 
         final String json = mapper.writeValueAsString(e);
 
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 a906cb9..a04e916 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
@@ -44,6 +44,7 @@ import com.ning.billing.entitlement.api.user.Subscription.SubscriptionState;
 import com.ning.billing.entitlement.api.user.SubscriptionStatusDryRun.DryRunChangeReason;
 import com.ning.billing.entitlement.glue.MockEngineModuleSql;
 import com.ning.billing.util.clock.DefaultClock;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 
 import com.google.inject.Guice;
 import com.google.inject.Injector;
@@ -361,7 +362,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
-            EffectiveSubscriptionEvent aoPendingTranstion = aoSubscription.getPendingTransition();
+            EffectiveSubscriptionInternalEvent 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 55ed4ff..a96f92a 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
@@ -40,6 +40,7 @@ import com.ning.billing.entitlement.api.TestApiBase;
 import com.ning.billing.entitlement.events.EntitlementEvent;
 import com.ning.billing.entitlement.events.user.ApiEvent;
 import com.ning.billing.util.clock.DefaultClock;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 import com.ning.billing.util.svcapi.entitlement.EntitlementBillingApiException;
 
 public abstract class TestUserApiChangePlan extends TestApiBase {
@@ -458,7 +459,7 @@ public abstract class TestUserApiChangePlan extends TestApiBase {
             subscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(subscription.getId(), callContext);
 
             final DateTime expectedNextPhaseDate = subscription.getStartDate().plusDays(30).plusMonths(6);
-            final EffectiveSubscriptionEvent nextPhase = subscription.getPendingTransition();
+            final EffectiveSubscriptionInternalEvent nextPhase = subscription.getPendingTransition();
             final DateTime nextPhaseEffectiveDate = nextPhase.getEffectiveTransitionTime();
 
             assertEquals(nextPhaseEffectiveDate, expectedNextPhaseDate);
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceAdjustmentEvent.java b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceAdjustmentEvent.java
index d4e6170..10d1656 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceAdjustmentEvent.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceAdjustmentEvent.java
@@ -18,13 +18,13 @@ package com.ning.billing.invoice.api.user;
 
 import java.util.UUID;
 
-import com.ning.billing.invoice.api.InvoiceAdjustmentEvent;
+import com.ning.billing.util.events.InvoiceAdjustmentInternalEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultInvoiceAdjustmentEvent implements InvoiceAdjustmentEvent {
+public class DefaultInvoiceAdjustmentEvent implements InvoiceAdjustmentInternalEvent {
 
     private final UUID invoiceId;
     private final UUID accountId;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceCreationEvent.java b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceCreationEvent.java
index 82969a4..0b2d9ad 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceCreationEvent.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceCreationEvent.java
@@ -20,13 +20,13 @@ import java.math.BigDecimal;
 import java.util.UUID;
 
 import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.invoice.api.InvoiceCreationEvent;
+import com.ning.billing.util.events.InvoiceCreationInternalEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultInvoiceCreationEvent implements InvoiceCreationEvent {
+public class DefaultInvoiceCreationEvent implements InvoiceCreationInternalEvent {
 
     private final UUID invoiceId;
     private final UUID accountId;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultNullInvoiceEvent.java b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultNullInvoiceEvent.java
index 7b4a35a..ceabe8e 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultNullInvoiceEvent.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultNullInvoiceEvent.java
@@ -20,13 +20,13 @@ import java.util.UUID;
 
 import org.joda.time.LocalDate;
 
-import com.ning.billing.invoice.api.NullInvoiceEvent;
+import com.ning.billing.util.events.NullInvoiceInternalEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultNullInvoiceEvent implements NullInvoiceEvent {
+public class DefaultNullInvoiceEvent implements NullInvoiceInternalEvent {
 
     private final UUID accountId;
     private final LocalDate processingDate;
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 bd00de0..a493034 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
@@ -34,11 +34,9 @@ import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
 import com.ning.billing.account.api.BillCycleDay;
 import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
-import com.ning.billing.invoice.api.InvoiceCreationEvent;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoiceNotifier;
 import com.ning.billing.invoice.api.user.DefaultInvoiceCreationEvent;
@@ -48,11 +46,13 @@ import com.ning.billing.invoice.generator.InvoiceDateUtils;
 import com.ning.billing.invoice.generator.InvoiceGenerator;
 import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
 import com.ning.billing.invoice.model.RecurringInvoiceItem;
-import com.ning.billing.util.bus.BusEvent;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.events.BusInternalEvent;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
+import com.ning.billing.util.events.InvoiceCreationInternalEvent;
 import com.ning.billing.util.globallocker.GlobalLock;
 import com.ning.billing.util.globallocker.GlobalLocker;
 import com.ning.billing.util.globallocker.GlobalLocker.LockerType;
@@ -106,7 +106,7 @@ public class InvoiceDispatcher {
         this.internalCallContextFactory = internalCallContextFactory;
     }
 
-    public void processSubscription(final EffectiveSubscriptionEvent transition,
+    public void processSubscription(final EffectiveSubscriptionInternalEvent transition,
                                     final CallContext context) throws InvoiceApiException {
         final UUID subscriptionId = transition.getSubscriptionId();
         final DateTime targetDate = transition.getEffectiveTransitionTime();
@@ -171,7 +171,7 @@ public class InvoiceDispatcher {
             if (invoice == null) {
                 log.info("Generated null invoice.");
                 if (!dryRun) {
-                    final BusEvent event = new DefaultNullInvoiceEvent(accountId, clock.getUTCToday(), context.getUserToken());
+                    final BusInternalEvent event = new DefaultNullInvoiceEvent(accountId, clock.getUTCToday(), context.getUserToken());
                     postEvent(event, accountId, internalCallContext);
                 }
             } else {
@@ -191,7 +191,7 @@ public class InvoiceDispatcher {
                     final List<InvoiceItem> recurringInvoiceItems = invoice.getInvoiceItems(RecurringInvoiceItem.class);
                     setChargedThroughDates(account.getBillCycleDay(), account.getTimeZone(), fixedPriceInvoiceItems, recurringInvoiceItems, context);
 
-                    final InvoiceCreationEvent event = new DefaultInvoiceCreationEvent(invoice.getId(), invoice.getAccountId(),
+                    final InvoiceCreationInternalEvent event = new DefaultInvoiceCreationEvent(invoice.getId(), invoice.getAccountId(),
                                                                                        invoice.getBalance(), invoice.getCurrency(),
                                                                                        context.getUserToken());
 
@@ -231,7 +231,7 @@ public class InvoiceDispatcher {
         }
     }
 
-    private void postEvent(final BusEvent event, final UUID accountId, final InternalCallContext context) {
+    private void postEvent(final BusInternalEvent event, final UUID accountId, final InternalCallContext context) {
         try {
             eventBus.post(event, context);
         } catch (EventBusException e) {
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 ed30173..9adeb07 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
@@ -23,13 +23,13 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.ning.billing.entitlement.api.SubscriptionTransitionType;
-import com.ning.billing.entitlement.api.timeline.RepairEntitlementEvent;
-import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.CallContextFactory;
 import com.ning.billing.util.callcontext.CallOrigin;
 import com.ning.billing.util.callcontext.UserType;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
+import com.ning.billing.util.events.RepairEntitlementInternalEvent;
 
 import com.google.common.eventbus.Subscribe;
 import com.google.inject.Inject;
@@ -47,7 +47,7 @@ public class InvoiceListener {
     }
 
     @Subscribe
-    public void handleRepairEntitlementEvent(final RepairEntitlementEvent repairEvent) {
+    public void handleRepairEntitlementEvent(final RepairEntitlementInternalEvent repairEvent) {
         try {
             // TODO retrieve tenantId?
             final CallContext context = factory.createCallContext(null, "RepairBundle", CallOrigin.INTERNAL, UserType.SYSTEM, repairEvent.getUserToken());
@@ -58,7 +58,7 @@ public class InvoiceListener {
     }
 
     @Subscribe
-    public void handleSubscriptionTransition(final EffectiveSubscriptionEvent transition) {
+    public void handleSubscriptionTransition(final EffectiveSubscriptionInternalEvent transition) {
         try {
             //  Skip future uncancel event
             //  Skip events which are marked as not being the last one
diff --git a/invoice/src/main/java/com/ning/billing/invoice/TagHandler.java b/invoice/src/main/java/com/ning/billing/invoice/TagHandler.java
index fc8720f..ab645bd 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/TagHandler.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/TagHandler.java
@@ -27,8 +27,8 @@ import com.ning.billing.util.callcontext.DefaultCallContext;
 import com.ning.billing.util.callcontext.UserType;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.events.ControlTagDeletionInternalEvent;
 import com.ning.billing.util.tag.ControlTagType;
-import com.ning.billing.util.tag.api.ControlTagDeletionEvent;
 
 import com.google.common.eventbus.Subscribe;
 import com.google.inject.Inject;
@@ -48,7 +48,7 @@ public class TagHandler {
     }
 
     @Subscribe
-    public void process_AUTO_INVOICING_OFF_removal(final ControlTagDeletionEvent event) {
+    public void process_AUTO_INVOICING_OFF_removal(final ControlTagDeletionInternalEvent event) {
         if (event.getTagDefinition().getName().equals(ControlTagType.AUTO_INVOICING_OFF.toString()) && event.getObjectType() ==  ObjectType.ACCOUNT) {
             final UUID accountId = event.getObjectId();
             processUnpaid_AUTO_INVOICING_OFF_invoices(accountId, event.getUserToken());
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/user/TestEventJson.java b/invoice/src/test/java/com/ning/billing/invoice/api/user/TestEventJson.java
index e1e177c..efee08f 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/user/TestEventJson.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/user/TestEventJson.java
@@ -25,8 +25,8 @@ import org.testng.annotations.Test;
 
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.InvoiceTestSuite;
-import com.ning.billing.invoice.api.InvoiceCreationEvent;
-import com.ning.billing.invoice.api.NullInvoiceEvent;
+import com.ning.billing.util.events.InvoiceCreationInternalEvent;
+import com.ning.billing.util.events.NullInvoiceInternalEvent;
 import com.ning.billing.util.jackson.ObjectMapper;
 
 public class TestEventJson extends InvoiceTestSuite {
@@ -35,7 +35,7 @@ public class TestEventJson extends InvoiceTestSuite {
 
     @Test(groups = "fast")
     public void testInvoiceCreationEvent() throws Exception {
-        final InvoiceCreationEvent e = new DefaultInvoiceCreationEvent(UUID.randomUUID(), UUID.randomUUID(), new BigDecimal(12.0), Currency.USD, UUID.randomUUID());
+        final InvoiceCreationInternalEvent e = new DefaultInvoiceCreationEvent(UUID.randomUUID(), UUID.randomUUID(), new BigDecimal(12.0), Currency.USD, UUID.randomUUID());
         final String json = mapper.writeValueAsString(e);
 
         final Object obj = mapper.readValue(json, DefaultInvoiceCreationEvent.class);
@@ -44,7 +44,7 @@ public class TestEventJson extends InvoiceTestSuite {
 
     @Test(groups = "fast")
     public void testEmptyInvoiceEvent() throws Exception {
-        final NullInvoiceEvent e = new DefaultNullInvoiceEvent(UUID.randomUUID(), new LocalDate(), UUID.randomUUID());
+        final NullInvoiceInternalEvent e = new DefaultNullInvoiceEvent(UUID.randomUUID(), new LocalDate(), UUID.randomUUID());
         final String json = mapper.writeValueAsString(e);
 
         final Object obj = mapper.readValue(json, DefaultNullInvoiceEvent.class);
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 d6d1cc7..82cc46a 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
@@ -45,19 +45,14 @@ import com.ning.billing.catalog.api.ActionPolicy;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.ProductCategory;
-import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
 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.invoice.api.InvoiceCreationEvent;
-import com.ning.billing.invoice.api.NullInvoiceEvent;
 import com.ning.billing.jaxrs.json.CustomFieldJson;
 import com.ning.billing.jaxrs.json.SubscriptionJsonNoEvents;
 import com.ning.billing.jaxrs.util.Context;
 import com.ning.billing.jaxrs.util.JaxrsUriBuilder;
 import com.ning.billing.jaxrs.util.KillbillEventHandler;
-import com.ning.billing.payment.api.PaymentErrorEvent;
-import com.ning.billing.payment.api.PaymentInfoEvent;
 import com.ning.billing.util.api.AuditUserApi;
 import com.ning.billing.util.api.CustomFieldUserApi;
 import com.ning.billing.util.api.TagApiException;
@@ -65,6 +60,11 @@ import com.ning.billing.util.api.TagDefinitionApiException;
 import com.ning.billing.util.api.TagUserApi;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
+import com.ning.billing.util.events.InvoiceCreationInternalEvent;
+import com.ning.billing.util.events.NullInvoiceInternalEvent;
+import com.ning.billing.util.events.PaymentErrorInternalEvent;
+import com.ning.billing.util.events.PaymentInfoInternalEvent;
 import com.ning.billing.util.userrequest.CompletionUserRequestBase;
 
 import com.google.inject.Inject;
@@ -279,19 +279,19 @@ public class SubscriptionResource extends JaxRsResourceBase {
         }
 
         @Override
-        public void onSubscriptionTransition(final EffectiveSubscriptionEvent curEventEffective) {
+        public void onSubscriptionTransition(final EffectiveSubscriptionInternalEvent curEventEffective) {
             log.info(String.format("Got event SubscriptionTransition token = %s, type = %s, remaining = %d ",
                                    curEventEffective.getUserToken(), curEventEffective.getTransitionType(), curEventEffective.getRemainingEventsForUserOperation()));
         }
 
         @Override
-        public void onEmptyInvoice(final NullInvoiceEvent curEvent) {
+        public void onEmptyInvoice(final NullInvoiceInternalEvent curEvent) {
             log.info(String.format("Got event EmptyInvoiceNotification token = %s ", curEvent.getUserToken()));
             notifyForCompletion();
         }
 
         @Override
-        public void onInvoiceCreation(final InvoiceCreationEvent curEvent) {
+        public void onInvoiceCreation(final InvoiceCreationInternalEvent curEvent) {
             log.info(String.format("Got event InvoiceCreationNotification token = %s ", curEvent.getUserToken()));
             if (curEvent.getAmountOwed().compareTo(BigDecimal.ZERO) <= 0) {
                 notifyForCompletion();
@@ -299,13 +299,13 @@ public class SubscriptionResource extends JaxRsResourceBase {
         }
 
         @Override
-        public void onPaymentInfo(final PaymentInfoEvent curEvent) {
+        public void onPaymentInfo(final PaymentInfoInternalEvent curEvent) {
             log.info(String.format("Got event PaymentInfo token = %s ", curEvent.getUserToken()));
             notifyForCompletion();
         }
 
         @Override
-        public void onPaymentError(final PaymentErrorEvent curEvent) {
+        public void onPaymentError(final PaymentErrorInternalEvent curEvent) {
             log.info(String.format("Got event PaymentError token = %s ", curEvent.getUserToken()));
             notifyForCompletion();
         }
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/util/KillbillEventHandler.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/util/KillbillEventHandler.java
index a16694e..bd2babf 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/util/KillbillEventHandler.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/util/KillbillEventHandler.java
@@ -20,7 +20,8 @@ import java.util.LinkedList;
 import java.util.List;
 
 import com.google.common.eventbus.Subscribe;
-import com.ning.billing.util.bus.BusEvent;
+
+import com.ning.billing.util.events.BusInternalEvent;
 import com.ning.billing.util.userrequest.CompletionUserRequest;
 import com.ning.billing.util.userrequest.CompletionUserRequestNotifier;
 
@@ -55,7 +56,7 @@ public class KillbillEventHandler {
      * Killbill server event handler
      */
     @Subscribe
-    public void handleEntitlementevents(final BusEvent event) {
+    public void handleEntitlementevents(final BusInternalEvent event) {
         final List<CompletionUserRequestNotifier> runningWaiters = new ArrayList<CompletionUserRequestNotifier>();
         synchronized (activeWaiters) {
             runningWaiters.addAll(activeWaiters);
diff --git a/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingSubscription.java b/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingSubscription.java
index f5e22b1..1d22293 100644
--- a/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingSubscription.java
+++ b/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingSubscription.java
@@ -153,6 +153,12 @@ public class BlockingSubscription implements Subscription {
     }
 
     @Override
+    public Plan getLastActivePlan() {
+        return subscription.getLastActivePlan();
+    }
+
+
+    @Override
     public PriceList getCurrentPriceList() {
         return subscription.getCurrentPriceList();
     }
diff --git a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/BillCycleDayCalculator.java b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/BillCycleDayCalculator.java
index 89b5369..93b31b7 100644
--- a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/BillCycleDayCalculator.java
+++ b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/BillCycleDayCalculator.java
@@ -37,11 +37,11 @@ import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.Product;
 import com.ning.billing.entitlement.api.SubscriptionTransitionType;
-import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
 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.util.callcontext.InternalCallContext;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
 
 import com.google.common.annotations.VisibleForTesting;
@@ -60,7 +60,7 @@ public class BillCycleDayCalculator {
         this.entitlementApi = entitlementApi;
     }
 
-    protected BillCycleDay calculateBcd(final SubscriptionBundle bundle, final Subscription subscription, final EffectiveSubscriptionEvent transition, final Account account, final InternalCallContext context)
+    protected BillCycleDay calculateBcd(final SubscriptionBundle bundle, final Subscription subscription, final EffectiveSubscriptionInternalEvent transition, final Account account, final InternalCallContext context)
             throws CatalogApiException, AccountApiException, EntitlementUserApiException {
 
         final Catalog catalog = catalogService.getFullCatalog();
@@ -103,8 +103,7 @@ public class BillCycleDayCalculator {
                 Plan basePlan = baseSub.getCurrentPlan();
                 if (basePlan == null) {
                     // The BP has been cancelled
-                    final EffectiveSubscriptionEvent previousTransition = baseSub.getPreviousTransition();
-                    basePlan = catalog.findPlan(previousTransition.getPreviousPlan(), previousTransition.getEffectiveTransitionTime(), previousTransition.getSubscriptionStartDate());
+                    basePlan = baseSub.getLastActivePlan();
                 }
                 result = calculateBcdFromSubscription(baseSub, basePlan, account, catalog);
                 break;
@@ -126,7 +125,7 @@ public class BillCycleDayCalculator {
         // Retrieve the initial phase type for that subscription
         // TODO - this should be extracted somewhere, along with this code above
         final PhaseType initialPhaseType;
-        final List<EffectiveSubscriptionEvent> transitions = subscription.getAllTransitions();
+        final List<EffectiveSubscriptionInternalEvent> transitions =  entitlementApi.getAllTransitions(subscription);
         if (transitions.size() == 0) {
             initialPhaseType = null;
         } else {
diff --git a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingEvent.java b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingEvent.java
index bf104e9..905ef93 100644
--- a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingEvent.java
+++ b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingEvent.java
@@ -30,8 +30,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.SubscriptionTransitionType;
-import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
 import com.ning.billing.entitlement.api.user.Subscription;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 import com.ning.billing.util.svcapi.junction.BillingEvent;
 import com.ning.billing.util.svcapi.junction.BillingModeType;
 
@@ -52,7 +52,7 @@ public class DefaultBillingEvent implements BillingEvent {
     private final Long totalOrdering;
     private final DateTimeZone timeZone;
 
-    public DefaultBillingEvent(final Account account, final EffectiveSubscriptionEvent transition, final Subscription subscription, final BillCycleDay billCycleDay, final Currency currency, final Catalog catalog) throws CatalogApiException {
+    public DefaultBillingEvent(final Account account, final EffectiveSubscriptionInternalEvent transition, final Subscription subscription, final BillCycleDay billCycleDay, final Currency currency, final Catalog catalog) throws CatalogApiException {
 
         this.account = account;
         this.billCycleDay = billCycleDay;
diff --git a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultInternalBillingApi.java b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultInternalBillingApi.java
index 8885024..2ca82f9 100644
--- a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultInternalBillingApi.java
+++ b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultInternalBillingApi.java
@@ -30,11 +30,11 @@ import com.ning.billing.account.api.BillCycleDay;
 import com.ning.billing.account.api.MutableAccountData;
 import com.ning.billing.catalog.api.CatalogApiException;
 import com.ning.billing.catalog.api.CatalogService;
-import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
 import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
 import com.ning.billing.util.svcapi.junction.BillingEvent;
@@ -137,7 +137,7 @@ public class DefaultInternalBillingApi implements BillingInternalApi {
 
     private void addBillingEventsForSubscription(final List<Subscription> subscriptions, final SubscriptionBundle bundle, final Account account, final InternalCallContext context, final DefaultBillingEventSet result) {
         for (final Subscription subscription : subscriptions) {
-            for (final EffectiveSubscriptionEvent transition : subscription.getBillingTransitions()) {
+            for (final EffectiveSubscriptionInternalEvent transition : entitlementApi.getBillingTransitions(subscription)) {
                 try {
                     final BillCycleDay bcd = bcdCalculator.calculateBcd(bundle, subscription, transition, account, context);
 
diff --git a/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillCycleDayCalculator.java b/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillCycleDayCalculator.java
index 6619f09..d707114 100644
--- a/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillCycleDayCalculator.java
+++ b/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillCycleDayCalculator.java
@@ -32,7 +32,6 @@ import com.ning.billing.catalog.api.Catalog;
 import com.ning.billing.catalog.api.CatalogApiException;
 import com.ning.billing.catalog.api.CatalogService;
 import com.ning.billing.catalog.api.Plan;
-import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.junction.JunctionTestSuite;
@@ -54,10 +53,8 @@ public class TestBillCycleDayCalculator extends JunctionTestSuite {
 
         // Create a Bundle associated with a subscription
         final SubscriptionBundle bundle = Mockito.mock(SubscriptionBundle.class);
-        final EffectiveSubscriptionEvent previousTransition = Mockito.mock(EffectiveSubscriptionEvent.class);
         final Subscription subscription = Mockito.mock(Subscription.class);
         Mockito.when(subscription.getStartDate()).thenReturn(bpStartDateUTC);
-        Mockito.when(subscription.getPreviousTransition()).thenReturn(previousTransition);
         // subscription.getCurrentPlan() will return null as expected (cancelled BP)
         Mockito.when(entitlementApi.getBaseSubscription(Mockito.<UUID>any(), Mockito.<InternalTenantContext>any())).thenReturn(subscription);
 
diff --git a/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillingApi.java b/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillingApi.java
index 998ba8d..2c38594 100644
--- a/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillingApi.java
+++ b/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillingApi.java
@@ -52,7 +52,6 @@ import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.catalog.api.PriceList;
 import com.ning.billing.catalog.api.PriceListSet;
 import com.ning.billing.entitlement.api.SubscriptionTransitionType;
-import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.Subscription.SubscriptionState;
@@ -70,6 +69,7 @@ import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.clock.ClockMock;
 import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
 import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
 import com.ning.billing.util.svcapi.junction.BillingEvent;
@@ -93,7 +93,7 @@ public class TestBillingApi extends JunctionTestSuite {
 
     private CatalogService catalogService;
 
-    private List<EffectiveSubscriptionEvent> effectiveSubscriptionTransitions;
+    private List<EffectiveSubscriptionInternalEvent> effectiveSubscriptionTransitions;
     private EntitlementInternalApi entitlementApi;
 
     private final BlockingCalculator blockCalculator = new BlockingCalculator(null) {
@@ -127,7 +127,7 @@ public class TestBillingApi extends JunctionTestSuite {
 
         bundles.add(bundle);
 
-        effectiveSubscriptionTransitions = new LinkedList<EffectiveSubscriptionEvent>();
+        effectiveSubscriptionTransitions = new LinkedList<EffectiveSubscriptionInternalEvent>();
         final List<Subscription> subscriptions = new LinkedList<Subscription>();
 
         final DateTime subscriptionStartDate = clock.getUTCNow().minusDays(3);
@@ -356,7 +356,7 @@ public class TestBillingApi extends JunctionTestSuite {
         final DateTime then = now.minusDays(1);
         final PriceList nextPriceList = catalogService.getFullCatalog().findPriceList(PriceListSet.DEFAULT_PRICELIST_NAME, now);
 
-        final EffectiveSubscriptionEvent t = new MockEffectiveSubscriptionEvent(
+        final EffectiveSubscriptionInternalEvent t = new MockEffectiveSubscriptionEvent(
                 eventId, subId, bunId, then, now, null, null, null, null, SubscriptionState.ACTIVE,
                 nextPlan.getName(), nextPhase.getName(),
                 nextPriceList.getName(), 1L, null,
diff --git a/overdue/src/main/java/com/ning/billing/overdue/applicator/DefaultOverdueChangeEvent.java b/overdue/src/main/java/com/ning/billing/overdue/applicator/DefaultOverdueChangeEvent.java
index fb1988a..6add492 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/applicator/DefaultOverdueChangeEvent.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/applicator/DefaultOverdueChangeEvent.java
@@ -24,9 +24,9 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 import com.ning.billing.junction.api.Blockable;
 import com.ning.billing.junction.api.Blockable.Type;
-import com.ning.billing.overdue.OverdueChangeEvent;
+import com.ning.billing.util.events.OverdueChangeInternalEvent;
 
-public class DefaultOverdueChangeEvent implements OverdueChangeEvent {
+public class DefaultOverdueChangeEvent implements OverdueChangeInternalEvent {
     private final UUID overdueObjectId;
     private final Blockable.Type overdueObjectType;
     private final String previousOverdueStateName;
diff --git a/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java b/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java
index cbf7adc..e5a6745 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java
@@ -40,7 +40,6 @@ import com.ning.billing.junction.api.BlockingApiException;
 import com.ning.billing.ovedue.notification.OverdueCheckPoster;
 import com.ning.billing.overdue.OverdueApiException;
 import com.ning.billing.overdue.OverdueCancellationPolicicy;
-import com.ning.billing.overdue.OverdueChangeEvent;
 import com.ning.billing.overdue.OverdueService;
 import com.ning.billing.overdue.OverdueState;
 import com.ning.billing.overdue.config.api.BillingState;
@@ -52,6 +51,7 @@ import com.ning.billing.util.email.DefaultEmailSender;
 import com.ning.billing.util.email.EmailApiException;
 import com.ning.billing.util.email.EmailConfig;
 import com.ning.billing.util.email.EmailSender;
+import com.ning.billing.util.events.OverdueChangeInternalEvent;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
 import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
 import com.ning.billing.util.svcapi.junction.BlockingInternalApi;
@@ -135,7 +135,7 @@ public class OverdueStateApplicator<T extends Blockable> {
         }
     }
 
-    private OverdueChangeEvent createOverdueEvent(final T overdueable, final String previousOverdueStateName, final String nextOverdueStateName) throws BlockingApiException {
+    private OverdueChangeInternalEvent createOverdueEvent(final T overdueable, final String previousOverdueStateName, final String nextOverdueStateName) throws BlockingApiException {
         return new DefaultOverdueChangeEvent(overdueable.getId(), Blockable.Type.get(overdueable), previousOverdueStateName, nextOverdueStateName, null);
     }
 
diff --git a/overdue/src/main/java/com/ning/billing/overdue/listener/OverdueListener.java b/overdue/src/main/java/com/ning/billing/overdue/listener/OverdueListener.java
index 5cd0f54..3e2b8d5 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/listener/OverdueListener.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/listener/OverdueListener.java
@@ -23,15 +23,15 @@ import javax.annotation.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.ning.billing.invoice.api.InvoiceAdjustmentEvent;
 import com.ning.billing.ovedue.notification.OverdueCheckNotificationKey;
-import com.ning.billing.payment.api.PaymentErrorEvent;
-import com.ning.billing.payment.api.PaymentInfoEvent;
-import com.ning.billing.util.bus.BusEvent;
 import com.ning.billing.util.callcontext.CallOrigin;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.callcontext.UserType;
+import com.ning.billing.util.events.BusInternalEvent;
+import com.ning.billing.util.events.InvoiceAdjustmentInternalEvent;
+import com.ning.billing.util.events.PaymentErrorInternalEvent;
+import com.ning.billing.util.events.PaymentInfoInternalEvent;
 
 import com.google.common.eventbus.Subscribe;
 import com.google.inject.Inject;
@@ -51,20 +51,20 @@ public class OverdueListener {
     }
 
     @Subscribe
-    public void handlePaymentInfoEvent(final PaymentInfoEvent event) {
+    public void handlePaymentInfoEvent(final PaymentInfoInternalEvent event) {
         log.info(String.format("Received PaymentInfo event %s", event.toString()));
         dispatcher.processOverdueForAccount(event.getAccountId(), createCallContext(event));
     }
 
     @Subscribe
-    public void handlePaymentErrorEvent(final PaymentErrorEvent event) {
+    public void handlePaymentErrorEvent(final PaymentErrorInternalEvent event) {
         log.info(String.format("Received PaymentError event %s", event.toString()));
         final UUID accountId = event.getAccountId();
         dispatcher.processOverdueForAccount(accountId, createCallContext(event));
     }
 
     @Subscribe
-    public void handleInvoiceAdjustmentEvent(final InvoiceAdjustmentEvent event) {
+    public void handleInvoiceAdjustmentEvent(final InvoiceAdjustmentInternalEvent event) {
         log.info(String.format("Received InvoiceAdjustment event %s", event.toString()));
         final UUID accountId = event.getAccountId();
         dispatcher.processOverdueForAccount(accountId, createCallContext(event));
@@ -76,7 +76,7 @@ public class OverdueListener {
         dispatcher.processOverdue(notificationKey.getType(), notificationKey.getUuidKey(), createCallContext(null));
     }
 
-    private InternalCallContext createCallContext(@Nullable final BusEvent event) {
+    private InternalCallContext createCallContext(@Nullable final BusInternalEvent event) {
         return internalCallContextFactory.createInternalCallContext("OverdueService", CallOrigin.INTERNAL, UserType.SYSTEM,
                                                                     event == null ? null : event.getUserToken());
     }
diff --git a/overdue/src/test/java/com/ning/billing/overdue/applicator/OverdueBusListenerTester.java b/overdue/src/test/java/com/ning/billing/overdue/applicator/OverdueBusListenerTester.java
index ee5e833..692eadd 100644
--- a/overdue/src/test/java/com/ning/billing/overdue/applicator/OverdueBusListenerTester.java
+++ b/overdue/src/test/java/com/ning/billing/overdue/applicator/OverdueBusListenerTester.java
@@ -23,20 +23,21 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.eventbus.Subscribe;
-import com.ning.billing.overdue.OverdueChangeEvent;
+
+import com.ning.billing.util.events.OverdueChangeInternalEvent;
 
 public class OverdueBusListenerTester {
     public static final Logger log = LoggerFactory.getLogger(OverdueBusListenerTester.class);
     
-    private List<OverdueChangeEvent> eventsReceived = new ArrayList<OverdueChangeEvent>();
+    private List<OverdueChangeInternalEvent> eventsReceived = new ArrayList<OverdueChangeInternalEvent>();
     
     @Subscribe
-    public void handleOverdueChange(final OverdueChangeEvent changeEvent) {
+    public void handleOverdueChange(final OverdueChangeInternalEvent changeEvent) {
         log.info("Received subscription transition.");
         eventsReceived.add(changeEvent);
     }
     
-    public List<OverdueChangeEvent> getEventsReceived() {
+    public List<OverdueChangeInternalEvent> getEventsReceived() {
         return eventsReceived;
     }
     
diff --git a/overdue/src/test/java/com/ning/billing/overdue/applicator/TestOverdueStateApplicator.java b/overdue/src/test/java/com/ning/billing/overdue/applicator/TestOverdueStateApplicator.java
index abd5869..c6adba9 100644
--- a/overdue/src/test/java/com/ning/billing/overdue/applicator/TestOverdueStateApplicator.java
+++ b/overdue/src/test/java/com/ning/billing/overdue/applicator/TestOverdueStateApplicator.java
@@ -30,12 +30,12 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
-import com.ning.billing.overdue.OverdueChangeEvent;
 import com.ning.billing.overdue.OverdueState;
 import com.ning.billing.overdue.OverdueTestBase;
 import com.ning.billing.overdue.config.OverdueConfig;
 import com.ning.billing.util.svcsapi.bus.Bus;
 import com.ning.billing.util.config.XMLLoader;
+import com.ning.billing.util.events.OverdueChangeInternalEvent;
 import com.ning.billing.util.svcapi.junction.DefaultBlockingState;
 
 import com.google.inject.Inject;
@@ -85,11 +85,11 @@ public class TestOverdueStateApplicator extends OverdueTestBase {
         await().atMost(10, SECONDS).until(new Callable<Boolean>() {
             @Override
             public Boolean call() throws Exception {
-                final List<OverdueChangeEvent> events = listener.getEventsReceived();
+                final List<OverdueChangeInternalEvent> events = listener.getEventsReceived();
                 return events.size() == 1;
             }
         });
-        final List<OverdueChangeEvent> events = listener.getEventsReceived();
+        final List<OverdueChangeInternalEvent> events = listener.getEventsReceived();
         Assert.assertEquals(1, events.size());
         Assert.assertEquals(state, events.get(0).getNextOverdueStateName());
         listener.clearEventsReceived();
diff --git a/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentErrorEvent.java b/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentErrorEvent.java
index 1fe7ff4..a8d7baf 100644
--- a/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentErrorEvent.java
+++ b/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentErrorEvent.java
@@ -23,9 +23,10 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import com.ning.billing.util.entity.EntityBase;
+import com.ning.billing.util.events.PaymentErrorInternalEvent;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "error")
-public class DefaultPaymentErrorEvent extends EntityBase implements PaymentErrorEvent {
+public class DefaultPaymentErrorEvent extends EntityBase implements PaymentErrorInternalEvent {
 
     private final String message;
     private final UUID accountId;
diff --git a/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentInfoEvent.java b/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentInfoEvent.java
index d884734..a64a63c 100644
--- a/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentInfoEvent.java
+++ b/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentInfoEvent.java
@@ -25,8 +25,9 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.ning.billing.util.entity.EntityBase;
+import com.ning.billing.util.events.PaymentInfoInternalEvent;
 
-public class DefaultPaymentInfoEvent extends EntityBase implements PaymentInfoEvent {
+public class DefaultPaymentInfoEvent extends EntityBase implements PaymentInfoInternalEvent {
 
     private final UUID accountId;
     private final UUID invoiceId;
diff --git a/payment/src/main/java/com/ning/billing/payment/bus/InvoiceHandler.java b/payment/src/main/java/com/ning/billing/payment/bus/InvoiceHandler.java
index c1499c6..e2a67e2 100644
--- a/payment/src/main/java/com/ning/billing/payment/bus/InvoiceHandler.java
+++ b/payment/src/main/java/com/ning/billing/payment/bus/InvoiceHandler.java
@@ -22,7 +22,6 @@ import org.slf4j.LoggerFactory;
 import com.ning.billing.ErrorCode;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
-import com.ning.billing.invoice.api.InvoiceCreationEvent;
 import com.ning.billing.payment.api.PaymentApiException;
 import com.ning.billing.payment.core.PaymentProcessor;
 import com.ning.billing.util.callcontext.CallContext;
@@ -32,6 +31,7 @@ import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.callcontext.UserType;
 import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.events.InvoiceCreationInternalEvent;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
 
 import com.google.common.eventbus.Subscribe;
@@ -58,7 +58,7 @@ public class InvoiceHandler {
     }
 
     @Subscribe
-    public void processInvoiceEvent(final InvoiceCreationEvent event) {
+    public void processInvoiceEvent(final InvoiceCreationInternalEvent event) {
 
         log.info("Received invoice creation notification for account {} and invoice {}",
                  event.getAccountId(), event.getInvoiceId());
diff --git a/payment/src/main/java/com/ning/billing/payment/bus/TagHandler.java b/payment/src/main/java/com/ning/billing/payment/bus/TagHandler.java
index d74444c..673797c 100644
--- a/payment/src/main/java/com/ning/billing/payment/bus/TagHandler.java
+++ b/payment/src/main/java/com/ning/billing/payment/bus/TagHandler.java
@@ -33,9 +33,9 @@ import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.callcontext.UserType;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.events.ControlTagDeletionInternalEvent;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
 import com.ning.billing.util.tag.ControlTagType;
-import com.ning.billing.util.tag.api.ControlTagDeletionEvent;
 
 import com.google.common.eventbus.Subscribe;
 import com.google.inject.Inject;
@@ -61,7 +61,7 @@ public class TagHandler {
     }
 
     @Subscribe
-    public void process_AUTO_PAY_OFF_removal(final ControlTagDeletionEvent event) {
+    public void process_AUTO_PAY_OFF_removal(final ControlTagDeletionInternalEvent event) {
         if (event.getTagDefinition().getName().equals(ControlTagType.AUTO_PAY_OFF.toString()) && event.getObjectType() == ObjectType.ACCOUNT) {
             final UUID accountId = event.getObjectId();
             processUnpaid_AUTO_PAY_OFF_payments(accountId, event.getUserToken());
diff --git a/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java b/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
index bb5e678..414afe8 100644
--- a/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
@@ -45,7 +45,6 @@ import com.ning.billing.payment.api.DefaultPaymentErrorEvent;
 import com.ning.billing.payment.api.DefaultPaymentInfoEvent;
 import com.ning.billing.payment.api.Payment;
 import com.ning.billing.payment.api.PaymentApiException;
-import com.ning.billing.payment.api.PaymentErrorEvent;
 import com.ning.billing.payment.api.PaymentStatus;
 import com.ning.billing.payment.dao.PaymentAttemptModelDao;
 import com.ning.billing.payment.dao.PaymentDao;
@@ -59,10 +58,11 @@ import com.ning.billing.payment.provider.PaymentProviderPluginRegistry;
 import com.ning.billing.payment.retry.AutoPayRetryService.AutoPayRetryServiceScheduler;
 import com.ning.billing.payment.retry.FailedPaymentRetryService.FailedPaymentRetryServiceScheduler;
 import com.ning.billing.payment.retry.PluginFailureRetryService.PluginFailureRetryServiceScheduler;
-import com.ning.billing.util.bus.BusEvent;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.events.BusInternalEvent;
+import com.ning.billing.util.events.PaymentErrorInternalEvent;
 import com.ning.billing.util.globallocker.GlobalLocker;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
 import com.ning.billing.util.svcapi.tag.TagInternalApi;
@@ -212,7 +212,7 @@ public class PaymentProcessor extends ProcessorBase {
             // This event will be caught by overdue to refresh the overdue state, if needed.
             // Note that at this point, we don't know the exact invoice balance (see getAndValidatePaymentAmount() below).
             // This means that events will be posted for null and zero dollar invoices (e.g. trials).
-            final PaymentErrorEvent event = new DefaultPaymentErrorEvent(account.getId(), invoiceId, null,
+            final PaymentErrorInternalEvent event = new DefaultPaymentErrorEvent(account.getId(), invoiceId, null,
                                                                          ErrorCode.PAYMENT_NO_DEFAULT_PAYMENT_METHOD.toString(), context.getUserToken());
             postPaymentEvent(event, account.getId(), context);
             throw e;
@@ -418,7 +418,7 @@ public class PaymentProcessor extends ProcessorBase {
         }
 
         PaymentModelDao payment = null;
-        BusEvent event = null;
+        BusInternalEvent event = null;
         PaymentStatus paymentStatus;
         try {
 
diff --git a/payment/src/main/java/com/ning/billing/payment/core/ProcessorBase.java b/payment/src/main/java/com/ning/billing/payment/core/ProcessorBase.java
index d04c1bc..97fa98c 100644
--- a/payment/src/main/java/com/ning/billing/payment/core/ProcessorBase.java
+++ b/payment/src/main/java/com/ning/billing/payment/core/ProcessorBase.java
@@ -33,10 +33,10 @@ import com.ning.billing.payment.dao.PaymentMethodModelDao;
 import com.ning.billing.payment.plugin.api.PaymentPluginApi;
 import com.ning.billing.payment.provider.PaymentProviderPluginRegistry;
 import com.ning.billing.util.api.TagApiException;
-import com.ning.billing.util.bus.BusEvent;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.events.BusInternalEvent;
 import com.ning.billing.util.globallocker.GlobalLock;
 import com.ning.billing.util.globallocker.GlobalLocker;
 import com.ning.billing.util.globallocker.GlobalLocker.LockerType;
@@ -125,7 +125,7 @@ public abstract class ProcessorBase {
         return getPaymentProviderPlugin(paymentMethodId, context);
     }
 
-    protected void postPaymentEvent(final BusEvent ev, final UUID accountId, final InternalCallContext context) {
+    protected void postPaymentEvent(final BusInternalEvent ev, final UUID accountId, final InternalCallContext context) {
         if (ev == null) {
             return;
         }
diff --git a/payment/src/test/java/com/ning/billing/payment/api/TestEventJson.java b/payment/src/test/java/com/ning/billing/payment/api/TestEventJson.java
index eb7d76b..997c6dd 100644
--- a/payment/src/test/java/com/ning/billing/payment/api/TestEventJson.java
+++ b/payment/src/test/java/com/ning/billing/payment/api/TestEventJson.java
@@ -24,6 +24,8 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import com.ning.billing.payment.PaymentTestSuite;
+import com.ning.billing.util.events.PaymentErrorInternalEvent;
+import com.ning.billing.util.events.PaymentInfoInternalEvent;
 import com.ning.billing.util.jackson.ObjectMapper;
 
 public class TestEventJson extends PaymentTestSuite {
@@ -31,7 +33,7 @@ public class TestEventJson extends PaymentTestSuite {
 
     @Test(groups = "fast")
     public void testPaymentErrorEvent() throws Exception {
-        final PaymentErrorEvent e = new DefaultPaymentErrorEvent(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), "no message", UUID.randomUUID());
+        final PaymentErrorInternalEvent e = new DefaultPaymentErrorEvent(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), "no message", UUID.randomUUID());
         final String json = mapper.writeValueAsString(e);
 
         final Class<?> claz = Class.forName(DefaultPaymentErrorEvent.class.getName());
@@ -41,7 +43,7 @@ public class TestEventJson extends PaymentTestSuite {
 
     @Test(groups = "fast")
     public void testPaymentInfoEvent() throws Exception {
-        final PaymentInfoEvent e = new DefaultPaymentInfoEvent(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), new BigDecimal(12.9), new Integer(13), PaymentStatus.SUCCESS, "ext-ref1-12345", "ext-ref2-12345", UUID.randomUUID(), new DateTime());
+        final PaymentInfoInternalEvent e = new DefaultPaymentInfoEvent(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), new BigDecimal(12.9), new Integer(13), PaymentStatus.SUCCESS, "ext-ref1-12345", "ext-ref2-12345", UUID.randomUUID(), new DateTime());
         final String json = mapper.writeValueAsString(e);
 
         final Class<?> clazz = Class.forName(DefaultPaymentInfoEvent.class.getName());
diff --git a/payment/src/test/java/com/ning/billing/payment/MockInvoiceCreationEvent.java b/payment/src/test/java/com/ning/billing/payment/MockInvoiceCreationEvent.java
index 80a60d1..ec9e7e3 100644
--- a/payment/src/test/java/com/ning/billing/payment/MockInvoiceCreationEvent.java
+++ b/payment/src/test/java/com/ning/billing/payment/MockInvoiceCreationEvent.java
@@ -25,9 +25,9 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.invoice.api.InvoiceCreationEvent;
+import com.ning.billing.util.events.InvoiceCreationInternalEvent;
 
-public class MockInvoiceCreationEvent implements InvoiceCreationEvent {
+public class MockInvoiceCreationEvent implements InvoiceCreationInternalEvent {
 
     private final UUID invoiceId;
     private final UUID accountId;
diff --git a/payment/src/test/java/com/ning/billing/payment/TestHelper.java b/payment/src/test/java/com/ning/billing/payment/TestHelper.java
index f01fbeb..bcdc7ac 100644
--- a/payment/src/test/java/com/ning/billing/payment/TestHelper.java
+++ b/payment/src/test/java/com/ning/billing/payment/TestHelper.java
@@ -25,7 +25,6 @@ import com.ning.billing.account.api.Account;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
-import com.ning.billing.invoice.api.InvoiceCreationEvent;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoicePaymentApi;
 import com.ning.billing.mock.api.MockBillCycleDay;
@@ -41,6 +40,7 @@ import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.callcontext.TenantContext;
 import com.ning.billing.util.callcontext.UserType;
 import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.events.InvoiceCreationInternalEvent;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
 import com.ning.billing.util.svcsapi.bus.Bus;
 import com.ning.billing.util.svcsapi.bus.Bus.EventBusException;
@@ -93,7 +93,7 @@ public class TestHelper {
         }
 
         Mockito.when(invoicePaymentApi.getInvoice(Mockito.eq(invoice.getId()), Mockito.<TenantContext>any())).thenReturn(invoice);
-        final InvoiceCreationEvent event = new MockInvoiceCreationEvent(invoice.getId(), invoice.getAccountId(),
+        final InvoiceCreationInternalEvent event = new MockInvoiceCreationEvent(invoice.getId(), invoice.getAccountId(),
                                                                         invoice.getBalance(), invoice.getCurrency(),
                                                                         invoice.getInvoiceDate(),
                                                                         context.getUserToken());
diff --git a/util/src/main/java/com/ning/billing/util/bus/InMemoryBus.java b/util/src/main/java/com/ning/billing/util/bus/InMemoryBus.java
index e7d969d..08cb2e6 100644
--- a/util/src/main/java/com/ning/billing/util/bus/InMemoryBus.java
+++ b/util/src/main/java/com/ning/billing/util/bus/InMemoryBus.java
@@ -26,6 +26,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.ning.billing.util.callcontext.InternalCallContext;
+import com.ning.billing.util.events.BusInternalEvent;
 import com.ning.billing.util.svcsapi.bus.Bus;
 
 import com.google.common.eventbus.AsyncEventBus;
@@ -90,13 +91,13 @@ public class InMemoryBus implements Bus {
     }
 
     @Override
-    public void post(final BusEvent event, final InternalCallContext context) throws EventBusException {
+    public void post(final BusInternalEvent event, final InternalCallContext context) throws EventBusException {
         checkInitialized("post");
         delegate.post(event);
     }
 
     @Override
-    public void postFromTransaction(final BusEvent event, final Transmogrifier dao, final InternalCallContext context) throws EventBusException {
+    public void postFromTransaction(final BusInternalEvent event, final Transmogrifier dao, final InternalCallContext context) throws EventBusException {
         checkInitialized("postFromTransaction");
         delegate.post(event);
     }
diff --git a/util/src/main/java/com/ning/billing/util/bus/PersistentBus.java b/util/src/main/java/com/ning/billing/util/bus/PersistentBus.java
index f3e4519..44b0110 100644
--- a/util/src/main/java/com/ning/billing/util/bus/PersistentBus.java
+++ b/util/src/main/java/com/ning/billing/util/bus/PersistentBus.java
@@ -37,6 +37,7 @@ import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.callcontext.UserType;
 import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.events.BusInternalEvent;
 import com.ning.billing.util.queue.PersistentQueueBase;
 import com.ning.billing.util.svcsapi.bus.Bus;
 
@@ -117,7 +118,7 @@ public class PersistentBus extends PersistentQueueBase implements Bus {
 
         int result = 0;
         for (final BusEventEntry cur : events) {
-            final BusEvent evt = deserializeEvent(cur.getBusEventClass(), cur.getBusEventJson());
+            final BusInternalEvent evt = deserializeEvent(cur.getBusEventClass(), cur.getBusEventJson());
             result++;
             // STEPH exception handling is done by GUAVA-- logged a bug Issue-780
             eventBusDelegate.post(evt);
@@ -156,7 +157,7 @@ public class PersistentBus extends PersistentQueueBase implements Bus {
     }
 
     @Override
-    public void post(final BusEvent event, final InternalCallContext context) throws EventBusException {
+    public void post(final BusInternalEvent event, final InternalCallContext context) throws EventBusException {
         dao.inTransaction(new Transaction<Void, PersistentBusSqlDao>() {
             @Override
             public Void inTransaction(final PersistentBusSqlDao transactional,
@@ -168,13 +169,13 @@ public class PersistentBus extends PersistentQueueBase implements Bus {
     }
 
     @Override
-    public void postFromTransaction(final BusEvent event, final Transmogrifier transmogrifier, final InternalCallContext context)
+    public void postFromTransaction(final BusInternalEvent event, final Transmogrifier transmogrifier, final InternalCallContext context)
             throws EventBusException {
         final PersistentBusSqlDao transactional = transmogrifier.become(PersistentBusSqlDao.class);
         postFromTransaction(event, context, transactional);
     }
 
-    private void postFromTransaction(final BusEvent event, final InternalCallContext context, final PersistentBusSqlDao transactional) {
+    private void postFromTransaction(final BusInternalEvent event, final InternalCallContext context, final PersistentBusSqlDao transactional) {
         try {
             final String json = objectMapper.writeValueAsString(event);
             final BusEventEntry entry = new BusEventEntry(hostname, event.getClass().getName(), json, context.getAccountRecordId(), context.getTenantRecordId());
diff --git a/util/src/main/java/com/ning/billing/util/glue/TagStoreModule.java b/util/src/main/java/com/ning/billing/util/glue/TagStoreModule.java
index 36ac902..e2b974b 100644
--- a/util/src/main/java/com/ning/billing/util/glue/TagStoreModule.java
+++ b/util/src/main/java/com/ning/billing/util/glue/TagStoreModule.java
@@ -17,9 +17,9 @@
 package com.ning.billing.util.glue;
 
 import com.ning.billing.util.api.TagUserApi;
+import com.ning.billing.util.svcapi.tag.DefaultTagInternalApi;
 import com.ning.billing.util.svcapi.tag.TagInternalApi;
 import com.ning.billing.util.tag.api.DefaultTagUserApi;
-import com.ning.billing.util.tag.api.svcs.DefaultTagInternalApi;
 import com.ning.billing.util.tag.dao.AuditedTagDao;
 import com.ning.billing.util.tag.dao.DefaultTagDefinitionDao;
 import com.ning.billing.util.tag.dao.TagDao;
diff --git a/util/src/main/java/com/ning/billing/util/svcapi/entitlement/EntitlementInternalApi.java b/util/src/main/java/com/ning/billing/util/svcapi/entitlement/EntitlementInternalApi.java
index 3e6d723..c2f62b4 100644
--- a/util/src/main/java/com/ning/billing/util/svcapi/entitlement/EntitlementInternalApi.java
+++ b/util/src/main/java/com/ning/billing/util/svcapi/entitlement/EntitlementInternalApi.java
@@ -25,21 +25,26 @@ import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 
 
 public interface EntitlementInternalApi {
 
-    public List<SubscriptionBundle> getBundlesForAccount(UUID accountId, InternalTenantContext context);
+    public List<SubscriptionBundle> getBundlesForAccount(final UUID accountId, final InternalTenantContext context);
 
-    public List<Subscription> getSubscriptionsForBundle(UUID bundleId, InternalTenantContext context);
+    public List<Subscription> getSubscriptionsForBundle(final UUID bundleId, final InternalTenantContext context);
 
-    public Subscription getBaseSubscription(UUID bundleId, InternalTenantContext context) throws EntitlementUserApiException;
+    public Subscription getBaseSubscription(final UUID bundleId, final InternalTenantContext context) throws EntitlementUserApiException;
 
-    public Subscription getSubscriptionFromId(UUID id, InternalTenantContext context) throws EntitlementUserApiException;
+    public Subscription getSubscriptionFromId(final UUID id, final InternalTenantContext context) throws EntitlementUserApiException;
 
-    public SubscriptionBundle getBundleFromId(UUID id, InternalTenantContext context) throws EntitlementUserApiException;
+    public SubscriptionBundle getBundleFromId(final UUID id, final InternalTenantContext context) throws EntitlementUserApiException;
 
-    public UUID getAccountIdFromSubscriptionId(UUID subscriptionId, InternalTenantContext context) throws EntitlementUserApiException;
+    public UUID getAccountIdFromSubscriptionId(final UUID subscriptionId, final InternalTenantContext context) throws EntitlementUserApiException;
 
-    public void setChargedThroughDate(UUID subscriptionId, LocalDate localChargedThruDate, InternalCallContext context);
+    public void setChargedThroughDate(final UUID subscriptionId, final LocalDate localChargedThruDate, final InternalCallContext context);
+
+    public List<EffectiveSubscriptionInternalEvent> getAllTransitions(final Subscription subscription);
+
+    public List<EffectiveSubscriptionInternalEvent> getBillingTransitions(final Subscription subscription);
 }
diff --git a/util/src/main/java/com/ning/billing/util/svcsapi/bus/Bus.java b/util/src/main/java/com/ning/billing/util/svcsapi/bus/Bus.java
index adf3d01..25ff12e 100644
--- a/util/src/main/java/com/ning/billing/util/svcsapi/bus/Bus.java
+++ b/util/src/main/java/com/ning/billing/util/svcsapi/bus/Bus.java
@@ -18,8 +18,8 @@ package com.ning.billing.util.svcsapi.bus;
 
 import org.skife.jdbi.v2.sqlobject.mixins.Transmogrifier;
 
-import com.ning.billing.util.bus.BusEvent;
 import com.ning.billing.util.callcontext.InternalCallContext;
+import com.ning.billing.util.events.BusInternalEvent;
 
 import com.google.common.eventbus.Subscribe;
 
@@ -84,7 +84,7 @@ public interface Bus {
      * @param context call context. account record id and tenant id are expected to be populated
      * @throws EventBusException if bus not been started yet
      */
-    public void post(BusEvent event, InternalCallContext context) throws EventBusException;
+    public void post(BusInternalEvent event, InternalCallContext context) throws EventBusException;
 
     /**
      * Post an event from within a transaction.
@@ -95,5 +95,5 @@ public interface Bus {
      * @param context call context. account record id and tenant id are expected to be populated
      * @throws EventBusException if bus not been started yet
      */
-    public void postFromTransaction(BusEvent event, Transmogrifier dao, InternalCallContext context) throws EventBusException;
+    public void postFromTransaction(BusInternalEvent event, Transmogrifier dao, InternalCallContext context) throws EventBusException;
 }
diff --git a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagCreationEvent.java b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagCreationEvent.java
index cfa8f30..5b5e12d 100644
--- a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagCreationEvent.java
+++ b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagCreationEvent.java
@@ -19,14 +19,14 @@ package com.ning.billing.util.tag.api.user;
 import java.util.UUID;
 
 import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.events.ControlTagCreationInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
-import com.ning.billing.util.tag.api.ControlTagCreationEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultControlTagCreationEvent implements ControlTagCreationEvent {
+public class DefaultControlTagCreationEvent implements ControlTagCreationInternalEvent {
     private final UUID tagId;
     private final UUID objectId;
     private final ObjectType objectType;
diff --git a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagDefinitionCreationEvent.java b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagDefinitionCreationEvent.java
index a7987e9..125fbc0 100644
--- a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagDefinitionCreationEvent.java
+++ b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagDefinitionCreationEvent.java
@@ -18,14 +18,14 @@ package com.ning.billing.util.tag.api.user;
 
 import java.util.UUID;
 
+import com.ning.billing.util.events.ControlTagDefinitionCreationInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
-import com.ning.billing.util.tag.api.ControlTagDefinitionCreationEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultControlTagDefinitionCreationEvent implements ControlTagDefinitionCreationEvent {
+public class DefaultControlTagDefinitionCreationEvent implements ControlTagDefinitionCreationInternalEvent {
     private final UUID tagDefinitionId;
     private final TagDefinition tagDefinition;
     private final UUID userToken;
diff --git a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagDefinitionDeletionEvent.java b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagDefinitionDeletionEvent.java
index 9225dda..4c97168 100644
--- a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagDefinitionDeletionEvent.java
+++ b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagDefinitionDeletionEvent.java
@@ -18,14 +18,14 @@ package com.ning.billing.util.tag.api.user;
 
 import java.util.UUID;
 
+import com.ning.billing.util.events.ControlTagDefinitionDeletionInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
-import com.ning.billing.util.tag.api.ControlTagDefinitionDeletionEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultControlTagDefinitionDeletionEvent implements ControlTagDefinitionDeletionEvent {
+public class DefaultControlTagDefinitionDeletionEvent implements ControlTagDefinitionDeletionInternalEvent {
     private final UUID tagDefinitionId;
     private final TagDefinition tagDefinition;
     private final UUID userToken;
diff --git a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagDeletionEvent.java b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagDeletionEvent.java
index 93114b9..497540f 100644
--- a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagDeletionEvent.java
+++ b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagDeletionEvent.java
@@ -19,14 +19,14 @@ package com.ning.billing.util.tag.api.user;
 import java.util.UUID;
 
 import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.events.ControlTagDeletionInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
-import com.ning.billing.util.tag.api.ControlTagDeletionEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultControlTagDeletionEvent implements ControlTagDeletionEvent {
+public class DefaultControlTagDeletionEvent implements ControlTagDeletionInternalEvent {
     private final UUID tagId;
     final UUID objectId;
     final ObjectType objectType;
diff --git a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagCreationEvent.java b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagCreationEvent.java
index 8997f3e..98a0a12 100644
--- a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagCreationEvent.java
+++ b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagCreationEvent.java
@@ -19,14 +19,14 @@ package com.ning.billing.util.tag.api.user;
 import java.util.UUID;
 
 import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.events.UserTagCreationInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
-import com.ning.billing.util.tag.api.UserTagCreationEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultUserTagCreationEvent implements UserTagCreationEvent {
+public class DefaultUserTagCreationEvent implements UserTagCreationInternalEvent {
     private final UUID tagId;
     private final UUID objectId;
     private final ObjectType objectType;
diff --git a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDefinitionCreationEvent.java b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDefinitionCreationEvent.java
index bf76b7b..ec5ea04 100644
--- a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDefinitionCreationEvent.java
+++ b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDefinitionCreationEvent.java
@@ -18,14 +18,14 @@ package com.ning.billing.util.tag.api.user;
 
 import java.util.UUID;
 
+import com.ning.billing.util.events.UserTagDefinitionCreationInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
-import com.ning.billing.util.tag.api.UserTagDefinitionCreationEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultUserTagDefinitionCreationEvent implements UserTagDefinitionCreationEvent {
+public class DefaultUserTagDefinitionCreationEvent implements UserTagDefinitionCreationInternalEvent {
     private final UUID tagDefinitionId;
     private final TagDefinition tagDefinition;
     private final UUID userToken;
diff --git a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDefinitionDeletionEvent.java b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDefinitionDeletionEvent.java
index 6c50c6c..35788b3 100644
--- a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDefinitionDeletionEvent.java
+++ b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDefinitionDeletionEvent.java
@@ -18,14 +18,14 @@ package com.ning.billing.util.tag.api.user;
 
 import java.util.UUID;
 
+import com.ning.billing.util.events.UserTagDefinitionDeletionInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
-import com.ning.billing.util.tag.api.UserTagDefinitionDeletionEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultUserTagDefinitionDeletionEvent implements UserTagDefinitionDeletionEvent {
+public class DefaultUserTagDefinitionDeletionEvent implements UserTagDefinitionDeletionInternalEvent {
     private final UUID tagDefinitionId;
     private final TagDefinition tagDefinition;
     private final UUID userToken;
diff --git a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDeletionEvent.java b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDeletionEvent.java
index 92678ae..e7d4750 100644
--- a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDeletionEvent.java
+++ b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDeletionEvent.java
@@ -19,14 +19,14 @@ package com.ning.billing.util.tag.api.user;
 import java.util.UUID;
 
 import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.events.UserTagDeletionInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
-import com.ning.billing.util.tag.api.UserTagDeletionEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultUserTagDeletionEvent implements UserTagDeletionEvent {
+public class DefaultUserTagDeletionEvent implements UserTagDeletionInternalEvent {
     private final UUID tagId;
     private final UUID objectId;
     private final ObjectType objectType;
diff --git a/util/src/main/java/com/ning/billing/util/tag/api/user/TagEventBuilder.java b/util/src/main/java/com/ning/billing/util/tag/api/user/TagEventBuilder.java
index 9160731..569ac72 100644
--- a/util/src/main/java/com/ning/billing/util/tag/api/user/TagEventBuilder.java
+++ b/util/src/main/java/com/ning/billing/util/tag/api/user/TagEventBuilder.java
@@ -19,46 +19,46 @@ package com.ning.billing.util.tag.api.user;
 import java.util.UUID;
 
 import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.events.ControlTagCreationInternalEvent;
+import com.ning.billing.util.events.ControlTagDefinitionCreationInternalEvent;
+import com.ning.billing.util.events.ControlTagDefinitionDeletionInternalEvent;
+import com.ning.billing.util.events.ControlTagDeletionInternalEvent;
+import com.ning.billing.util.events.UserTagCreationInternalEvent;
+import com.ning.billing.util.events.UserTagDefinitionCreationInternalEvent;
+import com.ning.billing.util.events.UserTagDefinitionDeletionInternalEvent;
+import com.ning.billing.util.events.UserTagDeletionInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
-import com.ning.billing.util.tag.api.ControlTagCreationEvent;
-import com.ning.billing.util.tag.api.ControlTagDefinitionCreationEvent;
-import com.ning.billing.util.tag.api.ControlTagDefinitionDeletionEvent;
-import com.ning.billing.util.tag.api.ControlTagDeletionEvent;
-import com.ning.billing.util.tag.api.UserTagCreationEvent;
-import com.ning.billing.util.tag.api.UserTagDefinitionCreationEvent;
-import com.ning.billing.util.tag.api.UserTagDefinitionDeletionEvent;
-import com.ning.billing.util.tag.api.UserTagDeletionEvent;
 
 public class TagEventBuilder {
-    public UserTagDefinitionCreationEvent newUserTagDefinitionCreationEvent(final UUID tagDefinitionId, final TagDefinition tagDefinition, final UUID userToken) {
+    public UserTagDefinitionCreationInternalEvent newUserTagDefinitionCreationEvent(final UUID tagDefinitionId, final TagDefinition tagDefinition, final UUID userToken) {
         return new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
     }
 
-    public UserTagDefinitionDeletionEvent newUserTagDefinitionDeletionEvent(final UUID tagDefinitionId, final TagDefinition tagDefinition, final UUID userToken) {
+    public UserTagDefinitionDeletionInternalEvent newUserTagDefinitionDeletionEvent(final UUID tagDefinitionId, final TagDefinition tagDefinition, final UUID userToken) {
         return new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
     }
 
-    public ControlTagDefinitionCreationEvent newControlTagDefinitionCreationEvent(final UUID tagDefinitionId, final TagDefinition tagDefinition, final UUID userToken) {
+    public ControlTagDefinitionCreationInternalEvent newControlTagDefinitionCreationEvent(final UUID tagDefinitionId, final TagDefinition tagDefinition, final UUID userToken) {
         return new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
     }
 
-    public ControlTagDefinitionDeletionEvent newControlTagDefinitionDeletionEvent(final UUID tagDefinitionId, final TagDefinition tagDefinition, final UUID userToken) {
+    public ControlTagDefinitionDeletionInternalEvent newControlTagDefinitionDeletionEvent(final UUID tagDefinitionId, final TagDefinition tagDefinition, final UUID userToken) {
         return new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
     }
 
-    public UserTagCreationEvent newUserTagCreationEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final UUID userToken) {
+    public UserTagCreationInternalEvent newUserTagCreationEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final UUID userToken) {
         return new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
     }
 
-    public UserTagDeletionEvent newUserTagDeletionEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final UUID userToken) {
+    public UserTagDeletionInternalEvent newUserTagDeletionEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final UUID userToken) {
         return new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
     }
 
-    public ControlTagCreationEvent newControlTagCreationEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final UUID userToken) {
+    public ControlTagCreationInternalEvent newControlTagCreationEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final UUID userToken) {
         return new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
     }
 
-    public ControlTagDeletionEvent newControlTagDeletionEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final UUID userToken) {
+    public ControlTagDeletionInternalEvent newControlTagDeletionEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final UUID userToken) {
         return new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
     }
 }
diff --git a/util/src/main/java/com/ning/billing/util/tag/dao/AuditedTagDao.java b/util/src/main/java/com/ning/billing/util/tag/dao/AuditedTagDao.java
index 26b13ed..d8e4d0c 100644
--- a/util/src/main/java/com/ning/billing/util/tag/dao/AuditedTagDao.java
+++ b/util/src/main/java/com/ning/billing/util/tag/dao/AuditedTagDao.java
@@ -43,11 +43,11 @@ import com.ning.billing.util.dao.Mapper;
 import com.ning.billing.util.dao.ObjectType;
 import com.ning.billing.util.dao.TableName;
 import com.ning.billing.util.entity.collection.dao.UpdatableEntityCollectionSqlDao;
+import com.ning.billing.util.events.TagInternalEvent;
 import com.ning.billing.util.tag.ControlTagType;
 import com.ning.billing.util.tag.DefaultTagDefinition;
 import com.ning.billing.util.tag.Tag;
 import com.ning.billing.util.tag.TagDefinition;
-import com.ning.billing.util.tag.api.TagEvent;
 import com.ning.billing.util.tag.api.user.TagEventBuilder;
 
 import com.google.inject.Inject;
@@ -123,7 +123,7 @@ public class AuditedTagDao extends AuditedCollectionDaoBase<Tag, Tag> implements
                 tagSqlDao.insertAuditFromTransaction(entityAudits, context);
 
                 // Post an event to the Bus
-                final TagEvent tagEvent;
+                final TagInternalEvent tagEvent;
                 if (tagDefinition.isControlTag()) {
                     tagEvent = tagEventBuilder.newControlTagCreationEvent(tag.getId(), objectId, objectType, tagDefinition, context.getUserToken());
                 } else {
@@ -173,7 +173,7 @@ public class AuditedTagDao extends AuditedCollectionDaoBase<Tag, Tag> implements
                     tagSqlDao.insertAuditFromTransaction(entityAudits, context);
 
                     // Post an event to the Bus
-                    final TagEvent tagEvent;
+                    final TagInternalEvent tagEvent;
                     if (tagDefinition.isControlTag()) {
                         tagEvent = tagEventBuilder.newControlTagDeletionEvent(tag.getId(), objectId, objectType, tagDefinition, context.getUserToken());
                     } else {
diff --git a/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDefinitionDao.java b/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDefinitionDao.java
index 5fe367e..1a66af2 100644
--- a/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDefinitionDao.java
+++ b/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDefinitionDao.java
@@ -33,10 +33,10 @@ import com.ning.billing.util.api.TagDefinitionApiException;
 import com.ning.billing.util.svcsapi.bus.Bus;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
+import com.ning.billing.util.events.TagDefinitionInternalEvent;
 import com.ning.billing.util.tag.ControlTagType;
 import com.ning.billing.util.tag.DefaultTagDefinition;
 import com.ning.billing.util.tag.TagDefinition;
-import com.ning.billing.util.tag.api.TagDefinitionEvent;
 import com.ning.billing.util.tag.api.user.TagEventBuilder;
 
 import com.google.common.base.Function;
@@ -137,7 +137,7 @@ public class DefaultTagDefinitionDao implements TagDefinitionDao {
                     tagDefinitionSqlDao.create(tagDefinition, context);
 
                     // Post an event to the bus
-                    final TagDefinitionEvent tagDefinitionEvent;
+                    final TagDefinitionInternalEvent tagDefinitionEvent;
                     if (tagDefinition.isControlTag()) {
                         tagDefinitionEvent = tagEventBuilder.newControlTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition, context.getUserToken());
                     } else {
@@ -192,7 +192,7 @@ public class DefaultTagDefinitionDao implements TagDefinitionDao {
                     tagDefinitionSqlDao.deleteTagDefinition(definitionId.toString(), context);
 
                     // Post an event to the Bus
-                    final TagDefinitionEvent tagDefinitionEvent;
+                    final TagDefinitionInternalEvent tagDefinitionEvent;
                     if (tagDefinition.isControlTag()) {
                         tagDefinitionEvent = tagEventBuilder.newControlTagDefinitionDeletionEvent(tagDefinition.getId(), tagDefinition, context.getUserToken());
                     } else {
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 276cd81..80cd89b 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
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright 2010-2011 Ning, Inc.
  *
  * Ning licenses this file to you under the Apache License, version 2.0
@@ -20,14 +20,14 @@ import java.util.List;
 import java.util.UUID;
 import java.util.concurrent.TimeoutException;
 
-import com.ning.billing.account.api.AccountChangeEvent;
-import com.ning.billing.account.api.AccountCreationEvent;
-import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
-import com.ning.billing.invoice.api.InvoiceCreationEvent;
-import com.ning.billing.invoice.api.NullInvoiceEvent;
-import com.ning.billing.payment.api.PaymentErrorEvent;
-import com.ning.billing.payment.api.PaymentInfoEvent;
 import com.ning.billing.util.bus.BusEvent;
+import com.ning.billing.util.events.AccountChangeInternalEvent;
+import com.ning.billing.util.events.AccountCreationInternalEvent;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
+import com.ning.billing.util.events.InvoiceCreationInternalEvent;
+import com.ning.billing.util.events.NullInvoiceInternalEvent;
+import com.ning.billing.util.events.PaymentErrorInternalEvent;
+import com.ning.billing.util.events.PaymentInfoInternalEvent;
 
 public abstract class CompletionUserRequestBase implements CompletionUserRequest {
 
@@ -97,25 +97,25 @@ public abstract class CompletionUserRequestBase implements CompletionUserRequest
 
         switch (curEvent.getBusEventType()) {
             case ACCOUNT_CREATE:
-                onAccountCreation((AccountCreationEvent) curEvent);
+                onAccountCreation((AccountCreationInternalEvent) curEvent);
                 break;
             case ACCOUNT_CHANGE:
-                onAccountChange((AccountChangeEvent) curEvent);
+                onAccountChange((AccountChangeInternalEvent) curEvent);
                 break;
             case SUBSCRIPTION_TRANSITION:
-                onSubscriptionTransition((EffectiveSubscriptionEvent) curEvent);
+                onSubscriptionTransition((EffectiveSubscriptionInternalEvent) curEvent);
                 break;
             case INVOICE_EMPTY:
-                onEmptyInvoice((NullInvoiceEvent) curEvent);
+                onEmptyInvoice((NullInvoiceInternalEvent) curEvent);
                 break;
             case INVOICE_CREATION:
-                onInvoiceCreation((InvoiceCreationEvent) curEvent);
+                onInvoiceCreation((InvoiceCreationInternalEvent) curEvent);
                 break;
             case PAYMENT_INFO:
-                onPaymentInfo((PaymentInfoEvent) curEvent);
+                onPaymentInfo((PaymentInfoInternalEvent) curEvent);
                 break;
             case PAYMENT_ERROR:
-                onPaymentError((PaymentErrorEvent) curEvent);
+                onPaymentError((PaymentErrorInternalEvent) curEvent);
                 break;
             default:
                 throw new RuntimeException("Unexpected event type " + curEvent.getBusEventType());
@@ -123,34 +123,34 @@ public abstract class CompletionUserRequestBase implements CompletionUserRequest
     }
 
     /*
-     * 
+     *
      * Default no-op implementation so as to not have to implement all callbacks
      */
     @Override
-    public void onAccountCreation(final AccountCreationEvent curEvent) {
+    public void onAccountCreation(final AccountCreationInternalEvent curEvent) {
     }
 
     @Override
-    public void onAccountChange(final AccountChangeEvent curEvent) {
+    public void onAccountChange(final AccountChangeInternalEvent curEvent) {
     }
 
     @Override
-    public void onSubscriptionTransition(final EffectiveSubscriptionEvent curEventEffective) {
+    public void onSubscriptionTransition(final EffectiveSubscriptionInternalEvent curEventEffective) {
     }
 
     @Override
-    public void onEmptyInvoice(final NullInvoiceEvent curEvent) {
+    public void onEmptyInvoice(final NullInvoiceInternalEvent curEvent) {
     }
 
     @Override
-    public void onInvoiceCreation(final InvoiceCreationEvent curEvent) {
+    public void onInvoiceCreation(final InvoiceCreationInternalEvent curEvent) {
     }
 
     @Override
-    public void onPaymentInfo(final PaymentInfoEvent curEvent) {
+    public void onPaymentInfo(final PaymentInfoInternalEvent curEvent) {
     }
 
     @Override
-    public void onPaymentError(final PaymentErrorEvent curEvent) {
+    public void onPaymentError(final PaymentErrorInternalEvent curEvent) {
     }
 }
diff --git a/util/src/test/java/com/ning/billing/api/TestApiListener.java b/util/src/test/java/com/ning/billing/api/TestApiListener.java
index b752c19..b7d7057 100644
--- a/util/src/test/java/com/ning/billing/api/TestApiListener.java
+++ b/util/src/test/java/com/ning/billing/api/TestApiListener.java
@@ -24,12 +24,12 @@ import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.ning.billing.entitlement.api.timeline.RepairEntitlementEvent;
-import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
-import com.ning.billing.invoice.api.InvoiceAdjustmentEvent;
-import com.ning.billing.invoice.api.InvoiceCreationEvent;
-import com.ning.billing.payment.api.PaymentErrorEvent;
-import com.ning.billing.payment.api.PaymentInfoEvent;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
+import com.ning.billing.util.events.InvoiceAdjustmentInternalEvent;
+import com.ning.billing.util.events.InvoiceCreationInternalEvent;
+import com.ning.billing.util.events.PaymentErrorInternalEvent;
+import com.ning.billing.util.events.PaymentInfoInternalEvent;
+import com.ning.billing.util.events.RepairEntitlementInternalEvent;
 
 import com.google.common.base.Joiner;
 import com.google.common.eventbus.Subscribe;
@@ -79,14 +79,14 @@ public class TestApiListener {
     }
 
     @Subscribe
-    public void handleEntitlementEvents(final RepairEntitlementEvent event) {
+    public void handleEntitlementEvents(final RepairEntitlementInternalEvent event) {
         log.info(String.format("Got RepairEntitlementEvent event %s", event.toString()));
         assertEqualsNicely(NextEvent.REPAIR_BUNDLE);
         notifyIfStackEmpty();
     }
 
     @Subscribe
-    public void handleEntitlementEvents(final EffectiveSubscriptionEvent eventEffective) {
+    public void handleEntitlementEvents(final EffectiveSubscriptionInternalEvent eventEffective) {
         log.info(String.format("Got subscription event %s", eventEffective.toString()));
         switch (eventEffective.getTransitionType()) {
         case TRANSFER:
@@ -131,28 +131,28 @@ public class TestApiListener {
     }
 
     @Subscribe
-    public void handleInvoiceEvents(final InvoiceCreationEvent event) {
+    public void handleInvoiceEvents(final InvoiceCreationInternalEvent event) {
         log.info(String.format("Got Invoice event %s", event.toString()));
         assertEqualsNicely(NextEvent.INVOICE);
         notifyIfStackEmpty();
     }
 
     @Subscribe
-    public void handleInvoiceAdjustmentEvents(final InvoiceAdjustmentEvent event) {
+    public void handleInvoiceAdjustmentEvents(final InvoiceAdjustmentInternalEvent event) {
         log.info(String.format("Got Invoice adjustment event %s", event.toString()));
         assertEqualsNicely(NextEvent.INVOICE_ADJUSTMENT);
         notifyIfStackEmpty();
     }
 
     @Subscribe
-    public void handlePaymentEvents(final PaymentInfoEvent event) {
+    public void handlePaymentEvents(final PaymentInfoInternalEvent event) {
         log.info(String.format("Got PaymentInfo event %s", event.toString()));
         assertEqualsNicely(NextEvent.PAYMENT);
         notifyIfStackEmpty();
     }
 
     @Subscribe
-    public void handlePaymentErrorEvents(final PaymentErrorEvent event) {
+    public void handlePaymentErrorEvents(final PaymentErrorInternalEvent event) {
         log.info(String.format("Got PaymentError event %s", event.toString()));
         assertEqualsNicely(NextEvent.PAYMENT_ERROR);
         notifyIfStackEmpty();
diff --git a/util/src/test/java/com/ning/billing/mock/MockEffectiveSubscriptionEvent.java b/util/src/test/java/com/ning/billing/mock/MockEffectiveSubscriptionEvent.java
index 76f9001..970ac95 100644
--- a/util/src/test/java/com/ning/billing/mock/MockEffectiveSubscriptionEvent.java
+++ b/util/src/test/java/com/ning/billing/mock/MockEffectiveSubscriptionEvent.java
@@ -21,14 +21,14 @@ import java.util.UUID;
 import org.joda.time.DateTime;
 
 import com.ning.billing.entitlement.api.SubscriptionTransitionType;
-import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
 import com.ning.billing.entitlement.api.user.Subscription.SubscriptionState;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class MockEffectiveSubscriptionEvent implements EffectiveSubscriptionEvent {
+public class MockEffectiveSubscriptionEvent implements EffectiveSubscriptionInternalEvent {
 
     private final Long totalOrdering;
     private final UUID subscriptionId;
diff --git a/util/src/test/java/com/ning/billing/mock/MockSubscription.java b/util/src/test/java/com/ning/billing/mock/MockSubscription.java
index baf4543..adff078 100644
--- a/util/src/test/java/com/ning/billing/mock/MockSubscription.java
+++ b/util/src/test/java/com/ning/billing/mock/MockSubscription.java
@@ -30,11 +30,11 @@ import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.PriceList;
 import com.ning.billing.catalog.api.ProductCategory;
-import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.junction.api.BlockingState;
 import com.ning.billing.util.callcontext.CallContext;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 
 import com.google.common.collect.ImmutableList;
 
@@ -46,9 +46,9 @@ public class MockSubscription implements Subscription {
     private Plan plan;
     private final PlanPhase phase;
     private final DateTime startDate;
-    private final List<EffectiveSubscriptionEvent> transitions;
+    private final List<EffectiveSubscriptionInternalEvent> transitions;
 
-    public MockSubscription(final UUID id, final UUID bundleId, final Plan plan, final DateTime startDate, final List<EffectiveSubscriptionEvent> transitions) {
+    public MockSubscription(final UUID id, final UUID bundleId, final Plan plan, final DateTime startDate, final List<EffectiveSubscriptionInternalEvent> transitions) {
         this.id = id;
         this.bundleId = bundleId;
         this.state = SubscriptionState.ACTIVE;
@@ -65,7 +65,7 @@ public class MockSubscription implements Subscription {
         this.plan = plan;
         this.phase = phase;
         this.startDate = new DateTime(DateTimeZone.UTC);
-        this.transitions = ImmutableList.<EffectiveSubscriptionEvent>of();
+        this.transitions = ImmutableList.<EffectiveSubscriptionInternalEvent>of();
     }
 
     Subscription sub = Mockito.mock(Subscription.class);
@@ -176,22 +176,22 @@ public class MockSubscription implements Subscription {
     }
 
     @Override
-    public EffectiveSubscriptionEvent getPendingTransition() {
+    public EffectiveSubscriptionInternalEvent getPendingTransition() {
         return sub.getPendingTransition();
     }
 
     @Override
-    public EffectiveSubscriptionEvent getPreviousTransition() {
+    public EffectiveSubscriptionInternalEvent getPreviousTransition() {
         return sub.getPreviousTransition();
     }
 
     @Override
-    public List<EffectiveSubscriptionEvent> getBillingTransitions() {
+    public List<EffectiveSubscriptionInternalEvent> getBillingTransitions() {
         return transitions;
     }
 
     @Override
-    public List<EffectiveSubscriptionEvent> getAllTransitions() {
+    public List<EffectiveSubscriptionInternalEvent> getAllTransitions() {
         return transitions;
     }
 
diff --git a/util/src/test/java/com/ning/billing/util/bus/TestEventBusBase.java b/util/src/test/java/com/ning/billing/util/bus/TestEventBusBase.java
index 57a95ef..dded4ee 100644
--- a/util/src/test/java/com/ning/billing/util/bus/TestEventBusBase.java
+++ b/util/src/test/java/com/ning/billing/util/bus/TestEventBusBase.java
@@ -25,7 +25,8 @@ import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 
 import com.ning.billing.util.UtilTestSuiteWithEmbeddedDB;
-import com.ning.billing.util.bus.BusEvent.BusEventType;
+import com.ning.billing.util.events.BusInternalEvent;
+import com.ning.billing.util.events.BusInternalEvent.BusEventType;
 import com.ning.billing.util.svcsapi.bus.Bus;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -50,7 +51,7 @@ public abstract class TestEventBusBase extends UtilTestSuiteWithEmbeddedDB {
         eventBus.stop();
     }
 
-    public static class MyEvent implements BusEvent {
+    public static class MyEvent implements BusInternalEvent {
         private final String name;
         private final Long value;
         private final UUID userToken;
@@ -103,7 +104,7 @@ public abstract class TestEventBusBase extends UtilTestSuiteWithEmbeddedDB {
         }
     }
 
-    public static final class MyOtherEvent implements BusEvent {
+    public static final class MyOtherEvent implements BusInternalEvent {
 
         private final String name;
         private final Double value;
diff --git a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagCreationEvent.java b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagCreationEvent.java
index 9651c31..7731f02 100644
--- a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagCreationEvent.java
+++ b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagCreationEvent.java
@@ -22,8 +22,8 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import com.ning.billing.util.UtilTestSuite;
-import com.ning.billing.util.bus.BusEvent;
 import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.events.BusInternalEvent;
 import com.ning.billing.util.jackson.ObjectMapper;
 import com.ning.billing.util.tag.DefaultTagDefinition;
 import com.ning.billing.util.tag.TagDefinition;
@@ -42,7 +42,7 @@ public class TestDefaultControlTagCreationEvent extends UtilTestSuite {
         final UUID userToken = UUID.randomUUID();
 
         final DefaultControlTagCreationEvent event = new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
-        Assert.assertEquals(event.getBusEventType(), BusEvent.BusEventType.CONTROL_TAG_CREATION);
+        Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusEventType.CONTROL_TAG_CREATION);
 
         Assert.assertEquals(event.getTagId(), tagId);
         Assert.assertEquals(event.getObjectId(), objectId);
diff --git a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagDefinitionCreationEvent.java b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagDefinitionCreationEvent.java
index 7ad5252..5fc9f86 100644
--- a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagDefinitionCreationEvent.java
+++ b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagDefinitionCreationEvent.java
@@ -22,7 +22,7 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import com.ning.billing.util.UtilTestSuite;
-import com.ning.billing.util.bus.BusEvent;
+import com.ning.billing.util.events.BusInternalEvent;
 import com.ning.billing.util.jackson.ObjectMapper;
 import com.ning.billing.util.tag.DefaultTagDefinition;
 import com.ning.billing.util.tag.TagDefinition;
@@ -38,7 +38,7 @@ public class TestDefaultControlTagDefinitionCreationEvent extends UtilTestSuite 
         final UUID userToken = UUID.randomUUID();
 
         final DefaultControlTagDefinitionCreationEvent event = new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
-        Assert.assertEquals(event.getBusEventType(), BusEvent.BusEventType.CONTROL_TAGDEFINITION_CREATION);
+        Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusEventType.CONTROL_TAGDEFINITION_CREATION);
 
         Assert.assertEquals(event.getTagDefinitionId(), tagDefinitionId);
         Assert.assertEquals(event.getTagDefinition(), tagDefinition);
diff --git a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagDefinitionDeletionEvent.java b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagDefinitionDeletionEvent.java
index 2ea3181..d586de3 100644
--- a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagDefinitionDeletionEvent.java
+++ b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagDefinitionDeletionEvent.java
@@ -22,7 +22,7 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import com.ning.billing.util.UtilTestSuite;
-import com.ning.billing.util.bus.BusEvent;
+import com.ning.billing.util.events.BusInternalEvent;
 import com.ning.billing.util.jackson.ObjectMapper;
 import com.ning.billing.util.tag.DefaultTagDefinition;
 import com.ning.billing.util.tag.TagDefinition;
@@ -38,7 +38,7 @@ public class TestDefaultControlTagDefinitionDeletionEvent extends UtilTestSuite 
         final UUID userToken = UUID.randomUUID();
 
         final DefaultControlTagDefinitionDeletionEvent event = new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
-        Assert.assertEquals(event.getBusEventType(), BusEvent.BusEventType.CONTROL_TAGDEFINITION_DELETION);
+        Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusEventType.CONTROL_TAGDEFINITION_DELETION);
 
         Assert.assertEquals(event.getTagDefinitionId(), tagDefinitionId);
         Assert.assertEquals(event.getTagDefinition(), tagDefinition);
diff --git a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagDeletionEvent.java b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagDeletionEvent.java
index 5f68460..04905c3 100644
--- a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagDeletionEvent.java
+++ b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagDeletionEvent.java
@@ -22,8 +22,8 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import com.ning.billing.util.UtilTestSuite;
-import com.ning.billing.util.bus.BusEvent;
 import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.events.BusInternalEvent;
 import com.ning.billing.util.jackson.ObjectMapper;
 import com.ning.billing.util.tag.DefaultTagDefinition;
 import com.ning.billing.util.tag.TagDefinition;
@@ -42,7 +42,7 @@ public class TestDefaultControlTagDeletionEvent extends UtilTestSuite {
         final UUID userToken = UUID.randomUUID();
 
         final DefaultControlTagDeletionEvent event = new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
-        Assert.assertEquals(event.getBusEventType(), BusEvent.BusEventType.CONTROL_TAG_DELETION);
+        Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusEventType.CONTROL_TAG_DELETION);
 
         Assert.assertEquals(event.getTagId(), tagId);
         Assert.assertEquals(event.getObjectId(), objectId);
diff --git a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagCreationEvent.java b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagCreationEvent.java
index e330375..31232a6 100644
--- a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagCreationEvent.java
+++ b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagCreationEvent.java
@@ -22,8 +22,8 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import com.ning.billing.util.UtilTestSuite;
-import com.ning.billing.util.bus.BusEvent;
 import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.events.BusInternalEvent;
 import com.ning.billing.util.jackson.ObjectMapper;
 import com.ning.billing.util.tag.DefaultTagDefinition;
 import com.ning.billing.util.tag.TagDefinition;
@@ -42,7 +42,7 @@ public class TestDefaultUserTagCreationEvent extends UtilTestSuite {
         final UUID userToken = UUID.randomUUID();
 
         final DefaultUserTagCreationEvent event = new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
-        Assert.assertEquals(event.getBusEventType(), BusEvent.BusEventType.USER_TAG_CREATION);
+        Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusEventType.USER_TAG_CREATION);
 
         Assert.assertEquals(event.getTagId(), tagId);
         Assert.assertEquals(event.getObjectId(), objectId);
diff --git a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagDefinitionCreationEvent.java b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagDefinitionCreationEvent.java
index ae7ddfa..2a77bef 100644
--- a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagDefinitionCreationEvent.java
+++ b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagDefinitionCreationEvent.java
@@ -22,7 +22,7 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import com.ning.billing.util.UtilTestSuite;
-import com.ning.billing.util.bus.BusEvent;
+import com.ning.billing.util.events.BusInternalEvent;
 import com.ning.billing.util.jackson.ObjectMapper;
 import com.ning.billing.util.tag.DefaultTagDefinition;
 import com.ning.billing.util.tag.TagDefinition;
@@ -38,7 +38,7 @@ public class TestDefaultUserTagDefinitionCreationEvent extends UtilTestSuite {
         final UUID userToken = UUID.randomUUID();
 
         final DefaultUserTagDefinitionCreationEvent event = new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
-        Assert.assertEquals(event.getBusEventType(), BusEvent.BusEventType.USER_TAGDEFINITION_CREATION);
+        Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusEventType.USER_TAGDEFINITION_CREATION);
 
         Assert.assertEquals(event.getTagDefinitionId(), tagDefinitionId);
         Assert.assertEquals(event.getTagDefinition(), tagDefinition);
diff --git a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagDefinitionDeletionEvent.java b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagDefinitionDeletionEvent.java
index 9bc13a2..fc5f25b 100644
--- a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagDefinitionDeletionEvent.java
+++ b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagDefinitionDeletionEvent.java
@@ -22,7 +22,7 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import com.ning.billing.util.UtilTestSuite;
-import com.ning.billing.util.bus.BusEvent;
+import com.ning.billing.util.events.BusInternalEvent;
 import com.ning.billing.util.jackson.ObjectMapper;
 import com.ning.billing.util.tag.DefaultTagDefinition;
 import com.ning.billing.util.tag.TagDefinition;
@@ -38,7 +38,7 @@ public class TestDefaultUserTagDefinitionDeletionEvent extends UtilTestSuite {
         final UUID userToken = UUID.randomUUID();
 
         final DefaultUserTagDefinitionDeletionEvent event = new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
-        Assert.assertEquals(event.getBusEventType(), BusEvent.BusEventType.USER_TAGDEFINITION_DELETION);
+        Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusEventType.USER_TAGDEFINITION_DELETION);
 
         Assert.assertEquals(event.getTagDefinitionId(), tagDefinitionId);
         Assert.assertEquals(event.getTagDefinition(), tagDefinition);
diff --git a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagDeletionEvent.java b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagDeletionEvent.java
index 2b8bd68..6870b2c 100644
--- a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagDeletionEvent.java
+++ b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagDeletionEvent.java
@@ -22,8 +22,8 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import com.ning.billing.util.UtilTestSuite;
-import com.ning.billing.util.bus.BusEvent;
 import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.events.BusInternalEvent;
 import com.ning.billing.util.jackson.ObjectMapper;
 import com.ning.billing.util.tag.DefaultTagDefinition;
 import com.ning.billing.util.tag.TagDefinition;
@@ -42,7 +42,7 @@ public class TestDefaultUserTagDeletionEvent extends UtilTestSuite {
         final UUID userToken = UUID.randomUUID();
 
         final DefaultUserTagDeletionEvent event = new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
-        Assert.assertEquals(event.getBusEventType(), BusEvent.BusEventType.USER_TAG_DELETION);
+        Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusEventType.USER_TAG_DELETION);
 
         Assert.assertEquals(event.getTagId(), tagId);
         Assert.assertEquals(event.getObjectId(), objectId);
diff --git a/util/src/test/java/com/ning/billing/util/tag/api/user/TestTagEventBuilder.java b/util/src/test/java/com/ning/billing/util/tag/api/user/TestTagEventBuilder.java
index f9f7411..4116bc7 100644
--- a/util/src/test/java/com/ning/billing/util/tag/api/user/TestTagEventBuilder.java
+++ b/util/src/test/java/com/ning/billing/util/tag/api/user/TestTagEventBuilder.java
@@ -23,18 +23,18 @@ import org.testng.annotations.Test;
 
 import com.ning.billing.util.UtilTestSuite;
 import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.events.ControlTagCreationInternalEvent;
+import com.ning.billing.util.events.ControlTagDefinitionCreationInternalEvent;
+import com.ning.billing.util.events.ControlTagDefinitionDeletionInternalEvent;
+import com.ning.billing.util.events.ControlTagDeletionInternalEvent;
+import com.ning.billing.util.events.TagDefinitionInternalEvent;
+import com.ning.billing.util.events.TagInternalEvent;
+import com.ning.billing.util.events.UserTagCreationInternalEvent;
+import com.ning.billing.util.events.UserTagDefinitionCreationInternalEvent;
+import com.ning.billing.util.events.UserTagDefinitionDeletionInternalEvent;
+import com.ning.billing.util.events.UserTagDeletionInternalEvent;
 import com.ning.billing.util.tag.DefaultTagDefinition;
 import com.ning.billing.util.tag.TagDefinition;
-import com.ning.billing.util.tag.api.ControlTagCreationEvent;
-import com.ning.billing.util.tag.api.ControlTagDefinitionCreationEvent;
-import com.ning.billing.util.tag.api.ControlTagDefinitionDeletionEvent;
-import com.ning.billing.util.tag.api.ControlTagDeletionEvent;
-import com.ning.billing.util.tag.api.TagDefinitionEvent;
-import com.ning.billing.util.tag.api.TagEvent;
-import com.ning.billing.util.tag.api.UserTagCreationEvent;
-import com.ning.billing.util.tag.api.UserTagDefinitionCreationEvent;
-import com.ning.billing.util.tag.api.UserTagDefinitionDeletionEvent;
-import com.ning.billing.util.tag.api.UserTagDeletionEvent;
 
 public class TestTagEventBuilder extends UtilTestSuite {
     @Test(groups = "fast")
@@ -47,8 +47,8 @@ public class TestTagEventBuilder extends UtilTestSuite {
         final UUID userToken = UUID.randomUUID();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagDefinitionEvent event = tagEventBuilder.newUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
-        Assert.assertTrue(event instanceof UserTagDefinitionCreationEvent);
+        final TagDefinitionInternalEvent event = tagEventBuilder.newUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
+        Assert.assertTrue(event instanceof UserTagDefinitionCreationInternalEvent);
 
         Assert.assertEquals(event, new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken));
         Assert.assertTrue(event.equals(new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken)));
@@ -66,8 +66,8 @@ public class TestTagEventBuilder extends UtilTestSuite {
         final UUID userToken = UUID.randomUUID();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagDefinitionEvent event = tagEventBuilder.newUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
-        Assert.assertTrue(event instanceof UserTagDefinitionDeletionEvent);
+        final TagDefinitionInternalEvent event = tagEventBuilder.newUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
+        Assert.assertTrue(event instanceof UserTagDefinitionDeletionInternalEvent);
 
         Assert.assertEquals(event, new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken));
         Assert.assertTrue(event.equals(new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken)));
@@ -85,8 +85,8 @@ public class TestTagEventBuilder extends UtilTestSuite {
         final UUID userToken = UUID.randomUUID();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagDefinitionEvent event = tagEventBuilder.newControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
-        Assert.assertTrue(event instanceof ControlTagDefinitionCreationEvent);
+        final TagDefinitionInternalEvent event = tagEventBuilder.newControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
+        Assert.assertTrue(event instanceof ControlTagDefinitionCreationInternalEvent);
 
         Assert.assertEquals(event, new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken));
         Assert.assertTrue(event.equals(new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken)));
@@ -104,8 +104,8 @@ public class TestTagEventBuilder extends UtilTestSuite {
         final UUID userToken = UUID.randomUUID();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagDefinitionEvent event = tagEventBuilder.newControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
-        Assert.assertTrue(event instanceof ControlTagDefinitionDeletionEvent);
+        final TagDefinitionInternalEvent event = tagEventBuilder.newControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
+        Assert.assertTrue(event instanceof ControlTagDefinitionDeletionInternalEvent);
 
         Assert.assertEquals(event, new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken));
         Assert.assertTrue(event.equals(new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken)));
@@ -126,8 +126,8 @@ public class TestTagEventBuilder extends UtilTestSuite {
         final UUID userToken = UUID.randomUUID();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagEvent event = tagEventBuilder.newUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
-        Assert.assertTrue(event instanceof UserTagCreationEvent);
+        final TagInternalEvent event = tagEventBuilder.newUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        Assert.assertTrue(event instanceof UserTagCreationInternalEvent);
 
         Assert.assertEquals(event, new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken));
         Assert.assertTrue(event.equals(new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken)));
@@ -148,8 +148,8 @@ public class TestTagEventBuilder extends UtilTestSuite {
         final UUID userToken = UUID.randomUUID();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagEvent event = tagEventBuilder.newUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
-        Assert.assertTrue(event instanceof UserTagDeletionEvent);
+        final TagInternalEvent event = tagEventBuilder.newUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        Assert.assertTrue(event instanceof UserTagDeletionInternalEvent);
 
         Assert.assertEquals(event, new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken));
         Assert.assertTrue(event.equals(new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken)));
@@ -170,8 +170,8 @@ public class TestTagEventBuilder extends UtilTestSuite {
         final UUID userToken = UUID.randomUUID();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagEvent event = tagEventBuilder.newControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
-        Assert.assertTrue(event instanceof ControlTagCreationEvent);
+        final TagInternalEvent event = tagEventBuilder.newControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        Assert.assertTrue(event instanceof ControlTagCreationInternalEvent);
 
         Assert.assertEquals(event, new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken));
         Assert.assertTrue(event.equals(new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken)));
@@ -192,8 +192,8 @@ public class TestTagEventBuilder extends UtilTestSuite {
         final UUID userToken = UUID.randomUUID();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagEvent event = tagEventBuilder.newControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
-        Assert.assertTrue(event instanceof ControlTagDeletionEvent);
+        final TagInternalEvent event = tagEventBuilder.newControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        Assert.assertTrue(event instanceof ControlTagDeletionInternalEvent);
 
         Assert.assertEquals(event, new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken));
         Assert.assertTrue(event.equals(new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken)));
@@ -201,7 +201,7 @@ public class TestTagEventBuilder extends UtilTestSuite {
         verifyTagEvent(tagId, objectId, objectType, tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
     }
 
-    private void verifyTagDefinitionEvent(final UUID tagDefinitionId, final String tagDefinitionName, final String tagDefinitionDescription, final TagDefinition tagDefinition, final UUID userToken, final TagDefinitionEvent event) {
+    private void verifyTagDefinitionEvent(final UUID tagDefinitionId, final String tagDefinitionName, final String tagDefinitionDescription, final TagDefinition tagDefinition, final UUID userToken, final TagDefinitionInternalEvent event) {
         Assert.assertEquals(event.getTagDefinitionId(), tagDefinitionId);
         Assert.assertEquals(event.getTagDefinition(), tagDefinition);
         Assert.assertEquals(event.getTagDefinition().getId(), tagDefinitionId);
@@ -213,7 +213,7 @@ public class TestTagEventBuilder extends UtilTestSuite {
         Assert.assertTrue(event.equals(event));
     }
 
-    private void verifyTagEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final UUID tagDefinitionId, final String tagDefinitionName, final String tagDefinitionDescription, final TagDefinition tagDefinition, final UUID userToken, final TagEvent event) {
+    private void verifyTagEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final UUID tagDefinitionId, final String tagDefinitionName, final String tagDefinitionDescription, final TagDefinition tagDefinition, final UUID userToken, final TagInternalEvent event) {
         Assert.assertEquals(event.getTagId(), tagId);
         Assert.assertEquals(event.getObjectId(), objectId);
         Assert.assertEquals(event.getObjectType(), objectType);
diff --git a/util/src/test/java/com/ning/billing/util/tag/dao/TestAuditedTagDao.java b/util/src/test/java/com/ning/billing/util/tag/dao/TestAuditedTagDao.java
index 0b96e06..156b438 100644
--- a/util/src/test/java/com/ning/billing/util/tag/dao/TestAuditedTagDao.java
+++ b/util/src/test/java/com/ning/billing/util/tag/dao/TestAuditedTagDao.java
@@ -33,14 +33,14 @@ import com.ning.billing.dbi.MysqlTestingHelper;
 import com.ning.billing.util.UtilTestSuiteWithEmbeddedDB;
 import com.ning.billing.util.api.TagDefinitionApiException;
 import com.ning.billing.util.svcsapi.bus.Bus;
-import com.ning.billing.util.bus.BusEvent;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.events.BusInternalEvent;
+import com.ning.billing.util.events.TagInternalEvent;
 import com.ning.billing.util.tag.ControlTagType;
 import com.ning.billing.util.tag.MockTagStoreModuleSql;
 import com.ning.billing.util.tag.Tag;
 import com.ning.billing.util.tag.TagDefinition;
-import com.ning.billing.util.tag.api.TagEvent;
 
 import com.google.common.eventbus.Subscribe;
 import com.google.inject.Inject;
@@ -175,13 +175,13 @@ public class TestAuditedTagDao extends UtilTestSuiteWithEmbeddedDB {
         // Verify we caught an event on the bus -  we got 2 total (one for the tag definition, one for the tag)
         Assert.assertEquals(eventsListener.getEvents().size(), 2);
         Assert.assertEquals(eventsListener.getTagEvents().size(), 1);
-        final TagEvent tagFirstEventReceived = eventsListener.getTagEvents().get(0);
+        final TagInternalEvent tagFirstEventReceived = eventsListener.getTagEvents().get(0);
         Assert.assertEquals(eventsListener.getEvents().get(1), tagFirstEventReceived);
         Assert.assertEquals(tagFirstEventReceived.getObjectId(), objectId);
         Assert.assertEquals(tagFirstEventReceived.getObjectType(), objectType);
         Assert.assertEquals(tagFirstEventReceived.getTagDefinition().getName(), createdTagDefinition.getName());
         Assert.assertEquals(tagFirstEventReceived.getTagDefinition().getDescription(), createdTagDefinition.getDescription());
-        Assert.assertEquals(tagFirstEventReceived.getBusEventType(), BusEvent.BusEventType.USER_TAG_CREATION);
+        Assert.assertEquals(tagFirstEventReceived.getBusEventType(), BusInternalEvent.BusEventType.USER_TAG_CREATION);
         Assert.assertEquals(tagFirstEventReceived.getUserToken(), internalCallContext.getUserToken());
 
         // Delete the tag
@@ -193,36 +193,36 @@ public class TestAuditedTagDao extends UtilTestSuiteWithEmbeddedDB {
         // Verify we caught an event on the bus
         Assert.assertEquals(eventsListener.getEvents().size(), 3);
         Assert.assertEquals(eventsListener.getTagEvents().size(), 2);
-        final TagEvent tagSecondEventReceived = eventsListener.getTagEvents().get(1);
+        final TagInternalEvent tagSecondEventReceived = eventsListener.getTagEvents().get(1);
         Assert.assertEquals(eventsListener.getEvents().get(2), tagSecondEventReceived);
         Assert.assertEquals(tagSecondEventReceived.getObjectId(), objectId);
         Assert.assertEquals(tagSecondEventReceived.getObjectType(), objectType);
         Assert.assertEquals(tagSecondEventReceived.getTagDefinition().getName(), createdTagDefinition.getName());
         Assert.assertEquals(tagSecondEventReceived.getTagDefinition().getDescription(), createdTagDefinition.getDescription());
-        Assert.assertEquals(tagSecondEventReceived.getBusEventType(), BusEvent.BusEventType.USER_TAG_DELETION);
+        Assert.assertEquals(tagSecondEventReceived.getBusEventType(), BusInternalEvent.BusEventType.USER_TAG_DELETION);
         Assert.assertEquals(tagSecondEventReceived.getUserToken(), internalCallContext.getUserToken());
     }
 
     private static final class EventsListener {
 
-        private final List<BusEvent> events = new ArrayList<BusEvent>();
-        private final List<TagEvent> tagEvents = new ArrayList<TagEvent>();
+        private final List<BusInternalEvent> events = new ArrayList<BusInternalEvent>();
+        private final List<TagInternalEvent> tagEvents = new ArrayList<TagInternalEvent>();
 
         @Subscribe
-        public synchronized void processEvent(final BusEvent event) {
+        public synchronized void processEvent(final BusInternalEvent event) {
             events.add(event);
         }
 
         @Subscribe
-        public synchronized void processTagDefinitionEvent(final TagEvent tagEvent) {
+        public synchronized void processTagDefinitionEvent(final TagInternalEvent tagEvent) {
             tagEvents.add(tagEvent);
         }
 
-        public List<BusEvent> getEvents() {
+        public List<BusInternalEvent> getEvents() {
             return events;
         }
 
-        public List<TagEvent> getTagEvents() {
+        public List<TagInternalEvent> getTagEvents() {
             return tagEvents;
         }
     }
diff --git a/util/src/test/java/com/ning/billing/util/tag/dao/TestDefaultTagDefinitionDao.java b/util/src/test/java/com/ning/billing/util/tag/dao/TestDefaultTagDefinitionDao.java
index b2edd12..02d93f4 100644
--- a/util/src/test/java/com/ning/billing/util/tag/dao/TestDefaultTagDefinitionDao.java
+++ b/util/src/test/java/com/ning/billing/util/tag/dao/TestDefaultTagDefinitionDao.java
@@ -31,11 +31,11 @@ import org.testng.annotations.Test;
 import com.ning.billing.dbi.MysqlTestingHelper;
 import com.ning.billing.util.UtilTestSuiteWithEmbeddedDB;
 import com.ning.billing.util.svcsapi.bus.Bus;
-import com.ning.billing.util.bus.BusEvent;
 import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.events.BusInternalEvent;
+import com.ning.billing.util.events.TagDefinitionInternalEvent;
 import com.ning.billing.util.tag.MockTagStoreModuleSql;
 import com.ning.billing.util.tag.TagDefinition;
-import com.ning.billing.util.tag.api.TagDefinitionEvent;
 
 import com.google.common.eventbus.Subscribe;
 import com.google.inject.Inject;
@@ -94,11 +94,11 @@ public class TestDefaultTagDefinitionDao extends UtilTestSuiteWithEmbeddedDB {
         // Verify we caught an event on the bus
         Assert.assertEquals(eventsListener.getEvents().size(), 1);
         Assert.assertEquals(eventsListener.getTagDefinitionEvents().size(), 1);
-        final TagDefinitionEvent tagDefinitionFirstEventReceived = eventsListener.getTagDefinitionEvents().get(0);
+        final TagDefinitionInternalEvent tagDefinitionFirstEventReceived = eventsListener.getTagDefinitionEvents().get(0);
         Assert.assertEquals(eventsListener.getEvents().get(0), tagDefinitionFirstEventReceived);
         Assert.assertEquals(tagDefinitionFirstEventReceived.getTagDefinitionId(), createdTagDefinition.getId());
         Assert.assertEquals(tagDefinitionFirstEventReceived.getTagDefinition(), createdTagDefinition);
-        Assert.assertEquals(tagDefinitionFirstEventReceived.getBusEventType(), BusEvent.BusEventType.USER_TAGDEFINITION_CREATION);
+        Assert.assertEquals(tagDefinitionFirstEventReceived.getBusEventType(), BusInternalEvent.BusEventType.USER_TAGDEFINITION_CREATION);
         Assert.assertEquals(tagDefinitionFirstEventReceived.getUserToken(), internalCallContext.getUserToken());
 
         // Delete the tag definition
@@ -110,34 +110,34 @@ public class TestDefaultTagDefinitionDao extends UtilTestSuiteWithEmbeddedDB {
         // Verify we caught an event on the bus
         Assert.assertEquals(eventsListener.getEvents().size(), 2);
         Assert.assertEquals(eventsListener.getTagDefinitionEvents().size(), 2);
-        final TagDefinitionEvent tagDefinitionSecondEventReceived = eventsListener.getTagDefinitionEvents().get(1);
+        final TagDefinitionInternalEvent tagDefinitionSecondEventReceived = eventsListener.getTagDefinitionEvents().get(1);
         Assert.assertEquals(eventsListener.getEvents().get(1), tagDefinitionSecondEventReceived);
         Assert.assertEquals(tagDefinitionSecondEventReceived.getTagDefinitionId(), createdTagDefinition.getId());
         Assert.assertEquals(tagDefinitionSecondEventReceived.getTagDefinition(), createdTagDefinition);
-        Assert.assertEquals(tagDefinitionSecondEventReceived.getBusEventType(), BusEvent.BusEventType.USER_TAGDEFINITION_DELETION);
+        Assert.assertEquals(tagDefinitionSecondEventReceived.getBusEventType(), BusInternalEvent.BusEventType.USER_TAGDEFINITION_DELETION);
         Assert.assertEquals(tagDefinitionSecondEventReceived.getUserToken(), internalCallContext.getUserToken());
     }
 
     private static final class EventsListener {
 
-        private final List<BusEvent> events = new ArrayList<BusEvent>();
-        private final List<TagDefinitionEvent> tagDefinitionEvents = new ArrayList<TagDefinitionEvent>();
+        private final List<BusInternalEvent> events = new ArrayList<BusInternalEvent>();
+        private final List<TagDefinitionInternalEvent> tagDefinitionEvents = new ArrayList<TagDefinitionInternalEvent>();
 
         @Subscribe
-        public synchronized void processEvent(final BusEvent event) {
+        public synchronized void processEvent(final BusInternalEvent event) {
             events.add(event);
         }
 
         @Subscribe
-        public synchronized void processTagDefinitionEvent(final TagDefinitionEvent tagDefinitionEvent) {
+        public synchronized void processTagDefinitionEvent(final TagDefinitionInternalEvent tagDefinitionEvent) {
             tagDefinitionEvents.add(tagDefinitionEvent);
         }
 
-        public List<BusEvent> getEvents() {
+        public List<BusInternalEvent> getEvents() {
             return events;
         }
 
-        public List<TagDefinitionEvent> getTagDefinitionEvents() {
+        public List<TagDefinitionInternalEvent> getTagDefinitionEvents() {
             return tagDefinitionEvents;
         }
     }