killbill-aplcache

Changes

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 3893e21..e4a46d8 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,6 +23,7 @@ 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;
@@ -30,19 +31,24 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 
-public class DefaultAccountChangeEvent implements AccountChangeInternalEvent {
+public class DefaultAccountChangeEvent extends BusEventBase implements AccountChangeInternalEvent {
 
     private final List<ChangedField> changedFields;
     private final UUID accountId;
 
     @JsonCreator
     public DefaultAccountChangeEvent(@JsonProperty("changeFields") final List<ChangedField> changedFields,
-                                     @JsonProperty("accountId") final UUID accountId) {
+                                     @JsonProperty("accountId") final UUID accountId,
+                                     @JsonProperty("searchKey1") final Long searchKey1,
+                                     @JsonProperty("searchKey2") final Long searchKey2,
+                                     @JsonProperty("userToken") final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         this.accountId = accountId;
         this.changedFields = changedFields;
     }
 
-    public DefaultAccountChangeEvent(final UUID id, final AccountModelDao oldData, final AccountModelDao newData) {
+    public DefaultAccountChangeEvent(final UUID id, final AccountModelDao oldData, final AccountModelDao newData, final Long searchKey1, final Long searchKey2, final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         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 edd2614..60b2d46 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,19 +24,24 @@ 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 implements AccountCreationInternalEvent {
+public class DefaultAccountCreationEvent extends BusEventBase implements AccountCreationInternalEvent {
 
     private final UUID id;
     private final AccountData data;
 
     @JsonCreator
     public DefaultAccountCreationEvent(@JsonProperty("data") final DefaultAccountData data,
-                                       @JsonProperty("id") final UUID id) {
+                                       @JsonProperty("id") final UUID id,
+                                       @JsonProperty("searchKey1") final Long searchKey1,
+                                       @JsonProperty("searchKey2") final Long searchKey2,
+                                       @JsonProperty("userToken") final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         this.id = id;
         this.data = data;
     }
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 ce70a3b..cc70903 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
@@ -84,10 +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(new DefaultAccountData(savedAccount), savedAccount.getId());
+        final AccountCreationInternalEvent creationEvent = new DefaultAccountCreationEvent(new DefaultAccountData(savedAccount), savedAccount.getId(),
+                                                                                           context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken());
         try {
-            eventBus.postFromTransaction(creationEvent, rehydratedContext.getUserToken(), rehydratedContext.getAccountRecordId(),
-                                         rehydratedContext.getTenantRecordId(), entitySqlDaoWrapperFactory.getSqlDao());
+            eventBus.postFromTransaction(creationEvent, entitySqlDaoWrapperFactory.getSqlDao());
         } catch (final EventBusException e) {
             log.warn("Failed to post account creation event for account " + savedAccount.getId(), e);
         }
@@ -134,10 +134,13 @@ public class DefaultAccountDao extends EntityDaoBase<AccountModelDao, Account, A
 
                 final AccountChangeInternalEvent changeEvent = new DefaultAccountChangeEvent(accountId,
                                                                                              currentAccount,
-                                                                                             specifiedAccount
+                                                                                             specifiedAccount,
+                                                                                             context.getAccountRecordId(),
+                                                                                             context.getTenantRecordId(),
+                                                                                             context.getUserToken()
                 );
                 try {
-                    eventBus.postFromTransaction(changeEvent, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId(), entitySqlDaoWrapperFactory.getSqlDao());
+                    eventBus.postFromTransaction(changeEvent, entitySqlDaoWrapperFactory.getSqlDao());
                 } catch (final EventBusException e) {
                     log.warn("Failed to post account change event for account " + accountId, e);
                 }
@@ -169,11 +172,14 @@ 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, currentAccount, account
+                final AccountChangeInternalEvent changeEvent = new DefaultAccountChangeEvent(accountId, currentAccount, account,
+                                                                                             context.getAccountRecordId(),
+                                                                                             context.getTenantRecordId(),
+                                                                                             context.getUserToken()
                 );
 
                 try {
-                    eventBus.postFromTransaction(changeEvent, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId(), entitySqlDaoWrapperFactory.getSqlDao());
+                    eventBus.postFromTransaction(changeEvent, 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/api/user/TestEventJson.java b/account/src/test/java/com/ning/billing/account/api/user/TestEventJson.java
index 05d1e97..1871292 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(changes, UUID.randomUUID());
+        final AccountChangeInternalEvent e = new DefaultAccountChangeEvent(changes, UUID.randomUUID(), 1L, 2L, null);
 
         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());
+        final DefaultAccountCreationEvent e = new DefaultAccountCreationEvent(data, UUID.randomUUID(), 1L, 2L, null);
         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 3d9e8ec..b11c327 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
@@ -63,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(new DefaultAccountData(account), account.getId()), context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
+            eventBus.post(new DefaultAccountCreationEvent(new DefaultAccountData(account), account.getId(), context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken()));
         } catch (final EventBusException ex) {
             Assert.fail(ex.toString());
         }
@@ -77,11 +77,12 @@ 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(), currentAccount, account
+        final AccountChangeInternalEvent changeEvent = new DefaultAccountChangeEvent(account.getId(), currentAccount, account,
+                context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken()
         );
         if (changeEvent.hasChanges()) {
             try {
-                eventBus.post(changeEvent, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
+                eventBus.post(changeEvent);
             } catch (final EventBusException ex) {
                 Assert.fail(ex.toString());
             }
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 7bf044a..2e0284c 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
@@ -27,15 +27,12 @@ import com.ning.billing.ObjectType;
 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.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;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
-import com.ning.billing.util.callcontext.UserType;
 import com.ning.billing.util.events.AccountChangeInternalEvent;
 import com.ning.billing.util.events.AccountCreationInternalEvent;
 import com.ning.billing.util.events.BusInternalEvent;
@@ -83,14 +80,13 @@ public class BeatrixListener {
     }
 
     @Subscribe
-    public void handleAllInternalKillbillEvents(final BusEventWithMetadata<BusInternalEvent> eventWithMetadata) {
+    public void handleAllInternalKillbillEvents(final BusInternalEvent event) {
 
-        final BusInternalEvent event = eventWithMetadata.getEvent();
-        final InternalCallContext internalContext = internalCallContextFactory.createInternalCallContext(eventWithMetadata.getSearchKey2(), eventWithMetadata.getSearchKey1(), "BeatrixListener", CallOrigin.INTERNAL, UserType.SYSTEM, eventWithMetadata.getUserToken());
+        final InternalCallContext internalContext = null; // STEPH_BUS internalCallContextFactory.createInternalCallContext(eventWithMetadata.getSearchKey2(), eventWithMetadata.getSearchKey1(), "BeatrixListener", CallOrigin.INTERNAL, UserType.SYSTEM, eventWithMetadata.getUserToken());
         try {
             final BusEvent externalEvent = computeExtBusEventEntryFromBusInternalEvent(event, internalContext);
             if (externalEvent != null) {
-                externalBus.post(externalEvent, internalContext.getUserToken(), internalContext.getAccountRecordId(), internalContext.getTenantRecordId());
+                externalBus.post(externalEvent);
             }
         } catch (EventBusException e) {
             log.warn("Failed to dispatch external bus events", e);
@@ -224,9 +220,13 @@ public class BeatrixListener {
         final UUID accountId = getAccountIdFromRecordId(event.getBusEventType(), objectId, context.getAccountRecordId(), context);
         final UUID tenantId = context.toTenantContext().getTenantId();
 
+        return null;
+        // STEPH_BUS
+        /*
         return eventBusType != null ?
                new DefaultBusExternalEvent(objectId, objectType, eventBusType, accountId, tenantId) :
                null;
+               */
     }
 
     private final UUID getAccountIdFromRecordId(final BusInternalEventType eventType, final UUID objectId, final Long recordId, final InternalCallContext context) {
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 8ad4e7e..0c1b74b 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
@@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 
-public class DefaultBusExternalEvent implements ExtBusEvent, BusEvent {
+public class DefaultBusExternalEvent implements ExtBusEvent {
 
     private final UUID objectId;
     private final UUID accountId;
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestPublicBus.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestPublicBus.java
index 4a6a909..b4e1844 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestPublicBus.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestPublicBus.java
@@ -13,6 +13,7 @@
  * License for the specific language governing permissions and limitations
  * under the License.
  */
+
 package com.ning.billing.beatrix.integration;
 
 import java.util.UUID;
@@ -23,7 +24,6 @@ import org.testng.annotations.Test;
 
 import com.ning.billing.account.api.Account;
 import com.ning.billing.api.TestApiListener.NextEvent;
-import com.ning.billing.bus.api.BusEventWithMetadata;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.PriceListSet;
@@ -43,8 +43,9 @@ public class TestPublicBus extends TestIntegrationBase {
 
 
     public class PublicListener {
+
         @Subscribe
-        public void handleExternalEvents(final BusEventWithMetadata<ExtBusEvent> event) {
+        public void handleExternalEvents(final ExtBusEvent event) {
             log.info("GOT EXT EVENT " + event.toString());
         }
     }
@@ -71,7 +72,7 @@ public class TestPublicBus extends TestIntegrationBase {
     }
 
 
-    @Test(groups= "{slow}")
+    @Test(groups = "{slow}")
     public void testSimple() throws Exception {
 
         final DateTime initialDate = new DateTime(2012, 2, 1, 0, 3, 42, 0, testTimeZone);
@@ -104,6 +105,4 @@ public class TestPublicBus extends TestIntegrationBase {
     }
 
 
-
-
 }
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 88960ce..0d1f5c4 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
@@ -20,13 +20,14 @@ 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 implements RepairEntitlementInternalEvent {
+public class DefaultRepairEntitlementEvent extends BusEventBase implements RepairEntitlementInternalEvent {
 
     private final UUID bundleId;
     private final UUID accountId;
@@ -36,7 +37,11 @@ public class DefaultRepairEntitlementEvent implements RepairEntitlementInternalE
     @JsonCreator
     public DefaultRepairEntitlementEvent(@JsonProperty("accountId") final UUID accountId,
                                          @JsonProperty("bundleId") final UUID bundleId,
-                                         @JsonProperty("effectiveDate") final DateTime effectiveDate) {
+                                         @JsonProperty("effectiveDate") final DateTime effectiveDate,
+                                         @JsonProperty("searchKey1") final Long searchKey1,
+                                         @JsonProperty("searchKey2") final Long searchKey2,
+                                         @JsonProperty("userToken") final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         this.bundleId = bundleId;
         this.accountId = accountId;
         this.effectiveDate = effectiveDate;
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 be43003..4ac2e44 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);
+        super(in, startDate, accountRecordId, tenantRecordId, userToken);
     }
 
     @JsonCreator
@@ -49,9 +49,12 @@ public class DefaultEffectiveSubscriptionEvent extends DefaultSubscriptionEvent 
                                              @JsonProperty("totalOrdering") final Long totalOrdering,
                                              @JsonProperty("transitionType") final SubscriptionTransitionType transitionType,
                                              @JsonProperty("remainingEventsForUserOperation") final Integer remainingEventsForUserOperation,
-                                             @JsonProperty("startDate") final DateTime startDate) {
+                                             @JsonProperty("startDate") final DateTime startDate,
+                                             @JsonProperty("searchKey1") final Long searchKey1,
+                                             @JsonProperty("searchKey2") final Long searchKey2,
+                                             @JsonProperty("userToken") final UUID userToken) {
         super(eventId, subscriptionId, bundleId, requestedTransitionTime, effectiveTransitionTime, previousState, previousPlan,
               previousPhase, previousPriceList, nextState, nextPlan, nextPhase, nextPriceList, totalOrdering,
-              transitionType, remainingEventsForUserOperation, startDate);
+              transitionType, remainingEventsForUserOperation, startDate, searchKey1, searchKey2, userToken);
     }
 }
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 4c4ebab..90c6143 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
@@ -29,10 +29,6 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class DefaultRequestedSubscriptionEvent extends DefaultSubscriptionEvent implements RequestedSubscriptionInternalEvent {
 
-    public DefaultRequestedSubscriptionEvent(final SubscriptionTransitionData in, final DateTime startDate) {
-        super(in, startDate);
-    }
-
     @JsonCreator
     public DefaultRequestedSubscriptionEvent(@JsonProperty("eventId") final UUID eventId,
                                              @JsonProperty("subscriptionId") final UUID subscriptionId,
@@ -50,14 +46,21 @@ public class DefaultRequestedSubscriptionEvent extends DefaultSubscriptionEvent 
                                              @JsonProperty("totalOrdering") final Long totalOrdering,
                                              @JsonProperty("transitionType") final SubscriptionTransitionType transitionType,
                                              @JsonProperty("remainingEventsForUserOperation") final Integer remainingEventsForUserOperation,
-                                             @JsonProperty("startDate") final DateTime startDate) {
+                                             @JsonProperty("startDate") final DateTime startDate,
+                                             @JsonProperty("searchKey1") final Long searchKey1,
+                                             @JsonProperty("searchKey2") final Long searchKey2,
+                                             @JsonProperty("userToken") final UUID userToken) {
         super(eventId, subscriptionId, bundleId, requestedTransitionTime, effectiveTransitionTime, previousState, previousPlan,
               previousPhase, previousPriceList, nextState, nextPlan, nextPhase, nextPriceList, totalOrdering,
-              transitionType, remainingEventsForUserOperation, startDate);
+              transitionType, remainingEventsForUserOperation, startDate, searchKey1, searchKey2, userToken);
     }
 
-    public DefaultRequestedSubscriptionEvent(final SubscriptionData subscription, final EntitlementEvent nextEvent) {
+    public DefaultRequestedSubscriptionEvent(final SubscriptionData subscription,
+                                             final EntitlementEvent nextEvent,
+                                             final Long searchKey1,
+                                             final Long searchKey2,
+                                             final UUID userToken) {
         this(nextEvent.getId(), nextEvent.getSubscriptionId(), subscription.getBundleId(), nextEvent.getRequestedDate(), nextEvent.getEffectiveDate(),
-             null, null, null, null, null, null, null, null, nextEvent.getTotalOrdering(), null, 0, null);
+             null, null, null, null, null, null, null, null, nextEvent.getTotalOrdering(), null, 0, null, searchKey1, searchKey2, userToken);
     }
 }
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 f75505a..17aba70 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,13 +21,14 @@ 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 implements SubscriptionInternalEvent {
+public abstract class DefaultSubscriptionEvent extends BusEventBase implements SubscriptionInternalEvent {
 
     private final Long totalOrdering;
     private final UUID subscriptionId;
@@ -47,7 +48,10 @@ public abstract class DefaultSubscriptionEvent implements SubscriptionInternalEv
     private final SubscriptionTransitionType transitionType;
     private final DateTime startDate;
 
-    public DefaultSubscriptionEvent(final SubscriptionTransitionData in, final DateTime startDate) {
+    public DefaultSubscriptionEvent(final SubscriptionTransitionData in, final DateTime startDate,
+                                    final Long searchKey1,
+                                    final Long searchKey2,
+                                    final UUID userToken) {
         this(in.getId(),
              in.getSubscriptionId(),
              in.getBundleId(),
@@ -64,7 +68,10 @@ public abstract class DefaultSubscriptionEvent implements SubscriptionInternalEv
              in.getTotalOrdering(),
              in.getTransitionType(),
              in.getRemainingEventsForUserOperation(),
-             startDate);
+             startDate,
+             searchKey1,
+             searchKey2,
+             userToken);
     }
 
     @JsonCreator
@@ -84,7 +91,11 @@ public abstract class DefaultSubscriptionEvent implements SubscriptionInternalEv
                                     @JsonProperty("totalOrdering") final Long totalOrdering,
                                     @JsonProperty("transitionType") final SubscriptionTransitionType transitionType,
                                     @JsonProperty("remainingEventsForUserOperation") final Integer remainingEventsForUserOperation,
-                                    @JsonProperty("startDate") final DateTime startDate) {
+                                    @JsonProperty("startDate") final DateTime startDate,
+                                    @JsonProperty("searchKey1") final Long searchKey1,
+                                    @JsonProperty("searchKey2") final Long searchKey2,
+                                    @JsonProperty("userToken") final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         this.eventId = eventId;
         this.subscriptionId = subscriptionId;
         this.bundleId = bundleId;
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 43f3be4..da6f35f 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
@@ -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, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
+            eventBus.post(busEvent);
         } catch (EventBusException e) {
             log.warn("Failed to post entitlement event " + event, e);
         }
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 4f0fde7..b1267ca 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
@@ -829,8 +829,9 @@ 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(accountId, bundleId, clock.getUTCNow());
-                    eventBus.postFromTransaction(busEvent, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId(), entitySqlDaoWrapperFactory.getSqlDao());
+                    final RepairEntitlementInternalEvent busEvent = new DefaultRepairEntitlementEvent(accountId, bundleId, clock.getUTCNow(),
+                                                                                                      context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken());
+                    eventBus.postFromTransaction(busEvent, entitySqlDaoWrapperFactory.getSqlDao());
                 } catch (EventBusException e) {
                     log.warn("Failed to post repair entitlement event for bundle " + bundleId, e);
                 }
@@ -910,7 +911,7 @@ public class DefaultEntitlementDao implements EntitlementDao {
                                                                                                       context.getAccountRecordId(), context.getTenantRecordId());
 
 
-            eventBus.postFromTransaction(busEvent, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId(), entitySqlDaoWrapperFactory.getSqlDao());
+            eventBus.postFromTransaction(busEvent, entitySqlDaoWrapperFactory.getSqlDao());
         } catch (EventBusException e) {
             log.warn("Failed to post effective event for subscription " + subscription.getId(), e);
         }
@@ -919,7 +920,7 @@ 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.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId(), entitySqlDaoWrapperFactory.getSqlDao());
+            eventBus.postFromTransaction(new DefaultRequestedSubscriptionEvent(subscription, nextEvent, context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken()), entitySqlDaoWrapperFactory.getSqlDao());
         } catch (EventBusException e) {
             log.warn("Failed to post requested change event for subscription " + subscription.getId(), 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 a19a720..7d68e90 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
@@ -39,7 +39,7 @@ public class TestEventJson extends GuicyKillbillTestSuiteNoDB {
 
         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,
-                                                                                           SubscriptionTransitionType.CANCEL, 0, new DateTime());
+                                                                                           SubscriptionTransitionType.CANCEL, 0, new DateTime(), 1L, 2L, null);
 
         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(), new DateTime());
+        final RepairEntitlementInternalEvent e = new DefaultRepairEntitlementEvent(UUID.randomUUID(), UUID.randomUUID(), new DateTime(), 1L, 2L, null);
 
         final String json = mapper.writeValueAsString(e);
 
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 56a5428..4f615c6 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,20 +18,25 @@ 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 implements InvoiceAdjustmentInternalEvent {
+public class DefaultInvoiceAdjustmentEvent extends BusEventBase implements InvoiceAdjustmentInternalEvent {
 
     private final UUID invoiceId;
     private final UUID accountId;
 
     @JsonCreator
     public DefaultInvoiceAdjustmentEvent(@JsonProperty("invoiceId") final UUID invoiceId,
-                                         @JsonProperty("accountId") final UUID accountId) {
+                                         @JsonProperty("accountId") final UUID accountId,
+                                         @JsonProperty("searchKey1") final Long searchKey1,
+                                         @JsonProperty("searchKey2") final Long searchKey2,
+                                         @JsonProperty("userToken") final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         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 bd3dc43..93b9a9f 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceCreationEvent.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceCreationEvent.java
@@ -20,13 +20,14 @@ 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 implements InvoiceCreationInternalEvent {
+public class DefaultInvoiceCreationEvent extends BusEventBase implements InvoiceCreationInternalEvent {
 
     private final UUID invoiceId;
     private final UUID accountId;
@@ -37,7 +38,11 @@ public class DefaultInvoiceCreationEvent implements InvoiceCreationInternalEvent
     public DefaultInvoiceCreationEvent(@JsonProperty("invoiceId") final UUID invoiceId,
                                        @JsonProperty("accountId") final UUID accountId,
                                        @JsonProperty("amountOwed") final BigDecimal amountOwed,
-                                       @JsonProperty("currency") final Currency currency) {
+                                       @JsonProperty("currency") final Currency currency,
+                                       @JsonProperty("searchKey1") final Long searchKey1,
+                                       @JsonProperty("searchKey2") final Long searchKey2,
+                                       @JsonProperty("userToken") final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         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 26d90da..20fcb6c 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
@@ -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.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken()));
         } 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 87875d6..e16de37 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,20 +20,25 @@ 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 implements NullInvoiceInternalEvent {
+public class DefaultNullInvoiceEvent extends BusEventBase implements NullInvoiceInternalEvent {
 
     private final UUID accountId;
     private final LocalDate processingDate;
 
     @JsonCreator
     public DefaultNullInvoiceEvent(@JsonProperty("accountId") final UUID accountId,
-                                   @JsonProperty("processingDate") final LocalDate processingDate) {
+                                   @JsonProperty("processingDate") final LocalDate processingDate,
+                                   @JsonProperty("searchKey1") final Long searchKey1,
+                                   @JsonProperty("searchKey2") final Long searchKey2,
+                                   @JsonProperty("userToken") final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         this.accountId = accountId;
         this.processingDate = processingDate;
 
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 a978b7e..b56dc7c 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
@@ -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, context.getAccountRecordId(), context.getTenantRecordId(), userToken),
                                          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 9e2a4e6..9c2c083 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
@@ -187,7 +187,8 @@ 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());
+                    final BusInternalEvent event = new DefaultNullInvoiceEvent(accountId, clock.getUTCToday(),
+                                                                               context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken());
                     postEvent(event, accountId, context);
                 }
             } else {
@@ -235,10 +236,12 @@ public class InvoiceDispatcher {
                     final List<InvoiceInternalEvent> events = new ArrayList<InvoiceInternalEvent>();
                     if (isRealInvoiceWithItems) {
                         events.add(new DefaultInvoiceCreationEvent(invoice.getId(), invoice.getAccountId(),
-                                                                   invoice.getBalance(), invoice.getCurrency()));
+                                                                   invoice.getBalance(), invoice.getCurrency(),
+                                                                   context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken()));
                     }
                     for (UUID cur : adjustedUniqueOtherInvoiceId) {
-                        final InvoiceAdjustmentInternalEvent event = new DefaultInvoiceAdjustmentEvent(cur, invoice.getAccountId());
+                        final InvoiceAdjustmentInternalEvent event = new DefaultInvoiceAdjustmentEvent(cur, invoice.getAccountId(),
+                                                                                                       context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken());
                         events.add(event);
                     }
 
@@ -300,7 +303,7 @@ public class InvoiceDispatcher {
 
     private void postEvent(final BusInternalEvent event, final UUID accountId, final InternalCallContext context) {
         try {
-            eventBus.post(event, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
+            eventBus.post(event);
         } 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 da8e9e7..cd4f6ce 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
@@ -22,7 +22,6 @@ 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;
@@ -48,31 +47,29 @@ public class InvoiceListener {
     }
 
     @Subscribe
-    public void handleRepairEntitlementEvent(final BusEventWithMetadata<RepairEntitlementInternalEvent> eventWithMetadata) {
+    public void handleRepairEntitlementEvent(final RepairEntitlementInternalEvent event) {
 
-        final RepairEntitlementInternalEvent repairEvent = eventWithMetadata.getEvent();
         try {
-            final InternalCallContext context = internalCallContextFactory.createInternalCallContext(eventWithMetadata.getSearchKey2(), eventWithMetadata.getSearchKey1(), "RepairBundle", CallOrigin.INTERNAL, UserType.SYSTEM, eventWithMetadata.getUserToken());
-            dispatcher.processAccount(repairEvent.getAccountId(), repairEvent.getEffectiveDate(), false, context);
+            final InternalCallContext context = internalCallContextFactory.createInternalCallContext(event.getSearchKey2(), event.getSearchKey1(), "RepairBundle", CallOrigin.INTERNAL, UserType.SYSTEM, event.getUserToken());
+            dispatcher.processAccount(event.getAccountId(), event.getEffectiveDate(), false, context);
         } catch (InvoiceApiException e) {
             log.error(e.getMessage());
         }
     }
 
     @Subscribe
-    public void handleSubscriptionTransition(final BusEventWithMetadata<EffectiveSubscriptionInternalEvent> eventWithMetadata) {
+    public void handleSubscriptionTransition(final EffectiveSubscriptionInternalEvent event) {
 
-        final EffectiveSubscriptionInternalEvent transition = eventWithMetadata.getEvent();
         try {
             //  Skip future uncancel event
             //  Skip events which are marked as not being the last one
-            if (transition.getTransitionType() == SubscriptionTransitionType.UNCANCEL ||
-                transition.getTransitionType() == SubscriptionTransitionType.MIGRATE_ENTITLEMENT
-                || transition.getRemainingEventsForUserOperation() > 0) {
+            if (event.getTransitionType() == SubscriptionTransitionType.UNCANCEL ||
+                event.getTransitionType() == SubscriptionTransitionType.MIGRATE_ENTITLEMENT
+                || event.getRemainingEventsForUserOperation() > 0) {
                 return;
             }
-            final InternalCallContext context = internalCallContextFactory.createInternalCallContext(eventWithMetadata.getSearchKey2(), eventWithMetadata.getSearchKey1(), "SubscriptionTransition", CallOrigin.INTERNAL, UserType.SYSTEM, eventWithMetadata.getUserToken());
-            dispatcher.processSubscription(transition, context);
+            final InternalCallContext context = internalCallContextFactory.createInternalCallContext(event.getSearchKey2(), event.getSearchKey1(), "SubscriptionTransition", CallOrigin.INTERNAL, UserType.SYSTEM, event.getUserToken());
+            dispatcher.processSubscription(event, 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 04e9a81..66f2bdf 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceTagHandler.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceTagHandler.java
@@ -22,7 +22,6 @@ 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;
@@ -53,12 +52,11 @@ public class InvoiceTagHandler {
     }
 
     @Subscribe
-    public void process_AUTO_INVOICING_OFF_removal(final BusEventWithMetadata<ControlTagDeletionInternalEvent> eventWithMetadata) {
+    public void process_AUTO_INVOICING_OFF_removal(final ControlTagDeletionInternalEvent event) {
 
-        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(eventWithMetadata.getSearchKey2(), eventWithMetadata.getSearchKey1(), "InvoiceTagHandler", CallOrigin.INTERNAL, UserType.SYSTEM, eventWithMetadata.getUserToken());
+            final InternalCallContext context = internalCallContextFactory.createInternalCallContext(event.getSearchKey2(), event.getSearchKey1(), "InvoiceTagHandler", CallOrigin.INTERNAL, UserType.SYSTEM, event.getUserToken());
             processUnpaid_AUTO_INVOICING_OFF_invoices(accountId, context);
         }
     }
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 afb5cc4..cc654e1 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);
+        final InvoiceCreationInternalEvent e = new DefaultInvoiceCreationEvent(UUID.randomUUID(), UUID.randomUUID(), new BigDecimal(12.0), Currency.USD, 1L, 2L, null);
         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());
+        final NullInvoiceInternalEvent e = new DefaultNullInvoiceEvent(UUID.randomUUID(), new LocalDate(), 1L, 2L, null);
         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 dc3aaaf..bf569cb 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
@@ -65,8 +65,8 @@ public class MockInvoiceDao implements InvoiceDao {
         }
         try {
             eventBus.post(new DefaultInvoiceCreationEvent(invoice.getId(), invoice.getAccountId(),
-                                                          InvoiceModelDaoHelper.getBalance(invoice), invoice.getCurrency()),
-                          context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
+                                                          InvoiceModelDaoHelper.getBalance(invoice), invoice.getCurrency(),
+                          context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken()));
         } catch (PersistentBus.EventBusException ex) {
             throw new RuntimeException(ex);
         }
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 05637ef..c2b8fef 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,7 +42,6 @@ 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;
@@ -281,38 +280,36 @@ public class SubscriptionResource extends JaxRsResourceBase {
         }
 
         @Override
-        public void onSubscriptionTransition(final BusEventWithMetadata<EffectiveSubscriptionInternalEvent> eventWithMetadata) {
+        public void onSubscriptionTransition(final EffectiveSubscriptionInternalEvent event) {
 
-            final EffectiveSubscriptionInternalEvent curEventEffective = eventWithMetadata.getEvent();
             log.info(String.format("Got event SubscriptionTransition token = %s, type = %s, remaining = %d ",
-                                   eventWithMetadata.getUserToken(), curEventEffective.getTransitionType(), curEventEffective.getRemainingEventsForUserOperation()));
+                                   event.getUserToken(), event.getTransitionType(), event.getRemainingEventsForUserOperation()));
         }
 
         @Override
-        public void onEmptyInvoice(final BusEventWithMetadata<NullInvoiceInternalEvent> eventWithMetadata) {
-            log.info(String.format("Got event EmptyInvoiceNotification token = %s ", eventWithMetadata.getUserToken()));
+        public void onEmptyInvoice(final NullInvoiceInternalEvent event) {
+            log.info(String.format("Got event EmptyInvoiceNotification token = %s ", event.getUserToken()));
             notifyForCompletion();
         }
 
         @Override
-        public void onInvoiceCreation(final BusEventWithMetadata<InvoiceCreationInternalEvent> eventWithMetadata) {
+        public void onInvoiceCreation(final InvoiceCreationInternalEvent event) {
 
-            final InvoiceCreationInternalEvent event = eventWithMetadata.getEvent();
-            log.info(String.format("Got event InvoiceCreationNotification token = %s ", eventWithMetadata.getUserToken()));
+            log.info(String.format("Got event InvoiceCreationNotification token = %s ", event.getUserToken()));
             if (event.getAmountOwed().compareTo(BigDecimal.ZERO) <= 0) {
                 notifyForCompletion();
             }
         }
 
         @Override
-        public void onPaymentInfo(final BusEventWithMetadata<PaymentInfoInternalEvent> eventWithMetadata) {
-            log.info(String.format("Got event PaymentInfo token = %s ", eventWithMetadata.getUserToken()));
+        public void onPaymentInfo(final PaymentInfoInternalEvent event) {
+            log.info(String.format("Got event PaymentInfo token = %s ", event.getUserToken()));
             notifyForCompletion();
         }
 
         @Override
-        public void onPaymentError(final BusEventWithMetadata<PaymentErrorInternalEvent> eventWithMetadata) {
-            log.info(String.format("Got event PaymentError token = %s ", eventWithMetadata.getUserToken()));
+        public void onPaymentError(final PaymentErrorInternalEvent event) {
+            log.info(String.format("Got event PaymentError token = %s ", event.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 a0e1930..f0c1aee 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/util/KillbillEventHandler.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/util/KillbillEventHandler.java
@@ -20,7 +20,6 @@ import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 
-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;
@@ -58,7 +57,7 @@ public class KillbillEventHandler {
      * Killbill server event handler
      */
     @Subscribe
-    public void handleEntitlementevents(final BusEventWithMetadata<BusInternalEvent> event) {
+    public void handleEntitlementevents(final 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/plumbing/billing/TestBillingApi.java b/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillingApi.java
index b431788..198e8e9 100644
--- a/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillingApi.java
+++ b/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillingApi.java
@@ -281,8 +281,8 @@ public class TestBillingApi extends JunctionTestSuiteNoDB {
         final EffectiveSubscriptionInternalEvent t = new MockEffectiveSubscriptionEvent(
                 eventId, subId, bunId, then, now, null, null, null, null, SubscriptionState.ACTIVE,
                 nextPlan.getName(), nextPhase.getName(),
-                nextPriceList.getName(), 1L, null,
-                SubscriptionTransitionType.CREATE, 0, null);
+                nextPriceList.getName(), 1L,
+                SubscriptionTransitionType.CREATE,  1, null, 1L, 2L, null);
 
         effectiveSubscriptionTransitions.add(t);
         return now;
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 18d01d7..531a8bc 100644
--- a/osgi/src/main/java/com/ning/billing/osgi/KillbillEventObservable.java
+++ b/osgi/src/main/java/com/ning/billing/osgi/KillbillEventObservable.java
@@ -23,7 +23,6 @@ import javax.inject.Inject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-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.notification.plugin.api.ExtBusEvent;
@@ -54,11 +53,10 @@ public class KillbillEventObservable extends Observable {
     }
 
     @Subscribe
-    public void handleKillbillEvent(final BusEventWithMetadata<ExtBusEvent> eventWithMetadata) {
+    public void handleKillbillEvent(final ExtBusEvent event) {
 
-        final ExtBusEvent killbillEvent = eventWithMetadata.getEvent();
-        logger.debug("Received external event " + killbillEvent.toString());
+        logger.debug("Received external event " + event.toString());
         setChanged();
-        notifyObservers(killbillEvent);
+        notifyObservers(event);
     }
 }
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 616170f..cf68d7c 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,13 +19,14 @@ 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 implements OverdueChangeInternalEvent {
+public class DefaultOverdueChangeEvent extends BusEventBase implements OverdueChangeInternalEvent {
 
     private final UUID overdueObjectId;
     private final Type overdueObjectType;
@@ -36,7 +37,11 @@ public class DefaultOverdueChangeEvent implements OverdueChangeInternalEvent {
     public DefaultOverdueChangeEvent(@JsonProperty("overdueObjectId") final UUID overdueObjectId,
                                      @JsonProperty("overdueObjectType") final Type overdueObjectType,
                                      @JsonProperty("previousOverdueStateName") final String previousOverdueStateName,
-                                     @JsonProperty("nextOverdueStateName") final String nextOverdueStateName) {
+                                     @JsonProperty("nextOverdueStateName") final String nextOverdueStateName,
+                                     @JsonProperty("searchKey1") final Long searchKey1,
+                                     @JsonProperty("searchKey2") final Long searchKey2,
+                                     @JsonProperty("userToken") final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         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 4902c24..5cf67dc 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
@@ -140,7 +140,7 @@ public class OverdueStateApplicator<T extends Blockable> {
         }
 
         try {
-            bus.post(createOverdueEvent(overdueable, previousOverdueStateName, nextOverdueState.getName(), context), context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
+            bus.post(createOverdueEvent(overdueable, previousOverdueStateName, nextOverdueState.getName(), context));
         } catch (Exception e) {
             log.error("Error posting overdue change event to bus", e);
         }
@@ -155,14 +155,15 @@ public class OverdueStateApplicator<T extends Blockable> {
         clearFutureNotification(overdueable, context);
 
         try {
-            bus.post(createOverdueEvent(overdueable, previousOverdueStateName, clearState.getName(), context), context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
+            bus.post(createOverdueEvent(overdueable, previousOverdueStateName, clearState.getName(), context));
         } 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);
+        return new DefaultOverdueChangeEvent(overdueable.getId(), Type.get(overdueable), previousOverdueStateName, nextOverdueStateName,
+                                             context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken());
     }
 
     protected void storeNewState(final T blockable, final OverdueState<T> nextOverdueState, final InternalCallContext context) throws OverdueException {
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 1672329..e306862 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,7 +22,6 @@ 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;
@@ -53,48 +52,43 @@ public class OverdueListener {
     }
 
     @Subscribe
-    public void handle_OVERDUE_ENFORCEMENT_OFF_Insert(final BusEventWithMetadata<ControlTagCreationInternalEvent> eventWithMetadata) {
-        final ControlTagCreationInternalEvent event = eventWithMetadata.getEvent();
+    public void handle_OVERDUE_ENFORCEMENT_OFF_Insert(final ControlTagCreationInternalEvent event) {
         if (event.getTagDefinition().getName().equals(ControlTagType.OVERDUE_ENFORCEMENT_OFF.toString()) && event.getObjectType() == ObjectType.ACCOUNT) {
             final UUID accountId = event.getObjectId();
-            dispatcher.clearOverdueForAccount(accountId, createCallContext(eventWithMetadata.getUserToken(), eventWithMetadata.getSearchKey1(), eventWithMetadata.getSearchKey2()));
+            dispatcher.clearOverdueForAccount(accountId, createCallContext(event.getUserToken(), event.getSearchKey1(), event.getSearchKey2()));
         }
     }
 
     @Subscribe
-    public void handle_OVERDUE_ENFORCEMENT_OFF_Removal(final BusEventWithMetadata<ControlTagDeletionInternalEvent> eventWithMetadata) {
-        final ControlTagDeletionInternalEvent event = eventWithMetadata.getEvent();
+    public void handle_OVERDUE_ENFORCEMENT_OFF_Removal(final ControlTagDeletionInternalEvent event) {
         if (event.getTagDefinition().getName().equals(ControlTagType.OVERDUE_ENFORCEMENT_OFF.toString()) && event.getObjectType() == ObjectType.ACCOUNT) {
             final UUID accountId = event.getObjectId();
-            dispatcher.processOverdueForAccount(accountId, createCallContext(eventWithMetadata.getUserToken(), eventWithMetadata.getSearchKey1(), eventWithMetadata.getSearchKey2()));
+            dispatcher.processOverdueForAccount(accountId, createCallContext(event.getUserToken(), event.getSearchKey1(), event.getSearchKey2()));
         }
     }
 
 
     @Subscribe
-    public void handlePaymentInfoEvent(final BusEventWithMetadata<PaymentInfoInternalEvent> eventWithMetadata) {
+    public void handlePaymentInfoEvent(final PaymentInfoInternalEvent event) {
 
-        final PaymentInfoInternalEvent event = eventWithMetadata.getEvent();
         log.debug("Received PaymentInfo event {}", event);
-        dispatcher.processOverdueForAccount(event.getAccountId(), createCallContext(eventWithMetadata.getUserToken(), eventWithMetadata.getSearchKey1(), eventWithMetadata.getSearchKey2()));
+        dispatcher.processOverdueForAccount(event.getAccountId(), createCallContext(event.getUserToken(), event.getSearchKey1(), event.getSearchKey2()));
     }
 
     @Subscribe
-    public void handlePaymentErrorEvent(final BusEventWithMetadata<PaymentErrorInternalEvent> eventWithMetadata) {
+    public void handlePaymentErrorEvent(final PaymentErrorInternalEvent event) {
 
-        final PaymentErrorInternalEvent event = eventWithMetadata.getEvent();
         log.debug("Received PaymentError event {}", event);
         final UUID accountId = event.getAccountId();
-        dispatcher.processOverdueForAccount(accountId, createCallContext(eventWithMetadata.getUserToken(), eventWithMetadata.getSearchKey1(), eventWithMetadata.getSearchKey2()));
+        dispatcher.processOverdueForAccount(accountId, createCallContext(event.getUserToken(), event.getSearchKey1(), event.getSearchKey2()));
     }
 
     @Subscribe
-    public void handleInvoiceAdjustmentEvent(final BusEventWithMetadata<InvoiceAdjustmentInternalEvent> eventWithMetadata) {
+    public void handleInvoiceAdjustmentEvent(final InvoiceAdjustmentInternalEvent event) {
 
-        final InvoiceAdjustmentInternalEvent event = eventWithMetadata.getEvent();
         log.debug("Received InvoiceAdjustment event {}", event);
         final UUID accountId = event.getAccountId();
-        dispatcher.processOverdueForAccount(accountId, createCallContext(eventWithMetadata.getUserToken(), eventWithMetadata.getSearchKey1(), eventWithMetadata.getSearchKey2()));
+        dispatcher.processOverdueForAccount(accountId, createCallContext(event.getUserToken(), event.getSearchKey1(), event.getSearchKey2()));
     }
 
     public void handleNextOverdueCheck(final OverdueCheckNotificationKey notificationKey, final UUID userToken, final Long accountRecordId, final Long tenantRecordId) {
diff --git a/overdue/src/test/java/com/ning/billing/overdue/applicator/OverdueBusListenerTester.java b/overdue/src/test/java/com/ning/billing/overdue/applicator/OverdueBusListenerTester.java
index 490da0f..58771b4 100644
--- a/overdue/src/test/java/com/ning/billing/overdue/applicator/OverdueBusListenerTester.java
+++ b/overdue/src/test/java/com/ning/billing/overdue/applicator/OverdueBusListenerTester.java
@@ -22,7 +22,6 @@ import java.util.List;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.ning.billing.bus.api.BusEventWithMetadata;
 import com.ning.billing.util.events.OverdueChangeInternalEvent;
 
 import com.google.common.eventbus.Subscribe;
@@ -34,11 +33,10 @@ public class OverdueBusListenerTester {
     private final List<OverdueChangeInternalEvent> eventsReceived = new ArrayList<OverdueChangeInternalEvent>();
 
     @Subscribe
-    public void handleOverdueChange(final BusEventWithMetadata<OverdueChangeInternalEvent> eventWithMetadata) {
+    public void handleOverdueChange(final OverdueChangeInternalEvent event) {
 
-        final OverdueChangeInternalEvent changeEvent = eventWithMetadata.getEvent();
         log.info("Received subscription transition.");
-        eventsReceived.add(changeEvent);
+        eventsReceived.add(event);
     }
 
     public List<OverdueChangeInternalEvent> getEventsReceived() {
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 18b91ee..8dfbcd3 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,6 +18,7 @@ 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;
@@ -25,127 +26,47 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 
-@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "error")
-public class DefaultPaymentErrorEvent implements PaymentErrorInternalEvent {
+public class DefaultPaymentErrorEvent extends BusEventBase implements PaymentErrorInternalEvent {
 
-    private final UUID id;
     private final String message;
     private final UUID accountId;
     private final UUID invoiceId;
     private final UUID paymentId;
 
-
     @JsonCreator
-    public DefaultPaymentErrorEvent(@JsonProperty("id") final UUID id, /* not used */
-                                    @JsonProperty("accountId") final UUID accountId,
+    public DefaultPaymentErrorEvent(@JsonProperty("accountId") final UUID accountId,
                                     @JsonProperty("invoiceId") final UUID invoiceId,
                                     @JsonProperty("paymentId") final UUID paymentId,
-                                    @JsonProperty("message") final String message) {
-        this.id = id;
+                                    @JsonProperty("message") final String message,
+                                    @JsonProperty("searchKey1") final Long searchKey1,
+                                    @JsonProperty("searchKey2") final Long searchKey2,
+                                    @JsonProperty("userToken") final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         this.message = message;
         this.accountId = accountId;
         this.invoiceId = invoiceId;
         this.paymentId = paymentId;
     }
 
-
-    public DefaultPaymentErrorEvent(final UUID accountId,
-                                    final UUID invoiceId, final UUID paymentId, final String message) {
-        this(UUID.randomUUID(), accountId, invoiceId, paymentId, message);
-    }
-
-
-    @JsonIgnore
-    @Override
-    public BusInternalEventType getBusEventType() {
-        return BusInternalEventType.PAYMENT_ERROR;
-    }
-
-
-    @Override
     public String getMessage() {
         return message;
     }
 
-    @Override
-    public UUID getInvoiceId() {
-        return invoiceId;
-    }
-
-    @Override
     public UUID getAccountId() {
         return accountId;
     }
 
-    @Override
-    public UUID getPaymentId() {
-        return paymentId;
-    }
-
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result
-                 + ((accountId == null) ? 0 : accountId.hashCode());
-        result = prime * result
-                 + ((invoiceId == null) ? 0 : invoiceId.hashCode());
-        result = prime * result + ((message == null) ? 0 : message.hashCode());
-        result = prime * result
-                 + ((paymentId == null) ? 0 : paymentId.hashCode());
-        return result;
+    public UUID getInvoiceId() {
+        return invoiceId;
     }
 
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null) {
-            return false;
-        }
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-        final DefaultPaymentErrorEvent other = (DefaultPaymentErrorEvent) obj;
-        if (accountId == null) {
-            if (other.accountId != null) {
-                return false;
-            }
-        } else if (!accountId.equals(other.accountId)) {
-            return false;
-        }
-        if (invoiceId == null) {
-            if (other.invoiceId != null) {
-                return false;
-            }
-        } else if (!invoiceId.equals(other.invoiceId)) {
-            return false;
-        }
-        if (message == null) {
-            if (other.message != null) {
-                return false;
-            }
-        } else if (!message.equals(other.message)) {
-            return false;
-        }
-        if (paymentId == null) {
-            if (other.paymentId != null) {
-                return false;
-            }
-        } else if (!paymentId.equals(other.paymentId)) {
-            return false;
-        }
-        return true;
+    public UUID getPaymentId() {
+        return paymentId;
     }
 
-
+    @JsonIgnore
     @Override
-    public String toString() {
-        return "DefaultPaymentErrorEvent [message=" + message + ", accountId="
-               + accountId + ", invoiceId=" + invoiceId + ", paymentId="
-               + paymentId + "]";
+    public BusInternalEventType getBusEventType() {
+        return BusInternalEventType.PAYMENT_ERROR;
     }
 }
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 e23e607..ccca2a9 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,13 +21,14 @@ 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 implements PaymentInfoInternalEvent {
+public class DefaultPaymentInfoEvent extends BusEventBase implements PaymentInfoInternalEvent {
 
     private final UUID accountId;
     private final UUID invoiceId;
@@ -38,8 +39,7 @@ public class DefaultPaymentInfoEvent implements PaymentInfoInternalEvent {
     private final DateTime effectiveDate;
 
     @JsonCreator
-    public DefaultPaymentInfoEvent(@JsonProperty("id") final UUID id, /* not used */
-                                   @JsonProperty("accountId") final UUID accountId,
+    public DefaultPaymentInfoEvent(@JsonProperty("accountId") final UUID accountId,
                                    @JsonProperty("invoiceId") final UUID invoiceId,
                                    @JsonProperty("paymentId") final UUID paymentId,
                                    @JsonProperty("amount") final BigDecimal amount,
@@ -47,7 +47,11 @@ public class DefaultPaymentInfoEvent implements PaymentInfoInternalEvent {
                                    @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("effectiveDate") final DateTime effectiveDate) {
+                                   @JsonProperty("effectiveDate") final DateTime effectiveDate,
+                                   @JsonProperty("searchKey1") final Long searchKey1,
+                                   @JsonProperty("searchKey2") final Long searchKey2,
+                                   @JsonProperty("userToken") final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         this.accountId = accountId;
         this.invoiceId = invoiceId;
         this.paymentId = paymentId;
@@ -60,9 +64,12 @@ public class DefaultPaymentInfoEvent implements PaymentInfoInternalEvent {
     public DefaultPaymentInfoEvent(final UUID accountId, final UUID invoiceId,
                                    final UUID paymentId, final BigDecimal amount, final Integer paymentNumber,
                                    final PaymentStatus status,
-                                   final DateTime effectiveDatefinal) {
-        this(UUID.randomUUID(), accountId, invoiceId, paymentId, amount, paymentNumber, status, null, null,
-             effectiveDatefinal);
+                                   final DateTime effectiveDate,
+                                   final Long searchKey1,
+                                   final Long searchKey2,
+                                   final UUID userToken) {
+        this(accountId, invoiceId, paymentId, amount, paymentNumber, status, null, null,
+             effectiveDate, searchKey1, searchKey2, userToken);
     }
 
     @JsonIgnore
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 020b047..760378b 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,8 +22,6 @@ import org.slf4j.LoggerFactory;
 import com.ning.billing.ErrorCode;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
-import com.ning.billing.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;
@@ -54,16 +52,14 @@ public class InvoiceHandler {
     }
 
     @Subscribe
-    public void processInvoiceEvent(final BusEventWithMetadata<InvoiceCreationInternalEvent> eventWithMetadata) {
-
-        final InvoiceCreationInternalEvent event = eventWithMetadata.getEvent();
+    public void processInvoiceEvent(final InvoiceCreationInternalEvent event) {
 
         log.info("Received invoice creation notification for account {} and invoice {}",
                  event.getAccountId(), event.getInvoiceId());
 
         final Account account;
         try {
-            final InternalCallContext internalContext =  internalCallContextFactory.createInternalCallContext(eventWithMetadata.getSearchKey2(), eventWithMetadata.getSearchKey1(), "PaymentRequestProcessor", CallOrigin.INTERNAL, UserType.SYSTEM, eventWithMetadata.getUserToken());
+            final InternalCallContext internalContext = internalCallContextFactory.createInternalCallContext(event.getSearchKey2(), event.getSearchKey1(), "PaymentRequestProcessor", CallOrigin.INTERNAL, UserType.SYSTEM, event.getUserToken());
             account = accountApi.getAccountById(event.getAccountId(), internalContext);
             paymentProcessor.createPayment(account, event.getInvoiceId(), null, internalContext, false, false);
         } catch (AccountApiException e) {
@@ -71,7 +67,7 @@ public class InvoiceHandler {
         } catch (PaymentApiException e) {
             // Log as error unless:
             if (e.getCode() != ErrorCode.PAYMENT_NULL_INVOICE.getCode() /*  Nothing to left be paid*/ &&
-                    e.getCode() != ErrorCode.PAYMENT_CREATE_PAYMENT.getCode() /* User payment error */) {
+                e.getCode() != ErrorCode.PAYMENT_CREATE_PAYMENT.getCode() /* User payment error */) {
                 log.error("Failed to process invoice payment {}", e.toString());
             }
         }
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 a009fec..c65af26 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
@@ -24,7 +24,6 @@ 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.api.BusEventWithMetadata;
 import com.ning.billing.payment.api.PaymentApiException;
 import com.ning.billing.payment.core.PaymentProcessor;
 import com.ning.billing.util.callcontext.CallContext;
@@ -62,9 +61,8 @@ public class PaymentTagHandler {
     }
 
     @Subscribe
-    public void process_AUTO_PAY_OFF_removal(final BusEventWithMetadata<ControlTagDeletionInternalEvent> eventWithMetadata) {
+    public void process_AUTO_PAY_OFF_removal(final ControlTagDeletionInternalEvent event) {
 
-        final ControlTagDeletionInternalEvent event = eventWithMetadata.getEvent();
         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, null);
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 5918c2f..7076840 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
@@ -231,7 +231,10 @@ 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()
+                                                                                 ErrorCode.PAYMENT_NO_DEFAULT_PAYMENT_METHOD.toString(),
+                                                                                 context.getAccountRecordId(),
+                                                                                 context.getTenantRecordId(),
+                                                                                 context.getUserToken()
             );
             postPaymentEvent(event, account.getId(), context);
             throw e;
@@ -514,7 +517,10 @@ public class PaymentProcessor extends ProcessorBase {
                     // Create Bus event
                     event = new DefaultPaymentInfoEvent(account.getId(),
                                                         invoice.getId(), payment.getId(), payment.getAmount(), payment.getPaymentNumber(), paymentStatus,
-                                                        payment.getEffectiveDate()
+                                                        payment.getEffectiveDate(),
+                                                        context.getAccountRecordId(),
+                                                        context.getTenantRecordId(),
+                                                        context.getUserToken()
                     );
                     break;
 
@@ -532,7 +538,8 @@ public class PaymentProcessor extends ProcessorBase {
                     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()
+                    event = new DefaultPaymentErrorEvent(account.getId(), invoice.getId(), paymentInput.getId(), paymentPluginInfo.getGatewayError(),
+                                                         context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken()
                     );
                     throw new PaymentApiException(ErrorCode.PAYMENT_CREATE_PAYMENT, account.getId(), paymentPluginInfo.getGatewayError());
 
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 8d76c37..8055594 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
@@ -142,7 +142,7 @@ public abstract class ProcessorBase {
             return;
         }
         try {
-            eventBus.post(ev, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
+            eventBus.post(ev);
         } catch (EventBusException e) {
             log.error("Failed to post Payment event event for account {} ", accountId, e);
         }
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 16de99e..ff0b29c 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");
+        final PaymentErrorInternalEvent e = new DefaultPaymentErrorEvent(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), "no message", 1L, 2L, UUID.randomUUID());
         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,
-                                                                       new DateTime());
+                                                                       new DateTime(), 1L, 2L, UUID.randomUUID());
         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 7826528..665d86d 100644
--- a/payment/src/test/java/com/ning/billing/payment/MockInvoiceCreationEvent.java
+++ b/payment/src/test/java/com/ning/billing/payment/MockInvoiceCreationEvent.java
@@ -22,13 +22,14 @@ import java.util.UUID;
 import org.joda.time.LocalDate;
 
 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 MockInvoiceCreationEvent implements InvoiceCreationInternalEvent {
+public class MockInvoiceCreationEvent extends BusEventBase implements InvoiceCreationInternalEvent {
 
     private final UUID invoiceId;
     private final UUID accountId;
@@ -41,7 +42,11 @@ public class MockInvoiceCreationEvent implements InvoiceCreationInternalEvent {
                                     @JsonProperty("accountId") final UUID accountId,
                                     @JsonProperty("amountOwed") final BigDecimal amountOwed,
                                     @JsonProperty("currency") final Currency currency,
-                                    @JsonProperty("invoiceCreationDate") final LocalDate invoiceCreationDate) {
+                                    @JsonProperty("invoiceCreationDate") final LocalDate invoiceCreationDate,
+                                    @JsonProperty("searchKey1") final Long searchKey1,
+                                    @JsonProperty("searchKey2") final Long searchKey2,
+                                    @JsonProperty("userToken") final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         this.invoiceId = invoiceId;
         this.accountId = accountId;
         this.amountOwed = amountOwed;
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 f5b2d62..096692c 100644
--- a/payment/src/test/java/com/ning/billing/payment/TestPaymentHelper.java
+++ b/payment/src/test/java/com/ning/billing/payment/TestPaymentHelper.java
@@ -93,9 +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());
+                                                                                invoice.getInvoiceDate(), 1L, 2L, null);
 
-        eventBus.post(event, context.getUserToken(), 1L, 1L);
+        eventBus.post(event);
         return invoice;
     }
 
diff --git a/server/src/main/java/com/ning/billing/server/notifications/PushNotificationListener.java b/server/src/main/java/com/ning/billing/server/notifications/PushNotificationListener.java
index 0245c43..ea326e1 100644
--- a/server/src/main/java/com/ning/billing/server/notifications/PushNotificationListener.java
+++ b/server/src/main/java/com/ning/billing/server/notifications/PushNotificationListener.java
@@ -13,6 +13,7 @@
  * License for the specific language governing permissions and limitations
  * under the License.
  */
+
 package com.ning.billing.server.notifications;
 
 import java.io.IOException;
@@ -25,7 +26,6 @@ import javax.inject.Inject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.ning.billing.bus.api.BusEventWithMetadata;
 import com.ning.billing.jaxrs.json.NotificationJson;
 import com.ning.billing.notification.plugin.api.ExtBusEvent;
 import com.ning.billing.tenant.api.TenantApiException;
@@ -64,9 +64,8 @@ public class PushNotificationListener {
     }
 
     @Subscribe
-    public void triggerPushNotifications(final BusEventWithMetadata<ExtBusEvent> eventWithMetadata) {
+    public void triggerPushNotifications(final ExtBusEvent event) {
 
-        final ExtBusEvent event = eventWithMetadata.getEvent();
         final TenantContext context = contextFactory.createTenantContext(event.getTenantId());
         try {
             final List<String> callbacks = getCallbacksForTenant(context);
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 00d9b06..9d7a7e1 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,13 +19,14 @@ 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 implements CustomFieldCreationEvent {
+public class DefaultCustomFieldCreationEvent extends BusEventBase implements CustomFieldCreationEvent {
 
     private final UUID customFieldId;
     private final UUID objectId;
@@ -34,7 +35,11 @@ public class DefaultCustomFieldCreationEvent implements CustomFieldCreationEvent
     @JsonCreator
     public DefaultCustomFieldCreationEvent(@JsonProperty("customFieldId") final UUID customFieldId,
                                            @JsonProperty("objectId") final UUID objectId,
-                                           @JsonProperty("objectType") final ObjectType objectType) {
+                                           @JsonProperty("objectType") final ObjectType objectType,
+                                           @JsonProperty("searchKey1") final Long searchKey1,
+                                           @JsonProperty("searchKey2") final Long searchKey2,
+                                           @JsonProperty("userToken") final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         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 db53d0c..e446204 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,13 +19,14 @@ 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 implements CustomFieldDeletionEvent {
+public class DefaultCustomFieldDeletionEvent extends BusEventBase implements CustomFieldDeletionEvent {
 
     private final UUID customFieldId;
     private final UUID objectId;
@@ -34,7 +35,11 @@ public class DefaultCustomFieldDeletionEvent implements CustomFieldDeletionEvent
     @JsonCreator
     public DefaultCustomFieldDeletionEvent(@JsonProperty("customFieldId") final UUID customFieldId,
                                            @JsonProperty("objectId") final UUID objectId,
-                                           @JsonProperty("objectType") final ObjectType objectType) {
+                                           @JsonProperty("objectType") final ObjectType objectType,
+                                           @JsonProperty("searchKey1") final Long searchKey1,
+                                           @JsonProperty("searchKey2") final Long searchKey2,
+                                           @JsonProperty("userToken") final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         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 589a819..1edb2be 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
@@ -108,17 +108,19 @@ public class DefaultCustomFieldDao extends EntityDaoBase<CustomFieldModelDao, Cu
         BusInternalEvent customFieldEvent = null;
         switch (changeType) {
             case INSERT:
-                customFieldEvent = new DefaultCustomFieldCreationEvent(customField.getId(), customField.getObjectId(), customField.getObjectType());
+                customFieldEvent = new DefaultCustomFieldCreationEvent(customField.getId(), customField.getObjectId(), customField.getObjectType(),
+                                                                       context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken());
                 break;
             case DELETE:
-                customFieldEvent = new DefaultCustomFieldDeletionEvent(customField.getId(), customField.getObjectId(), customField.getObjectType());
+                customFieldEvent = new DefaultCustomFieldDeletionEvent(customField.getId(), customField.getObjectId(), customField.getObjectType(),
+                                                                       context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken());
                 break;
             default:
                 return;
         }
 
         try {
-            bus.postFromTransaction(customFieldEvent, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId(), entitySqlDaoWrapperFactory.getSqlDao());
+            bus.postFromTransaction(customFieldEvent, 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/events/BusEventBase.java b/util/src/main/java/com/ning/billing/util/events/BusEventBase.java
new file mode 100644
index 0000000..bb42427
--- /dev/null
+++ b/util/src/main/java/com/ning/billing/util/events/BusEventBase.java
@@ -0,0 +1,35 @@
+package com.ning.billing.util.events;
+
+import java.util.UUID;
+
+import com.ning.billing.bus.api.BusEvent;
+
+public class BusEventBase implements BusEvent {
+
+    private final Long searchKey1;
+    private final Long searchKey2;
+    private final UUID userToken;
+
+    public BusEventBase(final Long searchKey1,
+                        final Long searchKey2,
+                        final UUID userToken) {
+        this.searchKey1 = searchKey1;
+        this.searchKey2 = searchKey2;
+        this.userToken = userToken;
+    }
+
+    @Override
+    public Long getSearchKey1() {
+        return searchKey1;
+    }
+
+    @Override
+    public Long getSearchKey2() {
+        return searchKey2;
+    }
+
+    @Override
+    public UUID getUserToken() {
+        return userToken;
+    }
+}
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 df8068e..9c3be76 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,6 +19,7 @@ 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;
 
@@ -26,7 +27,7 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultControlTagCreationEvent implements ControlTagCreationInternalEvent {
+public class DefaultControlTagCreationEvent extends BusEventBase implements ControlTagCreationInternalEvent {
 
     private final UUID tagId;
     private final UUID objectId;
@@ -37,8 +38,11 @@ public class DefaultControlTagCreationEvent implements ControlTagCreationInterna
     public DefaultControlTagCreationEvent(@JsonProperty("tagId") final UUID tagId,
                                           @JsonProperty("objectId") final UUID objectId,
                                           @JsonProperty("objectType") final ObjectType objectType,
-                                          @JsonProperty("tagDefinition") final TagDefinition tagDefinition) {
-
+                                          @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
+                                          @JsonProperty("searchKey1") final Long searchKey1,
+                                          @JsonProperty("searchKey2") final Long searchKey2,
+                                          @JsonProperty("userToken") final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         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 4596866..d0ab849 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,6 +18,7 @@ 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;
 
@@ -25,14 +26,18 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultControlTagDefinitionCreationEvent implements ControlTagDefinitionCreationInternalEvent {
+public class DefaultControlTagDefinitionCreationEvent extends BusEventBase implements ControlTagDefinitionCreationInternalEvent {
 
     private final UUID tagDefinitionId;
     private final TagDefinition tagDefinition;
 
     @JsonCreator
     public DefaultControlTagDefinitionCreationEvent(@JsonProperty("tagDefinitionId") final UUID tagDefinitionId,
-                                                    @JsonProperty("tagDefinition") final TagDefinition tagDefinition) {
+                                                    @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
+                                                    @JsonProperty("searchKey1") final Long searchKey1,
+                                                    @JsonProperty("searchKey2") final Long searchKey2,
+                                                    @JsonProperty("userToken") final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         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 b1d45f8..d5ff7be 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,6 +18,7 @@ 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;
 
@@ -25,14 +26,18 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultControlTagDefinitionDeletionEvent implements ControlTagDefinitionDeletionInternalEvent {
+public class DefaultControlTagDefinitionDeletionEvent extends BusEventBase implements ControlTagDefinitionDeletionInternalEvent {
 
     private final UUID tagDefinitionId;
     private final TagDefinition tagDefinition;
 
     @JsonCreator
     public DefaultControlTagDefinitionDeletionEvent(@JsonProperty("tagDefinitionId") final UUID tagDefinitionId,
-                                                    @JsonProperty("tagDefinition") final TagDefinition tagDefinition) {
+                                                    @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
+                                                    @JsonProperty("searchKey1") final Long searchKey1,
+                                                    @JsonProperty("searchKey2") final Long searchKey2,
+                                                    @JsonProperty("userToken") final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         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 8972a9d..3c7f688 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,6 +19,7 @@ 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;
 
@@ -26,7 +27,7 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultControlTagDeletionEvent implements ControlTagDeletionInternalEvent {
+public class DefaultControlTagDeletionEvent extends BusEventBase implements ControlTagDeletionInternalEvent {
 
     private final UUID tagId;
     final UUID objectId;
@@ -37,7 +38,11 @@ public class DefaultControlTagDeletionEvent implements ControlTagDeletionInterna
     public DefaultControlTagDeletionEvent(@JsonProperty("tagId") final UUID tagId,
                                           @JsonProperty("objectId") final UUID objectId,
                                           @JsonProperty("objectType") final ObjectType objectType,
-                                          @JsonProperty("tagDefinition") final TagDefinition tagDefinition) {
+                                          @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
+                                          @JsonProperty("searchKey1") final Long searchKey1,
+                                          @JsonProperty("searchKey2") final Long searchKey2,
+                                          @JsonProperty("userToken") final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         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 9cfb6b1..68cf14d 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,6 +19,7 @@ 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;
 
@@ -26,7 +27,7 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultUserTagCreationEvent implements UserTagCreationInternalEvent {
+public class DefaultUserTagCreationEvent extends BusEventBase implements UserTagCreationInternalEvent {
 
     private final UUID tagId;
     private final UUID objectId;
@@ -37,7 +38,11 @@ public class DefaultUserTagCreationEvent implements UserTagCreationInternalEvent
     public DefaultUserTagCreationEvent(@JsonProperty("tagId") final UUID tagId,
                                        @JsonProperty("objectId") final UUID objectId,
                                        @JsonProperty("objectType") final ObjectType objectType,
-                                       @JsonProperty("tagDefinition") final TagDefinition tagDefinition) {
+                                       @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
+                                       @JsonProperty("searchKey1") final Long searchKey1,
+                                       @JsonProperty("searchKey2") final Long searchKey2,
+                                       @JsonProperty("userToken") final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         this.tagId = tagId;
         this.objectId = objectId;
         this.objectType = objectType;
diff --git a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDefinitionCreationEvent.java b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDefinitionCreationEvent.java
index f5db63d..0e2925d 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,6 +18,7 @@ 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;
 
@@ -25,14 +26,18 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultUserTagDefinitionCreationEvent implements UserTagDefinitionCreationInternalEvent {
+public class DefaultUserTagDefinitionCreationEvent extends BusEventBase implements UserTagDefinitionCreationInternalEvent {
 
     private final UUID tagDefinitionId;
     private final TagDefinition tagDefinition;
 
     @JsonCreator
     public DefaultUserTagDefinitionCreationEvent(@JsonProperty("tagDefinitionId") final UUID tagDefinitionId,
-                                                 @JsonProperty("tagDefinition") final TagDefinition tagDefinition) {
+                                                 @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
+                                                 @JsonProperty("searchKey1") final Long searchKey1,
+                                                 @JsonProperty("searchKey2") final Long searchKey2,
+                                                 @JsonProperty("userToken") final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         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 7eeeb5b..eca57ac 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,6 +18,7 @@ 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;
 
@@ -25,14 +26,18 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultUserTagDefinitionDeletionEvent implements UserTagDefinitionDeletionInternalEvent {
+public class DefaultUserTagDefinitionDeletionEvent extends BusEventBase implements UserTagDefinitionDeletionInternalEvent {
 
     private final UUID tagDefinitionId;
     private final TagDefinition tagDefinition;
 
     @JsonCreator
     public DefaultUserTagDefinitionDeletionEvent(@JsonProperty("tagDefinitionId") final UUID tagDefinitionId,
-                                                 @JsonProperty("tagDefinition") final TagDefinition tagDefinition) {
+                                                 @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
+                                                 @JsonProperty("searchKey1") final Long searchKey1,
+                                                 @JsonProperty("searchKey2") final Long searchKey2,
+                                                 @JsonProperty("userToken") final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         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 f74c53e..ac517ca 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,6 +19,7 @@ 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;
 
@@ -26,7 +27,7 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class DefaultUserTagDeletionEvent implements UserTagDeletionInternalEvent {
+public class DefaultUserTagDeletionEvent extends BusEventBase implements UserTagDeletionInternalEvent {
     private final UUID tagId;
     private final UUID objectId;
     private final ObjectType objectType;
@@ -36,7 +37,11 @@ public class DefaultUserTagDeletionEvent implements UserTagDeletionInternalEvent
     public DefaultUserTagDeletionEvent(@JsonProperty("tagId") final UUID tagId,
                                        @JsonProperty("objectId") final UUID objectId,
                                        @JsonProperty("objectType") final ObjectType objectType,
-                                       @JsonProperty("tagDefinition") final TagDefinition tagDefinition) {
+                                       @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
+                                       @JsonProperty("searchKey1") final Long searchKey1,
+                                       @JsonProperty("searchKey2") final Long searchKey2,
+                                       @JsonProperty("userToken") final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         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 809d5bf..c34ac11 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) {
-        return new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, new DefaultTagDefinition(tagDefinition, false));
+    public UserTagDefinitionCreationInternalEvent newUserTagDefinitionCreationEvent(final UUID tagDefinitionId, final TagDefinitionModelDao tagDefinition, final Long searchKey1, final Long searchKey2, final UUID userToken) {
+        return new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, new DefaultTagDefinition(tagDefinition, false), searchKey1, searchKey2, userToken);
     }
 
-    public UserTagDefinitionDeletionInternalEvent newUserTagDefinitionDeletionEvent(final UUID tagDefinitionId, final TagDefinitionModelDao tagDefinition) {
-        return new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, new DefaultTagDefinition(tagDefinition, false));
+    public UserTagDefinitionDeletionInternalEvent newUserTagDefinitionDeletionEvent(final UUID tagDefinitionId, final TagDefinitionModelDao tagDefinition, final Long searchKey1, final Long searchKey2, final UUID userToken) {
+        return new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, new DefaultTagDefinition(tagDefinition, false), searchKey1, searchKey2, userToken);
     }
 
-    public ControlTagDefinitionCreationInternalEvent newControlTagDefinitionCreationEvent(final UUID tagDefinitionId, final TagDefinitionModelDao tagDefinition) {
-        return new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, new DefaultTagDefinition(tagDefinition, true));
+    public ControlTagDefinitionCreationInternalEvent newControlTagDefinitionCreationEvent(final UUID tagDefinitionId, final TagDefinitionModelDao tagDefinition, final Long searchKey1, final Long searchKey2, final UUID userToken) {
+        return new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, new DefaultTagDefinition(tagDefinition, true), searchKey1, searchKey2, userToken);
     }
 
-    public ControlTagDefinitionDeletionInternalEvent newControlTagDefinitionDeletionEvent(final UUID tagDefinitionId, final TagDefinitionModelDao tagDefinition) {
-        return new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, new DefaultTagDefinition(tagDefinition, true));
+    public ControlTagDefinitionDeletionInternalEvent newControlTagDefinitionDeletionEvent(final UUID tagDefinitionId, final TagDefinitionModelDao tagDefinition, final Long searchKey1, final Long searchKey2, final UUID userToken) {
+        return new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, new DefaultTagDefinition(tagDefinition, true), searchKey1, searchKey2, userToken);
     }
 
-    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 UserTagCreationInternalEvent newUserTagCreationEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinitionModelDao tagDefinition, final Long searchKey1, final Long searchKey2, final UUID userToken) {
+        return new DefaultUserTagCreationEvent(tagId, objectId, objectType, new DefaultTagDefinition(tagDefinition, false), searchKey1, searchKey2, userToken);
     }
 
-    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 UserTagDeletionInternalEvent newUserTagDeletionEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinitionModelDao tagDefinition, final Long searchKey1, final Long searchKey2, final UUID userToken) {
+        return new DefaultUserTagDeletionEvent(tagId, objectId, objectType, new DefaultTagDefinition(tagDefinition, false), searchKey1, searchKey2, userToken);
     }
 
-    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 ControlTagCreationInternalEvent newControlTagCreationEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinitionModelDao tagDefinition, final Long searchKey1, final Long searchKey2, final UUID userToken) {
+        return new DefaultControlTagCreationEvent(tagId, objectId, objectType, new DefaultTagDefinition(tagDefinition, true), searchKey1, searchKey2, userToken);
     }
 
-    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));
+    public ControlTagDeletionInternalEvent newControlTagDeletionEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinitionModelDao tagDefinition, final Long searchKey1, final Long searchKey2, final UUID userToken) {
+        return new DefaultControlTagDeletionEvent(tagId, objectId, objectType, new DefaultTagDefinition(tagDefinition, true), searchKey1, searchKey2, userToken);
     }
 }
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 9ffa746..083db2b 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
@@ -111,20 +111,24 @@ public class DefaultTagDao extends EntityDaoBase<TagModelDao, Tag, TagApiExcepti
         switch (changeType) {
             case INSERT:
                 tagEvent = (isControlTag) ?
-                           tagEventBuilder.newControlTagCreationEvent(tag.getId(), tag.getObjectId(), tag.getObjectType(), tagDefinition) :
-                           tagEventBuilder.newUserTagCreationEvent(tag.getId(), tag.getObjectId(), tag.getObjectType(), tagDefinition);
+                           tagEventBuilder.newControlTagCreationEvent(tag.getId(), tag.getObjectId(), tag.getObjectType(),tagDefinition,
+                                                                      context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken()) :
+                           tagEventBuilder.newUserTagCreationEvent(tag.getId(), tag.getObjectId(), tag.getObjectType(), tagDefinition,
+                                                                   context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken());
                 break;
             case DELETE:
                 tagEvent = (isControlTag) ?
-                           tagEventBuilder.newControlTagDeletionEvent(tag.getId(), tag.getObjectId(), tag.getObjectType(), tagDefinition) :
-                           tagEventBuilder.newUserTagDeletionEvent(tag.getId(), tag.getObjectId(), tag.getObjectType(), tagDefinition);
+                           tagEventBuilder.newControlTagDeletionEvent(tag.getId(), tag.getObjectId(), tag.getObjectType(), tagDefinition,
+                                                                      context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken()) :
+                           tagEventBuilder.newUserTagDeletionEvent(tag.getId(), tag.getObjectId(), tag.getObjectType(), tagDefinition,
+                                                                   context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken());
                 break;
             default:
                 return;
         }
 
         try {
-            bus.postFromTransaction(tagEvent, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId(), entitySqlDaoWrapperFactory.getSqlDao());
+            bus.postFromTransaction(tagEvent, 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 5f20e0f..3f60df3 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
@@ -169,12 +169,14 @@ public class DefaultTagDefinitionDao extends EntityDaoBase<TagDefinitionModelDao
                     final boolean isControlTag = TagModelDaoHelper.isControlTag(tagDefinition.getName());
                     final TagDefinitionInternalEvent tagDefinitionEvent;
                     if (isControlTag) {
-                        tagDefinitionEvent = tagEventBuilder.newControlTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition);
+                        tagDefinitionEvent = tagEventBuilder.newControlTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition,
+                                                                                                  context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken());
                     } else {
-                        tagDefinitionEvent = tagEventBuilder.newUserTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition);
+                        tagDefinitionEvent = tagEventBuilder.newUserTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition,
+                                                                                               context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken());
                     }
                     try {
-                        bus.postFromTransaction(tagDefinitionEvent, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId(), entitySqlDaoWrapperFactory.getSqlDao());
+                        bus.postFromTransaction(tagDefinitionEvent, entitySqlDaoWrapperFactory.getSqlDao());
                     } catch (PersistentBus.EventBusException e) {
                         log.warn("Failed to post tag definition creation event for tag " + tagDefinition.getId(), e);
                     }
@@ -235,21 +237,25 @@ public class DefaultTagDefinitionDao extends EntityDaoBase<TagDefinitionModelDao
         switch (changeType) {
             case INSERT:
                 tagDefinitionEvent = (isControlTag) ?
-                                     tagEventBuilder.newControlTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition) :
-                                     tagEventBuilder.newUserTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition);
+                                     tagEventBuilder.newControlTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition,
+                                                                                          context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken()) :
+                                     tagEventBuilder.newUserTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition,
+                                             context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken());
 
                 break;
             case DELETE:
                 tagDefinitionEvent = (isControlTag) ?
-                                     tagEventBuilder.newControlTagDefinitionDeletionEvent(tagDefinition.getId(), tagDefinition) :
-                                     tagEventBuilder.newUserTagDefinitionDeletionEvent(tagDefinition.getId(), tagDefinition);
+                                     tagEventBuilder.newControlTagDefinitionDeletionEvent(tagDefinition.getId(), tagDefinition,
+                                                                                          context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken()) :
+                                     tagEventBuilder.newUserTagDefinitionDeletionEvent(tagDefinition.getId(), tagDefinition,
+                                                                                       context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken());
                 break;
             default:
                 return;
         }
 
         try {
-            bus.postFromTransaction(tagDefinitionEvent, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId(), entitySqlDaoWrapperFactory.getSqlDao());
+            bus.postFromTransaction(tagDefinitionEvent, 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 7b52ccb..890bdab 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
@@ -21,7 +21,6 @@ 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;
@@ -31,7 +30,7 @@ import com.ning.billing.util.events.NullInvoiceInternalEvent;
 import com.ning.billing.util.events.PaymentErrorInternalEvent;
 import com.ning.billing.util.events.PaymentInfoInternalEvent;
 
-public abstract class CompletionUserRequestBase implements CompletionUserRequest {
+public class CompletionUserRequestBase implements CompletionUserRequest {
 
     private static final long NANO_TO_MILLI_SEC = (1000L * 1000L);
 
@@ -79,6 +78,7 @@ public abstract class CompletionUserRequestBase implements CompletionUserRequest
         }
     }
 
+
     private long currentTimeMillis() {
         return System.nanoTime() / NANO_TO_MILLI_SEC;
     }
@@ -88,72 +88,69 @@ public abstract class CompletionUserRequestBase implements CompletionUserRequest
     }
 
     @Override
-    public void onBusEvent(final BusEventWithMetadata<BusInternalEvent> busEventWithMetadata) {
+    public void onBusEvent(final BusInternalEvent curEvent) {
 
-        final BusInternalEvent curEvent = busEventWithMetadata.getEvent();
         // Check if this is for us..
-        if (busEventWithMetadata.getUserToken() == null ||
-            !busEventWithMetadata.getUserToken().equals(userToken)) {
+        if (curEvent.getUserToken() == null ||
+            !curEvent.getUserToken().equals(userToken)) {
             return;
         }
         events.add(curEvent);
 
         switch (curEvent.getBusEventType()) {
             case ACCOUNT_CREATE:
-                onAccountCreation((BusEventWithMetadata<AccountCreationInternalEvent>) curEvent);
+                onAccountCreation((AccountCreationInternalEvent) curEvent);
                 break;
             case ACCOUNT_CHANGE:
-                onAccountChange((BusEventWithMetadata<AccountChangeInternalEvent>) curEvent);
+                onAccountChange((AccountChangeInternalEvent) curEvent);
                 break;
             case SUBSCRIPTION_TRANSITION:
-                onSubscriptionTransition((BusEventWithMetadata<EffectiveSubscriptionInternalEvent>) curEvent);
+                onSubscriptionTransition((EffectiveSubscriptionInternalEvent) curEvent);
                 break;
             case INVOICE_EMPTY:
-                onEmptyInvoice((BusEventWithMetadata<NullInvoiceInternalEvent>) curEvent);
+                onEmptyInvoice((NullInvoiceInternalEvent) curEvent);
                 break;
             case INVOICE_CREATION:
-                onInvoiceCreation((BusEventWithMetadata<InvoiceCreationInternalEvent>) curEvent);
+                onInvoiceCreation((InvoiceCreationInternalEvent) curEvent);
                 break;
             case PAYMENT_INFO:
-                onPaymentInfo((BusEventWithMetadata<PaymentInfoInternalEvent>) curEvent);
+                onPaymentInfo((PaymentInfoInternalEvent) curEvent);
                 break;
             case PAYMENT_ERROR:
-                onPaymentError((BusEventWithMetadata<PaymentErrorInternalEvent>) curEvent);
+                onPaymentError((PaymentErrorInternalEvent) curEvent);
                 break;
             default:
                 throw new RuntimeException("Unexpected event type " + curEvent.getBusEventType());
         }
     }
 
-    /*
-     *
-     * Default no-op implementation so as to not have to implement all callbacks
-     */
+
     @Override
-    public void onAccountCreation(final BusEventWithMetadata<AccountCreationInternalEvent> curEvent) {
+    public void onAccountCreation(final AccountCreationInternalEvent curEvent) {
     }
 
     @Override
-    public void onAccountChange(final BusEventWithMetadata<AccountChangeInternalEvent> curEvent) {
+    public void onAccountChange(final AccountChangeInternalEvent curEvent) {
     }
 
     @Override
-    public void onSubscriptionTransition(final BusEventWithMetadata<EffectiveSubscriptionInternalEvent> curEventEffective) {
+    public void onSubscriptionTransition(final EffectiveSubscriptionInternalEvent curEventEffective) {
     }
 
     @Override
-    public void onEmptyInvoice(final BusEventWithMetadata<NullInvoiceInternalEvent> curEvent) {
+    public void onInvoiceCreation(final InvoiceCreationInternalEvent curEvent) {
     }
 
     @Override
-    public void onInvoiceCreation(final BusEventWithMetadata<InvoiceCreationInternalEvent> curEvent) {
+    public void onEmptyInvoice(final NullInvoiceInternalEvent curEvent) {
     }
 
     @Override
-    public void onPaymentInfo(final BusEventWithMetadata<PaymentInfoInternalEvent> curEvent) {
+    public void onPaymentInfo(final PaymentInfoInternalEvent curEvent) {
     }
 
     @Override
-    public void onPaymentError(final BusEventWithMetadata<PaymentErrorInternalEvent> curEvent) {
+    public void onPaymentError(final 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 fe87c72..1d60df2 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
@@ -17,7 +17,6 @@
 package com.ning.billing.util.userrequest;
 
 
-import com.ning.billing.bus.api.BusEventWithMetadata;
 import com.ning.billing.util.events.BusInternalEvent;
 
 
@@ -25,5 +24,5 @@ public interface CompletionUserRequestNotifier {
 
     public void notifyForCompletion();
 
-    public void onBusEvent(final BusEventWithMetadata<BusInternalEvent> busEventWithMetadata);
+    public void onBusEvent(final BusInternalEvent event);
 }
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 1c723e7..eb3ec31 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
@@ -13,12 +13,12 @@
  * License for the specific language governing permissions and limitations
  * under the License.
  */
+
 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;
@@ -32,17 +32,17 @@ public interface CompletionUserRequestWaiter {
 
     public List<BusInternalEvent> waitForCompletion(final long timeoutMilliSec) throws InterruptedException, TimeoutException;
 
-    public void onAccountCreation(final BusEventWithMetadata<AccountCreationInternalEvent> curEvent);
+    public void onAccountCreation(final AccountCreationInternalEvent curEvent);
 
-    public void onAccountChange(final BusEventWithMetadata<AccountChangeInternalEvent> curEvent);
+    public void onAccountChange(final AccountChangeInternalEvent curEvent);
 
-    public void onSubscriptionTransition(final BusEventWithMetadata<EffectiveSubscriptionInternalEvent> curEventEffective);
+    public void onSubscriptionTransition(final EffectiveSubscriptionInternalEvent curEventEffective);
 
-    public void onInvoiceCreation(final BusEventWithMetadata<InvoiceCreationInternalEvent> curEvent);
+    public void onInvoiceCreation(final InvoiceCreationInternalEvent curEvent);
 
-    public void onEmptyInvoice(final BusEventWithMetadata<NullInvoiceInternalEvent> curEvent);
+    public void onEmptyInvoice(final NullInvoiceInternalEvent curEvent);
 
-    public void onPaymentInfo(final BusEventWithMetadata<PaymentInfoInternalEvent> curEvent);
+    public void onPaymentInfo(final PaymentInfoInternalEvent curEvent);
 
-    public void onPaymentError(final BusEventWithMetadata<PaymentErrorInternalEvent> curEvent);
+    public void onPaymentError(final PaymentErrorInternalEvent curEvent);
 }
diff --git a/util/src/test/java/com/ning/billing/api/TestApiListener.java b/util/src/test/java/com/ning/billing/api/TestApiListener.java
index 695a351..aa92992 100644
--- a/util/src/test/java/com/ning/billing/api/TestApiListener.java
+++ b/util/src/test/java/com/ning/billing/api/TestApiListener.java
@@ -26,7 +26,6 @@ import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.ning.billing.bus.api.BusEventWithMetadata;
 import com.ning.billing.util.events.CustomFieldEvent;
 import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 import com.ning.billing.util.events.InvoiceAdjustmentInternalEvent;
@@ -89,16 +88,15 @@ public class TestApiListener {
     }
 
     @Subscribe
-    public void handleRepairEntitlementEvents(final BusEventWithMetadata<RepairEntitlementInternalEvent> eventWithMetadata) {
-        log.info(String.format("Got RepairEntitlementEvent event %s", eventWithMetadata.toString()));
+    public void handleRepairEntitlementEvents(final RepairEntitlementInternalEvent event) {
+        log.info(String.format("Got RepairEntitlementEvent event %s", event.toString()));
         assertEqualsNicely(NextEvent.REPAIR_BUNDLE);
         notifyIfStackEmpty();
     }
 
     @Subscribe
-    public void handleEntitlementEvents(final BusEventWithMetadata<EffectiveSubscriptionInternalEvent> eventWithMetadata) {
+    public void handleEntitlementEvents(final EffectiveSubscriptionInternalEvent eventEffective) {
 
-        final EffectiveSubscriptionInternalEvent eventEffective = eventWithMetadata.getEvent();
         log.info(String.format("Got subscription event %s", eventEffective.toString()));
         switch (eventEffective.getTransitionType()) {
             case TRANSFER:
@@ -143,14 +141,14 @@ public class TestApiListener {
     }
 
     @Subscribe
-    public synchronized void processTagEvent(final BusEventWithMetadata<TagInternalEvent> event) {
+    public synchronized void processTagEvent(final TagInternalEvent event) {
         log.info(String.format("Got TagInternalEvent event %s", event.toString()));
         assertEqualsNicely(NextEvent.TAG);
         notifyIfStackEmpty();
     }
 
     @Subscribe
-    public synchronized void processCustomFieldEvent(final BusEventWithMetadata<CustomFieldEvent> event) {
+    public synchronized void processCustomFieldEvent(final CustomFieldEvent event) {
         log.info(String.format("Got CustomFieldEvent event %s", event.toString()));
         assertEqualsNicely(NextEvent.CUSTOM_FIELD);
         notifyIfStackEmpty();
@@ -158,35 +156,35 @@ public class TestApiListener {
 
 
     @Subscribe
-    public synchronized void processTagDefinitonEvent(final BusEventWithMetadata<TagDefinitionInternalEvent> event) {
+    public synchronized void processTagDefinitonEvent(final TagDefinitionInternalEvent event) {
         log.info(String.format("Got TagDefinitionInternalEvent event %s", event.toString()));
         assertEqualsNicely(NextEvent.TAG_DEFINITION);
         notifyIfStackEmpty();
     }
 
     @Subscribe
-    public void handleInvoiceEvents(final BusEventWithMetadata<InvoiceCreationInternalEvent> event) {
+    public void handleInvoiceEvents(final InvoiceCreationInternalEvent event) {
         log.info(String.format("Got Invoice event %s", event.toString()));
         assertEqualsNicely(NextEvent.INVOICE);
         notifyIfStackEmpty();
     }
 
     @Subscribe
-    public void handleInvoiceAdjustmentEvents(final BusEventWithMetadata<InvoiceAdjustmentInternalEvent> event) {
+    public void handleInvoiceAdjustmentEvents(final InvoiceAdjustmentInternalEvent event) {
         log.info(String.format("Got Invoice adjustment event %s", event.toString()));
         assertEqualsNicely(NextEvent.INVOICE_ADJUSTMENT);
         notifyIfStackEmpty();
     }
 
     @Subscribe
-    public void handlePaymentEvents(final BusEventWithMetadata<PaymentInfoInternalEvent> event) {
+    public void handlePaymentEvents(final PaymentInfoInternalEvent event) {
         log.info(String.format("Got PaymentInfo event %s", event.toString()));
         assertEqualsNicely(NextEvent.PAYMENT);
         notifyIfStackEmpty();
     }
 
     @Subscribe
-    public void handlePaymentErrorEvents(final BusEventWithMetadata<PaymentErrorInternalEvent> event) {
+    public void handlePaymentErrorEvents(final PaymentErrorInternalEvent event) {
         log.info(String.format("Got PaymentError event %s", event.toString()));
         assertEqualsNicely(NextEvent.PAYMENT_ERROR);
         notifyIfStackEmpty();
diff --git a/util/src/test/java/com/ning/billing/mock/MockEffectiveSubscriptionEvent.java b/util/src/test/java/com/ning/billing/mock/MockEffectiveSubscriptionEvent.java
index 4641e70..e7c1dae 100644
--- a/util/src/test/java/com/ning/billing/mock/MockEffectiveSubscriptionEvent.java
+++ b/util/src/test/java/com/ning/billing/mock/MockEffectiveSubscriptionEvent.java
@@ -22,13 +22,14 @@ import org.joda.time.DateTime;
 
 import com.ning.billing.entitlement.api.SubscriptionTransitionType;
 import com.ning.billing.entitlement.api.user.SubscriptionState;
+import com.ning.billing.util.events.BusEventBase;
 import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class MockEffectiveSubscriptionEvent implements EffectiveSubscriptionInternalEvent {
+public class MockEffectiveSubscriptionEvent extends BusEventBase implements EffectiveSubscriptionInternalEvent {
 
     private final Long totalOrdering;
     private final UUID subscriptionId;
@@ -65,11 +66,13 @@ public class MockEffectiveSubscriptionEvent implements EffectiveSubscriptionInte
                                           @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) {
-        super();
+                                          @JsonProperty("startDate") final DateTime startDate,
+                                          @JsonProperty("searchKey1") final Long searchKey1,
+                                          @JsonProperty("searchKey2") final Long searchKey2,
+                                          @JsonProperty("userToken") final UUID userToken) {
+        super(searchKey1, searchKey2, userToken);
         this.eventId = eventId;
         this.subscriptionId = subscriptionId;
         this.bundleId = bundleId;
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 2e247bb..712d967 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
@@ -34,14 +34,14 @@ public class TestDefaultCustomFieldCreationEvent {
         final UUID objectId = UUID.randomUUID();
         final ObjectType objectType = ObjectType.ACCOUNT_EMAIL;
 
-        final DefaultCustomFieldCreationEvent event = new DefaultCustomFieldCreationEvent(customFieldId, objectId, objectType);
+        final DefaultCustomFieldCreationEvent event = new DefaultCustomFieldCreationEvent(customFieldId, objectId, objectType, 1L, 2L, UUID.randomUUID());
         Assert.assertEquals(event.getBusEventType(), BusInternalEventType.CUSTOM_FIELD_CREATION);
 
         Assert.assertEquals(event.getObjectId(), objectId);
         Assert.assertEquals(event.getObjectType(), objectType);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultCustomFieldCreationEvent(customFieldId, objectId, objectType));
+        Assert.assertEquals(event, new DefaultCustomFieldCreationEvent(customFieldId, objectId, objectType, 1L, 2L, UUID.randomUUID()));
     }
 
     @Test(groups = "fast")
@@ -53,7 +53,7 @@ public class TestDefaultCustomFieldCreationEvent {
         final UUID objectId = UUID.randomUUID();
         final ObjectType objectType = ObjectType.ACCOUNT_EMAIL;
 
-        final DefaultCustomFieldCreationEvent event = new DefaultCustomFieldCreationEvent(customFieldId, objectId, objectType);
+        final DefaultCustomFieldCreationEvent event = new DefaultCustomFieldCreationEvent(customFieldId, objectId, objectType, 1L, 2L, UUID.randomUUID());
 
         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 b8f1a4d..bb254c8 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,14 +35,14 @@ public class TestDefaultCustomFieldDeletionEvent {
         final ObjectType objectType = ObjectType.ACCOUNT_EMAIL;
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultCustomFieldDeletionEvent event = new DefaultCustomFieldDeletionEvent(customFieldId, objectId, objectType);
+        final DefaultCustomFieldDeletionEvent event = new DefaultCustomFieldDeletionEvent(customFieldId, objectId, objectType, 1L, 2L, UUID.randomUUID());
         Assert.assertEquals(event.getBusEventType(), BusInternalEventType.CUSTOM_FIELD_DELETION);
 
         Assert.assertEquals(event.getObjectId(), objectId);
         Assert.assertEquals(event.getObjectType(), objectType);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultCustomFieldDeletionEvent(customFieldId, objectId, objectType));
+        Assert.assertEquals(event, new DefaultCustomFieldDeletionEvent(customFieldId, objectId, objectType, 1L, 2L, UUID.randomUUID()));
     }
 
     @Test(groups = "fast")
@@ -55,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);
+        final DefaultCustomFieldDeletionEvent event = new DefaultCustomFieldDeletionEvent(customFieldId, objectId, objectType, 1L, 2L, UUID.randomUUID());
 
         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 079bfea..feeb9df 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);
+        final DefaultControlTagCreationEvent event = new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID());
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusInternalEventType.CONTROL_TAG_CREATION);
 
         Assert.assertEquals(event.getTagId(), tagId);
@@ -54,9 +54,9 @@ public class TestDefaultControlTagCreationEvent extends UtilTestSuiteNoDB {
         Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition));
+        Assert.assertEquals(event, new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID()));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition)));
+        Assert.assertTrue(event.equals(new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID())));
     }
 
     @Test(groups = "fast")
@@ -73,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);
+        final DefaultControlTagCreationEvent event = new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID());
 
         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 626b74d..92c3f59 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);
+        final DefaultControlTagDefinitionCreationEvent event = new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID());
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusInternalEventType.CONTROL_TAGDEFINITION_CREATION);
 
         Assert.assertEquals(event.getTagDefinitionId(), tagDefinitionId);
@@ -48,9 +48,9 @@ public class TestDefaultControlTagDefinitionCreationEvent extends UtilTestSuiteN
         Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition));
+        Assert.assertEquals(event, new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID()));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition)));
+        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID())));
     }
 
     @Test(groups = "fast")
@@ -64,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);
+        final DefaultControlTagDefinitionCreationEvent event = new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID());
 
         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 bd68dce..59e6cb6 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);
+        final DefaultControlTagDefinitionDeletionEvent event = new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID());
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusInternalEventType.CONTROL_TAGDEFINITION_DELETION);
 
         Assert.assertEquals(event.getTagDefinitionId(), tagDefinitionId);
@@ -48,9 +48,9 @@ public class TestDefaultControlTagDefinitionDeletionEvent extends UtilTestSuiteN
         Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition));
+        Assert.assertEquals(event, new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID()));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition)));
+        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID())));
     }
 
     @Test(groups = "fast")
@@ -64,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);
+        final DefaultControlTagDefinitionDeletionEvent event = new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID());
 
         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 1bed506..d5df5b9 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);
+        final DefaultControlTagDeletionEvent event = new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID());
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusInternalEventType.CONTROL_TAG_DELETION);
 
         Assert.assertEquals(event.getTagId(), tagId);
@@ -54,9 +54,9 @@ public class TestDefaultControlTagDeletionEvent extends UtilTestSuiteNoDB {
         Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition));
+        Assert.assertEquals(event, new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID()));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition)));
+        Assert.assertTrue(event.equals(new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID())));
     }
 
     @Test(groups = "fast")
@@ -73,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);
+        final DefaultControlTagDeletionEvent event = new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID());
 
         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 d3e3cc7..8f7168c 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);
+        final DefaultUserTagCreationEvent event = new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID());
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusInternalEventType.USER_TAG_CREATION);
 
         Assert.assertEquals(event.getTagId(), tagId);
@@ -54,9 +54,9 @@ public class TestDefaultUserTagCreationEvent extends UtilTestSuiteNoDB {
         Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition));
+        Assert.assertEquals(event, new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID()));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition)));
+        Assert.assertTrue(event.equals(new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID())));
     }
 
     @Test(groups = "fast")
@@ -73,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);
+        final DefaultUserTagCreationEvent event = new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID());
 
         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 f084a75..30f0cd3 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,8 @@ 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);
+        final DefaultUserTagDefinitionCreationEvent event = new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition,
+                                                                                                      1L, 2L, UUID.randomUUID());
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusInternalEventType.USER_TAGDEFINITION_CREATION);
 
         Assert.assertEquals(event.getTagDefinitionId(), tagDefinitionId);
@@ -48,9 +49,9 @@ public class TestDefaultUserTagDefinitionCreationEvent extends UtilTestSuiteNoDB
         Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition));
+        Assert.assertEquals(event, new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID()));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition)));
+        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID())));
     }
 
     @Test(groups = "fast")
@@ -64,7 +65,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);
+        final DefaultUserTagDefinitionCreationEvent event = new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID());
 
         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 efc0e6e..db5fe49 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
@@ -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);
+        final DefaultUserTagDefinitionDeletionEvent event = new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID());
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusInternalEventType.USER_TAGDEFINITION_DELETION);
 
         Assert.assertEquals(event.getTagDefinitionId(), tagDefinitionId);
@@ -48,9 +48,9 @@ public class TestDefaultUserTagDefinitionDeletionEvent extends UtilTestSuiteNoDB
         Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition));
+        Assert.assertEquals(event, new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID()));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition)));
+        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID())));
     }
 
     @Test(groups = "fast")
@@ -64,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);
+        final DefaultUserTagDefinitionDeletionEvent event = new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID());
 
         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 3f801a2..af55b6f 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);
