killbill-memoizeit

Changes

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

api/src/main/java/com/ning/billing/payment/api/PaymentEvent.java 20(+0 -20)

api/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestWaiter.java 45(+0 -45)

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 db97638..59bcb78 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
@@ -24,13 +24,14 @@ import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.ChangedField;
 import com.ning.billing.account.api.DefaultChangedField;
 import com.ning.billing.util.events.AccountChangeInternalEvent;
+import com.ning.billing.util.events.DefaultBusInternalEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 
-public class DefaultAccountChangeEvent implements AccountChangeInternalEvent {
+public class DefaultAccountChangeEvent extends DefaultBusInternalEvent implements AccountChangeInternalEvent {
 
     private final UUID userToken;
     private final List<ChangedField> changedFields;
@@ -39,13 +40,18 @@ public class DefaultAccountChangeEvent implements AccountChangeInternalEvent {
     @JsonCreator
     public DefaultAccountChangeEvent(@JsonProperty("userToken") final UUID userToken,
                                      @JsonProperty("changeFields") final List<ChangedField> changedFields,
-                                     @JsonProperty("accountId") final UUID accountId) {
+                                     @JsonProperty("accountId") final UUID accountId,
+                                     @JsonProperty("accountRecordId") final Long accountRecordId,
+                                     @JsonProperty("tenantRecordId") final Long tenantRecordId) {
+        super(userToken, accountRecordId, tenantRecordId);
         this.userToken = userToken;
         this.accountId = accountId;
         this.changedFields = changedFields;
     }
 
-    public DefaultAccountChangeEvent(final UUID id, final UUID userToken, final Account oldData, final Account newData) {
+    public DefaultAccountChangeEvent(final UUID id, final UUID userToken, final Account oldData, final Account newData,
+            final Long accountRecordId, final Long tenantRecordId) {
+        super(userToken, accountRecordId, tenantRecordId);
         this.accountId = id;
         this.userToken = userToken;
         this.changedFields = calculateChangedFields(oldData, newData);
@@ -181,4 +187,17 @@ public class DefaultAccountChangeEvent implements AccountChangeInternalEvent {
             inputList.add(new DefaultChangedField(key, oldData, newData));
         }
     }
+
+    @Override
+    public Long getTenantRecordId() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Long getAccountRecordId() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
 }
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 101ba6c..eae8770 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
@@ -26,30 +26,32 @@ import com.ning.billing.account.api.BillCycleDay;
 import com.ning.billing.account.api.DefaultBillCycleDay;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.util.events.AccountCreationInternalEvent;
+import com.ning.billing.util.events.DefaultBusInternalEvent;
 
 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 DefaultBusInternalEvent implements AccountCreationInternalEvent {
 
-    private final UUID userToken;
     private final UUID id;
     private final AccountData data;
 
     @JsonCreator
     public DefaultAccountCreationEvent(@JsonProperty("data") final DefaultAccountData data,
                                        @JsonProperty("userToken") final UUID userToken,
-                                       @JsonProperty("id") final UUID id) {
+                                       @JsonProperty("id") final UUID id,
+                                       @JsonProperty("accountRecordId") final Long accountRecordId,
+                                       @JsonProperty("tenantRecordId") final Long tenantRecordId) {
+        super(userToken, accountRecordId, tenantRecordId);
         this.id = id;
-        this.userToken = userToken;
         this.data = data;
     }
 
-    public DefaultAccountCreationEvent(final Account data, final UUID userToken) {
+    public DefaultAccountCreationEvent(final Account data, final UUID userToken, final Long accountRecordId, final Long tenantRecordId) {
+        super(userToken, accountRecordId, tenantRecordId);
         this.id = data.getId();
         this.data = new DefaultAccountData(data);
-        this.userToken = userToken;
     }
 
     @JsonIgnore
@@ -59,11 +61,6 @@ public class DefaultAccountCreationEvent implements AccountCreationInternalEvent
     }
 
     @Override
-    public UUID getUserToken() {
-        return userToken;
-    }
-
-    @Override
     public UUID getId() {
         return id;
     }
@@ -80,8 +77,6 @@ public class DefaultAccountCreationEvent implements AccountCreationInternalEvent
         int result = 1;
         result = prime * result + ((data == null) ? 0 : data.hashCode());
         result = prime * result + ((id == null) ? 0 : id.hashCode());
-        result = prime * result
-                + ((userToken == null) ? 0 : userToken.hashCode());
         return result;
     }
 
@@ -111,13 +106,6 @@ public class DefaultAccountCreationEvent implements AccountCreationInternalEvent
         } else if (!id.equals(other.id)) {
             return false;
         }
-        if (userToken == null) {
-            if (other.userToken != null) {
-                return false;
-            }
-        } else if (!userToken.equals(other.userToken)) {
-            return false;
-        }
         return true;
     }
 
diff --git a/account/src/main/java/com/ning/billing/account/dao/AuditedAccountDao.java b/account/src/main/java/com/ning/billing/account/dao/AuditedAccountDao.java
index 5df6129..b441c78 100644
--- a/account/src/main/java/com/ning/billing/account/dao/AuditedAccountDao.java
+++ b/account/src/main/java/com/ning/billing/account/dao/AuditedAccountDao.java
@@ -32,10 +32,8 @@ import com.ning.billing.account.api.AccountApiException;
 import com.ning.billing.account.api.user.DefaultAccountChangeEvent;
 import com.ning.billing.account.api.user.DefaultAccountCreationEvent;
 import com.ning.billing.util.ChangeType;
-import com.ning.billing.util.callcontext.InternalCallContextFactory;
-import com.ning.billing.util.svcsapi.bus.Bus;
-import com.ning.billing.util.svcsapi.bus.Bus.EventBusException;
 import com.ning.billing.util.callcontext.InternalCallContext;
+import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.dao.EntityAudit;
 import com.ning.billing.util.dao.EntityHistory;
@@ -43,6 +41,8 @@ import com.ning.billing.util.dao.TableName;
 import com.ning.billing.util.entity.EntityPersistenceException;
 import com.ning.billing.util.events.AccountChangeInternalEvent;
 import com.ning.billing.util.events.AccountCreationInternalEvent;
+import com.ning.billing.util.svcsapi.bus.Bus;
+import com.ning.billing.util.svcsapi.bus.Bus.EventBusException;
 
 import com.google.inject.Inject;
 
@@ -116,7 +116,10 @@ public class AuditedAccountDao implements AccountDao {
                     final EntityAudit audit = new EntityAudit(TableName.ACCOUNT_HISTORY, historyRecordId, ChangeType.INSERT);
                     accountSqlDao.insertAuditFromTransaction(audit, rehydratedContext);
 
-                    final AccountCreationInternalEvent creationEvent = new DefaultAccountCreationEvent(account, rehydratedContext.getUserToken());
+                    final AccountCreationInternalEvent creationEvent = new DefaultAccountCreationEvent(account,
+                            rehydratedContext.getUserToken(),
+                            context.getAccountRecordId(),
+                            context.getTenantRecordId());
                     try {
                         eventBus.postFromTransaction(creationEvent, transactionalDao, rehydratedContext);
                     } catch (EventBusException e) {
@@ -161,7 +164,12 @@ public class AuditedAccountDao implements AccountDao {
                     final EntityAudit audit = new EntityAudit(TableName.ACCOUNT_HISTORY, historyRecordId, ChangeType.UPDATE);
                     accountSqlDao.insertAuditFromTransaction(audit, context);
 
-                    final AccountChangeInternalEvent changeEvent = new DefaultAccountChangeEvent(accountId, context.getUserToken(), currentAccount, account);
+                    final AccountChangeInternalEvent changeEvent = new DefaultAccountChangeEvent(accountId,
+                            context.getUserToken(),
+                            currentAccount,
+                            account,
+                            context.getAccountRecordId(),
+                            context.getTenantRecordId());
                     if (changeEvent.hasChanges()) {
                         try {
                             eventBus.postFromTransaction(changeEvent, transactional, context);
@@ -210,7 +218,9 @@ public class AuditedAccountDao implements AccountDao {
                     final EntityAudit audit = new EntityAudit(TableName.ACCOUNT_HISTORY, historyRecordId, ChangeType.UPDATE);
                     accountSqlDao.insertAuditFromTransaction(audit, context);
 
-                    final AccountChangeInternalEvent changeEvent = new DefaultAccountChangeEvent(accountId, context.getUserToken(), currentAccount, account);
+                    final AccountChangeInternalEvent changeEvent = new DefaultAccountChangeEvent(accountId, context.getUserToken(), currentAccount, account,
+                            context.getAccountRecordId(), context.getTenantRecordId());
+
                     if (changeEvent.hasChanges()) {
                         try {
                             eventBus.postFromTransaction(changeEvent, transactional, context);
diff --git a/account/src/test/java/com/ning/billing/account/api/user/TestEventJson.java b/account/src/test/java/com/ning/billing/account/api/user/TestEventJson.java
index e72ade2..abdbae8 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
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright 2010-2011 Ning, Inc.
  *
  * Ning licenses this file to you under the Apache License, version 2.0
@@ -39,7 +39,7 @@ public class TestEventJson extends AccountTestSuite {
         final List<ChangedField> changes = new ArrayList<ChangedField>();
         changes.add(new DefaultChangedField("fieldXX", "valueX", "valueXXX"));
         changes.add(new DefaultChangedField("fieldYY", "valueY", "valueYYY"));
-        final AccountChangeInternalEvent e = new DefaultAccountChangeEvent(UUID.randomUUID(), changes, UUID.randomUUID());
+        final AccountChangeInternalEvent e = new DefaultAccountChangeEvent(UUID.randomUUID(), changes, UUID.randomUUID(), 1L, 45L);
 
         final String json = mapper.writeValueAsString(e);
 
@@ -52,10 +52,12 @@ public class TestEventJson extends AccountTestSuite {
     public void testAccountCreationEvent() throws Exception {
         final DefaultAccountData data = new DefaultAccountData("dsfdsf", "bobo", 3, "bobo@yahoo.com", new DefaultBillCycleDay(12), "USD", UUID.randomUUID(),
                                                                "UTC", "US", "21 avenue", "", "Gling", "San Franciso", "CA", "94110", "USA", "4126789887", false, false);
-        final DefaultAccountCreationEvent e = new DefaultAccountCreationEvent(data, UUID.randomUUID(), UUID.randomUUID());
+        final DefaultAccountCreationEvent e = new DefaultAccountCreationEvent(data, UUID.randomUUID(), UUID.randomUUID(),  1L, 45L);
         final String json = mapper.writeValueAsString(e);
 
-        final Object obj = mapper.readValue(json, DefaultAccountCreationEvent.class);
+        final DefaultAccountCreationEvent obj = mapper.readValue(json, DefaultAccountCreationEvent.class);
         Assert.assertTrue(obj.equals(e));
+        Assert.assertEquals(obj.getAccountRecordId(), new Long(1L));
+        Assert.assertEquals(obj.getTenantRecordId(), new Long(45L));
     }
 }
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 c65d73b..5cd9a36 100644
--- a/account/src/test/java/com/ning/billing/account/dao/MockAccountDao.java
+++ b/account/src/test/java/com/ning/billing/account/dao/MockAccountDao.java
@@ -25,12 +25,12 @@ import java.util.concurrent.ConcurrentHashMap;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.user.DefaultAccountChangeEvent;
 import com.ning.billing.account.api.user.DefaultAccountCreationEvent;
-import com.ning.billing.util.svcsapi.bus.Bus;
-import com.ning.billing.util.svcsapi.bus.Bus.EventBusException;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.entity.EntityPersistenceException;
 import com.ning.billing.util.events.AccountChangeInternalEvent;
+import com.ning.billing.util.svcsapi.bus.Bus;
+import com.ning.billing.util.svcsapi.bus.Bus.EventBusException;
 
 import com.google.inject.Inject;
 
@@ -54,7 +54,7 @@ public class MockAccountDao implements AccountDao {
         accounts.put(account.getId(), account);
 
         try {
-            eventBus.post(new DefaultAccountCreationEvent(account, null), context);
+            eventBus.post(new DefaultAccountCreationEvent(account, null, 1L, 1L), context);
         } catch (EventBusException ex) {
             throw new RuntimeException(ex);
         }
@@ -94,7 +94,7 @@ public class MockAccountDao implements AccountDao {
     public void update(final Account account, final InternalCallContext context) {
         final Account currentAccount = accounts.put(account.getId(), account);
 
-        final AccountChangeInternalEvent changeEvent = new DefaultAccountChangeEvent(account.getId(), null, currentAccount, account);
+        final AccountChangeInternalEvent changeEvent = new DefaultAccountChangeEvent(account.getId(), null, currentAccount, account, 1L, 1L);
         if (changeEvent.hasChanges()) {
             try {
                 eventBus.post(changeEvent, context);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
index 58c42c6..9a6241c 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.analytics.api;
 
+import static org.testng.Assert.fail;
+
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.sql.SQLException;
@@ -85,8 +87,6 @@ import com.ning.billing.util.svcsapi.bus.Bus;
 
 import com.google.inject.Inject;
 
-import static org.testng.Assert.fail;
-
 @Guice(modules = {AnalyticsTestModule.class})
 public class TestAnalyticsService extends AnalyticsTestSuiteWithEmbeddedDB {
 
@@ -203,7 +203,7 @@ public class TestAnalyticsService extends AnalyticsTestSuiteWithEmbeddedDB {
                 priceList,
                 TOTAL_ORDERING,
                 null,
-                true), null);
+                true), null, 1L, 1L);
         expectedTransition = new BusinessSubscriptionTransition(
                 TOTAL_ORDERING,
                 transition.getBundleId(),
@@ -219,7 +219,7 @@ public class TestAnalyticsService extends AnalyticsTestSuiteWithEmbeddedDB {
     }
 
     private void createAccountCreationEvent(final Account account) {
-        accountCreationNotification = new DefaultAccountCreationEvent(account, null);
+        accountCreationNotification = new DefaultAccountCreationEvent(account, null, 1L, 1L);
     }
 
     private void createInvoiceAndPaymentCreationEvents(final Account account) {
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java b/api/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java
index e6fda16..4945661 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java
@@ -16,7 +16,6 @@
 
 package com.ning.billing.entitlement.api.user;
 
-import java.util.List;
 import java.util.UUID;
 
 import org.joda.time.DateTime;
@@ -97,13 +96,4 @@ public interface Subscription extends Entity, Blockable {
     public DateTime getPaidThroughDate();
 
     public ProductCategory getCategory();
-
-    public EffectiveSubscriptionEvent getPendingTransition();
-
-    public EffectiveSubscriptionEvent getPreviousTransition();
-
-    public List<EffectiveSubscriptionEvent> getBillingTransitions();
-
-    public List<EffectiveSubscriptionEvent> getAllTransitions();
-
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/svcs/DefaultEntitlementInternalApi.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/svcs/DefaultEntitlementInternalApi.java
index 2c38025..3d5abda 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/svcs/DefaultEntitlementInternalApi.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/svcs/DefaultEntitlementInternalApi.java
@@ -18,6 +18,8 @@ package com.ning.billing.entitlement.api.svcs;
 import java.util.List;
 import java.util.UUID;
 
+import javax.annotation.Nullable;
+
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 import org.joda.time.LocalDate;
@@ -25,16 +27,22 @@ import org.joda.time.LocalTime;
 
 import com.ning.billing.ErrorCode;
 import com.ning.billing.entitlement.api.SubscriptionFactory;
+import com.ning.billing.entitlement.api.user.DefaultEffectiveSubscriptionEvent;
 import com.ning.billing.entitlement.api.user.DefaultSubscriptionFactory.SubscriptionBuilder;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.entitlement.api.user.SubscriptionData;
+import com.ning.billing.entitlement.api.user.SubscriptionTransitionData;
 import com.ning.billing.entitlement.engine.dao.EntitlementDao;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
 
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.ImmutableList;
 import com.google.inject.Inject;
 
 public class DefaultEntitlementInternalApi implements EntitlementInternalApi {
@@ -107,4 +115,27 @@ public class DefaultEntitlementInternalApi implements EntitlementInternalApi {
                 .setPaidThroughDate(subscription.getPaidThroughDate());
         dao.updateChargedThroughDate(new SubscriptionData(builder), context);
     }
+
+    @Override
+    public List<EffectiveSubscriptionInternalEvent> getAllTransitions(final Subscription subscription, final InternalTenantContext context) {
+        final List<SubscriptionTransitionData> transitions = ((SubscriptionData) subscription).getAllTransitions();
+        return convertEffectiveSubscriptionInternalEventFromSubscriptionTransitions(subscription, context, transitions);
+    }
+
+    @Override
+    public List<EffectiveSubscriptionInternalEvent> getBillingTransitions(Subscription subscription, final InternalTenantContext context) {
+        final List<SubscriptionTransitionData> transitions = ((SubscriptionData) subscription).getBillingTransitions();
+        return convertEffectiveSubscriptionInternalEventFromSubscriptionTransitions(subscription, context, transitions);
+    }
+
+    private List<EffectiveSubscriptionInternalEvent> convertEffectiveSubscriptionInternalEventFromSubscriptionTransitions(final Subscription subscription,
+            final InternalTenantContext context, final List<SubscriptionTransitionData> transitions) {
+        return ImmutableList.<EffectiveSubscriptionInternalEvent>copyOf(Collections2.transform(transitions, new Function<SubscriptionTransitionData, EffectiveSubscriptionInternalEvent>() {
+            @Override
+            @Nullable
+            public EffectiveSubscriptionInternalEvent apply(@Nullable SubscriptionTransitionData input) {
+                return new DefaultEffectiveSubscriptionEvent(input, ((SubscriptionData) subscription).getAlignStartDate(), context.getAccountRecordId(), context.getTenantRecordId());
+            }
+        }));
+    }
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultEntitlementTimelineApi.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultEntitlementTimelineApi.java
index ed85264..67d9e3d 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultEntitlementTimelineApi.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultEntitlementTimelineApi.java
@@ -39,6 +39,7 @@ import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.entitlement.api.user.SubscriptionBundleData;
 import com.ning.billing.entitlement.api.user.SubscriptionData;
+import com.ning.billing.entitlement.api.user.SubscriptionTransitionData;
 import com.ning.billing.entitlement.engine.dao.EntitlementDao;
 import com.ning.billing.entitlement.events.EntitlementEvent;
 import com.ning.billing.entitlement.glue.DefaultEntitlementModule;
@@ -46,7 +47,6 @@ import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.callcontext.TenantContext;
-import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 
 import com.google.inject.Inject;
 import com.google.inject.name.Named;
@@ -350,7 +350,7 @@ public class DefaultEntitlementTimelineApi implements EntitlementTimelineApi {
         if (nbDeleted != deletedEvents.size()) {
             for (final SubscriptionTimeline.DeletedEvent d : deletedEvents) {
                 boolean found = false;
-                for (final EffectiveSubscriptionInternalEvent cur : data.getAllTransitions()) {
+                for (final SubscriptionTransitionData cur : data.getAllTransitions()) {
                     if (cur.getId().equals(d.getEventId())) {
                         found = true;
                     }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultRepairEntitlementEvent.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultRepairEntitlementEvent.java
index 0d12164..77199dc 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
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright 2010-2011 Ning, Inc.
  *
  * Ning licenses this file to you under the Apache License, version 2.0
@@ -19,15 +19,15 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 
+import com.ning.billing.util.events.DefaultBusInternalEvent;
 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 DefaultBusInternalEvent implements RepairEntitlementInternalEvent {
 
-    private final UUID userToken;
     private final UUID bundleId;
     private final UUID accountId;
     private final DateTime effectiveDate;
@@ -37,8 +37,10 @@ public class DefaultRepairEntitlementEvent implements RepairEntitlementInternalE
     public DefaultRepairEntitlementEvent(@JsonProperty("userToken") final UUID userToken,
                                          @JsonProperty("accountId") final UUID accountId,
                                          @JsonProperty("bundleId") final UUID bundleId,
-                                         @JsonProperty("effectiveDate") final DateTime effectiveDate) {
-        this.userToken = userToken;
+                                         @JsonProperty("effectiveDate") final DateTime effectiveDate,
+                                         @JsonProperty("accountRecordId") final Long accountRecordId,
+                                         @JsonProperty("tenantRecordId") final Long tenantRecordId) {
+        super(userToken, accountRecordId, tenantRecordId);
         this.bundleId = bundleId;
         this.accountId = accountId;
         this.effectiveDate = effectiveDate;
@@ -51,11 +53,6 @@ public class DefaultRepairEntitlementEvent implements RepairEntitlementInternalE
     }
 
     @Override
-    public UUID getUserToken() {
-        return userToken;
-    }
-
-    @Override
     public UUID getBundleId() {
         return bundleId;
     }
@@ -80,8 +77,6 @@ public class DefaultRepairEntitlementEvent implements RepairEntitlementInternalE
                 + ((bundleId == null) ? 0 : bundleId.hashCode());
         result = prime * result
                 + ((effectiveDate == null) ? 0 : effectiveDate.hashCode());
-        result = prime * result
-                + ((userToken == null) ? 0 : userToken.hashCode());
         return result;
     }
 
@@ -118,13 +113,7 @@ public class DefaultRepairEntitlementEvent implements RepairEntitlementInternalE
         } else if (effectiveDate.compareTo(other.effectiveDate) != 0) {
             return false;
         }
-        if (userToken == null) {
-            if (other.userToken != null) {
-                return false;
-            }
-        } else if (!userToken.equals(other.userToken)) {
-            return false;
-        }
         return true;
     }
+
 }
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 79130d8..32d968c 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
@@ -27,8 +27,8 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class DefaultEffectiveSubscriptionEvent extends DefaultSubscriptionEvent implements EffectiveSubscriptionInternalEvent {
-    public DefaultEffectiveSubscriptionEvent(final SubscriptionTransitionData in, final DateTime startDate) {
-        super(in, startDate);
+    public DefaultEffectiveSubscriptionEvent(final SubscriptionTransitionData in, final DateTime startDate, final Long accountRecordId, final Long tenantRecordId) {
+        super(in, startDate, accountRecordId, tenantRecordId);
     }
 
     @JsonCreator
@@ -49,9 +49,11 @@ public class DefaultEffectiveSubscriptionEvent extends DefaultSubscriptionEvent 
                                              @JsonProperty("userToken") final UUID userToken,
                                              @JsonProperty("transitionType") final SubscriptionTransitionType transitionType,
                                              @JsonProperty("remainingEventsForUserOperation") final Integer remainingEventsForUserOperation,
-                                             @JsonProperty("startDate") final DateTime startDate) {
+                                             @JsonProperty("startDate") final DateTime startDate,
+                                             @JsonProperty("accountRecordId") final Long accountRecordId,
+                                             @JsonProperty("tenantRecordId") final Long tenantRecordId) {
         super(eventId, subscriptionId, bundleId, requestedTransitionTime, effectiveTransitionTime, previousState, previousPlan,
               previousPhase, previousPriceList, nextState, nextPlan, nextPhase, nextPriceList, totalOrdering, userToken,
-              transitionType, remainingEventsForUserOperation, startDate);
+              transitionType, remainingEventsForUserOperation, startDate, accountRecordId, tenantRecordId);
     }
 }
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 bd29096..cdfcd2c 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultRequestedSubscriptionEvent.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultRequestedSubscriptionEvent.java
@@ -28,8 +28,8 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class DefaultRequestedSubscriptionEvent extends DefaultSubscriptionEvent implements RequestedSubscriptionInternalEvent {
-    public DefaultRequestedSubscriptionEvent(final SubscriptionTransitionData in, final DateTime startDate) {
-        super(in, startDate);
+    public DefaultRequestedSubscriptionEvent(final SubscriptionTransitionData in, final DateTime startDate, final Long accountRecordId, final Long tenantRecordId) {
+        super(in, startDate, accountRecordId, tenantRecordId);
     }
 
     @JsonCreator
@@ -50,14 +50,16 @@ public class DefaultRequestedSubscriptionEvent extends DefaultSubscriptionEvent 
                                              @JsonProperty("userToken") final UUID userToken,
                                              @JsonProperty("transitionType") final SubscriptionTransitionType transitionType,
                                              @JsonProperty("remainingEventsForUserOperation") final Integer remainingEventsForUserOperation,
-                                             @JsonProperty("startDate") final DateTime startDate) {
+                                             @JsonProperty("startDate") final DateTime startDate,
+                                             @JsonProperty("accountRecordId") final Long accountRecordId,
+                                             @JsonProperty("tenantRecordId") final Long tenantRecordId) {
         super(eventId, subscriptionId, bundleId, requestedTransitionTime, effectiveTransitionTime, previousState, previousPlan,
               previousPhase, previousPriceList, nextState, nextPlan, nextPhase, nextPriceList, totalOrdering, userToken,
-              transitionType, remainingEventsForUserOperation, startDate);
+              transitionType, remainingEventsForUserOperation, startDate, accountRecordId, tenantRecordId);
     }
 
-    public DefaultRequestedSubscriptionEvent(final SubscriptionData subscription, final EntitlementEvent nextEvent) {
+    public DefaultRequestedSubscriptionEvent(final SubscriptionData subscription, final EntitlementEvent nextEvent, final Long accountRecordId, final Long tenantRecordId) {
         this(nextEvent.getId(), nextEvent.getSubscriptionId(), subscription.getBundleId(), nextEvent.getRequestedDate(), nextEvent.getEffectiveDate(),
-             null, null, null, null, null, null, null, null, nextEvent.getTotalOrdering(), null, null, 0, null);
+             null, null, null, null, null, null, null, null, nextEvent.getTotalOrdering(), null, null, 0, null, accountRecordId, tenantRecordId);
     }
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultSubscriptionApiService.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultSubscriptionApiService.java
index 3361732..1daf3d4 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultSubscriptionApiService.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultSubscriptionApiService.java
@@ -59,7 +59,6 @@ import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.clock.DefaultClock;
 import com.ning.billing.util.dao.ObjectType;
-import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 
 import com.google.inject.Inject;
 
@@ -365,7 +364,7 @@ public class DefaultSubscriptionApiService implements SubscriptionApiService {
             throw new EntitlementUserApiException(ErrorCode.ENT_INVALID_REQUESTED_FUTURE_DATE, requestedDate.toString());
         }
 
-        final EffectiveSubscriptionInternalEvent previousTransition = subscription.getPreviousTransition();
+        final SubscriptionTransitionData  previousTransition = subscription.getPreviousTransitionData();
         if (previousTransition != null && previousTransition.getEffectiveTransitionTime().isAfter(requestedDate)) {
             throw new EntitlementUserApiException(ErrorCode.ENT_INVALID_REQUESTED_DATE,
                                                   requestedDate.toString(), previousTransition.getEffectiveTransitionTime());
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultSubscriptionEvent.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/DefaultSubscriptionEvent.java
index 15598e0..68507fd 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.DefaultBusInternalEvent;
 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 DefaultBusInternalEvent implements SubscriptionInternalEvent {
     private final Long totalOrdering;
     private final UUID subscriptionId;
     private final UUID bundleId;
@@ -43,11 +44,10 @@ public abstract class DefaultSubscriptionEvent implements SubscriptionInternalEv
     private final String nextPlan;
     private final String nextPhase;
     private final Integer remainingEventsForUserOperation;
-    private final UUID userToken;
     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 accountRecordId, final Long tenantRecordId) {
         this(in.getId(),
              in.getSubscriptionId(),
              in.getBundleId(),
@@ -65,7 +65,9 @@ public abstract class DefaultSubscriptionEvent implements SubscriptionInternalEv
              in.getUserToken(),
              in.getTransitionType(),
              in.getRemainingEventsForUserOperation(),
-             startDate);
+             startDate,
+             accountRecordId,
+             tenantRecordId);
     }
 
     @JsonCreator
@@ -86,7 +88,10 @@ public abstract class DefaultSubscriptionEvent implements SubscriptionInternalEv
                                     @JsonProperty("userToken") final UUID userToken,
                                     @JsonProperty("transitionType") final SubscriptionTransitionType transitionType,
                                     @JsonProperty("remainingEventsForUserOperation") final Integer remainingEventsForUserOperation,
-                                    @JsonProperty("startDate") final DateTime startDate) {
+                                    @JsonProperty("startDate") final DateTime startDate,
+                                    @JsonProperty("accountRecordId") final Long accountRecordId,
+                                    @JsonProperty("tenantRecordId") final Long tenantRecordId) {
+        super(userToken, accountRecordId, tenantRecordId);
         this.eventId = eventId;
         this.subscriptionId = subscriptionId;
         this.bundleId = bundleId;
@@ -101,7 +106,6 @@ public abstract class DefaultSubscriptionEvent implements SubscriptionInternalEv
         this.nextPriceList = nextPriceList;
         this.nextPhase = nextPhase;
         this.totalOrdering = totalOrdering;
-        this.userToken = userToken;
         this.transitionType = transitionType;
         this.remainingEventsForUserOperation = remainingEventsForUserOperation;
         this.startDate = startDate;
@@ -170,11 +174,6 @@ public abstract class DefaultSubscriptionEvent implements SubscriptionInternalEv
     }
 
     @Override
-    public UUID getUserToken() {
-        return userToken;
-    }
-
-    @Override
     public Integer getRemainingEventsForUserOperation() {
         return remainingEventsForUserOperation;
     }
@@ -224,7 +223,7 @@ public abstract class DefaultSubscriptionEvent implements SubscriptionInternalEv
         sb.append(", nextPlan='").append(nextPlan).append('\'');
         sb.append(", nextPhase='").append(nextPhase).append('\'');
         sb.append(", remainingEventsForUserOperation=").append(remainingEventsForUserOperation);
-        sb.append(", userToken=").append(userToken);
+        sb.append(", userToken=").append(getUserToken());
         sb.append(", transitionType=").append(transitionType);
         sb.append(", startDate=").append(startDate);
         sb.append('}');
@@ -293,10 +292,6 @@ public abstract class DefaultSubscriptionEvent implements SubscriptionInternalEv
         if (transitionType != that.transitionType) {
             return false;
         }
-        if (userToken != null ? !userToken.equals(that.userToken) : that.userToken != null) {
-            return false;
-        }
-
         return true;
     }
 
@@ -317,7 +312,6 @@ public abstract class DefaultSubscriptionEvent implements SubscriptionInternalEv
         result = 31 * result + (nextPlan != null ? nextPlan.hashCode() : 0);
         result = 31 * result + (nextPhase != null ? nextPhase.hashCode() : 0);
         result = 31 * result + (remainingEventsForUserOperation != null ? remainingEventsForUserOperation.hashCode() : 0);
-        result = 31 * result + (userToken != null ? userToken.hashCode() : 0);
         result = 31 * result + (transitionType != null ? transitionType.hashCode() : 0);
         result = 31 * result + (startDate != null ? startDate.hashCode() : 0);
         return result;
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java
index 430316a..9a1e633 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java
@@ -53,7 +53,6 @@ import com.ning.billing.junction.api.BlockingState;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.entity.EntityBase;
-import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 
 public class SubscriptionData extends EntityBase implements Subscription {
 
@@ -115,8 +114,8 @@ public class SubscriptionData extends EntityBase implements Subscription {
 
     @Override
     public SubscriptionState getState() {
-        return (getPreviousTransition() == null) ? null
-                                                 : getPreviousTransition().getNextState();
+        return (getPendingTransitionData() == null) ? null
+                : getPendingTransitionData().getNextState();
     }
 
     @Override
@@ -126,38 +125,38 @@ public class SubscriptionData extends EntityBase implements Subscription {
         }
         final SubscriptionTransitionData initialTransition = transitions.get(0);
         switch (initialTransition.getApiEventType()) {
-            case MIGRATE_BILLING:
-            case MIGRATE_ENTITLEMENT:
-                return SubscriptionSourceType.MIGRATED;
-            case TRANSFER:
-                return SubscriptionSourceType.TRANSFERED;
-            default:
-                return SubscriptionSourceType.NATIVE;
+        case MIGRATE_BILLING:
+        case MIGRATE_ENTITLEMENT:
+            return SubscriptionSourceType.MIGRATED;
+        case TRANSFER:
+            return SubscriptionSourceType.TRANSFERED;
+        default:
+            return SubscriptionSourceType.NATIVE;
         }
     }
 
     @Override
     public PlanPhase getCurrentPhase() {
         return (getPreviousTransitionData() == null) ? null
-                                                     : getPreviousTransitionData().getNextPhase();
+                : getPreviousTransitionData().getNextPhase();
     }
 
     @Override
     public Plan getCurrentPlan() {
         return (getPreviousTransitionData() == null) ? null
-                                                     : getPreviousTransitionData().getNextPlan();
+                : getPreviousTransitionData().getNextPlan();
     }
 
     @Override
     public PriceList getCurrentPriceList() {
         return (getPreviousTransitionData() == null) ? null :
-               getPreviousTransitionData().getNextPriceList();
+            getPreviousTransitionData().getNextPriceList();
 
     }
 
     @Override
     public DateTime getEndDate() {
-        final EffectiveSubscriptionInternalEvent latestTransition = getPreviousTransition();
+        final SubscriptionTransitionData latestTransition = getPreviousTransitionData();
         if (latestTransition.getNextState() == SubscriptionState.CANCELLED) {
             return latestTransition.getEffectiveTransitionTime();
         }
@@ -199,37 +198,28 @@ public class SubscriptionData extends EntityBase implements Subscription {
 
     @Override
     public boolean changePlan(final String productName, final BillingPeriod term, final String priceList,
-                              final DateTime requestedDate, final CallContext context) throws EntitlementUserApiException {
+            final DateTime requestedDate, final CallContext context) throws EntitlementUserApiException {
         return apiService.changePlan(this, productName, term, priceList, requestedDate, context);
     }
 
     @Override
     public boolean changePlanWithPolicy(final String productName, final BillingPeriod term, final String priceList,
-                                        final DateTime requestedDate, final ActionPolicy policy, final CallContext context) throws EntitlementUserApiException {
+            final DateTime requestedDate, final ActionPolicy policy, final CallContext context) throws EntitlementUserApiException {
         return apiService.changePlanWithPolicy(this, productName, term, priceList, requestedDate, policy, context);
     }
 
     @Override
     public boolean recreate(final PlanPhaseSpecifier spec, final DateTime requestedDate,
-                            final CallContext context) throws EntitlementUserApiException {
+            final CallContext context) throws EntitlementUserApiException {
         return apiService.recreatePlan(this, spec, requestedDate, context);
     }
 
     @Override
-    public EffectiveSubscriptionEvent getPendingTransition() {
-        final SubscriptionTransitionData data = getPendingTransitionData();
-        if (data == null) {
-            return null;
-        }
-        return new DefaultEffectiveSubscriptionEvent(data, alignStartDate);
-    }
-
-    @Override
     public BlockingState getBlockingState() {
         throw new UnsupportedOperationException();
     }
 
-    protected SubscriptionTransitionData getPendingTransitionData() {
+    public SubscriptionTransitionData getPendingTransitionData() {
         if (transitions == null) {
             return null;
         }
@@ -239,14 +229,7 @@ public class SubscriptionData extends EntityBase implements Subscription {
         return it.hasNext() ? it.next() : null;
     }
 
-    @Override
-    public EffectiveSubscriptionInternalEvent getPreviousTransition() {
-        final SubscriptionTransitionData data = getPreviousTransitionData();
-        if (data == null) {
-            return null;
-        }
-        return new DefaultEffectiveSubscriptionEvent(data, alignStartDate);
-    }
+
 
     @Override
     public String getLastActiveProductName() {
@@ -279,6 +262,16 @@ public class SubscriptionData extends EntityBase implements Subscription {
     }
 
     @Override
+    public Plan getLastActivePlan() {
+        if (getState() == SubscriptionState.CANCELLED) {
+            final SubscriptionTransitionData data = getPreviousTransitionData();
+            return data.getPreviousPlan();
+        } else {
+            return getCurrentPlan();
+        }
+    }
+
+    @Override
     public String getLastActiveBillingPeriod() {
         if (getState() == SubscriptionState.CANCELLED) {
             final SubscriptionTransitionData data = getPreviousTransitionData();
@@ -322,7 +315,7 @@ public class SubscriptionData extends EntityBase implements Subscription {
         final int prime = 31;
         int result = 1;
         result = prime * result
-                 + ((id == null) ? 0 : id.hashCode());
+                + ((id == null) ? 0 : id.hashCode());
         return result;
     }
 
@@ -348,30 +341,15 @@ public class SubscriptionData extends EntityBase implements Subscription {
         return true;
     }
 
-    @Override
-    public List<EffectiveSubscriptionInternalEvent> getBillingTransitions() {
-
-        if (transitions == null) {
-            return Collections.emptyList();
-        }
-        final List<EffectiveSubscriptionInternalEvent> result = new ArrayList<EffectiveSubscriptionInternalEvent>();
-        final SubscriptionTransitionDataIterator it = new SubscriptionTransitionDataIterator(
-                clock, transitions, Order.ASC_FROM_PAST, Kind.BILLING,
-                Visibility.ALL, TimeLimit.ALL);
-        while (it.hasNext()) {
-            result.add(new DefaultEffectiveSubscriptionEvent(it.next(), alignStartDate));
-        }
-        return result;
-    }
 
-    public EffectiveSubscriptionInternalEvent getTransitionFromEvent(final EntitlementEvent event, final int seqId) {
+    public SubscriptionTransitionData getTransitionFromEvent(final EntitlementEvent event, final int seqId) {
         if (transitions == null || event == null) {
             return null;
         }
         for (final SubscriptionTransitionData cur : transitions) {
             if (cur.getId().equals(event.getId())) {
                 final SubscriptionTransitionData withSeq = new SubscriptionTransitionData(cur, seqId);
-                return new DefaultEffectiveSubscriptionEvent(withSeq, alignStartDate);
+                return withSeq;
             }
         }
         return null;
@@ -392,18 +370,31 @@ public class SubscriptionData extends EntityBase implements Subscription {
         return activeVersion;
     }
 
-    @Override
-    public List<EffectiveSubscriptionInternalEvent> getAllTransitions() {
+    public List<SubscriptionTransitionData> getBillingTransitions() {
+
         if (transitions == null) {
             return Collections.emptyList();
         }
+        final List<SubscriptionTransitionData> result = new ArrayList<SubscriptionTransitionData>();
+        final SubscriptionTransitionDataIterator it = new SubscriptionTransitionDataIterator(
+                clock, transitions, Order.ASC_FROM_PAST, Kind.BILLING,
+                Visibility.ALL, TimeLimit.ALL);
+        while (it.hasNext()) {
+            result.add(it.next());
+        }
+        return result;
+    }
 
-        final List<EffectiveSubscriptionInternalEvent> result = new ArrayList<EffectiveSubscriptionInternalEvent>();
+
+    public List<SubscriptionTransitionData> getAllTransitions() {
+        if (transitions == null) {
+            return Collections.emptyList();
+        }
+        final List<SubscriptionTransitionData> result = new ArrayList<SubscriptionTransitionData>();
         final SubscriptionTransitionDataIterator it = new SubscriptionTransitionDataIterator(clock, transitions, Order.ASC_FROM_PAST, Kind.ALL, Visibility.ALL, TimeLimit.ALL);
         while (it.hasNext()) {
-            result.add(new DefaultEffectiveSubscriptionEvent(it.next(), alignStartDate));
+            result.add(it.next());
         }
-
         return result;
     }
 
@@ -413,19 +404,19 @@ public class SubscriptionData extends EntityBase implements Subscription {
         }
 
         final SubscriptionTransitionDataIterator it = new SubscriptionTransitionDataIterator(clock,
-                                                                                             transitions,
-                                                                                             Order.DESC_FROM_FUTURE,
-                                                                                             Kind.ENTITLEMENT,
-                                                                                             Visibility.ALL,
-                                                                                             TimeLimit.PAST_OR_PRESENT_ONLY);
+                transitions,
+                Order.DESC_FROM_FUTURE,
+                Kind.ENTITLEMENT,
+                Visibility.ALL,
+                TimeLimit.PAST_OR_PRESENT_ONLY);
 
         while (it.hasNext()) {
             final SubscriptionTransitionData cur = it.next();
             if (cur.getTransitionType() == SubscriptionTransitionType.CREATE
-                || cur.getTransitionType() == SubscriptionTransitionType.RE_CREATE
-                || cur.getTransitionType() == SubscriptionTransitionType.TRANSFER
-                || cur.getTransitionType() == SubscriptionTransitionType.CHANGE
-                || cur.getTransitionType() == SubscriptionTransitionType.MIGRATE_ENTITLEMENT) {
+                    || cur.getTransitionType() == SubscriptionTransitionType.RE_CREATE
+                    || cur.getTransitionType() == SubscriptionTransitionType.TRANSFER
+                    || cur.getTransitionType() == SubscriptionTransitionType.CHANGE
+                    || cur.getTransitionType() == SubscriptionTransitionType.MIGRATE_ENTITLEMENT) {
                 return cur;
             }
         }
@@ -438,7 +429,7 @@ public class SubscriptionData extends EntityBase implements Subscription {
     }
 
     public DateTime getPlanChangeEffectiveDate(final ActionPolicy policy,
-                                               final DateTime requestedDate) {
+            final DateTime requestedDate) {
 
         if (policy == ActionPolicy.IMMEDIATE) {
             return requestedDate;
@@ -452,7 +443,7 @@ public class SubscriptionData extends EntityBase implements Subscription {
             return requestedDate;
         } else {
             return chargedThroughDate.isBefore(requestedDate) ? requestedDate
-                                                              : chargedThroughDate;
+                    : chargedThroughDate;
         }
     }
 
@@ -469,11 +460,11 @@ public class SubscriptionData extends EntityBase implements Subscription {
             final SubscriptionTransitionData cur = it.next();
 
             if (cur.getTransitionType() == SubscriptionTransitionType.PHASE
-                || cur.getTransitionType() == SubscriptionTransitionType.TRANSFER
-                || cur.getTransitionType() == SubscriptionTransitionType.CREATE
-                || cur.getTransitionType() == SubscriptionTransitionType.RE_CREATE
-                || cur.getTransitionType() == SubscriptionTransitionType.CHANGE
-                || cur.getTransitionType() == SubscriptionTransitionType.MIGRATE_ENTITLEMENT) {
+                    || cur.getTransitionType() == SubscriptionTransitionType.TRANSFER
+                    || cur.getTransitionType() == SubscriptionTransitionType.CREATE
+                    || cur.getTransitionType() == SubscriptionTransitionType.RE_CREATE
+                    || cur.getTransitionType() == SubscriptionTransitionType.CHANGE
+                    || cur.getTransitionType() == SubscriptionTransitionType.MIGRATE_ENTITLEMENT) {
                 return cur.getEffectiveTransitionTime();
             }
         }
@@ -482,7 +473,7 @@ public class SubscriptionData extends EntityBase implements Subscription {
     }
 
     public void rebuildTransitions(final List<EntitlementEvent> inputEvents,
-                                   final Catalog catalog) {
+            final Catalog catalog) {
 
         if (inputEvents == null) {
             return;
@@ -513,53 +504,53 @@ public class SubscriptionData extends EntityBase implements Subscription {
 
             switch (cur.getType()) {
 
-                case PHASE:
-                    final PhaseEvent phaseEV = (PhaseEvent) cur;
-                    nextPhaseName = phaseEV.getPhase();
+            case PHASE:
+                final PhaseEvent phaseEV = (PhaseEvent) cur;
+                nextPhaseName = phaseEV.getPhase();
+                break;
+
+            case API_USER:
+                final ApiEvent userEV = (ApiEvent) cur;
+                apiEventType = userEV.getEventType();
+                isFromDisk = userEV.isFromDisk();
+                nextUserToken = userEV.getUserToken();
+
+                switch (apiEventType) {
+                case TRANSFER:
+                case MIGRATE_BILLING:
+                case MIGRATE_ENTITLEMENT:
+                case CREATE:
+                case RE_CREATE:
+                    previousState = null;
+                    previousPlan = null;
+                    previousPhase = null;
+                    previousPriceList = null;
+                    nextState = SubscriptionState.ACTIVE;
+                    nextPlanName = userEV.getEventPlan();
+                    nextPhaseName = userEV.getEventPlanPhase();
+                    nextPriceListName = userEV.getPriceList();
                     break;
-
-                case API_USER:
-                    final ApiEvent userEV = (ApiEvent) cur;
-                    apiEventType = userEV.getEventType();
-                    isFromDisk = userEV.isFromDisk();
-                    nextUserToken = userEV.getUserToken();
-
-                    switch (apiEventType) {
-                        case TRANSFER:
-                        case MIGRATE_BILLING:
-                        case MIGRATE_ENTITLEMENT:
-                        case CREATE:
-                        case RE_CREATE:
-                            previousState = null;
-                            previousPlan = null;
-                            previousPhase = null;
-                            previousPriceList = null;
-                            nextState = SubscriptionState.ACTIVE;
-                            nextPlanName = userEV.getEventPlan();
-                            nextPhaseName = userEV.getEventPlanPhase();
-                            nextPriceListName = userEV.getPriceList();
-                            break;
-                        case CHANGE:
-                            nextPlanName = userEV.getEventPlan();
-                            nextPhaseName = userEV.getEventPlanPhase();
-                            nextPriceListName = userEV.getPriceList();
-                            break;
-                        case CANCEL:
-                            nextState = SubscriptionState.CANCELLED;
-                            nextPlanName = null;
-                            nextPhaseName = null;
-                            break;
-                        case UNCANCEL:
-                            break;
-                        default:
-                            throw new EntitlementError(String.format(
-                                    "Unexpected UserEvent type = %s", userEV
-                                    .getEventType().toString()));
-                    }
+                case CHANGE:
+                    nextPlanName = userEV.getEventPlan();
+                    nextPhaseName = userEV.getEventPlanPhase();
+                    nextPriceListName = userEV.getPriceList();
+                    break;
+                case CANCEL:
+                    nextState = SubscriptionState.CANCELLED;
+                    nextPlanName = null;
+                    nextPhaseName = null;
+                    break;
+                case UNCANCEL:
                     break;
                 default:
                     throw new EntitlementError(String.format(
-                            "Unexpected Event type = %s", cur.getType()));
+                            "Unexpected UserEvent type = %s", userEV
+                            .getEventType().toString()));
+                }
+                break;
+            default:
+                throw new EntitlementError(String.format(
+                        "Unexpected Event type = %s", cur.getType()));
             }
 
             Plan nextPlan = null;
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 c98131e..937ee8e 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
@@ -34,9 +34,11 @@ import com.ning.billing.entitlement.alignment.PlanAligner;
 import com.ning.billing.entitlement.alignment.TimedPhase;
 import com.ning.billing.entitlement.api.EntitlementService;
 import com.ning.billing.entitlement.api.SubscriptionFactory;
+import com.ning.billing.entitlement.api.user.DefaultEffectiveSubscriptionEvent;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.Subscription.SubscriptionState;
 import com.ning.billing.entitlement.api.user.SubscriptionData;
+import com.ning.billing.entitlement.api.user.SubscriptionTransitionData;
 import com.ning.billing.entitlement.engine.addon.AddonUtils;
 import com.ning.billing.entitlement.engine.dao.EntitlementDao;
 import com.ning.billing.entitlement.events.EntitlementEvent;
@@ -49,22 +51,20 @@ import com.ning.billing.entitlement.events.user.ApiEventCancel;
 import com.ning.billing.entitlement.exceptions.EntitlementError;
 import com.ning.billing.lifecycle.LifecycleHandlerType;
 import com.ning.billing.lifecycle.LifecycleHandlerType.LifecycleLevel;
-import com.ning.billing.util.svcsapi.bus.Bus;
-import com.ning.billing.util.svcsapi.bus.Bus.EventBusException;
-import com.ning.billing.util.callcontext.CallContext;
-import com.ning.billing.util.callcontext.CallContextFactory;
 import com.ning.billing.util.callcontext.CallOrigin;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.callcontext.UserType;
 import com.ning.billing.util.clock.Clock;
-import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 import com.ning.billing.util.notificationq.NotificationKey;
 import com.ning.billing.util.notificationq.NotificationQueue;
 import com.ning.billing.util.notificationq.NotificationQueueService;
 import com.ning.billing.util.notificationq.NotificationQueueService.NoSuchNotificationQueue;
 import com.ning.billing.util.notificationq.NotificationQueueService.NotificationQueueAlreadyExists;
 import com.ning.billing.util.notificationq.NotificationQueueService.NotificationQueueHandler;
+import com.ning.billing.util.svcsapi.bus.Bus;
+import com.ning.billing.util.svcsapi.bus.Bus.EventBusException;
 
 import com.google.inject.Inject;
 
@@ -82,7 +82,6 @@ public class Engine implements EventListener, EntitlementService {
     private final Bus eventBus;
     private final EntitlementConfig config;
     private final NotificationQueueService notificationQueueService;
-    private final CallContextFactory factory;
     private final SubscriptionFactory subscriptionFactory;
     private final InternalCallContextFactory internalCallContextFactory;
 
@@ -94,7 +93,6 @@ public class Engine implements EventListener, EntitlementService {
                   final AddonUtils addonUtils, final Bus eventBus,
                   final NotificationQueueService notificationQueueService,
                   final SubscriptionFactory subscriptionFactory,
-                  final CallContextFactory factory,
                   final InternalCallContextFactory internalCallContextFactory) {
         this.clock = clock;
         this.dao = dao;
@@ -104,7 +102,6 @@ public class Engine implements EventListener, EntitlementService {
         this.eventBus = eventBus;
         this.notificationQueueService = notificationQueueService;
         this.subscriptionFactory = subscriptionFactory;
-        this.factory = factory;
         this.internalCallContextFactory = internalCallContextFactory;
     }
 
@@ -132,7 +129,7 @@ public class Engine implements EventListener, EntitlementService {
                     }
 
                     final UUID userToken = (event.getType() == EventType.API_USER) ? ((ApiEvent) event).getUserToken() : null;
-                    final CallContext context = factory.createCallContext(null, "SubscriptionEventQueue", CallOrigin.INTERNAL, UserType.SYSTEM, userToken);
+                    final InternalCallContext context = internalCallContextFactory.createInternalCallContext(tenantRecordId, accountRecordId, "SubscriptionEventQueue", CallOrigin.INTERNAL, UserType.SYSTEM, userToken);
                     processEventReady(event, key.getSeqId(), context);
                 }
             };
@@ -172,12 +169,12 @@ public class Engine implements EventListener, EntitlementService {
     }
 
     @Override
-    public void processEventReady(final EntitlementEvent event, final int seqId, final CallContext context) {
+    public void processEventReady(final EntitlementEvent event, final int seqId, final InternalCallContext context) {
         if (!event.isActive()) {
             return;
         }
 
-        final SubscriptionData subscription = (SubscriptionData) dao.getSubscriptionFromId(subscriptionFactory, event.getSubscriptionId(), internalCallContextFactory.createInternalTenantContext(context));
+        final SubscriptionData subscription = (SubscriptionData) dao.getSubscriptionFromId(subscriptionFactory, event.getSubscriptionId(), context);
         if (subscription == null) {
             log.warn("Failed to retrieve subscription for id %s", event.getSubscriptionId());
             return;
@@ -199,14 +196,16 @@ public class Engine implements EventListener, EntitlementService {
         }
 
         try {
-            final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(subscription.getBundleId(), ObjectType.BUNDLE, context);
-            eventBus.post(subscription.getTransitionFromEvent(event, theRealSeqId), internalCallContext);
+            final SubscriptionTransitionData transition = (subscription.getTransitionFromEvent(event, theRealSeqId));
+            final EffectiveSubscriptionInternalEvent busEvent = new DefaultEffectiveSubscriptionEvent(transition, subscription.getAlignStartDate(),
+                    context.getAccountRecordId(), context.getTenantRecordId());
+            eventBus.post(busEvent, context);
         } catch (EventBusException e) {
             log.warn("Failed to post entitlement event " + event, e);
         }
     }
 
-    private void onPhaseEvent(final SubscriptionData subscription, final CallContext context) {
+    private void onPhaseEvent(final SubscriptionData subscription, final InternalCallContext context) {
         try {
             final DateTime now = clock.getUTCNow();
             final TimedPhase nextTimedPhase = planAligner.getNextTimedPhase(subscription, now, now);
@@ -214,18 +213,18 @@ public class Engine implements EventListener, EntitlementService {
                                               PhaseEventData.createNextPhaseEvent(nextTimedPhase.getPhase().getName(), subscription, now, nextTimedPhase.getStartPhase()) :
                                               null;
             if (nextPhaseEvent != null) {
-                dao.createNextPhaseEvent(subscription, nextPhaseEvent, createCallContextFromBundleId(subscription.getBundleId(), context));
+                dao.createNextPhaseEvent(subscription, nextPhaseEvent, context);
             }
         } catch (EntitlementError e) {
             log.error(String.format("Failed to insert next phase for subscription %s", subscription.getId()), e);
         }
     }
 
-    private int onBasePlanEvent(final SubscriptionData baseSubscription, final ApiEvent event, final CallContext context) {
+    private int onBasePlanEvent(final SubscriptionData baseSubscription, final ApiEvent event, final InternalCallContext context) {
         final DateTime now = clock.getUTCNow();
         final Product baseProduct = (baseSubscription.getState() == SubscriptionState.CANCELLED) ? null : baseSubscription.getCurrentPlan().getProduct();
 
-        final List<Subscription> subscriptions = dao.getSubscriptions(subscriptionFactory, baseSubscription.getBundleId(), internalCallContextFactory.createInternalTenantContext(context));
+        final List<Subscription> subscriptions = dao.getSubscriptions(subscriptionFactory, baseSubscription.getBundleId(), context);
 
         final Map<UUID, EntitlementEvent> addOnCancellations = new HashMap<UUID, EntitlementEvent>();
         final Map<UUID, SubscriptionData> addOnCancellationSubscriptions = new HashMap<UUID, SubscriptionData>();
@@ -260,14 +259,9 @@ public class Engine implements EventListener, EntitlementService {
         final int addOnSize = addOnCancellations.size();
         int cancelSeq = addOnSize - 1;
         for (final UUID key : addOnCancellations.keySet()) {
-            dao.cancelSubscription(addOnCancellationSubscriptions.get(key), addOnCancellations.get(key), createCallContextFromBundleId(baseSubscription.getBundleId(), context), cancelSeq);
+            dao.cancelSubscription(addOnCancellationSubscriptions.get(key), addOnCancellations.get(key), context, cancelSeq);
             cancelSeq--;
         }
-
         return addOnSize;
     }
-
-    private InternalCallContext createCallContextFromBundleId(final UUID bundleId, final CallContext context) {
-        return internalCallContextFactory.createInternalCallContext(bundleId, ObjectType.BUNDLE, context);
-    }
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/EventListener.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/EventListener.java
index 1272dba..aebb38f 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/EventListener.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/EventListener.java
@@ -17,11 +17,11 @@
 package com.ning.billing.entitlement.engine.core;
 
 import com.ning.billing.entitlement.events.EntitlementEvent;
-import com.ning.billing.util.callcontext.CallContext;
+import com.ning.billing.util.callcontext.InternalCallContext;
 
 
 public interface EventListener {
 
-    public void processEventReady(final EntitlementEvent event, final int seqId, final CallContext context);
+    public void processEventReady(final EntitlementEvent event, final int seqId, final InternalCallContext context);
 
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/AuditedEntitlementDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/AuditedEntitlementDao.java
index cb2caaa..755fa23 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/AuditedEntitlementDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/AuditedEntitlementDao.java
@@ -66,8 +66,6 @@ import com.ning.billing.entitlement.events.user.ApiEventChange;
 import com.ning.billing.entitlement.events.user.ApiEventType;
 import com.ning.billing.entitlement.exceptions.EntitlementError;
 import com.ning.billing.util.ChangeType;
-import com.ning.billing.util.svcsapi.bus.Bus;
-import com.ning.billing.util.svcsapi.bus.Bus.EventBusException;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.clock.Clock;
@@ -78,6 +76,8 @@ import com.ning.billing.util.notificationq.NotificationKey;
 import com.ning.billing.util.notificationq.NotificationQueue;
 import com.ning.billing.util.notificationq.NotificationQueueService;
 import com.ning.billing.util.notificationq.NotificationQueueService.NoSuchNotificationQueue;
+import com.ning.billing.util.svcsapi.bus.Bus;
+import com.ning.billing.util.svcsapi.bus.Bus.EventBusException;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
@@ -636,7 +636,8 @@ public class AuditedEntitlementDao implements EntitlementDao {
 
                 try {
                     // Note: we don't send a requested change event here, but a repair event
-                    final RepairEntitlementInternalEvent busEvent = new DefaultRepairEntitlementEvent(context.getUserToken(), accountId, bundleId, clock.getUTCNow());
+                    final RepairEntitlementInternalEvent busEvent = new DefaultRepairEntitlementEvent(context.getUserToken(), accountId, bundleId, clock.getUTCNow(),
+                            context.getAccountRecordId(), context.getTenantRecordId());
                     eventBus.postFromTransaction(busEvent, transactional, context);
                 } catch (EventBusException e) {
                     log.warn("Failed to post repair entitlement event for bundle " + bundleId, e);
@@ -693,7 +694,7 @@ public class AuditedEntitlementDao implements EntitlementDao {
     private void notifyBusOfRequestedChange(final EntitlementEventSqlDao transactional, final SubscriptionData subscription,
                                             final EntitlementEvent nextEvent, final InternalCallContext context) {
         try {
-            eventBus.postFromTransaction(new DefaultRequestedSubscriptionEvent(subscription, nextEvent), transactional, context);
+            eventBus.postFromTransaction(new DefaultRequestedSubscriptionEvent(subscription, nextEvent, context.getAccountRecordId(), context.getTenantRecordId()), transactional, context);
         } 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/alignment/TestPlanAligner.java b/entitlement/src/test/java/com/ning/billing/entitlement/alignment/TestPlanAligner.java
index bd5696c..80473af 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/alignment/TestPlanAligner.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/alignment/TestPlanAligner.java
@@ -37,13 +37,13 @@ import com.ning.billing.config.CatalogConfig;
 import com.ning.billing.entitlement.api.user.DefaultSubscriptionFactory;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.SubscriptionData;
+import com.ning.billing.entitlement.api.user.SubscriptionTransitionData;
 import com.ning.billing.entitlement.events.EntitlementEvent;
 import com.ning.billing.entitlement.events.user.ApiEventBase;
 import com.ning.billing.entitlement.events.user.ApiEventBuilder;
 import com.ning.billing.entitlement.events.user.ApiEventType;
 import com.ning.billing.entitlement.exceptions.EntitlementError;
 import com.ning.billing.util.clock.DefaultClock;
-import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -203,7 +203,7 @@ public class TestPlanAligner extends KillbillTestSuite {
 
         subscriptionData.rebuildTransitions(ImmutableList.<EntitlementEvent>of(previousEvent, event), catalogService.getFullCatalog());
 
-        final List<EffectiveSubscriptionInternalEvent> newTransitions = subscriptionData.getAllTransitions();
+        final List<SubscriptionTransitionData> newTransitions = subscriptionData.getAllTransitions();
         Assert.assertEquals(newTransitions.size(), 2);
         Assert.assertNull(newTransitions.get(0).getPreviousPhase());
         Assert.assertEquals(newTransitions.get(0).getNextPhase(), newTransitions.get(1).getPreviousPhase());
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/TestEventJson.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/TestEventJson.java
index d40246b..9c70840 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
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright 2010-2011 Ning, Inc.
  *
  * Ning licenses this file to you under the Apache License, version 2.0
@@ -37,7 +37,8 @@ public class TestEventJson extends EntitlementTestSuite {
     public void testSubscriptionEvent() throws Exception {
 
         final EffectiveSubscriptionInternalEvent e = new DefaultEffectiveSubscriptionEvent(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), new DateTime(), new DateTime(),
-                                                                                   SubscriptionState.ACTIVE, "pro", "TRIAL", "DEFAULT", SubscriptionState.CANCELLED, null, null, null, 3L, UUID.randomUUID(), SubscriptionTransitionType.CANCEL, 0, new DateTime());
+                                                                                   SubscriptionState.ACTIVE, "pro", "TRIAL", "DEFAULT", SubscriptionState.CANCELLED, null, null, null, 3L,
+                                                                                   UUID.randomUUID(), SubscriptionTransitionType.CANCEL, 0, new DateTime(), 1L, 1L);
 
         final String json = mapper.writeValueAsString(e);
 
@@ -48,7 +49,7 @@ public class TestEventJson extends EntitlementTestSuite {
 
     @Test(groups = "fast")
     public void testRepairEntitlementEvent() throws Exception {
-        final RepairEntitlementInternalEvent e = new DefaultRepairEntitlementEvent(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), new DateTime());
+        final RepairEntitlementInternalEvent e = new DefaultRepairEntitlementEvent(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), new DateTime(), 1L, 1L);
 
         final String json = mapper.writeValueAsString(e);
 
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/transfer/TestTransfer.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/transfer/TestTransfer.java
index 8ece1aa..88a7895 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/transfer/TestTransfer.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/transfer/TestTransfer.java
@@ -91,9 +91,9 @@ public class TestTransfer extends TestApiBase {
             assertEquals(subscription.getCurrentPlan().getName(), "assault-rifle-annual");
             assertEquals(subscription.getChargedThroughDate(), startDate.plusYears(1));
             // WE should see MIGRATE_ENTITLEMENT and then MIGRATE_BILLING in the future
-            assertEquals(subscription.getBillingTransitions().size(), 1);
-            assertEquals(subscription.getBillingTransitions().get(0).getTransitionType(), SubscriptionTransitionType.MIGRATE_BILLING);
-            assertTrue(subscription.getBillingTransitions().get(0).getEffectiveTransitionTime().compareTo(clock.getUTCNow()) > 0);
+            assertEquals(entitlementInternalApi.getBillingTransitions(subscription, internalCallContext).size(), 1);
+            assertEquals(entitlementInternalApi.getBillingTransitions(subscription, internalCallContext).get(0).getTransitionType(), SubscriptionTransitionType.MIGRATE_BILLING);
+            assertTrue(entitlementInternalApi.getBillingTransitions(subscription, internalCallContext).get(0).getEffectiveTransitionTime().compareTo(clock.getUTCNow()) > 0);
             assertListenerStatus();
 
 
@@ -110,8 +110,8 @@ public class TestTransfer extends TestApiBase {
             final Subscription oldBaseSubscription = entitlementApi.getBaseSubscription(bundle.getId(), callContext);
             assertTrue(oldBaseSubscription.getState() == SubscriptionState.CANCELLED);
             // The MIGRATE_BILLING event should have been invalidated
-            assertEquals(oldBaseSubscription.getBillingTransitions().size(), 1);
-            assertEquals(oldBaseSubscription.getBillingTransitions().get(0).getTransitionType(), SubscriptionTransitionType.CANCEL);
+            assertEquals(entitlementInternalApi.getBillingTransitions(oldBaseSubscription, internalCallContext).size(), 1);
+            assertEquals(entitlementInternalApi.getBillingTransitions(oldBaseSubscription, internalCallContext).get(0).getTransitionType(), SubscriptionTransitionType.CANCEL);
 
         } catch (EntitlementMigrationApiException e) {
             Assert.fail("", e);
@@ -132,7 +132,7 @@ public class TestTransfer extends TestApiBase {
         // CREATE BP
         final Subscription baseSubscription = createSubscription(baseProduct, baseTerm, basePriceList);
 
-        final DateTime evergreenPhaseDate = baseSubscription.getPendingTransition().getEffectiveTransitionTime();
+        final DateTime evergreenPhaseDate = ((SubscriptionData) baseSubscription).getPendingTransitionData().getEffectiveTransitionTime();
 
         // MOVE A LITTLE, STILL IN TRIAL
         clock.addDays(20);
@@ -162,8 +162,8 @@ public class TestTransfer extends TestApiBase {
         assertTrue(((SubscriptionData) newBaseSubscription).getAlignStartDate().compareTo(((SubscriptionData) oldBaseSubscription).getAlignStartDate()) == 0);
 
         // CHECK NEXT PENDING PHASE IS ALIGNED WITH OLD SUBSCRIPTION START DATE
-        assertEquals(newBaseSubscription.getAllTransitions().size(), 2);
-        assertTrue(newBaseSubscription.getAllTransitions().get(1).getEffectiveTransitionTime().compareTo(evergreenPhaseDate) == 0);
+        assertEquals(entitlementInternalApi.getAllTransitions(newBaseSubscription, internalCallContext).size(), 2);
+        assertTrue(entitlementInternalApi.getAllTransitions(newBaseSubscription, internalCallContext).get(1).getEffectiveTransitionTime().compareTo(evergreenPhaseDate) == 0);
 
         final Plan newPlan = newBaseSubscription.getCurrentPlan();
         assertEquals(newPlan.getProduct().getName(), baseProduct);
@@ -186,7 +186,7 @@ public class TestTransfer extends TestApiBase {
 
         entitlementInternalApi.setChargedThroughDate(baseSubscription.getId(), ctd.toLocalDate(), internalCallContext);
 
-        final DateTime evergreenPhaseDate = baseSubscription.getPendingTransition().getEffectiveTransitionTime();
+        final DateTime evergreenPhaseDate = ((SubscriptionData) baseSubscription).getPendingTransitionData().getEffectiveTransitionTime();
 
         // MOVE A LITTLE, STILL IN TRIAL
         clock.addDays(20);
@@ -211,8 +211,8 @@ public class TestTransfer extends TestApiBase {
         assertTrue(((SubscriptionData) newBaseSubscription).getAlignStartDate().compareTo(((SubscriptionData) oldBaseSubscription).getAlignStartDate()) == 0);
 
         // CHECK NEXT PENDING PHASE IS ALIGNED WITH OLD SUBSCRIPTION START DATE
-        assertEquals(newBaseSubscription.getAllTransitions().size(), 2);
-        assertTrue(newBaseSubscription.getAllTransitions().get(1).getEffectiveTransitionTime().compareTo(evergreenPhaseDate) == 0);
+        assertEquals(entitlementInternalApi.getAllTransitions(newBaseSubscription, internalCallContext).size(), 2);
+        assertTrue(entitlementInternalApi.getAllTransitions(newBaseSubscription, internalCallContext).get(1).getEffectiveTransitionTime().compareTo(evergreenPhaseDate) == 0);
 
         final Plan newPlan = newBaseSubscription.getCurrentPlan();
         assertEquals(newPlan.getProduct().getName(), baseProduct);
@@ -261,7 +261,7 @@ public class TestTransfer extends TestApiBase {
         assertTrue(((SubscriptionData) newBaseSubscription).getAlignStartDate().compareTo(((SubscriptionData) baseSubscription).getAlignStartDate()) == 0);
 
         // CHECK ONLY ONE PHASE EXISTS
-        assertEquals(newBaseSubscription.getAllTransitions().size(), 1);
+        assertEquals(entitlementInternalApi.getAllTransitions(newBaseSubscription, internalCallContext).size(), 1);
 
         final Plan newPlan = newBaseSubscription.getCurrentPlan();
         assertEquals(newPlan.getProduct().getName(), baseProduct);
@@ -310,7 +310,7 @@ public class TestTransfer extends TestApiBase {
         assertTrue(((SubscriptionData) newBaseSubscription).getAlignStartDate().compareTo(((SubscriptionData) baseSubscription).getAlignStartDate()) == 0);
 
         // CHECK ONLY ONE PHASE EXISTS
-        assertEquals(newBaseSubscription.getAllTransitions().size(), 1);
+        assertEquals(entitlementInternalApi.getAllTransitions(newBaseSubscription, internalCallContext).size(), 1);
 
         Plan newPlan = newBaseSubscription.getCurrentPlan();
         assertEquals(newPlan.getProduct().getName(), baseProduct);
@@ -344,8 +344,8 @@ public class TestTransfer extends TestApiBase {
         assertEquals(newPlan.getProduct().getName(), newBaseProduct1);
         assertEquals(newBaseSubscriptionWithCtd.getCurrentPhase().getPhaseType(), PhaseType.EVERGREEN);
 
-        assertNotNull(newBaseSubscriptionWithCtd.getPendingTransition());
-        assertEquals(newBaseSubscriptionWithCtd.getPendingTransition().getEffectiveTransitionTime(), newCtd);
+        assertNotNull(((SubscriptionData) newBaseSubscriptionWithCtd).getPendingTransitionData());
+        assertEquals(((SubscriptionData) newBaseSubscriptionWithCtd).getPendingTransitionData().getEffectiveTransitionTime(), newCtd);
     }
 
     @Test(groups = "slow")
@@ -403,15 +403,15 @@ public class TestTransfer extends TestApiBase {
             if (curProduct.getName().equals(baseProduct)) {
                 foundBP = true;
                 assertTrue(((SubscriptionData) cur).getAlignStartDate().compareTo(((SubscriptionData) baseSubscription).getAlignStartDate()) == 0);
-                assertNull(cur.getPendingTransition());
+                assertNull(((SubscriptionData) cur).getPendingTransitionData());
             } else if (curProduct.getName().equals(aoProduct1)) {
                 foundAO1 = true;
                 assertTrue(((SubscriptionData) cur).getAlignStartDate().compareTo((aoSubscription1).getAlignStartDate()) == 0);
-                assertNull(cur.getPendingTransition());
+                assertNull(((SubscriptionData) cur).getPendingTransitionData());
             } else if (curProduct.getName().equals(aoProduct2)) {
                 foundAO2 = true;
                 assertTrue(((SubscriptionData) cur).getAlignStartDate().compareTo((aoSubscription2).getAlignStartDate()) == 0);
-                assertNotNull(cur.getPendingTransition());
+                assertNotNull(((SubscriptionData) cur).getPendingTransitionData());
             } else {
                 Assert.fail("Unexpected product " + curProduct.getName());
             }
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiAddOn.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiAddOn.java
index a04e916..ab69006 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiAddOn.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiAddOn.java
@@ -44,7 +44,6 @@ import com.ning.billing.entitlement.api.user.Subscription.SubscriptionState;
 import com.ning.billing.entitlement.api.user.SubscriptionStatusDryRun.DryRunChangeReason;
 import com.ning.billing.entitlement.glue.MockEngineModuleSql;
 import com.ning.billing.util.clock.DefaultClock;
-import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 
 import com.google.inject.Guice;
 import com.google.inject.Injector;
@@ -362,8 +361,7 @@ public class TestUserApiAddOn extends TestApiBase {
             assertEquals(aoSubscription.getBundleStartDate(), baseSubscription.getBundleStartDate());
 
             // CHECK next AO PHASE EVENT IS INDEED A MONTH AFTER BP STARTED => BUNDLE ALIGNMENT
-            EffectiveSubscriptionInternalEvent aoPendingTranstion = aoSubscription.getPendingTransition();
-
+            SubscriptionTransitionData aoPendingTranstion = aoSubscription.getPendingTransitionData();
             if (expAlignement == PlanAlignmentCreate.START_OF_BUNDLE) {
                 assertEquals(aoPendingTranstion.getEffectiveTransitionTime(), baseSubscription.getStartDate().plusMonths(1));
             } else {
@@ -394,7 +392,7 @@ public class TestUserApiAddOn extends TestApiBase {
             assertEquals(aoCurrentPhase.getPhaseType(), PhaseType.EVERGREEN);
 
             aoSubscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(aoSubscription.getId(), callContext);
-            aoPendingTranstion = aoSubscription.getPendingTransition();
+            aoPendingTranstion = aoSubscription.getPendingTransitionData();
             assertNull(aoPendingTranstion);
         } catch (EntitlementUserApiException e) {
             Assert.fail(e.getMessage());
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java
index a96f92a..adff09c 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java
@@ -40,7 +40,6 @@ import com.ning.billing.entitlement.api.TestApiBase;
 import com.ning.billing.entitlement.events.EntitlementEvent;
 import com.ning.billing.entitlement.events.user.ApiEvent;
 import com.ning.billing.util.clock.DefaultClock;
-import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 import com.ning.billing.util.svcapi.entitlement.EntitlementBillingApiException;
 
 public abstract class TestUserApiChangePlan extends TestApiBase {
@@ -459,7 +458,7 @@ public abstract class TestUserApiChangePlan extends TestApiBase {
             subscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(subscription.getId(), callContext);
 
             final DateTime expectedNextPhaseDate = subscription.getStartDate().plusDays(30).plusMonths(6);
-            final EffectiveSubscriptionInternalEvent nextPhase = subscription.getPendingTransition();
+            final SubscriptionTransitionData nextPhase = subscription.getPendingTransitionData();
             final DateTime nextPhaseEffectiveDate = nextPhase.getEffectiveTransitionTime();
 
             assertEquals(nextPhaseEffectiveDate, expectedNextPhaseDate);
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 a493034..182168b 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2011 Ning, Inc.
+  * Copyright 2010-2011 Ning, Inc.
  *
  * Ning licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
diff --git a/util/src/main/java/com/ning/billing/util/callcontext/InternalCallContextFactory.java b/util/src/main/java/com/ning/billing/util/callcontext/InternalCallContextFactory.java
index a82233f..47badc3 100644
--- a/util/src/main/java/com/ning/billing/util/callcontext/InternalCallContextFactory.java
+++ b/util/src/main/java/com/ning/billing/util/callcontext/InternalCallContextFactory.java
@@ -85,8 +85,8 @@ public class InternalCallContextFactory {
      */
     public InternalCallContext createInternalCallContext(final UUID objectId, final ObjectType objectType, final CallContext context) {
         // The context may come from a user API - for security, check we're not doing cross-tenants operations
-        final Long tenantRecordIdFromObject = retrieveTenantRecordIdFromObject(objectId, objectType);
-        final Long tenantRecordIdFromContext = getTenantRecordId(context);
+        //final Long tenantRecordIdFromObject = retrieveTenantRecordIdFromObject(objectId, objectType);
+        //final Long tenantRecordIdFromContext = getTenantRecordId(context);
         //Preconditions.checkState(tenantRecordIdFromContext.equals(tenantRecordIdFromObject),
         //                         "tenant of the pointed object (%s) and the context (%s) don't match!", tenantRecordIdFromObject, tenantRecordIdFromContext);
 
diff --git a/util/src/main/java/com/ning/billing/util/events/RepairEntitlementInternalEvent.java b/util/src/main/java/com/ning/billing/util/events/RepairEntitlementInternalEvent.java
index e9f5bf6..583f97b 100644
--- a/util/src/main/java/com/ning/billing/util/events/RepairEntitlementInternalEvent.java
+++ b/util/src/main/java/com/ning/billing/util/events/RepairEntitlementInternalEvent.java
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright 2010-2011 Ning, Inc.
  *
  * Ning licenses this file to you under the Apache License, version 2.0
diff --git a/util/src/main/java/com/ning/billing/util/events/SubscriptionInternalEvent.java b/util/src/main/java/com/ning/billing/util/events/SubscriptionInternalEvent.java
index 3bc35fe..9b01ae4 100644
--- a/util/src/main/java/com/ning/billing/util/events/SubscriptionInternalEvent.java
+++ b/util/src/main/java/com/ning/billing/util/events/SubscriptionInternalEvent.java
@@ -21,7 +21,6 @@ import java.util.UUID;
 import org.joda.time.DateTime;
 
 import com.ning.billing.entitlement.api.SubscriptionTransitionType;
-import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.Subscription.SubscriptionState;
 
 public interface SubscriptionInternalEvent extends BusInternalEvent {
diff --git a/util/src/main/java/com/ning/billing/util/svcapi/entitlement/EntitlementInternalApi.java b/util/src/main/java/com/ning/billing/util/svcapi/entitlement/EntitlementInternalApi.java
index c2f62b4..70b8511 100644
--- a/util/src/main/java/com/ning/billing/util/svcapi/entitlement/EntitlementInternalApi.java
+++ b/util/src/main/java/com/ning/billing/util/svcapi/entitlement/EntitlementInternalApi.java
@@ -44,7 +44,7 @@ public interface EntitlementInternalApi {
 
     public void setChargedThroughDate(final UUID subscriptionId, final LocalDate localChargedThruDate, final InternalCallContext context);
 
-    public List<EffectiveSubscriptionInternalEvent> getAllTransitions(final Subscription subscription);
+    public List<EffectiveSubscriptionInternalEvent> getAllTransitions(final Subscription subscription, final InternalTenantContext context);
 
-    public List<EffectiveSubscriptionInternalEvent> getBillingTransitions(final Subscription subscription);
+    public List<EffectiveSubscriptionInternalEvent> getBillingTransitions(final Subscription subscription, final InternalTenantContext context);
 }
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 5b5e12d..5ff92b6 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
@@ -20,30 +20,33 @@ import java.util.UUID;
 
 import com.ning.billing.util.dao.ObjectType;
 import com.ning.billing.util.events.ControlTagCreationInternalEvent;
+import com.ning.billing.util.events.DefaultBusInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
 
 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 DefaultBusInternalEvent implements ControlTagCreationInternalEvent {
+
     private final UUID tagId;
     private final UUID objectId;
     private final ObjectType objectType;
     private final TagDefinition tagDefinition;
-    private final UUID userToken;
 
     @JsonCreator
     public DefaultControlTagCreationEvent(@JsonProperty("tagId") final UUID tagId,
                                           @JsonProperty("objectId") final UUID objectId,
                                           @JsonProperty("objectType") final ObjectType objectType,
                                           @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
-                                          @JsonProperty("userToken") final UUID userToken) {
+                                          @JsonProperty("userToken") final UUID userToken,
+                                          @JsonProperty("accountRecordId") final Long accountRecordId,
+                                          @JsonProperty("tenantRecordId") final Long tenantRecordId) {
+        super(userToken, accountRecordId, tenantRecordId);
         this.tagId = tagId;
         this.objectId = objectId;
         this.objectType = objectType;
         this.tagDefinition = tagDefinition;
-        this.userToken = userToken;
     }
 
     @Override
@@ -72,10 +75,6 @@ public class DefaultControlTagCreationEvent implements ControlTagCreationInterna
         return BusEventType.CONTROL_TAG_CREATION;
     }
 
-    @Override
-    public UUID getUserToken() {
-        return userToken;
-    }
 
     @Override
     public String toString() {
@@ -85,7 +84,6 @@ public class DefaultControlTagCreationEvent implements ControlTagCreationInterna
         sb.append(", tagId=").append(tagId);
         sb.append(", objectType=").append(objectType);
         sb.append(", tagDefinition=").append(tagDefinition);
-        sb.append(", userToken=").append(userToken);
         sb.append('}');
         return sb.toString();
     }
@@ -113,10 +111,6 @@ public class DefaultControlTagCreationEvent implements ControlTagCreationInterna
         if (tagId != null ? !tagId.equals(that.tagId) : that.tagId != null) {
             return false;
         }
-        if (userToken != null ? !userToken.equals(that.userToken) : that.userToken != null) {
-            return false;
-        }
-
         return true;
     }
 
@@ -126,7 +120,6 @@ public class DefaultControlTagCreationEvent implements ControlTagCreationInterna
         result = 31 * result + (objectId != null ? objectId.hashCode() : 0);
         result = 31 * result + (objectType != null ? objectType.hashCode() : 0);
         result = 31 * result + (tagDefinition != null ? tagDefinition.hashCode() : 0);
-        result = 31 * result + (userToken != null ? userToken.hashCode() : 0);
         return result;
     }
 }
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 125fbc0..6dbe642 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
@@ -19,24 +19,27 @@ package com.ning.billing.util.tag.api.user;
 import java.util.UUID;
 
 import com.ning.billing.util.events.ControlTagDefinitionCreationInternalEvent;
+import com.ning.billing.util.events.DefaultBusInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
 
 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 DefaultBusInternalEvent implements ControlTagDefinitionCreationInternalEvent {
+
     private final UUID tagDefinitionId;
     private final TagDefinition tagDefinition;
-    private final UUID userToken;
 
     @JsonCreator
     public DefaultControlTagDefinitionCreationEvent(@JsonProperty("tagDefinitionId") final UUID tagDefinitionId,
                                                     @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
-                                                    @JsonProperty("userToken") final UUID userToken) {
+                                                    @JsonProperty("userToken") final UUID userToken,
+                                                    @JsonProperty("accountRecordId") final Long accountRecordId,
+                                                    @JsonProperty("tenantRecordId") final Long tenantRecordId) {
+        super(userToken, accountRecordId, tenantRecordId);
         this.tagDefinitionId = tagDefinitionId;
         this.tagDefinition = tagDefinition;
-        this.userToken = userToken;
     }
 
     @Override
@@ -55,10 +58,6 @@ public class DefaultControlTagDefinitionCreationEvent implements ControlTagDefin
         return BusEventType.CONTROL_TAGDEFINITION_CREATION;
     }
 
-    @Override
-    public UUID getUserToken() {
-        return userToken;
-    }
 
     @Override
     public String toString() {
@@ -66,7 +65,6 @@ public class DefaultControlTagDefinitionCreationEvent implements ControlTagDefin
         sb.append("DefaultControlTagDefinitionCreationEvent");
         sb.append("{tagDefinition=").append(tagDefinition);
         sb.append(", tagDefinitionId=").append(tagDefinitionId);
-        sb.append(", userToken=").append(userToken);
         sb.append('}');
         return sb.toString();
     }
@@ -88,10 +86,6 @@ public class DefaultControlTagDefinitionCreationEvent implements ControlTagDefin
         if (tagDefinitionId != null ? !tagDefinitionId.equals(that.tagDefinitionId) : that.tagDefinitionId != null) {
             return false;
         }
-        if (userToken != null ? !userToken.equals(that.userToken) : that.userToken != null) {
-            return false;
-        }
-
         return true;
     }
 
@@ -99,7 +93,6 @@ public class DefaultControlTagDefinitionCreationEvent implements ControlTagDefin
     public int hashCode() {
         int result = tagDefinitionId != null ? tagDefinitionId.hashCode() : 0;
         result = 31 * result + (tagDefinition != null ? tagDefinition.hashCode() : 0);
-        result = 31 * result + (userToken != null ? userToken.hashCode() : 0);
         return result;
     }
 }
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 4c97168..c54e479 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
@@ -19,24 +19,27 @@ package com.ning.billing.util.tag.api.user;
 import java.util.UUID;
 
 import com.ning.billing.util.events.ControlTagDefinitionDeletionInternalEvent;
+import com.ning.billing.util.events.DefaultBusInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
 
 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 DefaultBusInternalEvent implements ControlTagDefinitionDeletionInternalEvent {
+
     private final UUID tagDefinitionId;
     private final TagDefinition tagDefinition;
-    private final UUID userToken;
 
     @JsonCreator
     public DefaultControlTagDefinitionDeletionEvent(@JsonProperty("tagDefinitionId") final UUID tagDefinitionId,
                                                     @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
-                                                    @JsonProperty("userToken") final UUID userToken) {
+                                                    @JsonProperty("userToken") final UUID userToken,
+                                                    @JsonProperty("accountRecordId") final Long accountRecordId,
+                                                    @JsonProperty("tenantRecordId") final Long tenantRecordId) {
+        super(userToken, accountRecordId, tenantRecordId);
         this.tagDefinitionId = tagDefinitionId;
         this.tagDefinition = tagDefinition;
-        this.userToken = userToken;
     }
 
     @Override
@@ -56,17 +59,11 @@ public class DefaultControlTagDefinitionDeletionEvent implements ControlTagDefin
     }
 
     @Override
-    public UUID getUserToken() {
-        return userToken;
-    }
-
-    @Override
     public String toString() {
         final StringBuilder sb = new StringBuilder();
         sb.append("DefaultControlTagDefinitionDeletionEvent");
         sb.append("{tagDefinition=").append(tagDefinition);
         sb.append(", tagDefinitionId=").append(tagDefinitionId);
-        sb.append(", userToken=").append(userToken);
         sb.append('}');
         return sb.toString();
     }
@@ -88,10 +85,6 @@ public class DefaultControlTagDefinitionDeletionEvent implements ControlTagDefin
         if (tagDefinitionId != null ? !tagDefinitionId.equals(that.tagDefinitionId) : that.tagDefinitionId != null) {
             return false;
         }
-        if (userToken != null ? !userToken.equals(that.userToken) : that.userToken != null) {
-            return false;
-        }
-
         return true;
     }
 
@@ -99,7 +92,6 @@ public class DefaultControlTagDefinitionDeletionEvent implements ControlTagDefin
     public int hashCode() {
         int result = tagDefinitionId != null ? tagDefinitionId.hashCode() : 0;
         result = 31 * result + (tagDefinition != null ? tagDefinition.hashCode() : 0);
-        result = 31 * result + (userToken != null ? userToken.hashCode() : 0);
         return result;
     }
 }
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 497540f..1aa6260 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
@@ -20,30 +20,32 @@ import java.util.UUID;
 
 import com.ning.billing.util.dao.ObjectType;
 import com.ning.billing.util.events.ControlTagDeletionInternalEvent;
+import com.ning.billing.util.events.DefaultBusInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
 
 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 DefaultBusInternalEvent implements ControlTagDeletionInternalEvent {
     private final UUID tagId;
     final UUID objectId;
     final ObjectType objectType;
     final TagDefinition tagDefinition;
-    final UUID userToken;
 
     @JsonCreator
     public DefaultControlTagDeletionEvent(@JsonProperty("tagId") final UUID tagId,
                                           @JsonProperty("objectId") final UUID objectId,
                                           @JsonProperty("objectType") final ObjectType objectType,
                                           @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
-                                          @JsonProperty("userToken") final UUID userToken) {
+                                          @JsonProperty("userToken") final UUID userToken,
+                                          @JsonProperty("accountRecordId") final Long accountRecordId,
+                                          @JsonProperty("tenantRecordId") final Long tenantRecordId) {
+        super(userToken, accountRecordId, tenantRecordId);
         this.tagId = tagId;
         this.objectId = objectId;
         this.objectType = objectType;
         this.tagDefinition = tagDefinition;
-        this.userToken = userToken;
     }
 
     @Override
@@ -72,10 +74,6 @@ public class DefaultControlTagDeletionEvent implements ControlTagDeletionInterna
         return BusEventType.CONTROL_TAG_DELETION;
     }
 
-    @Override
-    public UUID getUserToken() {
-        return userToken;
-    }
 
     @Override
     public String toString() {
@@ -85,7 +83,6 @@ public class DefaultControlTagDeletionEvent implements ControlTagDeletionInterna
         sb.append(", tagId=").append(tagId);
         sb.append(", objectType=").append(objectType);
         sb.append(", tagDefinition=").append(tagDefinition);
-        sb.append(", userToken=").append(userToken);
         sb.append('}');
         return sb.toString();
     }
@@ -113,10 +110,6 @@ public class DefaultControlTagDeletionEvent implements ControlTagDeletionInterna
         if (tagId != null ? !tagId.equals(that.tagId) : that.tagId != null) {
             return false;
         }
-        if (userToken != null ? !userToken.equals(that.userToken) : that.userToken != null) {
-            return false;
-        }
-
         return true;
     }
 
@@ -126,7 +119,6 @@ public class DefaultControlTagDeletionEvent implements ControlTagDeletionInterna
         result = 31 * result + (objectId != null ? objectId.hashCode() : 0);
         result = 31 * result + (objectType != null ? objectType.hashCode() : 0);
         result = 31 * result + (tagDefinition != null ? tagDefinition.hashCode() : 0);
-        result = 31 * result + (userToken != null ? userToken.hashCode() : 0);
         return result;
     }
 }
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 98a0a12..5a65809 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.util.dao.ObjectType;
+import com.ning.billing.util.events.DefaultBusInternalEvent;
 import com.ning.billing.util.events.UserTagCreationInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
 
@@ -26,24 +27,25 @@ 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 DefaultBusInternalEvent implements UserTagCreationInternalEvent {
     private final UUID tagId;
     private final UUID objectId;
     private final ObjectType objectType;
     private final TagDefinition tagDefinition;
-    private final UUID userToken;
 
     @JsonCreator
     public DefaultUserTagCreationEvent(@JsonProperty("tagId") final UUID tagId,
-                                       @JsonProperty("objectId") final UUID objectId,
-                                       @JsonProperty("objectType") final ObjectType objectType,
-                                       @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
-                                       @JsonProperty("userToken") final UUID userToken) {
+            @JsonProperty("objectId") final UUID objectId,
+            @JsonProperty("objectType") final ObjectType objectType,
+            @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
+            @JsonProperty("userToken") final UUID userToken,
+            @JsonProperty("accountRecordId") final Long accountRecordId,
+            @JsonProperty("tenantRecordId") final Long tenantRecordId) {
+        super(userToken, accountRecordId, tenantRecordId);
         this.tagId = tagId;
         this.objectId = objectId;
         this.objectType = objectType;
         this.tagDefinition = tagDefinition;
-        this.userToken = userToken;
     }
 
     @Override
@@ -72,10 +74,7 @@ public class DefaultUserTagCreationEvent implements UserTagCreationInternalEvent
         return BusEventType.USER_TAG_CREATION;
     }
 
-    @Override
-    public UUID getUserToken() {
-        return userToken;
-    }
+
 
     @Override
     public String toString() {
@@ -85,7 +84,6 @@ public class DefaultUserTagCreationEvent implements UserTagCreationInternalEvent
         sb.append(", tagId=").append(tagId);
         sb.append(", objectType=").append(objectType);
         sb.append(", tagDefinition=").append(tagDefinition);
-        sb.append(", userToken=").append(userToken);
         sb.append('}');
         return sb.toString();
     }
@@ -113,10 +111,6 @@ public class DefaultUserTagCreationEvent implements UserTagCreationInternalEvent
         if (tagId != null ? !tagId.equals(that.tagId) : that.tagId != null) {
             return false;
         }
-        if (userToken != null ? !userToken.equals(that.userToken) : that.userToken != null) {
-            return false;
-        }
-
         return true;
     }
 
@@ -126,7 +120,6 @@ public class DefaultUserTagCreationEvent implements UserTagCreationInternalEvent
         result = 31 * result + (objectId != null ? objectId.hashCode() : 0);
         result = 31 * result + (objectType != null ? objectType.hashCode() : 0);
         result = 31 * result + (tagDefinition != null ? tagDefinition.hashCode() : 0);
-        result = 31 * result + (userToken != null ? userToken.hashCode() : 0);
         return result;
     }
 }
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 ec5ea04..1cf9452 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.DefaultBusInternalEvent;
 import com.ning.billing.util.events.UserTagDefinitionCreationInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
 
@@ -25,18 +26,20 @@ 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 DefaultBusInternalEvent implements UserTagDefinitionCreationInternalEvent {
+
     private final UUID tagDefinitionId;
     private final TagDefinition tagDefinition;
-    private final UUID userToken;
 
     @JsonCreator
     public DefaultUserTagDefinitionCreationEvent(@JsonProperty("tagDefinitionId") final UUID tagDefinitionId,
                                                  @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
-                                                 @JsonProperty("userToken") final UUID userToken) {
+                                                 @JsonProperty("userToken") final UUID userToken,
+                                                 @JsonProperty("accountRecordId") final Long accountRecordId,
+                                                 @JsonProperty("tenantRecordId") final Long tenantRecordId) {
+        super(userToken, accountRecordId, tenantRecordId);
         this.tagDefinitionId = tagDefinitionId;
         this.tagDefinition = tagDefinition;
-        this.userToken = userToken;
     }
 
     @Override
@@ -55,10 +58,6 @@ public class DefaultUserTagDefinitionCreationEvent implements UserTagDefinitionC
         return BusEventType.USER_TAGDEFINITION_CREATION;
     }
 
-    @Override
-    public UUID getUserToken() {
-        return userToken;
-    }
 
     @Override
     public String toString() {
@@ -66,7 +65,6 @@ public class DefaultUserTagDefinitionCreationEvent implements UserTagDefinitionC
         sb.append("DefaultUserTagDefinitionCreationEvent");
         sb.append("{tagDefinition=").append(tagDefinition);
         sb.append(", tagDefinitionId=").append(tagDefinitionId);
-        sb.append(", userToken=").append(userToken);
         sb.append('}');
         return sb.toString();
     }
@@ -88,10 +86,6 @@ public class DefaultUserTagDefinitionCreationEvent implements UserTagDefinitionC
         if (tagDefinitionId != null ? !tagDefinitionId.equals(that.tagDefinitionId) : that.tagDefinitionId != null) {
             return false;
         }
-        if (userToken != null ? !userToken.equals(that.userToken) : that.userToken != null) {
-            return false;
-        }
-
         return true;
     }
 
@@ -99,7 +93,6 @@ public class DefaultUserTagDefinitionCreationEvent implements UserTagDefinitionC
     public int hashCode() {
         int result = tagDefinitionId != null ? tagDefinitionId.hashCode() : 0;
         result = 31 * result + (tagDefinition != null ? tagDefinition.hashCode() : 0);
-        result = 31 * result + (userToken != null ? userToken.hashCode() : 0);
         return result;
     }
 }
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 35788b3..692ac11 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.DefaultBusInternalEvent;
 import com.ning.billing.util.events.UserTagDefinitionDeletionInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
 
@@ -25,18 +26,20 @@ 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 DefaultBusInternalEvent implements UserTagDefinitionDeletionInternalEvent {
+
     private final UUID tagDefinitionId;
     private final TagDefinition tagDefinition;
-    private final UUID userToken;
 
     @JsonCreator
     public DefaultUserTagDefinitionDeletionEvent(@JsonProperty("tagDefinitionId") final UUID tagDefinitionId,
                                                  @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
-                                                 @JsonProperty("userToken") final UUID userToken) {
+                                                 @JsonProperty("userToken") final UUID userToken,
+                                                 @JsonProperty("accountRecordId") final Long accountRecordId,
+                                                 @JsonProperty("tenantRecordId") final Long tenantRecordId) {
+        super(userToken, accountRecordId, tenantRecordId);
         this.tagDefinitionId = tagDefinitionId;
         this.tagDefinition = tagDefinition;
-        this.userToken = userToken;
     }
 
     @Override
@@ -55,10 +58,6 @@ public class DefaultUserTagDefinitionDeletionEvent implements UserTagDefinitionD
         return BusEventType.USER_TAGDEFINITION_DELETION;
     }
 
-    @Override
-    public UUID getUserToken() {
-        return userToken;
-    }
 
     @Override
     public String toString() {
@@ -66,7 +65,6 @@ public class DefaultUserTagDefinitionDeletionEvent implements UserTagDefinitionD
         sb.append("DefaultUserTagDefinitionDeletionEvent");
         sb.append("{tagDefinition=").append(tagDefinition);
         sb.append(", tagDefinitionId=").append(tagDefinitionId);
-        sb.append(", userToken=").append(userToken);
         sb.append('}');
         return sb.toString();
     }
@@ -88,10 +86,6 @@ public class DefaultUserTagDefinitionDeletionEvent implements UserTagDefinitionD
         if (tagDefinitionId != null ? !tagDefinitionId.equals(that.tagDefinitionId) : that.tagDefinitionId != null) {
             return false;
         }
-        if (userToken != null ? !userToken.equals(that.userToken) : that.userToken != null) {
-            return false;
-        }
-
         return true;
     }
 
@@ -99,7 +93,6 @@ public class DefaultUserTagDefinitionDeletionEvent implements UserTagDefinitionD
     public int hashCode() {
         int result = tagDefinitionId != null ? tagDefinitionId.hashCode() : 0;
         result = 31 * result + (tagDefinition != null ? tagDefinition.hashCode() : 0);
-        result = 31 * result + (userToken != null ? userToken.hashCode() : 0);
         return result;
     }
 }
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 e7d4750..72f6b44 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.util.dao.ObjectType;
+import com.ning.billing.util.events.DefaultBusInternalEvent;
 import com.ning.billing.util.events.UserTagDeletionInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
 
@@ -26,24 +27,25 @@ 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 DefaultBusInternalEvent implements UserTagDeletionInternalEvent {
     private final UUID tagId;
     private final UUID objectId;
     private final ObjectType objectType;
     private final TagDefinition tagDefinition;
-    private final UUID userToken;
 
     @JsonCreator
     public DefaultUserTagDeletionEvent(@JsonProperty("tagId") final UUID tagId,
                                        @JsonProperty("objectId") final UUID objectId,
                                        @JsonProperty("objectType") final ObjectType objectType,
                                        @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
-                                       @JsonProperty("userToken") final UUID userToken) {
+                                       @JsonProperty("userToken") final UUID userToken,
+                                       @JsonProperty("accountRecordId") final Long accountRecordId,
+                                       @JsonProperty("tenantRecordId") final Long tenantRecordId) {
+        super(userToken, accountRecordId, tenantRecordId);
         this.tagId = tagId;
         this.objectId = objectId;
         this.objectType = objectType;
         this.tagDefinition = tagDefinition;
-        this.userToken = userToken;
     }
 
     @Override
@@ -72,10 +74,6 @@ public class DefaultUserTagDeletionEvent implements UserTagDeletionInternalEvent
         return BusEventType.USER_TAG_DELETION;
     }
 
-    @Override
-    public UUID getUserToken() {
-        return userToken;
-    }
 
     @Override
     public String toString() {
@@ -85,7 +83,6 @@ public class DefaultUserTagDeletionEvent implements UserTagDeletionInternalEvent
         sb.append(", tagId=").append(tagId);
         sb.append(", objectType=").append(objectType);
         sb.append(", tagDefinition=").append(tagDefinition);
-        sb.append(", userToken=").append(userToken);
         sb.append('}');
         return sb.toString();
     }
@@ -113,10 +110,6 @@ public class DefaultUserTagDeletionEvent implements UserTagDeletionInternalEvent
         if (tagId != null ? !tagId.equals(that.tagId) : that.tagId != null) {
             return false;
         }
-        if (userToken != null ? !userToken.equals(that.userToken) : that.userToken != null) {
-            return false;
-        }
-
         return true;
     }
 
@@ -126,7 +119,6 @@ public class DefaultUserTagDeletionEvent implements UserTagDeletionInternalEvent
         result = 31 * result + (objectId != null ? objectId.hashCode() : 0);
         result = 31 * result + (objectType != null ? objectType.hashCode() : 0);
         result = 31 * result + (tagDefinition != null ? tagDefinition.hashCode() : 0);
-        result = 31 * result + (userToken != null ? userToken.hashCode() : 0);
         return result;
     }
 }
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 569ac72..f918128 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
@@ -18,6 +18,7 @@ package com.ning.billing.util.tag.api.user;
 
 import java.util.UUID;
 
+import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.dao.ObjectType;
 import com.ning.billing.util.events.ControlTagCreationInternalEvent;
 import com.ning.billing.util.events.ControlTagDefinitionCreationInternalEvent;
@@ -30,35 +31,35 @@ import com.ning.billing.util.events.UserTagDeletionInternalEvent;
 import com.ning.billing.util.tag.TagDefinition;
 
 public class TagEventBuilder {
-    public UserTagDefinitionCreationInternalEvent newUserTagDefinitionCreationEvent(final UUID tagDefinitionId, final TagDefinition tagDefinition, final UUID userToken) {
-        return new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
+    public UserTagDefinitionCreationInternalEvent newUserTagDefinitionCreationEvent(final UUID tagDefinitionId, final TagDefinition tagDefinition, final InternalCallContext context) {
+        return new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
     }
 
-    public UserTagDefinitionDeletionInternalEvent newUserTagDefinitionDeletionEvent(final UUID tagDefinitionId, final TagDefinition tagDefinition, final UUID userToken) {
-        return new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
+    public UserTagDefinitionDeletionInternalEvent newUserTagDefinitionDeletionEvent(final UUID tagDefinitionId, final TagDefinition tagDefinition, final InternalCallContext context) {
+        return new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
     }
 
-    public ControlTagDefinitionCreationInternalEvent newControlTagDefinitionCreationEvent(final UUID tagDefinitionId, final TagDefinition tagDefinition, final UUID userToken) {
-        return new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
+    public ControlTagDefinitionCreationInternalEvent newControlTagDefinitionCreationEvent(final UUID tagDefinitionId, final TagDefinition tagDefinition, final InternalCallContext context) {
+        return new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
     }
 
-    public ControlTagDefinitionDeletionInternalEvent newControlTagDefinitionDeletionEvent(final UUID tagDefinitionId, final TagDefinition tagDefinition, final UUID userToken) {
-        return new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
+    public ControlTagDefinitionDeletionInternalEvent newControlTagDefinitionDeletionEvent(final UUID tagDefinitionId, final TagDefinition tagDefinition, final InternalCallContext context) {
+        return new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
     }
 
-    public UserTagCreationInternalEvent newUserTagCreationEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final UUID userToken) {
-        return new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
+    public UserTagCreationInternalEvent newUserTagCreationEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final InternalCallContext context) {
+        return new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
     }
 
-    public UserTagDeletionInternalEvent newUserTagDeletionEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final UUID userToken) {
-        return new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
+    public UserTagDeletionInternalEvent newUserTagDeletionEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final InternalCallContext context) {
+        return new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
     }
 
-    public ControlTagCreationInternalEvent newControlTagCreationEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final UUID userToken) {
-        return new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
+    public ControlTagCreationInternalEvent newControlTagCreationEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final InternalCallContext context) {
+        return new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId());
     }
 
-    public ControlTagDeletionInternalEvent newControlTagDeletionEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final UUID userToken) {
-        return new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
+    public ControlTagDeletionInternalEvent newControlTagDeletionEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final InternalCallContext context) {
+        return new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, context.getUserToken(), context.getAccountRecordId(), context.getTenantRecordId() );
     }
 }
diff --git a/util/src/main/java/com/ning/billing/util/tag/dao/AuditedTagDao.java b/util/src/main/java/com/ning/billing/util/tag/dao/AuditedTagDao.java
index d8e4d0c..f48d6fe 100644
--- a/util/src/main/java/com/ning/billing/util/tag/dao/AuditedTagDao.java
+++ b/util/src/main/java/com/ning/billing/util/tag/dao/AuditedTagDao.java
@@ -33,7 +33,6 @@ import com.ning.billing.ErrorCode;
 import com.ning.billing.util.ChangeType;
 import com.ning.billing.util.api.TagApiException;
 import com.ning.billing.util.api.TagDefinitionApiException;
-import com.ning.billing.util.svcsapi.bus.Bus;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.dao.AuditedCollectionDaoBase;
@@ -44,6 +43,7 @@ import com.ning.billing.util.dao.ObjectType;
 import com.ning.billing.util.dao.TableName;
 import com.ning.billing.util.entity.collection.dao.UpdatableEntityCollectionSqlDao;
 import com.ning.billing.util.events.TagInternalEvent;
+import com.ning.billing.util.svcsapi.bus.Bus;
 import com.ning.billing.util.tag.ControlTagType;
 import com.ning.billing.util.tag.DefaultTagDefinition;
 import com.ning.billing.util.tag.Tag;
@@ -125,9 +125,9 @@ public class AuditedTagDao extends AuditedCollectionDaoBase<Tag, Tag> implements
                 // Post an event to the Bus
                 final TagInternalEvent tagEvent;
                 if (tagDefinition.isControlTag()) {
-                    tagEvent = tagEventBuilder.newControlTagCreationEvent(tag.getId(), objectId, objectType, tagDefinition, context.getUserToken());
+                    tagEvent = tagEventBuilder.newControlTagCreationEvent(tag.getId(), objectId, objectType, tagDefinition, context);
                 } else {
-                    tagEvent = tagEventBuilder.newUserTagCreationEvent(tag.getId(), objectId, objectType, tagDefinition, context.getUserToken());
+                    tagEvent = tagEventBuilder.newUserTagCreationEvent(tag.getId(), objectId, objectType, tagDefinition, context);
                 }
                 try {
                     bus.postFromTransaction(tagEvent, tagSqlDao, context);
@@ -175,9 +175,9 @@ public class AuditedTagDao extends AuditedCollectionDaoBase<Tag, Tag> implements
                     // Post an event to the Bus
                     final TagInternalEvent tagEvent;
                     if (tagDefinition.isControlTag()) {
-                        tagEvent = tagEventBuilder.newControlTagDeletionEvent(tag.getId(), objectId, objectType, tagDefinition, context.getUserToken());
+                        tagEvent = tagEventBuilder.newControlTagDeletionEvent(tag.getId(), objectId, objectType, tagDefinition, context);
                     } else {
-                        tagEvent = tagEventBuilder.newUserTagDeletionEvent(tag.getId(), objectId, objectType, tagDefinition, context.getUserToken());
+                        tagEvent = tagEventBuilder.newUserTagDeletionEvent(tag.getId(), objectId, objectType, tagDefinition, context);
                     }
                     try {
                         bus.postFromTransaction(tagEvent, tagSqlDao, context);
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 1a66af2..f2c73df 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
@@ -30,10 +30,10 @@ import org.slf4j.LoggerFactory;
 
 import com.ning.billing.ErrorCode;
 import com.ning.billing.util.api.TagDefinitionApiException;
-import com.ning.billing.util.svcsapi.bus.Bus;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.events.TagDefinitionInternalEvent;
+import com.ning.billing.util.svcsapi.bus.Bus;
 import com.ning.billing.util.tag.ControlTagType;
 import com.ning.billing.util.tag.DefaultTagDefinition;
 import com.ning.billing.util.tag.TagDefinition;
@@ -139,9 +139,9 @@ public class DefaultTagDefinitionDao implements TagDefinitionDao {
                     // Post an event to the bus
                     final TagDefinitionInternalEvent tagDefinitionEvent;
                     if (tagDefinition.isControlTag()) {
-                        tagDefinitionEvent = tagEventBuilder.newControlTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition, context.getUserToken());
+                        tagDefinitionEvent = tagEventBuilder.newControlTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition, context);
                     } else {
-                        tagDefinitionEvent = tagEventBuilder.newUserTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition, context.getUserToken());
+                        tagDefinitionEvent = tagEventBuilder.newUserTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition, context);
                     }
                     try {
                         bus.postFromTransaction(tagDefinitionEvent, tagDefinitionSqlDao, context);
@@ -194,9 +194,9 @@ public class DefaultTagDefinitionDao implements TagDefinitionDao {
                     // Post an event to the Bus
                     final TagDefinitionInternalEvent tagDefinitionEvent;
                     if (tagDefinition.isControlTag()) {
-                        tagDefinitionEvent = tagEventBuilder.newControlTagDefinitionDeletionEvent(tagDefinition.getId(), tagDefinition, context.getUserToken());
+                        tagDefinitionEvent = tagEventBuilder.newControlTagDefinitionDeletionEvent(tagDefinition.getId(), tagDefinition, context);
                     } else {
-                        tagDefinitionEvent = tagEventBuilder.newUserTagDefinitionDeletionEvent(tagDefinition.getId(), tagDefinition, context.getUserToken());
+                        tagDefinitionEvent = tagEventBuilder.newUserTagDefinitionDeletionEvent(tagDefinition.getId(), tagDefinition, context);
                     }
                     try {
                         bus.postFromTransaction(tagDefinitionEvent, tagDefinitionSqlDao, context);
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 80cd89b..ef28f10 100644
--- a/util/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestBase.java
+++ b/util/src/main/java/com/ning/billing/util/userrequest/CompletionUserRequestBase.java
@@ -20,9 +20,9 @@ import java.util.List;
 import java.util.UUID;
 import java.util.concurrent.TimeoutException;
 
-import com.ning.billing.util.bus.BusEvent;
 import com.ning.billing.util.events.AccountChangeInternalEvent;
 import com.ning.billing.util.events.AccountCreationInternalEvent;
+import com.ning.billing.util.events.BusInternalEvent;
 import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 import com.ning.billing.util.events.InvoiceCreationInternalEvent;
 import com.ning.billing.util.events.NullInvoiceInternalEvent;
@@ -33,7 +33,7 @@ public abstract class CompletionUserRequestBase implements CompletionUserRequest
 
     private static final long NANO_TO_MILLI_SEC = (1000L * 1000L);
 
-    private final List<BusEvent> events;
+    private final List<BusInternalEvent> events;
 
     private final UUID userToken;
     private long timeoutMilliSec;
@@ -43,13 +43,13 @@ public abstract class CompletionUserRequestBase implements CompletionUserRequest
 
 
     public CompletionUserRequestBase(final UUID userToken) {
-        this.events = new LinkedList<BusEvent>();
+        this.events = new LinkedList<BusInternalEvent>();
         this.userToken = userToken;
         this.isCompleted = false;
     }
 
     @Override
-    public List<BusEvent> waitForCompletion(final long timeoutMilliSec) throws InterruptedException, TimeoutException {
+    public List<BusInternalEvent> waitForCompletion(final long timeoutMilliSec) throws InterruptedException, TimeoutException {
 
         this.timeoutMilliSec = timeoutMilliSec;
         initialTimeMilliSec = currentTimeMillis();
@@ -86,7 +86,7 @@ public abstract class CompletionUserRequestBase implements CompletionUserRequest
     }
 
     @Override
-    public void onBusEvent(final BusEvent curEvent) {
+    public void onBusEvent(final BusInternalEvent curEvent) {
         // Check if this is for us..
         if (curEvent.getUserToken() == null ||
                 !curEvent.getUserToken().equals(userToken)) {
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 970ac95..a31d89c 100644
--- a/util/src/test/java/com/ning/billing/mock/MockEffectiveSubscriptionEvent.java
+++ b/util/src/test/java/com/ning/billing/mock/MockEffectiveSubscriptionEvent.java
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright 2010-2011 Ning, Inc.
  *
  * Ning licenses this file to you under the Apache License, version 2.0
@@ -365,4 +365,14 @@ public class MockEffectiveSubscriptionEvent implements EffectiveSubscriptionInte
         return true;
     }
 
+    @Override
+    public Long getTenantRecordId() {
+        return 1L;
+    }
+
+    @Override
+    public Long getAccountRecordId() {
+        return 1L;
+    }
+
 }
diff --git a/util/src/test/java/com/ning/billing/mock/MockSubscription.java b/util/src/test/java/com/ning/billing/mock/MockSubscription.java
index adff078..22608bd 100644
--- a/util/src/test/java/com/ning/billing/mock/MockSubscription.java
+++ b/util/src/test/java/com/ning/billing/mock/MockSubscription.java
@@ -176,26 +176,6 @@ public class MockSubscription implements Subscription {
     }
 
     @Override
-    public EffectiveSubscriptionInternalEvent getPendingTransition() {
-        return sub.getPendingTransition();
-    }
-
-    @Override
-    public EffectiveSubscriptionInternalEvent getPreviousTransition() {
-        return sub.getPreviousTransition();
-    }
-
-    @Override
-    public List<EffectiveSubscriptionInternalEvent> getBillingTransitions() {
-        return transitions;
-    }
-
-    @Override
-    public List<EffectiveSubscriptionInternalEvent> getAllTransitions() {
-        return transitions;
-    }
-
-    @Override
     public DateTime getFutureEndDate() {
         return null;
     }
@@ -232,4 +212,10 @@ public class MockSubscription implements Subscription {
     public void setPlan(final Plan plan) {
         this.plan = plan;
     }
+
+    @Override
+    public Plan getLastActivePlan() {
+        // TODO Auto-generated method stub
+        return null;
+    }
 }
diff --git a/util/src/test/java/com/ning/billing/util/bus/TestEventBusBase.java b/util/src/test/java/com/ning/billing/util/bus/TestEventBusBase.java
index dded4ee..18bf7cb 100644
--- a/util/src/test/java/com/ning/billing/util/bus/TestEventBusBase.java
+++ b/util/src/test/java/com/ning/billing/util/bus/TestEventBusBase.java
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright 2010-2011 Ning, Inc.
  *
  * Ning licenses this file to you under the Apache License, version 2.0
@@ -27,6 +27,7 @@ import org.testng.annotations.BeforeClass;
 import com.ning.billing.util.UtilTestSuiteWithEmbeddedDB;
 import com.ning.billing.util.events.BusInternalEvent;
 import com.ning.billing.util.events.BusInternalEvent.BusEventType;
+import com.ning.billing.util.events.DefaultBusInternalEvent;
 import com.ning.billing.util.svcsapi.bus.Bus;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -51,21 +52,21 @@ public abstract class TestEventBusBase extends UtilTestSuiteWithEmbeddedDB {
         eventBus.stop();
     }
 
-    public static class MyEvent implements BusInternalEvent {
+    public static class MyEvent extends DefaultBusInternalEvent implements BusInternalEvent {
         private final String name;
         private final Long value;
-        private final UUID userToken;
         private final String type;
 
         @JsonCreator
         public MyEvent(@JsonProperty("name") final String name,
                        @JsonProperty("value") final Long value,
                        @JsonProperty("token") final UUID token,
-                       @JsonProperty("type") final String type) {
-
+                       @JsonProperty("type") final String type,
+                       @JsonProperty("accountRecordId") final Long accountRecordId,
+                       @JsonProperty("tenantRecordId") final Long tenantRecordId) {
+            super(token, accountRecordId, tenantRecordId);
             this.name = name;
             this.value = value;
-            this.userToken = token;
             this.type = type;
         }
 
@@ -75,11 +76,6 @@ public abstract class TestEventBusBase extends UtilTestSuiteWithEmbeddedDB {
             return BusEventType.valueOf(type);
         }
 
-        @Override
-        public UUID getUserToken() {
-            return userToken;
-        }
-
         public String getName() {
             return name;
         }
@@ -99,27 +95,29 @@ public abstract class TestEventBusBase extends UtilTestSuiteWithEmbeddedDB {
         public MyEventWithException(@JsonProperty("name") final String name,
                                     @JsonProperty("value") final Long value,
                                     @JsonProperty("token") final UUID token,
-                                    @JsonProperty("type") final String type) {
-            super(name, value, token, type);
+                                    @JsonProperty("type") final String type,
+                                    @JsonProperty("accountRecordId") final Long accountRecordId,
+                                    @JsonProperty("tenantRecordId") final Long tenantRecordId) {
+            super(name, value, token, type, accountRecordId, tenantRecordId);
         }
     }
 
-    public static final class MyOtherEvent implements BusInternalEvent {
+    public static final class MyOtherEvent extends DefaultBusInternalEvent implements BusInternalEvent {
 
         private final String name;
         private final Double value;
-        private final UUID userToken;
         private final String type;
 
         @JsonCreator
         public MyOtherEvent(@JsonProperty("name") final String name,
                             @JsonProperty("value") final Double value,
                             @JsonProperty("token") final UUID token,
-                            @JsonProperty("type") final String type) {
-
+                            @JsonProperty("type") final String type,
+                            @JsonProperty("accountRecordId") final Long accountRecordId,
+                            @JsonProperty("tenantRecordId") final Long tenantRecordId) {
+            super(token, accountRecordId, tenantRecordId);
             this.name = name;
             this.value = value;
-            this.userToken = token;
             this.type = type;
         }
 
@@ -129,10 +127,6 @@ public abstract class TestEventBusBase extends UtilTestSuiteWithEmbeddedDB {
             return BusEventType.valueOf(type);
         }
 
-        @Override
-        public UUID getUserToken() {
-            return userToken;
-        }
 
         public String getName() {
             return name;
@@ -148,6 +142,9 @@ public abstract class TestEventBusBase extends UtilTestSuiteWithEmbeddedDB {
     }
 
     public static class MyEventHandlerException extends RuntimeException {
+
+        private static final long serialVersionUID = 156337823L;
+
         public MyEventHandlerException(final String msg) {
             super(msg);
         }
@@ -202,7 +199,7 @@ public abstract class TestEventBusBase extends UtilTestSuiteWithEmbeddedDB {
             final MyEventHandler handler = new MyEventHandler(1);
             eventBus.register(handler);
 
-            eventBus.post(new MyEventWithException("my-event", 1L, UUID.randomUUID(), BusEventType.ACCOUNT_CHANGE.toString()), internalCallContext);
+            eventBus.post(new MyEventWithException("my-event", 1L, UUID.randomUUID(), BusEventType.ACCOUNT_CHANGE.toString(), 1L, 1L), internalCallContext);
 
             Thread.sleep(50000);
         } catch (Exception ignored) {
@@ -216,7 +213,7 @@ public abstract class TestEventBusBase extends UtilTestSuiteWithEmbeddedDB {
             eventBus.register(handler);
 
             for (int i = 0; i < nbEvents; i++) {
-                eventBus.post(new MyEvent("my-event", (long) i, UUID.randomUUID(), BusEventType.ACCOUNT_CHANGE.toString()), internalCallContext);
+                eventBus.post(new MyEvent("my-event", (long) i, UUID.randomUUID(), BusEventType.ACCOUNT_CHANGE.toString(), 1L, 1L), internalCallContext);
             }
 
             final boolean completed = handler.waitForCompletion(10000);
@@ -232,9 +229,9 @@ public abstract class TestEventBusBase extends UtilTestSuiteWithEmbeddedDB {
             eventBus.register(handler);
 
             for (int i = 0; i < 5; i++) {
-                eventBus.post(new MyOtherEvent("my-other-event", (double) i, UUID.randomUUID(), BusEventType.BUNDLE_REPAIR.toString()), internalCallContext);
+                eventBus.post(new MyOtherEvent("my-other-event", (double) i, UUID.randomUUID(), BusEventType.BUNDLE_REPAIR.toString(), 1L, 1L), internalCallContext);
             }
-            eventBus.post(new MyEvent("my-event", 11l, UUID.randomUUID(), BusEventType.ACCOUNT_CHANGE.toString()), internalCallContext);
+            eventBus.post(new MyEvent("my-event", 11l, UUID.randomUUID(), BusEventType.ACCOUNT_CHANGE.toString(), 1L, 1L), internalCallContext);
 
             final boolean completed = handler.waitForCompletion(10000);
             Assert.assertEquals(completed, true);
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 7731f02..cdc8d5d 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
@@ -41,7 +41,7 @@ public class TestDefaultControlTagCreationEvent extends UtilTestSuite {
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultControlTagCreationEvent event = new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        final DefaultControlTagCreationEvent event = new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L);
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusEventType.CONTROL_TAG_CREATION);
 
         Assert.assertEquals(event.getTagId(), tagId);
@@ -54,9 +54,9 @@ public class TestDefaultControlTagCreationEvent extends UtilTestSuite {
         Assert.assertEquals(event.getUserToken(), userToken);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken));
+        Assert.assertEquals(event, new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken)));
+        Assert.assertTrue(event.equals(new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L)));
     }
 
     @Test(groups = "fast")
@@ -73,7 +73,7 @@ public class TestDefaultControlTagCreationEvent extends UtilTestSuite {
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultControlTagCreationEvent event = new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        final DefaultControlTagCreationEvent event = new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L);
 
         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 5fc9f86..4712be1 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
@@ -37,7 +37,7 @@ public class TestDefaultControlTagDefinitionCreationEvent extends UtilTestSuite 
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultControlTagDefinitionCreationEvent event = new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
+        final DefaultControlTagDefinitionCreationEvent event = new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L);
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusEventType.CONTROL_TAGDEFINITION_CREATION);
 
         Assert.assertEquals(event.getTagDefinitionId(), tagDefinitionId);
@@ -48,9 +48,9 @@ public class TestDefaultControlTagDefinitionCreationEvent extends UtilTestSuite 
         Assert.assertEquals(event.getUserToken(), userToken);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken));
+        Assert.assertEquals(event, new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken)));
+        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L)));
     }
 
     @Test(groups = "fast")
@@ -64,7 +64,7 @@ public class TestDefaultControlTagDefinitionCreationEvent extends UtilTestSuite 
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultControlTagDefinitionCreationEvent event = new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
+        final DefaultControlTagDefinitionCreationEvent event = new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L);
 
         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 d586de3..ab9869a 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
@@ -37,7 +37,7 @@ public class TestDefaultControlTagDefinitionDeletionEvent extends UtilTestSuite 
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultControlTagDefinitionDeletionEvent event = new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
+        final DefaultControlTagDefinitionDeletionEvent event = new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L);
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusEventType.CONTROL_TAGDEFINITION_DELETION);
 
         Assert.assertEquals(event.getTagDefinitionId(), tagDefinitionId);
@@ -48,9 +48,9 @@ public class TestDefaultControlTagDefinitionDeletionEvent extends UtilTestSuite 
         Assert.assertEquals(event.getUserToken(), userToken);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken));
+        Assert.assertEquals(event, new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken)));
+        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L)));
     }
 
     @Test(groups = "fast")
@@ -64,7 +64,7 @@ public class TestDefaultControlTagDefinitionDeletionEvent extends UtilTestSuite 
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultControlTagDefinitionDeletionEvent event = new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
+        final DefaultControlTagDefinitionDeletionEvent event = new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L);
 
         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 04905c3..ab869b7 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
@@ -41,7 +41,7 @@ public class TestDefaultControlTagDeletionEvent extends UtilTestSuite {
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultControlTagDeletionEvent event = new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        final DefaultControlTagDeletionEvent event = new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L);
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusEventType.CONTROL_TAG_DELETION);
 
         Assert.assertEquals(event.getTagId(), tagId);
@@ -54,9 +54,9 @@ public class TestDefaultControlTagDeletionEvent extends UtilTestSuite {
         Assert.assertEquals(event.getUserToken(), userToken);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken));
+        Assert.assertEquals(event, new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken)));
+        Assert.assertTrue(event.equals(new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L)));
     }
 
     @Test(groups = "fast")
@@ -73,7 +73,7 @@ public class TestDefaultControlTagDeletionEvent extends UtilTestSuite {
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultControlTagDeletionEvent event = new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        final DefaultControlTagDeletionEvent event = new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L);
 
         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 31232a6..3a2c428 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
@@ -41,7 +41,7 @@ public class TestDefaultUserTagCreationEvent extends UtilTestSuite {
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultUserTagCreationEvent event = new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        final DefaultUserTagCreationEvent event = new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L);
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusEventType.USER_TAG_CREATION);
 
         Assert.assertEquals(event.getTagId(), tagId);
@@ -54,9 +54,9 @@ public class TestDefaultUserTagCreationEvent extends UtilTestSuite {
         Assert.assertEquals(event.getUserToken(), userToken);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken));
+        Assert.assertEquals(event, new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken)));
+        Assert.assertTrue(event.equals(new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L)));
     }
 
     @Test(groups = "fast")
@@ -73,7 +73,7 @@ public class TestDefaultUserTagCreationEvent extends UtilTestSuite {
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultUserTagCreationEvent event = new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        final DefaultUserTagCreationEvent event = new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L);
 
         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 2a77bef..acbf2ec 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
@@ -37,7 +37,7 @@ public class TestDefaultUserTagDefinitionCreationEvent extends UtilTestSuite {
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultUserTagDefinitionCreationEvent event = new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
+        final DefaultUserTagDefinitionCreationEvent event = new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L);
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusEventType.USER_TAGDEFINITION_CREATION);
 
         Assert.assertEquals(event.getTagDefinitionId(), tagDefinitionId);
@@ -48,9 +48,9 @@ public class TestDefaultUserTagDefinitionCreationEvent extends UtilTestSuite {
         Assert.assertEquals(event.getUserToken(), userToken);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken));
+        Assert.assertEquals(event, new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken)));
+        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L)));
     }
 
     @Test(groups = "fast")
