killbill-uncached

Changes

beatrix/src/main/java/com/ning/billing/beatrix/extbus/DefaultBusEvent.java 79(+0 -79)

beatrix/src/main/resources/com/ning/billing/beatrix/extbus/dao/ExtBusSqlDao.sql.stg 107(+0 -107)

util/src/main/java/com/ning/billing/util/events/BusEventBase.java 52(+0 -52)

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 32a3884..3893e21 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
@@ -23,7 +23,6 @@ import java.util.UUID;
 import com.ning.billing.account.api.DefaultChangedField;
 import com.ning.billing.account.dao.AccountModelDao;
 import com.ning.billing.util.events.AccountChangeInternalEvent;
-import com.ning.billing.util.events.BusEventBase;
 import com.ning.billing.util.events.ChangedField;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -31,25 +30,19 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 
-public class DefaultAccountChangeEvent extends BusEventBase implements AccountChangeInternalEvent {
+public class DefaultAccountChangeEvent implements AccountChangeInternalEvent {
 
     private final List<ChangedField> changedFields;
     private final UUID accountId;
 
     @JsonCreator
-    public DefaultAccountChangeEvent(@JsonProperty("userToken") final UUID userToken,
-                                     @JsonProperty("changeFields") final List<ChangedField> changedFields,
-                                     @JsonProperty("accountId") final UUID accountId,
-                                     @JsonProperty("accountRecordId") final Long accountRecordId,
-                                     @JsonProperty("tenantRecordId") final Long tenantRecordId) {
-        super(userToken, accountRecordId, tenantRecordId);
+    public DefaultAccountChangeEvent(@JsonProperty("changeFields") final List<ChangedField> changedFields,
+                                     @JsonProperty("accountId") final UUID accountId) {
         this.accountId = accountId;
         this.changedFields = changedFields;
     }
 
-    public DefaultAccountChangeEvent(final UUID id, final UUID userToken, final AccountModelDao oldData, final AccountModelDao newData,
-                                     final Long accountRecordId, final Long tenantRecordId) {
-        super(userToken, accountRecordId, tenantRecordId);
+    public DefaultAccountChangeEvent(final UUID id, final AccountModelDao oldData, final AccountModelDao newData) {
         this.accountId = id;
         this.changedFields = calculateChangedFields(oldData, newData);
     }
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 0a1fd13..edd2614 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
@@ -24,33 +24,23 @@ import com.ning.billing.account.api.AccountData;
 import com.ning.billing.account.dao.AccountModelDao;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.util.events.AccountCreationInternalEvent;
-import com.ning.billing.util.events.BusEventBase;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultAccountCreationEvent extends BusEventBase implements AccountCreationInternalEvent {
+public class DefaultAccountCreationEvent implements AccountCreationInternalEvent {
 
     private final UUID id;
     private final AccountData data;
 
     @JsonCreator
     public DefaultAccountCreationEvent(@JsonProperty("data") final DefaultAccountData data,
-                                       @JsonProperty("userToken") final UUID userToken,
-                                       @JsonProperty("id") final UUID id,
-                                       @JsonProperty("accountRecordId") final Long accountRecordId,
-                                       @JsonProperty("tenantRecordId") final Long tenantRecordId) {
-        super(userToken, accountRecordId, tenantRecordId);
+                                       @JsonProperty("id") final UUID id) {
         this.id = id;
         this.data = data;
     }
 
-    public DefaultAccountCreationEvent(final AccountModelDao data, final UUID userToken, final Long accountRecordId, final Long tenantRecordId) {
-        super(userToken, accountRecordId, tenantRecordId);
-        this.id = data.getId();
-        this.data = new DefaultAccountData(data);
-    }
 
     @JsonIgnore
     @Override
diff --git a/account/src/main/java/com/ning/billing/account/dao/DefaultAccountDao.java b/account/src/main/java/com/ning/billing/account/dao/DefaultAccountDao.java
index 2928870..ce70a3b 100644
--- a/account/src/main/java/com/ning/billing/account/dao/DefaultAccountDao.java
+++ b/account/src/main/java/com/ning/billing/account/dao/DefaultAccountDao.java
@@ -29,8 +29,9 @@ import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
 import com.ning.billing.account.api.user.DefaultAccountChangeEvent;
 import com.ning.billing.account.api.user.DefaultAccountCreationEvent;
-import com.ning.billing.bus.PersistentBus;
-import com.ning.billing.bus.PersistentBus.EventBusException;
+import com.ning.billing.account.api.user.DefaultAccountCreationEvent.DefaultAccountData;
+import com.ning.billing.bus.api.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus.EventBusException;
 import com.ning.billing.util.audit.ChangeType;
 import com.ning.billing.util.cache.CacheControllerDispatcher;
 import com.ning.billing.util.callcontext.InternalCallContext;
@@ -83,12 +84,10 @@ public class DefaultAccountDao extends EntityDaoBase<AccountModelDao, Account, A
         final Long recordId = entitySqlDaoWrapperFactory.become(AccountSqlDao.class).getRecordId(savedAccount.getId().toString(), context);
         // We need to re-hydrate the context with the account record id
         final InternalCallContext rehydratedContext = internalCallContextFactory.createInternalCallContext(recordId, context);
-        final AccountCreationInternalEvent creationEvent = new DefaultAccountCreationEvent(savedAccount,
-                                                                                           rehydratedContext.getUserToken(),
-                                                                                           context.getAccountRecordId(),
-                                                                                           context.getTenantRecordId());
+        final AccountCreationInternalEvent creationEvent = new DefaultAccountCreationEvent(new DefaultAccountData(savedAccount), savedAccount.getId());
         try {
-            eventBus.postFromTransaction(creationEvent, entitySqlDaoWrapperFactory.getSqlDao());
+            eventBus.postFromTransaction(creationEvent, rehydratedContext.getUserToken(), rehydratedContext.getAccountRecordId(),
+                                         rehydratedContext.getTenantRecordId(), entitySqlDaoWrapperFactory.getSqlDao());
         } catch (final EventBusException e) {
             log.warn("Failed to post account creation event for account " + savedAccount.getId(), e);
         }
@@ -134,13 +133,11 @@ public class DefaultAccountDao extends EntityDaoBase<AccountModelDao, Account, A
                 transactional.update(specifiedAccount, context);
 
                 final AccountChangeInternalEvent changeEvent = new DefaultAccountChangeEvent(accountId,
-                                                                                             context.getUserToken(),
                                                                                              currentAccount,
-                                                                                             specifiedAccount,
-                                                                                             context.getAccountRecordId(),
-                                                                                             context.getTenantRecordId());
+                                                                                             specifiedAccount
+                );
                 try {
-                    eventBus.postFromTransaction(changeEvent, entitySqlDaoWrapperFactory.getSqlDao());
+                    eventBus.postFromTransaction(changeEvent, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId(), entitySqlDaoWrapperFactory.getSqlDao());
                 } catch (final EventBusException e) {
                     log.warn("Failed to post account change event for account " + accountId, e);
                 }
@@ -172,11 +169,11 @@ public class DefaultAccountDao extends EntityDaoBase<AccountModelDao, Account, A
                 transactional.updatePaymentMethod(accountId.toString(), thePaymentMethodId, context);
 
                 final AccountModelDao account = transactional.getById(accountId.toString(), context);
-                final AccountChangeInternalEvent changeEvent = new DefaultAccountChangeEvent(accountId, context.getUserToken(), currentAccount, account,
-                                                                                             context.getAccountRecordId(), context.getTenantRecordId());
+                final AccountChangeInternalEvent changeEvent = new DefaultAccountChangeEvent(accountId, currentAccount, account
+                );
 
                 try {
-                    eventBus.postFromTransaction(changeEvent, entitySqlDaoWrapperFactory.getSqlDao());
+                    eventBus.postFromTransaction(changeEvent, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId(), entitySqlDaoWrapperFactory.getSqlDao());
                 } catch (final EventBusException e) {
                     log.warn("Failed to post account change event for account " + accountId, e);
                 }
diff --git a/account/src/test/java/com/ning/billing/account/AccountTestSuiteNoDB.java b/account/src/test/java/com/ning/billing/account/AccountTestSuiteNoDB.java
index d9ca697..9b91b82 100644
--- a/account/src/test/java/com/ning/billing/account/AccountTestSuiteNoDB.java
+++ b/account/src/test/java/com/ning/billing/account/AccountTestSuiteNoDB.java
@@ -24,7 +24,7 @@ import com.ning.billing.GuicyKillbillTestSuiteNoDB;
 import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.account.dao.AccountDao;
 import com.ning.billing.account.glue.TestAccountModuleNoDB;
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.util.audit.dao.AuditDao;
 import com.ning.billing.util.cache.CacheControllerDispatcher;
 import com.ning.billing.util.clock.Clock;
diff --git a/account/src/test/java/com/ning/billing/account/AccountTestSuiteWithEmbeddedDB.java b/account/src/test/java/com/ning/billing/account/AccountTestSuiteWithEmbeddedDB.java
index 0bfec40..b7ce1fc 100644
--- a/account/src/test/java/com/ning/billing/account/AccountTestSuiteWithEmbeddedDB.java
+++ b/account/src/test/java/com/ning/billing/account/AccountTestSuiteWithEmbeddedDB.java
@@ -24,7 +24,7 @@ import com.ning.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
 import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.account.dao.AccountDao;
 import com.ning.billing.account.glue.TestAccountModuleWithEmbeddedDB;
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.util.audit.dao.AuditDao;
 import com.ning.billing.util.cache.CacheControllerDispatcher;
 import com.ning.billing.util.clock.Clock;
diff --git a/account/src/test/java/com/ning/billing/account/api/user/TestDefaultAccountUserApiWithMocks.java b/account/src/test/java/com/ning/billing/account/api/user/TestDefaultAccountUserApiWithMocks.java
index 45a4f32..e9e132c 100644
--- a/account/src/test/java/com/ning/billing/account/api/user/TestDefaultAccountUserApiWithMocks.java
+++ b/account/src/test/java/com/ning/billing/account/api/user/TestDefaultAccountUserApiWithMocks.java
@@ -32,7 +32,7 @@ import com.ning.billing.account.api.DefaultAccountEmail;
 import com.ning.billing.account.dao.AccountDao;
 import com.ning.billing.account.dao.AccountModelDao;
 import com.ning.billing.account.dao.MockAccountDao;
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.CallContextFactory;
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 d0f82d7..05d1e97 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
@@ -39,7 +39,7 @@ public class TestEventJson extends AccountTestSuiteNoDB {
         final List<ChangedField> changes = new ArrayList<ChangedField>();
         changes.add(new DefaultChangedField("fieldXX", "valueX", "valueXXX"));
         changes.add(new DefaultChangedField("fieldYY", "valueY", "valueYYY"));
-        final AccountChangeInternalEvent e = new DefaultAccountChangeEvent(UUID.randomUUID(), changes, UUID.randomUUID(), 1L, 45L);
+        final AccountChangeInternalEvent e = new DefaultAccountChangeEvent(changes, UUID.randomUUID());
 
         final String json = mapper.writeValueAsString(e);
 
@@ -52,7 +52,7 @@ public class TestEventJson extends AccountTestSuiteNoDB {
     public void testAccountCreationEvent() throws Exception {
         final DefaultAccountData data = new DefaultAccountData("dsfdsf", "bobo", 3, "bobo@yahoo.com", 12, "USD", UUID.randomUUID(),
                                                                "UTC", "US", "21 avenue", "", "Gling", "San Franciso", "CA", "94110", "USA", "4126789887", false, false);
-        final DefaultAccountCreationEvent e = new DefaultAccountCreationEvent(data, UUID.randomUUID(), UUID.randomUUID(), 1L, 45L);
+        final DefaultAccountCreationEvent e = new DefaultAccountCreationEvent(data, UUID.randomUUID());
         final String json = mapper.writeValueAsString(e);
 
         final DefaultAccountCreationEvent obj = mapper.readValue(json, DefaultAccountCreationEvent.class);
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 a154c0c..3d9e8ec 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
@@ -31,8 +31,9 @@ import com.ning.billing.account.api.DefaultAccount;
 import com.ning.billing.account.api.DefaultMutableAccountData;
 import com.ning.billing.account.api.user.DefaultAccountChangeEvent;
 import com.ning.billing.account.api.user.DefaultAccountCreationEvent;
-import com.ning.billing.bus.PersistentBus;
-import com.ning.billing.bus.PersistentBus.EventBusException;
+import com.ning.billing.account.api.user.DefaultAccountCreationEvent.DefaultAccountData;
+import com.ning.billing.bus.api.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus.EventBusException;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.callcontext.InternalTenantContext;
@@ -62,7 +63,7 @@ public class MockAccountDao extends MockEntityDaoBase<AccountModelDao, Account, 
             final Long accountRecordId = getRecordId(account.getId(), context);
             final long tenantRecordId = context == null ? InternalCallContextFactory.INTERNAL_TENANT_RECORD_ID
                                                         : context.getTenantRecordId();
-            eventBus.post(new DefaultAccountCreationEvent(account, null, accountRecordId, tenantRecordId));
+            eventBus.post(new DefaultAccountCreationEvent(new DefaultAccountData(account), account.getId()), context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
         } catch (final EventBusException ex) {
             Assert.fail(ex.toString());
         }
@@ -76,11 +77,11 @@ public class MockAccountDao extends MockEntityDaoBase<AccountModelDao, Account, 
         final Long accountRecordId = getRecordId(account.getId(), context);
         final long tenantRecordId = context == null ? InternalCallContextFactory.INTERNAL_TENANT_RECORD_ID
                                                     : context.getTenantRecordId();
-        final AccountChangeInternalEvent changeEvent = new DefaultAccountChangeEvent(account.getId(), null, currentAccount, account,
-                                                                                     accountRecordId, tenantRecordId);
+        final AccountChangeInternalEvent changeEvent = new DefaultAccountChangeEvent(account.getId(), currentAccount, account
+        );
         if (changeEvent.hasChanges()) {
             try {
-                eventBus.post(changeEvent);
+                eventBus.post(changeEvent, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
             } catch (final EventBusException ex) {
                 Assert.fail(ex.toString());
             }
diff --git a/beatrix/src/main/java/com/ning/billing/beatrix/DefaultBeatrixService.java b/beatrix/src/main/java/com/ning/billing/beatrix/DefaultBeatrixService.java
index 7aab8c8..24b23a7 100644
--- a/beatrix/src/main/java/com/ning/billing/beatrix/DefaultBeatrixService.java
+++ b/beatrix/src/main/java/com/ning/billing/beatrix/DefaultBeatrixService.java
@@ -20,7 +20,7 @@ import javax.inject.Inject;
 
 import com.ning.billing.beatrix.bus.api.BeatrixService;
 import com.ning.billing.beatrix.extbus.BeatrixListener;
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.lifecycle.LifecycleHandlerType;
 import com.ning.billing.lifecycle.LifecycleHandlerType.LifecycleLevel;
 
diff --git a/beatrix/src/main/java/com/ning/billing/beatrix/extbus/BeatrixListener.java b/beatrix/src/main/java/com/ning/billing/beatrix/extbus/BeatrixListener.java
index 0f76c4f..7bf044a 100644
--- a/beatrix/src/main/java/com/ning/billing/beatrix/extbus/BeatrixListener.java
+++ b/beatrix/src/main/java/com/ning/billing/beatrix/extbus/BeatrixListener.java
@@ -26,9 +26,10 @@ import org.slf4j.LoggerFactory;
 import com.ning.billing.ObjectType;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
-import com.ning.billing.bus.BusPersistentEvent;
-import com.ning.billing.bus.PersistentBus;
-import com.ning.billing.bus.PersistentBus.EventBusException;
+import com.ning.billing.bus.api.BusEvent;
+import com.ning.billing.bus.api.BusEventWithMetadata;
+import com.ning.billing.bus.api.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus.EventBusException;
 import com.ning.billing.entitlement.api.SubscriptionTransitionType;
 import com.ning.billing.notification.plugin.api.ExtBusEventType;
 import com.ning.billing.util.callcontext.CallOrigin;
@@ -82,13 +83,14 @@ public class BeatrixListener {
     }
 
     @Subscribe
-    public void handleAllInternalKillbillEvents(final BusInternalEvent event) {
+    public void handleAllInternalKillbillEvents(final BusEventWithMetadata<BusInternalEvent> eventWithMetadata) {
 
-        final InternalCallContext internalContext = internalCallContextFactory.createInternalCallContext(event.getTenantRecordId(), event.getAccountRecordId(), "BeatrixListener", CallOrigin.INTERNAL, UserType.SYSTEM, event.getUserToken());
+        final BusInternalEvent event = eventWithMetadata.getEvent();
+        final InternalCallContext internalContext = internalCallContextFactory.createInternalCallContext(eventWithMetadata.getSearchKey2(), eventWithMetadata.getSearchKey1(), "BeatrixListener", CallOrigin.INTERNAL, UserType.SYSTEM, eventWithMetadata.getUserToken());
         try {
-            final BusPersistentEvent externalEvent = computeExtBusEventEntryFromBusInternalEvent(event, internalContext);
+            final BusEvent externalEvent = computeExtBusEventEntryFromBusInternalEvent(event, internalContext);
             if (externalEvent != null) {
-                externalBus.post(externalEvent);
+                externalBus.post(externalEvent, internalContext.getUserToken(), internalContext.getAccountRecordId(), internalContext.getTenantRecordId());
             }
         } catch (EventBusException e) {
             log.warn("Failed to dispatch external bus events", e);
@@ -96,7 +98,7 @@ public class BeatrixListener {
     }
 
 
-    private BusPersistentEvent computeExtBusEventEntryFromBusInternalEvent(final BusInternalEvent event, final InternalCallContext context) {
+    private BusEvent computeExtBusEventEntryFromBusInternalEvent(final BusInternalEvent event, final InternalCallContext context) {
 
         ObjectType objectType = null;
         UUID objectId = null;
@@ -219,11 +221,11 @@ public class BeatrixListener {
             default:
         }
 
-        final UUID accountId = getAccountIdFromRecordId(event.getBusEventType(), objectId, event.getAccountRecordId(), context);
+        final UUID accountId = getAccountIdFromRecordId(event.getBusEventType(), objectId, context.getAccountRecordId(), context);
         final UUID tenantId = context.toTenantContext().getTenantId();
 
         return eventBusType != null ?
-               new DefaultBusExternalEvent(objectId, objectType, eventBusType, event.getUserToken(), accountId, tenantId) :
+               new DefaultBusExternalEvent(objectId, objectType, eventBusType, accountId, tenantId) :
                null;
     }
 
diff --git a/beatrix/src/main/java/com/ning/billing/beatrix/extbus/DefaultBusExternalEvent.java b/beatrix/src/main/java/com/ning/billing/beatrix/extbus/DefaultBusExternalEvent.java
index 5809695..8ad4e7e 100644
--- a/beatrix/src/main/java/com/ning/billing/beatrix/extbus/DefaultBusExternalEvent.java
+++ b/beatrix/src/main/java/com/ning/billing/beatrix/extbus/DefaultBusExternalEvent.java
@@ -3,15 +3,15 @@ package com.ning.billing.beatrix.extbus;
 import java.util.UUID;
 
 import com.ning.billing.ObjectType;
-import com.ning.billing.bus.BusPersistentEvent;
+import com.ning.billing.bus.api.BusEvent;
 import com.ning.billing.notification.plugin.api.ExtBusEvent;
 import com.ning.billing.notification.plugin.api.ExtBusEventType;
-import com.ning.billing.util.events.BusEventBase;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultBusExternalEvent extends BusEventBase implements ExtBusEvent, BusPersistentEvent {
+
+public class DefaultBusExternalEvent implements ExtBusEvent, BusEvent {
 
     private final UUID objectId;
     private final UUID accountId;
@@ -24,10 +24,8 @@ public class DefaultBusExternalEvent extends BusEventBase implements ExtBusEvent
     public DefaultBusExternalEvent(@JsonProperty("objectId") final UUID objectId,
                                    @JsonProperty("objectType") final ObjectType objectType,
                                    @JsonProperty("eventType") final ExtBusEventType eventType,
-                                   @JsonProperty("userToken") final UUID userToken,
                                    @JsonProperty("accountId") final UUID accountId,
                                    @JsonProperty("tenantId") final UUID tenantId) {
-        super(userToken, null, null);
         this.eventType = eventType;
         this.objectType = objectType;
         this.objectId = objectId;
diff --git a/beatrix/src/main/java/com/ning/billing/beatrix/glue/BeatrixModule.java b/beatrix/src/main/java/com/ning/billing/beatrix/glue/BeatrixModule.java
index 4a6b721..bf58455 100644
--- a/beatrix/src/main/java/com/ning/billing/beatrix/glue/BeatrixModule.java
+++ b/beatrix/src/main/java/com/ning/billing/beatrix/glue/BeatrixModule.java
@@ -21,7 +21,7 @@ import com.ning.billing.beatrix.bus.api.BeatrixService;
 import com.ning.billing.beatrix.extbus.BeatrixListener;
 import com.ning.billing.beatrix.lifecycle.DefaultLifecycle;
 import com.ning.billing.beatrix.lifecycle.Lifecycle;
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.util.glue.BusProvider;
 
 import com.google.inject.AbstractModule;
@@ -30,8 +30,9 @@ import com.google.inject.name.Names;
 
 public class BeatrixModule extends AbstractModule {
 
-    // TODO This has to match with the DLL obviously to work
+    // This has to match the DDL
     private final static String EXTERNAL_BUS_TABLE_NAME = "bus_ext_events";
+    private final static String EXTERNAL_BUS_HISTORY_TABLE_NAME = "bus_ext_events_history";
 
     public static final String EXTERNAL_BUS = "externalBus";
 
@@ -49,7 +50,7 @@ public class BeatrixModule extends AbstractModule {
         bind(BeatrixService.class).to(DefaultBeatrixService.class);
         bind(DefaultBeatrixService.class).asEagerSingleton();
 
-        bind(BusProvider.class).annotatedWith(Names.named(EXTERNAL_BUS)).toInstance(new BusProvider(EXTERNAL_BUS_TABLE_NAME));
+        bind(BusProvider.class).annotatedWith(Names.named(EXTERNAL_BUS)).toInstance(new BusProvider(EXTERNAL_BUS_TABLE_NAME, EXTERNAL_BUS_HISTORY_TABLE_NAME));
         bind(PersistentBus.class).annotatedWith(Names.named(EXTERNAL_BUS)).toProvider(Key.get(BusProvider.class, Names.named(EXTERNAL_BUS))).asEagerSingleton();
 
         bind(BeatrixListener.class).asEagerSingleton();
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/extbus/TestEventJson.java b/beatrix/src/test/java/com/ning/billing/beatrix/extbus/TestEventJson.java
index a356a70..e238290 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/extbus/TestEventJson.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/extbus/TestEventJson.java
@@ -24,7 +24,7 @@ public class TestEventJson extends BeatrixTestSuite {
         final ObjectType objectType = ObjectType.ACCOUNT;
         final ExtBusEventType extBusEventType = ExtBusEventType.ACCOUNT_CREATION;
 
-        final DefaultBusExternalEvent e = new DefaultBusExternalEvent(objectId, objectType, extBusEventType, userToken, accountId, tenantId);
+        final DefaultBusExternalEvent e = new DefaultBusExternalEvent(objectId, objectType, extBusEventType, accountId, tenantId);
         final String json = mapper.writeValueAsString(e);
 
         final Class<?> claz = Class.forName(DefaultBusExternalEvent.class.getName());
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationBase.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationBase.java
index 2b0730f..d46ba45 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationBase.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationBase.java
@@ -49,7 +49,7 @@ import com.ning.billing.beatrix.util.EntitlementChecker;
 import com.ning.billing.beatrix.util.InvoiceChecker;
 import com.ning.billing.beatrix.util.PaymentChecker;
 import com.ning.billing.beatrix.util.RefundChecker;
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
@@ -335,6 +335,7 @@ public class TestIntegrationBase extends BeatrixTestSuiteWithEmbeddedDB implemen
     }
 
     private class TestPaymentMethodPlugin extends TestPaymentMethodPluginBase {
+
         @Override
         public List<PaymentMethodKVInfo> getProperties() {
             PaymentMethodKVInfo prop = new PaymentMethodKVInfo("whatever", "cool", Boolean.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 9084606..88960ce 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
@@ -13,20 +13,20 @@
  * License for the specific language governing permissions and limitations
  * under the License.
  */
+
 package com.ning.billing.entitlement.api.timeline;
 
 import java.util.UUID;
 
 import org.joda.time.DateTime;
 
-import com.ning.billing.util.events.BusEventBase;
 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 extends BusEventBase implements RepairEntitlementInternalEvent {
+public class DefaultRepairEntitlementEvent implements RepairEntitlementInternalEvent {
 
     private final UUID bundleId;
     private final UUID accountId;
@@ -34,13 +34,9 @@ public class DefaultRepairEntitlementEvent extends BusEventBase implements Repai
 
 
     @JsonCreator
-    public DefaultRepairEntitlementEvent(@JsonProperty("userToken") final UUID userToken,
-                                         @JsonProperty("accountId") final UUID accountId,
+    public DefaultRepairEntitlementEvent(@JsonProperty("accountId") final UUID accountId,
                                          @JsonProperty("bundleId") final UUID bundleId,
-                                         @JsonProperty("effectiveDate") final DateTime effectiveDate,
-                                         @JsonProperty("accountRecordId") final Long accountRecordId,
-                                         @JsonProperty("tenantRecordId") final Long tenantRecordId) {
-        super(userToken, accountRecordId, tenantRecordId);
+                                         @JsonProperty("effectiveDate") final DateTime effectiveDate) {
         this.bundleId = bundleId;
         this.accountId = accountId;
         this.effectiveDate = effectiveDate;
@@ -72,11 +68,11 @@ public class DefaultRepairEntitlementEvent extends BusEventBase implements Repai
         final int prime = 31;
         int result = 1;
         result = prime * result
-                + ((accountId == null) ? 0 : accountId.hashCode());
+                 + ((accountId == null) ? 0 : accountId.hashCode());
         result = prime * result
-                + ((bundleId == null) ? 0 : bundleId.hashCode());
+                 + ((bundleId == null) ? 0 : bundleId.hashCode());
         result = prime * result
-                + ((effectiveDate == null) ? 0 : effectiveDate.hashCode());
+                 + ((effectiveDate == null) ? 0 : effectiveDate.hashCode());
         return result;
     }
 
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 3edab8f..be43003 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
@@ -29,7 +29,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 public class DefaultEffectiveSubscriptionEvent extends DefaultSubscriptionEvent implements EffectiveSubscriptionInternalEvent {
 
     public DefaultEffectiveSubscriptionEvent(final SubscriptionTransitionData in, final DateTime startDate, final UUID userToken, final Long accountRecordId, final Long tenantRecordId) {
-        super(in, startDate, userToken, accountRecordId, tenantRecordId);
+        super(in, startDate);
     }
 
     @JsonCreator
@@ -47,14 +47,11 @@ public class DefaultEffectiveSubscriptionEvent extends DefaultSubscriptionEvent 
                                              @JsonProperty("nextPhase") final String nextPhase,
                                              @JsonProperty("nextPriceList") final String nextPriceList,
                                              @JsonProperty("totalOrdering") final Long totalOrdering,
-                                             @JsonProperty("userToken") final UUID userToken,
                                              @JsonProperty("transitionType") final SubscriptionTransitionType transitionType,
                                              @JsonProperty("remainingEventsForUserOperation") final Integer remainingEventsForUserOperation,
-                                             @JsonProperty("startDate") final DateTime startDate,
-                                             @JsonProperty("accountRecordId") final Long accountRecordId,
-                                             @JsonProperty("tenantRecordId") final Long tenantRecordId) {
+                                             @JsonProperty("startDate") final DateTime startDate) {
         super(eventId, subscriptionId, bundleId, requestedTransitionTime, effectiveTransitionTime, previousState, previousPlan,
-              previousPhase, previousPriceList, nextState, nextPlan, nextPhase, nextPriceList, totalOrdering, userToken,
-              transitionType, remainingEventsForUserOperation, startDate, accountRecordId, tenantRecordId);
+              previousPhase, previousPriceList, nextState, nextPlan, nextPhase, nextPriceList, totalOrdering,
+              transitionType, remainingEventsForUserOperation, 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 7f834d8..4c4ebab 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
@@ -28,8 +28,9 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class DefaultRequestedSubscriptionEvent extends DefaultSubscriptionEvent implements RequestedSubscriptionInternalEvent {
-    public DefaultRequestedSubscriptionEvent(final SubscriptionTransitionData in, final DateTime startDate, final UUID userToken, final Long accountRecordId, final Long tenantRecordId) {
-        super(in, startDate, userToken, accountRecordId, tenantRecordId);
+
+    public DefaultRequestedSubscriptionEvent(final SubscriptionTransitionData in, final DateTime startDate) {
+        super(in, startDate);
     }
 
     @JsonCreator
@@ -47,19 +48,16 @@ public class DefaultRequestedSubscriptionEvent extends DefaultSubscriptionEvent 
                                              @JsonProperty("nextPhase") final String nextPhase,
                                              @JsonProperty("nextPriceList") final String nextPriceList,
                                              @JsonProperty("totalOrdering") final Long totalOrdering,
-                                             @JsonProperty("userToken") final UUID userToken,
                                              @JsonProperty("transitionType") final SubscriptionTransitionType transitionType,
                                              @JsonProperty("remainingEventsForUserOperation") final Integer remainingEventsForUserOperation,
-                                             @JsonProperty("startDate") final DateTime startDate,
-                                             @JsonProperty("accountRecordId") final Long accountRecordId,
-                                             @JsonProperty("tenantRecordId") final Long tenantRecordId) {
+                                             @JsonProperty("startDate") final DateTime startDate) {
         super(eventId, subscriptionId, bundleId, requestedTransitionTime, effectiveTransitionTime, previousState, previousPlan,
-              previousPhase, previousPriceList, nextState, nextPlan, nextPhase, nextPriceList, totalOrdering, userToken,
-              transitionType, remainingEventsForUserOperation, startDate, accountRecordId, tenantRecordId);
+              previousPhase, previousPriceList, nextState, nextPlan, nextPhase, nextPriceList, totalOrdering,
+              transitionType, remainingEventsForUserOperation, startDate);
     }
 
-    public DefaultRequestedSubscriptionEvent(final SubscriptionData subscription, final EntitlementEvent nextEvent, final Long accountRecordId, final Long tenantRecordId) {
+    public DefaultRequestedSubscriptionEvent(final SubscriptionData subscription, final EntitlementEvent nextEvent) {
         this(nextEvent.getId(), nextEvent.getSubscriptionId(), subscription.getBundleId(), nextEvent.getRequestedDate(), nextEvent.getEffectiveDate(),
-             null, null, null, null, null, null, null, null, nextEvent.getTotalOrdering(), null, null, 0, null, accountRecordId, tenantRecordId);
+             null, null, null, null, null, null, null, null, nextEvent.getTotalOrdering(), null, 0, null);
     }
 }
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 9c740c2..f75505a 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,14 +21,13 @@ import java.util.UUID;
 import org.joda.time.DateTime;
 
 import com.ning.billing.entitlement.api.SubscriptionTransitionType;
-import com.ning.billing.util.events.BusEventBase;
 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 extends BusEventBase implements SubscriptionInternalEvent {
+public abstract class DefaultSubscriptionEvent implements SubscriptionInternalEvent {
 
     private final Long totalOrdering;
     private final UUID subscriptionId;
@@ -48,7 +47,7 @@ public abstract class DefaultSubscriptionEvent extends BusEventBase implements S
     private final SubscriptionTransitionType transitionType;
     private final DateTime startDate;
 
-    public DefaultSubscriptionEvent(final SubscriptionTransitionData in, final DateTime startDate, final UUID userToken, final Long accountRecordId, final Long tenantRecordId) {
+    public DefaultSubscriptionEvent(final SubscriptionTransitionData in, final DateTime startDate) {
         this(in.getId(),
              in.getSubscriptionId(),
              in.getBundleId(),
@@ -63,12 +62,9 @@ public abstract class DefaultSubscriptionEvent extends BusEventBase implements S
              (in.getNextPhase() != null) ? in.getNextPhase().getName() : null,
              (in.getNextPriceList() != null) ? in.getNextPriceList().getName() : null,
              in.getTotalOrdering(),
-             userToken,
              in.getTransitionType(),
              in.getRemainingEventsForUserOperation(),
-             startDate,
-             accountRecordId,
-             tenantRecordId);
+             startDate);
     }
 
     @JsonCreator
@@ -86,13 +82,9 @@ public abstract class DefaultSubscriptionEvent extends BusEventBase implements S
                                     @JsonProperty("nextPhase") final String nextPhase,
                                     @JsonProperty("nextPriceList") final String nextPriceList,
                                     @JsonProperty("totalOrdering") final Long totalOrdering,
-                                    @JsonProperty("userToken") final UUID userToken,
                                     @JsonProperty("transitionType") final SubscriptionTransitionType transitionType,
                                     @JsonProperty("remainingEventsForUserOperation") final Integer remainingEventsForUserOperation,
-                                    @JsonProperty("startDate") final DateTime startDate,
-                                    @JsonProperty("accountRecordId") final Long accountRecordId,
-                                    @JsonProperty("tenantRecordId") final Long tenantRecordId) {
-        super(userToken, accountRecordId, tenantRecordId);
+                                    @JsonProperty("startDate") final DateTime startDate) {
         this.eventId = eventId;
         this.subscriptionId = subscriptionId;
         this.bundleId = bundleId;
@@ -224,7 +216,6 @@ public abstract class DefaultSubscriptionEvent extends BusEventBase implements S
         sb.append(", nextPlan='").append(nextPlan).append('\'');
         sb.append(", nextPhase='").append(nextPhase).append('\'');
         sb.append(", remainingEventsForUserOperation=").append(remainingEventsForUserOperation);
-        sb.append(", userToken=").append(getUserToken());
         sb.append(", transitionType=").append(transitionType);
         sb.append(", startDate=").append(startDate);
         sb.append('}');
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/Engine.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/Engine.java
index 22e100b..43f3be4 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/Engine.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/Engine.java
@@ -22,8 +22,8 @@ import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.ning.billing.bus.PersistentBus;
-import com.ning.billing.bus.PersistentBus.EventBusException;
+import com.ning.billing.bus.api.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus.EventBusException;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.entitlement.alignment.PlanAligner;
 import com.ning.billing.entitlement.alignment.TimedPhase;
@@ -42,12 +42,12 @@ import com.ning.billing.entitlement.events.user.ApiEvent;
 import com.ning.billing.entitlement.exceptions.EntitlementError;
 import com.ning.billing.lifecycle.LifecycleHandlerType;
 import com.ning.billing.lifecycle.LifecycleHandlerType.LifecycleLevel;
-import com.ning.billing.notificationq.NotificationKey;
-import com.ning.billing.notificationq.NotificationQueue;
-import com.ning.billing.notificationq.NotificationQueueService;
-import com.ning.billing.notificationq.NotificationQueueService.NoSuchNotificationQueue;
-import com.ning.billing.notificationq.NotificationQueueService.NotificationQueueAlreadyExists;
-import com.ning.billing.notificationq.NotificationQueueService.NotificationQueueHandler;
+import com.ning.billing.notificationq.api.NotificationEvent;
+import com.ning.billing.notificationq.api.NotificationQueue;
+import com.ning.billing.notificationq.api.NotificationQueueService;
+import com.ning.billing.notificationq.api.NotificationQueueService.NoSuchNotificationQueue;
+import com.ning.billing.notificationq.api.NotificationQueueService.NotificationQueueAlreadyExists;
+import com.ning.billing.notificationq.api.NotificationQueueService.NotificationQueueHandler;
 import com.ning.billing.util.callcontext.CallOrigin;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
@@ -100,7 +100,7 @@ public class Engine implements EventListener, EntitlementService {
         try {
             final NotificationQueueHandler queueHandler = new NotificationQueueHandler() {
                 @Override
-                public void handleReadyNotification(final NotificationKey inputKey, final DateTime eventDateTime, final UUID fromNotificationQueueUserToken, final Long accountRecordId, final Long tenantRecordId) {
+                public void handleReadyNotification(final NotificationEvent inputKey, final DateTime eventDateTime, final UUID fromNotificationQueueUserToken, final Long accountRecordId, final Long tenantRecordId) {
                     if (!(inputKey instanceof EntitlementNotificationKey)) {
                         log.error("Entitlement service received an unexpected event type {}" + inputKey.getClass().getName());
                         return;
@@ -171,7 +171,7 @@ public class Engine implements EventListener, EntitlementService {
             final EffectiveSubscriptionInternalEvent busEvent = new DefaultEffectiveSubscriptionEvent(transition, subscription.getAlignStartDate(),
                                                                                                       context.getUserToken(),
                                                                                                       context.getAccountRecordId(), context.getTenantRecordId());
-            eventBus.post(busEvent);
+            eventBus.post(busEvent, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
         } catch (EventBusException e) {
             log.warn("Failed to post entitlement event " + event, e);
         }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/EntitlementNotificationKey.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/EntitlementNotificationKey.java
index 1a98751..7af591c 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/EntitlementNotificationKey.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/EntitlementNotificationKey.java
@@ -18,12 +18,12 @@ package com.ning.billing.entitlement.engine.core;
 
 import java.util.UUID;
 
-import com.ning.billing.notificationq.NotificationKey;
+import com.ning.billing.notificationq.api.NotificationEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class EntitlementNotificationKey implements NotificationKey {
+public class EntitlementNotificationKey implements NotificationEvent {
 
     private final UUID eventId;
     private final int seqId;
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/DefaultEntitlementDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/DefaultEntitlementDao.java
index 342ef63..4f0fde7 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/DefaultEntitlementDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/DefaultEntitlementDao.java
@@ -37,8 +37,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.ning.billing.ErrorCode;
-import com.ning.billing.bus.PersistentBus;
-import com.ning.billing.bus.PersistentBus.EventBusException;
+import com.ning.billing.bus.api.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus.EventBusException;
 import com.ning.billing.catalog.api.CatalogService;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.ProductCategory;
@@ -72,10 +72,10 @@ import com.ning.billing.entitlement.events.user.ApiEventChange;
 import com.ning.billing.entitlement.events.user.ApiEventMigrateBilling;
 import com.ning.billing.entitlement.events.user.ApiEventType;
 import com.ning.billing.entitlement.exceptions.EntitlementError;
-import com.ning.billing.notificationq.NotificationKey;
-import com.ning.billing.notificationq.NotificationQueue;
-import com.ning.billing.notificationq.NotificationQueueService;
-import com.ning.billing.notificationq.NotificationQueueService.NoSuchNotificationQueue;
+import com.ning.billing.notificationq.api.NotificationEvent;
+import com.ning.billing.notificationq.api.NotificationQueue;
+import com.ning.billing.notificationq.api.NotificationQueueService;
+import com.ning.billing.notificationq.api.NotificationQueueService.NoSuchNotificationQueue;
 import com.ning.billing.util.cache.CacheControllerDispatcher;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
@@ -829,9 +829,8 @@ public class DefaultEntitlementDao implements EntitlementDao {
 
                 try {
                     // Note: we don't send a requested change event here, but a repair event
-                    final RepairEntitlementInternalEvent busEvent = new DefaultRepairEntitlementEvent(context.getUserToken(), accountId, bundleId, clock.getUTCNow(),
-                                                                                                      context.getAccountRecordId(), context.getTenantRecordId());
-                    eventBus.postFromTransaction(busEvent, entitySqlDaoWrapperFactory.getSqlDao());
+                    final RepairEntitlementInternalEvent busEvent = new DefaultRepairEntitlementEvent(accountId, bundleId, clock.getUTCNow());
+                    eventBus.postFromTransaction(busEvent, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId(), entitySqlDaoWrapperFactory.getSqlDao());
                 } catch (EventBusException e) {
                     log.warn("Failed to post repair entitlement event for bundle " + bundleId, e);
                 }
@@ -911,7 +910,7 @@ public class DefaultEntitlementDao implements EntitlementDao {
                                                                                                       context.getAccountRecordId(), context.getTenantRecordId());
 
 
-            eventBus.postFromTransaction(busEvent, entitySqlDaoWrapperFactory.getSqlDao());
+            eventBus.postFromTransaction(busEvent, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId(), entitySqlDaoWrapperFactory.getSqlDao());
         } catch (EventBusException e) {
             log.warn("Failed to post effective event for subscription " + subscription.getId(), e);
         }
@@ -920,18 +919,18 @@ public class DefaultEntitlementDao implements EntitlementDao {
     private void notifyBusOfRequestedChange(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory, final SubscriptionData subscription,
                                             final EntitlementEvent nextEvent, final InternalCallContext context) {
         try {
-            eventBus.postFromTransaction(new DefaultRequestedSubscriptionEvent(subscription, nextEvent, context.getAccountRecordId(), context.getTenantRecordId()), entitySqlDaoWrapperFactory.getSqlDao());
+            eventBus.postFromTransaction(new DefaultRequestedSubscriptionEvent(subscription, nextEvent), context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId(), entitySqlDaoWrapperFactory.getSqlDao());
         } catch (EventBusException e) {
             log.warn("Failed to post requested change event for subscription " + subscription.getId(), e);
         }
     }
 
     private void recordFutureNotificationFromTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory, final DateTime effectiveDate,
-                                                         final NotificationKey notificationKey, final InternalCallContext context) {
+                                                         final NotificationEvent notificationKey, final InternalCallContext context) {
         try {
             final NotificationQueue subscriptionEventQueue = notificationQueueService.getNotificationQueue(Engine.ENTITLEMENT_SERVICE_NAME,
                                                                                                            Engine.NOTIFICATION_QUEUE_NAME);
-             subscriptionEventQueue.recordFutureNotificationFromTransaction(entitySqlDaoWrapperFactory.getSqlDao(), effectiveDate, notificationKey, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
+            subscriptionEventQueue.recordFutureNotificationFromTransaction(entitySqlDaoWrapperFactory.getSqlDao(), effectiveDate, notificationKey, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
         } catch (NoSuchNotificationQueue e) {
             throw new RuntimeException(e);
         } catch (IOException e) {
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 f2f73c5..a19a720 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
@@ -30,7 +30,7 @@ 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 GuicyKillbillTestSuiteNoDB  {
+public class TestEventJson extends GuicyKillbillTestSuiteNoDB {
 
     private final ObjectMapper mapper = new ObjectMapper();
 
@@ -38,8 +38,8 @@ public class TestEventJson extends GuicyKillbillTestSuiteNoDB  {
     public void testSubscriptionEvent() throws Exception {
 
         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(), 1L, 1L);
+                                                                                           SubscriptionState.ACTIVE, "pro", "TRIAL", "DEFAULT", SubscriptionState.CANCELLED, null, null, null, 3L,
+                                                                                           SubscriptionTransitionType.CANCEL, 0, new DateTime());
 
         final String json = mapper.writeValueAsString(e);
 
@@ -50,7 +50,7 @@ public class TestEventJson extends GuicyKillbillTestSuiteNoDB  {
 
     @Test(groups = "fast")
     public void testRepairEntitlementEvent() throws Exception {
-        final RepairEntitlementInternalEvent e = new DefaultRepairEntitlementEvent(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), new DateTime(), 1L, 1L);
+        final RepairEntitlementInternalEvent e = new DefaultRepairEntitlementEvent(UUID.randomUUID(), UUID.randomUUID(), new DateTime());
 
         final String json = mapper.writeValueAsString(e);
 
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoMemory.java b/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoMemory.java
index f33c15f..17c27f2 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoMemory.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoMemory.java
@@ -49,10 +49,10 @@ import com.ning.billing.entitlement.events.EntitlementEvent;
 import com.ning.billing.entitlement.events.EntitlementEvent.EventType;
 import com.ning.billing.entitlement.events.user.ApiEvent;
 import com.ning.billing.entitlement.events.user.ApiEventType;
-import com.ning.billing.notificationq.NotificationKey;
-import com.ning.billing.notificationq.NotificationQueue;
-import com.ning.billing.notificationq.NotificationQueueService;
-import com.ning.billing.notificationq.NotificationQueueService.NoSuchNotificationQueue;
+import com.ning.billing.notificationq.api.NotificationEvent;
+import com.ning.billing.notificationq.api.NotificationQueue;
+import com.ning.billing.notificationq.api.NotificationQueueService;
+import com.ning.billing.notificationq.api.NotificationQueueService.NoSuchNotificationQueue;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.clock.Clock;
@@ -413,7 +413,7 @@ public class MockEntitlementDaoMemory implements EntitlementDao {
     }
 
     private void recordFutureNotificationFromTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> transactionalDao, final DateTime effectiveDate,
-                                                         final NotificationKey notificationKey, final InternalCallContext context) {
+                                                         final NotificationEvent notificationKey, final InternalCallContext context) {
         try {
             final NotificationQueue subscriptionEventQueue = notificationQueueService.getNotificationQueue(Engine.ENTITLEMENT_SERVICE_NAME,
                                                                                                            Engine.NOTIFICATION_QUEUE_NAME);
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoSql.java b/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoSql.java
index ca7e005..ac96f48 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoSql.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoSql.java
@@ -18,10 +18,10 @@ package com.ning.billing.entitlement.engine.dao;
 
 import org.skife.jdbi.v2.IDBI;
 
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.catalog.api.CatalogService;
 import com.ning.billing.entitlement.engine.addon.AddonUtils;
-import com.ning.billing.notificationq.NotificationQueueService;
+import com.ning.billing.notificationq.api.NotificationQueueService;
 import com.ning.billing.util.cache.CacheControllerDispatcher;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.dao.NonEntityDao;
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/glue/TestEngineModuleNoDB.java b/entitlement/src/test/java/com/ning/billing/entitlement/glue/TestEngineModuleNoDB.java
index e0c25a3..0ce5465 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/glue/TestEngineModuleNoDB.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/glue/TestEngineModuleNoDB.java
@@ -26,8 +26,8 @@ import com.ning.billing.entitlement.engine.dao.MockEntitlementDaoMemory;
 import com.ning.billing.entitlement.engine.dao.RepairEntitlementDao;
 import com.ning.billing.mock.glue.MockNonEntityDaoModule;
 import com.ning.billing.notificationq.MockNotificationQueueService;
-import com.ning.billing.notificationq.NotificationQueueConfig;
-import com.ning.billing.notificationq.NotificationQueueService;
+import com.ning.billing.notificationq.api.NotificationQueueConfig;
+import com.ning.billing.notificationq.api.NotificationQueueService;
 import com.ning.billing.util.bus.InMemoryBusModule;
 
 import com.google.inject.name.Names;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/DefaultInvoiceService.java b/invoice/src/main/java/com/ning/billing/invoice/api/DefaultInvoiceService.java
index b7a91aa..6d354b5 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/DefaultInvoiceService.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/DefaultInvoiceService.java
@@ -16,14 +16,14 @@
 
 package com.ning.billing.invoice.api;
 
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.invoice.InvoiceListener;
 import com.ning.billing.invoice.InvoiceTagHandler;
 import com.ning.billing.invoice.notification.NextBillingDateNotifier;
 import com.ning.billing.lifecycle.LifecycleHandlerType;
 import com.ning.billing.lifecycle.LifecycleHandlerType.LifecycleLevel;
-import com.ning.billing.notificationq.NotificationQueueService.NoSuchNotificationQueue;
-import com.ning.billing.notificationq.NotificationQueueService.NotificationQueueAlreadyExists;
+import com.ning.billing.notificationq.api.NotificationQueueService.NoSuchNotificationQueue;
+import com.ning.billing.notificationq.api.NotificationQueueService.NotificationQueueAlreadyExists;
 
 import com.google.inject.Inject;
 
@@ -69,7 +69,7 @@ public class DefaultInvoiceService implements InvoiceService {
         try {
             eventBus.unregister(invoiceListener);
             eventBus.unregister(tagHandler);
-        } catch (PersistentBus .EventBusException e) {
+        } catch (PersistentBus.EventBusException e) {
             throw new RuntimeException("Unable to unregister to the EventBus!", e);
         }
         dateNotifier.stop();
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 0c780ad..56a5428 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,25 +18,20 @@ package com.ning.billing.invoice.api.user;
 
 import java.util.UUID;
 
-import com.ning.billing.util.events.BusEventBase;
 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 extends BusEventBase implements InvoiceAdjustmentInternalEvent {
+public class DefaultInvoiceAdjustmentEvent implements InvoiceAdjustmentInternalEvent {
 
     private final UUID invoiceId;
     private final UUID accountId;
 
     @JsonCreator
     public DefaultInvoiceAdjustmentEvent(@JsonProperty("invoiceId") final UUID invoiceId,
-                                         @JsonProperty("accountId") final UUID accountId,
-                                         @JsonProperty("userToken") final UUID userToken,
-                                         @JsonProperty("accountRecordId") final Long accountRecordId,
-                                         @JsonProperty("tenantRecordId") final Long tenantRecordId) {
-        super(userToken, accountRecordId, tenantRecordId);
+                                         @JsonProperty("accountId") final UUID accountId) {
         this.invoiceId = invoiceId;
         this.accountId = 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 caa08af..bd3dc43 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,14 +20,13 @@ import java.math.BigDecimal;
 import java.util.UUID;
 
 import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.util.events.BusEventBase;
 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 extends BusEventBase implements InvoiceCreationInternalEvent {
+public class DefaultInvoiceCreationEvent implements InvoiceCreationInternalEvent {
 
     private final UUID invoiceId;
     private final UUID accountId;
@@ -38,11 +37,7 @@ public class DefaultInvoiceCreationEvent extends BusEventBase implements Invoice
     public DefaultInvoiceCreationEvent(@JsonProperty("invoiceId") final UUID invoiceId,
                                        @JsonProperty("accountId") final UUID accountId,
                                        @JsonProperty("amountOwed") final BigDecimal amountOwed,
-                                       @JsonProperty("currency") final Currency currency,
-                                       @JsonProperty("userToken") final UUID userToken,
-                                       @JsonProperty("accountRecordId") final Long accountRecordId,
-                                       @JsonProperty("tenantRecordId") final Long tenantRecordId) {
-        super(userToken, accountRecordId, tenantRecordId);
+                                       @JsonProperty("currency") final Currency currency) {
         this.invoiceId = invoiceId;
         this.accountId = accountId;
         this.amountOwed = amountOwed;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
index de616ea..26d90da 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
@@ -32,8 +32,8 @@ import com.ning.billing.ErrorCode;
 import com.ning.billing.ObjectType;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
-import com.ning.billing.bus.PersistentBus;
-import com.ning.billing.bus.PersistentBus.EventBusException;
+import com.ning.billing.bus.api.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus.EventBusException;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.InvoiceDispatcher;
 import com.ning.billing.invoice.api.Invoice;
@@ -312,7 +312,7 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
 
     private void notifyBusOfInvoiceAdjustment(final UUID invoiceId, final UUID accountId, final InternalCallContext context) {
         try {
-            eventBus.post(new DefaultInvoiceAdjustmentEvent(invoiceId, accountId, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId()));
+            eventBus.post(new DefaultInvoiceAdjustmentEvent(invoiceId, accountId), context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
         } catch (EventBusException e) {
             log.warn("Failed to post adjustment event for invoice " + invoiceId, e);
         }
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 9d646e8..87875d6 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,27 +20,23 @@ import java.util.UUID;
 
 import org.joda.time.LocalDate;
 
-import com.ning.billing.util.events.BusEventBase;
 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 extends BusEventBase implements NullInvoiceInternalEvent {
+public class DefaultNullInvoiceEvent implements NullInvoiceInternalEvent {
 
     private final UUID accountId;
     private final LocalDate processingDate;
 
     @JsonCreator
     public DefaultNullInvoiceEvent(@JsonProperty("accountId") final UUID accountId,
-                                   @JsonProperty("processingDate") final LocalDate processingDate,
-                                   @JsonProperty("userToken") final UUID userToken,
-                                   @JsonProperty("accountRecordId") final Long accountRecordId,
-                                   @JsonProperty("tenantRecordId") final Long tenantRecordId) {
-        super(userToken, accountRecordId, tenantRecordId);
+                                   @JsonProperty("processingDate") final LocalDate processingDate) {
         this.accountId = accountId;
         this.processingDate = processingDate;
+
     }
 
     @JsonIgnore
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
index a2dcf4a..a978b7e 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
@@ -30,8 +30,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.ning.billing.ErrorCode;
-import com.ning.billing.bus.PersistentBus;
-import com.ning.billing.bus.PersistentBus.EventBusException;
+import com.ning.billing.bus.api.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus.EventBusException;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
@@ -710,7 +710,7 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
     private void notifyBusOfInvoiceAdjustment(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory, final UUID invoiceId, final UUID accountId,
                                               final UUID userToken, final InternalCallContext context) {
         try {
-            eventBus.postFromTransaction(new DefaultInvoiceAdjustmentEvent(invoiceId, accountId, userToken, context.getAccountRecordId(), context.getTenantRecordId()),
+            eventBus.postFromTransaction(new DefaultInvoiceAdjustmentEvent(invoiceId, accountId), userToken, context.getAccountRecordId(), context.getTenantRecordId(),
                                          entitySqlDaoWrapperFactory.getSqlDao());
         } catch (EventBusException e) {
             log.warn("Failed to post adjustment event for invoice " + invoiceId, e);
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 e901f0a..9e2a4e6 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
@@ -38,8 +38,8 @@ 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.bus.PersistentBus;
-import com.ning.billing.bus.PersistentBus.EventBusException;
+import com.ning.billing.bus.api.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus.EventBusException;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.invoice.api.Invoice;
@@ -187,8 +187,7 @@ public class InvoiceDispatcher {
             if (invoice == null) {
                 log.info("Generated null invoice for accountId {} and targetDate {} (targetDateTime {})", new Object[]{accountId, targetDate, targetDateTime});
                 if (!dryRun) {
-                    final BusInternalEvent event = new DefaultNullInvoiceEvent(accountId, clock.getUTCToday(), context.getUserToken(),
-                                                                               context.getAccountRecordId(), context.getTenantRecordId());
+                    final BusInternalEvent event = new DefaultNullInvoiceEvent(accountId, clock.getUTCToday());
                     postEvent(event, accountId, context);
                 }
             } else {
@@ -236,13 +235,10 @@ public class InvoiceDispatcher {
                     final List<InvoiceInternalEvent> events = new ArrayList<InvoiceInternalEvent>();
                     if (isRealInvoiceWithItems) {
                         events.add(new DefaultInvoiceCreationEvent(invoice.getId(), invoice.getAccountId(),
-                                                                   invoice.getBalance(), invoice.getCurrency(),
-                                                                   context.getUserToken(),
-                                                                   context.getAccountRecordId(),
-                                                                   context.getTenantRecordId()));
+                                                                   invoice.getBalance(), invoice.getCurrency()));
                     }
                     for (UUID cur : adjustedUniqueOtherInvoiceId) {
-                        final InvoiceAdjustmentInternalEvent event = new DefaultInvoiceAdjustmentEvent(cur, invoice.getAccountId(), context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
+                        final InvoiceAdjustmentInternalEvent event = new DefaultInvoiceAdjustmentEvent(cur, invoice.getAccountId());
                         events.add(event);
                     }
 
@@ -304,7 +300,7 @@ public class InvoiceDispatcher {
 
     private void postEvent(final BusInternalEvent event, final UUID accountId, final InternalCallContext context) {
         try {
-            eventBus.post(event);
+            eventBus.post(event, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
         } catch (EventBusException e) {
             log.error(String.format("Failed to post event %s for account %s", event.getBusEventType(), accountId), 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 a7161d5..da8e9e7 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
@@ -22,6 +22,7 @@ import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.ning.billing.bus.api.BusEventWithMetadata;
 import com.ning.billing.entitlement.api.SubscriptionTransitionType;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.util.callcontext.CallOrigin;
@@ -47,9 +48,11 @@ public class InvoiceListener {
     }
 
     @Subscribe
-    public void handleRepairEntitlementEvent(final RepairEntitlementInternalEvent repairEvent) {
+    public void handleRepairEntitlementEvent(final BusEventWithMetadata<RepairEntitlementInternalEvent> eventWithMetadata) {
+
+        final RepairEntitlementInternalEvent repairEvent = eventWithMetadata.getEvent();
         try {
-            final InternalCallContext context = internalCallContextFactory.createInternalCallContext(repairEvent.getTenantRecordId(), repairEvent.getAccountRecordId(), "RepairBundle", CallOrigin.INTERNAL, UserType.SYSTEM, repairEvent.getUserToken());
+            final InternalCallContext context = internalCallContextFactory.createInternalCallContext(eventWithMetadata.getSearchKey2(), eventWithMetadata.getSearchKey1(), "RepairBundle", CallOrigin.INTERNAL, UserType.SYSTEM, eventWithMetadata.getUserToken());
             dispatcher.processAccount(repairEvent.getAccountId(), repairEvent.getEffectiveDate(), false, context);
         } catch (InvoiceApiException e) {
             log.error(e.getMessage());
@@ -57,7 +60,9 @@ public class InvoiceListener {
     }
 
     @Subscribe
-    public void handleSubscriptionTransition(final EffectiveSubscriptionInternalEvent transition) {
+    public void handleSubscriptionTransition(final BusEventWithMetadata<EffectiveSubscriptionInternalEvent> eventWithMetadata) {
+
+        final EffectiveSubscriptionInternalEvent transition = eventWithMetadata.getEvent();
         try {
             //  Skip future uncancel event
             //  Skip events which are marked as not being the last one
@@ -66,7 +71,7 @@ public class InvoiceListener {
                 || transition.getRemainingEventsForUserOperation() > 0) {
                 return;
             }
-            final InternalCallContext context = internalCallContextFactory.createInternalCallContext(transition.getTenantRecordId(), transition.getAccountRecordId(), "SubscriptionTransition", CallOrigin.INTERNAL, UserType.SYSTEM, transition.getUserToken());
+            final InternalCallContext context = internalCallContextFactory.createInternalCallContext(eventWithMetadata.getSearchKey2(), eventWithMetadata.getSearchKey1(), "SubscriptionTransition", CallOrigin.INTERNAL, UserType.SYSTEM, eventWithMetadata.getUserToken());
             dispatcher.processSubscription(transition, context);
         } catch (InvoiceApiException e) {
             log.error(e.getMessage());
diff --git a/invoice/src/main/java/com/ning/billing/invoice/InvoiceTagHandler.java b/invoice/src/main/java/com/ning/billing/invoice/InvoiceTagHandler.java
index d7b0758..04e9a81 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceTagHandler.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceTagHandler.java
@@ -22,6 +22,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.ning.billing.ObjectType;
+import com.ning.billing.bus.api.BusEventWithMetadata;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.util.callcontext.CallOrigin;
 import com.ning.billing.util.callcontext.InternalCallContext;
@@ -52,10 +53,12 @@ public class InvoiceTagHandler {
     }
 
     @Subscribe
-    public void process_AUTO_INVOICING_OFF_removal(final ControlTagDeletionInternalEvent event) {
+    public void process_AUTO_INVOICING_OFF_removal(final BusEventWithMetadata<ControlTagDeletionInternalEvent> eventWithMetadata) {
+
+        final ControlTagDeletionInternalEvent event = eventWithMetadata.getEvent();
         if (event.getTagDefinition().getName().equals(ControlTagType.AUTO_INVOICING_OFF.toString()) && event.getObjectType() == ObjectType.ACCOUNT) {
             final UUID accountId = event.getObjectId();
-            final InternalCallContext context = internalCallContextFactory.createInternalCallContext(event.getTenantRecordId(), event.getAccountRecordId(), "InvoiceTagHandler", CallOrigin.INTERNAL, UserType.SYSTEM, event.getUserToken());
+            final InternalCallContext context = internalCallContextFactory.createInternalCallContext(eventWithMetadata.getSearchKey2(), eventWithMetadata.getSearchKey1(), "InvoiceTagHandler", CallOrigin.INTERNAL, UserType.SYSTEM, eventWithMetadata.getUserToken());
             processUnpaid_AUTO_INVOICING_OFF_invoices(accountId, context);
         }
     }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java b/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java
index abe263a..3d53c2f 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java
@@ -26,12 +26,12 @@ import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.invoice.InvoiceListener;
 import com.ning.billing.invoice.api.DefaultInvoiceService;
-import com.ning.billing.notificationq.NotificationKey;
-import com.ning.billing.notificationq.NotificationQueue;
-import com.ning.billing.notificationq.NotificationQueueService;
-import com.ning.billing.notificationq.NotificationQueueService.NoSuchNotificationQueue;
-import com.ning.billing.notificationq.NotificationQueueService.NotificationQueueAlreadyExists;
-import com.ning.billing.notificationq.NotificationQueueService.NotificationQueueHandler;
+import com.ning.billing.notificationq.api.NotificationEvent;
+import com.ning.billing.notificationq.api.NotificationQueue;
+import com.ning.billing.notificationq.api.NotificationQueueService;
+import com.ning.billing.notificationq.api.NotificationQueueService.NoSuchNotificationQueue;
+import com.ning.billing.notificationq.api.NotificationQueueService.NotificationQueueAlreadyExists;
+import com.ning.billing.notificationq.api.NotificationQueueService.NotificationQueueHandler;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.config.InvoiceConfig;
 import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
@@ -70,7 +70,7 @@ public class DefaultNextBillingDateNotifier implements NextBillingDateNotifier {
 
         final NotificationQueueHandler notificationQueueHandler = new NotificationQueueHandler() {
             @Override
-            public void handleReadyNotification(final NotificationKey notificationKey, final DateTime eventDate, final UUID userToken, final Long accountRecordId, final Long tenantRecordId) {
+            public void handleReadyNotification(final NotificationEvent notificationKey, final DateTime eventDate, final UUID userToken, final Long accountRecordId, final Long tenantRecordId) {
                 try {
                     if (!(notificationKey instanceof NextBillingDateNotificationKey)) {
                         log.error("Invoice service received an unexpected event type {}", notificationKey.getClass().getName());
diff --git a/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDatePoster.java b/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDatePoster.java
index 32ba48c..517c08c 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDatePoster.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDatePoster.java
@@ -24,9 +24,9 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.ning.billing.invoice.api.DefaultInvoiceService;
-import com.ning.billing.notificationq.NotificationQueue;
-import com.ning.billing.notificationq.NotificationQueueService;
-import com.ning.billing.notificationq.NotificationQueueService.NoSuchNotificationQueue;
+import com.ning.billing.notificationq.api.NotificationQueue;
+import com.ning.billing.notificationq.api.NotificationQueueService;
+import com.ning.billing.notificationq.api.NotificationQueueService.NoSuchNotificationQueue;
 import com.ning.billing.util.callcontext.CallOrigin;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/notification/NextBillingDateNotifier.java b/invoice/src/main/java/com/ning/billing/invoice/notification/NextBillingDateNotifier.java
index dacb5b7..9b5c1f7 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/notification/NextBillingDateNotifier.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/notification/NextBillingDateNotifier.java
@@ -16,12 +16,12 @@
 
 package com.ning.billing.invoice.notification;
 
-import com.ning.billing.notificationq.NotificationQueueService.NoSuchNotificationQueue;
-import com.ning.billing.notificationq.NotificationQueueService.NotificationQueueAlreadyExists;
+import com.ning.billing.notificationq.api.NotificationQueueService.NoSuchNotificationQueue;
+import com.ning.billing.notificationq.api.NotificationQueueService.NotificationQueueAlreadyExists;
 
 public interface NextBillingDateNotifier {
 
-    public void initialize() throws NotificationQueueAlreadyExists;
+    public void initialize() throws NotificationQueueAlreadyExists, NotificationQueueAlreadyExists;
 
     public void start();
 
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 111d787..afb5cc4 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
@@ -35,7 +35,7 @@ public class TestEventJson extends InvoiceTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testInvoiceCreationEvent() throws Exception {
-        final InvoiceCreationInternalEvent e = new DefaultInvoiceCreationEvent(UUID.randomUUID(), UUID.randomUUID(), new BigDecimal(12.0), Currency.USD, UUID.randomUUID(), 1L, 1L);
+        final InvoiceCreationInternalEvent e = new DefaultInvoiceCreationEvent(UUID.randomUUID(), UUID.randomUUID(), new BigDecimal(12.0), Currency.USD);
         final String json = mapper.writeValueAsString(e);
 
         final Object obj = mapper.readValue(json, DefaultInvoiceCreationEvent.class);
@@ -44,7 +44,7 @@ public class TestEventJson extends InvoiceTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testEmptyInvoiceEvent() throws Exception {
-        final NullInvoiceInternalEvent e = new DefaultNullInvoiceEvent(UUID.randomUUID(), new LocalDate(), UUID.randomUUID(), 1L, 1L);
+        final NullInvoiceInternalEvent e = new DefaultNullInvoiceEvent(UUID.randomUUID(), new LocalDate());
         final String json = mapper.writeValueAsString(e);
 
         final Object obj = mapper.readValue(json, DefaultNullInvoiceEvent.class);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
index c9df7af..dc3aaaf 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
@@ -29,7 +29,7 @@ import javax.annotation.Nullable;
 import org.joda.time.DateTime;
 import org.joda.time.LocalDate;
 
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.user.DefaultInvoiceCreationEvent;
@@ -65,8 +65,8 @@ public class MockInvoiceDao implements InvoiceDao {
         }
         try {
             eventBus.post(new DefaultInvoiceCreationEvent(invoice.getId(), invoice.getAccountId(),
-                                                          InvoiceModelDaoHelper.getBalance(invoice), invoice.getCurrency(),
-                                                          null, 1L, 1L));
+                                                          InvoiceModelDaoHelper.getBalance(invoice), invoice.getCurrency()),
+                          context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
         } catch (PersistentBus.EventBusException ex) {
             throw new RuntimeException(ex);
         }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteNoDB.java b/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteNoDB.java
index b71e489..dc29580 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteNoDB.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteNoDB.java
@@ -26,7 +26,7 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 
 import com.ning.billing.GuicyKillbillTestSuiteNoDB;
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.invoice.api.InvoiceMigrationApi;
 import com.ning.billing.invoice.api.InvoicePaymentApi;
 import com.ning.billing.invoice.api.InvoiceUserApi;
diff --git a/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java b/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java
index a3060f4..83e4dfb 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java
@@ -26,7 +26,7 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 
 import com.ning.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.DefaultInvoiceService;
 import com.ning.billing.invoice.api.InvoiceMigrationApi;
@@ -37,7 +37,7 @@ import com.ning.billing.invoice.dao.InvoiceDao;
 import com.ning.billing.invoice.generator.InvoiceGenerator;
 import com.ning.billing.invoice.glue.TestInvoiceModuleWithEmbeddedDb;
 import com.ning.billing.invoice.notification.NextBillingDateNotifier;
-import com.ning.billing.notificationq.NotificationQueueService;
+import com.ning.billing.notificationq.api.NotificationQueueService;
 import com.ning.billing.util.api.TagUserApi;
 import com.ning.billing.util.cache.CacheControllerDispatcher;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
diff --git a/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java b/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java
index 18ed89a..dbd9423 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java
@@ -26,7 +26,7 @@ import org.testng.annotations.Test;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.invoice.InvoiceTestSuiteWithEmbeddedDB;
 import com.ning.billing.invoice.api.DefaultInvoiceService;
-import com.ning.billing.notificationq.NotificationQueue;
+import com.ning.billing.notificationq.api.NotificationQueue;
 import com.ning.billing.util.clock.ClockMock;
 
 import static com.jayway.awaitility.Awaitility.await;
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 fa5aa00..05637ef 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
@@ -42,6 +42,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.ning.billing.ObjectType;
+import com.ning.billing.bus.api.BusEventWithMetadata;
 import com.ning.billing.catalog.api.ActionPolicy;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
@@ -280,34 +281,38 @@ public class SubscriptionResource extends JaxRsResourceBase {
         }
 
         @Override
-        public void onSubscriptionTransition(final EffectiveSubscriptionInternalEvent curEventEffective) {
+        public void onSubscriptionTransition(final BusEventWithMetadata<EffectiveSubscriptionInternalEvent> eventWithMetadata) {
+
+            final EffectiveSubscriptionInternalEvent curEventEffective = eventWithMetadata.getEvent();
             log.info(String.format("Got event SubscriptionTransition token = %s, type = %s, remaining = %d ",
-                                   curEventEffective.getUserToken(), curEventEffective.getTransitionType(), curEventEffective.getRemainingEventsForUserOperation()));
+                                   eventWithMetadata.getUserToken(), curEventEffective.getTransitionType(), curEventEffective.getRemainingEventsForUserOperation()));
         }
 
         @Override
-        public void onEmptyInvoice(final NullInvoiceInternalEvent curEvent) {
-            log.info(String.format("Got event EmptyInvoiceNotification token = %s ", curEvent.getUserToken()));
+        public void onEmptyInvoice(final BusEventWithMetadata<NullInvoiceInternalEvent> eventWithMetadata) {
+            log.info(String.format("Got event EmptyInvoiceNotification token = %s ", eventWithMetadata.getUserToken()));
             notifyForCompletion();
         }
 
         @Override
-        public void onInvoiceCreation(final InvoiceCreationInternalEvent curEvent) {
-            log.info(String.format("Got event InvoiceCreationNotification token = %s ", curEvent.getUserToken()));
-            if (curEvent.getAmountOwed().compareTo(BigDecimal.ZERO) <= 0) {
+        public void onInvoiceCreation(final BusEventWithMetadata<InvoiceCreationInternalEvent> eventWithMetadata) {
+
+            final InvoiceCreationInternalEvent event = eventWithMetadata.getEvent();
+            log.info(String.format("Got event InvoiceCreationNotification token = %s ", eventWithMetadata.getUserToken()));
+            if (event.getAmountOwed().compareTo(BigDecimal.ZERO) <= 0) {
                 notifyForCompletion();
             }
         }
 
         @Override
-        public void onPaymentInfo(final PaymentInfoInternalEvent curEvent) {
-            log.info(String.format("Got event PaymentInfo token = %s ", curEvent.getUserToken()));
+        public void onPaymentInfo(final BusEventWithMetadata<PaymentInfoInternalEvent> eventWithMetadata) {
+            log.info(String.format("Got event PaymentInfo token = %s ", eventWithMetadata.getUserToken()));
             notifyForCompletion();
         }
 
         @Override
-        public void onPaymentError(final PaymentErrorInternalEvent curEvent) {
-            log.info(String.format("Got event PaymentError token = %s ", curEvent.getUserToken()));
+        public void onPaymentError(final BusEventWithMetadata<PaymentErrorInternalEvent> eventWithMetadata) {
+            log.info(String.format("Got event PaymentError token = %s ", eventWithMetadata.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 8cc7eba..a0e1930 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
@@ -13,18 +13,20 @@
  * License for the specific language governing permissions and limitations
  * under the License.
  */
+
 package com.ning.billing.jaxrs.util;
 
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 
-import com.google.common.eventbus.Subscribe;
-
+import com.ning.billing.bus.api.BusEventWithMetadata;
 import com.ning.billing.util.events.BusInternalEvent;
 import com.ning.billing.util.userrequest.CompletionUserRequest;
 import com.ning.billing.util.userrequest.CompletionUserRequestNotifier;
 
+import com.google.common.eventbus.Subscribe;
+
 public class KillbillEventHandler {
 
 
@@ -56,7 +58,7 @@ public class KillbillEventHandler {
      * Killbill server event handler
      */
     @Subscribe
-    public void handleEntitlementevents(final BusInternalEvent event) {
+    public void handleEntitlementevents(final BusEventWithMetadata<BusInternalEvent> event) {
         final List<CompletionUserRequestNotifier> runningWaiters = new ArrayList<CompletionUserRequestNotifier>();
         synchronized (activeWaiters) {
             runningWaiters.addAll(activeWaiters);
diff --git a/junction/src/test/java/com/ning/billing/junction/JunctionTestSuiteNoDB.java b/junction/src/test/java/com/ning/billing/junction/JunctionTestSuiteNoDB.java
index 4bbb0b2..73ea27b 100644
--- a/junction/src/test/java/com/ning/billing/junction/JunctionTestSuiteNoDB.java
+++ b/junction/src/test/java/com/ning/billing/junction/JunctionTestSuiteNoDB.java
@@ -21,7 +21,7 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 
 import com.ning.billing.GuicyKillbillTestSuiteNoDB;
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.catalog.api.CatalogService;
 import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.junction.block.BlockingChecker;
diff --git a/junction/src/test/java/com/ning/billing/junction/JunctionTestSuiteWithEmbeddedDB.java b/junction/src/test/java/com/ning/billing/junction/JunctionTestSuiteWithEmbeddedDB.java
index f6efaf9..db541b2 100644
--- a/junction/src/test/java/com/ning/billing/junction/JunctionTestSuiteWithEmbeddedDB.java
+++ b/junction/src/test/java/com/ning/billing/junction/JunctionTestSuiteWithEmbeddedDB.java
@@ -21,7 +21,7 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 
 import com.ning.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.catalog.api.CatalogService;
 import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.junction.block.BlockingChecker;
diff --git a/osgi/src/main/java/com/ning/billing/osgi/KillbillEventObservable.java b/osgi/src/main/java/com/ning/billing/osgi/KillbillEventObservable.java
index 45a8e36..034faa4 100644
--- a/osgi/src/main/java/com/ning/billing/osgi/KillbillEventObservable.java
+++ b/osgi/src/main/java/com/ning/billing/osgi/KillbillEventObservable.java
@@ -23,8 +23,8 @@ import javax.inject.Inject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.ning.billing.bus.PersistentBus;
-import com.ning.billing.bus.PersistentBus.EventBusException;
+import com.ning.billing.bus.api.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus.EventBusException;
 import com.ning.billing.notification.plugin.api.ExtBusEvent;
 
 import com.google.common.eventbus.Subscribe;
diff --git a/overdue/src/main/java/com/ning/billing/ovedue/notification/DefaultOverdueCheckNotifier.java b/overdue/src/main/java/com/ning/billing/ovedue/notification/DefaultOverdueCheckNotifier.java
index b72960e..dc9ddb1 100644
--- a/overdue/src/main/java/com/ning/billing/ovedue/notification/DefaultOverdueCheckNotifier.java
+++ b/overdue/src/main/java/com/ning/billing/ovedue/notification/DefaultOverdueCheckNotifier.java
@@ -22,12 +22,12 @@ import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.ning.billing.notificationq.NotificationKey;
-import com.ning.billing.notificationq.NotificationQueue;
-import com.ning.billing.notificationq.NotificationQueueService;
-import com.ning.billing.notificationq.NotificationQueueService.NoSuchNotificationQueue;
-import com.ning.billing.notificationq.NotificationQueueService.NotificationQueueAlreadyExists;
-import com.ning.billing.notificationq.NotificationQueueService.NotificationQueueHandler;
+import com.ning.billing.notificationq.api.NotificationEvent;
+import com.ning.billing.notificationq.api.NotificationQueue;
+import com.ning.billing.notificationq.api.NotificationQueueService;
+import com.ning.billing.notificationq.api.NotificationQueueService.NoSuchNotificationQueue;
+import com.ning.billing.notificationq.api.NotificationQueueService.NotificationQueueAlreadyExists;
+import com.ning.billing.notificationq.api.NotificationQueueService.NotificationQueueHandler;
 import com.ning.billing.overdue.OverdueProperties;
 import com.ning.billing.overdue.listener.OverdueListener;
 import com.ning.billing.overdue.service.DefaultOverdueService;
@@ -58,7 +58,7 @@ public class DefaultOverdueCheckNotifier implements OverdueCheckNotifier {
     public void initialize() {
         final NotificationQueueHandler notificationQueueHandler = new NotificationQueueHandler() {
             @Override
-            public void handleReadyNotification(final NotificationKey notificationKey, final DateTime eventDate, final UUID userToken, final Long accountRecordId, final Long tenantRecordId) {
+            public void handleReadyNotification(final NotificationEvent notificationKey, final DateTime eventDate, final UUID userToken, final Long accountRecordId, final Long tenantRecordId) {
                 try {
                     if (!(notificationKey instanceof OverdueCheckNotificationKey)) {
                         log.error("Overdue service received Unexpected notificationKey {}", notificationKey.getClass().getName());
diff --git a/overdue/src/main/java/com/ning/billing/ovedue/notification/DefaultOverdueCheckPoster.java b/overdue/src/main/java/com/ning/billing/ovedue/notification/DefaultOverdueCheckPoster.java
index 690f627..9b4becf 100644
--- a/overdue/src/main/java/com/ning/billing/ovedue/notification/DefaultOverdueCheckPoster.java
+++ b/overdue/src/main/java/com/ning/billing/ovedue/notification/DefaultOverdueCheckPoster.java
@@ -16,12 +16,9 @@
 
 package com.ning.billing.ovedue.notification;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
+import java.util.Collection;
+import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
 
 import javax.annotation.Nullable;
 
@@ -32,10 +29,10 @@ import org.slf4j.LoggerFactory;
 
 import com.ning.billing.junction.api.Blockable;
 import com.ning.billing.junction.api.Type;
-import com.ning.billing.notificationq.Notification;
-import com.ning.billing.notificationq.NotificationQueue;
-import com.ning.billing.notificationq.NotificationQueueService;
-import com.ning.billing.notificationq.NotificationQueueService.NoSuchNotificationQueue;
+import com.ning.billing.notificationq.api.NotificationEventWithMetadata;
+import com.ning.billing.notificationq.api.NotificationQueue;
+import com.ning.billing.notificationq.api.NotificationQueueService;
+import com.ning.billing.notificationq.api.NotificationQueueService.NoSuchNotificationQueue;
 import com.ning.billing.overdue.service.DefaultOverdueService;
 import com.ning.billing.util.cache.CacheControllerDispatcher;
 import com.ning.billing.util.callcontext.InternalCallContext;
@@ -48,8 +45,7 @@ import com.ning.billing.util.entity.dao.EntitySqlDaoWrapperFactory;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Predicate;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Maps;
+import com.google.common.collect.Collections2;
 import com.google.inject.Inject;
 
 public class DefaultOverdueCheckPoster implements OverdueCheckPoster {
@@ -80,10 +76,10 @@ public class DefaultOverdueCheckPoster implements OverdueCheckPoster {
                     boolean shouldInsertNewNotification = true;
 
                     // Check if we already have notifications for that key
-                    final List<Notification> futureNotifications = getFutureNotificationsForAccountAndOverdueableInTransaction(entitySqlDaoWrapperFactory, checkOverdueQueue, overdueable, context);
+                    final Collection<NotificationEventWithMetadata<OverdueCheckNotificationKey>> futureNotifications = getFutureNotificationsForAccountAndOverdueableInTransaction(entitySqlDaoWrapperFactory, checkOverdueQueue, overdueable, context);
                     if (futureNotifications.size() > 0) {
                         // Results are ordered by effective date asc
-                        final DateTime earliestExistingNotificationDate = futureNotifications.get(0).getEffectiveDate();
+                        final DateTime earliestExistingNotificationDate = futureNotifications.iterator().next().getEffectiveDate();
 
                         final int minIndexToDeleteFrom;
                         if (earliestExistingNotificationDate.isBefore(futureNotificationTime)) {
@@ -95,8 +91,14 @@ public class DefaultOverdueCheckPoster implements OverdueCheckPoster {
                             minIndexToDeleteFrom = 0;
                         }
 
-                        for (int i = minIndexToDeleteFrom; i < futureNotifications.size(); i++) {
-                            checkOverdueQueue.removeNotificationFromTransaction(entitySqlDaoWrapperFactory.getSqlDao(), futureNotifications.get(i).getId());
+                        int index = 0;
+                        final Iterator<NotificationEventWithMetadata<OverdueCheckNotificationKey>> it = futureNotifications.iterator();
+                        while (it.hasNext()) {
+                            final NotificationEventWithMetadata<OverdueCheckNotificationKey> cur = it.next();
+                            if (minIndexToDeleteFrom >= index) {
+                                checkOverdueQueue.removeNotificationFromTransaction(entitySqlDaoWrapperFactory.getSqlDao(), cur.getRecordId());
+                            }
+                            index++;
                         }
                     }
 
@@ -125,9 +127,9 @@ public class DefaultOverdueCheckPoster implements OverdueCheckPoster {
 
                 @Override
                 public Void inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
-                    final List<Notification> futureNotifications = getFutureNotificationsForAccountAndOverdueableInTransaction(entitySqlDaoWrapperFactory, checkOverdueQueue, overdueable, context);
-                    for (final Notification notification : futureNotifications) {
-                        checkOverdueQueue.removeNotificationFromTransaction(entitySqlDaoWrapperFactory.getSqlDao(), notification.getId());
+                    final Collection<NotificationEventWithMetadata<OverdueCheckNotificationKey>> futureNotifications = getFutureNotificationsForAccountAndOverdueableInTransaction(entitySqlDaoWrapperFactory, checkOverdueQueue, overdueable, context);
+                    for (final NotificationEventWithMetadata<OverdueCheckNotificationKey> notification : futureNotifications) {
+                        checkOverdueQueue.removeNotificationFromTransaction(entitySqlDaoWrapperFactory.getSqlDao(), notification.getRecordId());
                     }
 
                     return null;
@@ -139,27 +141,21 @@ public class DefaultOverdueCheckPoster implements OverdueCheckPoster {
     }
 
     @VisibleForTesting
-    List<Notification> getFutureNotificationsForAccountAndOverdueableInTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory,
-                                                                                   final NotificationQueue checkOverdueQueue,
-                                                                                   final Blockable overdueable,
-                                                                                   final InternalCallContext context) {
+    Collection<NotificationEventWithMetadata<OverdueCheckNotificationKey>> getFutureNotificationsForAccountAndOverdueableInTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory,
+                                                                                                                                       final NotificationQueue checkOverdueQueue,
+                                                                                                                                       final Blockable overdueable,
+                                                                                                                                       final InternalCallContext context) {
 
-        final Map<Notification, OverdueCheckNotificationKey> candidates = checkOverdueQueue.getFutureNotificationsForAccountAndTypeFromTransaction(OverdueCheckNotificationKey.class, context.getAccountRecordId(), entitySqlDaoWrapperFactory.getSqlDao());
-        final Map<Notification, OverdueCheckNotificationKey> notifications = Maps.filterEntries(candidates, new Predicate<Entry<Notification, OverdueCheckNotificationKey>>() {
+        final List<NotificationEventWithMetadata<OverdueCheckNotificationKey>> notifications = checkOverdueQueue.getFutureNotificationFromTransactionForSearchKey1(OverdueCheckNotificationKey.class, context.getAccountRecordId(), entitySqlDaoWrapperFactory.getSqlDao());
+
+        final Collection<NotificationEventWithMetadata<OverdueCheckNotificationKey>> notificationsFilterered = Collections2.filter(notifications, new Predicate<NotificationEventWithMetadata<OverdueCheckNotificationKey>>() {
             @Override
-            public boolean apply(@Nullable final Entry<Notification, OverdueCheckNotificationKey> input) {
-                final OverdueCheckNotificationKey notificationKey = input.getValue();
+            public boolean apply(@Nullable final NotificationEventWithMetadata<OverdueCheckNotificationKey> input) {
+                final OverdueCheckNotificationKey notificationKey = input.getEvent();
                 return (Type.get(overdueable).equals(notificationKey.getType()) && overdueable.getId().equals(notificationKey.getUuidKey()));
             }
         });
 
-        final List<Notification> result = new ArrayList(notifications.keySet());
-        Collections.sort(result, new Comparator<Notification>() {
-            @Override
-            public int compare(final Notification o1, final Notification o2) {
-                return o1.getEffectiveDate().compareTo(o2.getEffectiveDate());
-            }
-        });
-        return result;
+        return notificationsFilterered;
     }
 }
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 2c98826..616170f 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
@@ -19,14 +19,13 @@ package com.ning.billing.overdue.applicator;
 import java.util.UUID;
 
 import com.ning.billing.junction.api.Type;
-import com.ning.billing.util.events.BusEventBase;
 import com.ning.billing.util.events.OverdueChangeInternalEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultOverdueChangeEvent extends BusEventBase implements OverdueChangeInternalEvent {
+public class DefaultOverdueChangeEvent implements OverdueChangeInternalEvent {
 
     private final UUID overdueObjectId;
     private final Type overdueObjectType;
@@ -37,11 +36,7 @@ public class DefaultOverdueChangeEvent extends BusEventBase implements OverdueCh
     public DefaultOverdueChangeEvent(@JsonProperty("overdueObjectId") final UUID overdueObjectId,
                                      @JsonProperty("overdueObjectType") final Type overdueObjectType,
                                      @JsonProperty("previousOverdueStateName") final String previousOverdueStateName,
-                                     @JsonProperty("nextOverdueStateName") final String nextOverdueStateName,
-                                     @JsonProperty("userToken") final UUID userToken,
-                                     @JsonProperty("accountRecordId") final Long accountRecordId,
-                                     @JsonProperty("tenantRecordId") final Long tenantRecordId) {
-        super(userToken, accountRecordId, tenantRecordId);
+                                     @JsonProperty("nextOverdueStateName") final String nextOverdueStateName) {
         this.overdueObjectId = overdueObjectId;
         this.overdueObjectType = overdueObjectType;
         this.previousOverdueStateName = 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 3030cf3..4902c24 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
@@ -30,15 +30,15 @@ import com.ning.billing.ErrorCode;
 import com.ning.billing.ObjectType;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.catalog.api.ActionPolicy;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.junction.api.Blockable;
-import com.ning.billing.junction.api.Type;
 import com.ning.billing.junction.api.BlockingApiException;
+import com.ning.billing.junction.api.Type;
 import com.ning.billing.ovedue.notification.OverdueCheckPoster;
 import com.ning.billing.overdue.OverdueApiException;
 import com.ning.billing.overdue.OverdueCancellationPolicicy;
@@ -96,7 +96,6 @@ public class OverdueStateApplicator<T extends Blockable> {
     }
 
 
-
     public void apply(final OverdueState<T> firstOverdueState, final BillingState<T> billingState,
                       final T overdueable, final String previousOverdueStateName,
                       final OverdueState<T> nextOverdueState, final InternalCallContext context) throws OverdueException {
@@ -141,7 +140,7 @@ public class OverdueStateApplicator<T extends Blockable> {
         }
 
         try {
-            bus.post(createOverdueEvent(overdueable, previousOverdueStateName, nextOverdueState.getName(), context));
+            bus.post(createOverdueEvent(overdueable, previousOverdueStateName, nextOverdueState.getName(), context), context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
         } catch (Exception e) {
             log.error("Error posting overdue change event to bus", e);
         }
@@ -156,14 +155,14 @@ public class OverdueStateApplicator<T extends Blockable> {
         clearFutureNotification(overdueable, context);
 
         try {
-            bus.post(createOverdueEvent(overdueable, previousOverdueStateName, clearState.getName(), context));
+            bus.post(createOverdueEvent(overdueable, previousOverdueStateName, clearState.getName(), context), context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
         } catch (Exception e) {
             log.error("Error posting overdue change event to bus", e);
         }
     }
 
     private OverdueChangeInternalEvent createOverdueEvent(final T overdueable, final String previousOverdueStateName, final String nextOverdueStateName, final InternalCallContext context) throws BlockingApiException {
-        return new DefaultOverdueChangeEvent(overdueable.getId(), Type.get(overdueable), previousOverdueStateName, nextOverdueStateName, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
+        return new DefaultOverdueChangeEvent(overdueable.getId(), Type.get(overdueable), previousOverdueStateName, nextOverdueStateName);
     }
 
     protected void storeNewState(final T blockable, final OverdueState<T> nextOverdueState, final InternalCallContext context) throws OverdueException {
@@ -202,7 +201,7 @@ public class OverdueStateApplicator<T extends Blockable> {
         poster.clearNotificationsFor(blockable, context);
     }
 
-    private void  cancelSubscriptionsIfRequired(final T blockable, final OverdueState<T> nextOverdueState, final InternalCallContext context) throws OverdueException {
+    private void cancelSubscriptionsIfRequired(final T blockable, final OverdueState<T> nextOverdueState, final InternalCallContext context) throws OverdueException {
         if (nextOverdueState.getSubscriptionCancellationPolicy() == OverdueCancellationPolicicy.NONE) {
             return;
         }
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 ef56e42..1672329 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
@@ -22,6 +22,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.ning.billing.ObjectType;
+import com.ning.billing.bus.api.BusEventWithMetadata;
 import com.ning.billing.ovedue.notification.OverdueCheckNotificationKey;
 import com.ning.billing.util.callcontext.CallOrigin;
 import com.ning.billing.util.callcontext.InternalCallContext;
@@ -52,45 +53,53 @@ public class OverdueListener {
     }
 
     @Subscribe
-    public void handle_OVERDUE_ENFORCEMENT_OFF_Insert(final ControlTagCreationInternalEvent event) {
+    public void handle_OVERDUE_ENFORCEMENT_OFF_Insert(final BusEventWithMetadata<ControlTagCreationInternalEvent> eventWithMetadata) {
+        final ControlTagCreationInternalEvent event = eventWithMetadata.getEvent();
         if (event.getTagDefinition().getName().equals(ControlTagType.OVERDUE_ENFORCEMENT_OFF.toString()) && event.getObjectType() == ObjectType.ACCOUNT) {
             final UUID accountId = event.getObjectId();
-            dispatcher.clearOverdueForAccount(accountId, createCallContext(event.getUserToken(), event.getAccountRecordId(), event.getTenantRecordId()));
+            dispatcher.clearOverdueForAccount(accountId, createCallContext(eventWithMetadata.getUserToken(), eventWithMetadata.getSearchKey1(), eventWithMetadata.getSearchKey2()));
         }
     }
 
     @Subscribe
-    public void handle_OVERDUE_ENFORCEMENT_OFF_Removal(final ControlTagDeletionInternalEvent event) {
+    public void handle_OVERDUE_ENFORCEMENT_OFF_Removal(final BusEventWithMetadata<ControlTagDeletionInternalEvent> eventWithMetadata) {
+        final ControlTagDeletionInternalEvent event = eventWithMetadata.getEvent();
         if (event.getTagDefinition().getName().equals(ControlTagType.OVERDUE_ENFORCEMENT_OFF.toString()) && event.getObjectType() == ObjectType.ACCOUNT) {
             final UUID accountId = event.getObjectId();
-            dispatcher.processOverdueForAccount(accountId, createCallContext(event.getUserToken(), event.getAccountRecordId(), event.getTenantRecordId()));
+            dispatcher.processOverdueForAccount(accountId, createCallContext(eventWithMetadata.getUserToken(), eventWithMetadata.getSearchKey1(), eventWithMetadata.getSearchKey2()));
         }
     }
 
 
     @Subscribe
-    public void handlePaymentInfoEvent(final PaymentInfoInternalEvent event) {
+    public void handlePaymentInfoEvent(final BusEventWithMetadata<PaymentInfoInternalEvent> eventWithMetadata) {
+
+        final PaymentInfoInternalEvent event = eventWithMetadata.getEvent();
         log.debug("Received PaymentInfo event {}", event);
-        dispatcher.processOverdueForAccount(event.getAccountId(), createCallContext(event.getUserToken(), event.getAccountRecordId(), event.getTenantRecordId()));
+        dispatcher.processOverdueForAccount(event.getAccountId(), createCallContext(eventWithMetadata.getUserToken(), eventWithMetadata.getSearchKey1(), eventWithMetadata.getSearchKey2()));
     }
 
     @Subscribe
-    public void handlePaymentErrorEvent(final PaymentErrorInternalEvent event) {
+    public void handlePaymentErrorEvent(final BusEventWithMetadata<PaymentErrorInternalEvent> eventWithMetadata) {
+
+        final PaymentErrorInternalEvent event = eventWithMetadata.getEvent();
         log.debug("Received PaymentError event {}", event);
         final UUID accountId = event.getAccountId();
-        dispatcher.processOverdueForAccount(accountId, createCallContext(event.getUserToken(), event.getAccountRecordId(), event.getTenantRecordId()));
+        dispatcher.processOverdueForAccount(accountId, createCallContext(eventWithMetadata.getUserToken(), eventWithMetadata.getSearchKey1(), eventWithMetadata.getSearchKey2()));
     }
 
     @Subscribe
-    public void handleInvoiceAdjustmentEvent(final InvoiceAdjustmentInternalEvent event) {
+    public void handleInvoiceAdjustmentEvent(final BusEventWithMetadata<InvoiceAdjustmentInternalEvent> eventWithMetadata) {
+
+        final InvoiceAdjustmentInternalEvent event = eventWithMetadata.getEvent();
         log.debug("Received InvoiceAdjustment event {}", event);
         final UUID accountId = event.getAccountId();
-        dispatcher.processOverdueForAccount(accountId, createCallContext(event.getUserToken(), event.getAccountRecordId(), event.getTenantRecordId()));
+        dispatcher.processOverdueForAccount(accountId, createCallContext(eventWithMetadata.getUserToken(), eventWithMetadata.getSearchKey1(), eventWithMetadata.getSearchKey2()));
     }
 
     public void handleNextOverdueCheck(final OverdueCheckNotificationKey notificationKey, final UUID userToken, final Long accountRecordId, final Long tenantRecordId) {
         log.info(String.format("Received OD checkup notification for type = %s, id = %s",
-                notificationKey.getType(), notificationKey.getUuidKey()));
+                               notificationKey.getType(), notificationKey.getUuidKey()));
         dispatcher.processOverdue(notificationKey.getType(), notificationKey.getUuidKey(), createCallContext(userToken, accountRecordId, tenantRecordId));
     }
 
diff --git a/overdue/src/main/java/com/ning/billing/overdue/service/DefaultOverdueService.java b/overdue/src/main/java/com/ning/billing/overdue/service/DefaultOverdueService.java
index 5e588c2..1be6b2e 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/service/DefaultOverdueService.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/service/DefaultOverdueService.java
@@ -22,7 +22,7 @@ import java.net.URISyntaxException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.ning.billing.bus.PersistentBus.EventBusException;
+import com.ning.billing.bus.api.PersistentBus.EventBusException;
 import com.ning.billing.lifecycle.LifecycleHandlerType;
 import com.ning.billing.lifecycle.LifecycleHandlerType.LifecycleLevel;
 import com.ning.billing.ovedue.notification.OverdueCheckNotifier;
diff --git a/overdue/src/test/java/com/ning/billing/ovedue/notification/TestDefaultOverdueCheckPoster.java b/overdue/src/test/java/com/ning/billing/ovedue/notification/TestDefaultOverdueCheckPoster.java
index ee2aeab..be6e72d 100644
--- a/overdue/src/test/java/com/ning/billing/ovedue/notification/TestDefaultOverdueCheckPoster.java
+++ b/overdue/src/test/java/com/ning/billing/ovedue/notification/TestDefaultOverdueCheckPoster.java
@@ -17,7 +17,7 @@
 package com.ning.billing.ovedue.notification;
 
 import java.io.IOException;
-import java.util.List;
+import java.util.Collection;
 import java.util.UUID;
 
 import org.joda.time.DateTime;
@@ -30,8 +30,8 @@ import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.junction.api.Blockable;
 import com.ning.billing.junction.api.Type;
-import com.ning.billing.notificationq.Notification;
-import com.ning.billing.notificationq.NotificationQueue;
+import com.ning.billing.notificationq.api.NotificationEventWithMetadata;
+import com.ning.billing.notificationq.api.NotificationQueue;
 import com.ning.billing.overdue.OverdueTestSuiteWithEmbeddedDB;
 import com.ning.billing.overdue.service.DefaultOverdueService;
 import com.ning.billing.util.entity.dao.EntitySqlDao;
@@ -81,7 +81,7 @@ public class TestDefaultOverdueCheckPoster extends OverdueTestSuiteWithEmbeddedD
         insertOverdueCheckAndVerifyQueueContent(otherOverdueable, 15, 5);
 
         // Verify the final content of the queue
-        Assert.assertEquals(overdueQueue.getFutureNotificationsForAccountAndType(OverdueCheckNotificationKey.class, internalCallContext.getAccountRecordId()).size(), 2);
+        Assert.assertEquals(overdueQueue.getFutureNotificationForSearchKey1(OverdueCheckNotificationKey.class, internalCallContext.getAccountRecordId()).size(), 2);
     }
 
     private void insertOverdueCheckAndVerifyQueueContent(final Blockable overdueable, final int nbDaysInFuture, final int expectedNbDaysInFuture) throws IOException {
@@ -89,16 +89,17 @@ public class TestDefaultOverdueCheckPoster extends OverdueTestSuiteWithEmbeddedD
         poster.insertOverdueCheckNotification(overdueable, futureNotificationTime, internalCallContext);
 
         final OverdueCheckNotificationKey notificationKey = new OverdueCheckNotificationKey(overdueable.getId(), Type.get(overdueable));
-        final List<Notification> notificationsForKey = getNotificationsForOverdueable(overdueable);
+        final Collection<NotificationEventWithMetadata<OverdueCheckNotificationKey>> notificationsForKey = getNotificationsForOverdueable(overdueable);
         Assert.assertEquals(notificationsForKey.size(), 1);
-        Assert.assertEquals(notificationsForKey.get(0).getNotificationKey(), objectMapper.writeValueAsString(notificationKey));
-        Assert.assertEquals(notificationsForKey.get(0).getEffectiveDate(), testReferenceTime.plusDays(expectedNbDaysInFuture));
+        final NotificationEventWithMetadata nm = notificationsForKey.iterator().next();
+        Assert.assertEquals(nm.getEvent(), notificationKey);
+        Assert.assertEquals(nm.getEffectiveDate(), testReferenceTime.plusDays(expectedNbDaysInFuture));
     }
 
-    private List<Notification> getNotificationsForOverdueable(final Blockable overdueable) {
-        return entitySqlDaoTransactionalJdbiWrapper.execute(new EntitySqlDaoTransactionWrapper<List<Notification>>() {
+    private Collection<NotificationEventWithMetadata<OverdueCheckNotificationKey>> getNotificationsForOverdueable(final Blockable overdueable) {
+        return entitySqlDaoTransactionalJdbiWrapper.execute(new EntitySqlDaoTransactionWrapper<Collection<NotificationEventWithMetadata<OverdueCheckNotificationKey>>>() {
             @Override
-            public List<Notification> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+            public Collection<NotificationEventWithMetadata<OverdueCheckNotificationKey>> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
                 return ((DefaultOverdueCheckPoster) poster).getFutureNotificationsForAccountAndOverdueableInTransaction(entitySqlDaoWrapperFactory, overdueQueue, overdueable, internalCallContext);
             }
         });
diff --git a/overdue/src/test/java/com/ning/billing/overdue/OverdueTestSuiteNoDB.java b/overdue/src/test/java/com/ning/billing/overdue/OverdueTestSuiteNoDB.java
index 9cd571f..5288066 100644
--- a/overdue/src/test/java/com/ning/billing/overdue/OverdueTestSuiteNoDB.java
+++ b/overdue/src/test/java/com/ning/billing/overdue/OverdueTestSuiteNoDB.java
@@ -21,9 +21,9 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 
 import com.ning.billing.GuicyKillbillTestSuiteNoDB;
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
-import com.ning.billing.notificationq.NotificationQueueService;
+import com.ning.billing.notificationq.api.NotificationQueueService;
 import com.ning.billing.ovedue.notification.OverdueCheckNotifier;
 import com.ning.billing.ovedue.notification.OverdueCheckPoster;
 import com.ning.billing.overdue.applicator.OverdueBusListenerTester;
diff --git a/overdue/src/test/java/com/ning/billing/overdue/OverdueTestSuiteWithEmbeddedDB.java b/overdue/src/test/java/com/ning/billing/overdue/OverdueTestSuiteWithEmbeddedDB.java
index bebc309..ac6a6a8 100644
--- a/overdue/src/test/java/com/ning/billing/overdue/OverdueTestSuiteWithEmbeddedDB.java
+++ b/overdue/src/test/java/com/ning/billing/overdue/OverdueTestSuiteWithEmbeddedDB.java
@@ -21,9 +21,9 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 
 import com.ning.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
-import com.ning.billing.notificationq.NotificationQueueService;
+import com.ning.billing.notificationq.api.NotificationQueueService;
 import com.ning.billing.ovedue.notification.OverdueCheckNotifier;
 import com.ning.billing.ovedue.notification.OverdueCheckPoster;
 import com.ning.billing.overdue.applicator.OverdueBusListenerTester;
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 af7ea49..18b91ee 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
@@ -18,7 +18,6 @@ package com.ning.billing.payment.api;
 
 import java.util.UUID;
 
-import com.ning.billing.util.events.BusEventBase;
 import com.ning.billing.util.events.PaymentErrorInternalEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -27,7 +26,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "error")
-public class DefaultPaymentErrorEvent extends BusEventBase implements PaymentErrorInternalEvent {
+public class DefaultPaymentErrorEvent implements PaymentErrorInternalEvent {
 
     private final UUID id;
     private final String message;
@@ -41,11 +40,7 @@ public class DefaultPaymentErrorEvent extends BusEventBase implements PaymentErr
                                     @JsonProperty("accountId") final UUID accountId,
                                     @JsonProperty("invoiceId") final UUID invoiceId,
                                     @JsonProperty("paymentId") final UUID paymentId,
-                                    @JsonProperty("message") final String message,
-                                    @JsonProperty("userToken") final UUID userToken,
-                                    @JsonProperty("accountRecordId") final Long accountRecordId,
-                                    @JsonProperty("tenantRecordId") final Long tenantRecordId) {
-        super(userToken, accountRecordId, tenantRecordId);
+                                    @JsonProperty("message") final String message) {
         this.id = id;
         this.message = message;
         this.accountId = accountId;
@@ -55,8 +50,8 @@ public class DefaultPaymentErrorEvent extends BusEventBase implements PaymentErr
 
 
     public DefaultPaymentErrorEvent(final UUID accountId,
-                                    final UUID invoiceId, final UUID paymentId, final String message, final UUID userToken, final Long accountRecordId, final Long tenantRecordId) {
-        this(UUID.randomUUID(), accountId, invoiceId, paymentId, message, userToken, accountRecordId, tenantRecordId);
+                                    final UUID invoiceId, final UUID paymentId, final String message) {
+        this(UUID.randomUUID(), accountId, invoiceId, paymentId, message);
     }
 
 
@@ -93,12 +88,12 @@ public class DefaultPaymentErrorEvent extends BusEventBase implements PaymentErr
         final int prime = 31;
         int result = 1;
         result = prime * result
-                + ((accountId == null) ? 0 : accountId.hashCode());
+                 + ((accountId == null) ? 0 : accountId.hashCode());
         result = prime * result
-                + ((invoiceId == null) ? 0 : invoiceId.hashCode());
+                 + ((invoiceId == null) ? 0 : invoiceId.hashCode());
         result = prime * result + ((message == null) ? 0 : message.hashCode());
         result = prime * result
-                + ((paymentId == null) ? 0 : paymentId.hashCode());
+                 + ((paymentId == null) ? 0 : paymentId.hashCode());
         return result;
     }
 
@@ -150,7 +145,7 @@ public class DefaultPaymentErrorEvent extends BusEventBase implements PaymentErr
     @Override
     public String toString() {
         return "DefaultPaymentErrorEvent [message=" + message + ", accountId="
-                + accountId + ", invoiceId=" + invoiceId + ", paymentId="
-                + paymentId + ", userToken=" + getUserToken() + "]";
+               + accountId + ", invoiceId=" + invoiceId + ", paymentId="
+               + paymentId + "]";
     }
 }
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 d0c7212..e23e607 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
@@ -21,14 +21,13 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 
-import com.ning.billing.util.events.BusEventBase;
 import com.ning.billing.util.events.PaymentInfoInternalEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultPaymentInfoEvent extends BusEventBase implements PaymentInfoInternalEvent {
+public class DefaultPaymentInfoEvent implements PaymentInfoInternalEvent {
 
     private final UUID accountId;
     private final UUID invoiceId;
@@ -36,7 +35,6 @@ public class DefaultPaymentInfoEvent extends BusEventBase implements PaymentInfo
     private final BigDecimal amount;
     private final Integer paymentNumber;
     private final PaymentStatus status;
-    private final UUID userToken;
     private final DateTime effectiveDate;
 
     @JsonCreator
@@ -49,43 +47,22 @@ public class DefaultPaymentInfoEvent extends BusEventBase implements PaymentInfo
                                    @JsonProperty("status") final PaymentStatus status,
                                    @JsonProperty("extFirstPaymentRefId") final String extFirstPaymentRefId /* TODO for backward compatibility only */,
                                    @JsonProperty("extSecondPaymentRefId") final String extSecondPaymentRefId /* TODO for backward compatibility only */,
-                                   @JsonProperty("userToken") final UUID userToken,
-                                   @JsonProperty("effectiveDate") final DateTime effectiveDate,
-                                   @JsonProperty("accountRecordId") final Long accountRecordId,
-                                   @JsonProperty("tenantRecordId") final Long tenantRecordId) {
-        super(userToken, accountRecordId, tenantRecordId);
+                                   @JsonProperty("effectiveDate") final DateTime effectiveDate) {
         this.accountId = accountId;
         this.invoiceId = invoiceId;
         this.paymentId = paymentId;
         this.amount = amount;
         this.paymentNumber = paymentNumber;
         this.status = status;
-        this.userToken = userToken;
         this.effectiveDate = effectiveDate;
     }
 
     public DefaultPaymentInfoEvent(final UUID accountId, final UUID invoiceId,
                                    final UUID paymentId, final BigDecimal amount, final Integer paymentNumber,
-                                   final PaymentStatus status, final UUID userToken,
-                                   final DateTime effectiveDatefinal, final Long accountRecordId, final Long tenantRecordId) {
-        this(UUID.randomUUID(), accountId, invoiceId, paymentId, amount, paymentNumber, status, null, null, userToken,
-             effectiveDatefinal, accountRecordId, tenantRecordId);
-    }
-
-    public DefaultPaymentInfoEvent(final DefaultPaymentInfoEvent src) {
-        this(UUID.randomUUID(),
-             src.accountId,
-             src.invoiceId,
-             src.paymentId,
-             src.amount,
-             src.paymentNumber,
-             src.status,
-             null,
-             null,
-             src.userToken,
-             src.effectiveDate,
-             src.getAccountRecordId(),
-             src.getTenantRecordId());
+                                   final PaymentStatus status,
+                                   final DateTime effectiveDatefinal) {
+        this(UUID.randomUUID(), accountId, invoiceId, paymentId, amount, paymentNumber, status, null, null,
+             effectiveDatefinal);
     }
 
     @JsonIgnore
@@ -94,10 +71,6 @@ public class DefaultPaymentInfoEvent extends BusEventBase implements PaymentInfo
         return BusInternalEventType.PAYMENT_INFO;
     }
 
-    @Override
-    public UUID getUserToken() {
-        return userToken;
-    }
 
     @Override
     public UUID getAccountId() {
@@ -144,7 +117,6 @@ public class DefaultPaymentInfoEvent extends BusEventBase implements PaymentInfo
         sb.append(", amount=").append(amount);
         sb.append(", paymentNumber=").append(paymentNumber);
         sb.append(", status=").append(status);
-        sb.append(", userToken=").append(userToken);
         sb.append(", effectiveDate=").append(effectiveDate);
         sb.append('}');
         return sb.toString();
@@ -166,8 +138,6 @@ public class DefaultPaymentInfoEvent extends BusEventBase implements PaymentInfo
         result = prime * result
                  + ((paymentNumber == null) ? 0 : paymentNumber.hashCode());
         result = prime * result + ((status == null) ? 0 : status.hashCode());
-        result = prime * result
-                 + ((userToken == null) ? 0 : userToken.hashCode());
         return result;
     }
 
@@ -228,13 +198,6 @@ public class DefaultPaymentInfoEvent extends BusEventBase implements PaymentInfo
         if (status != other.status) {
             return false;
         }
-        if (userToken == null) {
-            if (other.userToken != null) {
-                return false;
-            }
-        } else if (!userToken.equals(other.userToken)) {
-            return false;
-        }
         return true;
     }
 }
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 e217867..020b047 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,6 +22,8 @@ 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.bus.api.BusEvent;
+import com.ning.billing.bus.api.BusEventWithMetadata;
 import com.ning.billing.payment.api.PaymentApiException;
 import com.ning.billing.payment.core.PaymentProcessor;
 import com.ning.billing.util.callcontext.CallOrigin;
@@ -52,14 +54,16 @@ public class InvoiceHandler {
     }
 
     @Subscribe
-    public void processInvoiceEvent(final InvoiceCreationInternalEvent event) {
+    public void processInvoiceEvent(final BusEventWithMetadata<InvoiceCreationInternalEvent> eventWithMetadata) {
+
+        final InvoiceCreationInternalEvent event = eventWithMetadata.getEvent();
 
         log.info("Received invoice creation notification for account {} and invoice {}",
                  event.getAccountId(), event.getInvoiceId());
 
         final Account account;
         try {
-            final InternalCallContext internalContext =  internalCallContextFactory.createInternalCallContext(event.getTenantRecordId(), event.getAccountRecordId(), "PaymentRequestProcessor", CallOrigin.INTERNAL, UserType.SYSTEM, event.getUserToken());
+            final InternalCallContext internalContext =  internalCallContextFactory.createInternalCallContext(eventWithMetadata.getSearchKey2(), eventWithMetadata.getSearchKey1(), "PaymentRequestProcessor", CallOrigin.INTERNAL, UserType.SYSTEM, eventWithMetadata.getUserToken());
             account = accountApi.getAccountById(event.getAccountId(), internalContext);
             paymentProcessor.createPayment(account, event.getInvoiceId(), null, internalContext, false, false);
         } catch (AccountApiException e) {
diff --git a/payment/src/main/java/com/ning/billing/payment/bus/PaymentTagHandler.java b/payment/src/main/java/com/ning/billing/payment/bus/PaymentTagHandler.java
index fbdfc13..389ed2a 100644
--- a/payment/src/main/java/com/ning/billing/payment/bus/PaymentTagHandler.java
+++ b/payment/src/main/java/com/ning/billing/payment/bus/PaymentTagHandler.java
@@ -64,7 +64,8 @@ public class PaymentTagHandler {
     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());
+            // STEPH_BUS
+            processUnpaid_AUTO_PAY_OFF_payments(accountId, null);
         }
     }
 
diff --git a/payment/src/main/java/com/ning/billing/payment/core/PaymentMethodProcessor.java b/payment/src/main/java/com/ning/billing/payment/core/PaymentMethodProcessor.java
index 5c198ac..3e88a00 100644
--- a/payment/src/main/java/com/ning/billing/payment/core/PaymentMethodProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/core/PaymentMethodProcessor.java
@@ -31,7 +31,7 @@ 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.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.osgi.api.OSGIServiceRegistration;
 import com.ning.billing.payment.api.DefaultPaymentMethod;
 import com.ning.billing.payment.api.PaymentApiException;
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 d9ef813..5918c2f 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
@@ -36,7 +36,7 @@ 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.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.osgi.api.OSGIServiceRegistration;
@@ -195,7 +195,7 @@ public class PaymentProcessor extends ProcessorBase {
                                                                                                                scheduleRetryOnPaymentFailure(cur.getId(), context);
                                                                                                                break;
                                                                                                            case PLUGIN_FAILURE:
-                                                                                                               case UNKNOWN:
+                                                                                                           case UNKNOWN:
                                                                                                                scheduleRetryOnPluginFailure(cur.getId(), context);
                                                                                                                break;
                                                                                                            default:
@@ -231,8 +231,8 @@ public class PaymentProcessor extends ProcessorBase {
             // 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 PaymentErrorInternalEvent event = new DefaultPaymentErrorEvent(account.getId(), invoiceId, null,
-                                                                                 ErrorCode.PAYMENT_NO_DEFAULT_PAYMENT_METHOD.toString(), context.getUserToken(),
-                                                                                 context.getAccountRecordId(), context.getTenantRecordId());
+                                                                                 ErrorCode.PAYMENT_NO_DEFAULT_PAYMENT_METHOD.toString()
+            );
             postPaymentEvent(event, account.getId(), context);
             throw e;
         }
@@ -279,7 +279,7 @@ public class PaymentProcessor extends ProcessorBase {
                 return null;
             }
         } catch (RuntimeException e) {
-            log.error("Failure when dispatching payment for invoice " + invoiceId , e);
+            log.error("Failure when dispatching payment for invoice " + invoiceId, e);
             if (isInstantPayment) {
                 throw new PaymentApiException(ErrorCode.PAYMENT_INTERNAL_ERROR, invoiceId);
             } else {
@@ -434,7 +434,7 @@ public class PaymentProcessor extends ProcessorBase {
     private Payment setTerminalStateOnRetryWithAccountLocked(final Account account, final Invoice invoice, final PaymentModelDao payment, final BigDecimal requestedAmount, final String terminalStateReason, final InternalCallContext context) {
 
         final PaymentStatus paymentStatus;
-        switch(payment.getPaymentStatus()) {
+        switch (payment.getPaymentStatus()) {
             case PAYMENT_FAILURE:
                 paymentStatus = PaymentStatus.PAYMENT_FAILURE_ABORTED;
                 break;
@@ -450,7 +450,7 @@ public class PaymentProcessor extends ProcessorBase {
         }
         final PaymentAttemptModelDao attempt = new PaymentAttemptModelDao(account.getId(), invoice.getId(), payment.getId(), clock.getUTCNow(), requestedAmount);
         paymentDao.insertNewAttemptForPayment(payment.getId(), attempt, context);
-        paymentDao.updateStatusAndEffectiveDateForPaymentWithAttempt(payment.getId(), paymentStatus, clock.getUTCNow(), attempt.getId(), null, terminalStateReason,  context);
+        paymentDao.updateStatusAndEffectiveDateForPaymentWithAttempt(payment.getId(), paymentStatus, clock.getUTCNow(), attempt.getId(), null, terminalStateReason, context);
 
         final List<PaymentAttemptModelDao> allAttempts = paymentDao.getAttemptsForPayment(payment.getId(), context);
         return new DefaultPayment(payment, null, allAttempts, Collections.<RefundModelDao>emptyList());
@@ -471,7 +471,7 @@ public class PaymentProcessor extends ProcessorBase {
 
         List<PaymentAttemptModelDao> allAttempts = null;
         if (paymentConfig.isPaymentOff()) {
-            paymentDao.updateStatusAndEffectiveDateForPaymentWithAttempt(paymentInput.getId(), PaymentStatus.PAYMENT_SYSTEM_OFF, clock.getUTCNow(), attemptInput.getId(), null, null,  context);
+            paymentDao.updateStatusAndEffectiveDateForPaymentWithAttempt(paymentInput.getId(), PaymentStatus.PAYMENT_SYSTEM_OFF, clock.getUTCNow(), attemptInput.getId(), null, null, context);
             allAttempts = paymentDao.getAttemptsForPayment(paymentInput.getId(), context);
             return new DefaultPayment(paymentInput, null, allAttempts, Collections.<RefundModelDao>emptyList());
         }
@@ -498,7 +498,7 @@ public class PaymentProcessor extends ProcessorBase {
                                                                   String gatewayErrorMsg, UUID attemptId, InternalCallContext context, String gatewayErrorCode
                      */
 
-                    paymentDao.updateStatusAndEffectiveDateForPaymentWithAttempt(paymentInput.getId(), paymentStatus, clock.getUTCNow(), attemptInput.getId(), paymentPluginInfo.getGatewayErrorCode(), null,  context);
+                    paymentDao.updateStatusAndEffectiveDateForPaymentWithAttempt(paymentInput.getId(), paymentStatus, clock.getUTCNow(), attemptInput.getId(), paymentPluginInfo.getGatewayErrorCode(), null, context);
 
                     // Fetch latest objects
                     allAttempts = paymentDao.getAttemptsForPayment(paymentInput.getId(), context);
@@ -514,8 +514,8 @@ public class PaymentProcessor extends ProcessorBase {
                     // Create Bus event
                     event = new DefaultPaymentInfoEvent(account.getId(),
                                                         invoice.getId(), payment.getId(), payment.getAmount(), payment.getPaymentNumber(), paymentStatus,
-                                                        context.getUserToken(), payment.getEffectiveDate(),
-                                                        context.getAccountRecordId(), context.getTenantRecordId());
+                                                        payment.getEffectiveDate()
+                    );
                     break;
 
                 case ERROR:
@@ -527,13 +527,13 @@ public class PaymentProcessor extends ProcessorBase {
                         paymentStatus = PaymentStatus.PAYMENT_FAILURE_ABORTED;
                     }
 
-                    paymentDao.updateStatusAndEffectiveDateForPaymentWithAttempt(paymentInput.getId(), paymentStatus, clock.getUTCNow(), attemptInput.getId(), paymentPluginInfo.getGatewayErrorCode(), paymentPluginInfo.getGatewayError(),  context);
+                    paymentDao.updateStatusAndEffectiveDateForPaymentWithAttempt(paymentInput.getId(), paymentStatus, clock.getUTCNow(), attemptInput.getId(), paymentPluginInfo.getGatewayErrorCode(), paymentPluginInfo.getGatewayError(), context);
 
                     log.info(String.format("Could not process payment for account %s, invoice %s, error = %s",
                                            account.getId(), invoice.getId(), paymentPluginInfo.getGatewayError()));
 
-                    event = new DefaultPaymentErrorEvent(account.getId(), invoice.getId(), paymentInput.getId(), paymentPluginInfo.getGatewayError(), context.getUserToken(),
-                                                         context.getAccountRecordId(), context.getTenantRecordId());
+                    event = new DefaultPaymentErrorEvent(account.getId(), invoice.getId(), paymentInput.getId(), paymentPluginInfo.getGatewayError()
+                    );
                     throw new PaymentApiException(ErrorCode.PAYMENT_CREATE_PAYMENT, account.getId(), paymentPluginInfo.getGatewayError());
 
                 default:
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 172d654..8d76c37 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
@@ -30,8 +30,8 @@ import com.ning.billing.ErrorCode;
 import com.ning.billing.ObjectType;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
-import com.ning.billing.bus.PersistentBus;
-import com.ning.billing.bus.PersistentBus.EventBusException;
+import com.ning.billing.bus.api.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus.EventBusException;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.osgi.api.OSGIServiceRegistration;
@@ -142,7 +142,7 @@ public abstract class ProcessorBase {
             return;
         }
         try {
-            eventBus.post(ev);
+            eventBus.post(ev, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
         } catch (EventBusException e) {
             log.error("Failed to post Payment event event for account {} ", accountId, e);
         }
diff --git a/payment/src/main/java/com/ning/billing/payment/core/RefundProcessor.java b/payment/src/main/java/com/ning/billing/payment/core/RefundProcessor.java
index c625d60..2a47887 100644
--- a/payment/src/main/java/com/ning/billing/payment/core/RefundProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/core/RefundProcessor.java
@@ -35,7 +35,7 @@ import com.ning.billing.ErrorCode;
 import com.ning.billing.ObjectType;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.osgi.api.OSGIServiceRegistration;
@@ -189,7 +189,7 @@ public class RefundProcessor extends ProcessorBase {
         throw new IllegalArgumentException("Unable to find invoice item for id " + itemId);
     }
 
-    public Refund getRefund(final UUID refundId, final boolean withPluginInfo /* not yet implemented */ , final InternalTenantContext context)
+    public Refund getRefund(final UUID refundId, final boolean withPluginInfo /* not yet implemented */, final InternalTenantContext context)
             throws PaymentApiException {
         RefundModelDao result = paymentDao.getRefund(refundId, context);
         if (result == null) {
diff --git a/payment/src/main/java/com/ning/billing/payment/glue/DefaultPaymentService.java b/payment/src/main/java/com/ning/billing/payment/glue/DefaultPaymentService.java
index 97c7512..e2f7b93 100644
--- a/payment/src/main/java/com/ning/billing/payment/glue/DefaultPaymentService.java
+++ b/payment/src/main/java/com/ning/billing/payment/glue/DefaultPaymentService.java
@@ -19,11 +19,11 @@ package com.ning.billing.payment.glue;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.lifecycle.LifecycleHandlerType;
 import com.ning.billing.lifecycle.LifecycleHandlerType.LifecycleLevel;
-import com.ning.billing.notificationq.NotificationQueueService.NoSuchNotificationQueue;
-import com.ning.billing.notificationq.NotificationQueueService.NotificationQueueAlreadyExists;
+import com.ning.billing.notificationq.api.NotificationQueueService.NoSuchNotificationQueue;
+import com.ning.billing.notificationq.api.NotificationQueueService.NotificationQueueAlreadyExists;
 import com.ning.billing.payment.api.PaymentApi;
 import com.ning.billing.payment.api.PaymentService;
 import com.ning.billing.payment.bus.InvoiceHandler;
diff --git a/payment/src/main/java/com/ning/billing/payment/retry/AutoPayRetryService.java b/payment/src/main/java/com/ning/billing/payment/retry/AutoPayRetryService.java
index 61d7d26..d7b79d7 100644
--- a/payment/src/main/java/com/ning/billing/payment/retry/AutoPayRetryService.java
+++ b/payment/src/main/java/com/ning/billing/payment/retry/AutoPayRetryService.java
@@ -20,7 +20,7 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 
-import com.ning.billing.notificationq.NotificationQueueService;
+import com.ning.billing.notificationq.api.NotificationQueueService;
 import com.ning.billing.util.config.PaymentConfig;
 import com.ning.billing.payment.core.PaymentProcessor;
 import com.ning.billing.util.callcontext.InternalCallContext;
diff --git a/payment/src/main/java/com/ning/billing/payment/retry/BaseRetryService.java b/payment/src/main/java/com/ning/billing/payment/retry/BaseRetryService.java
index 4fbc849..8a9e1e4 100644
--- a/payment/src/main/java/com/ning/billing/payment/retry/BaseRetryService.java
+++ b/payment/src/main/java/com/ning/billing/payment/retry/BaseRetryService.java
@@ -24,18 +24,17 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.ning.billing.ObjectType;
-import com.ning.billing.notificationq.NotificationKey;
-import com.ning.billing.notificationq.NotificationQueue;
-import com.ning.billing.notificationq.NotificationQueueService;
-import com.ning.billing.notificationq.NotificationQueueService.NoSuchNotificationQueue;
-import com.ning.billing.notificationq.NotificationQueueService.NotificationQueueAlreadyExists;
-import com.ning.billing.notificationq.NotificationQueueService.NotificationQueueHandler;
+import com.ning.billing.notificationq.api.NotificationEvent;
+import com.ning.billing.notificationq.api.NotificationQueue;
+import com.ning.billing.notificationq.api.NotificationQueueService;
+import com.ning.billing.notificationq.api.NotificationQueueService.NoSuchNotificationQueue;
+import com.ning.billing.notificationq.api.NotificationQueueService.NotificationQueueAlreadyExists;
+import com.ning.billing.notificationq.api.NotificationQueueService.NotificationQueueHandler;
 import com.ning.billing.payment.glue.DefaultPaymentService;
 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.config.PaymentConfig;
 import com.ning.billing.util.entity.dao.EntitySqlDao;
 import com.ning.billing.util.entity.dao.EntitySqlDaoWrapperFactory;
 
@@ -63,7 +62,7 @@ public abstract class BaseRetryService implements RetryService {
                                                                       getQueueName(),
                                                                       new NotificationQueueHandler() {
                                                                           @Override
-                                                                          public void handleReadyNotification(final NotificationKey notificationKey, final DateTime eventDateTime, final UUID userToken, final Long accountRecordId, final Long tenantRecordId) {
+                                                                          public void handleReadyNotification(final NotificationEvent notificationKey, final DateTime eventDateTime, final UUID userToken, final Long accountRecordId, final Long tenantRecordId) {
                                                                               if (!(notificationKey instanceof PaymentRetryNotificationKey)) {
                                                                                   log.error("Payment service got an unexpected notification type {}", notificationKey.getClass().getName());
                                                                                   return;
@@ -134,7 +133,7 @@ public abstract class BaseRetryService implements RetryService {
 
             try {
                 final NotificationQueue retryQueue = notificationQueueService.getNotificationQueue(DefaultPaymentService.SERVICE_NAME, getQueueName());
-                final NotificationKey key = new PaymentRetryNotificationKey(paymentId);
+                final NotificationEvent key = new PaymentRetryNotificationKey(paymentId);
                 if (retryQueue != null) {
                     if (transactionalDao == null) {
                         retryQueue.recordFutureNotification(timeOfRetry, key, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
diff --git a/payment/src/main/java/com/ning/billing/payment/retry/FailedPaymentRetryService.java b/payment/src/main/java/com/ning/billing/payment/retry/FailedPaymentRetryService.java
index 3a70556..18d6df7 100644
--- a/payment/src/main/java/com/ning/billing/payment/retry/FailedPaymentRetryService.java
+++ b/payment/src/main/java/com/ning/billing/payment/retry/FailedPaymentRetryService.java
@@ -23,7 +23,7 @@ import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.ning.billing.notificationq.NotificationQueueService;
+import com.ning.billing.notificationq.api.NotificationQueueService;
 import com.ning.billing.util.config.PaymentConfig;
 import com.ning.billing.payment.core.PaymentProcessor;
 import com.ning.billing.util.callcontext.InternalCallContext;
diff --git a/payment/src/main/java/com/ning/billing/payment/retry/PluginFailureRetryService.java b/payment/src/main/java/com/ning/billing/payment/retry/PluginFailureRetryService.java
index 6403013..ec2a749 100644
--- a/payment/src/main/java/com/ning/billing/payment/retry/PluginFailureRetryService.java
+++ b/payment/src/main/java/com/ning/billing/payment/retry/PluginFailureRetryService.java
@@ -22,7 +22,7 @@ import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.ning.billing.notificationq.NotificationQueueService;
+import com.ning.billing.notificationq.api.NotificationQueueService;
 import com.ning.billing.payment.core.PaymentProcessor;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
diff --git a/payment/src/main/java/com/ning/billing/payment/retry/RetryService.java b/payment/src/main/java/com/ning/billing/payment/retry/RetryService.java
index 21ed3dc..e2ae064 100644
--- a/payment/src/main/java/com/ning/billing/payment/retry/RetryService.java
+++ b/payment/src/main/java/com/ning/billing/payment/retry/RetryService.java
@@ -17,8 +17,8 @@ package com.ning.billing.payment.retry;
 
 import java.util.UUID;
 
-import com.ning.billing.notificationq.NotificationQueueService.NoSuchNotificationQueue;
-import com.ning.billing.notificationq.NotificationQueueService.NotificationQueueAlreadyExists;
+import com.ning.billing.notificationq.api.NotificationQueueService.NoSuchNotificationQueue;
+import com.ning.billing.notificationq.api.NotificationQueueService.NotificationQueueAlreadyExists;
 import com.ning.billing.util.callcontext.InternalCallContext;
 
 public interface RetryService {
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 84253fd..16de99e 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
@@ -33,7 +33,7 @@ public class TestEventJson extends PaymentTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testPaymentErrorEvent() throws Exception {
-        final PaymentErrorInternalEvent e = new DefaultPaymentErrorEvent(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), "no message", UUID.randomUUID(), 1L, 1L);
+        final PaymentErrorInternalEvent e = new DefaultPaymentErrorEvent(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), "no message");
         final String json = mapper.writeValueAsString(e);
 
         final Class<?> claz = Class.forName(DefaultPaymentErrorEvent.class.getName());
@@ -44,7 +44,7 @@ public class TestEventJson extends PaymentTestSuiteNoDB {
     @Test(groups = "fast")
     public void testPaymentInfoEvent() throws Exception {
         final PaymentInfoInternalEvent e = new DefaultPaymentInfoEvent(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), new BigDecimal(12.9), new Integer(13), PaymentStatus.SUCCESS,
-                UUID.randomUUID(), new DateTime(), 1L, 1L);
+                                                                       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 20e7c33..7826528 100644
--- a/payment/src/test/java/com/ning/billing/payment/MockInvoiceCreationEvent.java
+++ b/payment/src/test/java/com/ning/billing/payment/MockInvoiceCreationEvent.java
@@ -35,21 +35,18 @@ public class MockInvoiceCreationEvent implements InvoiceCreationInternalEvent {
     private final BigDecimal amountOwed;
     private final Currency currency;
     private final LocalDate invoiceCreationDate;
-    private final UUID userToken;
 
     @JsonCreator
     public MockInvoiceCreationEvent(@JsonProperty("invoiceId") final UUID invoiceId,
                                     @JsonProperty("accountId") final UUID accountId,
                                     @JsonProperty("amountOwed") final BigDecimal amountOwed,
                                     @JsonProperty("currency") final Currency currency,
-                                    @JsonProperty("invoiceCreationDate") final LocalDate invoiceCreationDate,
-                                    @JsonProperty("userToken") final UUID userToken) {
+                                    @JsonProperty("invoiceCreationDate") final LocalDate invoiceCreationDate) {
         this.invoiceId = invoiceId;
         this.accountId = accountId;
         this.amountOwed = amountOwed;
         this.currency = currency;
         this.invoiceCreationDate = invoiceCreationDate;
-        this.userToken = userToken;
     }
 
     @JsonIgnore
@@ -58,10 +55,6 @@ public class MockInvoiceCreationEvent implements InvoiceCreationInternalEvent {
         return BusInternalEventType.INVOICE_CREATION;
     }
 
-    @Override
-    public UUID getUserToken() {
-        return userToken;
-    }
 
     @Override
     public UUID getInvoiceId() {
@@ -93,19 +86,17 @@ public class MockInvoiceCreationEvent implements InvoiceCreationInternalEvent {
         final int prime = 31;
         int result = 1;
         result = prime * result
-                + ((accountId == null) ? 0 : accountId.hashCode());
+                 + ((accountId == null) ? 0 : accountId.hashCode());
         result = prime * result
-                + ((amountOwed == null) ? 0 : amountOwed.hashCode());
+                 + ((amountOwed == null) ? 0 : amountOwed.hashCode());
         result = prime * result
-                + ((currency == null) ? 0 : currency.hashCode());
+                 + ((currency == null) ? 0 : currency.hashCode());
         result = prime
-                * result
-                + ((invoiceCreationDate == null) ? 0 : invoiceCreationDate
+                 * result
+                 + ((invoiceCreationDate == null) ? 0 : invoiceCreationDate
                 .hashCode());
         result = prime * result
-                + ((invoiceId == null) ? 0 : invoiceId.hashCode());
-        result = prime * result
-                + ((userToken == null) ? 0 : userToken.hashCode());
+                 + ((invoiceId == null) ? 0 : invoiceId.hashCode());
         return result;
     }
 
@@ -152,23 +143,6 @@ public class MockInvoiceCreationEvent implements InvoiceCreationInternalEvent {
         } else if (!invoiceId.equals(other.invoiceId)) {
             return false;
         }
-        if (userToken == null) {
-            if (other.userToken != null) {
-                return false;
-            }
-        } else if (!userToken.equals(other.userToken)) {
-            return false;
-        }
         return true;
     }
-
-    @Override
-    public Long getTenantRecordId() {
-        return 1L;
-    }
-
-    @Override
-    public Long getAccountRecordId() {
-        return 1L;
-    }
 }
diff --git a/payment/src/test/java/com/ning/billing/payment/PaymentTestSuiteNoDB.java b/payment/src/test/java/com/ning/billing/payment/PaymentTestSuiteNoDB.java
index e6fa56a..12c3a14 100644
--- a/payment/src/test/java/com/ning/billing/payment/PaymentTestSuiteNoDB.java
+++ b/payment/src/test/java/com/ning/billing/payment/PaymentTestSuiteNoDB.java
@@ -24,7 +24,7 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 
 import com.ning.billing.GuicyKillbillTestSuiteNoDB;
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.osgi.api.OSGIServiceRegistration;
 import com.ning.billing.payment.api.PaymentApi;
 import com.ning.billing.payment.core.PaymentMethodProcessor;
diff --git a/payment/src/test/java/com/ning/billing/payment/PaymentTestSuiteWithEmbeddedDB.java b/payment/src/test/java/com/ning/billing/payment/PaymentTestSuiteWithEmbeddedDB.java
index c9cee71..a4b88ed 100644
--- a/payment/src/test/java/com/ning/billing/payment/PaymentTestSuiteWithEmbeddedDB.java
+++ b/payment/src/test/java/com/ning/billing/payment/PaymentTestSuiteWithEmbeddedDB.java
@@ -24,7 +24,7 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 
 import com.ning.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.osgi.api.OSGIServiceRegistration;
 import com.ning.billing.payment.api.PaymentApi;
 import com.ning.billing.payment.core.PaymentMethodProcessor;
diff --git a/payment/src/test/java/com/ning/billing/payment/TestPaymentHelper.java b/payment/src/test/java/com/ning/billing/payment/TestPaymentHelper.java
index 096cc8e..f5b2d62 100644
--- a/payment/src/test/java/com/ning/billing/payment/TestPaymentHelper.java
+++ b/payment/src/test/java/com/ning/billing/payment/TestPaymentHelper.java
@@ -22,8 +22,8 @@ import org.joda.time.LocalDate;
 import org.mockito.Mockito;
 
 import com.ning.billing.account.api.Account;
-import com.ning.billing.bus.PersistentBus;
-import com.ning.billing.bus.PersistentBus.EventBusException;
+import com.ning.billing.bus.api.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus.EventBusException;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
@@ -93,10 +93,9 @@ public class TestPaymentHelper {
         Mockito.when(invoiceApi.getInvoiceById(Mockito.eq(invoice.getId()), Mockito.<InternalTenantContext>any())).thenReturn(invoice);
         final InvoiceCreationInternalEvent event = new MockInvoiceCreationEvent(invoice.getId(), invoice.getAccountId(),
                                                                                 invoice.getBalance(), invoice.getCurrency(),
-                                                                                invoice.getInvoiceDate(),
-                                                                                context.getUserToken());
+                                                                                invoice.getInvoiceDate());
 
-        eventBus.post(event);
+        eventBus.post(event, context.getUserToken(), 1L, 1L);
         return invoice;
     }
 
diff --git a/server/src/main/java/com/ning/billing/server/DefaultServerService.java b/server/src/main/java/com/ning/billing/server/DefaultServerService.java
index 56f7040..9a12a17 100644
--- a/server/src/main/java/com/ning/billing/server/DefaultServerService.java
+++ b/server/src/main/java/com/ning/billing/server/DefaultServerService.java
@@ -13,6 +13,7 @@
  * License for the specific language governing permissions and limitations
  * under the License.
  */
+
 package com.ning.billing.server;
 
 import javax.inject.Inject;
@@ -20,8 +21,8 @@ import javax.inject.Inject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.ning.billing.bus.PersistentBus;
-import com.ning.billing.bus.PersistentBus.EventBusException;
+import com.ning.billing.bus.api.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus.EventBusException;
 import com.ning.billing.lifecycle.LifecycleHandlerType;
 import com.ning.billing.lifecycle.LifecycleHandlerType.LifecycleLevel;
 import com.ning.billing.server.notifications.PushNotificationListener;
diff --git a/server/src/main/java/com/ning/billing/server/listeners/KillbillGuiceListener.java b/server/src/main/java/com/ning/billing/server/listeners/KillbillGuiceListener.java
index f1d9da2..6337238 100644
--- a/server/src/main/java/com/ning/billing/server/listeners/KillbillGuiceListener.java
+++ b/server/src/main/java/com/ning/billing/server/listeners/KillbillGuiceListener.java
@@ -25,10 +25,10 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.ning.billing.beatrix.lifecycle.DefaultLifecycle;
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.jaxrs.resources.JaxRsResourceBase;
 import com.ning.billing.jaxrs.util.KillbillEventHandler;
-import com.ning.billing.notificationq.NotificationQueueService;
+import com.ning.billing.notificationq.api.NotificationQueueService;
 import com.ning.billing.server.config.KillbillServerConfig;
 import com.ning.billing.server.healthchecks.KillbillHealthcheck;
 import com.ning.billing.server.modules.KillbillServerModule;
diff --git a/util/src/main/java/com/ning/billing/util/bus/DefaultBusService.java b/util/src/main/java/com/ning/billing/util/bus/DefaultBusService.java
index c006c82..12fdcf5 100644
--- a/util/src/main/java/com/ning/billing/util/bus/DefaultBusService.java
+++ b/util/src/main/java/com/ning/billing/util/bus/DefaultBusService.java
@@ -16,7 +16,7 @@
 
 package com.ning.billing.util.bus;
 
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.lifecycle.LifecycleHandlerType;
 import com.ning.billing.lifecycle.LifecycleHandlerType.LifecycleLevel;
 import com.ning.billing.util.svcsapi.bus.BusService;
diff --git a/util/src/main/java/com/ning/billing/util/bus/InMemoryBusModule.java b/util/src/main/java/com/ning/billing/util/bus/InMemoryBusModule.java
index 19b6942..8cbc547 100644
--- a/util/src/main/java/com/ning/billing/util/bus/InMemoryBusModule.java
+++ b/util/src/main/java/com/ning/billing/util/bus/InMemoryBusModule.java
@@ -23,6 +23,6 @@ import com.ning.billing.util.glue.BusModule;
 public class InMemoryBusModule extends BusModule {
 
     public InMemoryBusModule(final ConfigSource configSource) {
-        super(BusType.MEMORY, configSource, "foo");
+        super(BusType.MEMORY, configSource, "foo", "bar");
     }
 }
diff --git a/util/src/main/java/com/ning/billing/util/customfield/api/DefaultCustomFieldCreationEvent.java b/util/src/main/java/com/ning/billing/util/customfield/api/DefaultCustomFieldCreationEvent.java
index 9346ef9..00d9b06 100644
--- a/util/src/main/java/com/ning/billing/util/customfield/api/DefaultCustomFieldCreationEvent.java
+++ b/util/src/main/java/com/ning/billing/util/customfield/api/DefaultCustomFieldCreationEvent.java
@@ -19,14 +19,13 @@ package com.ning.billing.util.customfield.api;
 import java.util.UUID;
 
 import com.ning.billing.ObjectType;
-import com.ning.billing.util.events.BusEventBase;
 import com.ning.billing.util.events.CustomFieldCreationEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultCustomFieldCreationEvent extends BusEventBase implements CustomFieldCreationEvent {
+public class DefaultCustomFieldCreationEvent implements CustomFieldCreationEvent {
 
     private final UUID customFieldId;
     private final UUID objectId;
@@ -34,12 +33,8 @@ public class DefaultCustomFieldCreationEvent extends BusEventBase implements Cus
 
     @JsonCreator
     public DefaultCustomFieldCreationEvent(@JsonProperty("customFieldId") final UUID customFieldId,
-                                       @JsonProperty("objectId") final UUID objectId,
-                                       @JsonProperty("objectType") final ObjectType objectType,
-                                       @JsonProperty("userToken") final UUID userToken,
-                                       @JsonProperty("accountRecordId") final Long accountRecordId,
-                                       @JsonProperty("tenantRecordId") final Long tenantRecordId) {
-        super(userToken, accountRecordId, tenantRecordId);
+                                           @JsonProperty("objectId") final UUID objectId,
+                                           @JsonProperty("objectType") final ObjectType objectType) {
         this.customFieldId = customFieldId;
         this.objectId = objectId;
         this.objectType = objectType;
diff --git a/util/src/main/java/com/ning/billing/util/customfield/api/DefaultCustomFieldDeletionEvent.java b/util/src/main/java/com/ning/billing/util/customfield/api/DefaultCustomFieldDeletionEvent.java
index fe3bf32..db53d0c 100644
--- a/util/src/main/java/com/ning/billing/util/customfield/api/DefaultCustomFieldDeletionEvent.java
+++ b/util/src/main/java/com/ning/billing/util/customfield/api/DefaultCustomFieldDeletionEvent.java
@@ -19,14 +19,13 @@ package com.ning.billing.util.customfield.api;
 import java.util.UUID;
 
 import com.ning.billing.ObjectType;
-import com.ning.billing.util.events.BusEventBase;
 import com.ning.billing.util.events.CustomFieldDeletionEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultCustomFieldDeletionEvent extends BusEventBase implements CustomFieldDeletionEvent {
+public class DefaultCustomFieldDeletionEvent implements CustomFieldDeletionEvent {
 
     private final UUID customFieldId;
     private final UUID objectId;
@@ -35,11 +34,7 @@ public class DefaultCustomFieldDeletionEvent extends BusEventBase implements Cus
     @JsonCreator
     public DefaultCustomFieldDeletionEvent(@JsonProperty("customFieldId") final UUID customFieldId,
                                            @JsonProperty("objectId") final UUID objectId,
-                                           @JsonProperty("objectType") final ObjectType objectType,
-                                           @JsonProperty("userToken") final UUID userToken,
-                                           @JsonProperty("accountRecordId") final Long accountRecordId,
-                                           @JsonProperty("tenantRecordId") final Long tenantRecordId) {
-        super(userToken, accountRecordId, tenantRecordId);
+                                           @JsonProperty("objectType") final ObjectType objectType) {
         this.customFieldId = customFieldId;
         this.objectId = objectId;
         this.objectType = objectType;
diff --git a/util/src/main/java/com/ning/billing/util/customfield/dao/DefaultCustomFieldDao.java b/util/src/main/java/com/ning/billing/util/customfield/dao/DefaultCustomFieldDao.java
index c040d22..589a819 100644
--- a/util/src/main/java/com/ning/billing/util/customfield/dao/DefaultCustomFieldDao.java
+++ b/util/src/main/java/com/ning/billing/util/customfield/dao/DefaultCustomFieldDao.java
@@ -22,15 +22,13 @@ import java.util.UUID;
 import javax.annotation.Nullable;
 
 import org.skife.jdbi.v2.IDBI;
-import org.skife.jdbi.v2.sqlobject.mixins.Transmogrifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.ning.billing.BillingExceptionBase;
 import com.ning.billing.ErrorCode;
 import com.ning.billing.ObjectType;
-import com.ning.billing.bus.PersistentBus;
-import com.ning.billing.bus.dao.PersistentBusSqlDao;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.util.api.CustomFieldApiException;
 import com.ning.billing.util.audit.ChangeType;
 import com.ning.billing.util.cache.CacheControllerDispatcher;
@@ -108,20 +106,19 @@ public class DefaultCustomFieldDao extends EntityDaoBase<CustomFieldModelDao, Cu
             throws BillingExceptionBase {
 
         BusInternalEvent customFieldEvent = null;
-        switch(changeType) {
+        switch (changeType) {
             case INSERT:
-                customFieldEvent = new DefaultCustomFieldCreationEvent(customField.getId(), customField.getObjectId(), customField.getObjectType(), context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
+                customFieldEvent = new DefaultCustomFieldCreationEvent(customField.getId(), customField.getObjectId(), customField.getObjectType());
                 break;
             case DELETE:
-                customFieldEvent = new DefaultCustomFieldDeletionEvent(customField.getId(), customField.getObjectId(), customField.getObjectType(), context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
-
+                customFieldEvent = new DefaultCustomFieldDeletionEvent(customField.getId(), customField.getObjectId(), customField.getObjectType());
                 break;
             default:
                 return;
         }
 
         try {
-            bus.postFromTransaction(customFieldEvent, entitySqlDaoWrapperFactory.getSqlDao());
+            bus.postFromTransaction(customFieldEvent, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId(), entitySqlDaoWrapperFactory.getSqlDao());
         } catch (PersistentBus.EventBusException e) {
             log.warn("Failed to post tag event for custom field " + customField.getId().toString(), e);
         }
diff --git a/util/src/main/java/com/ning/billing/util/entity/EntityBase.java b/util/src/main/java/com/ning/billing/util/entity/EntityBase.java
index c188beb..24983bb 100644
--- a/util/src/main/java/com/ning/billing/util/entity/EntityBase.java
+++ b/util/src/main/java/com/ning/billing/util/entity/EntityBase.java
@@ -19,8 +19,6 @@ package com.ning.billing.util.entity;
 import java.util.UUID;
 
 import org.joda.time.DateTime;
-import org.joda.time.ReadableInstant;
-import org.joda.time.ReadablePartial;
 
 public abstract class EntityBase implements Entity {
 
diff --git a/util/src/main/java/com/ning/billing/util/events/BusInternalEvent.java b/util/src/main/java/com/ning/billing/util/events/BusInternalEvent.java
index 13629bb..a51b1e9 100644
--- a/util/src/main/java/com/ning/billing/util/events/BusInternalEvent.java
+++ b/util/src/main/java/com/ning/billing/util/events/BusInternalEvent.java
@@ -16,9 +16,10 @@
 
 package com.ning.billing.util.events;
 
-import com.ning.billing.bus.BusPersistentEvent;
 
-public interface BusInternalEvent extends BusPersistentEvent {
+import com.ning.billing.bus.api.BusEvent;
+
+public interface BusInternalEvent extends BusEvent {
 
     public enum BusInternalEventType {
         ACCOUNT_CREATE,
diff --git a/util/src/main/java/com/ning/billing/util/glue/BusModule.java b/util/src/main/java/com/ning/billing/util/glue/BusModule.java
index eafcb5b..b757a56 100644
--- a/util/src/main/java/com/ning/billing/util/glue/BusModule.java
+++ b/util/src/main/java/com/ning/billing/util/glue/BusModule.java
@@ -20,8 +20,8 @@ import org.skife.config.ConfigSource;
 import org.skife.config.ConfigurationObjectFactory;
 
 import com.ning.billing.bus.InMemoryPersistentBus;
-import com.ning.billing.bus.PersistentBus;
-import com.ning.billing.bus.PersistentBusConfig;
+import com.ning.billing.bus.api.PersistentBus;
+import com.ning.billing.bus.api.PersistentBusConfig;
 import com.ning.billing.util.bus.DefaultBusService;
 import com.ning.billing.util.svcsapi.bus.BusService;
 
@@ -29,22 +29,25 @@ import com.google.inject.AbstractModule;
 
 public class BusModule extends AbstractModule {
 
+    // This has to match the DLL
+    private final static String BUS_TABLE_NAME = "bus_events";
+    private final static String BUS_HISTORY_TABLE_NAME = "bus_events_history";
+
     private final BusType type;
     private final ConfigSource configSource;
     private final String tableName;
+    private final String historyTableName;
 
     public BusModule(final ConfigSource configSource) {
-        this(BusType.PERSISTENT, configSource, "bus_events");
+        this(BusType.PERSISTENT, configSource, BUS_TABLE_NAME, BUS_HISTORY_TABLE_NAME);
     }
 
-    public BusModule(final ConfigSource configSource, final String tableName) {
-        this(BusType.PERSISTENT, configSource, tableName);
-    }
 
-    protected BusModule(final BusType type, final ConfigSource configSource, final String tableName) {
+    protected BusModule(final BusType type, final ConfigSource configSource, final String tableName, final String historyTableName) {
         this.type = type;
         this.configSource = configSource;
         this.tableName = tableName;
+        this.historyTableName = historyTableName;
     }
 
     public enum BusType {
@@ -75,7 +78,7 @@ public class BusModule extends AbstractModule {
 
     private void configurePersistentEventBus() {
         configurePersistentBusConfig();
-        bind(BusProvider.class).toInstance(new BusProvider(tableName));
+        bind(BusProvider.class).toInstance(new BusProvider(tableName, historyTableName));
         bind(PersistentBus.class).toProvider(BusProvider.class).asEagerSingleton();
     }
 
diff --git a/util/src/main/java/com/ning/billing/util/glue/BusProvider.java b/util/src/main/java/com/ning/billing/util/glue/BusProvider.java
index 99e20dd..2adc094 100644
--- a/util/src/main/java/com/ning/billing/util/glue/BusProvider.java
+++ b/util/src/main/java/com/ning/billing/util/glue/BusProvider.java
@@ -6,8 +6,8 @@ import javax.inject.Provider;
 import org.skife.jdbi.v2.IDBI;
 
 import com.ning.billing.bus.DefaultPersistentBus;
-import com.ning.billing.bus.PersistentBus;
-import com.ning.billing.bus.PersistentBusConfig;
+import com.ning.billing.bus.api.PersistentBus;
+import com.ning.billing.bus.api.PersistentBusConfig;
 import com.ning.billing.util.clock.Clock;
 
 
@@ -17,9 +17,11 @@ public class BusProvider implements Provider<PersistentBus> {
     private Clock clock;
     private PersistentBusConfig busConfig;
     private String tableName;
+    private String historyTableName;
 
-    public BusProvider(final String tableName) {
+    public BusProvider(final String tableName, final String historyTableName) {
         this.tableName = tableName;
+        this.historyTableName = historyTableName;
     }
 
     @Inject
@@ -32,6 +34,6 @@ public class BusProvider implements Provider<PersistentBus> {
 
     @Override
     public PersistentBus get() {
-        return new DefaultPersistentBus(dbi, clock, busConfig, tableName);
+        return new DefaultPersistentBus(dbi, clock, busConfig, tableName, historyTableName);
     }
 }
diff --git a/util/src/main/java/com/ning/billing/util/glue/NotificationQueueModule.java b/util/src/main/java/com/ning/billing/util/glue/NotificationQueueModule.java
index b5a4294..98525cc 100644
--- a/util/src/main/java/com/ning/billing/util/glue/NotificationQueueModule.java
+++ b/util/src/main/java/com/ning/billing/util/glue/NotificationQueueModule.java
@@ -20,8 +20,9 @@ import org.skife.config.ConfigSource;
 import org.skife.config.ConfigurationObjectFactory;
 
 import com.ning.billing.notificationq.DefaultNotificationQueueService;
-import com.ning.billing.notificationq.NotificationQueueConfig;
-import com.ning.billing.notificationq.NotificationQueueService;
+import com.ning.billing.notificationq.api.NotificationQueueConfig;
+import com.ning.billing.notificationq.api.NotificationQueueService;
+
 import com.google.inject.AbstractModule;
 
 public class NotificationQueueModule extends AbstractModule {
diff --git a/util/src/main/java/com/ning/billing/util/svcsapi/bus/BusService.java b/util/src/main/java/com/ning/billing/util/svcsapi/bus/BusService.java
index 766f74d..7ecf60a 100644
--- a/util/src/main/java/com/ning/billing/util/svcsapi/bus/BusService.java
+++ b/util/src/main/java/com/ning/billing/util/svcsapi/bus/BusService.java
@@ -16,11 +16,9 @@
 
 package com.ning.billing.util.svcsapi.bus;
 
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.lifecycle.KillbillService;
 
 public interface BusService extends KillbillService {
-
-   // API_FIX should be removed and server should only use public bus
    public PersistentBus getBus();
 }
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 19d53f6..df8068e 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,7 +19,6 @@ package com.ning.billing.util.tag.api.user;
 import java.util.UUID;
 
 import com.ning.billing.ObjectType;
-import com.ning.billing.util.events.BusEventBase;
 import com.ning.billing.util.events.ControlTagCreationInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
 
@@ -27,7 +26,7 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultControlTagCreationEvent extends BusEventBase implements ControlTagCreationInternalEvent {
+public class DefaultControlTagCreationEvent implements ControlTagCreationInternalEvent {
 
     private final UUID tagId;
     private final UUID objectId;
@@ -38,11 +37,8 @@ public class DefaultControlTagCreationEvent extends BusEventBase implements Cont
     public DefaultControlTagCreationEvent(@JsonProperty("tagId") final UUID tagId,
                                           @JsonProperty("objectId") final UUID objectId,
                                           @JsonProperty("objectType") final ObjectType objectType,
-                                          @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
-                                          @JsonProperty("userToken") final UUID userToken,
-                                          @JsonProperty("accountRecordId") final Long accountRecordId,
-                                          @JsonProperty("tenantRecordId") final Long tenantRecordId) {
-        super(userToken, accountRecordId, tenantRecordId);
+                                          @JsonProperty("tagDefinition") final TagDefinition tagDefinition) {
+
         this.tagId = tagId;
         this.objectId = objectId;
         this.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 cdaaa31..4596866 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,7 +18,6 @@ package com.ning.billing.util.tag.api.user;
 
 import java.util.UUID;
 
-import com.ning.billing.util.events.BusEventBase;
 import com.ning.billing.util.events.ControlTagDefinitionCreationInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
 
@@ -26,18 +25,14 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultControlTagDefinitionCreationEvent extends BusEventBase implements ControlTagDefinitionCreationInternalEvent {
+public class DefaultControlTagDefinitionCreationEvent implements ControlTagDefinitionCreationInternalEvent {
 
     private final UUID tagDefinitionId;
     private final TagDefinition tagDefinition;
 
     @JsonCreator
     public DefaultControlTagDefinitionCreationEvent(@JsonProperty("tagDefinitionId") final UUID tagDefinitionId,
-                                                    @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
-                                                    @JsonProperty("userToken") final UUID userToken,
-                                                    @JsonProperty("accountRecordId") final Long accountRecordId,
-                                                    @JsonProperty("tenantRecordId") final Long tenantRecordId) {
-        super(userToken, accountRecordId, tenantRecordId);
+                                                    @JsonProperty("tagDefinition") final TagDefinition tagDefinition) {
         this.tagDefinitionId = tagDefinitionId;
         this.tagDefinition = tagDefinition;
     }
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 186666b..b1d45f8 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,7 +18,6 @@ package com.ning.billing.util.tag.api.user;
 
 import java.util.UUID;
 
-import com.ning.billing.util.events.BusEventBase;
 import com.ning.billing.util.events.ControlTagDefinitionDeletionInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
 
@@ -26,18 +25,14 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultControlTagDefinitionDeletionEvent extends BusEventBase implements ControlTagDefinitionDeletionInternalEvent {
+public class DefaultControlTagDefinitionDeletionEvent implements ControlTagDefinitionDeletionInternalEvent {
 
     private final UUID tagDefinitionId;
     private final TagDefinition tagDefinition;
 
     @JsonCreator
     public DefaultControlTagDefinitionDeletionEvent(@JsonProperty("tagDefinitionId") final UUID tagDefinitionId,
-                                                    @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
-                                                    @JsonProperty("userToken") final UUID userToken,
-                                                    @JsonProperty("accountRecordId") final Long accountRecordId,
-                                                    @JsonProperty("tenantRecordId") final Long tenantRecordId) {
-        super(userToken, accountRecordId, tenantRecordId);
+                                                    @JsonProperty("tagDefinition") final TagDefinition tagDefinition) {
         this.tagDefinitionId = tagDefinitionId;
         this.tagDefinition = tagDefinition;
     }
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 320f03b..8972a9d 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,7 +19,6 @@ package com.ning.billing.util.tag.api.user;
 import java.util.UUID;
 
 import com.ning.billing.ObjectType;
-import com.ning.billing.util.events.BusEventBase;
 import com.ning.billing.util.events.ControlTagDeletionInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
 
@@ -27,7 +26,8 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultControlTagDeletionEvent extends BusEventBase implements ControlTagDeletionInternalEvent {
+public class DefaultControlTagDeletionEvent implements ControlTagDeletionInternalEvent {
+
     private final UUID tagId;
     final UUID objectId;
     final ObjectType objectType;
@@ -37,11 +37,7 @@ public class DefaultControlTagDeletionEvent extends BusEventBase implements Cont
     public DefaultControlTagDeletionEvent(@JsonProperty("tagId") final UUID tagId,
                                           @JsonProperty("objectId") final UUID objectId,
                                           @JsonProperty("objectType") final ObjectType objectType,
-                                          @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
-                                          @JsonProperty("userToken") final UUID userToken,
-                                          @JsonProperty("accountRecordId") final Long accountRecordId,
-                                          @JsonProperty("tenantRecordId") final Long tenantRecordId) {
-        super(userToken, accountRecordId, tenantRecordId);
+                                          @JsonProperty("tagDefinition") final TagDefinition tagDefinition) {
         this.tagId = tagId;
         this.objectId = objectId;
         this.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 f80d7cb..9cfb6b1 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,7 +19,6 @@ package com.ning.billing.util.tag.api.user;
 import java.util.UUID;
 
 import com.ning.billing.ObjectType;
-import com.ning.billing.util.events.BusEventBase;
 import com.ning.billing.util.events.UserTagCreationInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
 
@@ -27,7 +26,8 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultUserTagCreationEvent extends BusEventBase implements UserTagCreationInternalEvent {
+public class DefaultUserTagCreationEvent implements UserTagCreationInternalEvent {
+
     private final UUID tagId;
     private final UUID objectId;
     private final ObjectType objectType;
@@ -35,13 +35,9 @@ public class DefaultUserTagCreationEvent extends BusEventBase implements UserTag
 
     @JsonCreator
     public DefaultUserTagCreationEvent(@JsonProperty("tagId") final UUID tagId,
-            @JsonProperty("objectId") final UUID objectId,
-            @JsonProperty("objectType") final ObjectType objectType,
-            @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
-            @JsonProperty("userToken") final UUID userToken,
-            @JsonProperty("accountRecordId") final Long accountRecordId,
-            @JsonProperty("tenantRecordId") final Long tenantRecordId) {
-        super(userToken, accountRecordId, tenantRecordId);
+                                       @JsonProperty("objectId") final UUID objectId,
+                                       @JsonProperty("objectType") final ObjectType objectType,
+                                       @JsonProperty("tagDefinition") final TagDefinition tagDefinition) {
         this.tagId = tagId;
         this.objectId = objectId;
         this.objectType = objectType;
@@ -75,7 +71,6 @@ public class DefaultUserTagCreationEvent extends BusEventBase implements UserTag
     }
 
 
-
     @Override
     public String toString() {
         final StringBuilder sb = new StringBuilder();
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 869cb89..f5db63d 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,7 +18,6 @@ package com.ning.billing.util.tag.api.user;
 
 import java.util.UUID;
 
-import com.ning.billing.util.events.BusEventBase;
 import com.ning.billing.util.events.UserTagDefinitionCreationInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
 
@@ -26,18 +25,14 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultUserTagDefinitionCreationEvent extends BusEventBase implements UserTagDefinitionCreationInternalEvent {
+public class DefaultUserTagDefinitionCreationEvent implements UserTagDefinitionCreationInternalEvent {
 
     private final UUID tagDefinitionId;
     private final TagDefinition tagDefinition;
 
     @JsonCreator
     public DefaultUserTagDefinitionCreationEvent(@JsonProperty("tagDefinitionId") final UUID tagDefinitionId,
-                                                 @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
-                                                 @JsonProperty("userToken") final UUID userToken,
-                                                 @JsonProperty("accountRecordId") final Long accountRecordId,
-                                                 @JsonProperty("tenantRecordId") final Long tenantRecordId) {
-        super(userToken, accountRecordId, tenantRecordId);
+                                                 @JsonProperty("tagDefinition") final TagDefinition tagDefinition) {
         this.tagDefinitionId = tagDefinitionId;
         this.tagDefinition = tagDefinition;
     }
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 66043ec..7eeeb5b 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,7 +18,6 @@ package com.ning.billing.util.tag.api.user;
 
 import java.util.UUID;
 
-import com.ning.billing.util.events.BusEventBase;
 import com.ning.billing.util.events.UserTagDefinitionDeletionInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
 
@@ -26,18 +25,14 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultUserTagDefinitionDeletionEvent extends BusEventBase implements UserTagDefinitionDeletionInternalEvent {
+public class DefaultUserTagDefinitionDeletionEvent implements UserTagDefinitionDeletionInternalEvent {
 
     private final UUID tagDefinitionId;
     private final TagDefinition tagDefinition;
 
     @JsonCreator
     public DefaultUserTagDefinitionDeletionEvent(@JsonProperty("tagDefinitionId") final UUID tagDefinitionId,
-                                                 @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
-                                                 @JsonProperty("userToken") final UUID userToken,
-                                                 @JsonProperty("accountRecordId") final Long accountRecordId,
-                                                 @JsonProperty("tenantRecordId") final Long tenantRecordId) {
-        super(userToken, accountRecordId, tenantRecordId);
+                                                 @JsonProperty("tagDefinition") final TagDefinition tagDefinition) {
         this.tagDefinitionId = tagDefinitionId;
         this.tagDefinition = tagDefinition;
     }
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 7b006a5..f74c53e 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,7 +19,6 @@ package com.ning.billing.util.tag.api.user;
 import java.util.UUID;
 
 import com.ning.billing.ObjectType;
-import com.ning.billing.util.events.BusEventBase;
 import com.ning.billing.util.events.UserTagDeletionInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
 
@@ -27,7 +26,7 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultUserTagDeletionEvent extends BusEventBase implements UserTagDeletionInternalEvent {
+public class DefaultUserTagDeletionEvent implements UserTagDeletionInternalEvent {
     private final UUID tagId;
     private final UUID objectId;
     private final ObjectType objectType;
@@ -37,11 +36,7 @@ public class DefaultUserTagDeletionEvent extends BusEventBase implements UserTag
     public DefaultUserTagDeletionEvent(@JsonProperty("tagId") final UUID tagId,
                                        @JsonProperty("objectId") final UUID objectId,
                                        @JsonProperty("objectType") final ObjectType objectType,
-                                       @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
-                                       @JsonProperty("userToken") final UUID userToken,
-                                       @JsonProperty("accountRecordId") final Long accountRecordId,
-                                       @JsonProperty("tenantRecordId") final Long tenantRecordId) {
-        super(userToken, accountRecordId, tenantRecordId);
+                                       @JsonProperty("tagDefinition") final TagDefinition tagDefinition) {
         this.tagId = tagId;
         this.objectId = objectId;
         this.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 e8275ea..809d5bf 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
@@ -33,35 +33,35 @@ import com.ning.billing.util.tag.dao.TagDefinitionModelDao;
 
 public class TagEventBuilder {
 
-    public UserTagDefinitionCreationInternalEvent newUserTagDefinitionCreationEvent(final UUID tagDefinitionId, final TagDefinitionModelDao tagDefinition, final InternalCallContext context) {
-        return new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, new DefaultTagDefinition(tagDefinition, false), context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
+    public UserTagDefinitionCreationInternalEvent newUserTagDefinitionCreationEvent(final UUID tagDefinitionId, final TagDefinitionModelDao tagDefinition) {
+        return new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, new DefaultTagDefinition(tagDefinition, false));
     }
 
-    public UserTagDefinitionDeletionInternalEvent newUserTagDefinitionDeletionEvent(final UUID tagDefinitionId, final TagDefinitionModelDao tagDefinition, final InternalCallContext context) {
-        return new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, new DefaultTagDefinition(tagDefinition, false), context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
+    public UserTagDefinitionDeletionInternalEvent newUserTagDefinitionDeletionEvent(final UUID tagDefinitionId, final TagDefinitionModelDao tagDefinition) {
+        return new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, new DefaultTagDefinition(tagDefinition, false));
     }
 
-    public ControlTagDefinitionCreationInternalEvent newControlTagDefinitionCreationEvent(final UUID tagDefinitionId, final TagDefinitionModelDao tagDefinition, final InternalCallContext context) {
-        return new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, new DefaultTagDefinition(tagDefinition, true), context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
+    public ControlTagDefinitionCreationInternalEvent newControlTagDefinitionCreationEvent(final UUID tagDefinitionId, final TagDefinitionModelDao tagDefinition) {
+        return new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, new DefaultTagDefinition(tagDefinition, true));
     }
 
-    public ControlTagDefinitionDeletionInternalEvent newControlTagDefinitionDeletionEvent(final UUID tagDefinitionId, final TagDefinitionModelDao tagDefinition, final InternalCallContext context) {
-        return new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, new DefaultTagDefinition(tagDefinition, true), context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
+    public ControlTagDefinitionDeletionInternalEvent newControlTagDefinitionDeletionEvent(final UUID tagDefinitionId, final TagDefinitionModelDao tagDefinition) {
+        return new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, new DefaultTagDefinition(tagDefinition, true));
     }
 
-    public UserTagCreationInternalEvent newUserTagCreationEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinitionModelDao tagDefinition, final InternalCallContext context) {
-        return new DefaultUserTagCreationEvent(tagId, objectId, objectType, new DefaultTagDefinition(tagDefinition, false), context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
+    public UserTagCreationInternalEvent newUserTagCreationEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinitionModelDao tagDefinition) {
+        return new DefaultUserTagCreationEvent(tagId, objectId, objectType, new DefaultTagDefinition(tagDefinition, false));
     }
 
-    public UserTagDeletionInternalEvent newUserTagDeletionEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinitionModelDao tagDefinition, final InternalCallContext context) {
-        return new DefaultUserTagDeletionEvent(tagId, objectId, objectType, new DefaultTagDefinition(tagDefinition, false), context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
+    public UserTagDeletionInternalEvent newUserTagDeletionEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinitionModelDao tagDefinition) {
+        return new DefaultUserTagDeletionEvent(tagId, objectId, objectType, new DefaultTagDefinition(tagDefinition, false));
     }
 
-    public ControlTagCreationInternalEvent newControlTagCreationEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinitionModelDao tagDefinition, final InternalCallContext context) {
-        return new DefaultControlTagCreationEvent(tagId, objectId, objectType, new DefaultTagDefinition(tagDefinition, true), context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
+    public ControlTagCreationInternalEvent newControlTagCreationEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinitionModelDao tagDefinition) {
+        return new DefaultControlTagCreationEvent(tagId, objectId, objectType, new DefaultTagDefinition(tagDefinition, true));
     }
 
-    public ControlTagDeletionInternalEvent newControlTagDeletionEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinitionModelDao tagDefinition, final InternalCallContext context) {
-        return new DefaultControlTagDeletionEvent(tagId, objectId, objectType, new DefaultTagDefinition(tagDefinition, true), context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
+    public ControlTagDeletionInternalEvent newControlTagDeletionEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinitionModelDao tagDefinition) {
+        return new DefaultControlTagDeletionEvent(tagId, objectId, objectType, new DefaultTagDefinition(tagDefinition, true));
     }
 }
diff --git a/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDao.java b/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDao.java
index 2c47961..9ffa746 100644
--- a/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDao.java
+++ b/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDao.java
@@ -28,7 +28,7 @@ import org.slf4j.LoggerFactory;
 import com.ning.billing.BillingExceptionBase;
 import com.ning.billing.ErrorCode;
 import com.ning.billing.ObjectType;
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.util.api.TagApiException;
 import com.ning.billing.util.audit.ChangeType;
 import com.ning.billing.util.cache.CacheControllerDispatcher;
@@ -111,20 +111,20 @@ public class DefaultTagDao extends EntityDaoBase<TagModelDao, Tag, TagApiExcepti
         switch (changeType) {
             case INSERT:
                 tagEvent = (isControlTag) ?
-                           tagEventBuilder.newControlTagCreationEvent(tag.getId(), tag.getObjectId(), tag.getObjectType(), tagDefinition, context) :
-                           tagEventBuilder.newUserTagCreationEvent(tag.getId(), tag.getObjectId(), tag.getObjectType(), tagDefinition, context);
+                           tagEventBuilder.newControlTagCreationEvent(tag.getId(), tag.getObjectId(), tag.getObjectType(), tagDefinition) :
+                           tagEventBuilder.newUserTagCreationEvent(tag.getId(), tag.getObjectId(), tag.getObjectType(), tagDefinition);
                 break;
             case DELETE:
                 tagEvent = (isControlTag) ?
-                           tagEventBuilder.newControlTagDeletionEvent(tag.getId(), tag.getObjectId(), tag.getObjectType(), tagDefinition, context) :
-                           tagEventBuilder.newUserTagDeletionEvent(tag.getId(), tag.getObjectId(), tag.getObjectType(), tagDefinition, context);
+                           tagEventBuilder.newControlTagDeletionEvent(tag.getId(), tag.getObjectId(), tag.getObjectType(), tagDefinition) :
+                           tagEventBuilder.newUserTagDeletionEvent(tag.getId(), tag.getObjectId(), tag.getObjectType(), tagDefinition);
                 break;
             default:
                 return;
         }
 
         try {
-            bus.postFromTransaction(tagEvent, entitySqlDaoWrapperFactory.getSqlDao());
+            bus.postFromTransaction(tagEvent, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId(), entitySqlDaoWrapperFactory.getSqlDao());
         } catch (PersistentBus.EventBusException e) {
             log.warn("Failed to post tag event for tag " + tag.getId().toString(), e);
         }
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 6bc6fff..5f20e0f 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
@@ -28,7 +28,7 @@ import org.slf4j.LoggerFactory;
 
 import com.ning.billing.BillingExceptionBase;
 import com.ning.billing.ErrorCode;
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.util.api.TagDefinitionApiException;
 import com.ning.billing.util.audit.ChangeType;
 import com.ning.billing.util.cache.CacheControllerDispatcher;
@@ -169,12 +169,12 @@ public class DefaultTagDefinitionDao extends EntityDaoBase<TagDefinitionModelDao
                     final boolean isControlTag = TagModelDaoHelper.isControlTag(tagDefinition.getName());
                     final TagDefinitionInternalEvent tagDefinitionEvent;
                     if (isControlTag) {
-                        tagDefinitionEvent = tagEventBuilder.newControlTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition, context);
+                        tagDefinitionEvent = tagEventBuilder.newControlTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition);
                     } else {
-                        tagDefinitionEvent = tagEventBuilder.newUserTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition, context);
+                        tagDefinitionEvent = tagEventBuilder.newUserTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition);
                     }
                     try {
-                        bus.postFromTransaction(tagDefinitionEvent, entitySqlDaoWrapperFactory.getSqlDao());
+                        bus.postFromTransaction(tagDefinitionEvent, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId(), entitySqlDaoWrapperFactory.getSqlDao());
                     } catch (PersistentBus.EventBusException e) {
                         log.warn("Failed to post tag definition creation event for tag " + tagDefinition.getId(), e);
                     }
@@ -235,21 +235,21 @@ public class DefaultTagDefinitionDao extends EntityDaoBase<TagDefinitionModelDao
         switch (changeType) {
             case INSERT:
                 tagDefinitionEvent = (isControlTag) ?
-                                     tagEventBuilder.newControlTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition, context) :
-                                     tagEventBuilder.newUserTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition, context);
+                                     tagEventBuilder.newControlTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition) :
+                                     tagEventBuilder.newUserTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition);
 
                 break;
             case DELETE:
                 tagDefinitionEvent = (isControlTag) ?
-                                     tagEventBuilder.newControlTagDefinitionDeletionEvent(tagDefinition.getId(), tagDefinition, context) :
-                                     tagEventBuilder.newUserTagDefinitionDeletionEvent(tagDefinition.getId(), tagDefinition, context);
+                                     tagEventBuilder.newControlTagDefinitionDeletionEvent(tagDefinition.getId(), tagDefinition) :
+                                     tagEventBuilder.newUserTagDefinitionDeletionEvent(tagDefinition.getId(), tagDefinition);
                 break;
             default:
                 return;
         }
 
         try {
-            bus.postFromTransaction(tagDefinitionEvent, entitySqlDaoWrapperFactory.getSqlDao());
+            bus.postFromTransaction(tagDefinitionEvent, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId(), entitySqlDaoWrapperFactory.getSqlDao());
         } catch (PersistentBus.EventBusException e) {
             log.warn("Failed to post tag definition event for tag " + tagDefinition.getId().toString(), e);
         }
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 ef28f10..7b52ccb 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
@@ -13,6 +13,7 @@
  * License for the specific language governing permissions and limitations
  * under the License.
  */
+
 package com.ning.billing.util.userrequest;
 
 import java.util.LinkedList;
@@ -20,6 +21,7 @@ import java.util.List;
 import java.util.UUID;
 import java.util.concurrent.TimeoutException;
 
+import com.ning.billing.bus.api.BusEventWithMetadata;
 import com.ning.billing.util.events.AccountChangeInternalEvent;
 import com.ning.billing.util.events.AccountCreationInternalEvent;
 import com.ning.billing.util.events.BusInternalEvent;
@@ -86,36 +88,37 @@ public abstract class CompletionUserRequestBase implements CompletionUserRequest
     }
 
     @Override
-    public void onBusEvent(final BusInternalEvent curEvent) {
+    public void onBusEvent(final BusEventWithMetadata<BusInternalEvent> busEventWithMetadata) {
+
+        final BusInternalEvent curEvent = busEventWithMetadata.getEvent();
         // Check if this is for us..
-        if (curEvent.getUserToken() == null ||
-                !curEvent.getUserToken().equals(userToken)) {
+        if (busEventWithMetadata.getUserToken() == null ||
+            !busEventWithMetadata.getUserToken().equals(userToken)) {
             return;
         }
-
         events.add(curEvent);
 
         switch (curEvent.getBusEventType()) {
             case ACCOUNT_CREATE:
-                onAccountCreation((AccountCreationInternalEvent) curEvent);
+                onAccountCreation((BusEventWithMetadata<AccountCreationInternalEvent>) curEvent);
                 break;
             case ACCOUNT_CHANGE:
-                onAccountChange((AccountChangeInternalEvent) curEvent);
+                onAccountChange((BusEventWithMetadata<AccountChangeInternalEvent>) curEvent);
                 break;
             case SUBSCRIPTION_TRANSITION:
-                onSubscriptionTransition((EffectiveSubscriptionInternalEvent) curEvent);
+                onSubscriptionTransition((BusEventWithMetadata<EffectiveSubscriptionInternalEvent>) curEvent);
                 break;
             case INVOICE_EMPTY:
-                onEmptyInvoice((NullInvoiceInternalEvent) curEvent);
+                onEmptyInvoice((BusEventWithMetadata<NullInvoiceInternalEvent>) curEvent);
                 break;
             case INVOICE_CREATION:
-                onInvoiceCreation((InvoiceCreationInternalEvent) curEvent);
+                onInvoiceCreation((BusEventWithMetadata<InvoiceCreationInternalEvent>) curEvent);
                 break;
             case PAYMENT_INFO:
-                onPaymentInfo((PaymentInfoInternalEvent) curEvent);
+                onPaymentInfo((BusEventWithMetadata<PaymentInfoInternalEvent>) curEvent);
                 break;
             case PAYMENT_ERROR:
-                onPaymentError((PaymentErrorInternalEvent) curEvent);
+                onPaymentError((BusEventWithMetadata<PaymentErrorInternalEvent>) curEvent);
                 break;
             default:
                 throw new RuntimeException("Unexpected event type " + curEvent.getBusEventType());
@@ -127,30 +130,30 @@ public abstract class CompletionUserRequestBase implements CompletionUserRequest
      * Default no-op implementation so as to not have to implement all callbacks
      */
     @Override
-    public void onAccountCreation(final AccountCreationInternalEvent curEvent) {
+    public void onAccountCreation(final BusEventWithMetadata<AccountCreationInternalEvent> curEvent) {
     }
 
     @Override
-    public void onAccountChange(final AccountChangeInternalEvent curEvent) {
+    public void onAccountChange(final BusEventWithMetadata<AccountChangeInternalEvent> curEvent) {
     }
 
     @Override
-    public void onSubscriptionTransition(final EffectiveSubscriptionInternalEvent curEventEffective) {
+    public void onSubscriptionTransition(final BusEventWithMetadata<EffectiveSubscriptionInternalEvent> curEventEffective) {
     }
 
     @Override
-    public void onEmptyInvoice(final NullInvoiceInternalEvent curEvent) {
+    public void onEmptyInvoice(final BusEventWithMetadata<NullInvoiceInternalEvent> curEvent) {
     }
 
     @Override
-    public void onInvoiceCreation(final InvoiceCreationInternalEvent curEvent) {
+    public void onInvoiceCreation(final BusEventWithMetadata<InvoiceCreationInternalEvent> curEvent) {
     }
 
     @Override
-    public void onPaymentInfo(final PaymentInfoInternalEvent curEvent) {
+    public void onPaymentInfo(final BusEventWithMetadata<PaymentInfoInternalEvent> curEvent) {
     }
 
     @Override
-    public void onPaymentError(final PaymentErrorInternalEvent curEvent) {
+    public void onPaymentError(final BusEventWithMetadata<PaymentErrorInternalEvent> curEvent) {
     }
 }
diff --git a/util/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestNotifier.java b/util/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestNotifier.java
index 0863487..fe87c72 100644
--- a/util/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestNotifier.java
+++ b/util/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestNotifier.java
@@ -13,16 +13,17 @@
  * License for the specific language governing permissions and limitations
  * under the License.
  */
+
 package com.ning.billing.util.userrequest;
 
 
+import com.ning.billing.bus.api.BusEventWithMetadata;
 import com.ning.billing.util.events.BusInternalEvent;
 
 
-
 public interface CompletionUserRequestNotifier {
 
     public void notifyForCompletion();
 
-    public void onBusEvent(BusInternalEvent curEvent);
+    public void onBusEvent(final BusEventWithMetadata<BusInternalEvent> busEventWithMetadata);
 }
diff --git a/util/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestWaiter.java b/util/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestWaiter.java
index 88bd9fe..1c723e7 100644
--- a/util/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestWaiter.java
+++ b/util/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestWaiter.java
@@ -18,6 +18,7 @@ package com.ning.billing.util.userrequest;
 import java.util.List;
 import java.util.concurrent.TimeoutException;
 
+import com.ning.billing.bus.api.BusEventWithMetadata;
 import com.ning.billing.util.events.AccountChangeInternalEvent;
 import com.ning.billing.util.events.AccountCreationInternalEvent;
 import com.ning.billing.util.events.BusInternalEvent;
@@ -31,17 +32,17 @@ public interface CompletionUserRequestWaiter {
 
     public List<BusInternalEvent> waitForCompletion(final long timeoutMilliSec) throws InterruptedException, TimeoutException;
 
-    public void onAccountCreation(final AccountCreationInternalEvent curEvent);
+    public void onAccountCreation(final BusEventWithMetadata<AccountCreationInternalEvent> curEvent);
 
-    public void onAccountChange(final AccountChangeInternalEvent curEvent);
+    public void onAccountChange(final BusEventWithMetadata<AccountChangeInternalEvent> curEvent);
 
-    public void onSubscriptionTransition(final EffectiveSubscriptionInternalEvent curEventEffective);
+    public void onSubscriptionTransition(final BusEventWithMetadata<EffectiveSubscriptionInternalEvent> curEventEffective);
 
-    public void onInvoiceCreation(final InvoiceCreationInternalEvent curEvent);
+    public void onInvoiceCreation(final BusEventWithMetadata<InvoiceCreationInternalEvent> curEvent);
 
-    public void onEmptyInvoice(final NullInvoiceInternalEvent curEvent);
+    public void onEmptyInvoice(final BusEventWithMetadata<NullInvoiceInternalEvent> curEvent);
 
-    public void onPaymentInfo(final PaymentInfoInternalEvent curEvent);
+    public void onPaymentInfo(final BusEventWithMetadata<PaymentInfoInternalEvent> curEvent);
 
-    public void onPaymentError(final PaymentErrorInternalEvent curEvent);
+    public void onPaymentError(final BusEventWithMetadata<PaymentErrorInternalEvent> curEvent);
 }
diff --git a/util/src/test/java/com/ning/billing/mock/glue/MockNotificationQueueModule.java b/util/src/test/java/com/ning/billing/mock/glue/MockNotificationQueueModule.java
index 37b2a9f..eac301f 100644
--- a/util/src/test/java/com/ning/billing/mock/glue/MockNotificationQueueModule.java
+++ b/util/src/test/java/com/ning/billing/mock/glue/MockNotificationQueueModule.java
@@ -20,8 +20,8 @@ import org.skife.config.ConfigSource;
 import org.skife.config.ConfigurationObjectFactory;
 
 import com.ning.billing.notificationq.MockNotificationQueueService;
-import com.ning.billing.notificationq.NotificationQueueConfig;
-import com.ning.billing.notificationq.NotificationQueueService;
+import com.ning.billing.notificationq.api.NotificationQueueConfig;
+import com.ning.billing.notificationq.api.NotificationQueueService;
 import com.ning.billing.util.glue.NotificationQueueModule;
 
 public class MockNotificationQueueModule extends NotificationQueueModule {
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 05cf61c..4641e70 100644
--- a/util/src/test/java/com/ning/billing/mock/MockEffectiveSubscriptionEvent.java
+++ b/util/src/test/java/com/ning/billing/mock/MockEffectiveSubscriptionEvent.java
@@ -155,11 +155,6 @@ public class MockEffectiveSubscriptionEvent implements EffectiveSubscriptionInte
     }
 
     @Override
-    public UUID getUserToken() {
-        return userToken;
-    }
-
-    @Override
     public Integer getRemainingEventsForUserOperation() {
         return remainingEventsForUserOperation;
     }
@@ -197,46 +192,46 @@ public class MockEffectiveSubscriptionEvent implements EffectiveSubscriptionInte
         final int prime = 31;
         int result = 1;
         result = prime * result
-                + ((bundleId == null) ? 0 : bundleId.hashCode());
+                 + ((bundleId == null) ? 0 : bundleId.hashCode());
         result = prime
-                * result
-                + ((effectiveTransitionTime == null) ? 0
-                : effectiveTransitionTime.hashCode());
+                 * result
+                 + ((effectiveTransitionTime == null) ? 0
+                                                      : effectiveTransitionTime.hashCode());
         result = prime * result + ((eventId == null) ? 0 : eventId.hashCode());
         result = prime * result
-                + ((nextPhase == null) ? 0 : nextPhase.hashCode());
+                 + ((nextPhase == null) ? 0 : nextPhase.hashCode());
         result = prime * result
-                + ((nextPlan == null) ? 0 : nextPlan.hashCode());
+                 + ((nextPlan == null) ? 0 : nextPlan.hashCode());
         result = prime * result
-                + ((nextPriceList == null) ? 0 : nextPriceList.hashCode());
+                 + ((nextPriceList == null) ? 0 : nextPriceList.hashCode());
         result = prime * result
-                + ((nextState == null) ? 0 : nextState.hashCode());
+                 + ((nextState == null) ? 0 : nextState.hashCode());
         result = prime * result
-                + ((previousPhase == null) ? 0 : previousPhase.hashCode());
+                 + ((previousPhase == null) ? 0 : previousPhase.hashCode());
         result = prime * result
-                + ((previousPlan == null) ? 0 : previousPlan.hashCode());
+                 + ((previousPlan == null) ? 0 : previousPlan.hashCode());
         result = prime
-                * result
-                + ((previousPriceList == null) ? 0 : previousPriceList
+                 * result
+                 + ((previousPriceList == null) ? 0 : previousPriceList
                 .hashCode());
         result = prime * result
-                + ((previousState == null) ? 0 : previousState.hashCode());
+                 + ((previousState == null) ? 0 : previousState.hashCode());
         result = prime
-                * result
-                + ((remainingEventsForUserOperation == null) ? 0
-                : remainingEventsForUserOperation.hashCode());
+                 * result
+                 + ((remainingEventsForUserOperation == null) ? 0
+                                                              : remainingEventsForUserOperation.hashCode());
         result = prime
-                * result
-                + ((requestedTransitionTime == null) ? 0
-                : requestedTransitionTime.hashCode());
+                 * result
+                 + ((requestedTransitionTime == null) ? 0
+                                                      : requestedTransitionTime.hashCode());
         result = prime * result
-                + ((subscriptionId == null) ? 0 : subscriptionId.hashCode());
+                 + ((subscriptionId == null) ? 0 : subscriptionId.hashCode());
         result = prime * result
-                + ((totalOrdering == null) ? 0 : totalOrdering.hashCode());
+                 + ((totalOrdering == null) ? 0 : totalOrdering.hashCode());
         result = prime * result
-                + ((transitionType == null) ? 0 : transitionType.hashCode());
+                 + ((transitionType == null) ? 0 : transitionType.hashCode());
         result = prime * result
-                + ((userToken == null) ? 0 : userToken.hashCode());
+                 + ((userToken == null) ? 0 : userToken.hashCode());
         return result;
     }
 
@@ -264,7 +259,7 @@ public class MockEffectiveSubscriptionEvent implements EffectiveSubscriptionInte
                 return false;
             }
         } else if (effectiveTransitionTime
-                .compareTo(other.effectiveTransitionTime) != 0) {
+                           .compareTo(other.effectiveTransitionTime) != 0) {
             return false;
         }
         if (eventId == null) {
@@ -335,7 +330,7 @@ public class MockEffectiveSubscriptionEvent implements EffectiveSubscriptionInte
                 return false;
             }
         } else if (requestedTransitionTime
-                .compareTo(other.requestedTransitionTime) != 0) {
+                           .compareTo(other.requestedTransitionTime) != 0) {
             return false;
         }
         if (subscriptionId == null) {
@@ -364,15 +359,4 @@ public class MockEffectiveSubscriptionEvent implements EffectiveSubscriptionInte
         }
         return true;
     }
-
-    @Override
-    public Long getTenantRecordId() {
-        return 1L;
-    }
-
-    @Override
-    public Long getAccountRecordId() {
-        return 1L;
-    }
-
 }
diff --git a/util/src/test/java/com/ning/billing/util/customfield/api/TestDefaultCustomFieldCreationEvent.java b/util/src/test/java/com/ning/billing/util/customfield/api/TestDefaultCustomFieldCreationEvent.java
index 78421e3..2e247bb 100644
--- a/util/src/test/java/com/ning/billing/util/customfield/api/TestDefaultCustomFieldCreationEvent.java
+++ b/util/src/test/java/com/ning/billing/util/customfield/api/TestDefaultCustomFieldCreationEvent.java
@@ -33,17 +33,15 @@ public class TestDefaultCustomFieldCreationEvent {
         final UUID customFieldId = UUID.randomUUID();
         final UUID objectId = UUID.randomUUID();
         final ObjectType objectType = ObjectType.ACCOUNT_EMAIL;
-        final UUID userToken = UUID.randomUUID();
 
-        final DefaultCustomFieldCreationEvent event = new DefaultCustomFieldCreationEvent(customFieldId, objectId, objectType, userToken, 1L, 1L);
+        final DefaultCustomFieldCreationEvent event = new DefaultCustomFieldCreationEvent(customFieldId, objectId, objectType);
         Assert.assertEquals(event.getBusEventType(), BusInternalEventType.CUSTOM_FIELD_CREATION);
 
         Assert.assertEquals(event.getObjectId(), objectId);
         Assert.assertEquals(event.getObjectType(), objectType);
-        Assert.assertEquals(event.getUserToken(), userToken);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultCustomFieldCreationEvent(customFieldId, objectId, objectType, userToken, 1L, 1L));
+        Assert.assertEquals(event, new DefaultCustomFieldCreationEvent(customFieldId, objectId, objectType));
     }
 
     @Test(groups = "fast")
@@ -54,9 +52,8 @@ public class TestDefaultCustomFieldCreationEvent {
         final UUID customFieldId = UUID.randomUUID();
         final UUID objectId = UUID.randomUUID();
         final ObjectType objectType = ObjectType.ACCOUNT_EMAIL;
-        final UUID userToken = UUID.randomUUID();
 
-        final DefaultCustomFieldCreationEvent event = new DefaultCustomFieldCreationEvent(customFieldId, objectId, objectType, userToken, 1L, 1L);
+        final DefaultCustomFieldCreationEvent event = new DefaultCustomFieldCreationEvent(customFieldId, objectId, objectType);
 
         final String json = objectMapper.writeValueAsString(event);
         final DefaultCustomFieldCreationEvent fromJson = objectMapper.readValue(json, DefaultCustomFieldCreationEvent.class);
diff --git a/util/src/test/java/com/ning/billing/util/customfield/api/TestDefaultCustomFieldDeletionEvent.java b/util/src/test/java/com/ning/billing/util/customfield/api/TestDefaultCustomFieldDeletionEvent.java
index e0c5b28..b8f1a4d 100644
--- a/util/src/test/java/com/ning/billing/util/customfield/api/TestDefaultCustomFieldDeletionEvent.java
+++ b/util/src/test/java/com/ning/billing/util/customfield/api/TestDefaultCustomFieldDeletionEvent.java
@@ -35,15 +35,14 @@ public class TestDefaultCustomFieldDeletionEvent {
         final ObjectType objectType = ObjectType.ACCOUNT_EMAIL;
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultCustomFieldDeletionEvent event = new DefaultCustomFieldDeletionEvent(customFieldId, objectId, objectType, userToken, 1L, 1L);
+        final DefaultCustomFieldDeletionEvent event = new DefaultCustomFieldDeletionEvent(customFieldId, objectId, objectType);
         Assert.assertEquals(event.getBusEventType(), BusInternalEventType.CUSTOM_FIELD_DELETION);
 
         Assert.assertEquals(event.getObjectId(), objectId);
         Assert.assertEquals(event.getObjectType(), objectType);
-        Assert.assertEquals(event.getUserToken(), userToken);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultCustomFieldDeletionEvent(customFieldId, objectId, objectType, userToken, 1L, 1L));
+        Assert.assertEquals(event, new DefaultCustomFieldDeletionEvent(customFieldId, objectId, objectType));
     }
 
     @Test(groups = "fast")
@@ -56,7 +55,7 @@ public class TestDefaultCustomFieldDeletionEvent {
         final ObjectType objectType = ObjectType.ACCOUNT_EMAIL;
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultCustomFieldDeletionEvent event = new DefaultCustomFieldDeletionEvent(customFieldId, objectId, objectType, userToken, 1L, 1L);
+        final DefaultCustomFieldDeletionEvent event = new DefaultCustomFieldDeletionEvent(customFieldId, objectId, objectType);
 
         final String json = objectMapper.writeValueAsString(event);
         final DefaultCustomFieldDeletionEvent fromJson = objectMapper.readValue(json, DefaultCustomFieldDeletionEvent.class);
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 9495acf..079bfea 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
@@ -42,7 +42,7 @@ public class TestDefaultControlTagCreationEvent extends UtilTestSuiteNoDB {
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultControlTagCreationEvent event = new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L);
+        final DefaultControlTagCreationEvent event = new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition);
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusInternalEventType.CONTROL_TAG_CREATION);
 
         Assert.assertEquals(event.getTagId(), tagId);
@@ -52,12 +52,11 @@ public class TestDefaultControlTagCreationEvent extends UtilTestSuiteNoDB {
         Assert.assertEquals(event.getTagDefinition().getId(), tagDefinitionId);
         Assert.assertEquals(event.getTagDefinition().getName(), tagDefinitionName);
         Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
-        Assert.assertEquals(event.getUserToken(), userToken);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L));
+        Assert.assertEquals(event, new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L)));
+        Assert.assertTrue(event.equals(new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition)));
     }
 
     @Test(groups = "fast")
@@ -74,7 +73,7 @@ public class TestDefaultControlTagCreationEvent extends UtilTestSuiteNoDB {
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultControlTagCreationEvent event = new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L);
+        final DefaultControlTagCreationEvent event = new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition);
 
         final String json = objectMapper.writeValueAsString(event);
         final DefaultControlTagCreationEvent fromJson = objectMapper.readValue(json, DefaultControlTagCreationEvent.class);
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 6bbd8d6..626b74d 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
@@ -38,7 +38,7 @@ public class TestDefaultControlTagDefinitionCreationEvent extends UtilTestSuiteN
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultControlTagDefinitionCreationEvent event = new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L);
+        final DefaultControlTagDefinitionCreationEvent event = new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition);
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusInternalEventType.CONTROL_TAGDEFINITION_CREATION);
 
         Assert.assertEquals(event.getTagDefinitionId(), tagDefinitionId);
@@ -46,12 +46,11 @@ public class TestDefaultControlTagDefinitionCreationEvent extends UtilTestSuiteN
         Assert.assertEquals(event.getTagDefinition().getId(), tagDefinitionId);
         Assert.assertEquals(event.getTagDefinition().getName(), tagDefinitionName);
         Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
-        Assert.assertEquals(event.getUserToken(), userToken);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L));
+        Assert.assertEquals(event, new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L)));
+        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition)));
     }
 
     @Test(groups = "fast")
@@ -65,7 +64,7 @@ public class TestDefaultControlTagDefinitionCreationEvent extends UtilTestSuiteN
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultControlTagDefinitionCreationEvent event = new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L);
+        final DefaultControlTagDefinitionCreationEvent event = new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition);
 
         final String json = objectMapper.writeValueAsString(event);
         final DefaultControlTagDefinitionCreationEvent fromJson = objectMapper.readValue(json, DefaultControlTagDefinitionCreationEvent.class);
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 7fd763c..bd68dce 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
@@ -38,7 +38,7 @@ public class TestDefaultControlTagDefinitionDeletionEvent extends UtilTestSuiteN
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultControlTagDefinitionDeletionEvent event = new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L);
+        final DefaultControlTagDefinitionDeletionEvent event = new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition);
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusInternalEventType.CONTROL_TAGDEFINITION_DELETION);
 
         Assert.assertEquals(event.getTagDefinitionId(), tagDefinitionId);
@@ -46,12 +46,11 @@ public class TestDefaultControlTagDefinitionDeletionEvent extends UtilTestSuiteN
         Assert.assertEquals(event.getTagDefinition().getId(), tagDefinitionId);
         Assert.assertEquals(event.getTagDefinition().getName(), tagDefinitionName);
         Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
-        Assert.assertEquals(event.getUserToken(), userToken);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L));
+        Assert.assertEquals(event, new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L)));
+        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition)));
     }
 
     @Test(groups = "fast")
@@ -65,7 +64,7 @@ public class TestDefaultControlTagDefinitionDeletionEvent extends UtilTestSuiteN
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultControlTagDefinitionDeletionEvent event = new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L);
+        final DefaultControlTagDefinitionDeletionEvent event = new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition);
 
         final String json = objectMapper.writeValueAsString(event);
         final DefaultControlTagDefinitionDeletionEvent fromJson = objectMapper.readValue(json, DefaultControlTagDefinitionDeletionEvent.class);
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 d7a6005..1bed506 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
@@ -42,7 +42,7 @@ public class TestDefaultControlTagDeletionEvent extends UtilTestSuiteNoDB {
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultControlTagDeletionEvent event = new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L);
+        final DefaultControlTagDeletionEvent event = new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition);
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusInternalEventType.CONTROL_TAG_DELETION);
 
         Assert.assertEquals(event.getTagId(), tagId);
@@ -52,12 +52,11 @@ public class TestDefaultControlTagDeletionEvent extends UtilTestSuiteNoDB {
         Assert.assertEquals(event.getTagDefinition().getId(), tagDefinitionId);
         Assert.assertEquals(event.getTagDefinition().getName(), tagDefinitionName);
         Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
-        Assert.assertEquals(event.getUserToken(), userToken);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L));
+        Assert.assertEquals(event, new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L)));
+        Assert.assertTrue(event.equals(new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition)));
     }
 
     @Test(groups = "fast")
@@ -74,7 +73,7 @@ public class TestDefaultControlTagDeletionEvent extends UtilTestSuiteNoDB {
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultControlTagDeletionEvent event = new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L);
+        final DefaultControlTagDeletionEvent event = new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition);
 
         final String json = objectMapper.writeValueAsString(event);
         final DefaultControlTagDeletionEvent fromJson = objectMapper.readValue(json, DefaultControlTagDeletionEvent.class);
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 5054106..d3e3cc7 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
@@ -42,7 +42,7 @@ public class TestDefaultUserTagCreationEvent extends UtilTestSuiteNoDB {
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultUserTagCreationEvent event = new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L);
+        final DefaultUserTagCreationEvent event = new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition);
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusInternalEventType.USER_TAG_CREATION);
 
         Assert.assertEquals(event.getTagId(), tagId);
@@ -52,12 +52,11 @@ public class TestDefaultUserTagCreationEvent extends UtilTestSuiteNoDB {
         Assert.assertEquals(event.getTagDefinition().getId(), tagDefinitionId);
         Assert.assertEquals(event.getTagDefinition().getName(), tagDefinitionName);
         Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
-        Assert.assertEquals(event.getUserToken(), userToken);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L));
+        Assert.assertEquals(event, new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L)));
+        Assert.assertTrue(event.equals(new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition)));
     }
 
     @Test(groups = "fast")
@@ -74,7 +73,7 @@ public class TestDefaultUserTagCreationEvent extends UtilTestSuiteNoDB {
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultUserTagCreationEvent event = new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L);
+        final DefaultUserTagCreationEvent event = new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition);
 
         final String json = objectMapper.writeValueAsString(event);
         final DefaultUserTagCreationEvent fromJson = objectMapper.readValue(json, DefaultUserTagCreationEvent.class);
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 257cb47..f084a75 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
@@ -38,7 +38,7 @@ public class TestDefaultUserTagDefinitionCreationEvent extends UtilTestSuiteNoDB
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultUserTagDefinitionCreationEvent event = new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L);
+        final DefaultUserTagDefinitionCreationEvent event = new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition);
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusInternalEventType.USER_TAGDEFINITION_CREATION);
 
         Assert.assertEquals(event.getTagDefinitionId(), tagDefinitionId);
@@ -46,12 +46,11 @@ public class TestDefaultUserTagDefinitionCreationEvent extends UtilTestSuiteNoDB
         Assert.assertEquals(event.getTagDefinition().getId(), tagDefinitionId);
         Assert.assertEquals(event.getTagDefinition().getName(), tagDefinitionName);
         Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
-        Assert.assertEquals(event.getUserToken(), userToken);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L));
+        Assert.assertEquals(event, new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L)));
+        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition)));
     }
 
     @Test(groups = "fast")
@@ -65,7 +64,7 @@ public class TestDefaultUserTagDefinitionCreationEvent extends UtilTestSuiteNoDB
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultUserTagDefinitionCreationEvent event = new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L);
+        final DefaultUserTagDefinitionCreationEvent event = new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition);
 
         final String json = objectMapper.writeValueAsString(event);
         final DefaultUserTagDefinitionCreationEvent fromJson = objectMapper.readValue(json, DefaultUserTagDefinitionCreationEvent.class);
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 7294239..efc0e6e 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
@@ -27,8 +27,8 @@ import com.ning.billing.util.jackson.ObjectMapper;
 import com.ning.billing.util.tag.DefaultTagDefinition;
 import com.ning.billing.util.tag.TagDefinition;
 
-public class TestDefaultUserTagDefinitionDeletionEvent extends UtilTestSuiteNoDB
-{
+public class TestDefaultUserTagDefinitionDeletionEvent extends UtilTestSuiteNoDB {
+
     @Test(groups = "fast")
     public void testPojo() throws Exception {
         final UUID tagDefinitionId = UUID.randomUUID();
@@ -38,7 +38,7 @@ public class TestDefaultUserTagDefinitionDeletionEvent extends UtilTestSuiteNoDB
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultUserTagDefinitionDeletionEvent event = new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L);
+        final DefaultUserTagDefinitionDeletionEvent event = new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition);
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusInternalEventType.USER_TAGDEFINITION_DELETION);
 
         Assert.assertEquals(event.getTagDefinitionId(), tagDefinitionId);
@@ -46,12 +46,11 @@ public class TestDefaultUserTagDefinitionDeletionEvent extends UtilTestSuiteNoDB
         Assert.assertEquals(event.getTagDefinition().getId(), tagDefinitionId);
         Assert.assertEquals(event.getTagDefinition().getName(), tagDefinitionName);
         Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
-        Assert.assertEquals(event.getUserToken(), userToken);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L));
+        Assert.assertEquals(event, new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L)));
+        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition)));
     }
 
     @Test(groups = "fast")
@@ -65,7 +64,7 @@ public class TestDefaultUserTagDefinitionDeletionEvent extends UtilTestSuiteNoDB
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultUserTagDefinitionDeletionEvent event = new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L);
+        final DefaultUserTagDefinitionDeletionEvent event = new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition);
 
         final String json = objectMapper.writeValueAsString(event);
         final DefaultUserTagDefinitionDeletionEvent fromJson = objectMapper.readValue(json, DefaultUserTagDefinitionDeletionEvent.class);
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 41b1b23..3f801a2 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
@@ -42,7 +42,7 @@ public class TestDefaultUserTagDeletionEvent extends UtilTestSuiteNoDB
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultUserTagDeletionEvent event = new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L);
+        final DefaultUserTagDeletionEvent event = new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition);
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusInternalEventType.USER_TAG_DELETION);
 
         Assert.assertEquals(event.getTagId(), tagId);
@@ -52,12 +52,11 @@ public class TestDefaultUserTagDeletionEvent extends UtilTestSuiteNoDB
         Assert.assertEquals(event.getTagDefinition().getId(), tagDefinitionId);
         Assert.assertEquals(event.getTagDefinition().getName(), tagDefinitionName);
         Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
-        Assert.assertEquals(event.getUserToken(), userToken);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L));
+        Assert.assertEquals(event, new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L)));
+        Assert.assertTrue(event.equals(new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition)));
     }
 
     @Test(groups = "fast")
@@ -74,7 +73,7 @@ public class TestDefaultUserTagDeletionEvent extends UtilTestSuiteNoDB
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultUserTagDeletionEvent event = new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L);
+        final DefaultUserTagDeletionEvent event = new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition);
 
         final String json = objectMapper.writeValueAsString(event);
         final DefaultUserTagDeletionEvent fromJson = objectMapper.readValue(json, DefaultUserTagDeletionEvent.class);
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 5fbcab0..5f150da 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
@@ -37,8 +37,7 @@ import com.ning.billing.util.tag.DefaultTagDefinition;
 import com.ning.billing.util.tag.TagDefinition;
 import com.ning.billing.util.tag.dao.TagDefinitionModelDao;
 
-public class TestTagEventBuilder extends UtilTestSuiteNoDB
-{
+public class TestTagEventBuilder extends UtilTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testNewUserTagDefinitionCreationEvent() throws Exception {
@@ -50,11 +49,12 @@ public class TestTagEventBuilder extends UtilTestSuiteNoDB
         final UUID userToken = internalCallContext.getUserToken();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagDefinitionInternalEvent event = tagEventBuilder.newUserTagDefinitionCreationEvent(tagDefinitionId, new TagDefinitionModelDao(tagDefinition), internalCallContext);
+        final TagDefinitionInternalEvent event = tagEventBuilder.newUserTagDefinitionCreationEvent(tagDefinitionId, new TagDefinitionModelDao(tagDefinition));
         Assert.assertTrue(event instanceof UserTagDefinitionCreationInternalEvent);
 
-        Assert.assertEquals(event, new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L));
-        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L)));
+        Assert.assertEquals(event, new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition));
+
+        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition)));
 
         verifyTagDefinitionEvent(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
     }
@@ -69,11 +69,11 @@ public class TestTagEventBuilder extends UtilTestSuiteNoDB
         final UUID userToken = internalCallContext.getUserToken();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagDefinitionInternalEvent event = tagEventBuilder.newUserTagDefinitionDeletionEvent(tagDefinitionId, new TagDefinitionModelDao(tagDefinition), internalCallContext);
+        final TagDefinitionInternalEvent event = tagEventBuilder.newUserTagDefinitionDeletionEvent(tagDefinitionId, new TagDefinitionModelDao(tagDefinition));
         Assert.assertTrue(event instanceof UserTagDefinitionDeletionInternalEvent);
 
-        Assert.assertEquals(event, new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L));
-        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L)));
+        Assert.assertEquals(event, new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition));
+        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition)));
 
         verifyTagDefinitionEvent(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
     }
@@ -88,11 +88,11 @@ public class TestTagEventBuilder extends UtilTestSuiteNoDB
         final UUID userToken = internalCallContext.getUserToken();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagDefinitionInternalEvent event = tagEventBuilder.newControlTagDefinitionCreationEvent(tagDefinitionId, new TagDefinitionModelDao(tagDefinition), internalCallContext);
+        final TagDefinitionInternalEvent event = tagEventBuilder.newControlTagDefinitionCreationEvent(tagDefinitionId, new TagDefinitionModelDao(tagDefinition));
         Assert.assertTrue(event instanceof ControlTagDefinitionCreationInternalEvent);
 
-        Assert.assertEquals(event, new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L));
-        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L)));
+        Assert.assertEquals(event, new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition));
+        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition)));
 
         verifyTagDefinitionEvent(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
     }
@@ -107,11 +107,11 @@ public class TestTagEventBuilder extends UtilTestSuiteNoDB
         final UUID userToken = internalCallContext.getUserToken();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagDefinitionInternalEvent event = tagEventBuilder.newControlTagDefinitionDeletionEvent(tagDefinitionId, new TagDefinitionModelDao(tagDefinition), internalCallContext);
+        final TagDefinitionInternalEvent event = tagEventBuilder.newControlTagDefinitionDeletionEvent(tagDefinitionId, new TagDefinitionModelDao(tagDefinition));
         Assert.assertTrue(event instanceof ControlTagDefinitionDeletionInternalEvent);
 
-        Assert.assertEquals(event, new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L));
-        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L)));
+        Assert.assertEquals(event, new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition));
+        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition)));
 
         verifyTagDefinitionEvent(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
     }
@@ -129,11 +129,11 @@ public class TestTagEventBuilder extends UtilTestSuiteNoDB
         final UUID userToken = internalCallContext.getUserToken();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagInternalEvent event = tagEventBuilder.newUserTagCreationEvent(tagId, objectId, objectType, new TagDefinitionModelDao(tagDefinition), internalCallContext);
+        final TagInternalEvent event = tagEventBuilder.newUserTagCreationEvent(tagId, objectId, objectType, new TagDefinitionModelDao(tagDefinition));
         Assert.assertTrue(event instanceof UserTagCreationInternalEvent);
 
-        Assert.assertEquals(event, new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L));
-        Assert.assertTrue(event.equals(new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L)));
+        Assert.assertEquals(event, new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition));
+        Assert.assertTrue(event.equals(new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition)));
 
         verifyTagEvent(tagId, objectId, objectType, tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
     }
@@ -151,11 +151,11 @@ public class TestTagEventBuilder extends UtilTestSuiteNoDB
         final UUID userToken = internalCallContext.getUserToken();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagInternalEvent event = tagEventBuilder.newUserTagDeletionEvent(tagId, objectId, objectType, new TagDefinitionModelDao(tagDefinition), internalCallContext);
+        final TagInternalEvent event = tagEventBuilder.newUserTagDeletionEvent(tagId, objectId, objectType, new TagDefinitionModelDao(tagDefinition));
         Assert.assertTrue(event instanceof UserTagDeletionInternalEvent);
 
-        Assert.assertEquals(event, new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L));
-        Assert.assertTrue(event.equals(new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L)));
+        Assert.assertEquals(event, new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition));
+        Assert.assertTrue(event.equals(new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition)));
 
         verifyTagEvent(tagId, objectId, objectType, tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
     }
@@ -173,11 +173,11 @@ public class TestTagEventBuilder extends UtilTestSuiteNoDB
         final UUID userToken = internalCallContext.getUserToken();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagInternalEvent event = tagEventBuilder.newControlTagCreationEvent(tagId, objectId, objectType, new TagDefinitionModelDao(tagDefinition), internalCallContext);
+        final TagInternalEvent event = tagEventBuilder.newControlTagCreationEvent(tagId, objectId, objectType, new TagDefinitionModelDao(tagDefinition));
         Assert.assertTrue(event instanceof ControlTagCreationInternalEvent);
 
-        Assert.assertEquals(event, new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L));
-        Assert.assertTrue(event.equals(new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L)));
+        Assert.assertEquals(event, new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition));
+        Assert.assertTrue(event.equals(new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition)));
 
         verifyTagEvent(tagId, objectId, objectType, tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
     }
@@ -195,11 +195,11 @@ public class TestTagEventBuilder extends UtilTestSuiteNoDB
         final UUID userToken = internalCallContext.getUserToken();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagInternalEvent event = tagEventBuilder.newControlTagDeletionEvent(tagId, objectId, objectType, new TagDefinitionModelDao(tagDefinition), internalCallContext);
+        final TagInternalEvent event = tagEventBuilder.newControlTagDeletionEvent(tagId, objectId, objectType, new TagDefinitionModelDao(tagDefinition));
         Assert.assertTrue(event instanceof ControlTagDeletionInternalEvent);
 
-        Assert.assertEquals(event, new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L));
-        Assert.assertTrue(event.equals(new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L)));
+        Assert.assertEquals(event, new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition));
+        Assert.assertTrue(event.equals(new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition)));
 
         verifyTagEvent(tagId, objectId, objectType, tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
     }
@@ -210,7 +210,6 @@ public class TestTagEventBuilder extends UtilTestSuiteNoDB
         Assert.assertEquals(event.getTagDefinition().getId(), tagDefinitionId);
         Assert.assertEquals(event.getTagDefinition().getName(), tagDefinitionName);
         Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
-        Assert.assertEquals(event.getUserToken(), userToken);
 
         Assert.assertEquals(event, event);
         Assert.assertTrue(event.equals(event));
@@ -224,7 +223,6 @@ public class TestTagEventBuilder extends UtilTestSuiteNoDB
         Assert.assertEquals(event.getTagDefinition().getId(), tagDefinitionId);
         Assert.assertEquals(event.getTagDefinition().getName(), tagDefinitionName);
         Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
-        Assert.assertEquals(event.getUserToken(), userToken);
 
         Assert.assertEquals(event, event);
         Assert.assertTrue(event.equals(event));
diff --git a/util/src/test/java/com/ning/billing/util/UtilTestSuiteNoDB.java b/util/src/test/java/com/ning/billing/util/UtilTestSuiteNoDB.java
index 58d5d92..f82fc0d 100644
--- a/util/src/test/java/com/ning/billing/util/UtilTestSuiteNoDB.java
+++ b/util/src/test/java/com/ning/billing/util/UtilTestSuiteNoDB.java
@@ -23,7 +23,7 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 
 import com.ning.billing.GuicyKillbillTestSuiteNoDB;
-import com.ning.billing.bus.PersistentBus;
+import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.util.api.AuditUserApi;
 import com.ning.billing.util.audit.dao.AuditDao;
 import com.ning.billing.util.cache.CacheControllerDispatcher;
diff --git a/util/src/test/java/com/ning/billing/util/UtilTestSuiteWithEmbeddedDB.java b/util/src/test/java/com/ning/billing/util/UtilTestSuiteWithEmbeddedDB.java
index b370086..b618f24 100644
--- a/util/src/test/java/com/ning/billing/util/UtilTestSuiteWithEmbeddedDB.java
+++ b/util/src/test/java/com/ning/billing/util/UtilTestSuiteWithEmbeddedDB.java
@@ -23,8 +23,8 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 
 import com.ning.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
-import com.ning.billing.bus.PersistentBus;
-import com.ning.billing.notificationq.NotificationQueueService;
+import com.ning.billing.bus.api.PersistentBus;
+import com.ning.billing.notificationq.api.NotificationQueueService;
 import com.ning.billing.util.audit.dao.AuditDao;
 import com.ning.billing.util.cache.CacheControllerDispatcher;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;