+        final DefaultUserTagDeletionEvent event = new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID());
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusInternalEventType.USER_TAG_DELETION);
 
         Assert.assertEquals(event.getTagId(), tagId);
@@ -54,9 +54,9 @@ public class TestDefaultUserTagDeletionEvent extends UtilTestSuiteNoDB
         Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition));
+        Assert.assertEquals(event, new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID()));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition)));
+        Assert.assertTrue(event.equals(new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID())));
     }
 
     @Test(groups = "fast")
@@ -73,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);
+        final DefaultUserTagDeletionEvent event = new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID());
 
         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 5f150da..398b3e0 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
@@ -49,12 +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));
+        final TagDefinitionInternalEvent event = tagEventBuilder.newUserTagDefinitionCreationEvent(tagDefinitionId, new TagDefinitionModelDao(tagDefinition), 1L, 2L, UUID.randomUUID());
         Assert.assertTrue(event instanceof UserTagDefinitionCreationInternalEvent);
 
-        Assert.assertEquals(event, new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition));
+        Assert.assertEquals(event, new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID()));
 
-        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition)));
+        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID())));
 
         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));
+        final TagDefinitionInternalEvent event = tagEventBuilder.newUserTagDefinitionDeletionEvent(tagDefinitionId, new TagDefinitionModelDao(tagDefinition), 1L, 2L, UUID.randomUUID());
         Assert.assertTrue(event instanceof UserTagDefinitionDeletionInternalEvent);
 