@@ -64,7 +64,7 @@ public class TestDefaultUserTagDefinitionCreationEvent extends UtilTestSuite {
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultUserTagDefinitionCreationEvent event = new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
+        final DefaultUserTagDefinitionCreationEvent event = new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L);
 
         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 fc5f25b..243fc9f 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
@@ -37,7 +37,7 @@ public class TestDefaultUserTagDefinitionDeletionEvent extends UtilTestSuite {
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultUserTagDefinitionDeletionEvent event = new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
+        final DefaultUserTagDefinitionDeletionEvent event = new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L);
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusEventType.USER_TAGDEFINITION_DELETION);
 
         Assert.assertEquals(event.getTagDefinitionId(), tagDefinitionId);
@@ -48,9 +48,9 @@ public class TestDefaultUserTagDefinitionDeletionEvent extends UtilTestSuite {
         Assert.assertEquals(event.getUserToken(), userToken);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken));
+        Assert.assertEquals(event, new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken)));
+        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L)));
     }
 
     @Test(groups = "fast")
@@ -64,7 +64,7 @@ public class TestDefaultUserTagDefinitionDeletionEvent extends UtilTestSuite {
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultUserTagDefinitionDeletionEvent event = new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
+        final DefaultUserTagDefinitionDeletionEvent event = new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L);
 
         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 6870b2c..731021b 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
