killbill-aplcache

Changes

Details

diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountTimelineJson.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountTimelineJson.java
index 9f5269f..09ddbed 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountTimelineJson.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountTimelineJson.java
@@ -27,6 +27,8 @@ import java.util.UUID;
 import javax.annotation.Nullable;
 
 import com.ning.billing.account.api.Account;
+import com.ning.billing.entitlement.api.Subscription;
+import com.ning.billing.entitlement.api.SubscriptionBundle;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoiceItemType;
@@ -64,7 +66,7 @@ public class AccountTimelineJson {
         this.payments = payments;
     }
 
-    private String getBundleExternalKey(final UUID invoiceId, final List<Invoice> invoices, final List<BundleBaseTimeline> bundles) {
+    private String getBundleExternalKey(final UUID invoiceId, final List<Invoice> invoices, final List<SubscriptionBundle> bundles) {
         for (final Invoice cur : invoices) {
             if (cur.getId().equals(invoiceId)) {
                 return getBundleExternalKey(cur, bundles);
@@ -73,7 +75,7 @@ public class AccountTimelineJson {
         return null;
     }
 
-    private String getBundleExternalKey(final Invoice invoice, final List<BundleBaseTimeline> bundles) {
+    private String getBundleExternalKey(final Invoice invoice, final List<SubscriptionBundle> bundles) {
         final Set<UUID> b = new HashSet<UUID>();
         for (final InvoiceItem cur : invoice.getInvoiceItems()) {
             b.add(cur.getBundleId());
@@ -81,7 +83,7 @@ public class AccountTimelineJson {
         boolean first = true;
         final StringBuilder tmp = new StringBuilder();
         for (final UUID cur : b) {
-            for (final BundleBaseTimeline bt : bundles) {
+            for (final SubscriptionBundle bt : bundles) {
                 if (bt.getId().equals(cur)) {
                     if (!first) {
                         tmp.append(",");
@@ -95,8 +97,10 @@ public class AccountTimelineJson {
         return tmp.toString();
     }
 
+
+
     public AccountTimelineJson(final Account account, final List<Invoice> invoices, final List<Payment> payments,
-                               final List<BundleBaseTimeline> bundlesTimeline, final Multimap<UUID, Refund> refundsByPayment,
+                               final List<SubscriptionBundle> bundlesTimeline, final Multimap<UUID, Refund> refundsByPayment,
                                final Multimap<UUID, InvoicePayment> chargebacksByPayment, @Nullable final AuditLogsForInvoices invoicesAuditLogs,
                                @Nullable final AuditLogsForPayments paymentsAuditLogs, @Nullable final AuditLogsForRefunds refundsAuditLogs,
                                @Nullable final AuditLogsForInvoicePayments chargebacksAuditLogs, @Nullable final AuditLogsForBundles bundlesAuditLogs) {
@@ -111,7 +115,7 @@ public class AccountTimelineJson {
              bundlesAuditLogs == null ? ImmutableMap.<UUID, List<AuditLog>>of() : bundlesAuditLogs.getSubscriptionEventsAuditLogs());
     }
 
-    public AccountTimelineJson(final Account account, final List<Invoice> invoices, final List<Payment> payments, final List<BundleBaseTimeline> bundles,
+    public AccountTimelineJson(final Account account, final List<Invoice> invoices, final List<Payment> payments, final List<SubscriptionBundle> bundles,
                                final Multimap<UUID, Refund> refundsByPayment, final Multimap<UUID, InvoicePayment> chargebacksByPayment,
                                final Map<UUID, List<AuditLog>> invoiceAuditLogs, final Map<UUID, List<AuditLog>> invoiceItemsAuditLogs,
                                final Map<UUID, List<AuditLog>> paymentsAuditLogs, final Map<UUID, List<AuditLog>> refundsAuditLogs,
@@ -119,7 +123,7 @@ public class AccountTimelineJson {
                                final Map<UUID, List<AuditLog>> subscriptionsAuditLogs, final Map<UUID, List<AuditLog>> subscriptionEventsAuditLogs) {
         this.account = new AccountJsonSimple(account.getId().toString(), account.getExternalKey());
         this.bundles = new LinkedList<BundleJsonWithSubscriptions>();
-        for (final BundleBaseTimeline bundle : bundles) {
+        for (final SubscriptionBundle bundle : bundles) {
             final List<AuditLog> bundleAuditLogs = bundlesAuditLogs.get(bundle.getId());
             final BundleJsonWithSubscriptions jsonWithSubscriptions = new BundleJsonWithSubscriptions(bundle, bundleAuditLogs,
                                                                                                       subscriptionsAuditLogs, subscriptionEventsAuditLogs);
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/BundleJsonWithSubscriptions.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/BundleJsonWithSubscriptions.java
index 6bf5e1e..d019836 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/BundleJsonWithSubscriptions.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/BundleJsonWithSubscriptions.java
@@ -23,12 +23,18 @@ import java.util.UUID;
 
 import javax.annotation.Nullable;
 
+import com.ning.billing.entitlement.api.Subscription;
+import com.ning.billing.entitlement.api.SubscriptionBundle;
+import com.ning.billing.entitlement.api.SubscriptionBundleTimeline.SubscriptionEvent;
 import com.ning.billing.subscription.api.timeline.BundleBaseTimeline;
 import com.ning.billing.subscription.api.timeline.SubscriptionBaseTimeline;
 import com.ning.billing.util.audit.AuditLog;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.ImmutableList;
 
 public class BundleJsonWithSubscriptions extends BundleJsonSimple {
 
@@ -48,16 +54,21 @@ public class BundleJsonWithSubscriptions extends BundleJsonSimple {
         return subscriptions;
     }
 
-    public BundleJsonWithSubscriptions(final BundleBaseTimeline bundle, final List<AuditLog> auditLogs,
+    public BundleJsonWithSubscriptions(final SubscriptionBundle bundle, final List<AuditLog> auditLogs,
                                        final Map<UUID, List<AuditLog>> subscriptionsAuditLogs, final Map<UUID, List<AuditLog>> subscriptionEventsAuditLogs) {
         super(bundle.getId(), bundle.getExternalKey(), auditLogs);
         this.subscriptions = new LinkedList<EntitlementJsonWithEvents>();
-        for (final SubscriptionBaseTimeline subscriptionTimeline : bundle.getSubscriptions()) {
-            // STEPH_ENT
-            /*
-            this.subscriptions.add(new EntitlementJsonWithEvents(bundle.getId(), subscriptionTimeline,
-                                                                  subscriptionsAuditLogs.get(subscriptionTimeline.getId()), subscriptionEventsAuditLogs));
-        */
+        for (final Subscription cur : bundle.getSubscriptions()) {
+
+            final ImmutableList<SubscriptionEvent> events =  ImmutableList.<SubscriptionEvent>copyOf(Collections2.filter(bundle.getTimeline().getSubscriptionEvents(), new Predicate<SubscriptionEvent>() {
+                @Override
+                public boolean apply(@Nullable final SubscriptionEvent input) {
+                    return input.getEntitlementId().equals(cur.getId());
+                }
+            }));
+            this.subscriptions.add(new EntitlementJsonWithEvents(cur,
+                                                                 events,
+                                                                 subscriptionsAuditLogs.get(cur.getId()), subscriptionEventsAuditLogs));
         }
     }
 
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/EntitlementJsonWithEvents.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/EntitlementJsonWithEvents.java
index 0b5ea1d..69f3d7a 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/EntitlementJsonWithEvents.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/EntitlementJsonWithEvents.java
@@ -16,13 +16,22 @@
 
 package com.ning.billing.jaxrs.json;
 
+import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
+import java.util.UUID;
 
 import javax.annotation.Nullable;
 
-import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
 
-import com.ning.billing.clock.DefaultClock;
+import com.ning.billing.catalog.api.BillingPeriod;
+import com.ning.billing.catalog.api.PlanPhase;
+import com.ning.billing.catalog.api.PriceList;
+import com.ning.billing.catalog.api.Product;
+import com.ning.billing.entitlement.api.Subscription;
+import com.ning.billing.entitlement.api.SubscriptionBundleTimeline.SubscriptionEvent;
+import com.ning.billing.util.audit.AuditLog;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -38,13 +47,13 @@ public class EntitlementJsonWithEvents extends EntitlementJsonSimple {
     public static class SubscriptionReadEventJson extends SubscriptionBaseEventJson {
 
         private final String eventId;
-        private final DateTime effectiveDate;
+        private final LocalDate effectiveDate;
 
         @JsonCreator
         public SubscriptionReadEventJson(@JsonProperty("eventId") final String eventId,
                                          @JsonProperty("billingPeriod") final String billingPeriod,
-                                         @JsonProperty("requestedDt") final DateTime requestedDate,
-                                         @JsonProperty("effectiveDt") final DateTime effectiveDate,
+                                         @JsonProperty("requestedDt") final LocalDate requestedDate,
+                                         @JsonProperty("effectiveDt") final LocalDate effectiveDate,
                                          @JsonProperty("product") final String product,
                                          @JsonProperty("priceList") final String priceList,
                                          @JsonProperty("eventType") final String eventType,
@@ -59,8 +68,8 @@ public class EntitlementJsonWithEvents extends EntitlementJsonSimple {
             return eventId;
         }
 
-        public DateTime getEffectiveDate() {
-            return DefaultClock.toUTCDateTime(effectiveDate);
+        public LocalDate getEffectiveDate() {
+            return effectiveDate;
         }
 
         @Override
@@ -110,8 +119,8 @@ public class EntitlementJsonWithEvents extends EntitlementJsonSimple {
         @JsonCreator
         public SubscriptionDeletedEventJson(@JsonProperty("eventId") final String eventId,
                                             @JsonProperty("billingPeriod") final String billingPeriod,
-                                            @JsonProperty("requestedDate") final DateTime requestedDate,
-                                            @JsonProperty("effectiveDate") final DateTime effectiveDate,
+                                            @JsonProperty("requestedDate") final LocalDate requestedDate,
+                                            @JsonProperty("effectiveDate") final LocalDate effectiveDate,
                                             @JsonProperty("product") final String product,
                                             @JsonProperty("priceList") final String priceList,
                                             @JsonProperty("eventType") final String eventType,
@@ -125,7 +134,7 @@ public class EntitlementJsonWithEvents extends EntitlementJsonSimple {
 
         @JsonCreator
         public SubscriptionNewEventJson(@JsonProperty("billingPeriod") final String billingPeriod,
-                                        @JsonProperty("requestedDate") final DateTime requestedDate,
+                                        @JsonProperty("requestedDate") final LocalDate requestedDate,
                                         @JsonProperty("product") final String product,
                                         @JsonProperty("priceList") final String priceList,
                                         @JsonProperty("eventType") final String eventType,
@@ -150,7 +159,7 @@ public class EntitlementJsonWithEvents extends EntitlementJsonSimple {
     public abstract static class SubscriptionBaseEventJson extends JsonBase {
 
         private final String billingPeriod;
-        private final DateTime requestedDate;
+        private final LocalDate requestedDate;
         private final String product;
         private final String priceList;
         private final String eventType;
@@ -158,7 +167,7 @@ public class EntitlementJsonWithEvents extends EntitlementJsonSimple {
 
         @JsonCreator
         public SubscriptionBaseEventJson(@JsonProperty("billingPeriod") final String billingPeriod,
-                                         @JsonProperty("requestedDate") final DateTime requestedDate,
+                                         @JsonProperty("requestedDate") final LocalDate requestedDate,
                                          @JsonProperty("product") final String product,
                                          @JsonProperty("priceList") final String priceList,
                                          @JsonProperty("eventType") final String eventType,
@@ -166,7 +175,7 @@ public class EntitlementJsonWithEvents extends EntitlementJsonSimple {
                                          @JsonProperty("auditLogs") @Nullable final List<AuditLogJson> auditLogs) {
             super(auditLogs);
             this.billingPeriod = billingPeriod;
-            this.requestedDate = DefaultClock.toUTCDateTime(requestedDate);
+            this.requestedDate = requestedDate;
             this.product = product;
             this.priceList = priceList;
             this.eventType = eventType;
@@ -177,8 +186,8 @@ public class EntitlementJsonWithEvents extends EntitlementJsonSimple {
             return billingPeriod;
         }
 
-        public DateTime getRequestedDate() {
-            return DefaultClock.toUTCDateTime(requestedDate);
+        public LocalDate getRequestedDate() {
+            return requestedDate;
         }
 
         public String getProduct() {
@@ -271,33 +280,32 @@ public class EntitlementJsonWithEvents extends EntitlementJsonSimple {
         this.newEvents = newEvents;
     }
 
-    /*
 
-    STEPH_ENT
-
-    public EntitlementJsonWithEvents(final SubscriptionBase data,
-                                      @Nullable final List<SubscriptionReadEventJson> events,
-                                      @Nullable final List<SubscriptionNewEventJson> newEvents,
-                                      @Nullable final List<SubscriptionDeletedEventJson> deletedEvents,
-                                      @Nullable final List<AuditLog> auditLogs) {
-        this(data.getId().toString(), events, newEvents, deletedEvents, toAuditLogJson(auditLogs));
-    }
-
-    public EntitlementJsonWithEvents(final UUID accountId, final UUID bundleId, final UUID entitlementId, final SubscriptionBaseTimeline input,
-                                      final List<AuditLog> bundleAuditLogs, final Map<UUID, List<AuditLog>> subscriptionEventsAuditLogs) {
-        super(input. input.getId().toString(), toAuditLogJson(bundleAuditLogs));
+    public EntitlementJsonWithEvents(final Subscription input,
+                                     final List<SubscriptionEvent> subscriptionEvents,
+                                     final List<AuditLog> bundleAuditLogs, final Map<UUID, List<AuditLog>> subscriptionEventsAuditLogs) {
+        super(input.getAccountId().toString(), input.getBundleId().toString(), input.getId().toString(), input.getExternalKey(), toAuditLogJson(bundleAuditLogs));
 
         this.events = new LinkedList<SubscriptionReadEventJson>();
-        for (final ExistingEvent event : input.getExistingEvents()) {
-            final PlanPhaseSpecifier spec = event.getPlanPhaseSpecifier();
-            this.events.add(new SubscriptionReadEventJson(event.getEventId().toString(), spec.getBillingPeriod().toString(), event.getRequestedDate(), event.getEffectiveDate(),
-                                                          spec.getProductName(), spec.getPriceListName(), event.getSubscriptionTransitionType().toString(), spec.getPhaseType().toString(),
-                                                          toAuditLogJson(subscriptionEventsAuditLogs.get(event.getEventId()))));
+        for (SubscriptionEvent cur : subscriptionEvents) {
+            final String eventId = cur.getId().toString();
+            final BillingPeriod billingPeriod = cur.getNextBillingPeriod() != null ? cur.getNextBillingPeriod() : cur.getPrevBillingPeriod();
+            final Product product = cur.getNextProduct() != null ? cur.getNextProduct() : cur.getPrevProduct();
+            final PriceList priceList = cur.getNextPriceList() != null ? cur.getNextPriceList() : cur.getPrevPriceList();
+            final PlanPhase phase = cur.getNextPhase() != null ? cur.getNextPhase() : cur.getPrevPhase();
+            this.events.add(new SubscriptionReadEventJson(cur.getId().toString(),
+                                                          billingPeriod != null ? billingPeriod.toString() : null,
+                                                          cur.getRequestedDate(),
+                                                          cur.getEffectiveDate(),
+                                                          product != null ? product.toString() : null,
+                                                          priceList != null ? priceList.getName() : null,
+                                                          cur.getSubscriptionEventType().toString(),
+                                                          phase != null ? phase.getName() : null,
+                                                          toAuditLogJson(subscriptionEventsAuditLogs.get(cur.getId()))));
         }
         this.newEvents = null;
         this.deletedEvents = null;
     }
-    */
 
 
     public List<SubscriptionReadEventJson> getEvents() {
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleJsonWithSubscriptions.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleJsonWithSubscriptions.java
index d747917..c26f967 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleJsonWithSubscriptions.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleJsonWithSubscriptions.java
@@ -99,9 +99,9 @@ public class TestBundleJsonWithSubscriptions extends JaxrsTestSuiteNoDB {
         Mockito.when(bundleBaseTimeline.getExternalKey()).thenReturn(externalKey);
         Mockito.when(bundleBaseTimeline.getSubscriptions()).thenReturn(ImmutableList.<SubscriptionBaseTimeline>of(subscriptionTimeline));
 
-        final BundleJsonWithSubscriptions bundleJsonWithSubscriptions = new BundleJsonWithSubscriptions(bundleBaseTimeline, null,
+        final BundleJsonWithSubscriptions bundleJsonWithSubscriptions = null; /* STEPH_ENT new BundleJsonWithSubscriptions(bundleBaseTimeline, null,
                                                                                                         ImmutableMap.<UUID, List<AuditLog>>of(),
-                                                                                                        ImmutableMap.<UUID, List<AuditLog>>of());
+                                                                                                        ImmutableMap.<UUID, List<AuditLog>>of()); */
         Assert.assertEquals(bundleJsonWithSubscriptions.getBundleId(), bundleId.toString());
         Assert.assertEquals(bundleJsonWithSubscriptions.getExternalKey(), externalKey);
         Assert.assertEquals(bundleJsonWithSubscriptions.getSubscriptions().size(), 1);
@@ -123,9 +123,9 @@ public class TestBundleJsonWithSubscriptions extends JaxrsTestSuiteNoDB {
         Mockito.when(bundle.getId()).thenReturn(bundleId);
         Mockito.when(bundle.getExternalKey()).thenReturn(externalKey);
 
-        final BundleJsonWithSubscriptions bundleJsonWithSubscriptions = new BundleJsonWithSubscriptions(bundle, null,
+        final BundleJsonWithSubscriptions bundleJsonWithSubscriptions = null; /* new BundleJsonWithSubscriptions(bundle, null,
                                                                                                         ImmutableMap.<UUID, List<AuditLog>>of(),
-                                                                                                        ImmutableMap.<UUID, List<AuditLog>>of());
+                                                                                                        ImmutableMap.<UUID, List<AuditLog>>of()); */
         Assert.assertEquals(bundleJsonWithSubscriptions.getBundleId(), bundleId.toString());
         Assert.assertEquals(bundleJsonWithSubscriptions.getExternalKey(), externalKey);
         Assert.assertEquals(bundleJsonWithSubscriptions.getSubscriptions().size(), 0);
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestSubscriptionJsonWithEvents.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestSubscriptionJsonWithEvents.java
index fc2d3af..e8856a8 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestSubscriptionJsonWithEvents.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestSubscriptionJsonWithEvents.java
@@ -50,8 +50,8 @@ public class TestSubscriptionJsonWithEvents extends JaxrsTestSuiteNoDB {
         final List<AuditLogJson> auditLogs = createAuditLogsJson(clock.getUTCNow());
         final EntitlementJsonWithEvents.SubscriptionReadEventJson newEvent = new EntitlementJsonWithEvents.SubscriptionReadEventJson(eventId.toString(),
                                                                                                                                        BillingPeriod.NO_BILLING_PERIOD.toString(),
-                                                                                                                                       requestedDate,
-                                                                                                                                       effectiveDate,
+                                                                                                                                       requestedDate.toLocalDate(),
+                                                                                                                                       effectiveDate.toLocalDate(),
                                                                                                                                        UUID.randomUUID().toString(),
                                                                                                                                        UUID.randomUUID().toString(),
                                                                                                                                        SubscriptionBaseTransitionType.CREATE.toString(),
@@ -78,8 +78,8 @@ public class TestSubscriptionJsonWithEvents extends JaxrsTestSuiteNoDB {
         final List<AuditLogJson> auditLogs = createAuditLogsJson(clock.getUTCNow());
         final EntitlementJsonWithEvents.SubscriptionReadEventJson newEvent = new EntitlementJsonWithEvents.SubscriptionReadEventJson(eventId.toString(),
                                                                                                                                        BillingPeriod.NO_BILLING_PERIOD.toString(),
-                                                                                                                                       requestedDate,
-                                                                                                                                       effectiveDate,
+                                                                                                                                       requestedDate.toLocalDate(),
+                                                                                                                                       effectiveDate.toLocalDate(),
                                                                                                                                        UUID.randomUUID().toString(),
                                                                                                                                        UUID.randomUUID().toString(),
                                                                                                                                        SubscriptionBaseTransitionType.CREATE.toString(),
diff --git a/subscription/src/main/java/com/ning/billing/subscription/alignment/MigrationPlanAligner.java b/subscription/src/main/java/com/ning/billing/subscription/alignment/MigrationPlanAligner.java
index 196d7a9..464a1ee 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/alignment/MigrationPlanAligner.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/alignment/MigrationPlanAligner.java
@@ -27,7 +27,7 @@ import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.subscription.api.migration.SubscriptionBaseMigrationApi.SubscriptionMigrationCase;
 import com.ning.billing.subscription.api.migration.SubscriptionBaseMigrationApiException;
-import com.ning.billing.subscription.events.SubscriptionEvent.EventType;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent.EventType;
 import com.ning.billing.subscription.events.user.ApiEventType;
 
 import com.google.inject.Inject;
diff --git a/subscription/src/main/java/com/ning/billing/subscription/alignment/TimedMigration.java b/subscription/src/main/java/com/ning/billing/subscription/alignment/TimedMigration.java
index 1482316..eb01c51 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/alignment/TimedMigration.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/alignment/TimedMigration.java
@@ -20,7 +20,7 @@ import org.joda.time.DateTime;
 
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
-import com.ning.billing.subscription.events.SubscriptionEvent.EventType;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent.EventType;
 import com.ning.billing.subscription.events.user.ApiEventType;
 
 public class TimedMigration {
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/migration/AccountMigrationData.java b/subscription/src/main/java/com/ning/billing/subscription/api/migration/AccountMigrationData.java
index 5bc1fed..15074b8 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/migration/AccountMigrationData.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/migration/AccountMigrationData.java
@@ -23,7 +23,7 @@ import org.joda.time.DateTime;
 import com.ning.billing.subscription.api.user.SubscriptionBuilder;
 import com.ning.billing.subscription.api.user.DefaultSubscriptionBaseBundle;
 import com.ning.billing.subscription.api.user.DefaultSubscriptionBase;
-import com.ning.billing.subscription.events.SubscriptionEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
 
 
 public class AccountMigrationData {
@@ -63,10 +63,10 @@ public class AccountMigrationData {
     public static class SubscriptionMigrationData {
 
         private final DefaultSubscriptionBase data;
-        private final List<SubscriptionEvent> initialEvents;
+        private final List<SubscriptionBaseEvent> initialEvents;
 
         public SubscriptionMigrationData(final DefaultSubscriptionBase data,
-                                         final List<SubscriptionEvent> initialEvents,
+                                         final List<SubscriptionBaseEvent> initialEvents,
                                          final DateTime ctd) {
             super();
             // Set CTD to subscription object from MIGRATION_BILLING event
@@ -82,7 +82,7 @@ public class AccountMigrationData {
             return data;
         }
 
-        public List<SubscriptionEvent> getInitialEvents() {
+        public List<SubscriptionBaseEvent> getInitialEvents() {
             return initialEvents;
         }
     }
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/migration/DefaultSubscriptionBaseMigrationApi.java b/subscription/src/main/java/com/ning/billing/subscription/api/migration/DefaultSubscriptionBaseMigrationApi.java
index 728659c..3319348 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/migration/DefaultSubscriptionBaseMigrationApi.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/migration/DefaultSubscriptionBaseMigrationApi.java
@@ -38,8 +38,8 @@ import com.ning.billing.subscription.api.user.DefaultSubscriptionBase;
 import com.ning.billing.subscription.api.user.DefaultSubscriptionBaseBundle;
 import com.ning.billing.subscription.api.user.SubscriptionBuilder;
 import com.ning.billing.subscription.engine.dao.SubscriptionDao;
-import com.ning.billing.subscription.events.SubscriptionEvent;
-import com.ning.billing.subscription.events.SubscriptionEvent.EventType;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent.EventType;
 import com.ning.billing.subscription.events.phase.PhaseEvent;
 import com.ning.billing.subscription.events.phase.PhaseEventData;
 import com.ning.billing.subscription.events.user.ApiEvent;
@@ -138,7 +138,7 @@ public class DefaultSubscriptionBaseMigrationApi extends SubscriptionApiBase imp
             throws SubscriptionBaseMigrationApiException {
         final TimedMigration[] events = migrationAligner.getEventsMigration(input, now);
         final DateTime migrationStartDate = events[0].getEventTime();
-        final List<SubscriptionEvent> emptyEvents = Collections.emptyList();
+        final List<SubscriptionBaseEvent> emptyEvents = Collections.emptyList();
         final DefaultSubscriptionBase defaultSubscriptionBase = createSubscriptionForApiUse(new SubscriptionBuilder()
                                                                                       .setId(UUID.randomUUID())
                                                                                       .setBundleId(bundleId)
@@ -154,7 +154,7 @@ public class DefaultSubscriptionBaseMigrationApi extends SubscriptionApiBase imp
             throws SubscriptionBaseMigrationApiException {
         final TimedMigration[] events = migrationAligner.getEventsMigration(input, now);
         final DateTime migrationStartDate = events[0].getEventTime();
-        final List<SubscriptionEvent> emptyEvents = Collections.emptyList();
+        final List<SubscriptionBaseEvent> emptyEvents = Collections.emptyList();
         final DefaultSubscriptionBase defaultSubscriptionBase = createSubscriptionForApiUse(new SubscriptionBuilder()
                                                                                       .setId(UUID.randomUUID())
                                                                                       .setBundleId(bundleId)
@@ -165,14 +165,14 @@ public class DefaultSubscriptionBaseMigrationApi extends SubscriptionApiBase imp
         return new SubscriptionMigrationData(defaultSubscriptionBase, toEvents(defaultSubscriptionBase, now, ctd, events, context), ctd);
     }
 
-    private List<SubscriptionEvent> toEvents(final DefaultSubscriptionBase defaultSubscriptionBase, final DateTime now, final DateTime ctd, final TimedMigration[] migrationEvents, final CallContext context) {
+    private List<SubscriptionBaseEvent> toEvents(final DefaultSubscriptionBase defaultSubscriptionBase, final DateTime now, final DateTime ctd, final TimedMigration[] migrationEvents, final CallContext context) {
 
 
         if (ctd == null) {
             throw new SubscriptionBaseError(String.format("Could not create migration billing event ctd = %s", ctd));
         }
 
-        final List<SubscriptionEvent> events = new ArrayList<SubscriptionEvent>(migrationEvents.length);
+        final List<SubscriptionBaseEvent> events = new ArrayList<SubscriptionBaseEvent>(migrationEvents.length);
 
         ApiEventMigrateBilling apiEventMigrateBilling = null;
 
@@ -238,8 +238,8 @@ public class DefaultSubscriptionBaseMigrationApi extends SubscriptionApiBase imp
             events.add(apiEventMigrateBilling);
         }
 
-        Collections.sort(events, new Comparator<SubscriptionEvent>() {
-            int compForApiType(final SubscriptionEvent o1, final SubscriptionEvent o2, final ApiEventType type) {
+        Collections.sort(events, new Comparator<SubscriptionBaseEvent>() {
+            int compForApiType(final SubscriptionBaseEvent o1, final SubscriptionBaseEvent o2, final ApiEventType type) {
                 ApiEventType apiO1 = null;
                 if (o1.getType() == EventType.API_USER) {
                     apiO1 = ((ApiEvent) o1).getEventType();
@@ -258,7 +258,7 @@ public class DefaultSubscriptionBaseMigrationApi extends SubscriptionApiBase imp
             }
 
             @Override
-            public int compare(final SubscriptionEvent o1, final SubscriptionEvent o2) {
+            public int compare(final SubscriptionBaseEvent o1, final SubscriptionBaseEvent o2) {
 
                 int comp = o1.getEffectiveDate().compareTo(o2.getEffectiveDate());
                 if (comp == 0) {
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/SubscriptionApiBase.java b/subscription/src/main/java/com/ning/billing/subscription/api/SubscriptionApiBase.java
index 2457501..79c69b8 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/SubscriptionApiBase.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/SubscriptionApiBase.java
@@ -23,7 +23,7 @@ import com.ning.billing.catalog.api.CatalogService;
 import com.ning.billing.subscription.api.user.DefaultSubscriptionBase;
 import com.ning.billing.subscription.api.user.SubscriptionBuilder;
 import com.ning.billing.subscription.engine.dao.SubscriptionDao;
-import com.ning.billing.subscription.events.SubscriptionEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
 import com.ning.billing.clock.Clock;
 
 import com.google.common.base.Function;
@@ -57,7 +57,7 @@ public class SubscriptionApiBase {
         return new DefaultSubscriptionBase((DefaultSubscriptionBase) internalSubscription, apiService, clock);
     }
 
-    protected DefaultSubscriptionBase createSubscriptionForApiUse(SubscriptionBuilder builder, List<SubscriptionEvent> events) {
+    protected DefaultSubscriptionBase createSubscriptionForApiUse(SubscriptionBuilder builder, List<SubscriptionBaseEvent> events) {
         final DefaultSubscriptionBase subscription = new DefaultSubscriptionBase(builder, apiService, clock);
         if (events.size() > 0) {
             subscription.rebuildTransitions(events, catalogService.getFullCatalog());
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/timeline/DefaultSubscriptionBaseTimeline.java b/subscription/src/main/java/com/ning/billing/subscription/api/timeline/DefaultSubscriptionBaseTimeline.java
index 2988a79..8aa343b 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/timeline/DefaultSubscriptionBaseTimeline.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/timeline/DefaultSubscriptionBaseTimeline.java
@@ -34,7 +34,7 @@ import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.subscription.api.SubscriptionBaseTransitionType;
 import com.ning.billing.subscription.api.user.SubscriptionBaseTransitionData;
-import com.ning.billing.subscription.events.SubscriptionEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
 import com.ning.billing.subscription.events.phase.PhaseEvent;
 import com.ning.billing.subscription.events.user.ApiEvent;
 import com.ning.billing.subscription.events.user.ApiEventType;
@@ -78,7 +78,7 @@ public class DefaultSubscriptionBaseTimeline implements SubscriptionBaseTimeline
         this.activeVersion = input.getActiveVersion();
     }
 
-    private List<ExistingEvent> toExistingEvents(final Catalog catalog, final long activeVersion, final ProductCategory category, final List<SubscriptionEvent> events)
+    private List<ExistingEvent> toExistingEvents(final Catalog catalog, final long activeVersion, final ProductCategory category, final List<SubscriptionBaseEvent> events)
             throws CatalogApiException {
 
         final List<ExistingEvent> result = new LinkedList<SubscriptionBaseTimeline.ExistingEvent>();
@@ -90,7 +90,7 @@ public class DefaultSubscriptionBaseTimeline implements SubscriptionBaseTimeline
 
         DateTime startDate = null;
 
-        for (final SubscriptionEvent cur : events) {
+        for (final SubscriptionBaseEvent cur : events) {
 
             // First active event is used to figure out which catalog version to use.
             //startDate = (startDate == null && cur.getActiveVersion() == activeVersion) ?  cur.getEffectiveDate() : startDate;
@@ -180,7 +180,7 @@ public class DefaultSubscriptionBaseTimeline implements SubscriptionBaseTimeline
 
     /*
 
-    private List<ExistingEvent> toExistingEvents(final Catalog catalog, final long processingVersion, final ProductCategory category, final List<SubscriptionEvent> events, List<ExistingEvent> result)
+    private List<ExistingEvent> toExistingEvents(final Catalog catalog, final long processingVersion, final ProductCategory category, final List<SubscriptionBaseEvent> events, List<ExistingEvent> result)
         throws CatalogApiException {
 
 
@@ -191,7 +191,7 @@ public class DefaultSubscriptionBaseTimeline implements SubscriptionBaseTimeline
 
         DateTime startDate = null;
 
-        for (final SubscriptionEvent cur : events) {
+        for (final SubscriptionBaseEvent cur : events) {
 
             if (processingVersion != cur.getActiveVersion()) {
                 continue;
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/timeline/DefaultSubscriptionBaseTimelineApi.java b/subscription/src/main/java/com/ning/billing/subscription/api/timeline/DefaultSubscriptionBaseTimelineApi.java
index 68f9936..c9b2098 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/timeline/DefaultSubscriptionBaseTimelineApi.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/timeline/DefaultSubscriptionBaseTimelineApi.java
@@ -45,7 +45,7 @@ import com.ning.billing.subscription.api.user.DefaultSubscriptionBase;
 import com.ning.billing.subscription.api.user.SubscriptionBaseTransitionData;
 import com.ning.billing.subscription.engine.addon.AddonUtils;
 import com.ning.billing.subscription.engine.dao.SubscriptionDao;
-import com.ning.billing.subscription.events.SubscriptionEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
 import com.ning.billing.subscription.glue.DefaultSubscriptionModule;
 import com.ning.billing.subscription.api.timeline.SubscriptionBaseTimeline.NewEvent;
 import com.ning.billing.subscription.api.SubscriptionBase;
@@ -171,7 +171,7 @@ public class DefaultSubscriptionBaseTimelineApi extends SubscriptionApiBase impl
                 final SubscriptionBaseTimeline curRepair = findAndCreateSubscriptionRepair(cur.getId(), input.getSubscriptions());
                 if (curRepair != null) {
                     final SubscriptionDataRepair curInputRepair = ((SubscriptionDataRepair) cur);
-                    final List<SubscriptionEvent> remaining = getRemainingEventsAndValidateDeletedEvents(curInputRepair, firstDeletedBPEventTime, curRepair.getDeletedEvents());
+                    final List<SubscriptionBaseEvent> remaining = getRemainingEventsAndValidateDeletedEvents(curInputRepair, firstDeletedBPEventTime, curRepair.getDeletedEvents());
 
                     final boolean isPlanRecreate = (curRepair.getNewEvents().size() > 0
                                                     && (curRepair.getNewEvents().get(0).getSubscriptionTransitionType() == SubscriptionBaseTransitionType.CREATE
@@ -339,7 +339,7 @@ public class DefaultSubscriptionBaseTimelineApi extends SubscriptionApiBase impl
         return newEventSet;
     }
 
-    private List<SubscriptionEvent> getRemainingEventsAndValidateDeletedEvents(final SubscriptionDataRepair data, final DateTime firstBPDeletedTime,
+    private List<SubscriptionBaseEvent> getRemainingEventsAndValidateDeletedEvents(final SubscriptionDataRepair data, final DateTime firstBPDeletedTime,
                                                                               final List<SubscriptionBaseTimeline.DeletedEvent> deletedEvents)
             throws SubscriptionBaseRepairException {
         if (deletedEvents == null || deletedEvents.size() == 0) {
@@ -347,8 +347,8 @@ public class DefaultSubscriptionBaseTimelineApi extends SubscriptionApiBase impl
         }
 
         int nbDeleted = 0;
-        final LinkedList<SubscriptionEvent> result = new LinkedList<SubscriptionEvent>();
-        for (final SubscriptionEvent cur : data.getEvents()) {
+        final LinkedList<SubscriptionBaseEvent> result = new LinkedList<SubscriptionBaseEvent>();
+        for (final SubscriptionBaseEvent cur : data.getEvents()) {
 
             boolean foundDeletedEvent = false;
             for (final SubscriptionBaseTimeline.DeletedEvent d : deletedEvents) {
@@ -474,7 +474,7 @@ public class DefaultSubscriptionBaseTimelineApi extends SubscriptionApiBase impl
         return null;
     }
 
-    private SubscriptionDataRepair createSubscriptionDataRepair(final DefaultSubscriptionBase curData, final DateTime newBundleStartDate, final DateTime newSubscriptionStartDate, final List<SubscriptionEvent> initialEvents) {
+    private SubscriptionDataRepair createSubscriptionDataRepair(final DefaultSubscriptionBase curData, final DateTime newBundleStartDate, final DateTime newSubscriptionStartDate, final List<SubscriptionBaseEvent> initialEvents) {
         final SubscriptionBuilder builder = new SubscriptionBuilder(curData);
         builder.setActiveVersion(curData.getActiveVersion() + 1);
         if (newBundleStartDate != null) {
@@ -484,7 +484,7 @@ public class DefaultSubscriptionBaseTimelineApi extends SubscriptionApiBase impl
             builder.setAlignStartDate(newSubscriptionStartDate);
         }
         if (initialEvents.size() > 0) {
-            for (final SubscriptionEvent cur : initialEvents) {
+            for (final SubscriptionBaseEvent cur : initialEvents) {
                 cur.setActiveVersion(builder.getActiveVersion());
             }
         }
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/timeline/RepairSubscriptionLifecycleDao.java b/subscription/src/main/java/com/ning/billing/subscription/api/timeline/RepairSubscriptionLifecycleDao.java
index 8f59e97..d03ca0e 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/timeline/RepairSubscriptionLifecycleDao.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/timeline/RepairSubscriptionLifecycleDao.java
@@ -19,12 +19,12 @@ package com.ning.billing.subscription.api.timeline;
 import java.util.List;
 import java.util.UUID;
 
-import com.ning.billing.subscription.events.SubscriptionEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 
 public interface RepairSubscriptionLifecycleDao {
 
-    public void initializeRepair(UUID subscriptionId, List<SubscriptionEvent> initialEvents, InternalTenantContext context);
+    public void initializeRepair(UUID subscriptionId, List<SubscriptionBaseEvent> initialEvents, InternalTenantContext context);
 
     public void cleanup(InternalTenantContext context);
 }
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/timeline/SubscriptionDataRepair.java b/subscription/src/main/java/com/ning/billing/subscription/api/timeline/SubscriptionDataRepair.java
index ed2871a..eaf759e 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/timeline/SubscriptionDataRepair.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/timeline/SubscriptionDataRepair.java
@@ -38,8 +38,8 @@ import com.ning.billing.subscription.api.user.SubscriptionBuilder;
 import com.ning.billing.subscription.api.user.DefaultSubscriptionBase;
 import com.ning.billing.subscription.engine.addon.AddonUtils;
 import com.ning.billing.subscription.engine.dao.SubscriptionDao;
-import com.ning.billing.subscription.events.SubscriptionEvent;
-import com.ning.billing.subscription.events.SubscriptionEvent.EventType;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent.EventType;
 import com.ning.billing.subscription.events.user.ApiEventBuilder;
 import com.ning.billing.subscription.events.user.ApiEventCancel;
 import com.ning.billing.subscription.api.user.SubscriptionState;
@@ -56,11 +56,11 @@ public class SubscriptionDataRepair extends DefaultSubscriptionBase {
     private final Clock clock;
     private final SubscriptionDao repairDao;
     private final CatalogService catalogService;
-    private final List<SubscriptionEvent> initialEvents;
+    private final List<SubscriptionBaseEvent> initialEvents;
     private final InternalCallContextFactory internalCallContextFactory;
 
 
-    public SubscriptionDataRepair(final SubscriptionBuilder builder, final List<SubscriptionEvent> initialEvents, final SubscriptionBaseApiService apiService,
+    public SubscriptionDataRepair(final SubscriptionBuilder builder, final List<SubscriptionBaseEvent> initialEvents, final SubscriptionBaseApiService apiService,
                                   final SubscriptionDao dao, final Clock clock, final AddonUtils addonUtils, final CatalogService catalogService,
                                   final InternalCallContextFactory internalCallContextFactory) {
         super(builder, apiService, clock);
@@ -88,7 +88,7 @@ public class SubscriptionDataRepair extends DefaultSubscriptionBase {
 
     DateTime getLastUserEventEffectiveDate() {
         DateTime res = null;
-        for (final SubscriptionEvent cur : events) {
+        for (final SubscriptionBaseEvent cur : events) {
             if (cur.getActiveVersion() != getActiveVersion()) {
                 break;
             }
@@ -176,7 +176,7 @@ public class SubscriptionDataRepair extends DefaultSubscriptionBase {
                 addonUtils.isAddonIncluded(baseProduct, addonCurrentPlan) ||
                 !addonUtils.isAddonAvailable(baseProduct, addonCurrentPlan)) {
 
-                final SubscriptionEvent cancelEvent = new ApiEventCancel(new ApiEventBuilder()
+                final SubscriptionBaseEvent cancelEvent = new ApiEventCancel(new ApiEventBuilder()
                                                                                 .setSubscriptionId(cur.getId())
                                                                                 .setActiveVersion(cur.getActiveVersion())
                                                                                 .setProcessedDate(now)
@@ -196,18 +196,18 @@ public class SubscriptionDataRepair extends DefaultSubscriptionBase {
         }
     }
 
-    public List<SubscriptionEvent> getEvents() {
+    public List<SubscriptionBaseEvent> getEvents() {
         return events;
     }
 
-    public List<SubscriptionEvent> getInitialEvents() {
+    public List<SubscriptionBaseEvent> getInitialEvents() {
         return initialEvents;
     }
 
-    public Collection<SubscriptionEvent> getNewEvents() {
-        return Collections2.filter(events, new Predicate<SubscriptionEvent>() {
+    public Collection<SubscriptionBaseEvent> getNewEvents() {
+        return Collections2.filter(events, new Predicate<SubscriptionBaseEvent>() {
             @Override
-            public boolean apply(final SubscriptionEvent input) {
+            public boolean apply(final SubscriptionBaseEvent input) {
                 return !initialEvents.contains(input);
             }
         });
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/transfer/DefaultSubscriptionBaseTransferApi.java b/subscription/src/main/java/com/ning/billing/subscription/api/transfer/DefaultSubscriptionBaseTransferApi.java
index a1bae6b..16e7bd9 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/transfer/DefaultSubscriptionBaseTransferApi.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/transfer/DefaultSubscriptionBaseTransferApi.java
@@ -40,7 +40,7 @@ import com.ning.billing.subscription.api.user.DefaultSubscriptionBaseBundle;
 import com.ning.billing.subscription.api.user.SubscriptionBaseBundle;
 import com.ning.billing.subscription.api.user.SubscriptionBuilder;
 import com.ning.billing.subscription.engine.dao.SubscriptionDao;
-import com.ning.billing.subscription.events.SubscriptionEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
 import com.ning.billing.subscription.events.phase.PhaseEventData;
 import com.ning.billing.subscription.events.user.ApiEventBuilder;
 import com.ning.billing.subscription.events.user.ApiEventCancel;
@@ -76,10 +76,10 @@ public class DefaultSubscriptionBaseTransferApi extends SubscriptionApiBase impl
         this.internalCallContextFactory = internalCallContextFactory;
     }
 
-    private SubscriptionEvent createEvent(final boolean firstEvent, final ExistingEvent existingEvent, final DefaultSubscriptionBase subscription, final DateTime transferDate, final CallContext context)
+    private SubscriptionBaseEvent createEvent(final boolean firstEvent, final ExistingEvent existingEvent, final DefaultSubscriptionBase subscription, final DateTime transferDate, final CallContext context)
             throws CatalogApiException {
 
-        SubscriptionEvent newEvent = null;
+        SubscriptionBaseEvent newEvent = null;
 
         final Catalog catalog = catalogService.getFullCatalog();
 
@@ -137,13 +137,13 @@ public class DefaultSubscriptionBaseTransferApi extends SubscriptionApiBase impl
     }
 
     @VisibleForTesting
-    List<SubscriptionEvent> toEvents(final List<ExistingEvent> existingEvents, final DefaultSubscriptionBase subscription,
+    List<SubscriptionBaseEvent> toEvents(final List<ExistingEvent> existingEvents, final DefaultSubscriptionBase subscription,
                                     final DateTime transferDate, final CallContext context) throws SubscriptionBaseTransferApiException {
 
         try {
-            final List<SubscriptionEvent> result = new LinkedList<SubscriptionEvent>();
+            final List<SubscriptionBaseEvent> result = new LinkedList<SubscriptionBaseEvent>();
 
-            SubscriptionEvent event = null;
+            SubscriptionBaseEvent event = null;
             ExistingEvent prevEvent = null;
             boolean firstEvent = true;
             for (ExistingEvent cur : existingEvents) {
@@ -234,7 +234,7 @@ public class DefaultSubscriptionBaseTransferApi extends SubscriptionApiBase impl
                                                          effectiveTransferDate.isBefore(oldSubscription.getChargedThroughDate()) ?
                                                          oldSubscription.getChargedThroughDate() : effectiveTransferDate;
 
-                    final SubscriptionEvent cancelEvent = new ApiEventCancel(new ApiEventBuilder()
+                    final SubscriptionBaseEvent cancelEvent = new ApiEventCancel(new ApiEventBuilder()
                                                                                     .setSubscriptionId(cur.getId())
                                                                                     .setActiveVersion(cur.getActiveVersion())
                                                                                     .setProcessedDate(clock.getUTCNow())
@@ -259,9 +259,9 @@ public class DefaultSubscriptionBaseTransferApi extends SubscriptionApiBase impl
                                                                                               .setCategory(productCategory)
                                                                                               .setBundleStartDate(effectiveTransferDate)
                                                                                               .setAlignStartDate(subscriptionAlignStartDate),
-                                                                                      ImmutableList.<SubscriptionEvent>of());
+                                                                                      ImmutableList.<SubscriptionBaseEvent>of());
 
-                final List<SubscriptionEvent> events = toEvents(existingEvents, defaultSubscriptionBase, effectiveTransferDate, context);
+                final List<SubscriptionBaseEvent> events = toEvents(existingEvents, defaultSubscriptionBase, effectiveTransferDate, context);
                 final SubscriptionMigrationData curData = new SubscriptionMigrationData(defaultSubscriptionBase, events, null);
                 subscriptionMigrationDataList.add(curData);
             }
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/transfer/TransferCancelData.java b/subscription/src/main/java/com/ning/billing/subscription/api/transfer/TransferCancelData.java
index 277270e..25d804d 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/transfer/TransferCancelData.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/transfer/TransferCancelData.java
@@ -17,15 +17,15 @@
 package com.ning.billing.subscription.api.transfer;
 
 import com.ning.billing.subscription.api.user.DefaultSubscriptionBase;
-import com.ning.billing.subscription.events.SubscriptionEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
 
 public class TransferCancelData {
 
     final DefaultSubscriptionBase subscription;
-    final SubscriptionEvent cancelEvent;
+    final SubscriptionBaseEvent cancelEvent;
 
     public TransferCancelData(final DefaultSubscriptionBase subscription,
-                              final SubscriptionEvent cancelEvent) {
+                              final SubscriptionBaseEvent cancelEvent) {
         this.subscription = subscription;
         this.cancelEvent = cancelEvent;
     }
@@ -34,7 +34,7 @@ public class TransferCancelData {
         return subscription;
     }
 
-    public SubscriptionEvent getCancelEvent() {
+    public SubscriptionBaseEvent getCancelEvent() {
         return cancelEvent;
     }
 }
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultRequestedSubscriptionEvent.java b/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultRequestedSubscriptionEvent.java
index 135f760..d59e5e4 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultRequestedSubscriptionEvent.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultRequestedSubscriptionEvent.java
@@ -21,7 +21,7 @@ import java.util.UUID;
 import org.joda.time.DateTime;
 
 import com.ning.billing.subscription.api.SubscriptionBaseTransitionType;
-import com.ning.billing.subscription.events.SubscriptionEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
 import com.ning.billing.util.events.RequestedSubscriptionInternalEvent;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -56,7 +56,7 @@ public class DefaultRequestedSubscriptionEvent extends DefaultSubscriptionEvent 
     }
 
     public DefaultRequestedSubscriptionEvent(final DefaultSubscriptionBase subscription,
-                                             final SubscriptionEvent nextEvent,
+                                             final SubscriptionBaseEvent nextEvent,
                                              final Long searchKey1,
                                              final Long searchKey2,
                                              final UUID userToken) {
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBase.java b/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBase.java
index 266ab02..0afaeec 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBase.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBase.java
@@ -46,8 +46,8 @@ import com.ning.billing.subscription.api.user.SubscriptionBaseTransitionDataIter
 import com.ning.billing.subscription.api.user.SubscriptionBaseTransitionDataIterator.Order;
 import com.ning.billing.subscription.api.user.SubscriptionBaseTransitionDataIterator.TimeLimit;
 import com.ning.billing.subscription.api.user.SubscriptionBaseTransitionDataIterator.Visibility;
-import com.ning.billing.subscription.events.SubscriptionEvent;
-import com.ning.billing.subscription.events.SubscriptionEvent.EventType;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent.EventType;
 import com.ning.billing.subscription.events.phase.PhaseEvent;
 import com.ning.billing.subscription.events.user.ApiEvent;
 import com.ning.billing.subscription.events.user.ApiEventType;
@@ -86,10 +86,10 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
     private LinkedList<SubscriptionBaseTransition> transitions;
 
     // Low level events are ONLY used for Repair APIs
-    protected List<SubscriptionEvent> events;
+    protected List<SubscriptionBaseEvent> events;
 
 
-    public List<SubscriptionEvent> getEvents() {
+    public List<SubscriptionBaseEvent> getEvents() {
         return events;
     }
 
@@ -381,7 +381,7 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
     }
 
 
-    public SubscriptionBaseTransitionData getTransitionFromEvent(final SubscriptionEvent event, final int seqId) {
+    public SubscriptionBaseTransitionData getTransitionFromEvent(final SubscriptionBaseEvent event, final int seqId) {
         if (transitions == null || event == null) {
             return null;
         }
@@ -522,7 +522,7 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
                 "Failed to find CurrentPhaseStart id = %s", getId().toString()));
     }
 
-    public void rebuildTransitions(final List<SubscriptionEvent> inputEvents, final Catalog catalog) {
+    public void rebuildTransitions(final List<SubscriptionBaseEvent> inputEvents, final Catalog catalog) {
 
         if (inputEvents == null) {
             return;
@@ -548,7 +548,7 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
 
         transitions = new LinkedList<SubscriptionBaseTransition>();
 
-        for (final SubscriptionEvent cur : inputEvents) {
+        for (final SubscriptionBaseEvent cur : inputEvents) {
 
             if (!cur.isActive() || cur.getActiveVersion() < activeVersion) {
                 continue;
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBaseApiService.java b/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBaseApiService.java
index 08fc4a5..9430c2e 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBaseApiService.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBaseApiService.java
@@ -45,7 +45,7 @@ import com.ning.billing.subscription.api.SubscriptionBaseApiService;
 import com.ning.billing.subscription.api.SubscriptionBase;
 import com.ning.billing.subscription.engine.addon.AddonUtils;
 import com.ning.billing.subscription.engine.dao.SubscriptionDao;
-import com.ning.billing.subscription.events.SubscriptionEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
 import com.ning.billing.subscription.events.phase.PhaseEvent;
 import com.ning.billing.subscription.events.phase.PhaseEventData;
 import com.ning.billing.subscription.events.user.ApiEvent;
@@ -151,7 +151,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
             final PhaseEvent nextPhaseEvent = (nextTimedPhase != null) ?
                                               PhaseEventData.createNextPhaseEvent(nextTimedPhase.getPhase().getName(), subscription, processedDate, nextTimedPhase.getStartPhase()) :
                                               null;
-            final List<SubscriptionEvent> events = new ArrayList<SubscriptionEvent>();
+            final List<SubscriptionBaseEvent> events = new ArrayList<SubscriptionBaseEvent>();
             events.add(creationEvent);
             if (nextPhaseEvent != null) {
                 events.add(nextPhaseEvent);
@@ -208,7 +208,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
         validateRequestedDate(subscription, now, requestedDate);
         final DateTime effectiveDate = subscription.getPlanChangeEffectiveDate(policy, requestedDate);
 
-        final SubscriptionEvent cancelEvent = new ApiEventCancel(new ApiEventBuilder()
+        final SubscriptionBaseEvent cancelEvent = new ApiEventCancel(new ApiEventBuilder()
                                                                         .setSubscriptionId(subscription.getId())
                                                                         .setActiveVersion(subscription.getActiveVersion())
                                                                         .setProcessedDate(now)
@@ -232,7 +232,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
         }
 
         final DateTime now = clock.getUTCNow();
-        final SubscriptionEvent uncancelEvent = new ApiEventUncancel(new ApiEventBuilder()
+        final SubscriptionBaseEvent uncancelEvent = new ApiEventUncancel(new ApiEventBuilder()
                                                                             .setSubscriptionId(subscription.getId())
                                                                             .setActiveVersion(subscription.getActiveVersion())
                                                                             .setProcessedDate(now)
@@ -240,7 +240,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
                                                                             .setEffectiveDate(now)
                                                                             .setFromDisk(true));
 
-        final List<SubscriptionEvent> uncancelEvents = new ArrayList<SubscriptionEvent>();
+        final List<SubscriptionBaseEvent> uncancelEvents = new ArrayList<SubscriptionBaseEvent>();
         uncancelEvents.add(uncancelEvent);
 
         final TimedPhase nextTimedPhase = planAligner.getNextTimedPhase(subscription, now, now);
@@ -332,7 +332,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
 
         final TimedPhase currentTimedPhase = planAligner.getCurrentTimedPhaseOnChange(subscription, newPlan, newPriceList.getName(), requestedDate, effectiveDate);
 
-        final SubscriptionEvent changeEvent = new ApiEventChange(new ApiEventBuilder()
+        final SubscriptionBaseEvent changeEvent = new ApiEventChange(new ApiEventBuilder()
                                                                         .setSubscriptionId(subscription.getId())
                                                                         .setEventPlan(newPlan.getName())
                                                                         .setEventPlanPhase(currentTimedPhase.getPhase().getName())
@@ -348,7 +348,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
                                           PhaseEventData.createNextPhaseEvent(nextTimedPhase.getPhase().getName(), subscription, now, nextTimedPhase.getStartPhase()) :
                                           null;
 
-        final List<SubscriptionEvent> changeEvents = new ArrayList<SubscriptionEvent>();
+        final List<SubscriptionBaseEvent> changeEvents = new ArrayList<SubscriptionBaseEvent>();
         // Only add the PHASE if it does not coincide with the CHANGE, if not this is 'just' a CHANGE.
         if (nextPhaseEvent != null && !nextPhaseEvent.getEffectiveDate().equals(changeEvent.getEffectiveDate())) {
             changeEvents.add(nextPhaseEvent);
@@ -378,7 +378,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
         final List<SubscriptionBase> subscriptions = dao.getSubscriptions(baseSubscription.getBundleId(), context);
 
         final List<DefaultSubscriptionBase> subscriptionsToBeCancelled = new LinkedList<DefaultSubscriptionBase>();
-        final List<SubscriptionEvent> cancelEvents = new LinkedList<SubscriptionEvent>();
+        final List<SubscriptionBaseEvent> cancelEvents = new LinkedList<SubscriptionBaseEvent>();
 
         for (final SubscriptionBase subscription : subscriptions) {
             final DefaultSubscriptionBase cur = (DefaultSubscriptionBase) subscription;
@@ -394,7 +394,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
                 //
                 // Perform AO cancellation using the effectiveDate of the BP
                 //
-                final SubscriptionEvent cancelEvent = new ApiEventCancel(new ApiEventBuilder()
+                final SubscriptionBaseEvent cancelEvent = new ApiEventCancel(new ApiEventBuilder()
                                                                                 .setSubscriptionId(cur.getId())
                                                                                 .setActiveVersion(cur.getActiveVersion())
                                                                                 .setProcessedDate(now)
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/user/SubscriptionBaseTransitionData.java b/subscription/src/main/java/com/ning/billing/subscription/api/user/SubscriptionBaseTransitionData.java
index feded01..1e0be32 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/user/SubscriptionBaseTransitionData.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/user/SubscriptionBaseTransitionData.java
@@ -24,7 +24,7 @@ import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.catalog.api.PriceList;
 import com.ning.billing.subscription.api.SubscriptionBaseTransitionType;
-import com.ning.billing.subscription.events.SubscriptionEvent.EventType;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent.EventType;
 import com.ning.billing.subscription.events.user.ApiEventType;
 import com.ning.billing.subscription.exceptions.SubscriptionBaseError;
 
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/user/SubscriptionEvents.java b/subscription/src/main/java/com/ning/billing/subscription/api/user/SubscriptionEvents.java
index b6f63a0..2d6a071 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/user/SubscriptionEvents.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/user/SubscriptionEvents.java
@@ -19,32 +19,32 @@ package com.ning.billing.subscription.api.user;
 import java.util.LinkedList;
 import java.util.List;
 
-import com.ning.billing.subscription.events.SubscriptionEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
 
 
 public class SubscriptionEvents {
     public static final long INITIAL_VERSION = 1;
 
-    private final List<SubscriptionEvent> events;
+    private final List<SubscriptionBaseEvent> events;
 
     private long activeVersion;
 
     public SubscriptionEvents() {
-        this.events = new LinkedList<SubscriptionEvent>();
+        this.events = new LinkedList<SubscriptionBaseEvent>();
         this.activeVersion = INITIAL_VERSION;
     }
 
-    public void addEvent(final SubscriptionEvent ev) {
+    public void addEvent(final SubscriptionBaseEvent ev) {
         events.add(ev);
     }
 
-    public List<SubscriptionEvent> getCurrentView() {
+    public List<SubscriptionBaseEvent> getCurrentView() {
         return getViewForVersion(activeVersion);
     }
 
-    public List<SubscriptionEvent> getViewForVersion(final long version) {
-        final LinkedList<SubscriptionEvent> result = new LinkedList<SubscriptionEvent>();
-        for (final SubscriptionEvent cur : events) {
+    public List<SubscriptionBaseEvent> getViewForVersion(final long version) {
+        final LinkedList<SubscriptionBaseEvent> result = new LinkedList<SubscriptionBaseEvent>();
+        for (final SubscriptionBaseEvent cur : events) {
             if (cur.getActiveVersion() == version) {
                 result.add(cur);
             }
diff --git a/subscription/src/main/java/com/ning/billing/subscription/engine/core/DefaultSubscriptionBaseService.java b/subscription/src/main/java/com/ning/billing/subscription/engine/core/DefaultSubscriptionBaseService.java
index 257cff3..0bd6ae8 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/engine/core/DefaultSubscriptionBaseService.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/engine/core/DefaultSubscriptionBaseService.java
@@ -34,8 +34,8 @@ import com.ning.billing.subscription.api.user.DefaultSubscriptionBase;
 import com.ning.billing.subscription.api.user.SubscriptionBaseTransitionData;
 import com.ning.billing.subscription.engine.addon.AddonUtils;
 import com.ning.billing.subscription.engine.dao.SubscriptionDao;
-import com.ning.billing.subscription.events.SubscriptionEvent;
-import com.ning.billing.subscription.events.SubscriptionEvent.EventType;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent.EventType;
 import com.ning.billing.subscription.events.phase.PhaseEvent;
 import com.ning.billing.subscription.events.phase.PhaseEventData;
 import com.ning.billing.subscription.events.user.ApiEvent;
@@ -107,7 +107,7 @@ public class DefaultSubscriptionBaseService implements EventListener, Subscripti
                     }
 
                     final SubscriptionNotificationKey key = (SubscriptionNotificationKey) inputKey;
-                    final SubscriptionEvent event = dao.getEventById(key.getEventId(), internalCallContextFactory.createInternalTenantContext(tenantRecordId, accountRecordId));
+                    final SubscriptionBaseEvent event = dao.getEventById(key.getEventId(), internalCallContextFactory.createInternalTenantContext(tenantRecordId, accountRecordId));
                     if (event == null) {
                         // This can be expected if the event is soft deleted (is_active = 0)
                         log.info("Failed to extract event for notification key {}", inputKey);
@@ -141,7 +141,7 @@ public class DefaultSubscriptionBaseService implements EventListener, Subscripti
     }
 
     @Override
-    public void processEventReady(final SubscriptionEvent event, final int seqId, final InternalCallContext context) {
+    public void processEventReady(final SubscriptionBaseEvent event, final int seqId, final InternalCallContext context) {
         if (!event.isActive()) {
             return;
         }
diff --git a/subscription/src/main/java/com/ning/billing/subscription/engine/core/EventListener.java b/subscription/src/main/java/com/ning/billing/subscription/engine/core/EventListener.java
index 0952538..9dc1b67 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/engine/core/EventListener.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/engine/core/EventListener.java
@@ -16,12 +16,12 @@
 
 package com.ning.billing.subscription.engine.core;
 
-import com.ning.billing.subscription.events.SubscriptionEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
 import com.ning.billing.util.callcontext.InternalCallContext;
 
 
 public interface EventListener {
 
-    public void processEventReady(final SubscriptionEvent event, final int seqId, final InternalCallContext context);
+    public void processEventReady(final SubscriptionBaseEvent event, final int seqId, final InternalCallContext context);
 
 }
diff --git a/subscription/src/main/java/com/ning/billing/subscription/engine/dao/DefaultSubscriptionDao.java b/subscription/src/main/java/com/ning/billing/subscription/engine/dao/DefaultSubscriptionDao.java
index 3ec8cc0..ae969ab 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/engine/dao/DefaultSubscriptionDao.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/engine/dao/DefaultSubscriptionDao.java
@@ -62,8 +62,8 @@ import com.ning.billing.subscription.engine.core.SubscriptionNotificationKey;
 import com.ning.billing.subscription.engine.dao.model.SubscriptionEventModelDao;
 import com.ning.billing.subscription.engine.dao.model.SubscriptionBundleModelDao;
 import com.ning.billing.subscription.engine.dao.model.SubscriptionModelDao;
-import com.ning.billing.subscription.events.SubscriptionEvent;
-import com.ning.billing.subscription.events.SubscriptionEvent.EventType;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent.EventType;
 import com.ning.billing.subscription.events.phase.PhaseEvent;
 import com.ning.billing.subscription.events.user.ApiEvent;
 import com.ning.billing.subscription.events.user.ApiEventBuilder;
@@ -286,7 +286,7 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
     }
 
     @Override
-    public void createNextPhaseEvent(final DefaultSubscriptionBase subscription, final SubscriptionEvent nextPhase, final InternalCallContext context) {
+    public void createNextPhaseEvent(final DefaultSubscriptionBase subscription, final SubscriptionBaseEvent nextPhase, final InternalCallContext context) {
         transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<Void>() {
             @Override
             public Void inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
@@ -307,10 +307,10 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
     }
 
     @Override
-    public SubscriptionEvent getEventById(final UUID eventId, final InternalTenantContext context) {
-        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<SubscriptionEvent>() {
+    public SubscriptionBaseEvent getEventById(final UUID eventId, final InternalTenantContext context) {
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<SubscriptionBaseEvent>() {
             @Override
-            public SubscriptionEvent inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+            public SubscriptionBaseEvent inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
                 SubscriptionEventModelDao model = entitySqlDaoWrapperFactory.become(SubscriptionEventSqlDao.class).getById(eventId.toString(), context);
                 return SubscriptionEventModelDao.toSubscriptionEvent(model);
             }
@@ -318,10 +318,10 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
     }
 
     @Override
-    public List<SubscriptionEvent> getEventsForSubscription(final UUID subscriptionId, final InternalTenantContext context) {
-        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<SubscriptionEvent>>() {
+    public List<SubscriptionBaseEvent> getEventsForSubscription(final UUID subscriptionId, final InternalTenantContext context) {
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<SubscriptionBaseEvent>>() {
             @Override
-            public List<SubscriptionEvent> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+            public List<SubscriptionBaseEvent> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
                 final List<SubscriptionEventModelDao> models = entitySqlDaoWrapperFactory.become(SubscriptionEventSqlDao.class).getEventsForSubscription(subscriptionId.toString(), context);
                 // Remove UNCANCEL events early on as they are not representative of a state transition but are just markers
                 final Collection<SubscriptionEventModelDao> filteredModels = Collections2.filter(models, new Predicate<SubscriptionEventModelDao>() {
@@ -330,9 +330,9 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
                         return input.getUserType() != ApiEventType.UNCANCEL;
                     }
                 });
-                return new ArrayList<SubscriptionEvent>(Collections2.transform(filteredModels, new Function<SubscriptionEventModelDao, SubscriptionEvent>() {
+                return new ArrayList<SubscriptionBaseEvent>(Collections2.transform(filteredModels, new Function<SubscriptionEventModelDao, SubscriptionBaseEvent>() {
                     @Override
-                    public SubscriptionEvent apply(@Nullable final SubscriptionEventModelDao input) {
+                    public SubscriptionBaseEvent apply(@Nullable final SubscriptionEventModelDao input) {
                         return SubscriptionEventModelDao.toSubscriptionEvent(input);
                     }
                 }));
@@ -341,10 +341,10 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
     }
 
     @Override
-    public Map<UUID, List<SubscriptionEvent>> getEventsForBundle(final UUID bundleId, final InternalTenantContext context) {
-        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<Map<UUID, List<SubscriptionEvent>>>() {
+    public Map<UUID, List<SubscriptionBaseEvent>> getEventsForBundle(final UUID bundleId, final InternalTenantContext context) {
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<Map<UUID, List<SubscriptionBaseEvent>>>() {
             @Override
-            public Map<UUID, List<SubscriptionEvent>> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+            public Map<UUID, List<SubscriptionBaseEvent>> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
                 final SubscriptionSqlDao transactional = entitySqlDaoWrapperFactory.become(SubscriptionSqlDao.class);
 
                 final List<SubscriptionModelDao> subscriptionModels = transactional.getSubscriptionsFromBundleId(bundleId.toString(), context);
@@ -353,12 +353,12 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
                 }
 
                 final SubscriptionEventSqlDao eventsDaoFromSameTransaction = entitySqlDaoWrapperFactory.become(SubscriptionEventSqlDao.class);
-                final Map<UUID, List<SubscriptionEvent>> result = new HashMap<UUID, List<SubscriptionEvent>>();
+                final Map<UUID, List<SubscriptionBaseEvent>> result = new HashMap<UUID, List<SubscriptionBaseEvent>>();
                 for (final SubscriptionModelDao cur : subscriptionModels) {
                     final List<SubscriptionEventModelDao> eventModels = eventsDaoFromSameTransaction.getEventsForSubscription(cur.getId().toString(), context);
-                    final List<SubscriptionEvent> events = new ArrayList<SubscriptionEvent>(Collections2.transform(eventModels, new Function<SubscriptionEventModelDao, SubscriptionEvent>() {
+                    final List<SubscriptionBaseEvent> events = new ArrayList<SubscriptionBaseEvent>(Collections2.transform(eventModels, new Function<SubscriptionEventModelDao, SubscriptionBaseEvent>() {
                         @Override
-                        public SubscriptionEvent apply(@Nullable final SubscriptionEventModelDao input) {
+                        public SubscriptionBaseEvent apply(@Nullable final SubscriptionEventModelDao input) {
                             return SubscriptionEventModelDao.toSubscriptionEvent(input);
                         }
                     }));
@@ -370,16 +370,16 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
     }
 
     @Override
-    public List<SubscriptionEvent> getPendingEventsForSubscription(final UUID subscriptionId, final InternalTenantContext context) {
+    public List<SubscriptionBaseEvent> getPendingEventsForSubscription(final UUID subscriptionId, final InternalTenantContext context) {
         final Date now = clock.getUTCNow().toDate();
 
-        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<SubscriptionEvent>>() {
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<SubscriptionBaseEvent>>() {
             @Override
-            public List<SubscriptionEvent> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+            public List<SubscriptionBaseEvent> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
                 final List<SubscriptionEventModelDao> eventModels = entitySqlDaoWrapperFactory.become(SubscriptionEventSqlDao.class).getFutureActiveEventForSubscription(subscriptionId.toString(), now, context);
-                final List<SubscriptionEvent> events = new ArrayList<SubscriptionEvent>(Collections2.transform(eventModels, new Function<SubscriptionEventModelDao, SubscriptionEvent>() {
+                final List<SubscriptionBaseEvent> events = new ArrayList<SubscriptionBaseEvent>(Collections2.transform(eventModels, new Function<SubscriptionEventModelDao, SubscriptionBaseEvent>() {
                     @Override
-                    public SubscriptionEvent apply(@Nullable final SubscriptionEventModelDao input) {
+                    public SubscriptionBaseEvent apply(@Nullable final SubscriptionEventModelDao input) {
                         return SubscriptionEventModelDao.toSubscriptionEvent(input);
                     }
                 }));
@@ -389,7 +389,7 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
     }
 
     @Override
-    public void createSubscription(final DefaultSubscriptionBase subscription, final List<SubscriptionEvent> initialEvents, final InternalCallContext context) {
+    public void createSubscription(final DefaultSubscriptionBase subscription, final List<SubscriptionBaseEvent> initialEvents, final InternalCallContext context) {
         transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<Void>() {
             @Override
             public Void inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
@@ -397,7 +397,7 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
                 transactional.create(new SubscriptionModelDao(subscription), context);
 
                 final SubscriptionEventSqlDao eventsDaoFromSameTransaction = entitySqlDaoWrapperFactory.become(SubscriptionEventSqlDao.class);
-                for (final SubscriptionEvent cur : initialEvents) {
+                for (final SubscriptionBaseEvent cur : initialEvents) {
                     eventsDaoFromSameTransaction.create(new SubscriptionEventModelDao(cur), context);
 
                     final boolean isBusEvent = cur.getEffectiveDate().compareTo(clock.getUTCNow()) <= 0 && (cur.getType() == EventType.API_USER);
@@ -415,13 +415,13 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
 
 
     @Override
-    public void recreateSubscription(final DefaultSubscriptionBase subscription, final List<SubscriptionEvent> recreateEvents, final InternalCallContext context) {
+    public void recreateSubscription(final DefaultSubscriptionBase subscription, final List<SubscriptionBaseEvent> recreateEvents, final InternalCallContext context) {
         transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<Void>() {
             @Override
             public Void inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
                 final SubscriptionEventSqlDao transactional = entitySqlDaoWrapperFactory.become(SubscriptionEventSqlDao.class);
 
-                for (final SubscriptionEvent cur : recreateEvents) {
+                for (final SubscriptionBaseEvent cur : recreateEvents) {
                     transactional.create(new SubscriptionEventModelDao(cur), context);
 
                     final boolean isBusEvent = cur.getEffectiveDate().compareTo(clock.getUTCNow()) <= 0 && (cur.getType() == EventType.API_USER);
@@ -437,14 +437,14 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
     }
 
     @Override
-    public void cancelSubscriptions(final List<DefaultSubscriptionBase> subscriptions, final List<SubscriptionEvent> cancelEvents, final InternalCallContext context) {
+    public void cancelSubscriptions(final List<DefaultSubscriptionBase> subscriptions, final List<SubscriptionBaseEvent> cancelEvents, final InternalCallContext context) {
 
         transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<Void>() {
             @Override
             public Void inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
                 for (int i = 0; i < subscriptions.size(); i++) {
                     final DefaultSubscriptionBase subscription = subscriptions.get(i);
-                    final SubscriptionEvent cancelEvent = cancelEvents.get(i);
+                    final SubscriptionBaseEvent cancelEvent = cancelEvents.get(i);
                     cancelSubscriptionFromTransaction(subscription, cancelEvent, entitySqlDaoWrapperFactory, context, i);
                 }
                 return null;
@@ -454,7 +454,7 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
 
 
     @Override
-    public void cancelSubscription(final DefaultSubscriptionBase subscription, final SubscriptionEvent cancelEvent, final InternalCallContext context, final int seqId) {
+    public void cancelSubscription(final DefaultSubscriptionBase subscription, final SubscriptionBaseEvent cancelEvent, final InternalCallContext context, final int seqId) {
         transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<Void>() {
             @Override
             public Void inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
@@ -465,7 +465,7 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
     }
 
     @Override
-    public void uncancelSubscription(final DefaultSubscriptionBase subscription, final List<SubscriptionEvent> uncancelEvents, final InternalCallContext context) {
+    public void uncancelSubscription(final DefaultSubscriptionBase subscription, final List<SubscriptionBaseEvent> uncancelEvents, final InternalCallContext context) {
         transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<Void>() {
             @Override
             public Void inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
@@ -488,7 +488,7 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
                 if (cancelledEvent != null) {
                     final String cancelledEventId = cancelledEvent.getId().toString();
                     transactional.unactiveEvent(cancelledEventId, context);
-                    for (final SubscriptionEvent cur : uncancelEvents) {
+                    for (final SubscriptionBaseEvent cur : uncancelEvents) {
                         transactional.create(new SubscriptionEventModelDao(cur), context);
                         recordFutureNotificationFromTransaction(entitySqlDaoWrapperFactory,
                                                                 cur.getEffectiveDate(),
@@ -506,7 +506,7 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
     }
 
     @Override
-    public void changePlan(final DefaultSubscriptionBase subscription, final List<SubscriptionEvent> changeEvents, final InternalCallContext context) {
+    public void changePlan(final DefaultSubscriptionBase subscription, final List<SubscriptionBaseEvent> changeEvents, final InternalCallContext context) {
         transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<Void>() {
             @Override
             public Void inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
@@ -514,14 +514,14 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
                 final SubscriptionEventSqlDao transactional = entitySqlDaoWrapperFactory.become(SubscriptionEventSqlDao.class);
                 final UUID subscriptionId = subscription.getId();
 
-                final List<SubscriptionEvent> changeEventsTweakedWithMigrateBilling = reinsertFutureMigrateBillingEventOnChangeFromTransaction(subscriptionId,
+                final List<SubscriptionBaseEvent> changeEventsTweakedWithMigrateBilling = reinsertFutureMigrateBillingEventOnChangeFromTransaction(subscriptionId,
                                                                                                                                               changeEvents,
                                                                                                                                               entitySqlDaoWrapperFactory,
                                                                                                                                               context);
 
                 cancelFutureEventsFromTransaction(subscriptionId, entitySqlDaoWrapperFactory, context);
 
-                for (final SubscriptionEvent cur : changeEventsTweakedWithMigrateBilling) {
+                for (final SubscriptionBaseEvent cur : changeEventsTweakedWithMigrateBilling) {
 
                     transactional.create(new SubscriptionEventModelDao(cur), context);
 
@@ -530,7 +530,7 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
                 }
 
                 // Notify the Bus of the latest requested change
-                final SubscriptionEvent finalEvent = changeEventsTweakedWithMigrateBilling.get(changeEvents.size() - 1);
+                final SubscriptionBaseEvent finalEvent = changeEventsTweakedWithMigrateBilling.get(changeEvents.size() - 1);
                 notifyBusOfRequestedChange(entitySqlDaoWrapperFactory, subscription, finalEvent, context);
 
                 return null;
@@ -549,7 +549,7 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
     // that event reflects the correct subscription information.
     //
     //
-    final List<SubscriptionEvent> reinsertFutureMigrateBillingEventOnChangeFromTransaction(final UUID subscriptionId, final List<SubscriptionEvent> changeEvents, final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory, final InternalCallContext context) {
+    final List<SubscriptionBaseEvent> reinsertFutureMigrateBillingEventOnChangeFromTransaction(final UUID subscriptionId, final List<SubscriptionBaseEvent> changeEvents, final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory, final InternalCallContext context) {
         final SubscriptionEventModelDao migrateBillingEvent = findFutureEventFromTransaction(subscriptionId, entitySqlDaoWrapperFactory, EventType.API_USER, ApiEventType.MIGRATE_BILLING, context);
         if (migrateBillingEvent == null) {
             // No future migrate billing : returns same list
@@ -562,7 +562,7 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
         String curPlan = null;
         String curPhase = null;
         String curPriceList = null;
-        for (SubscriptionEvent cur : changeEvents) {
+        for (SubscriptionBaseEvent cur : changeEvents) {
             switch (cur.getType()) {
                 case API_USER:
                     final ApiEvent apiEvent = (ApiEvent) cur;
@@ -613,12 +613,12 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
                     .setEventPlanPhase(prevPhase)
                     .setEventPriceList(prevPriceList);
 
-            final SubscriptionEvent newMigrateBillingEvent = new ApiEventMigrateBilling(builder);
+            final SubscriptionBaseEvent newMigrateBillingEvent = new ApiEventMigrateBilling(builder);
             changeEvents.add(newMigrateBillingEvent);
 
-            Collections.sort(changeEvents, new Comparator<SubscriptionEvent>() {
+            Collections.sort(changeEvents, new Comparator<SubscriptionBaseEvent>() {
                 @Override
-                public int compare(final SubscriptionEvent o1, final SubscriptionEvent o2) {
+                public int compare(final SubscriptionBaseEvent o1, final SubscriptionBaseEvent o2) {
                     return o1.getEffectiveDate().compareTo(o2.getEffectiveDate());
                 }
             });
@@ -627,7 +627,7 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
         return changeEvents;
     }
 
-    private void cancelSubscriptionFromTransaction(final DefaultSubscriptionBase subscription, final SubscriptionEvent cancelEvent, final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory, final InternalCallContext context, final int seqId)
+    private void cancelSubscriptionFromTransaction(final DefaultSubscriptionBase subscription, final SubscriptionBaseEvent cancelEvent, final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory, final InternalCallContext context, final int seqId)
             throws EntityPersistenceException {
         final UUID subscriptionId = subscription.getId();
         cancelFutureEventsFromTransaction(subscriptionId, entitySqlDaoWrapperFactory, context);
@@ -733,17 +733,17 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
             }
         });
 
-        SubscriptionEvent futureBaseEvent = null;
+        SubscriptionBaseEvent futureBaseEvent = null;
         final List<SubscriptionBase> result = new ArrayList<SubscriptionBase>(input.size());
         for (final SubscriptionBase cur : input) {
-            final List<SubscriptionEvent> events = getEventsForSubscription(cur.getId(), context);
+            final List<SubscriptionBaseEvent> events = getEventsForSubscription(cur.getId(), context);
             SubscriptionBase reloaded = createSubscriptionForInternalUse(cur, events);
 
             switch (cur.getCategory()) {
                 case BASE:
-                    final Collection<SubscriptionEvent> futureApiEvents = Collections2.filter(events, new Predicate<SubscriptionEvent>() {
+                    final Collection<SubscriptionBaseEvent> futureApiEvents = Collections2.filter(events, new Predicate<SubscriptionBaseEvent>() {
                         @Override
-                        public boolean apply(final SubscriptionEvent input) {
+                        public boolean apply(final SubscriptionBaseEvent input) {
                             return (input.isActive() && input.getEffectiveDate().isAfter(clock.getUTCNow()) &&
                                     ((input instanceof ApiEventCancel) || (input instanceof ApiEventChange)));
                         }
@@ -763,7 +763,7 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
 
                     if (createCancelEvent && reloaded.getFutureEndDate() == null) {
                         final DateTime now = clock.getUTCNow();
-                        final SubscriptionEvent addOnCancelEvent = new ApiEventCancel(new ApiEventBuilder()
+                        final SubscriptionBaseEvent addOnCancelEvent = new ApiEventCancel(new ApiEventBuilder()
                                                                                              .setSubscriptionId(reloaded.getId())
                                                                                              .setActiveVersion(((DefaultSubscriptionBase) reloaded).getActiveVersion())
                                                                                              .setProcessedDate(now)
@@ -813,10 +813,10 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
                 final SubscriptionEventSqlDao transEventDao = entitySqlDaoWrapperFactory.become(SubscriptionEventSqlDao.class);
                 for (final SubscriptionDataRepair cur : inRepair) {
                     transactional.updateForRepair(cur.getId().toString(), cur.getActiveVersion(), cur.getAlignStartDate().toDate(), cur.getBundleStartDate().toDate(), context);
-                    for (final SubscriptionEvent event : cur.getInitialEvents()) {
+                    for (final SubscriptionBaseEvent event : cur.getInitialEvents()) {
                         transEventDao.updateVersion(event.getId().toString(), event.getActiveVersion(), context);
                     }
-                    for (final SubscriptionEvent event : cur.getNewEvents()) {
+                    for (final SubscriptionBaseEvent event : cur.getNewEvents()) {
                         transEventDao.create(new SubscriptionEventModelDao(event), context);
                         if (event.getEffectiveDate().isAfter(clock.getUTCNow())) {
                             recordFutureNotificationFromTransaction(entitySqlDaoWrapperFactory,
@@ -861,7 +861,7 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
         });
     }
 
-    private DefaultSubscriptionBase createSubscriptionForInternalUse(final SubscriptionBase shellSubscription, final List<SubscriptionEvent> events) {
+    private DefaultSubscriptionBase createSubscriptionForInternalUse(final SubscriptionBase shellSubscription, final List<SubscriptionBaseEvent> events) {
         final DefaultSubscriptionBase result = new DefaultSubscriptionBase(new SubscriptionBuilder(((DefaultSubscriptionBase) shellSubscription)), null, clock);
         if (events.size() > 0) {
             result.rebuildTransitions(events, catalogService.getFullCatalog());
@@ -883,7 +883,7 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
     //
     // Either records a notfication or sends a bus event is operation is immediate
     //
-    private void recordBusOrFutureNotificationFromTransaction(final DefaultSubscriptionBase subscription, final SubscriptionEvent event, final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory, final boolean busEvent,
+    private void recordBusOrFutureNotificationFromTransaction(final DefaultSubscriptionBase subscription, final SubscriptionBaseEvent event, final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory, final boolean busEvent,
                                                               final int seqId, final InternalCallContext context) {
         if (busEvent) {
             notifyBusOfEffectiveImmediateChange(entitySqlDaoWrapperFactory, subscription, event, seqId, context);
@@ -901,7 +901,7 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
     // - IMM CANCEL or CHANGE
     //
     private void notifyBusOfEffectiveImmediateChange(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory, final DefaultSubscriptionBase subscription,
-                                                     final SubscriptionEvent immediateEvent, final int seqId, final InternalCallContext context) {
+                                                     final SubscriptionBaseEvent immediateEvent, final int seqId, final InternalCallContext context) {
         try {
             final DefaultSubscriptionBase upToDateSubscription = createSubscriptionWithNewEvent(subscription, immediateEvent);
 
@@ -918,7 +918,7 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
     }
 
     private void notifyBusOfRequestedChange(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory, final DefaultSubscriptionBase subscription,
-                                            final SubscriptionEvent nextEvent, final InternalCallContext context) {
+                                            final SubscriptionBaseEvent nextEvent, final InternalCallContext context) {
         try {
             eventBus.postFromTransaction(new DefaultRequestedSubscriptionEvent(subscription, nextEvent, context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken()), entitySqlDaoWrapperFactory.getSqlDao());
         } catch (EventBusException e) {
@@ -955,7 +955,7 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
 
         for (final SubscriptionMigrationData curSubscription : bundleTransferData.getSubscriptions()) {
             final DefaultSubscriptionBase subData = curSubscription.getData();
-            for (final SubscriptionEvent curEvent : curSubscription.getInitialEvents()) {
+            for (final SubscriptionBaseEvent curEvent : curSubscription.getInitialEvents()) {
                 transactional.create(new SubscriptionEventModelDao(curEvent), context);
                 recordFutureNotificationFromTransaction(entitySqlDaoWrapperFactory,
                                                         curEvent.getEffectiveDate(),
@@ -965,7 +965,7 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
             transSubDao.create(new SubscriptionModelDao(subData), context);
 
             // Notify the Bus of the latest requested change
-            final SubscriptionEvent finalEvent = curSubscription.getInitialEvents().get(curSubscription.getInitialEvents().size() - 1);
+            final SubscriptionBaseEvent finalEvent = curSubscription.getInitialEvents().get(curSubscription.getInitialEvents().size() - 1);
             notifyBusOfRequestedChange(entitySqlDaoWrapperFactory, subData, finalEvent, context);
         }
 
@@ -975,10 +975,10 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
     //
     // Creates a copy of the existing subscriptions whose 'transitions' will reflect the new event
     //
-    private DefaultSubscriptionBase createSubscriptionWithNewEvent(final DefaultSubscriptionBase subscription, SubscriptionEvent newEvent) {
+    private DefaultSubscriptionBase createSubscriptionWithNewEvent(final DefaultSubscriptionBase subscription, SubscriptionBaseEvent newEvent) {
 
         final DefaultSubscriptionBase subscriptionWithNewEvent = new DefaultSubscriptionBase(subscription, null, clock);
-        final List<SubscriptionEvent> allEvents = new LinkedList<SubscriptionEvent>();
+        final List<SubscriptionBaseEvent> allEvents = new LinkedList<SubscriptionBaseEvent>();
         if (subscriptionWithNewEvent.getEvents() != null) {
             allEvents.addAll(subscriptionWithNewEvent.getEvents());
         }
diff --git a/subscription/src/main/java/com/ning/billing/subscription/engine/dao/model/SubscriptionEventModelDao.java b/subscription/src/main/java/com/ning/billing/subscription/engine/dao/model/SubscriptionEventModelDao.java
index 9ddfce6..950bc2f 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/engine/dao/model/SubscriptionEventModelDao.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/engine/dao/model/SubscriptionEventModelDao.java
@@ -20,8 +20,8 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 
-import com.ning.billing.subscription.events.SubscriptionEvent;
-import com.ning.billing.subscription.events.SubscriptionEvent.EventType;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent.EventType;
 import com.ning.billing.subscription.events.EventBaseBuilder;
 import com.ning.billing.subscription.events.phase.PhaseEvent;
 import com.ning.billing.subscription.events.phase.PhaseEventBuilder;
@@ -42,7 +42,7 @@ import com.ning.billing.util.dao.TableName;
 import com.ning.billing.util.entity.EntityBase;
 import com.ning.billing.util.entity.dao.EntityModelDao;
 
-public class SubscriptionEventModelDao extends EntityBase implements EntityModelDao<SubscriptionEvent> {
+public class SubscriptionEventModelDao extends EntityBase implements EntityModelDao<SubscriptionBaseEvent> {
 
     private long totalOrdering;
     private EventType eventType;
@@ -78,7 +78,7 @@ public class SubscriptionEventModelDao extends EntityBase implements EntityModel
         this.isActive = active;
     }
 
-    public SubscriptionEventModelDao(final SubscriptionEvent src) {
+    public SubscriptionEventModelDao(final SubscriptionBaseEvent src) {
         super(src.getId(), src.getCreatedDate(), src.getUpdatedDate());
         this.totalOrdering = src.getTotalOrdering();
         this.eventType = src.getType();
@@ -142,7 +142,7 @@ public class SubscriptionEventModelDao extends EntityBase implements EntityModel
         return isActive;
     }
 
-    public static SubscriptionEvent toSubscriptionEvent(final SubscriptionEventModelDao src) {
+    public static SubscriptionBaseEvent toSubscriptionEvent(final SubscriptionEventModelDao src) {
 
         if (src == null) {
             return null;
@@ -162,7 +162,7 @@ public class SubscriptionEventModelDao extends EntityBase implements EntityModel
                 .setActiveVersion(src.getCurrentVersion())
                 .setActive(src.isActive());
 
-        SubscriptionEvent result = null;
+        SubscriptionBaseEvent result = null;
         if (src.getEventType() == EventType.PHASE) {
             result = new PhaseEventData(new PhaseEventBuilder(base).setPhaseName(src.getPhaseName()));
         } else if (src.getEventType() == EventType.API_USER) {
diff --git a/subscription/src/main/java/com/ning/billing/subscription/engine/dao/RepairSubscriptionDao.java b/subscription/src/main/java/com/ning/billing/subscription/engine/dao/RepairSubscriptionDao.java
index 60234cb..63f1ff9 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/engine/dao/RepairSubscriptionDao.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/engine/dao/RepairSubscriptionDao.java
@@ -34,7 +34,7 @@ import com.ning.billing.subscription.api.timeline.SubscriptionDataRepair;
 import com.ning.billing.subscription.api.transfer.TransferCancelData;
 import com.ning.billing.subscription.api.user.DefaultSubscriptionBase;
 import com.ning.billing.subscription.api.user.DefaultSubscriptionBaseBundle;
-import com.ning.billing.subscription.events.SubscriptionEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
 import com.ning.billing.subscription.exceptions.SubscriptionBaseError;
 import com.ning.billing.subscription.api.SubscriptionBase;
 import com.ning.billing.subscription.api.user.SubscriptionBaseBundle;
@@ -52,15 +52,15 @@ public class RepairSubscriptionDao implements SubscriptionDao, RepairSubscriptio
 
     private static final class SubscriptionEventWithOrderingId {
 
-        private final SubscriptionEvent event;
+        private final SubscriptionBaseEvent event;
         private final long orderingId;
 
-        public SubscriptionEventWithOrderingId(final SubscriptionEvent event, final long orderingId) {
+        public SubscriptionEventWithOrderingId(final SubscriptionBaseEvent event, final long orderingId) {
             this.event = event;
             this.orderingId = orderingId;
         }
 
-        public SubscriptionEvent getEvent() {
+        public SubscriptionBaseEvent getEvent() {
             return event;
         }
 
@@ -89,7 +89,7 @@ public class RepairSubscriptionDao implements SubscriptionDao, RepairSubscriptio
         private final Set<SubscriptionEventWithOrderingId> events;
         private long curOrderingId;
 
-        public SubscriptionRepairEvent(final List<SubscriptionEvent> initialEvents) {
+        public SubscriptionRepairEvent(final List<SubscriptionBaseEvent> initialEvents) {
             this.events = new TreeSet<SubscriptionEventWithOrderingId>(new Comparator<SubscriptionEventWithOrderingId>() {
                 @Override
                 public int compare(final SubscriptionEventWithOrderingId o1, final SubscriptionEventWithOrderingId o2) {
@@ -122,17 +122,17 @@ public class RepairSubscriptionDao implements SubscriptionDao, RepairSubscriptio
             }
         }
 
-        public List<SubscriptionEvent> getEvents() {
-            return new ArrayList<SubscriptionEvent>(Collections2.transform(events, new Function<SubscriptionEventWithOrderingId, SubscriptionEvent>() {
+        public List<SubscriptionBaseEvent> getEvents() {
+            return new ArrayList<SubscriptionBaseEvent>(Collections2.transform(events, new Function<SubscriptionEventWithOrderingId, SubscriptionBaseEvent>() {
                 @Override
-                public SubscriptionEvent apply(SubscriptionEventWithOrderingId in) {
+                public SubscriptionBaseEvent apply(SubscriptionEventWithOrderingId in) {
                     return in.getEvent();
                 }
             }));
         }
 
-        public void addEvents(final List<SubscriptionEvent> newEvents) {
-            for (final SubscriptionEvent cur : newEvents) {
+        public void addEvents(final List<SubscriptionBaseEvent> newEvents) {
+            for (final SubscriptionBaseEvent cur : newEvents) {
                 events.add(new SubscriptionEventWithOrderingId(cur, curOrderingId++));
             }
         }
@@ -151,29 +151,29 @@ public class RepairSubscriptionDao implements SubscriptionDao, RepairSubscriptio
     }
 
     @Override
-    public List<SubscriptionEvent> getEventsForSubscription(final UUID subscriptionId, final InternalTenantContext context) {
+    public List<SubscriptionBaseEvent> getEventsForSubscription(final UUID subscriptionId, final InternalTenantContext context) {
         final SubscriptionRepairEvent target = getRepairSubscriptionEvents(subscriptionId);
-        return new LinkedList<SubscriptionEvent>(target.getEvents());
+        return new LinkedList<SubscriptionBaseEvent>(target.getEvents());
     }
 
     @Override
-    public void createSubscription(final DefaultSubscriptionBase subscription, final List<SubscriptionEvent> createEvents, final InternalCallContext context) {
+    public void createSubscription(final DefaultSubscriptionBase subscription, final List<SubscriptionBaseEvent> createEvents, final InternalCallContext context) {
         addEvents(subscription.getId(), createEvents);
     }
 
     @Override
-    public void recreateSubscription(final DefaultSubscriptionBase subscription, final List<SubscriptionEvent> recreateEvents, final InternalCallContext context) {
+    public void recreateSubscription(final DefaultSubscriptionBase subscription, final List<SubscriptionBaseEvent> recreateEvents, final InternalCallContext context) {
         addEvents(subscription.getId(), recreateEvents);
     }
 
     @Override
-    public void cancelSubscription(final DefaultSubscriptionBase subscription, final SubscriptionEvent cancelEvent, final InternalCallContext context, final int cancelSeq) {
+    public void cancelSubscription(final DefaultSubscriptionBase subscription, final SubscriptionBaseEvent cancelEvent, final InternalCallContext context, final int cancelSeq) {
         final UUID subscriptionId = subscription.getId();
         final long activeVersion = cancelEvent.getActiveVersion();
         addEvents(subscriptionId, Collections.singletonList(cancelEvent));
         final SubscriptionRepairEvent target = getRepairSubscriptionEvents(subscriptionId);
         boolean foundCancelEvent = false;
-        for (final SubscriptionEvent cur : target.getEvents()) {
+        for (final SubscriptionBaseEvent cur : target.getEvents()) {
             if (cur.getId().equals(cancelEvent.getId())) {
                 foundCancelEvent = true;
             } else if (foundCancelEvent) {
@@ -183,16 +183,16 @@ public class RepairSubscriptionDao implements SubscriptionDao, RepairSubscriptio
     }
 
     @Override
-    public void cancelSubscriptions(final List<DefaultSubscriptionBase> subscriptions, final List<SubscriptionEvent> cancelEvents, final InternalCallContext context) {
+    public void cancelSubscriptions(final List<DefaultSubscriptionBase> subscriptions, final List<SubscriptionBaseEvent> cancelEvents, final InternalCallContext context) {
     }
 
     @Override
-    public void changePlan(final DefaultSubscriptionBase subscription, final List<SubscriptionEvent> changeEvents, final InternalCallContext context) {
+    public void changePlan(final DefaultSubscriptionBase subscription, final List<SubscriptionBaseEvent> changeEvents, final InternalCallContext context) {
         addEvents(subscription.getId(), changeEvents);
     }
 
     @Override
-    public void initializeRepair(final UUID subscriptionId, final List<SubscriptionEvent> initialEvents, final InternalTenantContext context) {
+    public void initializeRepair(final UUID subscriptionId, final List<SubscriptionBaseEvent> initialEvents, final InternalTenantContext context) {
         final Map<UUID, SubscriptionRepairEvent> map = getRepairMap();
         if (map.get(subscriptionId) == null) {
             final SubscriptionRepairEvent value = new SubscriptionRepairEvent(initialEvents);
@@ -208,13 +208,13 @@ public class RepairSubscriptionDao implements SubscriptionDao, RepairSubscriptio
         map.clear();
     }
 
-    private void addEvents(final UUID subscriptionId, final List<SubscriptionEvent> events) {
+    private void addEvents(final UUID subscriptionId, final List<SubscriptionBaseEvent> events) {
         final SubscriptionRepairEvent target = getRepairSubscriptionEvents(subscriptionId);
         target.addEvents(events);
     }
 
     @Override
-    public void uncancelSubscription(final DefaultSubscriptionBase subscription, final List<SubscriptionEvent> uncancelEvents, final InternalCallContext context) {
+    public void uncancelSubscription(final DefaultSubscriptionBase subscription, final List<SubscriptionBaseEvent> uncancelEvents, final InternalCallContext context) {
         throw new SubscriptionBaseError(NOT_IMPLEMENTED);
     }
 
@@ -270,22 +270,22 @@ public class RepairSubscriptionDao implements SubscriptionDao, RepairSubscriptio
     }
 
     @Override
-    public void createNextPhaseEvent(final DefaultSubscriptionBase subscription, final SubscriptionEvent nextPhase, final InternalCallContext context) {
+    public void createNextPhaseEvent(final DefaultSubscriptionBase subscription, final SubscriptionBaseEvent nextPhase, final InternalCallContext context) {
         throw new SubscriptionBaseError(NOT_IMPLEMENTED);
     }
 
     @Override
-    public SubscriptionEvent getEventById(final UUID eventId, final InternalTenantContext context) {
+    public SubscriptionBaseEvent getEventById(final UUID eventId, final InternalTenantContext context) {
         throw new SubscriptionBaseError(NOT_IMPLEMENTED);
     }
 
     @Override
-    public Map<UUID, List<SubscriptionEvent>> getEventsForBundle(final UUID bundleId, final InternalTenantContext context) {
+    public Map<UUID, List<SubscriptionBaseEvent>> getEventsForBundle(final UUID bundleId, final InternalTenantContext context) {
         throw new SubscriptionBaseError(NOT_IMPLEMENTED);
     }
 
     @Override
-    public List<SubscriptionEvent> getPendingEventsForSubscription(final UUID subscriptionId, final InternalTenantContext context) {
+    public List<SubscriptionBaseEvent> getPendingEventsForSubscription(final UUID subscriptionId, final InternalTenantContext context) {
         throw new SubscriptionBaseError(NOT_IMPLEMENTED);
     }
 
diff --git a/subscription/src/main/java/com/ning/billing/subscription/engine/dao/SubscriptionDao.java b/subscription/src/main/java/com/ning/billing/subscription/engine/dao/SubscriptionDao.java
index 11b4c55..b1fd01f 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/engine/dao/SubscriptionDao.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/engine/dao/SubscriptionDao.java
@@ -27,7 +27,7 @@ import com.ning.billing.subscription.api.transfer.TransferCancelData;
 import com.ning.billing.subscription.api.user.DefaultSubscriptionBase;
 import com.ning.billing.subscription.api.user.DefaultSubscriptionBaseBundle;
 import com.ning.billing.subscription.api.user.SubscriptionBaseBundle;
-import com.ning.billing.subscription.events.SubscriptionEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
 import com.ning.billing.subscription.api.SubscriptionBase;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
@@ -61,28 +61,28 @@ public interface SubscriptionDao {
     public void updateChargedThroughDate(DefaultSubscriptionBase subscription, InternalCallContext context);
 
     // Event apis
-    public void createNextPhaseEvent(DefaultSubscriptionBase subscription, SubscriptionEvent nextPhase, InternalCallContext context);
+    public void createNextPhaseEvent(DefaultSubscriptionBase subscription, SubscriptionBaseEvent nextPhase, InternalCallContext context);
 
-    public SubscriptionEvent getEventById(UUID eventId, InternalTenantContext context);
+    public SubscriptionBaseEvent getEventById(UUID eventId, InternalTenantContext context);
 
-    public Map<UUID, List<SubscriptionEvent>> getEventsForBundle(UUID bundleId, InternalTenantContext context);
+    public Map<UUID, List<SubscriptionBaseEvent>> getEventsForBundle(UUID bundleId, InternalTenantContext context);
 
-    public List<SubscriptionEvent> getEventsForSubscription(UUID subscriptionId, InternalTenantContext context);
+    public List<SubscriptionBaseEvent> getEventsForSubscription(UUID subscriptionId, InternalTenantContext context);
 
-    public List<SubscriptionEvent> getPendingEventsForSubscription(UUID subscriptionId, InternalTenantContext context);
+    public List<SubscriptionBaseEvent> getPendingEventsForSubscription(UUID subscriptionId, InternalTenantContext context);
 
     // SubscriptionBase creation, cancellation, changePlan apis
-    public void createSubscription(DefaultSubscriptionBase subscription, List<SubscriptionEvent> initialEvents, InternalCallContext context);
+    public void createSubscription(DefaultSubscriptionBase subscription, List<SubscriptionBaseEvent> initialEvents, InternalCallContext context);
 
-    public void recreateSubscription(DefaultSubscriptionBase subscription, List<SubscriptionEvent> recreateEvents, InternalCallContext context);
+    public void recreateSubscription(DefaultSubscriptionBase subscription, List<SubscriptionBaseEvent> recreateEvents, InternalCallContext context);
 
-    public void cancelSubscription(DefaultSubscriptionBase subscription, SubscriptionEvent cancelEvent, InternalCallContext context, int cancelSeq);
+    public void cancelSubscription(DefaultSubscriptionBase subscription, SubscriptionBaseEvent cancelEvent, InternalCallContext context, int cancelSeq);
 
-    public void cancelSubscriptions(final List<DefaultSubscriptionBase> subscriptions, final List<SubscriptionEvent> cancelEvents, final InternalCallContext context);
+    public void cancelSubscriptions(final List<DefaultSubscriptionBase> subscriptions, final List<SubscriptionBaseEvent> cancelEvents, final InternalCallContext context);
 
-    public void uncancelSubscription(DefaultSubscriptionBase subscription, List<SubscriptionEvent> uncancelEvents, InternalCallContext context);
+    public void uncancelSubscription(DefaultSubscriptionBase subscription, List<SubscriptionBaseEvent> uncancelEvents, InternalCallContext context);
 
-    public void changePlan(DefaultSubscriptionBase subscription, List<SubscriptionEvent> changeEvents, InternalCallContext context);
+    public void changePlan(DefaultSubscriptionBase subscription, List<SubscriptionBaseEvent> changeEvents, InternalCallContext context);
 
     public void migrate(UUID accountId, AccountMigrationData data, InternalCallContext context);
 
diff --git a/subscription/src/main/java/com/ning/billing/subscription/engine/dao/SubscriptionEventSqlDao.java b/subscription/src/main/java/com/ning/billing/subscription/engine/dao/SubscriptionEventSqlDao.java
index 9fa1931..6b786b8 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/engine/dao/SubscriptionEventSqlDao.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/engine/dao/SubscriptionEventSqlDao.java
@@ -25,7 +25,7 @@ import org.skife.jdbi.v2.sqlobject.SqlQuery;
 import org.skife.jdbi.v2.sqlobject.SqlUpdate;
 
 import com.ning.billing.subscription.engine.dao.model.SubscriptionEventModelDao;
-import com.ning.billing.subscription.events.SubscriptionEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
 import com.ning.billing.util.audit.ChangeType;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
@@ -34,7 +34,7 @@ import com.ning.billing.util.entity.dao.EntitySqlDao;
 import com.ning.billing.util.entity.dao.EntitySqlDaoStringTemplate;
 
 @EntitySqlDaoStringTemplate
-public interface SubscriptionEventSqlDao extends EntitySqlDao<SubscriptionEventModelDao, SubscriptionEvent> {
+public interface SubscriptionEventSqlDao extends EntitySqlDao<SubscriptionEventModelDao, SubscriptionBaseEvent> {
 
     @SqlUpdate
     @Audited(ChangeType.UPDATE)
diff --git a/subscription/src/main/java/com/ning/billing/subscription/events/EventBase.java b/subscription/src/main/java/com/ning/billing/subscription/events/EventBase.java
index dc5738d..742ff0a 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/events/EventBase.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/events/EventBase.java
@@ -22,7 +22,7 @@ import org.joda.time.DateTime;
 
 import com.ning.billing.subscription.events.user.ApiEvent;
 
-public abstract class EventBase implements SubscriptionEvent {
+public abstract class EventBase implements SubscriptionBaseEvent {
 
     private final long totalOrdering;
     private final UUID uuid;
@@ -124,7 +124,7 @@ public abstract class EventBase implements SubscriptionEvent {
     // - If all that is not enough return consistent by random ordering based on UUID
     //
     @Override
-    public int compareTo(final SubscriptionEvent other) {
+    public int compareTo(final SubscriptionBaseEvent other) {
         if (other == null) {
             throw new IllegalArgumentException("IEvent is compared to a null instance");
         }
@@ -152,10 +152,10 @@ public abstract class EventBase implements SubscriptionEvent {
 
     @Override
     public boolean equals(final Object other) {
-        if (!(other instanceof SubscriptionEvent)) {
+        if (!(other instanceof SubscriptionBaseEvent)) {
             return false;
         }
-        return (this.compareTo((SubscriptionEvent) other) == 0);
+        return (this.compareTo((SubscriptionBaseEvent) other) == 0);
     }
 
     @Override
diff --git a/subscription/src/main/java/com/ning/billing/subscription/events/phase/PhaseEvent.java b/subscription/src/main/java/com/ning/billing/subscription/events/phase/PhaseEvent.java
index f7f94a3..d8f6ea9 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/events/phase/PhaseEvent.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/events/phase/PhaseEvent.java
@@ -17,9 +17,9 @@
 package com.ning.billing.subscription.events.phase;
 
 
-import com.ning.billing.subscription.events.SubscriptionEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
 
-public interface PhaseEvent extends SubscriptionEvent {
+public interface PhaseEvent extends SubscriptionBaseEvent {
 
     public String getPhase();
 }
diff --git a/subscription/src/main/java/com/ning/billing/subscription/events/user/ApiEvent.java b/subscription/src/main/java/com/ning/billing/subscription/events/user/ApiEvent.java
index 4756a68..9622e7b 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/events/user/ApiEvent.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/events/user/ApiEvent.java
@@ -16,10 +16,10 @@
 
 package com.ning.billing.subscription.events.user;
 
-import com.ning.billing.subscription.events.SubscriptionEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
 
 
-public interface ApiEvent extends SubscriptionEvent {
+public interface ApiEvent extends SubscriptionBaseEvent {
 
     public String getEventPlan();
 
diff --git a/subscription/src/test/java/com/ning/billing/subscription/alignment/TestPlanAligner.java b/subscription/src/test/java/com/ning/billing/subscription/alignment/TestPlanAligner.java
index 3dab04f..1dcdb85 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/alignment/TestPlanAligner.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/alignment/TestPlanAligner.java
@@ -38,7 +38,7 @@ import com.ning.billing.subscription.api.user.DefaultSubscriptionBase;
 import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 import com.ning.billing.subscription.api.user.SubscriptionBaseTransition;
 import com.ning.billing.subscription.api.user.SubscriptionBuilder;
-import com.ning.billing.subscription.events.SubscriptionEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
 import com.ning.billing.subscription.events.user.ApiEventBase;
 import com.ning.billing.subscription.events.user.ApiEventBuilder;
 import com.ning.billing.subscription.events.user.ApiEventType;
@@ -174,12 +174,12 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
 
         // Create the transitions
         final DefaultSubscriptionBase defaultSubscriptionBase = new DefaultSubscriptionBase(builder, null, clock);
-        final SubscriptionEvent event = createSubscriptionEvent(builder.getAlignStartDate(),
+        final SubscriptionBaseEvent event = createSubscriptionEvent(builder.getAlignStartDate(),
                                                                 productName,
                                                                 phaseType,
                                                                 ApiEventType.CREATE,
                                                                 defaultSubscriptionBase.getActiveVersion());
-        defaultSubscriptionBase.rebuildTransitions(ImmutableList.<SubscriptionEvent>of(event), catalogService.getFullCatalog());
+        defaultSubscriptionBase.rebuildTransitions(ImmutableList.<SubscriptionBaseEvent>of(event), catalogService.getFullCatalog());
 
         Assert.assertEquals(defaultSubscriptionBase.getAllTransitions().size(), 1);
         Assert.assertNull(defaultSubscriptionBase.getAllTransitions().get(0).getPreviousPhase());
@@ -193,18 +193,18 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
                                     final String previousProductName,
                                     final String newProductName,
                                     final PhaseType commonPhaseType) {
-        final SubscriptionEvent previousEvent = createSubscriptionEvent(defaultSubscriptionBase.getStartDate(),
+        final SubscriptionBaseEvent previousEvent = createSubscriptionEvent(defaultSubscriptionBase.getStartDate(),
                                                                         previousProductName,
                                                                         commonPhaseType,
                                                                         ApiEventType.CREATE,
                                                                         defaultSubscriptionBase.getActiveVersion());
-        final SubscriptionEvent event = createSubscriptionEvent(effectiveChangeDate,
+        final SubscriptionBaseEvent event = createSubscriptionEvent(effectiveChangeDate,
                                                                 newProductName,
                                                                 commonPhaseType,
                                                                 ApiEventType.CHANGE,
                                                                 defaultSubscriptionBase.getActiveVersion());
 
-        defaultSubscriptionBase.rebuildTransitions(ImmutableList.<SubscriptionEvent>of(previousEvent, event), catalogService.getFullCatalog());
+        defaultSubscriptionBase.rebuildTransitions(ImmutableList.<SubscriptionBaseEvent>of(previousEvent, event), catalogService.getFullCatalog());
 
         final List<SubscriptionBaseTransition> newTransitions = defaultSubscriptionBase.getAllTransitions();
         Assert.assertEquals(newTransitions.size(), 2);
@@ -213,7 +213,7 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
         Assert.assertNotNull(newTransitions.get(1).getNextPhase());
     }
 
-    private SubscriptionEvent createSubscriptionEvent(final DateTime effectiveDate,
+    private SubscriptionBaseEvent createSubscriptionEvent(final DateTime effectiveDate,
                                                       final String productName,
                                                       final PhaseType phaseType,
                                                       final ApiEventType apiEventType,
diff --git a/subscription/src/test/java/com/ning/billing/subscription/alignment/TestTimedMigration.java b/subscription/src/test/java/com/ning/billing/subscription/alignment/TestTimedMigration.java
index 0e19339..1a69816 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/alignment/TestTimedMigration.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/alignment/TestTimedMigration.java
@@ -27,7 +27,7 @@ import org.testng.annotations.Test;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.subscription.SubscriptionTestSuiteNoDB;
-import com.ning.billing.subscription.events.SubscriptionEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
 import com.ning.billing.subscription.events.user.ApiEventType;
 
 public class TestTimedMigration extends SubscriptionTestSuiteNoDB {
@@ -35,7 +35,7 @@ public class TestTimedMigration extends SubscriptionTestSuiteNoDB {
     @Test(groups = "fast")
     public void testConstructor() throws Exception {
         final DateTime eventTime = new DateTime(DateTimeZone.UTC);
-        final SubscriptionEvent.EventType eventType = SubscriptionEvent.EventType.API_USER;
+        final SubscriptionBaseEvent.EventType eventType = SubscriptionBaseEvent.EventType.API_USER;
         final ApiEventType apiEventType = ApiEventType.CREATE;
         final Plan plan = Mockito.mock(Plan.class);
         final PlanPhase phase = Mockito.mock(PlanPhase.class);
diff --git a/subscription/src/test/java/com/ning/billing/subscription/api/transfer/TestDefaultSubscriptionTransferApi.java b/subscription/src/test/java/com/ning/billing/subscription/api/transfer/TestDefaultSubscriptionTransferApi.java
index e628f87..d144351 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/api/transfer/TestDefaultSubscriptionTransferApi.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/api/transfer/TestDefaultSubscriptionTransferApi.java
@@ -40,8 +40,8 @@ import com.ning.billing.subscription.api.timeline.SubscriptionBaseTimelineApi;
 import com.ning.billing.subscription.api.user.DefaultSubscriptionBase;
 import com.ning.billing.subscription.api.user.SubscriptionBuilder;
 import com.ning.billing.subscription.engine.dao.SubscriptionDao;
-import com.ning.billing.subscription.events.SubscriptionEvent;
-import com.ning.billing.subscription.events.SubscriptionEvent.EventType;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent.EventType;
 import com.ning.billing.subscription.events.user.ApiEventTransfer;
 import com.ning.billing.subscription.events.user.ApiEventType;
 import com.ning.billing.subscription.api.timeline.SubscriptionBaseTimeline.ExistingEvent;
@@ -79,7 +79,7 @@ public class TestDefaultSubscriptionTransferApi extends SubscriptionTestSuiteNoD
         final DefaultSubscriptionBase subscription = new DefaultSubscriptionBase(subscriptionBuilder);
 
         final DateTime transferDate = subscriptionStartTime.plusDays(10);
-        final List<SubscriptionEvent> events = transferApi.toEvents(existingEvents, subscription, transferDate, callContext);
+        final List<SubscriptionBaseEvent> events = transferApi.toEvents(existingEvents, subscription, transferDate, callContext);
 
         Assert.assertEquals(events.size(), 0);
     }
@@ -94,7 +94,7 @@ public class TestDefaultSubscriptionTransferApi extends SubscriptionTestSuiteNoD
         final DefaultSubscriptionBase subscription = new DefaultSubscriptionBase(subscriptionBuilder);
 
         final DateTime transferDate = subscriptionStartTime.plusHours(1);
-        final List<SubscriptionEvent> events = transferApi.toEvents(existingEvents, subscription, transferDate, callContext);
+        final List<SubscriptionBaseEvent> events = transferApi.toEvents(existingEvents, subscription, transferDate, callContext);
 
         Assert.assertEquals(events.size(), 1);
         Assert.assertEquals(events.get(0).getType(), EventType.API_USER);
@@ -108,7 +108,7 @@ public class TestDefaultSubscriptionTransferApi extends SubscriptionTestSuiteNoD
         final DateTime transferDate = clock.getUTCNow();
         final DateTime migrateSubscriptionEventEffectiveDate = transferDate.minusDays(10);
         final DateTime migrateBillingEventEffectiveDate = migrateSubscriptionEventEffectiveDate.plusDays(1);
-        final List<SubscriptionEvent> events = transferBundle(migrateSubscriptionEventEffectiveDate, migrateBillingEventEffectiveDate, transferDate);
+        final List<SubscriptionBaseEvent> events = transferBundle(migrateSubscriptionEventEffectiveDate, migrateBillingEventEffectiveDate, transferDate);
 
         Assert.assertEquals(events.size(), 1);
         Assert.assertEquals(events.get(0).getType(), EventType.API_USER);
@@ -122,7 +122,7 @@ public class TestDefaultSubscriptionTransferApi extends SubscriptionTestSuiteNoD
         final DateTime transferDate = clock.getUTCNow();
         final DateTime migrateSubscriptionEventEffectiveDate = transferDate.minusDays(10);
         final DateTime migrateBillingEventEffectiveDate = migrateSubscriptionEventEffectiveDate;
-        final List<SubscriptionEvent> events = transferBundle(migrateSubscriptionEventEffectiveDate, migrateBillingEventEffectiveDate, transferDate);
+        final List<SubscriptionBaseEvent> events = transferBundle(migrateSubscriptionEventEffectiveDate, migrateBillingEventEffectiveDate, transferDate);
 
         Assert.assertEquals(events.size(), 1);
         Assert.assertEquals(events.get(0).getType(), EventType.API_USER);
@@ -136,7 +136,7 @@ public class TestDefaultSubscriptionTransferApi extends SubscriptionTestSuiteNoD
         final DateTime transferDate = clock.getUTCNow();
         final DateTime migrateSubscriptionEventEffectiveDate = transferDate.minusDays(10);
         final DateTime migrateBillingEventEffectiveDate = migrateSubscriptionEventEffectiveDate.plusDays(20);
-        final List<SubscriptionEvent> events = transferBundle(migrateSubscriptionEventEffectiveDate, migrateBillingEventEffectiveDate, transferDate);
+        final List<SubscriptionBaseEvent> events = transferBundle(migrateSubscriptionEventEffectiveDate, migrateBillingEventEffectiveDate, transferDate);
 
         Assert.assertEquals(events.size(), 1);
         Assert.assertEquals(events.get(0).getType(), EventType.API_USER);
@@ -150,7 +150,7 @@ public class TestDefaultSubscriptionTransferApi extends SubscriptionTestSuiteNoD
         final DateTime transferDate = clock.getUTCNow();
         final DateTime migrateSubscriptionEventEffectiveDate = transferDate.plusDays(10);
         final DateTime migrateBillingEventEffectiveDate = migrateSubscriptionEventEffectiveDate.plusDays(20);
-        final List<SubscriptionEvent> events = transferBundle(migrateSubscriptionEventEffectiveDate, migrateBillingEventEffectiveDate, transferDate);
+        final List<SubscriptionBaseEvent> events = transferBundle(migrateSubscriptionEventEffectiveDate, migrateBillingEventEffectiveDate, transferDate);
 
         Assert.assertEquals(events.size(), 1);
         Assert.assertEquals(events.get(0).getType(), EventType.API_USER);
@@ -158,7 +158,7 @@ public class TestDefaultSubscriptionTransferApi extends SubscriptionTestSuiteNoD
         Assert.assertEquals(((ApiEventTransfer) events.get(0)).getEventType(), ApiEventType.TRANSFER);
     }
 
-    private List<SubscriptionEvent> transferBundle(final DateTime migrateSubscriptionEventEffectiveDate, final DateTime migrateBillingEventEffectiveDate,
+    private List<SubscriptionBaseEvent> transferBundle(final DateTime migrateSubscriptionEventEffectiveDate, final DateTime migrateBillingEventEffectiveDate,
                                                   final DateTime transferDate) throws SubscriptionBaseTransferApiException {
         final ImmutableList<ExistingEvent> existingEvents = createMigrateEvents(migrateSubscriptionEventEffectiveDate, migrateBillingEventEffectiveDate);
         final SubscriptionBuilder subscriptionBuilder = new SubscriptionBuilder();
diff --git a/subscription/src/test/java/com/ning/billing/subscription/api/user/TestSubscriptionHelper.java b/subscription/src/test/java/com/ning/billing/subscription/api/user/TestSubscriptionHelper.java
index 75cb4a8..8bcbe04 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/api/user/TestSubscriptionHelper.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/api/user/TestSubscriptionHelper.java
@@ -51,7 +51,7 @@ import com.ning.billing.subscription.api.migration.SubscriptionBaseMigrationApi.
 import com.ning.billing.subscription.api.timeline.SubscriptionBaseRepairException;
 import com.ning.billing.subscription.api.timeline.SubscriptionBaseTimeline;
 import com.ning.billing.subscription.engine.dao.SubscriptionDao;
-import com.ning.billing.subscription.events.SubscriptionEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
 import com.ning.billing.subscription.events.phase.PhaseEvent;
 import com.ning.billing.subscription.events.user.ApiEvent;
 import com.ning.billing.subscription.events.user.ApiEventType;
@@ -116,7 +116,7 @@ public class TestSubscriptionHelper {
     }
 
     public void checkNextPhaseChange(final DefaultSubscriptionBase subscription, final int expPendingEvents, final DateTime expPhaseChange) {
-        final List<SubscriptionEvent> events = dao.getPendingEventsForSubscription(subscription.getId(), callContext);
+        final List<SubscriptionBaseEvent> events = dao.getPendingEventsForSubscription(subscription.getId(), callContext);
         assertNotNull(events);
         printEvents(events);
         assertEquals(events.size(), expPendingEvents);
@@ -124,7 +124,7 @@ public class TestSubscriptionHelper {
             boolean foundPhase = false;
             boolean foundChange = false;
 
-            for (final SubscriptionEvent cur : events) {
+            for (final SubscriptionBaseEvent cur : events) {
                 if (cur instanceof PhaseEvent) {
                     assertEquals(foundPhase, false);
                     foundPhase = true;
@@ -227,8 +227,8 @@ public class TestSubscriptionHelper {
         return new PlanPhaseSpecifier(productName, ProductCategory.BASE, term, priceList, phaseType);
     }
 
-    public void printEvents(final List<SubscriptionEvent> events) {
-        for (final SubscriptionEvent cur : events) {
+    public void printEvents(final List<SubscriptionBaseEvent> events) {
+        for (final SubscriptionBaseEvent cur : events) {
             log.debug("Inspect event " + cur);
         }
     }
diff --git a/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiChangePlan.java b/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiChangePlan.java
index bf9da35..a7601e7 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiChangePlan.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiChangePlan.java
@@ -33,7 +33,7 @@ import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.catalog.api.PriceListSet;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.subscription.SubscriptionTestSuiteWithEmbeddedDB;
-import com.ning.billing.subscription.events.SubscriptionEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
 import com.ning.billing.subscription.events.user.ApiEvent;
 import com.ning.billing.util.svcapi.subscription.SubscriptionBillingApiException;
 
@@ -140,7 +140,7 @@ public class TestUserApiChangePlan extends SubscriptionTestSuiteWithEmbeddedDB {
             testUtil.checkNextPhaseChange(subscription, 2, nextExpectedPhaseChange);
 
             // ALSO VERIFY PENDING CHANGE EVENT
-            final List<SubscriptionEvent> events = dao.getPendingEventsForSubscription(subscription.getId(), internalCallContext);
+            final List<SubscriptionBaseEvent> events = dao.getPendingEventsForSubscription(subscription.getId(), internalCallContext);
             assertTrue(events.get(0) instanceof ApiEvent);
 
             // MOVE TO EOT
diff --git a/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiCreate.java b/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiCreate.java
index 4ff94e5..9a35808 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiCreate.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiCreate.java
@@ -33,7 +33,7 @@ import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.catalog.api.PriceListSet;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.subscription.SubscriptionTestSuiteWithEmbeddedDB;
-import com.ning.billing.subscription.events.SubscriptionEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
 import com.ning.billing.subscription.events.phase.PhaseEvent;
 
 import static org.testng.Assert.assertEquals;
@@ -65,11 +65,11 @@ public class TestUserApiCreate extends SubscriptionTestSuiteWithEmbeddedDB {
             // In addition to Alignment phase we also test SubscriptionBaseTransition eventIds and created dates.
             // Keep tracks of row events to compare with ids and created dates returned by SubscriptionBaseTransition later.
             //
-            final List<SubscriptionEvent> events = subscription.getEvents();
+            final List<SubscriptionBaseEvent> events = subscription.getEvents();
             Assert.assertEquals(events.size(), 2);
 
-            final SubscriptionEvent trialEvent = events.get(0);
-            final SubscriptionEvent phaseEvent = events.get(1);
+            final SubscriptionBaseEvent trialEvent = events.get(0);
+            final SubscriptionBaseEvent phaseEvent = events.get(1);
 
 
             assertEquals(subscription.getActiveVersion(), SubscriptionEvents.INITIAL_VERSION);
@@ -165,7 +165,7 @@ public class TestUserApiCreate extends SubscriptionTestSuiteWithEmbeddedDB {
             assertEquals(currentPhase.getPhaseType(), PhaseType.TRIAL);
             assertTrue(testListener.isCompleted(5000));
 
-            final List<SubscriptionEvent> events = dao.getPendingEventsForSubscription(subscription.getId(), internalCallContext);
+            final List<SubscriptionBaseEvent> events = dao.getPendingEventsForSubscription(subscription.getId(), internalCallContext);
             assertNotNull(events);
             testUtil.printEvents(events);
             assertTrue(events.size() == 1);
diff --git a/subscription/src/test/java/com/ning/billing/subscription/engine/dao/MockSubscriptionDaoMemory.java b/subscription/src/test/java/com/ning/billing/subscription/engine/dao/MockSubscriptionDaoMemory.java
index c9a8320..dc761f5 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/engine/dao/MockSubscriptionDaoMemory.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/engine/dao/MockSubscriptionDaoMemory.java
@@ -45,8 +45,8 @@ import com.ning.billing.subscription.api.user.SubscriptionBaseBundle;
 import com.ning.billing.subscription.api.user.SubscriptionBuilder;
 import com.ning.billing.subscription.engine.core.DefaultSubscriptionBaseService;
 import com.ning.billing.subscription.engine.core.SubscriptionNotificationKey;
-import com.ning.billing.subscription.events.SubscriptionEvent;
-import com.ning.billing.subscription.events.SubscriptionEvent.EventType;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent;
+import com.ning.billing.subscription.events.SubscriptionBaseEvent.EventType;
 import com.ning.billing.subscription.events.user.ApiEvent;
 import com.ning.billing.subscription.events.user.ApiEventType;
 import com.ning.billing.notificationq.api.NotificationEvent;
@@ -67,7 +67,7 @@ public class MockSubscriptionDaoMemory implements SubscriptionDao {
 
     private final List<SubscriptionBaseBundle> bundles;
     private final List<SubscriptionBase> subscriptions;
-    private final TreeSet<SubscriptionEvent> events;
+    private final TreeSet<SubscriptionBaseEvent> events;
     private final Clock clock;
     private final NotificationQueueService notificationQueueService;
     private final CatalogService catalogService;
@@ -82,7 +82,7 @@ public class MockSubscriptionDaoMemory implements SubscriptionDao {
         this.notificationQueueService = notificationQueueService;
         this.bundles = new ArrayList<SubscriptionBaseBundle>();
         this.subscriptions = new ArrayList<SubscriptionBase>();
-        this.events = new TreeSet<SubscriptionEvent>();
+        this.events = new TreeSet<SubscriptionBaseEvent>();
     }
 
     public void reset() {
@@ -166,11 +166,11 @@ public class MockSubscriptionDaoMemory implements SubscriptionDao {
     }
 
     @Override
-    public void createSubscription(final DefaultSubscriptionBase subscription, final List<SubscriptionEvent> initialEvents,
+    public void createSubscription(final DefaultSubscriptionBase subscription, final List<SubscriptionBaseEvent> initialEvents,
                                    final InternalCallContext context) {
         synchronized (events) {
             events.addAll(initialEvents);
-            for (final SubscriptionEvent cur : initialEvents) {
+            for (final SubscriptionBaseEvent cur : initialEvents) {
                 recordFutureNotificationFromTransaction(null, cur.getEffectiveDate(), new SubscriptionNotificationKey(cur.getId()), context);
             }
         }
@@ -179,10 +179,10 @@ public class MockSubscriptionDaoMemory implements SubscriptionDao {
     }
 
     @Override
-    public void recreateSubscription(final DefaultSubscriptionBase subscription, final List<SubscriptionEvent> recreateEvents, final InternalCallContext context) {
+    public void recreateSubscription(final DefaultSubscriptionBase subscription, final List<SubscriptionBaseEvent> recreateEvents, final InternalCallContext context) {
         synchronized (events) {
             events.addAll(recreateEvents);
-            for (final SubscriptionEvent cur : recreateEvents) {
+            for (final SubscriptionBaseEvent cur : recreateEvents) {
                 recordFutureNotificationFromTransaction(null, cur.getEffectiveDate(), new SubscriptionNotificationKey(cur.getId()), context);
             }
         }
@@ -200,10 +200,10 @@ public class MockSubscriptionDaoMemory implements SubscriptionDao {
     }
 
     @Override
-    public List<SubscriptionEvent> getEventsForSubscription(final UUID subscriptionId, final InternalTenantContext context) {
+    public List<SubscriptionBaseEvent> getEventsForSubscription(final UUID subscriptionId, final InternalTenantContext context) {
         synchronized (events) {
-            final List<SubscriptionEvent> results = new LinkedList<SubscriptionEvent>();
-            for (final SubscriptionEvent cur : events) {
+            final List<SubscriptionBaseEvent> results = new LinkedList<SubscriptionBaseEvent>();
+            for (final SubscriptionBaseEvent cur : events) {
                 if (cur.getSubscriptionId().equals(subscriptionId)) {
                     results.add(cur);
                 }
@@ -213,10 +213,10 @@ public class MockSubscriptionDaoMemory implements SubscriptionDao {
     }
 
     @Override
-    public List<SubscriptionEvent> getPendingEventsForSubscription(final UUID subscriptionId, final InternalTenantContext context) {
+    public List<SubscriptionBaseEvent> getPendingEventsForSubscription(final UUID subscriptionId, final InternalTenantContext context) {
         synchronized (events) {
-            final List<SubscriptionEvent> results = new LinkedList<SubscriptionEvent>();
-            for (final SubscriptionEvent cur : events) {
+            final List<SubscriptionBaseEvent> results = new LinkedList<SubscriptionBaseEvent>();
+            for (final SubscriptionBaseEvent cur : events) {
                 if (cur.isActive() &&
                     cur.getEffectiveDate().isAfter(clock.getUTCNow()) &&
                     cur.getSubscriptionId().equals(subscriptionId)) {
@@ -239,7 +239,7 @@ public class MockSubscriptionDaoMemory implements SubscriptionDao {
     }
 
     @Override
-    public void createNextPhaseEvent(final DefaultSubscriptionBase subscription, final SubscriptionEvent nextPhase, final InternalCallContext context) {
+    public void createNextPhaseEvent(final DefaultSubscriptionBase subscription, final SubscriptionBaseEvent nextPhase, final InternalCallContext context) {
         cancelNextPhaseEvent(subscription.getId(), context);
         insertEvent(nextPhase, context);
     }
@@ -271,7 +271,7 @@ public class MockSubscriptionDaoMemory implements SubscriptionDao {
     }
 
     @Override
-    public void cancelSubscription(final DefaultSubscriptionBase subscription, final SubscriptionEvent cancelEvent,
+    public void cancelSubscription(final DefaultSubscriptionBase subscription, final SubscriptionBaseEvent cancelEvent,
                                    final InternalCallContext context, final int seqId) {
         synchronized (events) {
             cancelNextPhaseEvent(subscription.getId(), context);
@@ -280,7 +280,7 @@ public class MockSubscriptionDaoMemory implements SubscriptionDao {
     }
 
     @Override
-    public void cancelSubscriptions(final List<DefaultSubscriptionBase> subscriptions, final List<SubscriptionEvent> cancelEvents, final InternalCallContext context) {
+    public void cancelSubscriptions(final List<DefaultSubscriptionBase> subscriptions, final List<SubscriptionBaseEvent> cancelEvents, final InternalCallContext context) {
         synchronized (events) {
             for (int i = 0; i < subscriptions.size(); i++) {
                 cancelSubscription(subscriptions.get(i), cancelEvents.get(i), context, 0);
@@ -289,18 +289,18 @@ public class MockSubscriptionDaoMemory implements SubscriptionDao {
     }
 
     @Override
-    public void changePlan(final DefaultSubscriptionBase subscription, final List<SubscriptionEvent> changeEvents, final InternalCallContext context) {
+    public void changePlan(final DefaultSubscriptionBase subscription, final List<SubscriptionBaseEvent> changeEvents, final InternalCallContext context) {
         synchronized (events) {
             cancelNextChangeEvent(subscription.getId());
             cancelNextPhaseEvent(subscription.getId(), context);
             events.addAll(changeEvents);
-            for (final SubscriptionEvent cur : changeEvents) {
+            for (final SubscriptionBaseEvent cur : changeEvents) {
                 recordFutureNotificationFromTransaction(null, cur.getEffectiveDate(), new SubscriptionNotificationKey(cur.getId()), context);
             }
         }
     }
 
-    private void insertEvent(final SubscriptionEvent event, final InternalCallContext context) {
+    private void insertEvent(final SubscriptionBaseEvent event, final InternalCallContext context) {
         synchronized (events) {
             events.add(event);
             recordFutureNotificationFromTransaction(null, event.getEffectiveDate(), new SubscriptionNotificationKey(event.getId()), context);
@@ -316,9 +316,9 @@ public class MockSubscriptionDaoMemory implements SubscriptionDao {
 
         synchronized (events) {
 
-            final Iterator<SubscriptionEvent> it = events.descendingIterator();
+            final Iterator<SubscriptionBaseEvent> it = events.descendingIterator();
             while (it.hasNext()) {
-                final SubscriptionEvent cur = it.next();
+                final SubscriptionBaseEvent cur = it.next();
                 if (cur.getSubscriptionId() != subscriptionId) {
                     continue;
                 }
@@ -336,9 +336,9 @@ public class MockSubscriptionDaoMemory implements SubscriptionDao {
 
         synchronized (events) {
 
-            final Iterator<SubscriptionEvent> it = events.descendingIterator();
+            final Iterator<SubscriptionBaseEvent> it = events.descendingIterator();
             while (it.hasNext()) {
-                final SubscriptionEvent cur = it.next();
+                final SubscriptionBaseEvent cur = it.next();
                 if (cur.getSubscriptionId() != subscriptionId) {
                     continue;
                 }
@@ -353,14 +353,14 @@ public class MockSubscriptionDaoMemory implements SubscriptionDao {
     }
 
     @Override
-    public void uncancelSubscription(final DefaultSubscriptionBase subscription, final List<SubscriptionEvent> uncancelEvents,
+    public void uncancelSubscription(final DefaultSubscriptionBase subscription, final List<SubscriptionBaseEvent> uncancelEvents,
                                      final InternalCallContext context) {
 
         synchronized (events) {
             boolean foundCancel = false;
-            final Iterator<SubscriptionEvent> it = events.descendingIterator();
+            final Iterator<SubscriptionBaseEvent> it = events.descendingIterator();
             while (it.hasNext()) {
-                final SubscriptionEvent cur = it.next();
+                final SubscriptionBaseEvent cur = it.next();
                 if (cur.getSubscriptionId() != subscription.getId()) {
                     continue;
                 }
@@ -372,7 +372,7 @@ public class MockSubscriptionDaoMemory implements SubscriptionDao {
                 }
             }
             if (foundCancel) {
-                for (final SubscriptionEvent cur : uncancelEvents) {
+                for (final SubscriptionBaseEvent cur : uncancelEvents) {
                     insertEvent(cur, context);
                 }
             }
@@ -387,7 +387,7 @@ public class MockSubscriptionDaoMemory implements SubscriptionDao {
                 final DefaultSubscriptionBaseBundle bundleData = curBundle.getData();
                 for (final SubscriptionMigrationData curSubscription : curBundle.getSubscriptions()) {
                     final DefaultSubscriptionBase subData = curSubscription.getData();
-                    for (final SubscriptionEvent curEvent : curSubscription.getInitialEvents()) {
+                    for (final SubscriptionBaseEvent curEvent : curSubscription.getInitialEvents()) {
                         events.add(curEvent);
                         recordFutureNotificationFromTransaction(null, curEvent.getEffectiveDate(),
                                                                 new SubscriptionNotificationKey(curEvent.getId()), context);
@@ -401,9 +401,9 @@ public class MockSubscriptionDaoMemory implements SubscriptionDao {
     }
 
     @Override
-    public SubscriptionEvent getEventById(final UUID eventId, final InternalTenantContext context) {
+    public SubscriptionBaseEvent getEventById(final UUID eventId, final InternalTenantContext context) {
         synchronized (events) {
-            for (final SubscriptionEvent cur : events) {
+            for (final SubscriptionBaseEvent cur : events) {
                 if (cur.getId().equals(eventId)) {
                     return cur;
                 }
@@ -426,7 +426,7 @@ public class MockSubscriptionDaoMemory implements SubscriptionDao {
     }
 
     @Override
-    public Map<UUID, List<SubscriptionEvent>> getEventsForBundle(final UUID bundleId, final InternalTenantContext context) {
+    public Map<UUID, List<SubscriptionBaseEvent>> getEventsForBundle(final UUID bundleId, final InternalTenantContext context) {
         return null;
     }