-        Assert.assertEquals(event, new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition));
-        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition)));
+        Assert.assertEquals(event, new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID()));
+        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID())));
 
         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));
+        final TagDefinitionInternalEvent event = tagEventBuilder.newControlTagDefinitionCreationEvent(tagDefinitionId, new TagDefinitionModelDao(tagDefinition), 1L, 2L, UUID.randomUUID());
         Assert.assertTrue(event instanceof ControlTagDefinitionCreationInternalEvent);
 
-        Assert.assertEquals(event, new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition));
-        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition)));
+        Assert.assertEquals(event, new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID()));
+        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID())));
 
         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));
+        final TagDefinitionInternalEvent event = tagEventBuilder.newControlTagDefinitionDeletionEvent(tagDefinitionId, new TagDefinitionModelDao(tagDefinition), 1L, 2L, UUID.randomUUID());
         Assert.assertTrue(event instanceof ControlTagDefinitionDeletionInternalEvent);
 
-        Assert.assertEquals(event, new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition));
-        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition)));
+        Assert.assertEquals(event, new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID()));
+        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, 1L, 2L, UUID.randomUUID())));
 
         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));
+        final TagInternalEvent event = tagEventBuilder.newUserTagCreationEvent(tagId, objectId, objectType, new TagDefinitionModelDao(tagDefinition), 1L, 2L, UUID.randomUUID());
         Assert.assertTrue(event instanceof UserTagCreationInternalEvent);
 