@@ -41,7 +41,7 @@ public class TestDefaultUserTagDeletionEvent extends UtilTestSuite {
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultUserTagDeletionEvent event = new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        final DefaultUserTagDeletionEvent event = new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L);
         Assert.assertEquals(event.getBusEventType(), BusInternalEvent.BusEventType.USER_TAG_DELETION);
 
         Assert.assertEquals(event.getTagId(), tagId);
@@ -54,9 +54,9 @@ public class TestDefaultUserTagDeletionEvent extends UtilTestSuite {
         Assert.assertEquals(event.getUserToken(), userToken);
 
         Assert.assertEquals(event, event);
-        Assert.assertEquals(event, new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken));
+        Assert.assertEquals(event, new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L));
         Assert.assertTrue(event.equals(event));
-        Assert.assertTrue(event.equals(new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken)));
+        Assert.assertTrue(event.equals(new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L)));
     }
 
     @Test(groups = "fast")
@@ -73,7 +73,7 @@ public class TestDefaultUserTagDeletionEvent extends UtilTestSuite {
         final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
         final UUID userToken = UUID.randomUUID();
 
-        final DefaultUserTagDeletionEvent event = new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        final DefaultUserTagDeletionEvent event = new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L);
 
         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 4116bc7..279af86 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
