killbill-uncached

Changes

entitlement/src/main/java/com/ning/billing/entitlement/engine/core/IEventNotifier.java 25(+0 -25)

entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/IEntitlementDao.java 71(+0 -71)

entitlement/src/main/java/com/ning/billing/entitlement/events/phase/IPhaseEvent.java 24(+0 -24)

Details

diff --git a/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java b/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java
index 415a002..ba7a707 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/AnalyticsListener.java
@@ -18,7 +18,7 @@ package com.ning.billing.analytics;
 
 import com.google.common.eventbus.Subscribe;
 import com.google.inject.Inject;
-import com.ning.billing.entitlement.api.user.ISubscriptionTransition;
+import com.ning.billing.entitlement.api.user.SubscriptionTransition;
 
 public class AnalyticsListener
 {
@@ -33,7 +33,7 @@ public class AnalyticsListener
     }
 
     @Subscribe
-    public void handleSubscriptionTransitionChange(final ISubscriptionTransition event)
+    public void handleSubscriptionTransitionChange(final SubscriptionTransition event)
     {
         switch (event.getTransitionType()) {
             case CREATE:
diff --git a/analytics/src/main/java/com/ning/billing/analytics/api/AnalyticsService.java b/analytics/src/main/java/com/ning/billing/analytics/api/AnalyticsService.java
index 35e123f..a08e3ab 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/api/AnalyticsService.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/api/AnalyticsService.java
@@ -19,7 +19,7 @@ package com.ning.billing.analytics.api;
 import com.google.inject.Inject;
 import com.ning.billing.analytics.AnalyticsListener;
 import com.ning.billing.lifecycle.LifecycleHandlerType;
-import com.ning.billing.util.eventbus.IEventBus;
+import com.ning.billing.util.eventbus.EventBus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -30,10 +30,10 @@ public class AnalyticsService implements IAnalyticsService
     private static final String ANALYTICS_SERVICE = "analytics-service";
 
     private final AnalyticsListener listener;
-    private final IEventBus eventBus;
+    private final EventBus eventBus;
 
     @Inject
-    public AnalyticsService(final AnalyticsListener listener, final IEventBus eventBus)
+    public AnalyticsService(final AnalyticsListener listener, final EventBus eventBus)
     {
         this.listener = listener;
         this.eventBus = eventBus;
@@ -51,7 +51,7 @@ public class AnalyticsService implements IAnalyticsService
         try {
             eventBus.register(listener);
         }
-        catch (IEventBus.EventBusException e) {
+        catch (EventBus.EventBusException e) {
             log.error("Unable to register to the EventBus!", e);
         }
     }
diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscription.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscription.java
index 5602fe8..122e794 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscription.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscription.java
@@ -25,7 +25,7 @@ import com.ning.billing.catalog.api.IPlanPhase;
 import com.ning.billing.catalog.api.IProduct;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.catalog.api.TimeUnit;
-import com.ning.billing.entitlement.api.user.ISubscription;
+import com.ning.billing.entitlement.api.user.Subscription;
 import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -34,7 +34,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.UUID;
 
-import static com.ning.billing.entitlement.api.user.ISubscription.SubscriptionState;
+import static com.ning.billing.entitlement.api.user.Subscription.SubscriptionState;
 
 /**
  * Describe a subscription for Analytics purposes
@@ -89,7 +89,7 @@ public class BusinessSubscription
      * @param subscription Subscription to use as a model
      * @param currency     Account currency
      */
-    BusinessSubscription(final ISubscription subscription, final Currency currency)
+    BusinessSubscription(final Subscription subscription, final Currency currency)
     {
         this(subscription.getCurrentPriceList(), subscription.getCurrentPlan(), subscription.getCurrentPhase(), currency, subscription.getStartDate(), subscription.getState(), subscription.getId(), subscription.getBundleId());
     }
diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionEvent.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionEvent.java
index 865d8e7..36669e1 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionEvent.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionEvent.java
@@ -20,7 +20,7 @@ import com.ning.billing.catalog.api.IPlan;
 import com.ning.billing.catalog.api.IProduct;
 import com.ning.billing.catalog.api.ProductCategory;
 
-import static com.ning.billing.entitlement.api.user.ISubscription.SubscriptionState;
+import static com.ning.billing.entitlement.api.user.Subscription.SubscriptionState;
 
 /**
  * Describe an event associated with a transition between two BusinessSubscription
diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
index fd57a06..e55bc8c 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
@@ -21,9 +21,9 @@ import com.ning.billing.account.api.IAccount;
 import com.ning.billing.account.api.IAccountUserApi;
 import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionDao;
 import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.entitlement.api.user.IEntitlementUserApi;
-import com.ning.billing.entitlement.api.user.ISubscriptionBundle;
-import com.ning.billing.entitlement.api.user.ISubscriptionTransition;
+import com.ning.billing.entitlement.api.user.EntitlementUserApi;
+import com.ning.billing.entitlement.api.user.SubscriptionBundle;
+import com.ning.billing.entitlement.api.user.SubscriptionTransition;
 import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -35,61 +35,61 @@ public class BusinessSubscriptionTransitionRecorder
     private static final Logger log = LoggerFactory.getLogger(BusinessSubscriptionTransitionRecorder.class);
 
     private final BusinessSubscriptionTransitionDao dao;
-    private final IEntitlementUserApi entitlementApi;
+    private final EntitlementUserApi entitlementApi;
     private final IAccountUserApi accountApi;
 
     @Inject
-    public BusinessSubscriptionTransitionRecorder(final BusinessSubscriptionTransitionDao dao, final IEntitlementUserApi entitlementApi, final IAccountUserApi accountApi)
+    public BusinessSubscriptionTransitionRecorder(final BusinessSubscriptionTransitionDao dao, final EntitlementUserApi entitlementApi, final IAccountUserApi accountApi)
     {
         this.dao = dao;
         this.entitlementApi = entitlementApi;
         this.accountApi = accountApi;
     }
 
-    public void subscriptionCreated(final ISubscriptionTransition created)
+    public void subscriptionCreated(final SubscriptionTransition created)
     {
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionCreated(created.getNextPlan());
         recordTransition(event, created);
     }
 
-    public void subscriptionCancelled(final ISubscriptionTransition cancelled)
+    public void subscriptionCancelled(final SubscriptionTransition cancelled)
     {
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionCancelled(cancelled.getNextPlan());
         recordTransition(event, cancelled);
     }
 
-    public void subscriptionChanged(final ISubscriptionTransition changed)
+    public void subscriptionChanged(final SubscriptionTransition changed)
     {
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionChanged(changed.getNextPlan());
         recordTransition(event, changed);
     }
 
-    public void subscriptionPaused(final ISubscriptionTransition paused)
+    public void subscriptionPaused(final SubscriptionTransition paused)
     {
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionPaused(paused.getNextPlan());
         recordTransition(event, paused);
     }
 
-    public void subscriptionResumed(final ISubscriptionTransition resumed)
+    public void subscriptionResumed(final SubscriptionTransition resumed)
     {
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionResumed(resumed.getNextPlan());
         recordTransition(event, resumed);
     }
 
-    public void subscriptionPhaseChanged(final ISubscriptionTransition phaseChanged)
+    public void subscriptionPhaseChanged(final SubscriptionTransition phaseChanged)
     {
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionPhaseChanged(phaseChanged.getNextPlan(), phaseChanged.getNextState());
         recordTransition(event, phaseChanged);
     }
 
-    public void recordTransition(final BusinessSubscriptionEvent event, final ISubscriptionTransition transition)
+    public void recordTransition(final BusinessSubscriptionEvent event, final SubscriptionTransition transition)
     {
         Currency currency = null;
         String transitionKey = null;
         String accountKey = null;
 
         // Retrieve key and currency via the bundle
-        final ISubscriptionBundle bundle = entitlementApi.getBundleFromId(transition.getBundleId());
+        final SubscriptionBundle bundle = entitlementApi.getBundleFromId(transition.getBundleId());
         if (bundle != null) {
             transitionKey = bundle.getKey();
 
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionMapper.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionMapper.java
index fb5e641..a31d104 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionMapper.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionMapper.java
@@ -30,7 +30,7 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.UUID;
 
-import static com.ning.billing.entitlement.api.user.ISubscription.SubscriptionState;
+import static com.ning.billing.entitlement.api.user.Subscription.SubscriptionState;
 
 public class BusinessSubscriptionTransitionMapper implements ResultSetMapper<BusinessSubscriptionTransition>
 {
diff --git a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
index 827a183..4da4067 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
@@ -37,14 +37,14 @@ import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.dbi.MysqlTestingHelper;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
-import com.ning.billing.entitlement.api.user.IEntitlementUserApi;
-import com.ning.billing.entitlement.api.user.ISubscription;
-import com.ning.billing.entitlement.api.user.ISubscriptionBundle;
-import com.ning.billing.entitlement.api.user.ISubscriptionTransition;
+import com.ning.billing.entitlement.api.user.EntitlementUserApi;
+import com.ning.billing.entitlement.api.user.Subscription;
+import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.entitlement.api.user.SubscriptionTransition;
-import com.ning.billing.entitlement.events.IEntitlementEvent;
+import com.ning.billing.entitlement.api.user.SubscriptionTransitionData;
+import com.ning.billing.entitlement.events.EntitlementEvent;
 import com.ning.billing.entitlement.events.user.ApiEventType;
-import com.ning.billing.util.eventbus.IEventBus;
+import com.ning.billing.util.eventbus.EventBus;
 import org.apache.commons.io.IOUtils;
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
@@ -68,13 +68,13 @@ public class TestAnalyticsService
     private IAccountUserApi accountApi;
 
     @Inject
-    private IEntitlementUserApi entitlementApi;
+    private EntitlementUserApi entitlementApi;
 
     @Inject
     private AnalyticsService service;
 
     @Inject
-    private IEventBus bus;
+    private EventBus bus;
 
     @Inject
     private BusinessSubscriptionTransitionDao dao;
@@ -82,7 +82,7 @@ public class TestAnalyticsService
     @Inject
     private MysqlTestingHelper helper;
 
-    private ISubscriptionTransition transition;
+    private SubscriptionTransition transition;
     private BusinessSubscriptionTransition expectedTransition;
 
     @BeforeClass(alwaysRun = true)
@@ -101,7 +101,7 @@ public class TestAnalyticsService
         // We need a bundle to retrieve the event key
         final MockAccount account = new MockAccount(UUID.randomUUID(), ACCOUNT_KEY, Currency.USD);
         final IAccount storedAccount = accountApi.createAccount(account);
-        final ISubscriptionBundle bundle = entitlementApi.createBundleForAccount(storedAccount, KEY);
+        final SubscriptionBundle bundle = entitlementApi.createBundleForAccount(storedAccount, KEY);
 
         // Verify we correctly initialized the account subsystem
         Assert.assertNotNull(bundle);
@@ -115,11 +115,11 @@ public class TestAnalyticsService
         final DateTime effectiveTransitionTime = new DateTime(DateTimeZone.UTC);
         final DateTime requestedTransitionTime = new DateTime(DateTimeZone.UTC);
         final String priceList = "something";
-        transition = new SubscriptionTransition(
+        transition = new SubscriptionTransitionData(
             UUID.randomUUID(),
             subscriptionId,
             bundle.getId(),
-            IEntitlementEvent.EventType.API_USER,
+            EntitlementEvent.EventType.API_USER,
             ApiEventType.CREATE,
             requestedTransitionTime,
             effectiveTransitionTime,
@@ -127,7 +127,7 @@ public class TestAnalyticsService
             null,
             null,
             null,
-            ISubscription.SubscriptionState.ACTIVE,
+            Subscription.SubscriptionState.ACTIVE,
             plan,
             phase,
             priceList
@@ -138,7 +138,7 @@ public class TestAnalyticsService
             requestedTransitionTime,
             BusinessSubscriptionEvent.subscriptionCreated(plan),
             null,
-            new BusinessSubscription(priceList, plan, phase, null, effectiveTransitionTime, ISubscription.SubscriptionState.ACTIVE, subscriptionId, bundle.getId())
+            new BusinessSubscription(priceList, plan, phase, null, effectiveTransitionTime, Subscription.SubscriptionState.ACTIVE, subscriptionId, bundle.getId())
         );
     }
 
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java
index 81c71c5..e78518d 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java
@@ -32,7 +32,7 @@ import com.ning.billing.catalog.api.IProduct;
 import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.dbi.MysqlTestingHelper;
-import com.ning.billing.entitlement.api.user.ISubscription;
+import com.ning.billing.entitlement.api.user.Subscription;
 import org.apache.commons.io.IOUtils;
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
@@ -79,8 +79,8 @@ public class TestAnalyticsDao
 
     private void setupBusinessSubscriptionTransition()
     {
-        final BusinessSubscription prevSubscription = new BusinessSubscription(null, plan, phase, Currency.USD, new DateTime(DateTimeZone.UTC), ISubscription.SubscriptionState.ACTIVE, UUID.randomUUID(), UUID.randomUUID());
-        final BusinessSubscription nextSubscription = new BusinessSubscription(null, plan, phase, Currency.USD, new DateTime(DateTimeZone.UTC), ISubscription.SubscriptionState.CANCELLED, UUID.randomUUID(), UUID.randomUUID());
+        final BusinessSubscription prevSubscription = new BusinessSubscription(null, plan, phase, Currency.USD, new DateTime(DateTimeZone.UTC), Subscription.SubscriptionState.ACTIVE, UUID.randomUUID(), UUID.randomUUID());
+        final BusinessSubscription nextSubscription = new BusinessSubscription(null, plan, phase, Currency.USD, new DateTime(DateTimeZone.UTC), Subscription.SubscriptionState.CANCELLED, UUID.randomUUID(), UUID.randomUUID());
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionCancelled(plan);
         final DateTime requestedTimestamp = new DateTime(DateTimeZone.UTC);
 
diff --git a/analytics/src/test/java/com/ning/billing/analytics/MockIEntitlementUserApi.java b/analytics/src/test/java/com/ning/billing/analytics/MockIEntitlementUserApi.java
index 1aabb67..d121438 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/MockIEntitlementUserApi.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/MockIEntitlementUserApi.java
@@ -19,9 +19,9 @@ package com.ning.billing.analytics;
 import com.ning.billing.account.api.IAccount;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
-import com.ning.billing.entitlement.api.user.IEntitlementUserApi;
-import com.ning.billing.entitlement.api.user.ISubscription;
-import com.ning.billing.entitlement.api.user.ISubscriptionBundle;
+import com.ning.billing.entitlement.api.user.EntitlementUserApi;
+import com.ning.billing.entitlement.api.user.Subscription;
+import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import org.joda.time.DateTime;
 
 import java.util.HashMap;
@@ -29,7 +29,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
-public class MockIEntitlementUserApi implements IEntitlementUserApi
+public class MockIEntitlementUserApi implements EntitlementUserApi
 {
     private final Map<UUID, String> subscriptionBundles = new HashMap<UUID, String>();
 
@@ -39,14 +39,14 @@ public class MockIEntitlementUserApi implements IEntitlementUserApi
     }
 
     @Override
-    public ISubscriptionBundle getBundleFromId(final UUID id)
+    public SubscriptionBundle getBundleFromId(final UUID id)
     {
         final String key = subscriptionBundles.get(id);
         if (key == null) {
             return null;
         }
 
-        return new ISubscriptionBundle()
+        return new SubscriptionBundle()
         {
             @Override
             public UUID getAccountId()
@@ -71,53 +71,41 @@ public class MockIEntitlementUserApi implements IEntitlementUserApi
             {
                 return key;
             }
-
-            @Override
-            public void setPrivate(final String name, final String value)
-            {
-                throw new UnsupportedOperationException();
-            }
-
-            @Override
-            public String getPrivate(final String name)
-            {
-                throw new UnsupportedOperationException();
-            }
         };
     }
 
     @Override
-    public ISubscription getSubscriptionFromId(final UUID id)
+    public Subscription getSubscriptionFromId(final UUID id)
     {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public List<ISubscriptionBundle> getBundlesForAccount(final UUID accountId)
+    public List<SubscriptionBundle> getBundlesForAccount(final UUID accountId)
     {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public List<ISubscription> getSubscriptionsForBundle(final UUID bundleId)
+    public List<Subscription> getSubscriptionsForBundle(final UUID bundleId)
     {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public ISubscriptionBundle createBundleForAccount(final IAccount account, final String bundleKey) throws EntitlementUserApiException
+    public SubscriptionBundle createBundleForAccount(final IAccount account, final String bundleKey) throws EntitlementUserApiException
     {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public ISubscription createSubscription(final UUID bundleId, final String productName, final BillingPeriod term, final String planSet, final DateTime requestedDate) throws EntitlementUserApiException
+    public Subscription createSubscription(final UUID bundleId, final String productName, final BillingPeriod term, final String planSet, final DateTime requestedDate) throws EntitlementUserApiException
     {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public List<ISubscription> getSubscriptionsForKey(String bundleKey) {
+    public List<Subscription> getSubscriptionsForKey(String bundleKey) {
         throw new UnsupportedOperationException();
     }
 }
diff --git a/analytics/src/test/java/com/ning/billing/analytics/MockSubscription.java b/analytics/src/test/java/com/ning/billing/analytics/MockSubscription.java
index a756447..447bad5 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/MockSubscription.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/MockSubscription.java
@@ -20,13 +20,13 @@ import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.IPlan;
 import com.ning.billing.catalog.api.IPlanPhase;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
-import com.ning.billing.entitlement.api.user.ISubscription;
+import com.ning.billing.entitlement.api.user.Subscription;
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 
 import java.util.UUID;
 
-public class MockSubscription implements ISubscription
+public class MockSubscription implements Subscription
 {
     private static final UUID ID = UUID.randomUUID();
     private static final UUID BUNDLE_ID = UUID.randomUUID();
@@ -103,17 +103,6 @@ public class MockSubscription implements ISubscription
         return phase;
     }
 
-    @Override
-    public void setPrivate(final String name, final String value)
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public String getPrivate(final String name)
-    {
-        throw new UnsupportedOperationException();
-    }
 
     @Override
     public void uncancel() throws EntitlementUserApiException
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java b/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java
index 86d32b1..48ee5c7 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java
@@ -22,9 +22,9 @@ import com.ning.billing.catalog.api.IPlanPhase;
 import com.ning.billing.catalog.api.IProduct;
 import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.ProductCategory;
-import com.ning.billing.entitlement.api.user.ISubscription;
-import com.ning.billing.entitlement.api.user.SubscriptionTransition;
-import com.ning.billing.entitlement.events.IEntitlementEvent;
+import com.ning.billing.entitlement.api.user.Subscription;
+import com.ning.billing.entitlement.api.user.SubscriptionTransitionData;
+import com.ning.billing.entitlement.events.EntitlementEvent;
 import com.ning.billing.entitlement.events.user.ApiEventType;
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
@@ -63,7 +63,7 @@ public class TestAnalyticsListener
         // Create a subscription
         final DateTime effectiveTransitionTime = new DateTime(DateTimeZone.UTC);
         final DateTime requestedTransitionTime = new DateTime(DateTimeZone.UTC);
-        final SubscriptionTransition firstTransition = createFirstSubscriptionTransition(requestedTransitionTime, effectiveTransitionTime);
+        final SubscriptionTransitionData firstTransition = createFirstSubscriptionTransition(requestedTransitionTime, effectiveTransitionTime);
         final BusinessSubscriptionTransition firstBST = createExpectedFirstBST(requestedTransitionTime, effectiveTransitionTime);
         listener.handleSubscriptionTransitionChange(firstTransition);
         Assert.assertEquals(dao.getTransitions(KEY).size(), 1);
@@ -72,7 +72,7 @@ public class TestAnalyticsListener
         // Pause it
         final DateTime effectivePauseTransitionTime = new DateTime(DateTimeZone.UTC);
         final DateTime requestedPauseTransitionTime = new DateTime(DateTimeZone.UTC);
-        final SubscriptionTransition pausedSubscriptionTransition = createPauseSubscriptionTransition(effectivePauseTransitionTime, requestedPauseTransitionTime, firstTransition.getNextState());
+        final SubscriptionTransitionData pausedSubscriptionTransition = createPauseSubscriptionTransition(effectivePauseTransitionTime, requestedPauseTransitionTime, firstTransition.getNextState());
         final BusinessSubscriptionTransition pausedBST = createExpectedPausedBST(requestedPauseTransitionTime, effectivePauseTransitionTime, firstBST.getNextSubscription());
         listener.handleSubscriptionTransitionChange(pausedSubscriptionTransition);
         Assert.assertEquals(dao.getTransitions(KEY).size(), 2);
@@ -81,7 +81,7 @@ public class TestAnalyticsListener
         // Un-Pause it
         final DateTime effectiveResumeTransitionTime = new DateTime(DateTimeZone.UTC);
         final DateTime requestedResumeTransitionTime = new DateTime(DateTimeZone.UTC);
-        final SubscriptionTransition resumedSubscriptionTransition = createResumeSubscriptionTransition(requestedResumeTransitionTime, effectiveResumeTransitionTime, pausedSubscriptionTransition.getNextState());
+        final SubscriptionTransitionData resumedSubscriptionTransition = createResumeSubscriptionTransition(requestedResumeTransitionTime, effectiveResumeTransitionTime, pausedSubscriptionTransition.getNextState());
         final BusinessSubscriptionTransition resumedBST = createExpectedResumedBST(requestedResumeTransitionTime, effectiveResumeTransitionTime, pausedBST.getNextSubscription());
         listener.handleSubscriptionTransitionChange(resumedSubscriptionTransition);
         Assert.assertEquals(dao.getTransitions(KEY).size(), 3);
@@ -99,28 +99,28 @@ public class TestAnalyticsListener
     private BusinessSubscriptionTransition createExpectedFirstBST(final DateTime requestedTransitionTime, final DateTime effectiveTransitionTime)
     {
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionCreated(plan);
-        final ISubscription.SubscriptionState subscriptionState = ISubscription.SubscriptionState.ACTIVE;
+        final Subscription.SubscriptionState subscriptionState = Subscription.SubscriptionState.ACTIVE;
         return createExpectedBST(event, requestedTransitionTime, effectiveTransitionTime, null, subscriptionState);
     }
 
     private BusinessSubscriptionTransition createExpectedPausedBST(final DateTime requestedTransitionTime, final DateTime effectiveTransitionTime, final BusinessSubscription lastSubscription)
     {
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionPaused(plan);
-        final ISubscription.SubscriptionState subscriptionState = ISubscription.SubscriptionState.PAUSED;
+        final Subscription.SubscriptionState subscriptionState = Subscription.SubscriptionState.PAUSED;
         return createExpectedBST(event, requestedTransitionTime, effectiveTransitionTime, lastSubscription, subscriptionState);
     }
 
     private BusinessSubscriptionTransition createExpectedResumedBST(final DateTime requestedTransitionTime, final DateTime effectiveTransitionTime, final BusinessSubscription lastSubscription)
     {
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionResumed(plan);
-        final ISubscription.SubscriptionState nextState = ISubscription.SubscriptionState.ACTIVE;
+        final Subscription.SubscriptionState nextState = Subscription.SubscriptionState.ACTIVE;
         return createExpectedBST(event, requestedTransitionTime, effectiveTransitionTime, lastSubscription, nextState);
     }
 
     private BusinessSubscriptionTransition createExpectedCancelledBST(final DateTime requestedTransitionTime, final DateTime effectiveTransitionTime, final BusinessSubscription lastSubscription)
     {
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionCancelled(plan);
-        final ISubscription.SubscriptionState nextState = ISubscription.SubscriptionState.CANCELLED;
+        final Subscription.SubscriptionState nextState = Subscription.SubscriptionState.CANCELLED;
         return createExpectedBST(event, requestedTransitionTime, effectiveTransitionTime, lastSubscription, nextState);
     }
 
@@ -129,7 +129,7 @@ public class TestAnalyticsListener
         final DateTime requestedTransitionTime,
         final DateTime effectiveTransitionTime,
         final BusinessSubscription previousSubscription,
-        final ISubscription.SubscriptionState nextState
+        final Subscription.SubscriptionState nextState
     )
     {
         return new BusinessSubscriptionTransition(
@@ -151,15 +151,15 @@ public class TestAnalyticsListener
         );
     }
 
-    private SubscriptionTransition createFirstSubscriptionTransition(final DateTime requestedTransitionTime, final DateTime effectiveTransitionTime)
+    private SubscriptionTransitionData createFirstSubscriptionTransition(final DateTime requestedTransitionTime, final DateTime effectiveTransitionTime)
     {
         final ApiEventType eventType = ApiEventType.CREATE;
-        final ISubscription.SubscriptionState nextState = ISubscription.SubscriptionState.ACTIVE;
-        return new SubscriptionTransition(
+        final Subscription.SubscriptionState nextState = Subscription.SubscriptionState.ACTIVE;
+        return new SubscriptionTransitionData(
             UUID.randomUUID(),
             subscriptionId,
             bundleUUID,
-            IEntitlementEvent.EventType.API_USER,
+            EntitlementEvent.EventType.API_USER,
             eventType,
             requestedTransitionTime,
             effectiveTransitionTime,
@@ -174,40 +174,40 @@ public class TestAnalyticsListener
         );
     }
 
-    private SubscriptionTransition createPauseSubscriptionTransition(final DateTime requestedTransitionTime, final DateTime effectiveTransitionTime, final ISubscription.SubscriptionState previousState)
+    private SubscriptionTransitionData createPauseSubscriptionTransition(final DateTime requestedTransitionTime, final DateTime effectiveTransitionTime, final Subscription.SubscriptionState previousState)
     {
         final ApiEventType eventType = ApiEventType.PAUSE;
-        final ISubscription.SubscriptionState nextState = ISubscription.SubscriptionState.PAUSED;
+        final Subscription.SubscriptionState nextState = Subscription.SubscriptionState.PAUSED;
         return createSubscriptionTransition(eventType, requestedTransitionTime, effectiveTransitionTime, previousState, nextState);
     }
 
-    private SubscriptionTransition createResumeSubscriptionTransition(final DateTime requestedTransitionTime, final DateTime effectiveTransitionTime, final ISubscription.SubscriptionState previousState)
+    private SubscriptionTransitionData createResumeSubscriptionTransition(final DateTime requestedTransitionTime, final DateTime effectiveTransitionTime, final Subscription.SubscriptionState previousState)
     {
         final ApiEventType eventType = ApiEventType.RESUME;
-        final ISubscription.SubscriptionState nextState = ISubscription.SubscriptionState.ACTIVE;
+        final Subscription.SubscriptionState nextState = Subscription.SubscriptionState.ACTIVE;
         return createSubscriptionTransition(eventType, requestedTransitionTime, effectiveTransitionTime, previousState, nextState);
     }
 
-    private SubscriptionTransition createCancelSubscriptionTransition(final DateTime requestedTransitionTime, final DateTime effectiveTransitionTime, final ISubscription.SubscriptionState previousState)
+    private SubscriptionTransitionData createCancelSubscriptionTransition(final DateTime requestedTransitionTime, final DateTime effectiveTransitionTime, final Subscription.SubscriptionState previousState)
     {
         final ApiEventType eventType = ApiEventType.CANCEL;
-        final ISubscription.SubscriptionState nextState = ISubscription.SubscriptionState.CANCELLED;
+        final Subscription.SubscriptionState nextState = Subscription.SubscriptionState.CANCELLED;
         return createSubscriptionTransition(eventType, requestedTransitionTime, effectiveTransitionTime, previousState, nextState);
     }
 
-    private SubscriptionTransition createSubscriptionTransition(
+    private SubscriptionTransitionData createSubscriptionTransition(
         final ApiEventType eventType,
         final DateTime requestedTransitionTime,
         final DateTime effectiveTransitionTime,
-        final ISubscription.SubscriptionState previousState,
-        final ISubscription.SubscriptionState nextState
+        final Subscription.SubscriptionState previousState,
+        final Subscription.SubscriptionState nextState
     )
     {
-        return new SubscriptionTransition(
+        return new SubscriptionTransitionData(
             UUID.randomUUID(),
             subscriptionId,
             bundleUUID,
-            IEntitlementEvent.EventType.API_USER,
+            EntitlementEvent.EventType.API_USER,
             eventType,
             requestedTransitionTime,
             effectiveTransitionTime,
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscription.java b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscription.java
index aea2c99..64063d3 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscription.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscription.java
@@ -22,7 +22,7 @@ import com.ning.billing.catalog.api.IPlanPhase;
 import com.ning.billing.catalog.api.IProduct;
 import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.ProductCategory;
-import com.ning.billing.entitlement.api.user.ISubscription;
+import com.ning.billing.entitlement.api.user.Subscription;
 import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
@@ -50,7 +50,7 @@ public class TestBusinessSubscription
     private IProduct product;
     private IPlan plan;
     private IPlanPhase phase;
-    private ISubscription isubscription;
+    private Subscription isubscription;
     private BusinessSubscription subscription;
 
     @BeforeMethod(alwaysRun = true)
@@ -59,7 +59,7 @@ public class TestBusinessSubscription
         product = new MockProduct("platinium", "subscription", ProductCategory.BASE);
         plan = new MockPlan("platinum-monthly", product);
         phase = new MockPhase(PhaseType.EVERGREEN, plan, MockDuration.UNLIMITED(), 25.95);
-        isubscription = new MockSubscription(ISubscription.SubscriptionState.ACTIVE, plan, phase);
+        isubscription = new MockSubscription(Subscription.SubscriptionState.ACTIVE, plan, phase);
         subscription = new BusinessSubscription(isubscription, USD);
     }
 
@@ -99,7 +99,7 @@ public class TestBusinessSubscription
         Assert.assertEquals(subscription, subscription);
         Assert.assertTrue(subscription.equals(subscription));
 
-        final ISubscription otherIsubscription = new MockSubscription(ISubscription.SubscriptionState.CANCELLED, plan, phase);
+        final Subscription otherIsubscription = new MockSubscription(Subscription.SubscriptionState.CANCELLED, plan, phase);
         Assert.assertTrue(!subscription.equals(new BusinessSubscription(otherIsubscription, USD)));
     }
 }
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionEvent.java b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionEvent.java
index dfae096..ba5ab6a 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionEvent.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionEvent.java
@@ -21,7 +21,7 @@ import com.ning.billing.catalog.api.IPlanPhase;
 import com.ning.billing.catalog.api.IProduct;
 import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.ProductCategory;
-import com.ning.billing.entitlement.api.user.ISubscription;
+import com.ning.billing.entitlement.api.user.Subscription;
 import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
@@ -31,7 +31,7 @@ public class TestBusinessSubscriptionEvent
     private IProduct product;
     private IPlan plan;
     private IPlanPhase phase;
-    private ISubscription isubscription;
+    private Subscription isubscription;
 
     @BeforeMethod(alwaysRun = true)
     public void setUp() throws Exception
@@ -39,7 +39,7 @@ public class TestBusinessSubscriptionEvent
         product = new MockProduct("platinium", "subscription", ProductCategory.BASE);
         plan = new MockPlan("platinum-monthly", product);
         phase = new MockPhase(PhaseType.EVERGREEN, plan, MockDuration.UNLIMITED(), 25.95);
-        isubscription = new MockSubscription(ISubscription.SubscriptionState.ACTIVE, plan, phase);
+        isubscription = new MockSubscription(Subscription.SubscriptionState.ACTIVE, plan, phase);
     }
 
     @Test(groups = "fast")
@@ -100,7 +100,7 @@ public class TestBusinessSubscriptionEvent
         Assert.assertEquals(event.getCategory(), product.getCategory());
         Assert.assertEquals(event.toString(), "SYSTEM_CHANGE_BASE");
 
-        isubscription = new MockSubscription(ISubscription.SubscriptionState.CANCELLED, plan, phase);
+        isubscription = new MockSubscription(Subscription.SubscriptionState.CANCELLED, plan, phase);
         event = BusinessSubscriptionEvent.subscriptionPhaseChanged(isubscription.getCurrentPlan(), isubscription.getState());
         // The subscription is cancelled, it's a system cancellation
         Assert.assertEquals(event.getEventType(), BusinessSubscriptionEvent.EventType.SYSTEM_CANCEL);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransition.java b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransition.java
index 9cc4c72..322f77b 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransition.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransition.java
@@ -21,7 +21,7 @@ import com.ning.billing.catalog.api.IPlanPhase;
 import com.ning.billing.catalog.api.IProduct;
 import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.ProductCategory;
-import com.ning.billing.entitlement.api.user.ISubscription;
+import com.ning.billing.entitlement.api.user.Subscription;
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 import org.testng.Assert;
@@ -46,8 +46,8 @@ public class TestBusinessSubscriptionTransition
         final IProduct product = new MockProduct("platinium", "subscription", ProductCategory.BASE);
         final IPlan plan = new MockPlan("platinum-monthly", product);
         final IPlanPhase phase = new MockPhase(PhaseType.EVERGREEN, plan, MockDuration.UNLIMITED(), 25.95);
-        final ISubscription prevISubscription = new MockSubscription(ISubscription.SubscriptionState.ACTIVE, plan, phase);
-        final ISubscription nextISubscription = new MockSubscription(ISubscription.SubscriptionState.CANCELLED, plan, phase);
+        final Subscription prevISubscription = new MockSubscription(Subscription.SubscriptionState.ACTIVE, plan, phase);
+        final Subscription nextISubscription = new MockSubscription(Subscription.SubscriptionState.CANCELLED, plan, phase);
 
         prevSubscription = new BusinessSubscription(prevISubscription, USD);
         nextSubscription = new BusinessSubscription(nextISubscription, USD);
diff --git a/api/src/main/java/com/ning/billing/account/api/IAccountService.java b/api/src/main/java/com/ning/billing/account/api/IAccountService.java
index fa5a9fe..777c7c9 100644
--- a/api/src/main/java/com/ning/billing/account/api/IAccountService.java
+++ b/api/src/main/java/com/ning/billing/account/api/IAccountService.java
@@ -16,9 +16,9 @@
 
 package com.ning.billing.account.api;
 
-import com.ning.billing.lifecycle.IService;
+import com.ning.billing.lifecycle.KillbillService;
 
-public interface IAccountService extends IService {
+public interface IAccountService extends KillbillService {
 
     public IAccountUserApi getAccountUserApi();
 }
diff --git a/api/src/main/java/com/ning/billing/analytics/api/IAnalyticsService.java b/api/src/main/java/com/ning/billing/analytics/api/IAnalyticsService.java
index 2a5d0c5..b817e64 100644
--- a/api/src/main/java/com/ning/billing/analytics/api/IAnalyticsService.java
+++ b/api/src/main/java/com/ning/billing/analytics/api/IAnalyticsService.java
@@ -16,7 +16,7 @@
 
 package com.ning.billing.analytics.api;
 
-import com.ning.billing.lifecycle.IService;
+import com.ning.billing.lifecycle.KillbillService;
 
-public interface IAnalyticsService extends IService {
+public interface IAnalyticsService extends KillbillService {
 }
diff --git a/api/src/main/java/com/ning/billing/catalog/api/ICatalogService.java b/api/src/main/java/com/ning/billing/catalog/api/ICatalogService.java
index 0b3b25b..3ab2bc9 100644
--- a/api/src/main/java/com/ning/billing/catalog/api/ICatalogService.java
+++ b/api/src/main/java/com/ning/billing/catalog/api/ICatalogService.java
@@ -16,9 +16,9 @@
 
 package com.ning.billing.catalog.api;
 
-import com.ning.billing.lifecycle.IService;
+import com.ning.billing.lifecycle.KillbillService;
 
-public interface ICatalogService extends IService {
+public interface ICatalogService extends KillbillService {
 
 	public abstract ICatalog getCatalog();
 
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/billing/BillingEvent.java b/api/src/main/java/com/ning/billing/entitlement/api/billing/BillingEvent.java
new file mode 100644
index 0000000..32c77e5
--- /dev/null
+++ b/api/src/main/java/com/ning/billing/entitlement/api/billing/BillingEvent.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2010-2011 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.entitlement.api.billing;
+
+import com.ning.billing.catalog.api.BillingPeriod;
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.catalog.api.IInternationalPrice;
+import org.joda.time.DateTime;
+
+import java.math.BigDecimal;
+import java.util.UUID;
+
+public interface BillingEvent extends Comparable<BillingEvent> {
+
+    /**
+     *
+     * @return the billCycleDay as seen for that subscription at that time
+     *
+     * Note: The billCycleDay may come from the Account, or the bundle or the subscription itself
+     */
+    public int getBillCycleDay();
+
+    /**
+     *
+     * @return the id for the matching subscription
+     */
+    public UUID getSubscriptionId();
+
+    /**
+     *
+     * @return the date for when that event became effective
+     */
+    public DateTime getEffectiveDate();
+
+    /**
+     *
+     * @return the name of the plan phase
+     */
+    public String getPlanPhaseName();
+
+
+    /**
+     *
+     * @return the name of the plan
+     */
+    public String getPlanName();
+
+    /**
+     *
+     * @return the international price for the event
+     *
+     */
+    public IInternationalPrice getPrice();
+
+    /**
+     *
+     * @param currency the target currency for invoicing
+     * @return the price of the plan phase in the specified currency
+     */
+    public BigDecimal getPrice(Currency currency);
+
+    /**
+     *
+     * @return the billing period for the active phase
+     */
+    public BillingPeriod getBillingPeriod();
+
+    /**
+     *
+     * @return the billing mode for the current event
+     */
+    public BillingMode getBillingMode();
+
+    /**
+     *
+     * @return the description of the billing event
+     */
+    public String getDescription();
+}
diff --git a/api/src/main/java/com/ning/billing/invoice/api/BillingEventSet.java b/api/src/main/java/com/ning/billing/invoice/api/BillingEventSet.java
index c85f540..8e42a9e 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/BillingEventSet.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/BillingEventSet.java
@@ -16,12 +16,12 @@
 
 package com.ning.billing.invoice.api;
 
-import com.ning.billing.entitlement.api.billing.IBillingEvent;
+import com.ning.billing.entitlement.api.billing.BillingEvent;
 
 import java.util.ArrayList;
 
-public class BillingEventSet extends ArrayList<IBillingEvent> {
-    public IBillingEvent getLast() {
+public class BillingEventSet extends ArrayList<BillingEvent> {
+    public BillingEvent getLast() {
         if (this.size() == 0) {return null;}
 
         return this.get(this.size() - 1);
diff --git a/api/src/main/java/com/ning/billing/invoice/api/DefaultBillingEvent.java b/api/src/main/java/com/ning/billing/invoice/api/DefaultBillingEvent.java
new file mode 100644
index 0000000..88d2ecb
--- /dev/null
+++ b/api/src/main/java/com/ning/billing/invoice/api/DefaultBillingEvent.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright 2010-2011 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.invoice.api;
+
+import com.ning.billing.catalog.api.BillingPeriod;
+import com.ning.billing.catalog.api.CatalogApiException;
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.catalog.api.IInternationalPrice;
+import com.ning.billing.entitlement.api.billing.BillingMode;
+import com.ning.billing.entitlement.api.billing.BillingEvent;
+import org.joda.time.DateTime;
+
+import java.math.BigDecimal;
+import java.util.UUID;
+
+
+//
+// TODO that class should not be under API but invoice
+// (only interfaces in api, any implementation class goes in submodule)
+//
+public class DefaultBillingEvent implements BillingEvent {
+    private final UUID subscriptionId;
+    private final DateTime startDate;
+    private final String planName;
+    private final String planPhaseName;
+    private final IInternationalPrice price;
+    private final BillingPeriod billingPeriod;
+    private final int billCycleDay;
+    private final BillingMode billingMode;
+
+
+    public DefaultBillingEvent(UUID subscriptionId, DateTime startDate, String planName, String planPhaseName, IInternationalPrice price,
+                        BillingPeriod billingPeriod, int billCycleDay, BillingMode billingMode) {
+        this.subscriptionId = subscriptionId;
+        this.startDate = startDate;
+        this.planName = planName;
+        this.planPhaseName = planPhaseName;
+        this.price = price;
+        this.billingPeriod = billingPeriod;
+        this.billCycleDay = billCycleDay;
+        this.billingMode = billingMode;
+    }
+
+    public DefaultBillingEvent(BillingEvent event, DateTime startDate) {
+        this.subscriptionId = event.getSubscriptionId();
+        this.startDate = startDate;
+        this.planName = event.getPlanName();
+        this.planPhaseName = event.getPlanPhaseName();
+        this.price = event.getPrice();
+        this.billingPeriod = event.getBillingPeriod();
+        this.billCycleDay = event.getBillCycleDay();
+        this.billingMode = event.getBillingMode();
+    }
+
+    @Override
+    public DateTime getEffectiveDate() {
+        return startDate;
+    }
+
+    @Override
+    public int getBillCycleDay() {
+        return billCycleDay;
+    }
+
+    @Override
+    public UUID getSubscriptionId() {
+        return subscriptionId;
+    }
+
+    @Override
+    public String getPlanName() {
+        return planName;
+    }
+
+    @Override
+    public String getPlanPhaseName() {
+        return planPhaseName;
+    }
+
+    @Override
+    public IInternationalPrice getPrice() {
+        return price;
+    }
+
+ // TODO handle exception correctly
+    @Override
+    public BigDecimal getPrice(Currency currency) {
+        try {
+			return price.getPrice(currency);
+		} catch (CatalogApiException e)  {
+			e.printStackTrace();
+			return new BigDecimal(0);
+		}
+    }
+
+    @Override
+    public BillingPeriod getBillingPeriod() {
+        return billingPeriod;
+    }
+
+    @Override
+    public BillingMode getBillingMode() {
+        return billingMode;
+    }
+
+    @Override
+    public String getDescription() {
+        return planName + "(" + planPhaseName + ")";
+    }
+
+    @Override
+    public int compareTo(BillingEvent billingEvent) {
+        // strict date comparison here breaks SortedTree if multiple events occur on the same day
+        int compareSubscriptions = getSubscriptionId().compareTo(billingEvent.getSubscriptionId());
+
+        if (compareSubscriptions == 0) {
+            return getEffectiveDate().compareTo(billingEvent.getEffectiveDate());
+        } else {
+            return compareSubscriptions;
+        }
+    }
+}
\ No newline at end of file
diff --git a/api/src/main/java/com/ning/billing/util/eventbus/EventBus.java b/api/src/main/java/com/ning/billing/util/eventbus/EventBus.java
new file mode 100644
index 0000000..1985465
--- /dev/null
+++ b/api/src/main/java/com/ning/billing/util/eventbus/EventBus.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2010-2011 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.eventbus;
+
+import org.skife.jdbi.v2.sqlobject.mixins.Transmogrifier;
+import com.google.common.eventbus.Subscribe;
+
+
+/**
+ *
+ * EventBus API based on the guava EventBus API
+ *
+ * The API also provides an API to send events from within a transaction
+ * with the guarantee that the event will be delivered if and only if
+ * the transaction completes. If the implementation is not based on a
+ * DB, this API is behaves the same as the regular post() call.
+ *
+ */
+public interface EventBus {
+
+
+    public class EventBusException extends Exception {
+
+        private static final long serialVersionUID = 12355236L;
+
+        public EventBusException() {
+            super();
+        }
+        public EventBusException(String message, Throwable cause) {
+            super(message, cause);
+        }
+
+        public EventBusException(String message) {
+            super(message);
+        }
+    }
+
+    /**
+     * Start accepting events and dispatching them
+     *
+     */
+    public void start();
+
+    /**
+     * Stop accepting events and flush event queue before it returns.
+     *
+     */
+    public void stop();
+
+    /**
+     *
+     * Registers all handler methods on {@code object} to receive events.
+     * Handler methods need to be Annotated with {@link Subscribe}
+     *
+     * @param handlerInstance
+     *
+     *  @throws EventBusException if bus not been started yet
+     */
+    public void register(Object handlerInstance) throws EventBusException;
+
+
+    /**
+     * Unregister the handler for a particular type of event
+     *
+     * @param handlerInstance
+     * @throws EventBusException
+     */
+    public void unregister(Object handlerInstance) throws EventBusException;
+
+
+    /**
+     * Post an event asynchronously
+     *
+     * @param event to be posted
+     *
+     *  @throws EventBusException if bus not been started yet
+     */
+    public void post(EventBusNotification event) throws EventBusException;
+
+    /**
+     *
+     * Post an event from within a transaction.
+     * Guarantees that the event is persisted on disk from within the same transaction
+     *
+     *
+     * @param event to be posted
+     * @param dao a valid DAO object obtained through the DBI.onDemand() API.
+     *
+     *  @throws EventBusException if bus not been started yet
+     */
+    public void postFromTransaction(EventBusNotification event, Transmogrifier dao) throws EventBusException;
+
+
+}
diff --git a/api/src/main/java/com/ning/billing/util/eventbus/IEventBusService.java b/api/src/main/java/com/ning/billing/util/eventbus/IEventBusService.java
index 71fa8a3..d517aba 100644
--- a/api/src/main/java/com/ning/billing/util/eventbus/IEventBusService.java
+++ b/api/src/main/java/com/ning/billing/util/eventbus/IEventBusService.java
@@ -16,9 +16,9 @@
 
 package com.ning.billing.util.eventbus;
 
-import com.ning.billing.lifecycle.IService;
+import com.ning.billing.lifecycle.KillbillService;
 
-public interface IEventBusService extends IService {
+public interface IEventBusService extends KillbillService {
 
     public IEventBus getEventBus();
 }
diff --git a/beatrix/src/main/java/com/ning/billing/beatrix/lifecycle/Lifecycle.java b/beatrix/src/main/java/com/ning/billing/beatrix/lifecycle/Lifecycle.java
index 97aa0be..253e693 100644
--- a/beatrix/src/main/java/com/ning/billing/beatrix/lifecycle/Lifecycle.java
+++ b/beatrix/src/main/java/com/ning/billing/beatrix/lifecycle/Lifecycle.java
@@ -35,7 +35,7 @@ import com.google.common.collect.Multimaps;
 import com.google.common.collect.SetMultimap;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
-import com.ning.billing.lifecycle.IService;
+import com.ning.billing.lifecycle.KillbillService;
 import com.ning.billing.lifecycle.LifecycleHandlerType;
 import com.ning.billing.lifecycle.LifecycleHandlerType.LifecycleLevel;
 import com.ning.billing.lifecycle.LifecycleHandlerType.LifecycleLevel.Sequence;
@@ -44,7 +44,7 @@ import com.ning.billing.lifecycle.LifecycleHandlerType.LifecycleLevel.Sequence;
 public class Lifecycle {
 
     private final static Logger log = LoggerFactory.getLogger(Lifecycle.class);
-    private final SetMultimap<LifecycleLevel, LifecycleHandler<? extends IService>> handlersByLevel;
+    private final SetMultimap<LifecycleLevel, LifecycleHandler<? extends KillbillService>> handlersByLevel;
 
     private final ServiceFinder serviceFinder;
 
@@ -54,12 +54,12 @@ public class Lifecycle {
     public Lifecycle(Injector injector) {
 
         this.serviceFinder = new ServiceFinder(Lifecycle.class.getClassLoader());
-        this.handlersByLevel = Multimaps.newSetMultimap(new ConcurrentHashMap<LifecycleLevel, Collection<LifecycleHandler<? extends IService>>>(),
+        this.handlersByLevel = Multimaps.newSetMultimap(new ConcurrentHashMap<LifecycleLevel, Collection<LifecycleHandler<? extends KillbillService>>>(),
 
-                new Supplier<Set<LifecycleHandler<? extends IService>>>() {
+                new Supplier<Set<LifecycleHandler<? extends KillbillService>>>() {
             @Override
-            public Set<LifecycleHandler<? extends IService>> get() {
-                return new CopyOnWriteArraySet<LifecycleHandler<? extends IService>>();
+            public Set<LifecycleHandler<? extends KillbillService>> get() {
+                return new CopyOnWriteArraySet<LifecycleHandler<? extends KillbillService>>();
             }
         });
         this.injector = injector;
@@ -68,8 +68,8 @@ public class Lifecycle {
     }
 
     public void init() {
-        Set<? extends IService> services = findServices();
-        Iterator<? extends IService> it = services.iterator();
+        Set<? extends KillbillService> services = findServices();
+        Iterator<? extends KillbillService> it = services.iterator();
         while (it.hasNext()) {
             handlersByLevel.putAll(findAllHandlers(it.next()));
         }
@@ -101,12 +101,12 @@ public class Lifecycle {
 
     private void doFireStage(LifecycleLevel level) {
         log.info("Killbill lifecycle firing stage {}", level);
-        Set<LifecycleHandler<? extends IService>> handlers = handlersByLevel.get(level);
-        for (LifecycleHandler<? extends IService> cur : handlers) {
+        Set<LifecycleHandler<? extends KillbillService>> handlers = handlersByLevel.get(level);
+        for (LifecycleHandler<? extends KillbillService> cur : handlers) {
 
             try {
                 Method method = cur.getMethod();
-                IService target = cur.getTarget();
+                KillbillService target = cur.getTarget();
                 log.info("Killbill lifecycle calling handler {} for service {}", cur.getMethod().getName(), target.getName());
                 method.invoke(target);
             } catch (Exception e) {
@@ -117,14 +117,14 @@ public class Lifecycle {
     }
 
 
-    private Set<? extends IService> findServices() {
+    private Set<? extends KillbillService> findServices() {
 
-        Set<IService> result = new HashSet<IService>();
-        Set<Class<? extends IService>> services =  serviceFinder.getServices();
-        for (Class<? extends IService> cur : services) {
+        Set<KillbillService> result = new HashSet<KillbillService>();
+        Set<Class<? extends KillbillService>> services =  serviceFinder.getServices();
+        for (Class<? extends KillbillService> cur : services) {
             log.debug("Found service {}", cur.getName());
             try {
-                IService instance = injector.getInstance(cur);
+                KillbillService instance = injector.getInstance(cur);
                 log.debug("got instance {}", instance.getName());
                 result.add(instance);
             } catch (Exception e) {
@@ -141,14 +141,14 @@ public class Lifecycle {
         log.warn(msg, e);
     }
 
-    public Multimap<LifecycleLevel, LifecycleHandler<? extends IService>> findAllHandlers(IService service) {
-        Multimap<LifecycleLevel, LifecycleHandler<? extends IService>> methodsInService = HashMultimap.create();
-        Class<? extends IService> clazz = service.getClass();
+    public Multimap<LifecycleLevel, LifecycleHandler<? extends KillbillService>> findAllHandlers(KillbillService service) {
+        Multimap<LifecycleLevel, LifecycleHandler<? extends KillbillService>> methodsInService = HashMultimap.create();
+        Class<? extends KillbillService> clazz = service.getClass();
         for (Method method : clazz.getMethods()) {
             LifecycleHandlerType annotation = method.getAnnotation(LifecycleHandlerType.class);
             if (annotation != null) {
                 LifecycleLevel level = annotation.value();
-                LifecycleHandler<? extends IService> handler = new  LifecycleHandler<IService>(service, method);
+                LifecycleHandler<? extends KillbillService> handler = new  LifecycleHandler<KillbillService>(service, method);
                 methodsInService.put(level, handler);
             }
         }
diff --git a/beatrix/src/main/java/com/ning/billing/beatrix/lifecycle/ServiceFinder.java b/beatrix/src/main/java/com/ning/billing/beatrix/lifecycle/ServiceFinder.java
index 6916cf1..b5fca46 100644
--- a/beatrix/src/main/java/com/ning/billing/beatrix/lifecycle/ServiceFinder.java
+++ b/beatrix/src/main/java/com/ning/billing/beatrix/lifecycle/ServiceFinder.java
@@ -37,36 +37,36 @@ import java.util.jar.JarFile;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.ning.billing.lifecycle.IService;
+import com.ning.billing.lifecycle.KillbillService;
 
 public class ServiceFinder {
 
     private static final Logger log = LoggerFactory.getLogger(ServiceFinder.class);
 
 	private final ClassLoader loader;
-	private final Set<Class<? extends IService>> servicesTypes;
+	private final Set<Class<? extends KillbillService>> servicesTypes;
 
 	public ServiceFinder(ClassLoader loader) {
 		this.loader = loader;
 		this.servicesTypes = initialize();
-		Iterator<Class<? extends IService>> it = servicesTypes.iterator();
+		Iterator<Class<? extends KillbillService>> it = servicesTypes.iterator();
 		while (it.hasNext()) {
-		    Class<? extends IService> svc = it.next();
+		    Class<? extends KillbillService> svc = it.next();
 			log.debug("Found IService classes {}", svc.getName());
 		}
 	}
 
-	public Set<Class<? extends IService>> getServices() {
+	public Set<Class<? extends KillbillService>> getServices() {
 	    return servicesTypes;
 	}
 
-	private Set<Class<? extends IService>> initialize() {
+	private Set<Class<? extends KillbillService>> initialize() {
 		try {
 
 		    final Set<String> packageFilter = new HashSet<String>();
 		    packageFilter.add("com.ning.billing");
 		    final String jarFilter = "killbill";
-			return findClasses(loader, IService.class.getName().toString(), jarFilter, packageFilter);
+			return findClasses(loader, KillbillService.class.getName().toString(), jarFilter, packageFilter);
 		} catch (ClassNotFoundException nfe) {
 			throw new RuntimeException("Failed to initialize ClassFinder", nfe);
 		}
@@ -76,13 +76,13 @@ public class ServiceFinder {
      *  Code originally from Kris Dover <krisdover@hotmail.com> and adapted for my purpose.
      *
      */
-	private static Set<Class<? extends IService>> findClasses(ClassLoader classLoader,
+	private static Set<Class<? extends KillbillService>> findClasses(ClassLoader classLoader,
 	        String interfaceFilter,
 	        String jarFilter,
 	        Set<String> packageFilter)
 	        throws ClassNotFoundException {
 
-	    final Set<Class<? extends IService>> result = new HashSet<Class<? extends IService>>();
+	    final Set<Class<? extends KillbillService>> result = new HashSet<Class<? extends KillbillService>>();
 
 	    Object[] classPaths;
 	    try {
@@ -165,7 +165,7 @@ public class ServiceFinder {
 	                    if (!interfaceFilter.equals(interfaceName) ) {
 	                        continue;
 	                    }
-	                    result.add((Class<? extends IService>) theClass);
+	                    result.add((Class<? extends KillbillService>) theClass);
 	                    break;
 	                }
 
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/lifecycle/TestLifecycle.java b/beatrix/src/test/java/com/ning/billing/beatrix/lifecycle/TestLifecycle.java
index b6cc153..a01220e 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/lifecycle/TestLifecycle.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/lifecycle/TestLifecycle.java
@@ -27,7 +27,7 @@ import com.google.inject.Guice;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
 import com.google.inject.Stage;
-import com.ning.billing.lifecycle.IService;
+import com.ning.billing.lifecycle.KillbillService;
 import com.ning.billing.lifecycle.LifecycleHandlerType;
 import com.ning.billing.lifecycle.LifecycleHandlerType.LifecycleLevel;
 
@@ -62,7 +62,7 @@ public class TestLifecycle {
         }
     }
 
-    public static class Service1 extends ServiceBase implements IService  {
+    public static class Service1 extends ServiceBase implements KillbillService  {
 
         @LifecycleHandlerType(LifecycleLevel.INIT_BUS)
         public void initBus() {
@@ -88,7 +88,7 @@ public class TestLifecycle {
         }
     }
 
-    public static class Service2 extends ServiceBase implements IService {
+    public static class Service2 extends ServiceBase implements KillbillService {
 
         @LifecycleHandlerType(LifecycleLevel.LOAD_CATALOG)
         public void loadCatalog() {
diff --git a/catalog/src/main/java/com/ning/billing/catalog/CatalogService.java b/catalog/src/main/java/com/ning/billing/catalog/CatalogService.java
index fb1d473..b07ec80 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/CatalogService.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/CatalogService.java
@@ -22,12 +22,12 @@ import com.ning.billing.catalog.api.ICatalog;
 import com.ning.billing.catalog.api.ICatalogService;
 import com.ning.billing.catalog.io.VersionedCatalogLoader;
 import com.ning.billing.config.ICatalogConfig;
-import com.ning.billing.lifecycle.IService;
+import com.ning.billing.lifecycle.KillbillService;
 import com.ning.billing.lifecycle.LifecycleHandlerType;
 import com.ning.billing.lifecycle.LifecycleHandlerType.LifecycleLevel;
 import com.ning.billing.util.config.XMLLoader;
 
-public class CatalogService implements IService, Provider<ICatalog>, ICatalogService {
+public class CatalogService implements KillbillService, Provider<ICatalog>, ICatalogService {
 
     private static final String CATALOG_SERVICE_NAME = "catalog-service";
 
diff --git a/catalog/src/main/java/com/ning/billing/catalog/io/ICatalogLoader.java b/catalog/src/main/java/com/ning/billing/catalog/io/ICatalogLoader.java
index 6daa7b6..4d1f139 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/io/ICatalogLoader.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/io/ICatalogLoader.java
@@ -17,7 +17,7 @@
 package com.ning.billing.catalog.io;
 
 import com.ning.billing.catalog.VersionedCatalog;
-import com.ning.billing.lifecycle.IService.ServiceException;
+import com.ning.billing.lifecycle.KillbillService.ServiceException;
 
 public interface ICatalogLoader {
 
diff --git a/catalog/src/main/java/com/ning/billing/catalog/io/VersionedCatalogLoader.java b/catalog/src/main/java/com/ning/billing/catalog/io/VersionedCatalogLoader.java
index 52f92ef..485ba80 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/io/VersionedCatalogLoader.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/io/VersionedCatalogLoader.java
@@ -26,8 +26,8 @@ import java.util.List;
 import com.google.inject.Inject;
 import com.ning.billing.catalog.Catalog;
 import com.ning.billing.catalog.VersionedCatalog;
-import com.ning.billing.lifecycle.IService.ServiceException;
-import com.ning.billing.util.clock.IClock;
+import com.ning.billing.lifecycle.KillbillService.ServiceException;
+import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.config.UriAccessor;
 import com.ning.billing.util.config.XMLLoader;
 
@@ -37,10 +37,10 @@ public class VersionedCatalogLoader implements ICatalogLoader  {
 	private  final String HREF_LOW_START = "href=\""; 
 	private  final String HREF_CAPS_START = "HREF=\""; 
 	private  final String HREF_SEARCH_END = "\"";
-	private IClock clock;
+	private Clock clock;
 			
 	@Inject 
-	public VersionedCatalogLoader(IClock clock) {
+	public VersionedCatalogLoader(Clock clock) {
 		this.clock = clock;
 	}
 	
diff --git a/catalog/src/test/java/com/ning/billing/catalog/io/TestVersionedCatalogLoader.java b/catalog/src/test/java/com/ning/billing/catalog/io/TestVersionedCatalogLoader.java
index 1b4703c..085b005 100644
--- a/catalog/src/test/java/com/ning/billing/catalog/io/TestVersionedCatalogLoader.java
+++ b/catalog/src/test/java/com/ning/billing/catalog/io/TestVersionedCatalogLoader.java
@@ -36,11 +36,11 @@ import com.google.common.io.Resources;
 import com.ning.billing.catalog.Catalog;
 import com.ning.billing.catalog.VersionedCatalog;
 import com.ning.billing.catalog.api.InvalidConfigException;
-import com.ning.billing.lifecycle.IService.ServiceException;
-import com.ning.billing.util.clock.Clock;
+import com.ning.billing.lifecycle.KillbillService.ServiceException;
+import com.ning.billing.util.clock.DefaultClock;
 
 public class TestVersionedCatalogLoader {
-	private final VersionedCatalogLoader loader = new VersionedCatalogLoader(new Clock());
+	private final VersionedCatalogLoader loader = new VersionedCatalogLoader(new DefaultClock());
 
 	
 	@Test(enabled=true)
diff --git a/catalog/src/test/java/com/ning/billing/catalog/TestCatlogService.java b/catalog/src/test/java/com/ning/billing/catalog/TestCatlogService.java
index fa42ea3..050ff6c 100644
--- a/catalog/src/test/java/com/ning/billing/catalog/TestCatlogService.java
+++ b/catalog/src/test/java/com/ning/billing/catalog/TestCatlogService.java
@@ -22,8 +22,8 @@ import org.testng.annotations.Test;
 import com.ning.billing.catalog.api.ICatalog;
 import com.ning.billing.catalog.io.VersionedCatalogLoader;
 import com.ning.billing.config.ICatalogConfig;
-import com.ning.billing.lifecycle.IService.ServiceException;
-import com.ning.billing.util.clock.Clock;
+import com.ning.billing.lifecycle.KillbillService.ServiceException;
+import com.ning.billing.util.clock.DefaultClock;
 
 public class TestCatlogService {
 
@@ -35,7 +35,7 @@ public class TestCatlogService {
 				return "file:src/test/resources/versionedCatalog";
 			}
 			
-		}, new VersionedCatalogLoader(new Clock()));
+		}, new VersionedCatalogLoader(new DefaultClock()));
 		service.loadCatalog();
 		Assert.assertNotNull(service.getCatalog());
 		Assert.assertEquals(service.getCatalog().getCalalogName(), "WeaponsHireSmall");
@@ -49,7 +49,7 @@ public class TestCatlogService {
 				return "file:src/test/resources/WeaponsHire.xml";
 			}
 			
-		}, new VersionedCatalogLoader(new Clock()));
+		}, new VersionedCatalogLoader(new DefaultClock()));
 		service.loadCatalog();
 		Assert.assertNotNull(service.getCatalog());
 		Assert.assertEquals(service.getCatalog().getCalalogName(), "Firearms");
diff --git a/catalog/src/test/java/com/ning/billing/catalog/TestVersionedCatalog.java b/catalog/src/test/java/com/ning/billing/catalog/TestVersionedCatalog.java
index c6da79d..e6f9ed2 100644
--- a/catalog/src/test/java/com/ning/billing/catalog/TestVersionedCatalog.java
+++ b/catalog/src/test/java/com/ning/billing/catalog/TestVersionedCatalog.java
@@ -32,11 +32,11 @@ import org.xml.sax.SAXException;
 import com.google.common.io.Resources;
 import com.ning.billing.catalog.api.InvalidConfigException;
 import com.ning.billing.catalog.io.VersionedCatalogLoader;
-import com.ning.billing.lifecycle.IService.ServiceException;
-import com.ning.billing.util.clock.Clock;
+import com.ning.billing.lifecycle.KillbillService.ServiceException;
+import com.ning.billing.util.clock.DefaultClock;
 
 public class TestVersionedCatalog {
-	private final VersionedCatalogLoader loader = new VersionedCatalogLoader(new Clock());
+	private final VersionedCatalogLoader loader = new VersionedCatalogLoader(new DefaultClock());
 
 	@Test(enabled=true)
 	public void testAddCatalog() throws MalformedURLException, IOException, SAXException, InvalidConfigException, JAXBException, TransformerException, URISyntaxException, ServiceException {
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/alignment/PlanAligner.java b/entitlement/src/main/java/com/ning/billing/entitlement/alignment/PlanAligner.java
index 5ba7076..883594c 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/alignment/PlanAligner.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/alignment/PlanAligner.java
@@ -33,11 +33,11 @@ import com.ning.billing.catalog.api.PlanAlignmentChange;
 import com.ning.billing.catalog.api.PlanAlignmentCreate;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.PlanSpecifier;
-import com.ning.billing.entitlement.api.user.Subscription;
+import com.ning.billing.entitlement.api.user.SubscriptionData;
 import com.ning.billing.entitlement.exceptions.EntitlementError;
-import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.clock.DefaultClock;
 
-public class PlanAligner implements IPlanAligner {
+public class PlanAligner  {
 
     private final ICatalogService catalogService;
 
@@ -52,40 +52,35 @@ public class PlanAligner implements IPlanAligner {
         NEXT
     }
 
-    @Override
-    public TimedPhase getCurrentTimedPhaseOnCreate(Subscription subscription,
+    public TimedPhase getCurrentTimedPhaseOnCreate(SubscriptionData subscription,
             IPlan plan, String priceList, DateTime effectiveDate) {
         return getTimedPhaseOnCreate(subscription, plan, priceList, effectiveDate, WhichPhase.CURRENT);
     }
 
-    @Override
-    public TimedPhase getNextTimedPhaseOnCreate(Subscription subscription,
+    public TimedPhase getNextTimedPhaseOnCreate(SubscriptionData subscription,
             IPlan plan, String priceList, DateTime effectiveDate) {
             return getTimedPhaseOnCreate(subscription, plan, priceList, effectiveDate, WhichPhase.NEXT);
     }
 
-    @Override
-    public TimedPhase getCurrentTimedPhaseOnChange(Subscription subscription,
+    public TimedPhase getCurrentTimedPhaseOnChange(SubscriptionData subscription,
             IPlan plan, String priceList, DateTime effectiveDate) {
         return getTimedPhaseOnChange(subscription, plan, priceList, effectiveDate, WhichPhase.CURRENT);
     }
 
-    @Override
-    public TimedPhase getNextTimedPhaseOnChange(Subscription subscription,
+    public TimedPhase getNextTimedPhaseOnChange(SubscriptionData subscription,
             IPlan plan, String priceList, DateTime effectiveDate) {
         return getTimedPhaseOnChange(subscription, plan, priceList, effectiveDate, WhichPhase.NEXT);
     }
 
 
 
-    @Override
-    public TimedPhase getNextTimedPhase(Subscription subscription,
+    public TimedPhase getNextTimedPhase(SubscriptionData subscription,
             IPlan plan, DateTime effectiveDate, DateTime planStartDate) {
         List<TimedPhase> timedPhases = getPhaseAlignments(subscription, plan, effectiveDate, planStartDate);
         return getTimedPhase(timedPhases, effectiveDate, WhichPhase.NEXT);
     }
 
-    private TimedPhase getTimedPhaseOnCreate(Subscription subscription,
+    private TimedPhase getTimedPhaseOnCreate(SubscriptionData subscription,
             IPlan plan, String priceList, DateTime effectiveDate, WhichPhase which) {
 
         ICatalog catalog = catalogService.getCatalog();
@@ -96,7 +91,7 @@ public class PlanAligner implements IPlanAligner {
                     priceList);
 
             DateTime planStartDate = null;
-            
+
             //TODO fix exception handling
             PlanAlignmentCreate alignement = null;
 			try {
@@ -105,7 +100,7 @@ public class PlanAligner implements IPlanAligner {
 				// TODO Auto-generated catch block
 				e.printStackTrace();
 			}
-			
+
             switch(alignement) {
             case START_OF_SUBSCRIPTION:
                 planStartDate = subscription.getStartDate();
@@ -120,7 +115,7 @@ public class PlanAligner implements IPlanAligner {
             return getTimedPhase(timedPhases, effectiveDate, which);
     }
 
-    private TimedPhase getTimedPhaseOnChange(Subscription subscription,
+    private TimedPhase getTimedPhaseOnChange(SubscriptionData subscription,
             IPlan plan, String priceList, DateTime effectiveDate, WhichPhase which) {
 
         ICatalog catalog = catalogService.getCatalog();
@@ -141,7 +136,7 @@ public class PlanAligner implements IPlanAligner {
                 priceList);
 
         DateTime planStartDate = null;
-        
+
         //TODO Correctly handle exception
         PlanAlignmentChange alignment = null;
 		try {
@@ -168,7 +163,7 @@ public class PlanAligner implements IPlanAligner {
         return getTimedPhase(timedPhases, effectiveDate, which);
     }
 
-    private List<TimedPhase> getPhaseAlignments(Subscription subscription, IPlan plan,
+    private List<TimedPhase> getPhaseAlignments(SubscriptionData subscription, IPlan plan,
             DateTime effectiveDate, DateTime planStartDate) {
 
         // The plan can be null with the nasty endpoint from test API.
@@ -176,7 +171,7 @@ public class PlanAligner implements IPlanAligner {
             return Collections.emptyList();
         }
 
-        List<TimedPhase> result = new LinkedList<IPlanAligner.TimedPhase>();
+        List<TimedPhase> result = new LinkedList<TimedPhase>();
 
         DateTime curPhaseStart = planStartDate;
         if (plan.getInitialPhases() == null) {
@@ -190,7 +185,7 @@ public class PlanAligner implements IPlanAligner {
             result.add(new TimedPhase(cur, curPhaseStart));
 
             IDuration curPhaseDuration = cur.getDuration();
-            nextPhaseStart = Clock.addDuration(curPhaseStart, curPhaseDuration);
+            nextPhaseStart = DefaultClock.addDuration(curPhaseStart, curPhaseDuration);
             if (nextPhaseStart == null) {
                 throw new EntitlementError(String.format("Unexpected non ending UNLIMITED phase for plan %s",
                         plan.getName()));
@@ -220,4 +215,7 @@ public class PlanAligner implements IPlanAligner {
             throw new EntitlementError(String.format("Unepected %s TimedPhase", which));
         }
     }
+
+
+
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionBuilder.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionBuilder.java
index d14b754..dbc2a5e 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionBuilder.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionBuilder.java
@@ -39,7 +39,7 @@ public class SubscriptionBuilder {
         this.activeVersion = SubscriptionEvents.INITIAL_VERSION;
     }
 
-    public SubscriptionBuilder(Subscription original) {
+    public SubscriptionBuilder(SubscriptionData original) {
         this.id = original.getId();
         this.bundleId = original.getBundleId();
         this.startDate = original.getStartDate();
@@ -65,7 +65,7 @@ public class SubscriptionBuilder {
     public SubscriptionBuilder setBundleStartDate(DateTime bundleStartDate) {
         this.bundleStartDate = bundleStartDate;
         return this;
-        }
+    }
     public SubscriptionBuilder setActiveVersion(long activeVersion) {
         this.activeVersion = activeVersion;
         return this;
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionEvents.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionEvents.java
index cefaf05..d69d4e2 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionEvents.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionEvents.java
@@ -19,36 +19,36 @@ package com.ning.billing.entitlement.api.user;
 import java.util.LinkedList;
 import java.util.UUID;
 
-import com.ning.billing.entitlement.events.IEntitlementEvent;
+import com.ning.billing.entitlement.events.EntitlementEvent;
 
 public class SubscriptionEvents {
 
     public static final long INITIAL_VERSION = 1;
 
     private final UUID subscriptionId;
-    private final LinkedList<IEntitlementEvent> events;
+    private final LinkedList<EntitlementEvent> events;
 
     private long activeVersion;
 
     public SubscriptionEvents(UUID subscriptionId) {
         super();
         this.subscriptionId = subscriptionId;
-        this.events = new LinkedList<IEntitlementEvent>();
+        this.events = new LinkedList<EntitlementEvent>();
         this.activeVersion = INITIAL_VERSION;
     }
 
-    public void addEvent(IEntitlementEvent ev) {
+    public void addEvent(EntitlementEvent ev) {
         events.add(ev);
     }
 
-    public LinkedList<IEntitlementEvent> getCurrentView() {
+    public LinkedList<EntitlementEvent> getCurrentView() {
         return getViewForVersion(activeVersion);
     }
 
-    public LinkedList<IEntitlementEvent> getViewForVersion(final long version) {
+    public LinkedList<EntitlementEvent> getViewForVersion(final long version) {
 
-        LinkedList<IEntitlementEvent> result = new LinkedList<IEntitlementEvent>();
-        for (IEntitlementEvent cur : events) {
+        LinkedList<EntitlementEvent> result = new LinkedList<EntitlementEvent>();
+        for (EntitlementEvent cur : events) {
             if (cur.getActiveVersion() == version) {
                 result.add(cur);
             }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/ApiEventProcessorBase.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/ApiEventProcessorBase.java
index 04daa21..52fa9a4 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/ApiEventProcessorBase.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/ApiEventProcessorBase.java
@@ -22,26 +22,23 @@ import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.UUID;
-import java.util.concurrent.Callable;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import org.skife.config.Config;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
 import com.google.inject.Inject;
-import com.ning.billing.config.IEntitlementConfig;
-import com.ning.billing.entitlement.api.user.ISubscription;
-import com.ning.billing.entitlement.engine.dao.IEntitlementDao;
-import com.ning.billing.entitlement.events.IEntitlementEvent;
-import com.ning.billing.util.clock.IClock;
+import com.ning.billing.config.EntitlementConfig;
+import com.ning.billing.entitlement.engine.dao.EntitlementDao;
+import com.ning.billing.entitlement.events.EntitlementEvent;
+import com.ning.billing.util.clock.Clock;
 
-public abstract class ApiEventProcessorBase implements IApiEventProcessor {
+public abstract class ApiEventProcessorBase implements EventNotifier {
 
     // Wait for max 60 sec when shutting down the EventProcessor
     private final long STOP_WAIT_TIMEOUT_MS = 60000;
@@ -52,20 +49,20 @@ public abstract class ApiEventProcessorBase implements IApiEventProcessor {
     protected final UUID apiProcessorId;
 
     private static final String API_EVENT_THREAD_NAME = "ApiEventNotification";
-    protected final static Logger log = LoggerFactory.getLogger(ApiEventProcessor.class);
+    protected final static Logger log = LoggerFactory.getLogger(DefaultApiEventProcessor.class);
 
-    protected final IEntitlementDao dao;
-    protected final IClock clock;
+    protected final EntitlementDao dao;
+    protected final Clock clock;
 
     private Executor executor;
-    private final IEntitlementConfig config;
-    protected IEventListener listener;
+    private final EntitlementConfig config;
+    protected EventListener listener;
 
     protected long nbProcessedEvents;
     protected volatile boolean isProcessingEvents;
 
     @Inject
-    public ApiEventProcessorBase(IClock clock, IEntitlementDao dao, IEntitlementConfig config) {
+    public ApiEventProcessorBase(Clock clock, EntitlementDao dao, EntitlementConfig config) {
         this.clock = clock;
         this.dao = dao;
         this.config = config;
@@ -78,7 +75,7 @@ public abstract class ApiEventProcessorBase implements IApiEventProcessor {
 
 
     @Override
-    public void startNotifications(final IEventListener listener) {
+    public void startNotifications(final EventListener listener) {
 
         this.listener = listener;
         this.isProcessingEvents = true;
@@ -206,9 +203,9 @@ public abstract class ApiEventProcessorBase implements IApiEventProcessor {
         int curSequenceId = sequenceId.getAndIncrement();
 
         //Get all current ready events
-        List<IEntitlementEvent> claimedEvents = new LinkedList<IEntitlementEvent>();
+        List<EntitlementEvent> claimedEvents = new LinkedList<EntitlementEvent>();
         do {
-            List<IEntitlementEvent> tmpEvents = dao.getEventsReady(apiProcessorId, curSequenceId);
+            List<EntitlementEvent> tmpEvents = dao.getEventsReady(apiProcessorId, curSequenceId);
             if (tmpEvents.size() == 0) {
                 break;
             }
@@ -219,14 +216,14 @@ public abstract class ApiEventProcessorBase implements IApiEventProcessor {
         }
 
         // Filter for specific subscriptions if needed
-        Collection<IEntitlementEvent> claimedEventsFiltered = null;
+        Collection<EntitlementEvent> claimedEventsFiltered = null;
         if (subscriptionsIds.length == 0) {
             claimedEventsFiltered = claimedEvents;
         } else {
 
-            claimedEventsFiltered = Collections2.filter(claimedEvents, new Predicate<IEntitlementEvent>() {
+            claimedEventsFiltered = Collections2.filter(claimedEvents, new Predicate<EntitlementEvent>() {
                 @Override
-                public boolean apply(IEntitlementEvent input) {
+                public boolean apply(EntitlementEvent input) {
                     for (UUID cur : subscriptionsIds) {
                         if (cur.equals(input.getSubscriptionId())) {
                             return true;
@@ -242,7 +239,7 @@ public abstract class ApiEventProcessorBase implements IApiEventProcessor {
 
         // If only one event is requested extract it
         if (oneEventOnly) {
-            List<IEntitlementEvent> oneEventList = new ArrayList<IEntitlementEvent>(1);
+            List<EntitlementEvent> oneEventList = new ArrayList<EntitlementEvent>(1);
             oneEventList.add(claimedEventsFiltered.iterator().next());
             claimedEventsFiltered = oneEventList;
         }
@@ -257,5 +254,5 @@ public abstract class ApiEventProcessorBase implements IApiEventProcessor {
     }
 
     protected abstract boolean doProcessEvents(int sequenceId);
-    protected abstract boolean doProcessEventsFromList(int sequenceId, Collection<IEntitlementEvent> events);
+    protected abstract boolean doProcessEventsFromList(int sequenceId, Collection<EntitlementEvent> events);
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/Engine.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/Engine.java
index bf6f0ae..972e972 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/Engine.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/core/Engine.java
@@ -21,31 +21,31 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.inject.Inject;
-import com.ning.billing.config.IEntitlementConfig;
+import com.ning.billing.config.EntitlementConfig;
 
-import com.ning.billing.entitlement.alignment.IPlanAligner;
-import com.ning.billing.entitlement.alignment.IPlanAligner.TimedPhase;
-import com.ning.billing.entitlement.api.IEntitlementService;
+import com.ning.billing.entitlement.alignment.PlanAligner;
+import com.ning.billing.entitlement.alignment.TimedPhase;
+import com.ning.billing.entitlement.api.EntitlementService;
+import com.ning.billing.entitlement.api.billing.DefaultEntitlementBillingApi;
 import com.ning.billing.entitlement.api.billing.EntitlementBillingApi;
-import com.ning.billing.entitlement.api.billing.IEntitlementBillingApi;
+import com.ning.billing.entitlement.api.test.DefaultEntitlementTestApi;
 import com.ning.billing.entitlement.api.test.EntitlementTestApi;
-import com.ning.billing.entitlement.api.test.IEntitlementTestApi;
+import com.ning.billing.entitlement.api.user.DefaultEntitlementUserApi;
 import com.ning.billing.entitlement.api.user.EntitlementUserApi;
-import com.ning.billing.entitlement.api.user.IEntitlementUserApi;
-import com.ning.billing.entitlement.api.user.Subscription;
-import com.ning.billing.entitlement.engine.dao.IEntitlementDao;
-import com.ning.billing.entitlement.events.IEntitlementEvent;
-import com.ning.billing.entitlement.events.IEntitlementEvent.EventType;
-import com.ning.billing.entitlement.events.phase.IPhaseEvent;
+import com.ning.billing.entitlement.api.user.SubscriptionData;
+import com.ning.billing.entitlement.engine.dao.EntitlementDao;
+import com.ning.billing.entitlement.events.EntitlementEvent;
+import com.ning.billing.entitlement.events.EntitlementEvent.EventType;
 import com.ning.billing.entitlement.events.phase.PhaseEvent;
+import com.ning.billing.entitlement.events.phase.PhaseEventData;
 import com.ning.billing.entitlement.exceptions.EntitlementError;
 import com.ning.billing.lifecycle.LifecycleHandlerType;
 import com.ning.billing.lifecycle.LifecycleHandlerType.LifecycleLevel;
-import com.ning.billing.util.clock.IClock;
-import com.ning.billing.util.eventbus.IEventBus;
-import com.ning.billing.util.eventbus.IEventBus.EventBusException;
+import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.eventbus.EventBus;
+import com.ning.billing.util.eventbus.EventBus.EventBusException;
 
-public class Engine implements IEventListener, IEntitlementService {
+public class Engine implements EventListener, EntitlementService {
 
     private static final String ENTITLEMENT_SERVICE_NAME = "entitlement-service";
 
@@ -55,21 +55,21 @@ public class Engine implements IEventListener, IEntitlementService {
 
     private final static Logger log = LoggerFactory.getLogger(Engine.class);
 
-    private final IClock clock;
-    private final IEntitlementDao dao;
-    private final IApiEventProcessor apiEventProcessor;
-    private final IPlanAligner planAligner;
-    private final IEntitlementUserApi userApi;
-    private final IEntitlementBillingApi billingApi;
-    private final IEntitlementTestApi testApi;
-    private final IEventBus eventBus;
+    private final Clock clock;
+    private final EntitlementDao dao;
+    private final EventNotifier apiEventProcessor;
+    private final PlanAligner planAligner;
+    private final EntitlementUserApi userApi;
+    private final EntitlementBillingApi billingApi;
+    private final EntitlementTestApi testApi;
+    private final EventBus eventBus;
 
     private boolean startedNotificationThread;
 
     @Inject
-    public Engine(IClock clock, IEntitlementDao dao, IApiEventProcessor apiEventProcessor,
-            IPlanAligner planAligner, IEntitlementConfig config, EntitlementUserApi userApi,
-            EntitlementBillingApi billingApi, EntitlementTestApi testApi, IEventBus eventBus) {
+    public Engine(Clock clock, EntitlementDao dao, EventNotifier apiEventProcessor,
+            PlanAligner planAligner, EntitlementConfig config, DefaultEntitlementUserApi userApi,
+            DefaultEntitlementBillingApi billingApi, DefaultEntitlementTestApi testApi, EventBus eventBus) {
         super();
         this.clock = clock;
         this.dao = dao;
@@ -106,24 +106,24 @@ public class Engine implements IEventListener, IEntitlementService {
     }
 
     @Override
-    public IEntitlementUserApi getUserApi() {
+    public EntitlementUserApi getUserApi() {
         return userApi;
     }
 
     @Override
-    public IEntitlementBillingApi getBillingApi() {
+    public EntitlementBillingApi getBillingApi() {
         return billingApi;
     }
 
 
     @Override
-    public IEntitlementTestApi getTestApi() {
+    public EntitlementTestApi getTestApi() {
         return testApi;
     }
 
     @Override
-    public void processEventReady(IEntitlementEvent event) {
-        Subscription subscription = (Subscription) dao.getSubscriptionFromId(event.getSubscriptionId());
+    public void processEventReady(EntitlementEvent event) {
+        SubscriptionData subscription = (SubscriptionData) dao.getSubscriptionFromId(event.getSubscriptionId());
         if (subscription == null) {
             log.warn("Failed to retrieve subscription for id %s", event.getSubscriptionId());
             return;
@@ -174,12 +174,12 @@ public class Engine implements IEventListener, IEntitlementService {
         }
     }
 
-    private void insertNextPhaseEvent(Subscription subscription) {
+    private void insertNextPhaseEvent(SubscriptionData subscription) {
 
         DateTime now = clock.getUTCNow();
 
         TimedPhase nextTimedPhase = planAligner.getNextTimedPhase(subscription, subscription.getCurrentPlan(), now, subscription.getCurrentPlanStart());
-        IPhaseEvent nextPhaseEvent = PhaseEvent.getNextPhaseEvent(nextTimedPhase, subscription, now);
+        PhaseEvent nextPhaseEvent = PhaseEventData.getNextPhaseEvent(nextTimedPhase, subscription, now);
         if (nextPhaseEvent != null) {
             dao.createNextPhaseEvent(subscription.getId(), nextPhaseEvent);
         }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementDao.java
index e312ccc..6bfccc3 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementDao.java
@@ -16,310 +16,56 @@
 
 package com.ning.billing.entitlement.engine.dao;
 
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.UUID;
 
-import org.skife.jdbi.v2.DBI;
-import org.skife.jdbi.v2.Transaction;
-import org.skife.jdbi.v2.TransactionStatus;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.collect.Lists;
-import com.google.inject.Inject;
-import com.ning.billing.catalog.api.ProductCategory;
-import com.ning.billing.config.IEntitlementConfig;
-import com.ning.billing.entitlement.api.user.ISubscription;
-import com.ning.billing.entitlement.api.user.ISubscriptionBundle;
 import com.ning.billing.entitlement.api.user.Subscription;
-import com.ning.billing.entitlement.api.user.SubscriptionBuilder;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
-import com.ning.billing.entitlement.events.IEntitlementEvent;
-import com.ning.billing.entitlement.events.IEntitlementEvent.EventType;
-import com.ning.billing.entitlement.events.user.ApiEventType;
-import com.ning.billing.entitlement.events.user.IApiEvent;
-import com.ning.billing.entitlement.exceptions.EntitlementError;
-import com.ning.billing.util.Hostname;
-import com.ning.billing.util.clock.IClock;
-
-public class EntitlementDao implements IEntitlementDao {
-
-    private final static Logger log = LoggerFactory.getLogger(EntitlementDao.class);
-
-    private final IClock clock;
-    private final ISubscriptionSqlDao subscriptionsDao;
-    private final IBundleSqlDao bundlesDao;
-    private final IEventSqlDao eventsDao;
-    private final IEntitlementConfig config;
-    private final String hostname;
-
-    @Inject
-    public EntitlementDao(DBI dbi, IClock clock, IEntitlementConfig config) {
-        this.clock = clock;
-        this.config = config;
-        this.subscriptionsDao = dbi.onDemand(ISubscriptionSqlDao.class);
-        this.eventsDao = dbi.onDemand(IEventSqlDao.class);
-        this.bundlesDao = dbi.onDemand(IBundleSqlDao.class);
-        this.hostname = Hostname.get();
-    }
-
-    @Override
-    public List<ISubscriptionBundle> getSubscriptionBundleForAccount(
-            UUID accountId) {
-        return bundlesDao.getBundleFromAccount(accountId.toString());
-    }
-
-    @Override
-    public ISubscriptionBundle getSubscriptionBundleFromId(UUID bundleId) {
-        return bundlesDao.getBundleFromId(bundleId.toString());
-    }
-
-    @Override
-    public ISubscriptionBundle createSubscriptionBundle(SubscriptionBundle bundle) {
-        bundlesDao.insertBundle(bundle);
-        return bundle;
-    }
-
-    @Override
-    public ISubscription getSubscriptionFromId(UUID subscriptionId) {
-        return subscriptionsDao.getSubscriptionFromId(subscriptionId.toString());
-    }
-
-    @Override
-    public ISubscription getBaseSubscription(final UUID bundleId) {
-
-        List<ISubscription> subscriptions = subscriptionsDao.getSubscriptionsFromBundleId(bundleId.toString());
-        for (ISubscription cur : subscriptions) {
-            if (((Subscription)cur).getCategory() == ProductCategory.BASE) {
-                return cur;
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public List<ISubscription> getSubscriptions(UUID bundleId) {
-        return subscriptionsDao.getSubscriptionsFromBundleId(bundleId.toString());
-    }
-
-    @Override
-    public List<ISubscription> getSubscriptionsForKey(String bundleKey) {
-        ISubscriptionBundle bundle =  bundlesDao.getBundleFromKey(bundleKey);
-        if (bundle == null) {
-            return Collections.emptyList();
-        }
-        return subscriptionsDao.getSubscriptionsFromBundleId(bundle.getId().toString());
-    }
-
-    @Override
-    public void updateSubscription(Subscription subscription) {
-        Date ctd = (subscription.getChargedThroughDate() != null)  ? subscription.getChargedThroughDate().toDate() : null;
-        Date ptd = (subscription.getPaidThroughDate() != null)  ? subscription.getPaidThroughDate().toDate() : null;
-        subscriptionsDao.updateSubscription(subscription.getId().toString(), subscription.getActiveVersion(), ctd, ptd);
-    }
-
-    @Override
-    public void createNextPhaseEvent(final UUID subscriptionId, final IEntitlementEvent nextPhase) {
-        eventsDao.inTransaction(new Transaction<Void, IEventSqlDao>() {
-
-            @Override
-            public Void inTransaction(IEventSqlDao dao,
-                    TransactionStatus status) throws Exception {
-                cancelNextPhaseEventFromTransaction(subscriptionId, dao);
-                dao.insertEvent(nextPhase);
-                return null;
-            }
-        });
-    }
-
-
-    @Override
-    public List<IEntitlementEvent> getEventsForSubscription(UUID subscriptionId) {
-        List<IEntitlementEvent> events = eventsDao.getEventsForSubscription(subscriptionId.toString());
-        return events;
-    }
-
-    @Override
-    public List<IEntitlementEvent> getPendingEventsForSubscription(UUID subscriptionId) {
-        Date now = clock.getUTCNow().toDate();
-        List<IEntitlementEvent> results = eventsDao.getFutureActiveEventForSubscription(subscriptionId.toString(), now);
-        return results;
-    }
-
-    @Override
-    public List<IEntitlementEvent> getEventsReady(final UUID ownerId, final int sequenceId) {
-
-        final Date now = clock.getUTCNow().toDate();
-        final Date nextAvailable = clock.getUTCNow().plus(config.getDaoClaimTimeMs()).toDate();
-
-        log.debug(String.format("EntitlementDao getEventsReady START effectiveNow =  %s", now));
-
-        List<IEntitlementEvent> events = eventsDao.inTransaction(new Transaction<List<IEntitlementEvent>, IEventSqlDao>() {
-
-            @Override
-            public List<IEntitlementEvent> inTransaction(IEventSqlDao dao,
-                    TransactionStatus status) throws Exception {
-
-                List<IEntitlementEvent> claimedEvents = new ArrayList<IEntitlementEvent>();
-                List<IEntitlementEvent> input = dao.getReadyEvents(now, config.getDaoMaxReadyEvents());
-                for (IEntitlementEvent cur : input) {
-                    final boolean claimed = (dao.claimEvent(ownerId.toString(), nextAvailable, cur.getId().toString(), now) == 1);
-                    if (claimed) {
-                        claimedEvents.add(cur);
-                        dao.insertClaimedHistory(sequenceId, ownerId.toString(), hostname, now, cur.getId().toString());
-                    }
-                }
-                return claimedEvents;
-            }
-        });
-
-        for (IEntitlementEvent cur : events) {
-            log.debug(String.format("EntitlementDao %s [host %s] claimed events %s", ownerId, hostname, cur.getId()));
-            if (cur.getOwner() != null && !cur.getOwner().equals(ownerId)) {
-                log.warn(String.format("EventProcessor %s stealing event %s from %s", ownerId, cur, cur.getOwner()));
-            }
-        }
-        return events;
-    }
-
-    @Override
-    public void clearEventsReady(final UUID ownerId, final Collection<IEntitlementEvent> cleared) {
-
-        log.debug(String.format("EntitlementDao clearEventsReady START cleared size = %d", cleared.size()));
+import com.ning.billing.entitlement.api.user.SubscriptionData;
+import com.ning.billing.entitlement.api.user.SubscriptionBundleData;
+import com.ning.billing.entitlement.events.EntitlementEvent;
 
-        eventsDao.inTransaction(new Transaction<Void, IEventSqlDao>() {
+public interface EntitlementDao {
 
-            @Override
-            public Void inTransaction(IEventSqlDao dao,
-                    TransactionStatus status) throws Exception {
-                // STEPH Same here batch would nice
-                for (IEntitlementEvent cur : cleared) {
-                    dao.clearEvent(cur.getId().toString(), ownerId.toString());
-                    log.debug(String.format("EntitlementDao %s [host %s] cleared events %s", ownerId, hostname, cur.getId()));
-                }
-                return null;
-            }
-        });
-    }
 
-    @Override
-    public ISubscription createSubscription(final Subscription subscription,
-            final List<IEntitlementEvent> initialEvents) {
+    // Bundle apis
+    public List<SubscriptionBundle> getSubscriptionBundleForAccount(UUID accountId);
 
-        subscriptionsDao.inTransaction(new Transaction<Void, ISubscriptionSqlDao>() {
+    public SubscriptionBundle getSubscriptionBundleFromId(UUID bundleId);
 
-            @Override
-            public Void inTransaction(ISubscriptionSqlDao dao,
-                    TransactionStatus status) throws Exception {
+    public SubscriptionBundle createSubscriptionBundle(SubscriptionBundleData bundle);
 
-                dao.insertSubscription(subscription);
-                // STEPH batch as well
-                IEventSqlDao eventsDaoFromSameTranscation = dao.become(IEventSqlDao.class);
-                for (IEntitlementEvent cur : initialEvents) {
-                    eventsDaoFromSameTranscation.insertEvent(cur);
-                }
-                return null;
-            }
-        });
-        return new Subscription(new SubscriptionBuilder(subscription), true);
-    }
+    public Subscription getSubscriptionFromId(UUID subscriptionId);
 
-    @Override
-    public void cancelSubscription(final UUID subscriptionId, final IEntitlementEvent cancelEvent) {
 
-        eventsDao.inTransaction(new Transaction<Void, IEventSqlDao>() {
-            @Override
-            public Void inTransaction(IEventSqlDao dao,
-                    TransactionStatus status) throws Exception {
-                cancelNextChangeEventFromTransaction(subscriptionId, dao);
-                cancelNextPhaseEventFromTransaction(subscriptionId, dao);
-                dao.insertEvent(cancelEvent);
-                return null;
-            }
-        });
-    }
+    // Subscription retrieval
+    public Subscription getBaseSubscription(UUID bundleId);
 
-    @Override
-    public void uncancelSubscription(final UUID subscriptionId, final List<IEntitlementEvent> uncancelEvents) {
+    public List<Subscription> getSubscriptions(UUID bundleId);
 
-        eventsDao.inTransaction(new Transaction<Void, IEventSqlDao>() {
+    public List<Subscription> getSubscriptionsForKey(String bundleKey);
 
-            @Override
-            public Void inTransaction(IEventSqlDao dao,
-                    TransactionStatus status) throws Exception {
+    // Update
+    public void updateSubscription(SubscriptionData subscription);
 
-                UUID existingCancelId = null;
-                Date now = clock.getUTCNow().toDate();
-                List<IEntitlementEvent> events = dao.getFutureActiveEventForSubscription(subscriptionId.toString(), now);
+    // Event apis
+    public void createNextPhaseEvent(UUID subscriptionId, EntitlementEvent nextPhase);
 
-                for (IEntitlementEvent cur : events) {
-                    if (cur.getType() == EventType.API_USER && ((IApiEvent) cur).getEventType() == ApiEventType.CANCEL) {
-                        if (existingCancelId != null) {
-                            throw new EntitlementError(String.format("Found multiple cancel active events for subscriptions %s", subscriptionId.toString()));
-                        }
-                        existingCancelId = cur.getId();
-                    }
-                }
+    public List<EntitlementEvent> getEventsForSubscription(UUID subscriptionId);
 
-                if (existingCancelId != null) {
-                    dao.unactiveEvent(existingCancelId.toString(), now);
-                    for (IEntitlementEvent cur : uncancelEvents) {
-                        dao.insertEvent(cur);
-                    }
-                }
-                return null;
-            }
-        });
-    }
+    public List<EntitlementEvent> getPendingEventsForSubscription(UUID subscriptionId);
 
-    @Override
-    public void changePlan(final UUID subscriptionId, final List<IEntitlementEvent> changeEvents) {
-        eventsDao.inTransaction(new Transaction<Void, IEventSqlDao>() {
-            @Override
-            public Void inTransaction(IEventSqlDao dao,
-                    TransactionStatus status) throws Exception {
-                cancelNextChangeEventFromTransaction(subscriptionId, dao);
-                cancelNextPhaseEventFromTransaction(subscriptionId, dao);
-                for (IEntitlementEvent cur : changeEvents) {
-                    dao.insertEvent(cur);
-                }
-                return null;
-            }
-        });
-    }
+    public List<EntitlementEvent> getEventsReady(UUID ownerId, int sequenceId);
 
-    private void cancelNextPhaseEventFromTransaction(final UUID subscriptionId, final IEventSqlDao dao) {
-        cancelFutureEventFromTransaction(subscriptionId, dao, EventType.PHASE, null);
-    }
+    public void clearEventsReady(UUID ownerId, Collection<EntitlementEvent> cleared);
 
-    private void cancelNextChangeEventFromTransaction(final UUID subscriptionId, final IEventSqlDao dao) {
-        cancelFutureEventFromTransaction(subscriptionId, dao, EventType.API_USER, ApiEventType.CHANGE);
-    }
+    // Subscription creation, cancellation, changePlan apis
+    public Subscription createSubscription(SubscriptionData subscription, List<EntitlementEvent> initialEvents);
 
-    private void cancelFutureEventFromTransaction(final UUID subscriptionId, final IEventSqlDao dao, EventType type, ApiEventType apiType) {
+    public void cancelSubscription(UUID subscriptionId, EntitlementEvent cancelEvent);
 
-        UUID futureEventId = null;
-        Date now = clock.getUTCNow().toDate();
-        List<IEntitlementEvent> events = dao.getFutureActiveEventForSubscription(subscriptionId.toString(), now);
-        for (IEntitlementEvent cur : events) {
-            if (cur.getType() == type &&
-                    (apiType == null || apiType == ((IApiEvent) cur).getEventType() )) {
-                if (futureEventId != null) {
-                    throw new EntitlementError(
-                            String.format("Found multiple future events for type %s for subscriptions %s",
-                                    type, subscriptionId.toString()));
-                }
-                futureEventId = cur.getId();
-            }
-        }
+    public void uncancelSubscription(UUID subscriptionId, List<EntitlementEvent> uncancelEvents);
 
-        if (futureEventId != null) {
-            dao.unactiveEvent(futureEventId.toString(), now);
-        }
-    }
+    public void changePlan(UUID subscriptionId, List<EntitlementEvent> changeEvents);
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementSqlDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementSqlDao.java
new file mode 100644
index 0000000..88410a2
--- /dev/null
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementSqlDao.java
@@ -0,0 +1,325 @@
+/*
+ * Copyright 2010-2011 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.entitlement.engine.dao;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.UUID;
+
+import org.skife.jdbi.v2.DBI;
+import org.skife.jdbi.v2.Transaction;
+import org.skife.jdbi.v2.TransactionStatus;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+import com.ning.billing.catalog.api.ProductCategory;
+import com.ning.billing.config.EntitlementConfig;
+import com.ning.billing.entitlement.api.user.Subscription;
+import com.ning.billing.entitlement.api.user.SubscriptionBundle;
+import com.ning.billing.entitlement.api.user.SubscriptionData;
+import com.ning.billing.entitlement.api.user.SubscriptionBuilder;
+import com.ning.billing.entitlement.api.user.SubscriptionBundleData;
+import com.ning.billing.entitlement.events.EntitlementEvent;
+import com.ning.billing.entitlement.events.EntitlementEvent.EventType;
+import com.ning.billing.entitlement.events.user.ApiEventType;
+import com.ning.billing.entitlement.events.user.ApiEvent;
+import com.ning.billing.entitlement.exceptions.EntitlementError;
+import com.ning.billing.util.Hostname;
+import com.ning.billing.util.clock.Clock;
+
+public class EntitlementSqlDao implements EntitlementDao {
+
+    private final static Logger log = LoggerFactory.getLogger(EntitlementSqlDao.class);
+
+    private final Clock clock;
+    private final SubscriptionSqlDao subscriptionsDao;
+    private final BundleSqlDao bundlesDao;
+    private final EventSqlDao eventsDao;
+    private final EntitlementConfig config;
+    private final String hostname;
+
+    @Inject
+    public EntitlementSqlDao(DBI dbi, Clock clock, EntitlementConfig config) {
+        this.clock = clock;
+        this.config = config;
+        this.subscriptionsDao = dbi.onDemand(SubscriptionSqlDao.class);
+        this.eventsDao = dbi.onDemand(EventSqlDao.class);
+        this.bundlesDao = dbi.onDemand(BundleSqlDao.class);
+        this.hostname = Hostname.get();
+    }
+
+    @Override
+    public List<SubscriptionBundle> getSubscriptionBundleForAccount(
+            UUID accountId) {
+        return bundlesDao.getBundleFromAccount(accountId.toString());
+    }
+
+    @Override
+    public SubscriptionBundle getSubscriptionBundleFromId(UUID bundleId) {
+        return bundlesDao.getBundleFromId(bundleId.toString());
+    }
+
+    @Override
+    public SubscriptionBundle createSubscriptionBundle(SubscriptionBundleData bundle) {
+        bundlesDao.insertBundle(bundle);
+        return bundle;
+    }
+
+    @Override
+    public Subscription getSubscriptionFromId(UUID subscriptionId) {
+        return subscriptionsDao.getSubscriptionFromId(subscriptionId.toString());
+    }
+
+    @Override
+    public Subscription getBaseSubscription(final UUID bundleId) {
+
+        List<Subscription> subscriptions = subscriptionsDao.getSubscriptionsFromBundleId(bundleId.toString());
+        for (Subscription cur : subscriptions) {
+            if (((SubscriptionData)cur).getCategory() == ProductCategory.BASE) {
+                return cur;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public List<Subscription> getSubscriptions(UUID bundleId) {
+        return subscriptionsDao.getSubscriptionsFromBundleId(bundleId.toString());
+    }
+
+    @Override
+    public List<Subscription> getSubscriptionsForKey(String bundleKey) {
+        SubscriptionBundle bundle =  bundlesDao.getBundleFromKey(bundleKey);
+        if (bundle == null) {
+            return Collections.emptyList();
+        }
+        return subscriptionsDao.getSubscriptionsFromBundleId(bundle.getId().toString());
+    }
+
+    @Override
+    public void updateSubscription(SubscriptionData subscription) {
+        Date ctd = (subscription.getChargedThroughDate() != null)  ? subscription.getChargedThroughDate().toDate() : null;
+        Date ptd = (subscription.getPaidThroughDate() != null)  ? subscription.getPaidThroughDate().toDate() : null;
+        subscriptionsDao.updateSubscription(subscription.getId().toString(), subscription.getActiveVersion(), ctd, ptd);
+    }
+
+    @Override
+    public void createNextPhaseEvent(final UUID subscriptionId, final EntitlementEvent nextPhase) {
+        eventsDao.inTransaction(new Transaction<Void, EventSqlDao>() {
+
+            @Override
+            public Void inTransaction(EventSqlDao dao,
+                    TransactionStatus status) throws Exception {
+                cancelNextPhaseEventFromTransaction(subscriptionId, dao);
+                dao.insertEvent(nextPhase);
+                return null;
+            }
+        });
+    }
+
+
+    @Override
+    public List<EntitlementEvent> getEventsForSubscription(UUID subscriptionId) {
+        List<EntitlementEvent> events = eventsDao.getEventsForSubscription(subscriptionId.toString());
+        return events;
+    }
+
+    @Override
+    public List<EntitlementEvent> getPendingEventsForSubscription(UUID subscriptionId) {
+        Date now = clock.getUTCNow().toDate();
+        List<EntitlementEvent> results = eventsDao.getFutureActiveEventForSubscription(subscriptionId.toString(), now);
+        return results;
+    }
+
+    @Override
+    public List<EntitlementEvent> getEventsReady(final UUID ownerId, final int sequenceId) {
+
+        final Date now = clock.getUTCNow().toDate();
+        final Date nextAvailable = clock.getUTCNow().plus(config.getDaoClaimTimeMs()).toDate();
+
+        log.debug(String.format("EntitlementDao getEventsReady START effectiveNow =  %s", now));
+
+        List<EntitlementEvent> events = eventsDao.inTransaction(new Transaction<List<EntitlementEvent>, EventSqlDao>() {
+
+            @Override
+            public List<EntitlementEvent> inTransaction(EventSqlDao dao,
+                    TransactionStatus status) throws Exception {
+
+                List<EntitlementEvent> claimedEvents = new ArrayList<EntitlementEvent>();
+                List<EntitlementEvent> input = dao.getReadyEvents(now, config.getDaoMaxReadyEvents());
+                for (EntitlementEvent cur : input) {
+                    final boolean claimed = (dao.claimEvent(ownerId.toString(), nextAvailable, cur.getId().toString(), now) == 1);
+                    if (claimed) {
+                        claimedEvents.add(cur);
+                        dao.insertClaimedHistory(sequenceId, ownerId.toString(), hostname, now, cur.getId().toString());
+                    }
+                }
+                return claimedEvents;
+            }
+        });
+
+        for (EntitlementEvent cur : events) {
+            log.debug(String.format("EntitlementDao %s [host %s] claimed events %s", ownerId, hostname, cur.getId()));
+            if (cur.getOwner() != null && !cur.getOwner().equals(ownerId)) {
+                log.warn(String.format("EventProcessor %s stealing event %s from %s", ownerId, cur, cur.getOwner()));
+            }
+        }
+        return events;
+    }
+
+    @Override
+    public void clearEventsReady(final UUID ownerId, final Collection<EntitlementEvent> cleared) {
+
+        log.debug(String.format("EntitlementDao clearEventsReady START cleared size = %d", cleared.size()));
+
+        eventsDao.inTransaction(new Transaction<Void, EventSqlDao>() {
+
+            @Override
+            public Void inTransaction(EventSqlDao dao,
+                    TransactionStatus status) throws Exception {
+                // STEPH Same here batch would nice
+                for (EntitlementEvent cur : cleared) {
+                    dao.clearEvent(cur.getId().toString(), ownerId.toString());
+                    log.debug(String.format("EntitlementDao %s [host %s] cleared events %s", ownerId, hostname, cur.getId()));
+                }
+                return null;
+            }
+        });
+    }
+
+    @Override
+    public Subscription createSubscription(final SubscriptionData subscription,
+            final List<EntitlementEvent> initialEvents) {
+
+        subscriptionsDao.inTransaction(new Transaction<Void, SubscriptionSqlDao>() {
+
+            @Override
+            public Void inTransaction(SubscriptionSqlDao dao,
+                    TransactionStatus status) throws Exception {
+
+                dao.insertSubscription(subscription);
+                // STEPH batch as well
+                EventSqlDao eventsDaoFromSameTranscation = dao.become(EventSqlDao.class);
+                for (EntitlementEvent cur : initialEvents) {
+                    eventsDaoFromSameTranscation.insertEvent(cur);
+                }
+                return null;
+            }
+        });
+        return new SubscriptionData(new SubscriptionBuilder(subscription), true);
+    }
+
+    @Override
+    public void cancelSubscription(final UUID subscriptionId, final EntitlementEvent cancelEvent) {
+
+        eventsDao.inTransaction(new Transaction<Void, EventSqlDao>() {
+            @Override
+            public Void inTransaction(EventSqlDao dao,
+                    TransactionStatus status) throws Exception {
+                cancelNextChangeEventFromTransaction(subscriptionId, dao);
+                cancelNextPhaseEventFromTransaction(subscriptionId, dao);
+                dao.insertEvent(cancelEvent);
+                return null;
+            }
+        });
+    }
+
+    @Override
+    public void uncancelSubscription(final UUID subscriptionId, final List<EntitlementEvent> uncancelEvents) {
+
+        eventsDao.inTransaction(new Transaction<Void, EventSqlDao>() {
+
+            @Override
+            public Void inTransaction(EventSqlDao dao,
+                    TransactionStatus status) throws Exception {
+
+                UUID existingCancelId = null;
+                Date now = clock.getUTCNow().toDate();
+                List<EntitlementEvent> events = dao.getFutureActiveEventForSubscription(subscriptionId.toString(), now);
+
+                for (EntitlementEvent cur : events) {
+                    if (cur.getType() == EventType.API_USER && ((ApiEvent) cur).getEventType() == ApiEventType.CANCEL) {
+                        if (existingCancelId != null) {
+                            throw new EntitlementError(String.format("Found multiple cancel active events for subscriptions %s", subscriptionId.toString()));
+                        }
+                        existingCancelId = cur.getId();
+                    }
+                }
+
+                if (existingCancelId != null) {
+                    dao.unactiveEvent(existingCancelId.toString(), now);
+                    for (EntitlementEvent cur : uncancelEvents) {
+                        dao.insertEvent(cur);
+                    }
+                }
+                return null;
+            }
+        });
+    }
+
+    @Override
+    public void changePlan(final UUID subscriptionId, final List<EntitlementEvent> changeEvents) {
+        eventsDao.inTransaction(new Transaction<Void, EventSqlDao>() {
+            @Override
+            public Void inTransaction(EventSqlDao dao,
+                    TransactionStatus status) throws Exception {
+                cancelNextChangeEventFromTransaction(subscriptionId, dao);
+                cancelNextPhaseEventFromTransaction(subscriptionId, dao);
+                for (EntitlementEvent cur : changeEvents) {
+                    dao.insertEvent(cur);
+                }
+                return null;
+            }
+        });
+    }
+
+    private void cancelNextPhaseEventFromTransaction(final UUID subscriptionId, final EventSqlDao dao) {
+        cancelFutureEventFromTransaction(subscriptionId, dao, EventType.PHASE, null);
+    }
+
+    private void cancelNextChangeEventFromTransaction(final UUID subscriptionId, final EventSqlDao dao) {
+        cancelFutureEventFromTransaction(subscriptionId, dao, EventType.API_USER, ApiEventType.CHANGE);
+    }
+
+    private void cancelFutureEventFromTransaction(final UUID subscriptionId, final EventSqlDao dao, EventType type, ApiEventType apiType) {
+
+        UUID futureEventId = null;
+        Date now = clock.getUTCNow().toDate();
+        List<EntitlementEvent> events = dao.getFutureActiveEventForSubscription(subscriptionId.toString(), now);
+        for (EntitlementEvent cur : events) {
+            if (cur.getType() == type &&
+                    (apiType == null || apiType == ((ApiEvent) cur).getEventType() )) {
+                if (futureEventId != null) {
+                    throw new EntitlementError(
+                            String.format("Found multiple future events for type %s for subscriptions %s",
+                                    type, subscriptionId.toString()));
+                }
+                futureEventId = cur.getId();
+            }
+        }
+
+        if (futureEventId != null) {
+            dao.unactiveEvent(futureEventId.toString(), now);
+        }
+    }
+}
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/events/EventBase.java b/entitlement/src/main/java/com/ning/billing/entitlement/events/EventBase.java
index 845455d..d2a8f61 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/events/EventBase.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/events/EventBase.java
@@ -21,11 +21,11 @@ import java.util.UUID;
 import org.joda.time.DateTime;
 
 import com.ning.billing.catalog.api.IPlan;
-import com.ning.billing.entitlement.events.IEventLifecycle.IEventLifecycleState;
-import com.ning.billing.entitlement.events.user.IApiEvent;
+import com.ning.billing.entitlement.events.EventLifecycle.EventLifecycleState;
+import com.ning.billing.entitlement.events.user.ApiEvent;
 import com.ning.billing.entitlement.exceptions.EntitlementError;
 
-public abstract class EventBase implements IEntitlementEvent {
+public abstract class EventBase implements EntitlementEvent {
 
     private final UUID uuid;
     private final UUID subscriptionId;
@@ -38,7 +38,7 @@ public abstract class EventBase implements IEntitlementEvent {
     private boolean isActive;
     private UUID processingOwner;
     private DateTime nextAvailableProcessingTime;
-    private IEventLifecycleState processingState;
+    private EventLifecycleState processingState;
 
     public EventBase(EventBaseBuilder builder) {
         this.uuid = builder.getUuid();
@@ -57,14 +57,14 @@ public abstract class EventBase implements IEntitlementEvent {
     public EventBase(UUID subscriptionId, DateTime requestedDate,
             DateTime effectiveDate, DateTime processedDate,
             long activeVersion, boolean isActive) {
-        this(subscriptionId, requestedDate, effectiveDate, processedDate, activeVersion, isActive, null, null, IEventLifecycleState.AVAILABLE);
+        this(subscriptionId, requestedDate, effectiveDate, processedDate, activeVersion, isActive, null, null, EventLifecycleState.AVAILABLE);
     }
 
     private EventBase(UUID subscriptionId, DateTime requestedDate,
             DateTime effectiveDate, DateTime processedDate,
             long activeVersion, boolean isActive,
             UUID processingOwner, DateTime nextAvailableProcessingTime,
-            IEventLifecycleState processingState) {
+            EventLifecycleState processingState) {
         this(UUID.randomUUID(), subscriptionId, requestedDate, effectiveDate, processedDate, activeVersion, isActive,
                 processingOwner, nextAvailableProcessingTime, processingState);
     }
@@ -73,7 +73,7 @@ public abstract class EventBase implements IEntitlementEvent {
             DateTime effectiveDate, DateTime processedDate,
             long activeVersion, boolean isActive,
             UUID processingOwner, DateTime nextAvailableProcessingTime,
-            IEventLifecycleState processingState) {
+            EventLifecycleState processingState) {
         this.uuid = id;
         this.subscriptionId = subscriptionId;
         this.requestedDate = requestedDate;
@@ -163,12 +163,12 @@ public abstract class EventBase implements IEntitlementEvent {
 
 
     @Override
-    public IEventLifecycleState getProcessingState() {
+    public EventLifecycleState getProcessingState() {
         return processingState;
     }
 
     @Override
-    public void setProcessingState(IEventLifecycleState processingState) {
+    public void setProcessingState(EventLifecycleState processingState) {
         this.processingState = processingState;
     }
 
@@ -207,7 +207,7 @@ public abstract class EventBase implements IEntitlementEvent {
     // - If all that is not enough return consistent by random ordering based on UUID
     //
     @Override
-    public int compareTo(IEntitlementEvent other) {
+    public int compareTo(EntitlementEvent other) {
         if (other == null) {
             throw new NullPointerException("IEvent is compared to a null instance");
         }
@@ -227,7 +227,7 @@ public abstract class EventBase implements IEntitlementEvent {
         } else if (getType() != other.getType()) {
             return (getType() == EventType.PHASE) ? -1 : 1;
         } else if (getType() == EventType.API_USER) {
-            return ((IApiEvent) this).getEventType().compareTo(((IApiEvent) other).getEventType());
+            return ((ApiEvent) this).getEventType().compareTo(((ApiEvent) other).getEventType());
         } else {
             return uuid.compareTo(other.getId());
         }
@@ -236,10 +236,10 @@ public abstract class EventBase implements IEntitlementEvent {
 
     @Override
     public boolean equals(Object other) {
-      if (! (other instanceof IEntitlementEvent)) {
+      if (! (other instanceof EntitlementEvent)) {
           return false;
       }
-      return (this.compareTo((IEntitlementEvent) other) == 0);
+      return (this.compareTo((EntitlementEvent) other) == 0);
     }
 
     @Override
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/events/EventBaseBuilder.java b/entitlement/src/main/java/com/ning/billing/entitlement/events/EventBaseBuilder.java
index a66b101..e003e35 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/events/EventBaseBuilder.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/events/EventBaseBuilder.java
@@ -20,7 +20,7 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 
-import com.ning.billing.entitlement.events.IEventLifecycle.IEventLifecycleState;
+import com.ning.billing.entitlement.events.EventLifecycle.EventLifecycleState;
 
 @SuppressWarnings("unchecked")
 public class EventBaseBuilder<T extends EventBaseBuilder<T>> {
@@ -35,13 +35,13 @@ public class EventBaseBuilder<T extends EventBaseBuilder<T>> {
     private boolean isActive;
     private UUID processingOwner;
     private DateTime nextAvailableProcessingTime;
-    private IEventLifecycleState processingState;
+    private EventLifecycleState processingState;
 
 
     public EventBaseBuilder() {
         this.uuid = UUID.randomUUID();
         this.isActive = true;
-        this.processingState = IEventLifecycleState.AVAILABLE;
+        this.processingState = EventLifecycleState.AVAILABLE;
     }
 
     public EventBaseBuilder(EventBaseBuilder<?> copy) {
@@ -103,7 +103,7 @@ public class EventBaseBuilder<T extends EventBaseBuilder<T>> {
         return (T) this;
     }
 
-    public T setProcessingState(IEventLifecycleState processingState) {
+    public T setProcessingState(EventLifecycleState processingState) {
         this.processingState = processingState;
         return (T) this;
     }
@@ -144,7 +144,7 @@ public class EventBaseBuilder<T extends EventBaseBuilder<T>> {
         return nextAvailableProcessingTime;
     }
 
-    public IEventLifecycleState getProcessingState() {
+    public EventLifecycleState getProcessingState() {
         return processingState;
     }
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/events/phase/PhaseEvent.java b/entitlement/src/main/java/com/ning/billing/entitlement/events/phase/PhaseEvent.java
index 7c2d228..8e9ab2c 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/events/phase/PhaseEvent.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/events/phase/PhaseEvent.java
@@ -16,56 +16,9 @@
 
 package com.ning.billing.entitlement.events.phase;
 
+import com.ning.billing.entitlement.events.EntitlementEvent;
 
-import org.joda.time.DateTime;
+public interface PhaseEvent extends EntitlementEvent {
 
-import com.ning.billing.entitlement.alignment.IPlanAligner.TimedPhase;
-import com.ning.billing.entitlement.api.user.Subscription;
-import com.ning.billing.entitlement.events.EventBase;
-
-
-public class PhaseEvent extends EventBase implements IPhaseEvent {
-
-    private final String phaseName;
-
-    public PhaseEvent(PhaseEventBuilder builder) {
-        super(builder);
-        this.phaseName = builder.getPhaseName();
-    }
-
-    @Override
-    public EventType getType() {
-        return EventType.PHASE;
-    }
-
-    @Override
-    public String getPhase() {
-        return phaseName;
-    }
-
-    @Override
-    public String toString() {
-        return "PhaseEvent [getId()= " + getId()
-        		+ ", phaseName=" + phaseName
-        		+ ", getType()=" + getType()
-                + ", getPhase()=" + getPhase()
-                + ", getRequestedDate()=" + getRequestedDate()
-                + ", getEffectiveDate()=" + getEffectiveDate()
-                + ", getActiveVersion()=" + getActiveVersion()
-                + ", getProcessedDate()=" + getProcessedDate()
-                + ", getSubscriptionId()=" + getSubscriptionId()
-                + ", isActive()=" + isActive() + "]\n";
-    }
-
-    public static final IPhaseEvent getNextPhaseEvent(TimedPhase nextTimedPhase, Subscription subscription, DateTime now) {
-        return (nextTimedPhase == null) ?
-                null :
-                    new PhaseEvent(new PhaseEventBuilder()
-                        .setSubscriptionId(subscription.getId())
-                        .setRequestedDate(now)
-                        .setEffectiveDate(nextTimedPhase.getStartPhase())
-                        .setProcessedDate(now)
-                        .setActiveVersion(subscription.getActiveVersion())
-                        .setPhaseName(nextTimedPhase.getPhase().getName()));
-    }
+    public String getPhase();
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/events/phase/PhaseEventData.java b/entitlement/src/main/java/com/ning/billing/entitlement/events/phase/PhaseEventData.java
new file mode 100644
index 0000000..873fb6d
--- /dev/null
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/events/phase/PhaseEventData.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2010-2011 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.entitlement.events.phase;
+
+
+import org.joda.time.DateTime;
+
+import com.ning.billing.entitlement.alignment.TimedPhase;
+import com.ning.billing.entitlement.api.user.SubscriptionData;
+import com.ning.billing.entitlement.events.EventBase;
+
+
+public class PhaseEventData extends EventBase implements PhaseEvent {
+
+    private final String phaseName;
+
+    public PhaseEventData(PhaseEventBuilder builder) {
+        super(builder);
+        this.phaseName = builder.getPhaseName();
+    }
+
+    @Override
+    public EventType getType() {
+        return EventType.PHASE;
+    }
+
+    @Override
+    public String getPhase() {
+        return phaseName;
+    }
+
+    @Override
+    public String toString() {
+        return "PhaseEvent [getId()= " + getId()
+        		+ ", phaseName=" + phaseName
+        		+ ", getType()=" + getType()
+                + ", getPhase()=" + getPhase()
+                + ", getRequestedDate()=" + getRequestedDate()
+                + ", getEffectiveDate()=" + getEffectiveDate()
+                + ", getActiveVersion()=" + getActiveVersion()
+                + ", getProcessedDate()=" + getProcessedDate()
+                + ", getSubscriptionId()=" + getSubscriptionId()
+                + ", isActive()=" + isActive() + "]\n";
+    }
+
+    public static final PhaseEvent getNextPhaseEvent(TimedPhase nextTimedPhase, SubscriptionData subscription, DateTime now) {
+        return (nextTimedPhase == null) ?
+                null :
+                    new PhaseEventData(new PhaseEventBuilder()
+                        .setSubscriptionId(subscription.getId())
+                        .setRequestedDate(now)
+                        .setEffectiveDate(nextTimedPhase.getStartPhase())
+                        .setProcessedDate(now)
+                        .setActiveVersion(subscription.getActiveVersion())
+                        .setPhaseName(nextTimedPhase.getPhase().getName()));
+    }
+}
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/events/user/ApiEventBase.java b/entitlement/src/main/java/com/ning/billing/entitlement/events/user/ApiEventBase.java
index e2be49c..d6f390e 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/events/user/ApiEventBase.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/events/user/ApiEventBase.java
@@ -19,15 +19,9 @@ package com.ning.billing.entitlement.events.user;
 import java.util.UUID;
 
 import org.joda.time.DateTime;
-
-import com.ning.billing.catalog.api.IPlan;
-import com.ning.billing.entitlement.alignment.IPlanAligner;
-import com.ning.billing.entitlement.alignment.PlanAligner;
-import com.ning.billing.entitlement.engine.core.Engine;
 import com.ning.billing.entitlement.events.EventBase;
-import com.ning.billing.entitlement.events.IEventLifecycle.IEventLifecycleState;
 
-public class ApiEventBase extends EventBase implements IApiEvent {
+public class ApiEventBase extends EventBase implements ApiEvent {
 
     private final ApiEventType eventType;
     // Only valid for CREATE/CHANGE
@@ -66,7 +60,7 @@ public class ApiEventBase extends EventBase implements IApiEvent {
 
     public ApiEventBase(UUID id, UUID subscriptionId, DateTime processed, String eventPlan, String eventPhase,
             String priceList, DateTime requestedDate,  ApiEventType eventType, DateTime effectiveDate, long activeVersion,
-            boolean isActive, UUID processingOwner, DateTime nextAvailableProcessingTime,IEventLifecycleState processingState) {
+            boolean isActive, UUID processingOwner, DateTime nextAvailableProcessingTime,EventLifecycleState processingState) {
         super(id, subscriptionId, requestedDate, effectiveDate, processed, activeVersion, isActive, processingOwner, nextAvailableProcessingTime, processingState);
         this.eventType = eventType;
         this.eventPlan = eventPlan;
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/events/user/ApiEventType.java b/entitlement/src/main/java/com/ning/billing/entitlement/events/user/ApiEventType.java
index 3d66a5b..c28941e 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/events/user/ApiEventType.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/events/user/ApiEventType.java
@@ -16,7 +16,7 @@
 
 package com.ning.billing.entitlement.events.user;
 
-import com.ning.billing.entitlement.api.user.ISubscriptionTransition.SubscriptionTransitionType;
+import com.ning.billing.entitlement.api.user.SubscriptionTransition.SubscriptionTransitionType;
 
 
 public enum ApiEventType {
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/glue/EntitlementModule.java b/entitlement/src/main/java/com/ning/billing/entitlement/glue/EntitlementModule.java
index 89b58c8..334de2d 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/glue/EntitlementModule.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/glue/EntitlementModule.java
@@ -19,23 +19,22 @@ package com.ning.billing.entitlement.glue;
 import org.skife.config.ConfigurationObjectFactory;
 
 import com.google.inject.AbstractModule;
-import com.ning.billing.config.IEntitlementConfig;
-import com.ning.billing.entitlement.alignment.IPlanAligner;
+import com.ning.billing.config.EntitlementConfig;
 import com.ning.billing.entitlement.alignment.PlanAligner;
-import com.ning.billing.entitlement.api.IEntitlementService;
+import com.ning.billing.entitlement.api.EntitlementService;
+import com.ning.billing.entitlement.api.billing.DefaultEntitlementBillingApi;
 import com.ning.billing.entitlement.api.billing.EntitlementBillingApi;
-import com.ning.billing.entitlement.api.billing.IEntitlementBillingApi;
+import com.ning.billing.entitlement.api.test.DefaultEntitlementTestApi;
 import com.ning.billing.entitlement.api.test.EntitlementTestApi;
-import com.ning.billing.entitlement.api.test.IEntitlementTestApi;
+import com.ning.billing.entitlement.api.user.DefaultEntitlementUserApi;
 import com.ning.billing.entitlement.api.user.EntitlementUserApi;
-import com.ning.billing.entitlement.api.user.IEntitlementUserApi;
-import com.ning.billing.entitlement.engine.core.ApiEventProcessor;
+import com.ning.billing.entitlement.engine.core.DefaultApiEventProcessor;
 import com.ning.billing.entitlement.engine.core.Engine;
-import com.ning.billing.entitlement.engine.core.IApiEventProcessor;
+import com.ning.billing.entitlement.engine.core.EventNotifier;
+import com.ning.billing.entitlement.engine.dao.EntitlementSqlDao;
 import com.ning.billing.entitlement.engine.dao.EntitlementDao;
-import com.ning.billing.entitlement.engine.dao.IEntitlementDao;
+import com.ning.billing.util.clock.DefaultClock;
 import com.ning.billing.util.clock.Clock;
-import com.ning.billing.util.clock.IClock;
 
 
 
@@ -43,29 +42,29 @@ public class EntitlementModule extends AbstractModule {
 
 
     protected void installClock() {
-        bind(IClock.class).to(Clock.class).asEagerSingleton();
+        bind(Clock.class).to(DefaultClock.class).asEagerSingleton();
     }
 
     protected void installConfig() {
-        final IEntitlementConfig config = new ConfigurationObjectFactory(System.getProperties()).build(IEntitlementConfig.class);
-        bind(IEntitlementConfig.class).toInstance(config);
+        final EntitlementConfig config = new ConfigurationObjectFactory(System.getProperties()).build(EntitlementConfig.class);
+        bind(EntitlementConfig.class).toInstance(config);
     }
 
     protected void installApiEventProcessor() {
-        bind(IApiEventProcessor.class).to(ApiEventProcessor.class).asEagerSingleton();
+        bind(EventNotifier.class).to(DefaultApiEventProcessor.class).asEagerSingleton();
     }
 
     protected void installEntitlementDao() {
-        bind(IEntitlementDao.class).to(EntitlementDao.class).asEagerSingleton();
+        bind(EntitlementDao.class).to(EntitlementSqlDao.class).asEagerSingleton();
     }
 
     protected void installEntitlementCore() {
-        bind(IEntitlementService.class).to(Engine.class).asEagerSingleton();
+        bind(EntitlementService.class).to(Engine.class).asEagerSingleton();
         bind(Engine.class).asEagerSingleton();
-        bind(IPlanAligner.class).to(PlanAligner.class).asEagerSingleton();
-        bind(IEntitlementTestApi.class).to(EntitlementTestApi.class).asEagerSingleton();
-        bind(IEntitlementUserApi.class).to(EntitlementUserApi.class).asEagerSingleton();
-        bind(IEntitlementBillingApi.class).to(EntitlementBillingApi.class).asEagerSingleton();
+        bind(PlanAligner.class).asEagerSingleton();
+        bind(EntitlementTestApi.class).to(DefaultEntitlementTestApi.class).asEagerSingleton();
+        bind(EntitlementUserApi.class).to(DefaultEntitlementUserApi.class).asEagerSingleton();
+        bind(EntitlementBillingApi.class).to(DefaultEntitlementBillingApi.class).asEagerSingleton();
     }
 
     protected void installInjectorMagic() {
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/glue/InjectorMagic.java b/entitlement/src/main/java/com/ning/billing/entitlement/glue/InjectorMagic.java
index 8e845da..5235419 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/glue/InjectorMagic.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/glue/InjectorMagic.java
@@ -20,9 +20,9 @@ import com.google.inject.Inject;
 import com.google.inject.Injector;
 import com.ning.billing.catalog.api.ICatalog;
 import com.ning.billing.catalog.api.ICatalogService;
-import com.ning.billing.entitlement.alignment.IPlanAligner;
-import com.ning.billing.entitlement.engine.dao.IEntitlementDao;
-import com.ning.billing.util.clock.IClock;
+import com.ning.billing.entitlement.alignment.PlanAligner;
+import com.ning.billing.entitlement.engine.dao.EntitlementDao;
+import com.ning.billing.util.clock.Clock;
 
 //
 // Allows to return Guice injected singleton in a non guice context
@@ -45,8 +45,8 @@ public class InjectorMagic {
     }
 
 
-    public static IClock getClock() {
-        return InjectorMagic.get().getInstance(IClock.class);
+    public static Clock getClock() {
+        return InjectorMagic.get().getInstance(Clock.class);
     }
 
     public static ICatalog getCatlog() {
@@ -54,12 +54,12 @@ public class InjectorMagic {
         return catalogService.getCatalog();
     }
 
-    public static IEntitlementDao getEntitlementDao() {
-        return InjectorMagic.get().getInstance(IEntitlementDao.class);
+    public static EntitlementDao getEntitlementDao() {
+        return InjectorMagic.get().getInstance(EntitlementDao.class);
     }
 
-    public static IPlanAligner getPlanAligner() {
-        return InjectorMagic.get().getInstance(IPlanAligner.class);
+    public static PlanAligner getPlanAligner() {
+        return InjectorMagic.get().getInstance(PlanAligner.class);
     }
 
 
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/ApiTestListener.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/ApiTestListener.java
index 1ba79af..b14bf38 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/ApiTestListener.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/ApiTestListener.java
@@ -28,8 +28,8 @@ import com.google.common.base.Function;
 import com.google.common.base.Joiner;
 import com.google.common.collect.Lists;
 import com.google.common.eventbus.Subscribe;
-import com.ning.billing.entitlement.api.user.ISubscriptionTransition;
-import com.ning.billing.util.eventbus.IEventBus;
+import com.ning.billing.entitlement.api.user.SubscriptionTransition;
+import com.ning.billing.util.eventbus.EventBus;
 
 public class ApiTestListener {
 
@@ -48,13 +48,13 @@ public class ApiTestListener {
         PHASE
     }
 
-    public ApiTestListener(IEventBus eventBus) {
+    public ApiTestListener(EventBus eventBus) {
         this.nextExpectedEvent = new Stack<NextEvent>();
         this.completed = false;
     }
 
     @Subscribe
-    public void handleEntitlementEvent(ISubscriptionTransition event) {
+    public void handleEntitlementEvent(SubscriptionTransition event) {
         switch (event.getTransitionType()) {
         case CREATE:
             subscriptionCreated(event);
@@ -139,35 +139,35 @@ public class ApiTestListener {
     }
 
 
-    public void subscriptionCreated(ISubscriptionTransition created) {
+    public void subscriptionCreated(SubscriptionTransition created) {
         log.debug("-> Got event CREATED");
         assertEqualsNicely(NextEvent.CREATE);
         notifyIfStackEmpty();
     }
 
 
-    public void subscriptionCancelled(ISubscriptionTransition cancelled) {
+    public void subscriptionCancelled(SubscriptionTransition cancelled) {
         log.debug("-> Got event CANCEL");
         assertEqualsNicely(NextEvent.CANCEL);
         notifyIfStackEmpty();
     }
 
 
-    public void subscriptionChanged(ISubscriptionTransition changed) {
+    public void subscriptionChanged(SubscriptionTransition changed) {
         log.debug("-> Got event CHANGE");
         assertEqualsNicely(NextEvent.CHANGE);
         notifyIfStackEmpty();
     }
 
 
-    public void subscriptionPaused(ISubscriptionTransition paused) {
+    public void subscriptionPaused(SubscriptionTransition paused) {
         log.debug("-> Got event PAUSE");
         assertEqualsNicely(NextEvent.PAUSE);
         notifyIfStackEmpty();
     }
 
 
-    public void subscriptionResumed(ISubscriptionTransition resumed) {
+    public void subscriptionResumed(SubscriptionTransition resumed) {
         log.debug("-> Got event RESUME");
         assertEqualsNicely(NextEvent.RESUME);
         notifyIfStackEmpty();
@@ -175,7 +175,7 @@ public class ApiTestListener {
 
 
     public void subscriptionPhaseChanged(
-            ISubscriptionTransition phaseChanged) {
+            SubscriptionTransition phaseChanged) {
         log.debug("-> Got event PHASE");
         assertEqualsNicely(NextEvent.PHASE);
         notifyIfStackEmpty();
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java
index 4ba28c3..477075b 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java
@@ -20,24 +20,24 @@ import com.google.inject.Injector;
 import com.ning.billing.account.api.IAccount;
 import com.ning.billing.catalog.CatalogService;
 import com.ning.billing.catalog.api.*;
-import com.ning.billing.config.IEntitlementConfig;
+import com.ning.billing.config.EntitlementConfig;
 import com.ning.billing.entitlement.api.ApiTestListener;
 import com.ning.billing.entitlement.api.ApiTestListener.NextEvent;
-import com.ning.billing.entitlement.api.IEntitlementService;
-import com.ning.billing.entitlement.api.billing.IEntitlementBillingApi;
+import com.ning.billing.entitlement.api.EntitlementService;
+import com.ning.billing.entitlement.api.billing.EntitlementBillingApi;
 import com.ning.billing.entitlement.engine.core.Engine;
-import com.ning.billing.entitlement.engine.dao.IEntitlementDao;
-import com.ning.billing.entitlement.engine.dao.IEntitlementDaoMock;
-import com.ning.billing.entitlement.events.IEntitlementEvent;
-import com.ning.billing.entitlement.events.phase.IPhaseEvent;
+import com.ning.billing.entitlement.engine.dao.EntitlementDao;
+import com.ning.billing.entitlement.engine.dao.MockEntitlementDao;
+import com.ning.billing.entitlement.events.EntitlementEvent;
+import com.ning.billing.entitlement.events.phase.PhaseEvent;
 import com.ning.billing.entitlement.events.user.ApiEventType;
-import com.ning.billing.entitlement.events.user.IApiEvent;
+import com.ning.billing.entitlement.events.user.ApiEvent;
 import com.ning.billing.entitlement.glue.InjectorMagic;
-import com.ning.billing.lifecycle.IService.ServiceException;
+import com.ning.billing.lifecycle.KillbillService.ServiceException;
 import com.ning.billing.util.clock.ClockMock;
-import com.ning.billing.util.clock.IClock;
+import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.eventbus.DefaultEventBusService;
 import com.ning.billing.util.eventbus.EventBusService;
-import com.ning.billing.util.eventbus.IEventBusService;
 import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -63,19 +63,19 @@ public abstract class TestUserApiBase {
 
     protected static final long DAY_IN_MS = (24 * 3600 * 1000);
 
-    protected IEntitlementService entitlementService;
-    protected IEntitlementUserApi entitlementApi;
-    protected IEntitlementBillingApi billingApi;
+    protected EntitlementService entitlementService;
+    protected EntitlementUserApi entitlementApi;
+    protected EntitlementBillingApi billingApi;
     protected ICatalogService catalogService;
-    protected IEntitlementConfig config;
-    protected IEntitlementDao dao;
+    protected EntitlementConfig config;
+    protected EntitlementDao dao;
     protected ClockMock clock;
-    protected IEventBusService busService;
+    protected EventBusService busService;
 
     protected IAccount account;
     protected ICatalog catalog;
     protected ApiTestListener testListener;
-    protected ISubscriptionBundle bundle;
+    protected SubscriptionBundle bundle;
 
     public static void loadSystemPropertiesFromClasspath( final String resource )
     {
@@ -94,7 +94,7 @@ public abstract class TestUserApiBase {
         try {
             InjectorMagic.instance = null;
             busService.getEventBus().register(testListener);
-            ((EventBusService) busService).stopBus();
+            ((DefaultEventBusService) busService).stopBus();
         } catch (Exception e) {
             log.warn("Failed to tearDown test properly ", e);
         }
@@ -107,16 +107,16 @@ public abstract class TestUserApiBase {
         loadSystemPropertiesFromClasspath("/entitlement.properties");
         final Injector g = getInjector();
 
-        entitlementService = g.getInstance(IEntitlementService.class);
+        entitlementService = g.getInstance(EntitlementService.class);
         catalogService = g.getInstance(ICatalogService.class);
-        busService = g.getInstance(IEventBusService.class);
-        config = g.getInstance(IEntitlementConfig.class);
-        dao = g.getInstance(IEntitlementDao.class);
-        clock = (ClockMock) g.getInstance(IClock.class);
+        busService = g.getInstance(EventBusService.class);
+        config = g.getInstance(EntitlementConfig.class);
+        dao = g.getInstance(EntitlementDao.class);
+        clock = (ClockMock) g.getInstance(Clock.class);
         try {
 
             ((CatalogService) catalogService).loadCatalog();
-            ((EventBusService) busService).startBus();
+            ((DefaultEventBusService) busService).startBus();
             ((Engine) entitlementService).initialize();
             init();
         } catch (EntitlementUserApiException e) {
@@ -151,7 +151,7 @@ public abstract class TestUserApiBase {
         testListener.reset();
 
         clock.resetDeltaFromReality();
-        ((IEntitlementDaoMock) dao).reset();
+        ((MockEntitlementDao) dao).reset();
         try {
             busService.getEventBus().register(testListener);
             bundle = entitlementApi.createBundleForAccount(account, "myDefaultBundle");
@@ -193,17 +193,17 @@ public abstract class TestUserApiBase {
         }
     }
 
-    protected Subscription createSubscription(String productName, BillingPeriod term, String planSet) throws EntitlementUserApiException {
+    protected SubscriptionData createSubscription(String productName, BillingPeriod term, String planSet) throws EntitlementUserApiException {
         testListener.pushExpectedEvent(NextEvent.CREATE);
-        Subscription subscription = (Subscription) entitlementApi.createSubscription(bundle.getId(), productName, term, planSet, clock.getUTCNow());
+        SubscriptionData subscription = (SubscriptionData) entitlementApi.createSubscription(bundle.getId(), productName, term, planSet, clock.getUTCNow());
         assertNotNull(subscription);
         assertTrue(testListener.isCompleted(5000));
         return subscription;
     }
 
-    protected void checkNextPhaseChange(Subscription subscription, int expPendingEvents, DateTime expPhaseChange) {
+    protected void checkNextPhaseChange(SubscriptionData subscription, int expPendingEvents, DateTime expPhaseChange) {
 
-        List<IEntitlementEvent> events = dao.getPendingEventsForSubscription(subscription.getId());
+        List<EntitlementEvent> events = dao.getPendingEventsForSubscription(subscription.getId());
         assertNotNull(events);
         printEvents(events);
         assertEquals(events.size(), expPendingEvents);
@@ -211,13 +211,13 @@ public abstract class TestUserApiBase {
             boolean foundPhase = false;
             boolean foundChange = false;
 
-            for (IEntitlementEvent cur : events) {
-                if (cur instanceof IPhaseEvent) {
+            for (EntitlementEvent cur : events) {
+                if (cur instanceof PhaseEvent) {
                     assertEquals(foundPhase, false);
                     foundPhase = true;
                     assertEquals(cur.getEffectiveDate(), expPhaseChange);
-                } else if (cur instanceof IApiEvent) {
-                    IApiEvent uEvent = (IApiEvent) cur;
+                } else if (cur instanceof ApiEvent) {
+                    ApiEvent uEvent = (ApiEvent) cur;
                     assertEquals(ApiEventType.CHANGE, uEvent.getEventType());
                     assertEquals(foundChange, false);
                     foundChange = true;
@@ -327,14 +327,14 @@ public abstract class TestUserApiBase {
     }
 
 
-    protected void printEvents(List<IEntitlementEvent> events) {
-        for (IEntitlementEvent cur : events) {
+    protected void printEvents(List<EntitlementEvent> events) {
+        for (EntitlementEvent cur : events) {
             log.debug("Inspect event " + cur);
         }
     }
 
-    protected void printSubscriptionTransitions(List<ISubscriptionTransition> transitions) {
-        for (ISubscriptionTransition cur : transitions) {
+    protected void printSubscriptionTransitions(List<SubscriptionTransition> transitions) {
+        for (SubscriptionTransition cur : transitions) {
             log.debug("Transition " + cur);
         }
     }
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCancel.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCancel.java
index 6a8dee2..c1c025d 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCancel.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCancel.java
@@ -33,7 +33,7 @@ import com.ning.billing.catalog.api.IPlanPhase;
 import com.ning.billing.catalog.api.IPriceListSet;
 import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.entitlement.api.ApiTestListener.NextEvent;
-import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.clock.DefaultClock;
 
 public abstract class TestUserApiCancel extends TestUserApiBase {
 
@@ -50,7 +50,7 @@ public abstract class TestUserApiCancel extends TestUserApiBase {
             String planSet = IPriceListSet.DEFAULT_PRICELIST_NAME;
 
             // CREATE
-            Subscription subscription = createSubscription(prod, term, planSet);
+            SubscriptionData subscription = createSubscription(prod, term, planSet);
             IPlanPhase currentPhase = subscription.getCurrentPhase();
             assertEquals(currentPhase.getPhaseType(), PhaseType.TRIAL);
 
@@ -67,7 +67,7 @@ public abstract class TestUserApiCancel extends TestUserApiBase {
 
             testListener.isCompleted(1000);
 
-            List<ISubscriptionTransition> allTransitions = subscription.getActiveTransitions();
+            List<SubscriptionTransition> allTransitions = subscription.getActiveTransitions();
             printSubscriptionTransitions(allTransitions);
 
             assertNull(currentPhase);
@@ -89,12 +89,12 @@ public abstract class TestUserApiCancel extends TestUserApiBase {
             String planSet = IPriceListSet.DEFAULT_PRICELIST_NAME;
 
             // CREATE
-            Subscription subscription = createSubscription(prod, term, planSet);
+            SubscriptionData subscription = createSubscription(prod, term, planSet);
             IPlanPhase trialPhase = subscription.getCurrentPhase();
             assertEquals(trialPhase.getPhaseType(), PhaseType.TRIAL);
 
             // NEXT PHASE
-            DateTime expectedPhaseTrialChange = Clock.addDuration(subscription.getStartDate(), trialPhase.getDuration());
+            DateTime expectedPhaseTrialChange = DefaultClock.addDuration(subscription.getStartDate(), trialPhase.getDuration());
             checkNextPhaseChange(subscription, 1, expectedPhaseTrialChange);
 
             // MOVE TO NEXT PHASE
@@ -106,9 +106,9 @@ public abstract class TestUserApiCancel extends TestUserApiBase {
 
             // SET CTD + RE READ SUBSCRIPTION + CHANGE PLAN
             IDuration ctd = getDurationMonth(1);
-            DateTime newChargedThroughDate = Clock.addDuration(expectedPhaseTrialChange, ctd);
+            DateTime newChargedThroughDate = DefaultClock.addDuration(expectedPhaseTrialChange, ctd);
             billingApi.setChargedThroughDate(subscription.getId(), newChargedThroughDate);
-            subscription = (Subscription) entitlementApi.getSubscriptionFromId(subscription.getId());
+            subscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(subscription.getId());
 
             testListener.pushExpectedEvent(NextEvent.CANCEL);
 
@@ -142,12 +142,12 @@ public abstract class TestUserApiCancel extends TestUserApiBase {
             String planSet = IPriceListSet.DEFAULT_PRICELIST_NAME;
 
             // CREATE
-            Subscription subscription = createSubscription(prod, term, planSet);
+            SubscriptionData subscription = createSubscription(prod, term, planSet);
             IPlanPhase trialPhase = subscription.getCurrentPhase();
             assertEquals(trialPhase.getPhaseType(), PhaseType.TRIAL);
 
             // NEXT PHASE
-            DateTime expectedPhaseTrialChange = Clock.addDuration(subscription.getStartDate(), trialPhase.getDuration());
+            DateTime expectedPhaseTrialChange = DefaultClock.addDuration(subscription.getStartDate(), trialPhase.getDuration());
             checkNextPhaseChange(subscription, 1, expectedPhaseTrialChange);
 
             // MOVE TO NEXT PHASE
@@ -186,12 +186,12 @@ public abstract class TestUserApiCancel extends TestUserApiBase {
             String planSet = IPriceListSet.DEFAULT_PRICELIST_NAME;
 
             // CREATE
-            Subscription subscription = createSubscription(prod, term, planSet);
+            SubscriptionData subscription = createSubscription(prod, term, planSet);
             IPlanPhase trialPhase = subscription.getCurrentPhase();
             assertEquals(trialPhase.getPhaseType(), PhaseType.TRIAL);
 
             // NEXT PHASE
-            DateTime expectedPhaseTrialChange = Clock.addDuration(subscription.getStartDate(), trialPhase.getDuration());
+            DateTime expectedPhaseTrialChange = DefaultClock.addDuration(subscription.getStartDate(), trialPhase.getDuration());
             checkNextPhaseChange(subscription, 1, expectedPhaseTrialChange);
 
             // MOVE TO NEXT PHASE
@@ -203,9 +203,9 @@ public abstract class TestUserApiCancel extends TestUserApiBase {
 
             // SET CTD + RE READ SUBSCRIPTION + CHANGE PLAN
             IDuration ctd = getDurationMonth(1);
-            DateTime newChargedThroughDate = Clock.addDuration(expectedPhaseTrialChange, ctd);
+            DateTime newChargedThroughDate = DefaultClock.addDuration(expectedPhaseTrialChange, ctd);
             billingApi.setChargedThroughDate(subscription.getId(), newChargedThroughDate);
-            subscription = (Subscription) entitlementApi.getSubscriptionFromId(subscription.getId());
+            subscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(subscription.getId());
 
             testListener.pushExpectedEvent(NextEvent.CANCEL);
 
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCancelMemory.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCancelMemory.java
index 00c2bab..66cd35a 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCancelMemory.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCancelMemory.java
@@ -21,15 +21,14 @@ import org.testng.annotations.Test;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.Stage;
-import com.ning.billing.entitlement.glue.CatalogModuleMock;
-import com.ning.billing.entitlement.glue.EngineModuleMemoryMock;
+import com.ning.billing.entitlement.glue.MockEngineModuleMemory;
 
 public class TestUserApiCancelMemory extends TestUserApiCancel {
 
 
     @Override
     protected Injector getInjector() {
-        return Guice.createInjector(Stage.PRODUCTION, new EngineModuleMemoryMock(), new CatalogModuleMock());
+        return Guice.createInjector(Stage.PRODUCTION, new MockEngineModuleMemory());
     }
 
     @Test(enabled=true, groups={"fast"})
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCancelSql.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCancelSql.java
index 58e8891..83d4d8e 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCancelSql.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCancelSql.java
@@ -21,8 +21,7 @@ import org.testng.annotations.Test;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.Stage;
-import com.ning.billing.entitlement.glue.CatalogModuleMock;
-import com.ning.billing.entitlement.glue.EngineModuleSqlMock;
+import com.ning.billing.entitlement.glue.MockEngineModuleSql;
 
 public class TestUserApiCancelSql extends TestUserApiCancel {
 
@@ -31,7 +30,7 @@ public class TestUserApiCancelSql extends TestUserApiCancel {
 
     @Override
     public Injector getInjector() {
-        return Guice.createInjector(Stage.DEVELOPMENT, new EngineModuleSqlMock(), new CatalogModuleMock());
+        return Guice.createInjector(Stage.DEVELOPMENT, new MockEngineModuleSql());
     }
 
     @Test(enabled= true, groups={"stress"})
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java
index 83c8eef..4f4d454 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlan.java
@@ -35,15 +35,15 @@ import com.ning.billing.catalog.api.IPriceListSet;
 import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.entitlement.api.ApiTestListener.NextEvent;
-import com.ning.billing.entitlement.events.IEntitlementEvent;
-import com.ning.billing.entitlement.events.user.IApiEvent;
-import com.ning.billing.util.clock.Clock;
+import com.ning.billing.entitlement.events.EntitlementEvent;
+import com.ning.billing.entitlement.events.user.ApiEvent;
+import com.ning.billing.util.clock.DefaultClock;
 
 public abstract class TestUserApiChangePlan extends TestUserApiBase {
 
 
 
-    private void checkChangePlan(Subscription subscription, String expProduct, ProductCategory expCategory,
+    private void checkChangePlan(SubscriptionData subscription, String expProduct, ProductCategory expCategory,
             BillingPeriod expBillingPeriod, PhaseType expPhase) {
 
         IPlan currentPlan = subscription.getCurrentPlan();
@@ -72,14 +72,14 @@ public abstract class TestUserApiChangePlan extends TestUserApiBase {
         try {
 
             // CREATE
-            Subscription subscription = createSubscription(fromProd, fromTerm, fromPlanSet);
+            SubscriptionData subscription = createSubscription(fromProd, fromTerm, fromPlanSet);
 
             // MOVE TO NEXT PHASE
             IPlanPhase currentPhase = subscription.getCurrentPhase();
             testListener.pushExpectedEvent(NextEvent.PHASE);
             clock.setDeltaFromReality(currentPhase.getDuration(), DAY_IN_MS);
             DateTime futureNow = clock.getUTCNow();
-            DateTime nextExpectedPhaseChange = Clock.addDuration(subscription.getStartDate(), currentPhase.getDuration());
+            DateTime nextExpectedPhaseChange = DefaultClock.addDuration(subscription.getStartDate(), currentPhase.getDuration());
             assertTrue(futureNow.isAfter(nextExpectedPhaseChange));
             assertTrue(testListener.isCompleted(3000));
 
@@ -109,9 +109,9 @@ public abstract class TestUserApiChangePlan extends TestUserApiBase {
         try {
 
             // CREATE
-            Subscription subscription = createSubscription(fromProd, fromTerm, fromPlanSet);
+            SubscriptionData subscription = createSubscription(fromProd, fromTerm, fromPlanSet);
             IPlanPhase trialPhase = subscription.getCurrentPhase();
-            DateTime expectedPhaseTrialChange = Clock.addDuration(subscription.getStartDate(), trialPhase.getDuration());
+            DateTime expectedPhaseTrialChange = DefaultClock.addDuration(subscription.getStartDate(), trialPhase.getDuration());
             assertEquals(trialPhase.getPhaseType(), PhaseType.TRIAL);
 
 
@@ -125,12 +125,12 @@ public abstract class TestUserApiChangePlan extends TestUserApiBase {
 
             // SET CTD
             IDuration ctd = getDurationMonth(1);
-            DateTime newChargedThroughDate = Clock.addDuration(expectedPhaseTrialChange, ctd);
+            DateTime newChargedThroughDate = DefaultClock.addDuration(expectedPhaseTrialChange, ctd);
             billingApi.setChargedThroughDate(subscription.getId(), newChargedThroughDate);
 
             // RE READ SUBSCRIPTION + CHANGE PLAN
             testListener.pushExpectedEvent(NextEvent.CHANGE);
-            subscription = (Subscription) entitlementApi.getSubscriptionFromId(subscription.getId());
+            subscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(subscription.getId());
             subscription.changePlan(toProd, toTerm, toPlanSet, clock.getUTCNow());
             assertFalse(testListener.isCompleted(2000));
             testListener.reset();
@@ -140,12 +140,12 @@ public abstract class TestUserApiChangePlan extends TestUserApiBase {
             checkChangePlan(subscription, fromProd, ProductCategory.BASE, fromTerm, PhaseType.DISCOUNT);
 
             // NEXT PHASE
-            DateTime nextExpectedPhaseChange = Clock.addDuration(expectedPhaseTrialChange, currentPhase.getDuration());
+            DateTime nextExpectedPhaseChange = DefaultClock.addDuration(expectedPhaseTrialChange, currentPhase.getDuration());
             checkNextPhaseChange(subscription, 2, nextExpectedPhaseChange);
 
             // ALSO VERIFY PENDING CHANGE EVENT
-            List<IEntitlementEvent> events = dao.getPendingEventsForSubscription(subscription.getId());
-            assertTrue(events.get(0) instanceof IApiEvent);
+            List<EntitlementEvent> events = dao.getPendingEventsForSubscription(subscription.getId());
+            assertTrue(events.get(0) instanceof ApiEvent);
 
 
             // MOVE TO EOT
@@ -153,7 +153,7 @@ public abstract class TestUserApiChangePlan extends TestUserApiBase {
             clock.addDeltaFromReality(ctd);
             assertTrue(testListener.isCompleted(5000));
 
-            subscription = (Subscription) entitlementApi.getSubscriptionFromId(subscription.getId());
+            subscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(subscription.getId());
             currentPhase = subscription.getCurrentPhase();
             checkChangePlan(subscription, toProd, ProductCategory.BASE, toTerm, PhaseType.DISCOUNT);
 
@@ -175,7 +175,7 @@ public abstract class TestUserApiChangePlan extends TestUserApiBase {
 
         try {
 
-            Subscription subscription = createSubscription(fromProd, fromTerm, fromPlanSet);
+            SubscriptionData subscription = createSubscription(fromProd, fromTerm, fromPlanSet);
 
             testListener.pushExpectedEvent(NextEvent.CHANGE);
 
@@ -189,7 +189,7 @@ public abstract class TestUserApiChangePlan extends TestUserApiBase {
             assertTrue(testListener.isCompleted(2000));
 
             IPlanPhase currentPhase = subscription.getCurrentPhase();
-            DateTime nextExpectedPhaseChange = Clock.addDuration(subscription.getStartDate(), currentPhase.getDuration());
+            DateTime nextExpectedPhaseChange = DefaultClock.addDuration(subscription.getStartDate(), currentPhase.getDuration());
             checkNextPhaseChange(subscription, 1, nextExpectedPhaseChange);
 
             // NEXT PHASE
@@ -218,9 +218,9 @@ public abstract class TestUserApiChangePlan extends TestUserApiBase {
 
             DateTime currentTime = clock.getUTCNow();
 
-            Subscription subscription = createSubscription(fromProd, fromTerm, fromPlanSet);
+            SubscriptionData subscription = createSubscription(fromProd, fromTerm, fromPlanSet);
             IPlanPhase trialPhase = subscription.getCurrentPhase();
-            DateTime expectedPhaseTrialChange = Clock.addDuration(subscription.getStartDate(), trialPhase.getDuration());
+            DateTime expectedPhaseTrialChange = DefaultClock.addDuration(subscription.getStartDate(), trialPhase.getDuration());
             assertEquals(trialPhase.getPhaseType(), PhaseType.TRIAL);
 
             // MOVE TO NEXT PHASE
@@ -232,11 +232,11 @@ public abstract class TestUserApiChangePlan extends TestUserApiBase {
 
             // SET CTD
             IDuration ctd = getDurationMonth(1);
-            DateTime newChargedThroughDate = Clock.addDuration(expectedPhaseTrialChange, ctd);
+            DateTime newChargedThroughDate = DefaultClock.addDuration(expectedPhaseTrialChange, ctd);
             billingApi.setChargedThroughDate(subscription.getId(), newChargedThroughDate);
 
             // RE READ SUBSCRIPTION + CHECK CURRENT PHASE
-            subscription = (Subscription) entitlementApi.getSubscriptionFromId(subscription.getId());
+            subscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(subscription.getId());
             IPlanPhase currentPhase = subscription.getCurrentPhase();
             assertNotNull(currentPhase);
             assertEquals(currentPhase.getPhaseType(), PhaseType.EVERGREEN);
@@ -273,7 +273,7 @@ public abstract class TestUserApiChangePlan extends TestUserApiBase {
             currentTime = clock.getUTCNow();
             assertFalse(testListener.isCompleted(2000));
 
-            DateTime nextExpectedPhaseChange = Clock.addDuration(newChargedThroughDate, currentPhase.getDuration());
+            DateTime nextExpectedPhaseChange = DefaultClock.addDuration(newChargedThroughDate, currentPhase.getDuration());
             checkNextPhaseChange(subscription, 1, nextExpectedPhaseChange);
 
             // MOVE TIME RIGHT AFTER NEXT EXPECTED PHASE CHANGE
@@ -289,7 +289,7 @@ public abstract class TestUserApiChangePlan extends TestUserApiBase {
     protected void testMultipleChangeLastIMMReal() {
 
         try {
-            Subscription subscription = createSubscription("Assault-Rifle", BillingPeriod.MONTHLY, "gunclubDiscount");
+            SubscriptionData subscription = createSubscription("Assault-Rifle", BillingPeriod.MONTHLY, "gunclubDiscount");
             IPlanPhase trialPhase = subscription.getCurrentPhase();
             assertEquals(trialPhase.getPhaseType(), PhaseType.TRIAL);
 
@@ -302,11 +302,11 @@ public abstract class TestUserApiChangePlan extends TestUserApiBase {
             List<IDuration> durationList = new ArrayList<IDuration>();
             durationList.add(trialPhase.getDuration());
             //durationList.add(subscription.getCurrentPhase().getDuration());
-            DateTime startDiscountPhase = Clock.addDuration(subscription.getStartDate(), durationList);
+            DateTime startDiscountPhase = DefaultClock.addDuration(subscription.getStartDate(), durationList);
             IDuration ctd = getDurationMonth(1);
-            DateTime newChargedThroughDate = Clock.addDuration(startDiscountPhase, ctd);
+            DateTime newChargedThroughDate = DefaultClock.addDuration(startDiscountPhase, ctd);
             billingApi.setChargedThroughDate(subscription.getId(), newChargedThroughDate);
-            subscription = (Subscription) entitlementApi.getSubscriptionFromId(subscription.getId());
+            subscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(subscription.getId());
 
             // CHANGE EOT
             testListener.pushExpectedEvent(NextEvent.CHANGE);
@@ -337,7 +337,7 @@ public abstract class TestUserApiChangePlan extends TestUserApiBase {
 
         try {
 
-            Subscription subscription = createSubscription("Assault-Rifle", BillingPeriod.ANNUAL, "gunclubDiscount");
+            SubscriptionData subscription = createSubscription("Assault-Rifle", BillingPeriod.ANNUAL, "gunclubDiscount");
             IPlanPhase trialPhase = subscription.getCurrentPhase();
             assertEquals(trialPhase.getPhaseType(), PhaseType.TRIAL);
 
@@ -348,11 +348,11 @@ public abstract class TestUserApiChangePlan extends TestUserApiBase {
             // SET CTD
             List<IDuration> durationList = new ArrayList<IDuration>();
             durationList.add(trialPhase.getDuration());
-            DateTime startDiscountPhase = Clock.addDuration(subscription.getStartDate(), durationList);
+            DateTime startDiscountPhase = DefaultClock.addDuration(subscription.getStartDate(), durationList);
             IDuration ctd = getDurationMonth(1);
-            DateTime newChargedThroughDate = Clock.addDuration(startDiscountPhase, ctd);
+            DateTime newChargedThroughDate = DefaultClock.addDuration(startDiscountPhase, ctd);
             billingApi.setChargedThroughDate(subscription.getId(), newChargedThroughDate);
-            subscription = (Subscription) entitlementApi.getSubscriptionFromId(subscription.getId());
+            subscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(subscription.getId());
 
             // CHANGE EOT
             testListener.pushExpectedEvent(NextEvent.CHANGE);
@@ -398,7 +398,7 @@ public abstract class TestUserApiChangePlan extends TestUserApiBase {
             testListener.pushExpectedEvent(NextEvent.PHASE);
             clock.addDeltaFromReality(currentPhase.getDuration());
             assertTrue(testListener.isCompleted(3000));
-            subscription = (Subscription) entitlementApi.getSubscriptionFromId(subscription.getId());
+            subscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(subscription.getId());
 
             currentPlan = subscription.getCurrentPlan();
             assertNotNull(currentPlan);
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlanMemory.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlanMemory.java
index 8847612..341b9b6 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlanMemory.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlanMemory.java
@@ -21,14 +21,13 @@ import org.testng.annotations.Test;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.Stage;
-import com.ning.billing.entitlement.glue.CatalogModuleMock;
-import com.ning.billing.entitlement.glue.EngineModuleMemoryMock;
+import com.ning.billing.entitlement.glue.MockEngineModuleMemory;
 
 public class TestUserApiChangePlanMemory extends TestUserApiChangePlan {
 
     @Override
     protected Injector getInjector() {
-        return Guice.createInjector(Stage.PRODUCTION, new EngineModuleMemoryMock(), new CatalogModuleMock());
+        return Guice.createInjector(Stage.PRODUCTION, new MockEngineModuleMemory());
     }
 
 
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlanSql.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlanSql.java
index 60d777d..2ccf83f 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlanSql.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiChangePlanSql.java
@@ -21,8 +21,7 @@ import org.testng.annotations.Test;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.Stage;
-import com.ning.billing.entitlement.glue.CatalogModuleMock;
-import com.ning.billing.entitlement.glue.EngineModuleSqlMock;
+import com.ning.billing.entitlement.glue.MockEngineModuleSql;
 
 public class TestUserApiChangePlanSql extends TestUserApiChangePlan {
 
@@ -30,7 +29,7 @@ public class TestUserApiChangePlanSql extends TestUserApiChangePlan {
 
     @Override
     public Injector getInjector() {
-        return Guice.createInjector(Stage.DEVELOPMENT, new EngineModuleSqlMock(), new CatalogModuleMock());
+        return Guice.createInjector(Stage.DEVELOPMENT, new MockEngineModuleSql());
     }
 
     @Test(enabled= true, groups={"stress"})
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreate.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreate.java
index b2c215c..7df1bad 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreate.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreate.java
@@ -32,9 +32,9 @@ import com.ning.billing.catalog.api.IPriceListSet;
 import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.entitlement.api.ApiTestListener.NextEvent;
-import com.ning.billing.entitlement.events.IEntitlementEvent;
-import com.ning.billing.entitlement.events.phase.IPhaseEvent;
-import com.ning.billing.util.clock.Clock;
+import com.ning.billing.entitlement.events.EntitlementEvent;
+import com.ning.billing.entitlement.events.phase.PhaseEvent;
+import com.ning.billing.util.clock.DefaultClock;
 
 public abstract class TestUserApiCreate extends TestUserApiBase {
 
@@ -56,7 +56,7 @@ public abstract class TestUserApiCreate extends TestUserApiBase {
             testListener.pushExpectedEvent(NextEvent.CREATE);
 
 
-            Subscription subscription = (Subscription) entitlementApi.createSubscription(bundle.getId(), productName, term, planSetName, requestedDate);
+            SubscriptionData subscription = (SubscriptionData) entitlementApi.createSubscription(bundle.getId(), productName, term, planSetName, requestedDate);
             assertNotNull(subscription);
 
             assertEquals(subscription.getActiveVersion(), SubscriptionEvents.INITIAL_VERSION);
@@ -84,7 +84,7 @@ public abstract class TestUserApiCreate extends TestUserApiBase {
 
             testListener.pushExpectedEvent(NextEvent.CREATE);
 
-            Subscription subscription = (Subscription) entitlementApi.createSubscription(bundle.getId(), productName, term, planSetName, clock.getUTCNow());
+            SubscriptionData subscription = (SubscriptionData) entitlementApi.createSubscription(bundle.getId(), productName, term, planSetName, clock.getUTCNow());
             assertNotNull(subscription);
 
             assertEquals(subscription.getActiveVersion(), SubscriptionEvents.INITIAL_VERSION);
@@ -105,19 +105,19 @@ public abstract class TestUserApiCreate extends TestUserApiBase {
             assertNotNull(currentPhase);
             assertEquals(currentPhase.getPhaseType(), PhaseType.TRIAL);
 
-            List<ISubscriptionTransition> transitions = subscription.getActiveTransitions();
+            List<SubscriptionTransition> transitions = subscription.getActiveTransitions();
             assertNotNull(transitions);
             assertEquals(transitions.size(), 1);
 
             assertTrue(testListener.isCompleted(5000));
 
-            List<IEntitlementEvent> events = dao.getPendingEventsForSubscription(subscription.getId());
+            List<EntitlementEvent> events = dao.getPendingEventsForSubscription(subscription.getId());
             assertNotNull(events);
             printEvents(events);
             assertTrue(events.size() == 1);
-            assertTrue(events.get(0) instanceof IPhaseEvent);
-            DateTime nextPhaseChange = ((IPhaseEvent ) events.get(0)).getEffectiveDate();
-            DateTime nextExpectedPhaseChange = Clock.addDuration(subscription.getStartDate(), currentPhase.getDuration());
+            assertTrue(events.get(0) instanceof PhaseEvent);
+            DateTime nextPhaseChange = ((PhaseEvent ) events.get(0)).getEffectiveDate();
+            DateTime nextExpectedPhaseChange = DefaultClock.addDuration(subscription.getStartDate(), currentPhase.getDuration());
             assertEquals(nextPhaseChange, nextExpectedPhaseChange);
 
             testListener.pushExpectedEvent(NextEvent.PHASE);
@@ -149,7 +149,7 @@ public abstract class TestUserApiCreate extends TestUserApiBase {
             testListener.pushExpectedEvent(NextEvent.CREATE);
 
             // CREATE SUBSCRIPTION
-            Subscription subscription = (Subscription) entitlementApi.createSubscription(bundle.getId(), productName, term, planSetName, clock.getUTCNow());
+            SubscriptionData subscription = (SubscriptionData) entitlementApi.createSubscription(bundle.getId(), productName, term, planSetName, clock.getUTCNow());
             assertNotNull(subscription);
 
             IPlanPhase currentPhase = subscription.getCurrentPhase();
@@ -173,7 +173,7 @@ public abstract class TestUserApiCreate extends TestUserApiBase {
             clock.addDeltaFromReality(currentPhase.getDuration());
             assertTrue(testListener.isCompleted(2000));
 
-            subscription = (Subscription) entitlementApi.getSubscriptionFromId(subscription.getId());
+            subscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(subscription.getId());
             curTime = clock.getUTCNow();
             currentPhase = subscription.getCurrentPhase();
             assertNotNull(currentPhase);
@@ -196,7 +196,7 @@ public abstract class TestUserApiCreate extends TestUserApiBase {
 
             testListener.pushExpectedEvent(NextEvent.CREATE);
 
-            Subscription subscription = (Subscription) entitlementApi.createSubscription(bundle.getId(), productName, term, planSetName, clock.getUTCNow());
+            SubscriptionData subscription = (SubscriptionData) entitlementApi.createSubscription(bundle.getId(), productName, term, planSetName, clock.getUTCNow());
             assertNotNull(subscription);
 
         } catch (EntitlementUserApiException e) {
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreateMemory.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreateMemory.java
index 8c1fa63..73d0b5d 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreateMemory.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreateMemory.java
@@ -21,15 +21,14 @@ import org.testng.annotations.Test;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.Stage;
-import com.ning.billing.entitlement.glue.CatalogModuleMock;
-import com.ning.billing.entitlement.glue.EngineModuleMemoryMock;
+import com.ning.billing.entitlement.glue.MockEngineModuleMemory;
 
 public class TestUserApiCreateMemory extends TestUserApiCreate {
 
 
     @Override
     protected Injector getInjector() {
-        return Guice.createInjector(Stage.PRODUCTION, new EngineModuleMemoryMock(), new CatalogModuleMock());
+        return Guice.createInjector(Stage.PRODUCTION, new MockEngineModuleMemory());
     }
 
     @Test(enabled=true, groups={"fast"})
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreateSql.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreateSql.java
index 77ee57d..deaa6bd 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreateSql.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiCreateSql.java
@@ -21,14 +21,13 @@ import org.testng.annotations.Test;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.Stage;
-import com.ning.billing.entitlement.glue.CatalogModuleMock;
-import com.ning.billing.entitlement.glue.EngineModuleSqlMock;
+import com.ning.billing.entitlement.glue.MockEngineModuleSql;
 
 public class TestUserApiCreateSql extends TestUserApiCreate {
 
     @Override
     protected Injector getInjector() {
-        return Guice.createInjector(Stage.DEVELOPMENT, new EngineModuleSqlMock(), new CatalogModuleMock());
+        return Guice.createInjector(Stage.DEVELOPMENT, new MockEngineModuleSql());
     }
 
     @Test(enabled=true, groups={"sql"})
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiDemos.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiDemos.java
index 90e7cde..cfa72cf 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiDemos.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiDemos.java
@@ -40,14 +40,14 @@ import com.ning.billing.catalog.api.IPlanPhase;
 import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.entitlement.api.ApiTestListener.NextEvent;
-import com.ning.billing.entitlement.glue.EngineModuleSqlMock;
-import com.ning.billing.util.clock.Clock;
+import com.ning.billing.entitlement.glue.MockEngineModuleSql;
+import com.ning.billing.util.clock.DefaultClock;
 
 public class TestUserApiDemos extends TestUserApiBase {
 
     @Override
     protected Injector getInjector() {
-        return Guice.createInjector(Stage.DEVELOPMENT, new EngineModuleSqlMock());
+        return Guice.createInjector(Stage.DEVELOPMENT, new MockEngineModuleSql());
     }
 
     /**
@@ -72,7 +72,7 @@ public class TestUserApiDemos extends TestUserApiBase {
             System.out.println("DEMO 1 START");
 
             /* STEP 1. CREATE SUBSCRIPTION */
-            Subscription subscription = createSubscription("Assault-Rifle", BillingPeriod.MONTHLY, "gunclubDiscount");
+            SubscriptionData subscription = createSubscription("Assault-Rifle", BillingPeriod.MONTHLY, "gunclubDiscount");
             IPlanPhase trialPhase = subscription.getCurrentPhase();
             assertEquals(trialPhase.getPhaseType(), PhaseType.TRIAL);
 
@@ -95,12 +95,12 @@ public class TestUserApiDemos extends TestUserApiBase {
             /* STEP 4. SET CTD AND CHANGE PLAN EOT */
             List<IDuration> durationList = new ArrayList<IDuration>();
             durationList.add(trialPhase.getDuration());
-            DateTime startDiscountPhase = Clock.addDuration(subscription.getStartDate(), durationList);
+            DateTime startDiscountPhase = DefaultClock.addDuration(subscription.getStartDate(), durationList);
 
             IDuration ctd = getDurationMonth(1);
-            DateTime newChargedThroughDate = Clock.addDuration(startDiscountPhase, ctd);
+            DateTime newChargedThroughDate = DefaultClock.addDuration(startDiscountPhase, ctd);
             billingApi.setChargedThroughDate(subscription.getId(), newChargedThroughDate);
-            subscription = (Subscription) entitlementApi.getSubscriptionFromId(subscription.getId());
+            subscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(subscription.getId());
 
             testListener.pushExpectedEvent(NextEvent.CHANGE);
             subscription.changePlan("Shotgun", BillingPeriod.ANNUAL, "gunclubDiscount", clock.getUTCNow());
@@ -138,7 +138,7 @@ public class TestUserApiDemos extends TestUserApiBase {
             testListener.pushExpectedEvent(NextEvent.PHASE);
             clock.addDeltaFromReality(currentPhase.getDuration());
             assertTrue(testListener.isCompleted(3000));
-            subscription = (Subscription) entitlementApi.getSubscriptionFromId(subscription.getId());
+            subscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(subscription.getId());
 
             currentPlan = subscription.getCurrentPlan();
             assertNotNull(currentPlan);
@@ -170,7 +170,7 @@ public class TestUserApiDemos extends TestUserApiBase {
         System.out.println("");
         System.out.println("******\t STEP " + stepMsg + " **************");
 
-        Subscription subscription = (Subscription) entitlementApi.getSubscriptionFromId(subscriptionId);
+        SubscriptionData subscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(subscriptionId);
 
 
         IPlan currentPlan = subscription.getCurrentPlan();
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiError.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiError.java
index 3d8b84f..3d06c83 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiError.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiError.java
@@ -35,8 +35,8 @@ import com.ning.billing.catalog.api.IDuration;
 import com.ning.billing.catalog.api.IPlanPhase;
 import com.ning.billing.catalog.api.IPriceListSet;
 import com.ning.billing.entitlement.api.ApiTestListener.NextEvent;
-import com.ning.billing.entitlement.glue.EngineModuleMemoryMock;
-import com.ning.billing.util.clock.Clock;
+import com.ning.billing.entitlement.glue.MockEngineModuleMemory;
+import com.ning.billing.util.clock.DefaultClock;
 
 public class TestUserApiError extends TestUserApiBase {
 
@@ -53,7 +53,7 @@ public class TestUserApiError extends TestUserApiBase {
 
     @Override
     protected Injector getInjector() {
-        return Guice.createInjector(Stage.DEVELOPMENT, new EngineModuleMemoryMock());
+        return Guice.createInjector(Stage.DEVELOPMENT, new MockEngineModuleMemory());
     }
 
     @Test(enabled=true)
@@ -109,7 +109,7 @@ public class TestUserApiError extends TestUserApiBase {
     @Test(enabled=true)
     public void testChangeSubscriptionNonActive() {
         try {
-            ISubscription subscription = createSubscription("Shotgun", BillingPeriod.ANNUAL, IPriceListSet.DEFAULT_PRICELIST_NAME);
+            Subscription subscription = createSubscription("Shotgun", BillingPeriod.ANNUAL, IPriceListSet.DEFAULT_PRICELIST_NAME);
 
             testListener.pushExpectedEvent(NextEvent.CANCEL);
             subscription.cancel(clock.getUTCNow(), false);
@@ -133,13 +133,13 @@ public class TestUserApiError extends TestUserApiBase {
     @Test(enabled=true)
     public void testChangeSubscriptionFutureCancelled() {
         try {
-            ISubscription subscription = createSubscription("Shotgun", BillingPeriod.MONTHLY, IPriceListSet.DEFAULT_PRICELIST_NAME);
+            Subscription subscription = createSubscription("Shotgun", BillingPeriod.MONTHLY, IPriceListSet.DEFAULT_PRICELIST_NAME);
 
             // SET CTD TO CANCEL IN FUTURE
             IPlanPhase trialPhase = subscription.getCurrentPhase();
-            DateTime expectedPhaseTrialChange = Clock.addDuration(subscription.getStartDate(), trialPhase.getDuration());
+            DateTime expectedPhaseTrialChange = DefaultClock.addDuration(subscription.getStartDate(), trialPhase.getDuration());
             IDuration ctd = getDurationMonth(1);
-            DateTime newChargedThroughDate = Clock.addDuration(expectedPhaseTrialChange, ctd);
+            DateTime newChargedThroughDate = DefaultClock.addDuration(expectedPhaseTrialChange, ctd);
             billingApi.setChargedThroughDate(subscription.getId(), newChargedThroughDate);
             subscription = entitlementApi.getSubscriptionFromId(subscription.getId());
 
@@ -168,7 +168,7 @@ public class TestUserApiError extends TestUserApiBase {
     @Test(enabled=true)
     public void testUncancelBadState() {
         try {
-            ISubscription subscription = createSubscription("Shotgun", BillingPeriod.MONTHLY, IPriceListSet.DEFAULT_PRICELIST_NAME);
+            Subscription subscription = createSubscription("Shotgun", BillingPeriod.MONTHLY, IPriceListSet.DEFAULT_PRICELIST_NAME);
 
             try {
                 subscription.uncancel();
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiScenarios.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiScenarios.java
index 78e7cb3..c991f7d 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiScenarios.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiScenarios.java
@@ -32,14 +32,14 @@ import com.ning.billing.catalog.api.IDuration;
 import com.ning.billing.catalog.api.IPlanPhase;
 import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.entitlement.api.ApiTestListener.NextEvent;
-import com.ning.billing.entitlement.glue.EngineModuleSqlMock;
-import com.ning.billing.util.clock.Clock;
+import com.ning.billing.entitlement.glue.MockEngineModuleSql;
+import com.ning.billing.util.clock.DefaultClock;
 
 public class TestUserApiScenarios extends TestUserApiBase {
 
     @Override
     protected Injector getInjector() {
-        return Guice.createInjector(Stage.DEVELOPMENT, new EngineModuleSqlMock());
+        return Guice.createInjector(Stage.DEVELOPMENT, new MockEngineModuleSql());
     }
 
     @Test(enabled=true)
@@ -48,7 +48,7 @@ public class TestUserApiScenarios extends TestUserApiBase {
         log.info("Starting testChangeIMMCancelUncancelChangeEOT");
 
         try {
-            Subscription subscription = createSubscription("Assault-Rifle", BillingPeriod.MONTHLY, "gunclubDiscount");
+            SubscriptionData subscription = createSubscription("Assault-Rifle", BillingPeriod.MONTHLY, "gunclubDiscount");
             IPlanPhase trialPhase = subscription.getCurrentPhase();
             assertEquals(trialPhase.getPhaseType(), PhaseType.TRIAL);
 
@@ -63,10 +63,10 @@ public class TestUserApiScenarios extends TestUserApiBase {
 
             // SET CTD
             IDuration ctd = getDurationMonth(1);
-            DateTime expectedPhaseTrialChange = Clock.addDuration(subscription.getStartDate(), trialPhase.getDuration());
-            DateTime newChargedThroughDate = Clock.addDuration(expectedPhaseTrialChange, ctd);
+            DateTime expectedPhaseTrialChange = DefaultClock.addDuration(subscription.getStartDate(), trialPhase.getDuration());
+            DateTime newChargedThroughDate = DefaultClock.addDuration(expectedPhaseTrialChange, ctd);
             billingApi.setChargedThroughDate(subscription.getId(), newChargedThroughDate);
-            subscription = (Subscription) entitlementApi.getSubscriptionFromId(subscription.getId());
+            subscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(subscription.getId());
 
             // CANCEL EOT
             testListener.pushExpectedEvent(NextEvent.CANCEL);
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java
index 730c22b..2dc32ce 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java
@@ -19,7 +19,7 @@ package com.ning.billing.invoice.model;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.entitlement.api.billing.BillingMode;
-import com.ning.billing.entitlement.api.billing.IBillingEvent;
+import com.ning.billing.entitlement.api.billing.BillingEvent;
 import com.ning.billing.invoice.api.BillingEventSet;
 import org.joda.time.DateTime;
 
@@ -91,8 +91,8 @@ public class DefaultInvoiceGenerator implements IInvoiceGenerator {
         // for each event, process it either as a terminated event (if there's a subsequent event)
         // ...or as a non-terminated event (if no subsequent event exists)
         for (int i = 0; i < (events.size() - 1); i++) {
-            IBillingEvent thisEvent = events.get(i);
-            IBillingEvent nextEvent = events.get(i + 1);
+            BillingEvent thisEvent = events.get(i);
+            BillingEvent nextEvent = events.get(i + 1);
 
             if (thisEvent.getSubscriptionId() == nextEvent.getSubscriptionId()) {
                 processEvents(invoiceId, thisEvent, nextEvent, items, targetDate, targetCurrency);
@@ -109,7 +109,7 @@ public class DefaultInvoiceGenerator implements IInvoiceGenerator {
         return items;
     }
 
-    private void processEvent(UUID invoiceId, IBillingEvent event, List<InvoiceItem> items, DateTime targetDate, Currency targetCurrency) {
+    private void processEvent(UUID invoiceId, BillingEvent event, List<InvoiceItem> items, DateTime targetDate, Currency targetCurrency) {
         BigDecimal rate = event.getPrice(targetCurrency);
         BigDecimal invoiceItemAmount = calculateInvoiceItemAmount(event, targetDate, rate);
         IBillingMode billingMode = getBillingMode(event.getBillingMode());
@@ -118,7 +118,7 @@ public class DefaultInvoiceGenerator implements IInvoiceGenerator {
         addInvoiceItem(invoiceId, items, event, billThroughDate, invoiceItemAmount, rate, targetCurrency);
     }
 
-    private void processEvents(UUID invoiceId, IBillingEvent firstEvent, IBillingEvent secondEvent, List<InvoiceItem> items, DateTime targetDate, Currency targetCurrency) {
+    private void processEvents(UUID invoiceId, BillingEvent firstEvent, BillingEvent secondEvent, List<InvoiceItem> items, DateTime targetDate, Currency targetCurrency) {
         BigDecimal rate = firstEvent.getPrice(targetCurrency);
         BigDecimal invoiceItemAmount = calculateInvoiceItemAmount(firstEvent, secondEvent, targetDate, rate);
         IBillingMode billingMode = getBillingMode(firstEvent.getBillingMode());
@@ -127,14 +127,14 @@ public class DefaultInvoiceGenerator implements IInvoiceGenerator {
         addInvoiceItem(invoiceId, items, firstEvent, billThroughDate, invoiceItemAmount, rate, targetCurrency);
     }
 
-    private void addInvoiceItem(UUID invoiceId, List<InvoiceItem> items, IBillingEvent event, DateTime billThroughDate, BigDecimal amount, BigDecimal rate, Currency currency) {
+    private void addInvoiceItem(UUID invoiceId, List<InvoiceItem> items, BillingEvent event, DateTime billThroughDate, BigDecimal amount, BigDecimal rate, Currency currency) {
         if (!(amount.compareTo(BigDecimal.ZERO) == 0)) {
             InvoiceItem item = new InvoiceItem(invoiceId, event.getSubscriptionId(), event.getEffectiveDate(), billThroughDate, event.getDescription(), amount, rate, currency);
             items.add(item);
         }
     }
 
-    private BigDecimal calculateInvoiceItemAmount(IBillingEvent event, DateTime targetDate, BigDecimal rate){
+    private BigDecimal calculateInvoiceItemAmount(BillingEvent event, DateTime targetDate, BigDecimal rate){
         IBillingMode billingMode = getBillingMode(event.getBillingMode());
         DateTime startDate = event.getEffectiveDate();
         int billingCycleDay = event.getBillCycleDay();
@@ -150,7 +150,7 @@ public class DefaultInvoiceGenerator implements IInvoiceGenerator {
         }
     }
 
-    private BigDecimal calculateInvoiceItemAmount(IBillingEvent firstEvent, IBillingEvent secondEvent, DateTime targetDate, BigDecimal rate) {
+    private BigDecimal calculateInvoiceItemAmount(BillingEvent firstEvent, BillingEvent secondEvent, DateTime targetDate, BigDecimal rate) {
         IBillingMode billingMode = getBillingMode(firstEvent.getBillingMode());
         DateTime startDate = firstEvent.getEffectiveDate();
         int billingCycleDay = firstEvent.getBillCycleDay();
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
index 01a533c..45f6e74 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
@@ -19,8 +19,8 @@ package com.ning.billing.invoice.tests;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.entitlement.api.billing.BillingMode;
-import com.ning.billing.entitlement.api.billing.IBillingEvent;
-import com.ning.billing.invoice.api.BillingEvent;
+import com.ning.billing.entitlement.api.billing.BillingEvent;
+import com.ning.billing.invoice.api.DefaultBillingEvent;
 import com.ning.billing.invoice.api.BillingEventSet;
 import com.ning.billing.invoice.model.*;
 import org.joda.time.DateTime;
@@ -67,7 +67,7 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
         DateTime startDate = buildDateTime(2011, 9, 1);
         String planName = "World Domination";
         String phaseName = "Build Space Laser";
-        IBillingEvent event = new BillingEvent(subscriptionId, startDate, planName, phaseName,
+        BillingEvent event = new DefaultBillingEvent(subscriptionId, startDate, planName, phaseName,
                                                new InternationalPriceMock(TEN), BillingPeriod.MONTHLY,
                                                1, BillingMode.IN_ADVANCE);
 
@@ -93,7 +93,7 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
         String planName = "World Domination";
         String phaseName = "Build Space Laser";
         BigDecimal rate = TEN;
-        IBillingEvent event = new BillingEvent(subscriptionId, startDate, planName, phaseName,
+        BillingEvent event = new DefaultBillingEvent(subscriptionId, startDate, planName, phaseName,
                                                new InternationalPriceMock(rate), BillingPeriod.MONTHLY,
                                                15, BillingMode.IN_ADVANCE);
 
@@ -118,13 +118,13 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
     public void testTwoMonthlySubscriptionsWithAlignedBillingDates() {
         BillingEventSet events = new BillingEventSet();
 
-        IBillingEvent event1 = new BillingEvent(UUID.randomUUID(), buildDateTime(2011, 9, 1),
+        BillingEvent event1 = new DefaultBillingEvent(UUID.randomUUID(), buildDateTime(2011, 9, 1),
                                                "World Domination", "Build Space Laser",
                                                new InternationalPriceMock(FIVE), BillingPeriod.MONTHLY,
                                                1, BillingMode.IN_ADVANCE);
         events.add(event1);
 
-        IBillingEvent event2 = new BillingEvent(UUID.randomUUID(), buildDateTime(2011, 10, 1),
+        BillingEvent event2 = new DefaultBillingEvent(UUID.randomUUID(), buildDateTime(2011, 10, 1),
                                                "Groceries", "Pick Up Milk",
                                                new InternationalPriceMock(TEN), BillingPeriod.MONTHLY,
                                                1, BillingMode.IN_ADVANCE);
@@ -145,13 +145,13 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
         BillingEventSet events = new BillingEventSet();
 
         UUID subscriptionId = UUID.randomUUID();
-        IBillingEvent event1 = new BillingEvent(subscriptionId, buildDateTime(2011, 9, 1),
+        BillingEvent event1 = new DefaultBillingEvent(subscriptionId, buildDateTime(2011, 9, 1),
                                                "World Domination", "Build Space Laser",
                                                new InternationalPriceMock(FIVE), BillingPeriod.MONTHLY,
                                                1, BillingMode.IN_ADVANCE);
         events.add(event1);
 
-        IBillingEvent event2 = new BillingEvent(subscriptionId, buildDateTime(2011, 10, 15),
+        BillingEvent event2 = new DefaultBillingEvent(subscriptionId, buildDateTime(2011, 10, 15),
                                                "World Domination", "Incinerate James Bond",
                                                new InternationalPriceMock(TEN), BillingPeriod.MONTHLY,
                                                15, BillingMode.IN_ADVANCE);
@@ -183,19 +183,19 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
         BillingEventSet events = new BillingEventSet();
 
         UUID subscriptionId = UUID.randomUUID();
-        IBillingEvent event1 = new BillingEvent(subscriptionId, buildDateTime(2011, 9, 1),
+        BillingEvent event1 = new DefaultBillingEvent(subscriptionId, buildDateTime(2011, 9, 1),
                                                "World Domination", "Build Space Laser",
                                                new InternationalPriceMock(FIVE), BillingPeriod.MONTHLY,
                                                1, BillingMode.IN_ADVANCE);
         events.add(event1);
 
-        IBillingEvent event2 = new BillingEvent(subscriptionId, buildDateTime(2011, 10, 1),
+        BillingEvent event2 = new DefaultBillingEvent(subscriptionId, buildDateTime(2011, 10, 1),
                                                "World Domination", "Incinerate James Bond",
                                                new InternationalPriceMock(TEN), BillingPeriod.MONTHLY,
                                                1, BillingMode.IN_ADVANCE);
         events.add(event2);
 
-        IBillingEvent event3 = new BillingEvent(subscriptionId, buildDateTime(2011, 11, 1),
+        BillingEvent event3 = new DefaultBillingEvent(subscriptionId, buildDateTime(2011, 11, 1),
                                                "World Domination", "Cackle Gleefully",
                                                new InternationalPriceMock(THIRTY), BillingPeriod.MONTHLY,
                                                1, BillingMode.IN_ADVANCE);
@@ -219,7 +219,7 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
         DateTime startDate = buildDateTime(2011, 9, 1);
 
         BigDecimal rate = FIVE;
-        IBillingEvent event1 = new BillingEvent(subscriptionId, startDate,
+        BillingEvent event1 = new DefaultBillingEvent(subscriptionId, startDate,
                                                "World Domination", "Build Space Laser",
                                                new InternationalPriceMock(rate), BillingPeriod.MONTHLY,
                                                1, BillingMode.IN_ADVANCE);
@@ -391,17 +391,17 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
         testInvoiceGeneration(events, invoiceItems, buildDateTime(2011, 10, 10), 1, expectedAmount);
     }
 
-    private BillingEvent createBillingEvent(UUID subscriptionId, DateTime startDate, String planName, String planPhaseName,
+    private DefaultBillingEvent createBillingEvent(UUID subscriptionId, DateTime startDate, String planName, String planPhaseName,
                                             BigDecimal rate, int billCycleDay) {
-        return new BillingEvent(subscriptionId, startDate, planName, planPhaseName,
+        return new DefaultBillingEvent(subscriptionId, startDate, planName, planPhaseName,
                                 new InternationalPriceMock(rate), BillingPeriod.MONTHLY,
                                 billCycleDay, BillingMode.IN_ADVANCE);
 
     }
 
-    private BillingEvent createAnnualBillingEvent(UUID subscriptionId, DateTime startDate, String planName, String planPhaseName,
+    private DefaultBillingEvent createAnnualBillingEvent(UUID subscriptionId, DateTime startDate, String planName, String planPhaseName,
                                                   BigDecimal rate, int billCycleDay) {
-        return new BillingEvent(subscriptionId, startDate, planName, planPhaseName,
+        return new DefaultBillingEvent(subscriptionId, startDate, planName, planPhaseName,
                                 new InternationalPriceMock(rate), BillingPeriod.ANNUAL,
                                 billCycleDay, BillingMode.IN_ADVANCE);
 
diff --git a/util/src/main/java/com/ning/billing/util/clock/Clock.java b/util/src/main/java/com/ning/billing/util/clock/Clock.java
index a60b393..b41a36d 100644
--- a/util/src/main/java/com/ning/billing/util/clock/Clock.java
+++ b/util/src/main/java/com/ning/billing/util/clock/Clock.java
@@ -16,59 +16,15 @@
 
 package com.ning.billing.util.clock;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 
-import com.ning.billing.catalog.api.IDuration;
-
-public class Clock implements IClock {
-
-    @Override
-    public DateTime getNow(DateTimeZone tz) {
-       DateTime result = new DateTime(tz);
-       return truncateMs(result);
-    }
-
-    @Override
-    public DateTime getUTCNow() {
-        return getNow(DateTimeZone.UTC);
-    }
-
-
-    public static DateTime truncateMs(DateTime input) {
-        return input.minus(input.getMillisOfSecond());
-    }
-
-    public static DateTime addDuration(DateTime input, List<IDuration> durations) {
+public interface Clock {
 
-        DateTime result = input;
-        for (IDuration cur : durations) {
-            switch (cur.getUnit()) {
-            case DAYS:
-                result = result.plusDays(cur.getNumber());
-                break;
+    public DateTime getNow(DateTimeZone tz);
 
-            case MONTHS:
-                result = result.plusMonths(cur.getNumber());
-                break;
+    public DateTime getUTCNow();
 
-            case YEARS:
-                result = result.plusYears(cur.getNumber());
-                break;
-            case UNLIMITED:
-            default:
-                throw new RuntimeException("Trying to move to unlimited time period");
-            }
-        }
-        return result;
-    }
 
-    public static DateTime addDuration(DateTime input, IDuration duration) {
-        List<IDuration> list = new ArrayList<IDuration>();
-        list.add(duration);
-        return addDuration(input, list);
-    }
+    //public DateTime addDuration(DateTime input, IDuration duration);
 }
diff --git a/util/src/main/java/com/ning/billing/util/clock/DefaultClock.java b/util/src/main/java/com/ning/billing/util/clock/DefaultClock.java
new file mode 100644
index 0000000..1397d41
--- /dev/null
+++ b/util/src/main/java/com/ning/billing/util/clock/DefaultClock.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2010-2011 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.clock;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+
+import com.ning.billing.catalog.api.IDuration;
+
+public class DefaultClock implements Clock {
+
+    @Override
+    public DateTime getNow(DateTimeZone tz) {
+       DateTime result = new DateTime(tz);
+       return truncateMs(result);
+    }
+
+    @Override
+    public DateTime getUTCNow() {
+        return getNow(DateTimeZone.UTC);
+    }
+
+
+    public static DateTime truncateMs(DateTime input) {
+        return input.minus(input.getMillisOfSecond());
+    }
+
+    public static DateTime addDuration(DateTime input, List<IDuration> durations) {
+
+        DateTime result = input;
+        for (IDuration cur : durations) {
+            switch (cur.getUnit()) {
+            case DAYS:
+                result = result.plusDays(cur.getNumber());
+                break;
+
+            case MONTHS:
+                result = result.plusMonths(cur.getNumber());
+                break;
+
+            case YEARS:
+                result = result.plusYears(cur.getNumber());
+                break;
+            case UNLIMITED:
+            default:
+                throw new RuntimeException("Trying to move to unlimited time period");
+            }
+        }
+        return result;
+    }
+
+    public static DateTime addDuration(DateTime input, IDuration duration) {
+        List<IDuration> list = new ArrayList<IDuration>();
+        list.add(duration);
+        return addDuration(input, list);
+    }
+}
diff --git a/util/src/main/java/com/ning/billing/util/eventbus/MemoryEventBus.java b/util/src/main/java/com/ning/billing/util/eventbus/MemoryEventBus.java
index 7cc0453..d7f876d 100644
--- a/util/src/main/java/com/ning/billing/util/eventbus/MemoryEventBus.java
+++ b/util/src/main/java/com/ning/billing/util/eventbus/MemoryEventBus.java
@@ -27,7 +27,7 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.eventbus.AsyncEventBus;
 
-public class MemoryEventBus implements IEventBus {
+public class MemoryEventBus implements EventBus {
 
     // STEPH config ?
     private final static int MAX_EVENT_THREADS = 1;
@@ -93,13 +93,13 @@ public class MemoryEventBus implements IEventBus {
     }
 
     @Override
-    public void post(IEventBusType event) throws EventBusException {
+    public void post(EventBusNotification event) throws EventBusException {
         checkInitialized("post");
         delegate.post(event);
     }
 
     @Override
-    public void postFromTransaction(IEventBusType event, Transmogrifier dao) throws EventBusException {
+    public void postFromTransaction(EventBusNotification event, Transmogrifier dao) throws EventBusException {
         checkInitialized("postFromTransaction");
         delegate.post(event);
     }
diff --git a/util/src/main/java/com/ning/billing/util/glue/EventBusModule.java b/util/src/main/java/com/ning/billing/util/glue/EventBusModule.java
index e6e995a..078c331 100644
--- a/util/src/main/java/com/ning/billing/util/glue/EventBusModule.java
+++ b/util/src/main/java/com/ning/billing/util/glue/EventBusModule.java
@@ -17,17 +17,17 @@
 package com.ning.billing.util.glue;
 
 import com.google.inject.AbstractModule;
+import com.ning.billing.util.eventbus.DefaultEventBusService;
+import com.ning.billing.util.eventbus.EventBus;
 import com.ning.billing.util.eventbus.EventBusService;
-import com.ning.billing.util.eventbus.IEventBus;
-import com.ning.billing.util.eventbus.IEventBusService;
 import com.ning.billing.util.eventbus.MemoryEventBus;
 
 public class EventBusModule extends AbstractModule {
 
     @Override
     protected void configure() {
-        bind(IEventBusService.class).to(EventBusService.class);
-        bind(IEventBus.class).to(MemoryEventBus.class).asEagerSingleton();
+        bind(EventBusService.class).to(DefaultEventBusService.class);
+        bind(EventBus.class).to(MemoryEventBus.class).asEagerSingleton();
 
     }
 
diff --git a/util/src/test/java/com/ning/billing/util/clock/ClockMock.java b/util/src/test/java/com/ning/billing/util/clock/ClockMock.java
index eb7216e..c6ee715 100644
--- a/util/src/test/java/com/ning/billing/util/clock/ClockMock.java
+++ b/util/src/test/java/com/ning/billing/util/clock/ClockMock.java
@@ -25,7 +25,7 @@ import org.joda.time.DateTimeZone;
 import com.ning.billing.catalog.api.IDuration;
 
 // STEPH should really be in tests but not accessible from other sub modules
-public class ClockMock extends Clock {
+public class ClockMock extends DefaultClock {
 
     private enum DeltaType {
         DELTA_NONE,
diff --git a/util/src/test/java/com/ning/billing/util/eventbus/TestEventBus.java b/util/src/test/java/com/ning/billing/util/eventbus/TestEventBus.java
index e4e41df..1a24e41 100644
--- a/util/src/test/java/com/ning/billing/util/eventbus/TestEventBus.java
+++ b/util/src/test/java/com/ning/billing/util/eventbus/TestEventBus.java
@@ -29,7 +29,7 @@ public class TestEventBus {
 
     private static final Logger log = LoggerFactory.getLogger(TestEventBus.class);
 
-    private IEventBus eventBus;
+    private EventBus eventBus;
 
 
     @BeforeClass
@@ -43,7 +43,7 @@ public class TestEventBus {
         eventBus.stop();
     }
 
-    public static final class MyEvent implements IEventBusType {
+    public static final class MyEvent implements EventBusNotification {
         String name;
         Long value;