-        Assert.assertEquals(event, new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition));
-        Assert.assertTrue(event.equals(new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition)));
+        Assert.assertEquals(event, new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID()));
+        Assert.assertTrue(event.equals(new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID())));
 
         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));
+        final TagInternalEvent event = tagEventBuilder.newUserTagDeletionEvent(tagId, objectId, objectType, new TagDefinitionModelDao(tagDefinition), 1L, 2L, UUID.randomUUID());
         Assert.assertTrue(event instanceof UserTagDeletionInternalEvent);
 
-        Assert.assertEquals(event, new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition));
-        Assert.assertTrue(event.equals(new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition)));
+        Assert.assertEquals(event, new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID()));
+        Assert.assertTrue(event.equals(new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID())));
 
         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));
+        final TagInternalEvent event = tagEventBuilder.newControlTagCreationEvent(tagId, objectId, objectType, new TagDefinitionModelDao(tagDefinition), 1L, 2L, UUID.randomUUID());
         Assert.assertTrue(event instanceof ControlTagCreationInternalEvent);
 
-        Assert.assertEquals(event, new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition));
-        Assert.assertTrue(event.equals(new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition)));
+        Assert.assertEquals(event, new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID()));
+        Assert.assertTrue(event.equals(new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID())));
 
         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));