@@ -47,11 +47,11 @@ public class TestTagEventBuilder extends UtilTestSuite {
         final UUID userToken = UUID.randomUUID();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagDefinitionInternalEvent event = tagEventBuilder.newUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
+        final TagDefinitionInternalEvent event = tagEventBuilder.newUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, internalCallContext);
         Assert.assertTrue(event instanceof UserTagDefinitionCreationInternalEvent);
 
-        Assert.assertEquals(event, new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken));
-        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken)));
+        Assert.assertEquals(event, new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L));
+        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L)));
 
         verifyTagDefinitionEvent(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
     }
@@ -66,11 +66,11 @@ public class TestTagEventBuilder extends UtilTestSuite {
         final UUID userToken = UUID.randomUUID();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagDefinitionInternalEvent event = tagEventBuilder.newUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
+        final TagDefinitionInternalEvent event = tagEventBuilder.newUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, internalCallContext);
         Assert.assertTrue(event instanceof UserTagDefinitionDeletionInternalEvent);
 
-        Assert.assertEquals(event, new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken));
-        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken)));
+        Assert.assertEquals(event, new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L));
+        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L)));
 
         verifyTagDefinitionEvent(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
     }
@@ -85,11 +85,11 @@ public class TestTagEventBuilder extends UtilTestSuite {
         final UUID userToken = UUID.randomUUID();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagDefinitionInternalEvent event = tagEventBuilder.newControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
+        final TagDefinitionInternalEvent event = tagEventBuilder.newControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, internalCallContext);
         Assert.assertTrue(event instanceof ControlTagDefinitionCreationInternalEvent);
 
-        Assert.assertEquals(event, new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken));
-        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken)));
+        Assert.assertEquals(event, new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L));
+        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L)));
 
         verifyTagDefinitionEvent(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
     }
@@ -104,11 +104,11 @@ public class TestTagEventBuilder extends UtilTestSuite {
         final UUID userToken = UUID.randomUUID();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagDefinitionInternalEvent event = tagEventBuilder.newControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
+        final TagDefinitionInternalEvent event = tagEventBuilder.newControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, internalCallContext);
         Assert.assertTrue(event instanceof ControlTagDefinitionDeletionInternalEvent);
 
-        Assert.assertEquals(event, new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken));
-        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken)));
+        Assert.assertEquals(event, new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L));
+        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken, 1L, 1L)));
 
         verifyTagDefinitionEvent(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
     }
@@ -126,11 +126,11 @@ public class TestTagEventBuilder extends UtilTestSuite {
         final UUID userToken = UUID.randomUUID();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagInternalEvent event = tagEventBuilder.newUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        final TagInternalEvent event = tagEventBuilder.newUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, internalCallContext);
         Assert.assertTrue(event instanceof UserTagCreationInternalEvent);
 
-        Assert.assertEquals(event, new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken));
-        Assert.assertTrue(event.equals(new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken)));
+        Assert.assertEquals(event, new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L));
+        Assert.assertTrue(event.equals(new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L)));
 
         verifyTagEvent(tagId, objectId, objectType, tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
     }