+        final TagInternalEvent event = tagEventBuilder.newControlTagDeletionEvent(tagId, objectId, objectType, new TagDefinitionModelDao(tagDefinition), 1L, 2L, UUID.randomUUID());
         Assert.assertTrue(event instanceof ControlTagDeletionInternalEvent);
 
-        Assert.assertEquals(event, new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition));
-        Assert.assertTrue(event.equals(new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition)));
+        Assert.assertEquals(event, new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID()));
+        Assert.assertTrue(event.equals(new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, 1L, 2L, UUID.randomUUID())));
 
         verifyTagEvent(tagId, objectId, objectType, tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
     }
diff --git a/util/src/test/java/com/ning/billing/util/tag/dao/TestDefaultTagDefinitionDao.java b/util/src/test/java/com/ning/billing/util/tag/dao/TestDefaultTagDefinitionDao.java
index 29f83e4..d750dd1 100644
--- a/util/src/test/java/com/ning/billing/util/tag/dao/TestDefaultTagDefinitionDao.java
+++ b/util/src/test/java/com/ning/billing/util/tag/dao/TestDefaultTagDefinitionDao.java
@@ -27,7 +27,6 @@ import org.testng.annotations.Test;
 
 import com.ning.billing.api.TestApiListener;
 import com.ning.billing.api.TestApiListener.NextEvent;
-import com.ning.billing.bus.api.BusEventWithMetadata;
 import com.ning.billing.util.UtilTestSuiteWithEmbeddedDB;
 import com.ning.billing.util.events.BusInternalEvent;
 import com.ning.billing.util.events.TagDefinitionInternalEvent;
@@ -107,15 +106,13 @@ public class TestDefaultTagDefinitionDao extends UtilTestSuiteWithEmbeddedDB {
         private final List<TagDefinitionInternalEvent> tagDefinitionEvents = new ArrayList<TagDefinitionInternalEvent>();
 
         @Subscribe
-        public synchronized void processEvent(final BusEventWithMetadata<BusInternalEvent> eventWithMetadata) {
-            final BusInternalEvent event = eventWithMetadata.getEvent();
+        public synchronized void processEvent(final BusInternalEvent event) {
             events.add(event);
         }
 
         @Subscribe
-        public synchronized void processTagDefinitionEvent(final BusEventWithMetadata<TagDefinitionInternalEvent> eventWithMetadata) {
-            final TagDefinitionInternalEvent tagDefinitionEvent = eventWithMetadata.getEvent();
-            tagDefinitionEvents.add(tagDefinitionEvent);
+        public synchronized void processTagDefinitionEvent(final TagDefinitionInternalEvent event) {
+            tagDefinitionEvents.add(event);
         }
 
         public List<BusInternalEvent> getEvents() {