@@ -148,11 +148,11 @@ public class TestTagEventBuilder extends UtilTestSuite {
         final UUID userToken = UUID.randomUUID();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagInternalEvent event = tagEventBuilder.newUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        final TagInternalEvent event = tagEventBuilder.newUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, internalCallContext);
         Assert.assertTrue(event instanceof UserTagDeletionInternalEvent);
 
-        Assert.assertEquals(event, new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken));
-        Assert.assertTrue(event.equals(new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken)));
+        Assert.assertEquals(event, new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L));
+        Assert.assertTrue(event.equals(new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L)));
 
         verifyTagEvent(tagId, objectId, objectType, tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
     }
@@ -170,11 +170,11 @@ public class TestTagEventBuilder extends UtilTestSuite {
         final UUID userToken = UUID.randomUUID();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagInternalEvent event = tagEventBuilder.newControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        final TagInternalEvent event = tagEventBuilder.newControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, internalCallContext);
         Assert.assertTrue(event instanceof ControlTagCreationInternalEvent);
 
-        Assert.assertEquals(event, new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken));
-        Assert.assertTrue(event.equals(new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken)));
+        Assert.assertEquals(event, new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L));
+        Assert.assertTrue(event.equals(new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L)));
 
         verifyTagEvent(tagId, objectId, objectType, tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
     }
@@ -192,11 +192,11 @@ public class TestTagEventBuilder extends UtilTestSuite {
         final UUID userToken = UUID.randomUUID();
 
         final TagEventBuilder tagEventBuilder = new TagEventBuilder();
-        final TagInternalEvent event = tagEventBuilder.newControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        final TagInternalEvent event = tagEventBuilder.newControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, internalCallContext);
         Assert.assertTrue(event instanceof ControlTagDeletionInternalEvent);
 
-        Assert.assertEquals(event, new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken));
-        Assert.assertTrue(event.equals(new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken)));
+        Assert.assertEquals(event, new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L));
+        Assert.assertTrue(event.equals(new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken, 1L, 1L)));
 
         verifyTagEvent(tagId, objectId, objectType, tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
     }