killbill-aplcache

Blurp entitlement 1

11/9/2012 11:05:53 PM

Changes

Details

diff --git a/analytics/src/main/java/com/ning/billing/analytics/api/user/DefaultAnalyticsUserApi.java b/analytics/src/main/java/com/ning/billing/analytics/api/user/DefaultAnalyticsUserApi.java
index 8449b6f..b954117 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/api/user/DefaultAnalyticsUserApi.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/api/user/DefaultAnalyticsUserApi.java
@@ -135,8 +135,8 @@ public class DefaultAnalyticsUserApi implements AnalyticsUserApi {
         final Collection<BusinessSubscriptionTransition> businessSubscriptionTransitions = new ArrayList<BusinessSubscriptionTransition>();
         final Collection<BusinessOverdueStatus> businessOverdueStatuses = new ArrayList<BusinessOverdueStatus>();
         for (final SubscriptionBundle bundle : bundles) {
-            businessSubscriptionTransitions.addAll(getTransitionsForBundle(bundle.getKey(), context));
-            businessOverdueStatuses.addAll(getOverdueStatusesForBundle(bundle.getKey(), context));
+            businessSubscriptionTransitions.addAll(getTransitionsForBundle(bundle.getExternalKey(), context));
+            businessOverdueStatuses.addAll(getOverdueStatusesForBundle(bundle.getExternalKey(), context));
         }
 
         // Find all invoices for that account
diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessInvoiceDao.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessInvoiceDao.java
index 2f09a66..b04a9d1 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessInvoiceDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessInvoiceDao.java
@@ -186,7 +186,7 @@ public class BusinessInvoiceDao {
         if (invoiceItem.getBundleId() != null) {
             try {
                 final SubscriptionBundle bundle = entitlementApi.getBundleFromId(invoiceItem.getBundleId(), context);
-                externalKey = bundle.getKey();
+                externalKey = bundle.getExternalKey();
             } catch (EntitlementUserApiException e) {
                 log.warn("Ignoring subscription fields for invoice item {} for bundle {} (bundle does not exist)",
                          invoiceItem.getId().toString(),
diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessOverdueStatusDao.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessOverdueStatusDao.java
index b0b30fd..82f0459 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessOverdueStatusDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessOverdueStatusDao.java
@@ -89,7 +89,7 @@ public class BusinessOverdueStatusDao {
         }
 
         final String accountKey = account.getExternalKey();
-        final String externalKey = bundle.getKey();
+        final String externalKey = bundle.getExternalKey();
 
         overdueStatusSqlDao.inTransaction(new Transaction<Void, BusinessOverdueStatusSqlDao>() {
             @Override
diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionDao.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionDao.java
index c8ebb65..0ae3076 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionDao.java
@@ -110,7 +110,7 @@ public class BusinessSubscriptionTransitionDao {
                         final BusinessSubscriptionTransitionModelDao transition = new BusinessSubscriptionTransitionModelDao(
                                 event.getTotalOrdering(),
                                 bundleId,
-                                bundle.getKey(),
+                                bundle.getExternalKey(),
                                 bundle.getAccountId(),
                                 account.getExternalKey(),
                                 subscription.getId(),
@@ -130,7 +130,7 @@ public class BusinessSubscriptionTransitionDao {
                             final BusinessSubscriptionTransitionModelDao systemCancelTransition = new BusinessSubscriptionTransitionModelDao(
                                     event.getTotalOrdering(),
                                     bundleId,
-                                    bundle.getKey(),
+                                    bundle.getExternalKey(),
                                     bundle.getAccountId(),
                                     account.getExternalKey(),
                                     subscription.getId(),
diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessTagDao.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessTagDao.java
index dd83f5b..78fe387 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessTagDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessTagDao.java
@@ -128,7 +128,7 @@ public class BusinessTagDao {
          * Note: we store tags associated to bundles, not to subscriptions.
          */
         final String accountKey = account.getExternalKey();
-        final String externalKey = bundle.getKey();
+        final String externalKey = bundle.getExternalKey();
         subscriptionTransitionTagSqlDao.addTag(accountKey, bundleId.toString(), externalKey, name, context);
     }
 
diff --git a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
index 265631d..7a243cc 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
@@ -177,7 +177,7 @@ public class TestAnalyticsService extends AnalyticsTestSuiteWithEmbeddedDB {
 
         // Verify we correctly initialized the account subsystem
         Assert.assertNotNull(bundle);
-        Assert.assertEquals(bundle.getKey(), BUNDLE_EXTERNAL_KEY);
+        Assert.assertEquals(bundle.getExternalKey(), BUNDLE_EXTERNAL_KEY);
 
         // Create a subscription transition event
         final UUID subscriptionId = UUID.randomUUID();
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java
index 05e27ec..73b2443 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java
@@ -60,7 +60,7 @@ public class TestBusinessSubscriptionTransitionRecorder extends AnalyticsTestSui
         final SubscriptionBundle bundle = Mockito.mock(SubscriptionBundle.class);
         Mockito.when(bundle.getId()).thenReturn(bundleId);
         Mockito.when(bundle.getAccountId()).thenReturn(accountId);
-        Mockito.when(bundle.getKey()).thenReturn(externalKey.toString());
+        Mockito.when(bundle.getExternalKey()).thenReturn(externalKey.toString());
         final EntitlementInternalApi entitlementApi = Mockito.mock(EntitlementInternalApi.class);
         Mockito.when(entitlementApi.getBundleFromId(Mockito.<UUID>any(), Mockito.<InternalTenantContext>any())).thenReturn(bundle);
 
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionBundle.java b/api/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionBundle.java
index 479dbf5..2e4504d 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionBundle.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionBundle.java
@@ -25,7 +25,7 @@ import com.ning.billing.util.entity.Entity;
 public interface SubscriptionBundle extends Blockable, Entity {
     public UUID getAccountId();
 
-    public String getKey();
+    public String getExternalKey();
 
     public OverdueState<SubscriptionBundle> getOverdueState();
 }
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestAnalytics.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestAnalytics.java
index 328ab3f..195c12c 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestAnalytics.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestAnalytics.java
@@ -228,7 +228,7 @@ public class TestAnalytics extends TestIntegrationBase {
         Assert.assertNull(analyticsUserApi.getAccountByKey(account.getExternalKey(), callContext).getLastPaymentStatus());
 
         // Verify the initial overdue status
-        Assert.assertEquals(analyticsUserApi.getOverdueStatusesForBundle(bundle.getKey(), callContext).size(), 0);
+        Assert.assertEquals(analyticsUserApi.getOverdueStatusesForBundle(bundle.getExternalKey(), callContext).size(), 0);
 
         // Move after trial
         busHandler.pushExpectedEvents(TestApiListener.NextEvent.PHASE, TestApiListener.NextEvent.INVOICE, TestApiListener.NextEvent.PAYMENT_ERROR);
@@ -260,7 +260,7 @@ public class TestAnalytics extends TestIntegrationBase {
                             invoicePaymentsForAccount.get(0).getAmount());
 
         // Verify overdue status - we should still be in clear state
-        Assert.assertEquals(analyticsUserApi.getOverdueStatusesForBundle(bundle.getKey(), callContext).size(), 0);
+        Assert.assertEquals(analyticsUserApi.getOverdueStatusesForBundle(bundle.getExternalKey(), callContext).size(), 0);
 
         clock.addDays(15); // DAY 45 - 15 days after invoice
         assertTrue(busHandler.isCompleted(DELAY));
@@ -269,7 +269,7 @@ public class TestAnalytics extends TestIntegrationBase {
         verifyBSTWithTrialAndEvergreenPhases(account, bundle, subscription);
 
         // Verify overdue status - we should still be in clear state
-        Assert.assertEquals(analyticsUserApi.getOverdueStatusesForBundle(bundle.getKey(), callContext).size(), 0);
+        Assert.assertEquals(analyticsUserApi.getOverdueStatusesForBundle(bundle.getExternalKey(), callContext).size(), 0);
 
         busHandler.pushExpectedEvents(TestApiListener.NextEvent.INVOICE, TestApiListener.NextEvent.PAYMENT_ERROR);
         clock.addDays(20); // DAY 65 - 35 days after invoice
@@ -277,7 +277,7 @@ public class TestAnalytics extends TestIntegrationBase {
         waitALittle();
 
         // Verify overdue status - we should be in OD1
-        final List<BusinessOverdueStatus> od1Bundle = analyticsUserApi.getOverdueStatusesForBundle(bundle.getKey(), callContext);
+        final List<BusinessOverdueStatus> od1Bundle = analyticsUserApi.getOverdueStatusesForBundle(bundle.getExternalKey(), callContext);
         Assert.assertEquals(od1Bundle.size(), 1);
         Assert.assertEquals(od1Bundle.get(0).getStatus(), "OD1");
         Assert.assertEquals(od1Bundle.get(0).getId(), bundle.getId());
@@ -287,7 +287,7 @@ public class TestAnalytics extends TestIntegrationBase {
         assertTrue(busHandler.isCompleted(DELAY));
         waitALittle();
         // Verify overdue status - we should still be in OD1
-        final List<BusinessOverdueStatus> stillOd1Bundle = analyticsUserApi.getOverdueStatusesForBundle(bundle.getKey(), callContext);
+        final List<BusinessOverdueStatus> stillOd1Bundle = analyticsUserApi.getOverdueStatusesForBundle(bundle.getExternalKey(), callContext);
         Assert.assertEquals(stillOd1Bundle.size(), 1);
         Assert.assertEquals(stillOd1Bundle.get(0).getStatus(), "OD1");
         Assert.assertEquals(stillOd1Bundle.get(0).getId(), bundle.getId());
@@ -297,7 +297,7 @@ public class TestAnalytics extends TestIntegrationBase {
         assertTrue(busHandler.isCompleted(DELAY));
         waitALittle();
         // Verify overdue status - we should be in OD2
-        final List<BusinessOverdueStatus> od2Bundle = analyticsUserApi.getOverdueStatusesForBundle(bundle.getKey(), callContext);
+        final List<BusinessOverdueStatus> od2Bundle = analyticsUserApi.getOverdueStatusesForBundle(bundle.getExternalKey(), callContext);
         Assert.assertEquals(od2Bundle.size(), 2);
         Assert.assertEquals(od2Bundle.get(0).getStatus(), "OD1");
         Assert.assertEquals(od2Bundle.get(1).getStatus(), "OD2");
@@ -312,7 +312,7 @@ public class TestAnalytics extends TestIntegrationBase {
         assertTrue(busHandler.isCompleted(DELAY));
         waitALittle();
         // Verify overdue status - we should be in OD3
-        final List<BusinessOverdueStatus> od3Bundle = analyticsUserApi.getOverdueStatusesForBundle(bundle.getKey(), callContext);
+        final List<BusinessOverdueStatus> od3Bundle = analyticsUserApi.getOverdueStatusesForBundle(bundle.getExternalKey(), callContext);
         Assert.assertEquals(od3Bundle.size(), 3);
         Assert.assertEquals(od3Bundle.get(0).getStatus(), "OD1");
         Assert.assertEquals(od3Bundle.get(1).getStatus(), "OD2");
@@ -422,7 +422,7 @@ public class TestAnalytics extends TestIntegrationBase {
         waitALittle();
 
         // Verify BST is still empty since no subscription has been added yet
-        Assert.assertEquals(analyticsUserApi.getTransitionsForBundle(bundle.getKey(), callContext).size(), 0);
+        Assert.assertEquals(analyticsUserApi.getTransitionsForBundle(bundle.getExternalKey(), callContext).size(), 0);
 
         // The account should still not have any invoice
         Assert.assertEquals(analyticsUserApi.getInvoicesForAccount(account.getExternalKey(), callContext).size(), 0);
@@ -468,7 +468,7 @@ public class TestAnalytics extends TestIntegrationBase {
         Assert.assertEquals(invoiceItem.getBillingPeriod(), subscription.getCurrentPhase().getBillingPeriod().toString());
         Assert.assertEquals(invoiceItem.getCurrency(), account.getCurrency());
         Assert.assertEquals(invoiceItem.getEndDate(), invoiceItem.getStartDate().plusDays(30));
-        Assert.assertEquals(invoiceItem.getExternalKey(), bundle.getKey());
+        Assert.assertEquals(invoiceItem.getExternalKey(), bundle.getExternalKey());
         Assert.assertEquals(invoiceItem.getInvoiceId(), invoice.getInvoiceId());
         Assert.assertEquals(invoiceItem.getItemType(), "FIXED");
         Assert.assertEquals(invoiceItem.getPhase(), subscription.getCurrentPhase().getPhaseType().toString());
@@ -484,7 +484,7 @@ public class TestAnalytics extends TestIntegrationBase {
 
     private void verifyBSTWithTrialAndEvergreenPhases(final Account account, final SubscriptionBundle bundle, final Subscription subscription) throws CatalogApiException {
         // BST should have two transitions
-        final List<BusinessSubscriptionTransition> transitions = analyticsUserApi.getTransitionsForBundle(bundle.getKey(), callContext);
+        final List<BusinessSubscriptionTransition> transitions = analyticsUserApi.getTransitionsForBundle(bundle.getExternalKey(), callContext);
         Assert.assertEquals(transitions.size(), 2);
 
         verifyTrialAndEvergreenPhases(account, bundle, subscription);
@@ -492,7 +492,7 @@ public class TestAnalytics extends TestIntegrationBase {
 
     private void verifyBSTWithTrialAndEvergreenPhasesAndCancellation(final Account account, final SubscriptionBundle bundle, final Subscription subscription) throws CatalogApiException {
         // BST should have three transitions
-        final List<BusinessSubscriptionTransition> transitions = analyticsUserApi.getTransitionsForBundle(bundle.getKey(), callContext);
+        final List<BusinessSubscriptionTransition> transitions = analyticsUserApi.getTransitionsForBundle(bundle.getExternalKey(), callContext);
         Assert.assertEquals(transitions.size(), 3);
 
         verifyTrialAndEvergreenPhases(account, bundle, subscription);
@@ -501,7 +501,7 @@ public class TestAnalytics extends TestIntegrationBase {
 
     private void verifyBSTWithTrialAndEvergreenPhasesAndCancellationAndSystemCancellation(final Account account, final SubscriptionBundle bundle, final Subscription subscription) throws CatalogApiException {
         // BST should have four transitions
-        final List<BusinessSubscriptionTransition> transitions = analyticsUserApi.getTransitionsForBundle(bundle.getKey(), callContext);
+        final List<BusinessSubscriptionTransition> transitions = analyticsUserApi.getTransitionsForBundle(bundle.getExternalKey(), callContext);
         Assert.assertEquals(transitions.size(), 4);
 
         verifyTrialAndEvergreenPhases(account, bundle, subscription);
@@ -511,12 +511,12 @@ public class TestAnalytics extends TestIntegrationBase {
 
     private void verifyTrialAndEvergreenPhases(final Account account, final SubscriptionBundle bundle, final Subscription subscription) throws CatalogApiException {
         final Product currentProduct = subscriptionPlan.getProduct();
-        final List<BusinessSubscriptionTransition> transitions = analyticsUserApi.getTransitionsForBundle(bundle.getKey(), callContext);
+        final List<BusinessSubscriptionTransition> transitions = analyticsUserApi.getTransitionsForBundle(bundle.getExternalKey(), callContext);
 
         // Check the first transition (into trial phase)
         final BusinessSubscriptionTransition initialTransition = transitions.get(0);
         Assert.assertEquals(initialTransition.getBundleId(), bundle.getId());
-        Assert.assertEquals(initialTransition.getExternalKey(), bundle.getKey());
+        Assert.assertEquals(initialTransition.getExternalKey(), bundle.getExternalKey());
         Assert.assertEquals(initialTransition.getAccountId(), account.getId());
         Assert.assertEquals(initialTransition.getAccountKey(), account.getExternalKey());
         Assert.assertEquals(initialTransition.getSubscriptionId(), subscription.getId());
@@ -541,7 +541,7 @@ public class TestAnalytics extends TestIntegrationBase {
 
         // Check the second transition (from trial to evergreen)
         final BusinessSubscriptionTransition futureTransition = transitions.get(1);
-        Assert.assertEquals(futureTransition.getExternalKey(), bundle.getKey());
+        Assert.assertEquals(futureTransition.getExternalKey(), bundle.getExternalKey());
         Assert.assertEquals(futureTransition.getAccountKey(), account.getExternalKey());
         Assert.assertEquals(futureTransition.getCategory(), currentProduct.getCategory().toString());
         Assert.assertEquals(futureTransition.getEventType(), BusinessSubscriptionEvent.EventType.SYSTEM_CHANGE.toString());
@@ -564,10 +564,10 @@ public class TestAnalytics extends TestIntegrationBase {
 
     private void verifyCancellationTransition(final Account account, final SubscriptionBundle bundle) throws CatalogApiException {
         final Product currentProduct = subscriptionPlan.getProduct();
-        final List<BusinessSubscriptionTransition> transitions = analyticsUserApi.getTransitionsForBundle(bundle.getKey(), callContext);
+        final List<BusinessSubscriptionTransition> transitions = analyticsUserApi.getTransitionsForBundle(bundle.getExternalKey(), callContext);
 
         final BusinessSubscriptionTransition cancellationRequest = transitions.get(2);
-        Assert.assertEquals(cancellationRequest.getExternalKey(), bundle.getKey());
+        Assert.assertEquals(cancellationRequest.getExternalKey(), bundle.getExternalKey());
         Assert.assertEquals(cancellationRequest.getAccountKey(), account.getExternalKey());
         Assert.assertEquals(cancellationRequest.getCategory(), currentProduct.getCategory().toString());
         Assert.assertEquals(cancellationRequest.getEventType(), BusinessSubscriptionEvent.EventType.CANCEL.toString());
@@ -576,10 +576,10 @@ public class TestAnalytics extends TestIntegrationBase {
     }
 
     private void verifySystemCancellationTransition(final Account account, final SubscriptionBundle bundle) throws CatalogApiException {
-        final List<BusinessSubscriptionTransition> transitions = analyticsUserApi.getTransitionsForBundle(bundle.getKey(), callContext);
+        final List<BusinessSubscriptionTransition> transitions = analyticsUserApi.getTransitionsForBundle(bundle.getExternalKey(), callContext);
 
         final BusinessSubscriptionTransition systemCancellation = transitions.get(3);
-        Assert.assertEquals(systemCancellation.getExternalKey(), bundle.getKey());
+        Assert.assertEquals(systemCancellation.getExternalKey(), bundle.getExternalKey());
         Assert.assertEquals(systemCancellation.getAccountKey(), account.getExternalKey());
         Assert.assertEquals(systemCancellation.getCategory(), ProductCategory.BASE.toString());
         Assert.assertEquals(systemCancellation.getEventType(), BusinessSubscriptionEvent.EventType.SYSTEM_CANCEL.toString());
@@ -597,12 +597,12 @@ public class TestAnalytics extends TestIntegrationBase {
         waitALittle();
 
         // BST should have three transitions (a ADD_BASE, CHANGE_BASE and SYSTEM_CHANGE_BASE)
-        final List<BusinessSubscriptionTransition> transitions = analyticsUserApi.getTransitionsForBundle(bundle.getKey(), callContext);
+        final List<BusinessSubscriptionTransition> transitions = analyticsUserApi.getTransitionsForBundle(bundle.getExternalKey(), callContext);
         Assert.assertEquals(transitions.size(), 3);
         final BusinessSubscriptionTransition previousTransition = transitions.get(0);
         final BusinessSubscriptionTransition transition = transitions.get(1);
         Assert.assertEquals(transition.getBundleId(), bundle.getId());
-        Assert.assertEquals(transition.getExternalKey(), bundle.getKey());
+        Assert.assertEquals(transition.getExternalKey(), bundle.getExternalKey());
         Assert.assertEquals(transition.getAccountId(), account.getId());
         Assert.assertEquals(transition.getAccountKey(), account.getExternalKey());
         Assert.assertEquals(transition.getSubscriptionId(), subscription.getId());
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultEntitlementTimelineApi.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultEntitlementTimelineApi.java
index 4e0d044..f61d2a6 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultEntitlementTimelineApi.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/timeline/DefaultEntitlementTimelineApi.java
@@ -79,7 +79,7 @@ public class DefaultEntitlementTimelineApi implements EntitlementTimelineApi {
     @Override
     public BundleTimeline getBundleTimeline(final SubscriptionBundle bundle, final TenantContext context)
             throws EntitlementRepairException {
-        return getBundleTimelineInternal(bundle, bundle.getKey(), context);
+        return getBundleTimelineInternal(bundle, bundle.getExternalKey(), context);
     }
 
     @Override
@@ -105,9 +105,9 @@ public class DefaultEntitlementTimelineApi implements EntitlementTimelineApi {
             if (subscriptions.size() == 0) {
                 throw new EntitlementRepairException(ErrorCode.ENT_REPAIR_NO_ACTIVE_SUBSCRIPTIONS, bundle.getId());
             }
-            final String viewId = getViewId(((SubscriptionBundleData) bundle).getLastSysUpdateTime(), subscriptions);
+            final String viewId = getViewId(((SubscriptionBundleData) bundle).getLastSysUpdateDate(), subscriptions);
             final List<SubscriptionTimeline> repairs = createGetSubscriptionRepairList(subscriptions, Collections.<SubscriptionTimeline>emptyList());
-            return createGetBundleRepair(bundle.getId(), bundle.getKey(), viewId, repairs);
+            return createGetBundleRepair(bundle.getId(), bundle.getExternalKey(), viewId, repairs);
         } catch (CatalogApiException e) {
             throw new EntitlementRepairException(e);
         }
@@ -128,7 +128,7 @@ public class DefaultEntitlementTimelineApi implements EntitlementTimelineApi {
                 throw new EntitlementRepairException(ErrorCode.ENT_REPAIR_NO_ACTIVE_SUBSCRIPTIONS, input.getId());
             }
 
-            final String viewId = getViewId(((SubscriptionBundleData) bundle).getLastSysUpdateTime(), subscriptions);
+            final String viewId = getViewId(((SubscriptionBundleData) bundle).getLastSysUpdateDate(), subscriptions);
             if (!viewId.equals(input.getViewId())) {
                 throw new EntitlementRepairException(ErrorCode.ENT_REPAIR_VIEW_CHANGED, input.getId(), input.getViewId(), viewId);
             }
@@ -232,7 +232,7 @@ public class DefaultEntitlementTimelineApi implements EntitlementTimelineApi {
                 baseSubscriptionRepair.addFutureAddonCancellation(addOnSubscriptionInRepair, context);
 
                 final List<SubscriptionTimeline> repairs = createGetSubscriptionRepairList(subscriptions, convertDataRepair(inRepair));
-                return createGetBundleRepair(input.getId(), bundle.getKey(), input.getViewId(), repairs);
+                return createGetBundleRepair(input.getId(), bundle.getExternalKey(), input.getViewId(), repairs);
             } else {
                 dao.repair(bundle.getAccountId(), input.getId(), inRepair, internalCallContextFactory.createInternalCallContext(bundle.getAccountId(), context));
                 return getBundleTimeline(input.getId(), context);
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionBundleData.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionBundleData.java
index 8e0630a..7197b33 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionBundleData.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionBundleData.java
@@ -30,7 +30,7 @@ public class SubscriptionBundleData extends EntityBase implements SubscriptionBu
 
     private final String key;
     private final UUID accountId;
-    private final DateTime lastSysTimeUpdate;
+    private final DateTime lastSysUpdateDate;
     private final OverdueState<SubscriptionBundle> overdueState;
 
     public SubscriptionBundleData(final String name, final UUID accountId, final DateTime startDate) {
@@ -46,12 +46,12 @@ public class SubscriptionBundleData extends EntityBase implements SubscriptionBu
         super(id, null, null);
         this.key = key;
         this.accountId = accountId;
-        this.lastSysTimeUpdate = lastSysUpdate;
+        this.lastSysUpdateDate = lastSysUpdate;
         this.overdueState = overdueState;
     }
 
     @Override
-    public String getKey() {
+    public String getExternalKey() {
         return key;
     }
 
@@ -60,8 +60,8 @@ public class SubscriptionBundleData extends EntityBase implements SubscriptionBu
         return accountId;
     }
 
-    public DateTime getLastSysUpdateTime() {
-        return lastSysTimeUpdate;
+    public DateTime getLastSysUpdateDate() {
+        return lastSysUpdateDate;
     }
 
     @Override
@@ -81,7 +81,7 @@ public class SubscriptionBundleData extends EntityBase implements SubscriptionBu
         sb.append("{accountId=").append(accountId);
         sb.append(", id=").append(id);
         sb.append(", key='").append(key).append('\'');
-        sb.append(", lastSysTimeUpdate=").append(lastSysTimeUpdate);
+        sb.append(", lastSysUpdateDate=").append(lastSysUpdateDate);
         sb.append(", overdueState=").append(overdueState);
         sb.append('}');
         return sb.toString();
@@ -107,7 +107,7 @@ public class SubscriptionBundleData extends EntityBase implements SubscriptionBu
         if (key != null ? !key.equals(that.key) : that.key != null) {
             return false;
         }
-        if (lastSysTimeUpdate != null ? !lastSysTimeUpdate.equals(that.lastSysTimeUpdate) : that.lastSysTimeUpdate != null) {
+        if (lastSysUpdateDate != null ? !lastSysUpdateDate.equals(that.lastSysUpdateDate) : that.lastSysUpdateDate != null) {
             return false;
         }
         if (overdueState != null ? !overdueState.equals(that.overdueState) : that.overdueState != null) {
@@ -122,7 +122,7 @@ public class SubscriptionBundleData extends EntityBase implements SubscriptionBu
         int result = id != null ? id.hashCode() : 0;
         result = 31 * result + (key != null ? key.hashCode() : 0);
         result = 31 * result + (accountId != null ? accountId.hashCode() : 0);
-        result = 31 * result + (lastSysTimeUpdate != null ? lastSysTimeUpdate.hashCode() : 0);
+        result = 31 * result + (lastSysUpdateDate != null ? lastSysUpdateDate.hashCode() : 0);
         result = 31 * result + (overdueState != null ? overdueState.hashCode() : 0);
         return result;
     }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/AuditedEntitlementDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/AuditedEntitlementDao.java
index ec04732..0bef958 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/AuditedEntitlementDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/AuditedEntitlementDao.java
@@ -28,10 +28,10 @@ import java.util.Map;
 import java.util.UUID;
 
 import javax.annotation.Nullable;
+import javax.inject.Inject;
 
 import org.joda.time.DateTime;
 import org.skife.jdbi.v2.IDBI;
-import org.skife.jdbi.v2.sqlobject.mixins.Transmogrifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -55,6 +55,9 @@ import com.ning.billing.entitlement.api.user.SubscriptionData;
 import com.ning.billing.entitlement.engine.addon.AddonUtils;
 import com.ning.billing.entitlement.engine.core.Engine;
 import com.ning.billing.entitlement.engine.core.EntitlementNotificationKey;
+import com.ning.billing.entitlement.engine.dao.model.EntitlementEventModelDao;
+import com.ning.billing.entitlement.engine.dao.model.SubscriptionBundleModelDao;
+import com.ning.billing.entitlement.engine.dao.model.SubscriptionModelDao;
 import com.ning.billing.entitlement.events.EntitlementEvent;
 import com.ning.billing.entitlement.events.EntitlementEvent.EventType;
 import com.ning.billing.entitlement.events.user.ApiEvent;
@@ -63,12 +66,10 @@ import com.ning.billing.entitlement.events.user.ApiEventCancel;
 import com.ning.billing.entitlement.events.user.ApiEventChange;
 import com.ning.billing.entitlement.events.user.ApiEventType;
 import com.ning.billing.entitlement.exceptions.EntitlementError;
-import com.ning.billing.util.audit.ChangeType;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.clock.Clock;
-import com.ning.billing.util.dao.EntityAudit;
-import com.ning.billing.util.dao.TableName;
+import com.ning.billing.util.entity.EntityPersistenceException;
 import com.ning.billing.util.entity.dao.EntitySqlDao;
 import com.ning.billing.util.entity.dao.EntitySqlDaoTransactionWrapper;
 import com.ning.billing.util.entity.dao.EntitySqlDaoTransactionalJdbiWrapper;
@@ -81,18 +82,17 @@ import com.ning.billing.util.notificationq.NotificationQueueService.NoSuchNotifi
 import com.ning.billing.util.svcsapi.bus.InternalBus;
 import com.ning.billing.util.svcsapi.bus.InternalBus.EventBusException;
 
+import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
-import com.google.inject.Inject;
+import com.google.common.collect.ImmutableList;
+
 
 public class AuditedEntitlementDao implements EntitlementDao {
 
     private static final Logger log = LoggerFactory.getLogger(AuditedEntitlementDao.class);
 
     private final Clock clock;
-    private final SubscriptionSqlDao subscriptionsDao;
-    private final BundleSqlDao bundlesDao;
-    private final EntitlementEventSqlDao eventsDao;
     private final EntitySqlDaoTransactionalJdbiWrapper transactionalSqlDao;
     private final NotificationQueueService notificationQueueService;
     private final AddonUtils addonUtils;
@@ -102,9 +102,6 @@ public class AuditedEntitlementDao implements EntitlementDao {
     public AuditedEntitlementDao(final IDBI dbi, final Clock clock, final AddonUtils addonUtils,
                                  final NotificationQueueService notificationQueueService, final InternalBus eventBus, final CatalogService catalogService) {
         this.clock = clock;
-        this.subscriptionsDao = dbi.onDemand(SubscriptionSqlDao.class);
-        this.eventsDao = dbi.onDemand(EntitlementEventSqlDao.class);
-        this.bundlesDao = dbi.onDemand(BundleSqlDao.class);
         this.transactionalSqlDao = new EntitySqlDaoTransactionalJdbiWrapper(dbi);
         this.notificationQueueService = notificationQueueService;
         this.addonUtils = addonUtils;
@@ -113,31 +110,66 @@ public class AuditedEntitlementDao implements EntitlementDao {
 
     @Override
     public SubscriptionBundle getSubscriptionBundleFromAccountAndKey(final UUID accountId, final String bundleKey, final InternalTenantContext context) {
-        return bundlesDao.getBundleFromAccountAndKey(accountId.toString(), bundleKey, context);
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<SubscriptionBundle>() {
+            @Override
+            public SubscriptionBundle inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                final SubscriptionBundleModelDao bundle = entitySqlDaoWrapperFactory.become(BundleSqlDao.class).getBundleFromAccountAndKey(accountId.toString(), bundleKey, context);
+                return SubscriptionBundleModelDao.toSubscriptionbundle(bundle);
+            }
+        });
     }
 
     @Override
     public List<SubscriptionBundle> getSubscriptionBundleForAccount(final UUID accountId, final InternalTenantContext context) {
-        return bundlesDao.getBundleFromAccount(accountId.toString(), context);
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<SubscriptionBundle>>() {
+            @Override
+            public List<SubscriptionBundle> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                final List<SubscriptionBundleModelDao> models = entitySqlDaoWrapperFactory.become(BundleSqlDao.class).getBundleFromAccount(accountId.toString(), context);
+                return ImmutableList.<SubscriptionBundle>copyOf(Collections2.transform(models, new Function<SubscriptionBundleModelDao, SubscriptionBundle>() {
+                    @Override
+                    public SubscriptionBundle apply(@Nullable final SubscriptionBundleModelDao input) {
+                        return SubscriptionBundleModelDao.toSubscriptionbundle(input);
+                    }
+                }));
+            }
+        });
     }
 
     @Override
     public SubscriptionBundle getSubscriptionBundleFromId(final UUID bundleId, final InternalTenantContext context) {
-        return bundlesDao.getBundleFromId(bundleId.toString(), context);
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<SubscriptionBundle>() {
+            @Override
+            public SubscriptionBundle inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                final SubscriptionBundleModelDao model = entitySqlDaoWrapperFactory.become(BundleSqlDao.class).getById(bundleId.toString(), context);
+                return SubscriptionBundleModelDao.toSubscriptionbundle(model);
+            }
+        });
     }
 
     @Override
     public List<SubscriptionBundle> getSubscriptionBundlesForKey(final String bundleKey, final InternalTenantContext context) {
-        return bundlesDao.getBundlesForKey(bundleKey, context);
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<SubscriptionBundle>>() {
+            @Override
+            public List<SubscriptionBundle> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                final List<SubscriptionBundleModelDao> models =  entitySqlDaoWrapperFactory.become(BundleSqlDao.class).getBundlesForKey(bundleKey, context);
+                return ImmutableList.<SubscriptionBundle>copyOf( Collections2.transform(models, new Function<SubscriptionBundleModelDao, SubscriptionBundle>() {
+                    @Override
+                    public SubscriptionBundle apply(@Nullable final SubscriptionBundleModelDao input) {
+                        return SubscriptionBundleModelDao.toSubscriptionbundle(input);
+                    }
+                }));
+            }
+        });
     }
 
     @Override
     public SubscriptionBundle createSubscriptionBundle(final SubscriptionBundleData bundle, final InternalCallContext context) {
         return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<SubscriptionBundle>() {
             @Override
-            public SubscriptionBundle inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) {
-                final BundleSqlDao bundlesDao = entitySqlDaoWrapperFactory.become(BundleSqlDao.class);
-                bundlesDao.insertBundle(bundle, context);
+            public SubscriptionBundle inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws EntityPersistenceException {
+
+                final SubscriptionBundleModelDao model = new SubscriptionBundleModelDao(bundle);
+                entitySqlDaoWrapperFactory.become(BundleSqlDao.class).create(model, context);
                 return bundle;
             }
         });
@@ -145,25 +177,30 @@ public class AuditedEntitlementDao implements EntitlementDao {
 
     @Override
     public UUID getAccountIdFromSubscriptionId(final UUID subscriptionId, final InternalTenantContext context) {
-        final Subscription subscription = subscriptionsDao.getSubscriptionFromId(subscriptionId.toString(), context);
-        if (subscription == null) {
-            log.error(String.format(ErrorCode.ENT_INVALID_SUBSCRIPTION_ID.getFormat(), subscriptionId.toString()));
-            return null;
-        }
 
-        final UUID bundleId = subscription.getBundleId();
-        if (bundleId == null) {
-            log.error(String.format(ErrorCode.ENT_GET_NO_BUNDLE_FOR_SUBSCRIPTION.getFormat(), subscriptionId.toString()));
-            return null;
-        }
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<UUID>() {
+            @Override
+            public UUID inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                final SubscriptionModelDao subscriptionModel = entitySqlDaoWrapperFactory.become(SubscriptionSqlDao.class).getById(subscriptionId.toString(), context);
+                if (subscriptionModel == null) {
+                    log.error(String.format(ErrorCode.ENT_INVALID_SUBSCRIPTION_ID.getFormat(), subscriptionId.toString()));
+                    return null;
+                }
 
-        final SubscriptionBundle bundle = bundlesDao.getBundleFromId(bundleId.toString(), context);
-        if (bundle == null) {
-            log.error(String.format(ErrorCode.ENT_GET_INVALID_BUNDLE_ID.getFormat(), bundleId.toString()));
-            return null;
-        }
+                final UUID bundleId = subscriptionModel.getBundleId();
+                if (bundleId == null) {
+                    log.error(String.format(ErrorCode.ENT_GET_NO_BUNDLE_FOR_SUBSCRIPTION.getFormat(), subscriptionId.toString()));
+                    return null;
+                }
 
-        return bundle.getAccountId();
+                final SubscriptionBundleModelDao bundleModel = entitySqlDaoWrapperFactory.become(BundleSqlDao.class).getById(bundleId.toString(), context);
+                if (bundleModel == null) {
+                    log.error(String.format(ErrorCode.ENT_GET_INVALID_BUNDLE_ID.getFormat(), bundleId.toString()));
+                    return null;
+                }
+                return bundleModel.getAccountId();
+            }
+        });
     }
 
     @Override
@@ -173,23 +210,55 @@ public class AuditedEntitlementDao implements EntitlementDao {
 
     @Override
     public Subscription getSubscriptionFromId(final SubscriptionFactory factory, final UUID subscriptionId, final InternalTenantContext context) {
-        return buildSubscription(factory, subscriptionsDao.getSubscriptionFromId(subscriptionId.toString(), context), context);
+        return buildSubscription(factory, getSubscriptionFromId(subscriptionId, context), context);
+    }
+
+    private Subscription getSubscriptionFromId(final UUID subscriptionId, final InternalTenantContext context) {
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<Subscription>() {
+            @Override
+            public Subscription inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                final SubscriptionModelDao model =  entitySqlDaoWrapperFactory.become(SubscriptionSqlDao.class).getById(subscriptionId.toString(), context);
+                return SubscriptionModelDao.toSubscription(model);
+            }
+        });
     }
 
+
     @Override
     public List<Subscription> getSubscriptions(final SubscriptionFactory factory, final UUID bundleId, final InternalTenantContext context) {
-        return buildBundleSubscriptions(bundleId, factory, subscriptionsDao.getSubscriptionsFromBundleId(bundleId.toString(), context), context);
+        return buildBundleSubscriptions(bundleId, factory, getSubscriptionFromBundleId(bundleId, context), context);
     }
 
+    private List<Subscription> getSubscriptionFromBundleId(final UUID bundleId, final InternalTenantContext context) {
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<Subscription>>() {
+            @Override
+            public List<Subscription> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                final List<SubscriptionModelDao> models =  entitySqlDaoWrapperFactory.become(SubscriptionSqlDao.class).getSubscriptionsFromBundleId(bundleId.toString(), context);
+                return ImmutableList.<Subscription>copyOf( Collections2.transform(models, new Function<SubscriptionModelDao, Subscription>() {
+                    @Override
+                    public Subscription apply(@Nullable final SubscriptionModelDao input) {
+                        return SubscriptionModelDao.toSubscription(input);
+                    }
+                }));
+            }
+        });
+    }
+
+
+
     @Override
     public List<Subscription> getSubscriptionsForAccountAndKey(final SubscriptionFactory factory, final UUID accountId,
                                                                final String bundleKey, final InternalTenantContext context) {
-        final SubscriptionBundle bundle = bundlesDao.getBundleFromAccountAndKey(accountId.toString(), bundleKey, context);
-        if (bundle == null) {
-            return Collections.emptyList();
-        }
-
-        return getSubscriptions(factory, bundle.getId(), context);
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<Subscription>>() {
+            @Override
+            public List<Subscription> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                final SubscriptionBundleModelDao bundleModel = entitySqlDaoWrapperFactory.become(BundleSqlDao.class).getBundleFromAccountAndKey(accountId.toString(), bundleKey, context);
+                if (bundleModel == null) {
+                    return Collections.emptyList();
+                }
+                return getSubscriptions(factory, bundleModel.getId(), context);
+            }
+        });
     }
 
     @Override
@@ -218,7 +287,7 @@ public class AuditedEntitlementDao implements EntitlementDao {
                 final EntitlementEventSqlDao transactional = entitySqlDaoWrapperFactory.become(EntitlementEventSqlDao.class);
                 final UUID subscriptionId = subscription.getId();
                 cancelNextPhaseEventFromTransaction(subscriptionId, entitySqlDaoWrapperFactory, context);
-                transactional.insertEvent(nextPhase, context);
+                transactional.create(new EntitlementEventModelDao(nextPhase), context);
                 recordFutureNotificationFromTransaction(entitySqlDaoWrapperFactory,
                                                         nextPhase.getEffectiveDate(),
                                                         new EntitlementNotificationKey(nextPhase.getId()),
@@ -234,12 +303,30 @@ public class AuditedEntitlementDao implements EntitlementDao {
 
     @Override
     public EntitlementEvent getEventById(final UUID eventId, final InternalTenantContext context) {
-        return eventsDao.getEventById(eventId.toString(), context);
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<EntitlementEvent>() {
+            @Override
+            public EntitlementEvent inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                EntitlementEventModelDao model =  entitySqlDaoWrapperFactory.become(EntitlementEventSqlDao.class).getById(eventId.toString(), context);
+                return EntitlementEventModelDao.toEntitlementEvent(model);
+            }
+        });
     }
 
     @Override
     public List<EntitlementEvent> getEventsForSubscription(final UUID subscriptionId, final InternalTenantContext context) {
-        return eventsDao.getEventsForSubscription(subscriptionId.toString(), context);
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<EntitlementEvent>>() {
+            @Override
+            public List<EntitlementEvent> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                final List<EntitlementEventModelDao> models = entitySqlDaoWrapperFactory.become(EntitlementEventSqlDao.class).getEventsForSubscription(subscriptionId.toString(), context);
+
+                return ImmutableList.<EntitlementEvent>copyOf( Collections2.transform(models, new Function<EntitlementEventModelDao, EntitlementEvent>() {
+                    @Override
+                    public EntitlementEvent apply(@Nullable final EntitlementEventModelDao input) {
+                        return EntitlementEventModelDao.toEntitlementEvent(input);
+                    }
+                }));
+            }
+        });
     }
 
     @Override
@@ -249,18 +336,23 @@ public class AuditedEntitlementDao implements EntitlementDao {
             public Map<UUID, List<EntitlementEvent>> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
                 final SubscriptionSqlDao transactional = entitySqlDaoWrapperFactory.become(SubscriptionSqlDao.class);
 
-                final List<Subscription> subscriptions = transactional.getSubscriptionsFromBundleId(bundleId.toString(), context);
-                if (subscriptions.size() == 0) {
+                final List<SubscriptionModelDao> subscriptionModels = transactional.getSubscriptionsFromBundleId(bundleId.toString(), context);
+                if (subscriptionModels.size() == 0) {
                     return Collections.emptyMap();
                 }
 
                 final EntitlementEventSqlDao eventsDaoFromSameTransaction = entitySqlDaoWrapperFactory.become(EntitlementEventSqlDao.class);
                 final Map<UUID, List<EntitlementEvent>> result = new HashMap<UUID, List<EntitlementEvent>>();
-                for (final Subscription cur : subscriptions) {
-                    final List<EntitlementEvent> events = eventsDaoFromSameTransaction.getEventsForSubscription(cur.getId().toString(), context);
+                for (final SubscriptionModelDao cur : subscriptionModels) {
+                    final List<EntitlementEventModelDao> eventModels = eventsDaoFromSameTransaction.getEventsForSubscription(cur.getId().toString(), context);
+                    final List<EntitlementEvent> events = ImmutableList.<EntitlementEvent>copyOf(Collections2.transform(eventModels, new Function<EntitlementEventModelDao, EntitlementEvent>() {
+                        @Override
+                        public EntitlementEvent apply(@Nullable final EntitlementEventModelDao input) {
+                            return EntitlementEventModelDao.toEntitlementEvent(input);
+                        }
+                    }));
                     result.put(cur.getId(), events);
                 }
-
                 return result;
             }
         });
@@ -269,7 +361,20 @@ public class AuditedEntitlementDao implements EntitlementDao {
     @Override
     public List<EntitlementEvent> getPendingEventsForSubscription(final UUID subscriptionId, final InternalTenantContext context) {
         final Date now = clock.getUTCNow().toDate();
-        return eventsDao.getFutureActiveEventForSubscription(subscriptionId.toString(), now, context);
+
+        return transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<List<EntitlementEvent>>() {
+            @Override
+            public List<EntitlementEvent> inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
+                final List<EntitlementEventModelDao> eventModels = entitySqlDaoWrapperFactory.become(EntitlementEventSqlDao.class).getFutureActiveEventForSubscription(subscriptionId.toString(), now, context);
+                final List<EntitlementEvent> events = ImmutableList.<EntitlementEvent>copyOf(Collections2.transform(eventModels, new Function<EntitlementEventModelDao, EntitlementEvent>() {
+                    @Override
+                    public EntitlementEvent apply(@Nullable final EntitlementEventModelDao input) {
+                        return EntitlementEventModelDao.toEntitlementEvent(input);
+                    }
+                }));
+                return events;
+            }
+        });
     }
 
     @Override
@@ -278,11 +383,11 @@ public class AuditedEntitlementDao implements EntitlementDao {
             @Override
             public Void inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
                 final SubscriptionSqlDao transactional = entitySqlDaoWrapperFactory.become(SubscriptionSqlDao.class);
-                transactional.insertSubscription(subscription, context);
+                transactional.create(new SubscriptionModelDao(subscription), context);
 
                 final EntitlementEventSqlDao eventsDaoFromSameTransaction = entitySqlDaoWrapperFactory.become(EntitlementEventSqlDao.class);
                 for (final EntitlementEvent cur : initialEvents) {
-                    eventsDaoFromSameTransaction.insertEvent(cur, context);
+                    eventsDaoFromSameTransaction.create(new EntitlementEventModelDao(cur), context);
                     recordFutureNotificationFromTransaction(entitySqlDaoWrapperFactory,
                                                             cur.getEffectiveDate(),
                                                             new EntitlementNotificationKey(cur.getId()),
@@ -305,7 +410,7 @@ public class AuditedEntitlementDao implements EntitlementDao {
                 final EntitlementEventSqlDao transactional = entitySqlDaoWrapperFactory.become(EntitlementEventSqlDao.class);
 
                 for (final EntitlementEvent cur : recreateEvents) {
-                    transactional.insertEvent(cur, context);
+                    transactional.create(new EntitlementEventModelDao(cur), context);
                     recordFutureNotificationFromTransaction(entitySqlDaoWrapperFactory,
                                                             cur.getEffectiveDate(),
                                                             new EntitlementNotificationKey(cur.getId()),
@@ -340,12 +445,12 @@ public class AuditedEntitlementDao implements EntitlementDao {
                 final EntitlementEventSqlDao transactional = entitySqlDaoWrapperFactory.become(EntitlementEventSqlDao.class);
 
                 final UUID subscriptionId = subscription.getId();
-                EntitlementEvent cancelledEvent = null;
+                EntitlementEventModelDao cancelledEvent = null;
                 final Date now = clock.getUTCNow().toDate();
-                final List<EntitlementEvent> events = transactional.getFutureActiveEventForSubscription(subscriptionId.toString(), now, context);
+                final List<EntitlementEventModelDao> eventModels = transactional.getFutureActiveEventForSubscription(subscriptionId.toString(), now, context);
 
-                for (final EntitlementEvent cur : events) {
-                    if (cur.getType() == EventType.API_USER && ((ApiEvent) cur).getEventType() == ApiEventType.CANCEL) {
+                for (final EntitlementEventModelDao cur : eventModels) {
+                    if (cur.getUserType() == ApiEventType.CANCEL) {
                         if (cancelledEvent != null) {
                             throw new EntitlementError(String.format("Found multiple cancel active events for subscriptions %s", subscriptionId.toString()));
                         }
@@ -357,7 +462,7 @@ public class AuditedEntitlementDao implements EntitlementDao {
                     final String cancelledEventId = cancelledEvent.getId().toString();
                     transactional.unactiveEvent(cancelledEventId, context);
                     for (final EntitlementEvent cur : uncancelEvents) {
-                        transactional.insertEvent(cur, context);
+                        transactional.create(new EntitlementEventModelDao(cur), context);
                         recordFutureNotificationFromTransaction(entitySqlDaoWrapperFactory,
                                                                 cur.getEffectiveDate(),
                                                                 new EntitlementNotificationKey(cur.getId()),
@@ -384,7 +489,7 @@ public class AuditedEntitlementDao implements EntitlementDao {
                 cancelFutureEventsFromTransaction(subscriptionId, entitySqlDaoWrapperFactory, context);
 
                 for (final EntitlementEvent cur : changeEvents) {
-                    transactional.insertEvent(cur, context);
+                    transactional.create(new EntitlementEventModelDao(cur), context);
                     recordFutureNotificationFromTransaction(entitySqlDaoWrapperFactory,
                                                             cur.getEffectiveDate(),
                                                             new EntitlementNotificationKey(cur.getId()),
@@ -400,10 +505,11 @@ public class AuditedEntitlementDao implements EntitlementDao {
         });
     }
 
-    private void cancelSubscriptionFromTransaction(final SubscriptionData subscription, final EntitlementEvent cancelEvent, final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory, final InternalCallContext context, final int seqId) {
+    private void cancelSubscriptionFromTransaction(final SubscriptionData subscription, final EntitlementEvent cancelEvent, final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory, final InternalCallContext context, final int seqId)
+            throws EntityPersistenceException {
         final UUID subscriptionId = subscription.getId();
         cancelFutureEventsFromTransaction(subscriptionId, entitySqlDaoWrapperFactory, context);
-        entitySqlDaoWrapperFactory.become(EntitlementEventSqlDao.class).insertEvent(cancelEvent, context);
+        entitySqlDaoWrapperFactory.become(EntitlementEventSqlDao.class).create(new EntitlementEventModelDao(cancelEvent), context);
         recordFutureNotificationFromTransaction(entitySqlDaoWrapperFactory,
                                                 cancelEvent.getEffectiveDate(),
                                                 new EntitlementNotificationKey(cancelEvent.getId(), seqId),
@@ -419,20 +525,20 @@ public class AuditedEntitlementDao implements EntitlementDao {
 
     private void cancelFutureEventsFromTransaction(final UUID subscriptionId, final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory, final InternalCallContext context) {
         final Date now = clock.getUTCNow().toDate();
-        final List<EntitlementEvent> events = entitySqlDaoWrapperFactory.become(EntitlementEventSqlDao.class).getFutureActiveEventForSubscription(subscriptionId.toString(), now, context);
-        for (final EntitlementEvent cur : events) {
+        final List<EntitlementEventModelDao> eventModels = entitySqlDaoWrapperFactory.become(EntitlementEventSqlDao.class).getFutureActiveEventForSubscription(subscriptionId.toString(), now, context);
+        for (final EntitlementEventModelDao cur : eventModels) {
             unactivateEventFromTransaction(cur, entitySqlDaoWrapperFactory, context);
         }
     }
 
     private void cancelFutureEventFromTransaction(final UUID subscriptionId, final EntitySqlDaoWrapperFactory<EntitySqlDao> dao, final EventType type,
                                                   @Nullable final ApiEventType apiType, final InternalCallContext context) {
-        EntitlementEvent futureEvent = null;
+        EntitlementEventModelDao futureEvent = null;
         final Date now = clock.getUTCNow().toDate();
-        final List<EntitlementEvent> events = dao.become(EntitlementEventSqlDao.class).getFutureActiveEventForSubscription(subscriptionId.toString(), now, context);
-        for (final EntitlementEvent cur : events) {
-            if (cur.getType() == type &&
-                (apiType == null || apiType == ((ApiEvent) cur).getEventType())) {
+        final List<EntitlementEventModelDao> eventModels = dao.become(EntitlementEventSqlDao.class).getFutureActiveEventForSubscription(subscriptionId.toString(), now, context);
+        for (final EntitlementEventModelDao cur : eventModels) {
+            if (cur.getEventType() == type &&
+                (apiType == null || apiType == cur.getUserType())) {
                 if (futureEvent != null) {
                     throw new EntitlementError(String.format("Found multiple future events for type %s for subscriptions %s",
                                                              type, subscriptionId.toString()));
@@ -443,7 +549,7 @@ public class AuditedEntitlementDao implements EntitlementDao {
         unactivateEventFromTransaction(futureEvent, dao, context);
     }
 
-    private void unactivateEventFromTransaction(final EntitlementEvent event, final EntitySqlDaoWrapperFactory<EntitySqlDao> dao, final InternalCallContext context) {
+    private void unactivateEventFromTransaction(final EntitlementEventModelDao event, final EntitySqlDaoWrapperFactory<EntitySqlDao> dao, final InternalCallContext context) {
         if (event != null) {
             final String eventId = event.getId().toString();
             dao.become(EntitlementEventSqlDao.class).unactiveEvent(eventId, context);
@@ -500,7 +606,7 @@ public class AuditedEntitlementDao implements EntitlementDao {
         EntitlementEvent futureBaseEvent = null;
         final List<Subscription> result = new ArrayList<Subscription>(input.size());
         for (final Subscription cur : input) {
-            final List<EntitlementEvent> events = eventsDao.getEventsForSubscription(cur.getId().toString(), context);
+            final List<EntitlementEvent> events = getEventsForSubscription(cur.getId(), context);
             Subscription reloaded = factory.createSubscription(new SubscriptionBuilder((SubscriptionData) cur), events);
 
             switch (cur.getCategory()) {
@@ -581,7 +687,7 @@ public class AuditedEntitlementDao implements EntitlementDao {
                         transEventDao.updateVersion(event.getId().toString(), event.getActiveVersion(), context);
                     }
                     for (final EntitlementEvent event : cur.getNewEvents()) {
-                        transEventDao.insertEvent(event, context);
+                        transEventDao.create(new EntitlementEventModelDao(event), context);
                         if (event.getEffectiveDate().isAfter(clock.getUTCNow())) {
                             recordFutureNotificationFromTransaction(entitySqlDaoWrapperFactory,
                                                                     event.getEffectiveDate(),
@@ -594,7 +700,7 @@ public class AuditedEntitlementDao implements EntitlementDao {
                 try {
                     // Note: we don't send a requested change event here, but a repair event
                     final RepairEntitlementInternalEvent busEvent = new DefaultRepairEntitlementEvent(context.getUserToken(), accountId, bundleId, clock.getUTCNow(),
-                            context.getAccountRecordId(), context.getTenantRecordId());
+                                                                                                      context.getAccountRecordId(), context.getTenantRecordId());
                     eventBus.postFromTransaction(busEvent, entitySqlDaoWrapperFactory, context);
                 } catch (EventBusException e) {
                     log.warn("Failed to post repair entitlement event for bundle " + bundleId, e);
@@ -626,13 +732,12 @@ public class AuditedEntitlementDao implements EntitlementDao {
     }
 
     private Subscription getBaseSubscription(final SubscriptionFactory factory, final UUID bundleId, final boolean rebuildSubscription, final InternalTenantContext context) {
-        final List<Subscription> subscriptions = subscriptionsDao.getSubscriptionsFromBundleId(bundleId.toString(), context);
+        final List<Subscription> subscriptions = getSubscriptionFromBundleId(bundleId, context);
         for (final Subscription cur : subscriptions) {
             if (cur.getCategory() == ProductCategory.BASE) {
                 return rebuildSubscription ? buildSubscription(factory, cur, context) : cur;
             }
         }
-
         return null;
     }
 
@@ -659,35 +764,35 @@ public class AuditedEntitlementDao implements EntitlementDao {
     }
 
     private void migrateBundleDataFromTransaction(final BundleMigrationData bundleTransferData, final EntitlementEventSqlDao transactional,
-                                                  final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory, final InternalCallContext context) {
+                                                  final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory, final InternalCallContext context) throws EntityPersistenceException {
 
         final SubscriptionSqlDao transSubDao = entitySqlDaoWrapperFactory.become(SubscriptionSqlDao.class);
         final BundleSqlDao transBundleDao = entitySqlDaoWrapperFactory.become(BundleSqlDao.class);
 
         final SubscriptionBundleData bundleData = bundleTransferData.getData();
 
-        final SubscriptionBundle existingBundle = transBundleDao.getBundleFromAccountAndKey(bundleData.getAccountId().toString(), bundleData.getKey(), context);
-        if (existingBundle != null) {
-            log.error(String.format("Attempted to create a bundle for account %s and key %s that already existed, skip...", bundleData.getAccountId().toString(), bundleData.getKey()));
+        final SubscriptionBundleModelDao existingBundleModel = transBundleDao.getBundleFromAccountAndKey(bundleData.getAccountId().toString(), bundleData.getExternalKey(), context);
+        if (existingBundleModel != null) {
+            log.error(String.format("Attempted to create a bundle for account %s and key %s that already existed, skip...", bundleData.getAccountId().toString(), bundleData.getExternalKey()));
             return;
         }
 
         for (final SubscriptionMigrationData curSubscription : bundleTransferData.getSubscriptions()) {
             final SubscriptionData subData = curSubscription.getData();
             for (final EntitlementEvent curEvent : curSubscription.getInitialEvents()) {
-                transactional.insertEvent(curEvent, context);
+                transactional.create(new EntitlementEventModelDao(curEvent), context);
                 recordFutureNotificationFromTransaction(entitySqlDaoWrapperFactory,
                                                         curEvent.getEffectiveDate(),
                                                         new EntitlementNotificationKey(curEvent.getId()),
                                                         context);
             }
-            transSubDao.insertSubscription(subData, context);
+            transSubDao.create(new SubscriptionModelDao(subData), context);
 
             // Notify the Bus of the latest requested change
             final EntitlementEvent finalEvent = curSubscription.getInitialEvents().get(curSubscription.getInitialEvents().size() - 1);
             notifyBusOfRequestedChange(entitySqlDaoWrapperFactory, subData, finalEvent, context);
         }
 
-        transBundleDao.insertBundle(bundleData, context);
+        transBundleDao.create(new SubscriptionBundleModelDao(bundleData), context);
     }
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/BundleSqlDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/BundleSqlDao.java
index 65671d4..d487ba4 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/BundleSqlDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/BundleSqlDao.java
@@ -33,6 +33,7 @@ import org.skife.jdbi.v2.tweak.ResultSetMapper;
 
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.entitlement.api.user.SubscriptionBundleData;
+import com.ning.billing.entitlement.engine.dao.model.SubscriptionBundleModelDao;
 import com.ning.billing.util.audit.ChangeType;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
@@ -43,12 +44,8 @@ import com.ning.billing.util.entity.dao.EntitySqlDaoStringTemplate;
 
 @EntitySqlDaoStringTemplate
 @RegisterMapper(BundleSqlDao.ISubscriptionBundleSqlMapper.class)
-public interface BundleSqlDao extends EntitySqlDao<SubscriptionBundle> {
+public interface BundleSqlDao extends EntitySqlDao<SubscriptionBundleModelDao> {
 
-    @SqlUpdate
-    @Audited(ChangeType.INSERT)
-    public void insertBundle(@BindBean SubscriptionBundleData bundle,
-                             @BindBean final InternalCallContext context);
 
     @SqlUpdate
     @Audited(ChangeType.UPDATE)
@@ -57,32 +54,30 @@ public interface BundleSqlDao extends EntitySqlDao<SubscriptionBundle> {
                                         @BindBean final InternalCallContext context);
 
     @SqlQuery
-    public SubscriptionBundle getBundleFromId(@Bind("id") String id,
-                                              @BindBean final InternalTenantContext context);
-
-    @SqlQuery
-    public SubscriptionBundle getBundleFromAccountAndKey(@Bind("accountId") String accountId,
+    public SubscriptionBundleModelDao getBundleFromAccountAndKey(@Bind("accountId") String accountId,
                                                          @Bind("externalKey") String externalKey,
                                                          @BindBean final InternalTenantContext context);
 
     @SqlQuery
-    public List<SubscriptionBundle> getBundleFromAccount(@Bind("accountId") String accountId,
+    public List<SubscriptionBundleModelDao> getBundleFromAccount(@Bind("accountId") String accountId,
                                                          @BindBean final InternalTenantContext context);
 
     @SqlQuery
-    public List<SubscriptionBundle> getBundlesForKey(@Bind("externalKey") String externalKey,
+    public List<SubscriptionBundleModelDao> getBundlesForKey(@Bind("externalKey") String externalKey,
                                                      @BindBean final InternalTenantContext context);
 
 
-    public static class ISubscriptionBundleSqlMapper extends MapperBase implements ResultSetMapper<SubscriptionBundle> {
+    public static class ISubscriptionBundleSqlMapper extends MapperBase implements ResultSetMapper<SubscriptionBundleModelDao> {
 
         @Override
-        public SubscriptionBundle map(final int arg, final ResultSet r, final StatementContext ctx) throws SQLException {
+        public SubscriptionBundleModelDao map(final int arg, final ResultSet r, final StatementContext ctx) throws SQLException {
             final UUID id = UUID.fromString(r.getString("id"));
             final String key = r.getString("external_key");
             final UUID accountId = UUID.fromString(r.getString("account_id"));
             final DateTime lastSysUpdateDate = getDateTime(r, "last_sys_update_date");
-            return new SubscriptionBundleData(id, key, accountId, lastSysUpdateDate);
+            final DateTime createdDate = getDateTime(r, "created_date");
+            final DateTime updatedDate = getDateTime(r, "updated_date");
+            return new SubscriptionBundleModelDao(id, key, accountId, lastSysUpdateDate, createdDate, updatedDate);
         }
     }
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementEventSqlDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementEventSqlDao.java
index 8a45d11..2e21dcf 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementEventSqlDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementEventSqlDao.java
@@ -32,22 +32,9 @@ import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper;
 import org.skife.jdbi.v2.tweak.ResultSetMapper;
 
 import com.ning.billing.entitlement.engine.dao.EntitlementEventSqlDao.EventSqlMapper;
-import com.ning.billing.entitlement.events.EntitlementEvent;
+import com.ning.billing.entitlement.engine.dao.model.EntitlementEventModelDao;
 import com.ning.billing.entitlement.events.EntitlementEvent.EventType;
-import com.ning.billing.entitlement.events.EventBaseBuilder;
-import com.ning.billing.entitlement.events.phase.PhaseEventBuilder;
-import com.ning.billing.entitlement.events.phase.PhaseEventData;
-import com.ning.billing.entitlement.events.user.ApiEventBuilder;
-import com.ning.billing.entitlement.events.user.ApiEventCancel;
-import com.ning.billing.entitlement.events.user.ApiEventChange;
-import com.ning.billing.entitlement.events.user.ApiEventCreate;
-import com.ning.billing.entitlement.events.user.ApiEventMigrateBilling;
-import com.ning.billing.entitlement.events.user.ApiEventMigrateEntitlement;
-import com.ning.billing.entitlement.events.user.ApiEventReCreate;
-import com.ning.billing.entitlement.events.user.ApiEventTransfer;
 import com.ning.billing.entitlement.events.user.ApiEventType;
-import com.ning.billing.entitlement.events.user.ApiEventUncancel;
-import com.ning.billing.entitlement.exceptions.EntitlementError;
 import com.ning.billing.util.audit.ChangeType;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
@@ -58,16 +45,7 @@ import com.ning.billing.util.entity.dao.EntitySqlDaoStringTemplate;
 
 @EntitySqlDaoStringTemplate
 @RegisterMapper(EventSqlMapper.class)
-public interface EntitlementEventSqlDao extends EntitySqlDao<EntitlementEvent> {
-
-    @SqlQuery
-    public EntitlementEvent getEventById(@Bind("id") String id,
-                                         @BindBean final InternalTenantContext context);
-
-    @SqlUpdate
-    @Audited(ChangeType.INSERT)
-    public void insertEvent(@BindBean final EntitlementEvent evt,
-                            @BindBean final InternalCallContext context);
+public interface EntitlementEventSqlDao extends EntitySqlDao<EntitlementEventModelDao> {
 
     @SqlUpdate
     @Audited(ChangeType.UPDATE)
@@ -86,19 +64,19 @@ public interface EntitlementEventSqlDao extends EntitySqlDao<EntitlementEvent> {
                               @BindBean final InternalCallContext context);
 
     @SqlQuery
-    public List<EntitlementEvent> getFutureActiveEventForSubscription(@Bind("subscriptionId") String subscriptionId,
-                                                                      @Bind("now") Date now,
-                                                                      @BindBean final InternalTenantContext context);
+    public List<EntitlementEventModelDao> getFutureActiveEventForSubscription(@Bind("subscriptionId") String subscriptionId,
+                                                                              @Bind("now") Date now,
+                                                                              @BindBean final InternalTenantContext context);
 
     @SqlQuery
-    public List<EntitlementEvent> getEventsForSubscription(@Bind("subscriptionId") String subscriptionId,
-                                                           @BindBean final InternalTenantContext context);
+    public List<EntitlementEventModelDao> getEventsForSubscription(@Bind("subscriptionId") String subscriptionId,
+                                                                   @BindBean final InternalTenantContext context);
 
 
-    public static class EventSqlMapper extends MapperBase implements ResultSetMapper<EntitlementEvent> {
+    public static class EventSqlMapper extends MapperBase implements ResultSetMapper<EntitlementEventModelDao> {
 
         @Override
-        public EntitlementEvent map(final int index, final ResultSet r, final StatementContext ctx)
+        public EntitlementEventModelDao map(final int index, final ResultSet r, final StatementContext ctx)
                 throws SQLException {
 
             final long totalOrdering = r.getLong("record_id");
@@ -117,55 +95,9 @@ public interface EntitlementEventSqlDao extends EntitySqlDao<EntitlementEvent> {
             final boolean isActive = r.getBoolean("is_active");
             final UUID userToken = r.getString("user_token") != null ? UUID.fromString(r.getString("user_token")) : null;
 
-            final EventBaseBuilder<?> base = ((eventType == EventType.PHASE) ?
-                                              new PhaseEventBuilder() :
-                                              new ApiEventBuilder())
-                    .setTotalOrdering(totalOrdering)
-                    .setUuid(id)
-                    .setSubscriptionId(subscriptionId)
-                    .setCreatedDate(createdDate)
-                    .setUpdatedDate(updatedDate)
-                    .setRequestedDate(requestedDate)
-                    .setEffectiveDate(effectiveDate)
-                    .setProcessedDate(createdDate)
-                    .setActiveVersion(currentVersion)
-                    .setActive(isActive);
-
-            EntitlementEvent result = null;
-            if (eventType == EventType.PHASE) {
-                result = new PhaseEventData(new PhaseEventBuilder(base).setPhaseName(phaseName));
-            } else if (eventType == EventType.API_USER) {
-                final ApiEventBuilder builder = new ApiEventBuilder(base)
-                        .setEventPlan(planName)
-                        .setEventPlanPhase(phaseName)
-                        .setEventPriceList(priceListName)
-                        .setEventType(userType)
-                        .setUserToken(userToken)
-                        .setFromDisk(true);
-
-                if (userType == ApiEventType.CREATE) {
-                    result = new ApiEventCreate(builder);
-                } else if (userType == ApiEventType.RE_CREATE) {
-                    result = new ApiEventReCreate(builder);
-                } else if (userType == ApiEventType.MIGRATE_ENTITLEMENT) {
-                    result = new ApiEventMigrateEntitlement(builder);
-                } else if (userType == ApiEventType.MIGRATE_BILLING) {
-                    result = new ApiEventMigrateBilling(builder);
-                } else if (userType == ApiEventType.TRANSFER) {
-                    result = new ApiEventTransfer(builder);
-                } else if (userType == ApiEventType.CHANGE) {
-                    result = new ApiEventChange(builder);
-                } else if (userType == ApiEventType.CANCEL) {
-                    result = new ApiEventCancel(builder);
-                } else if (userType == ApiEventType.RE_CREATE) {
-                    result = new ApiEventReCreate(builder);
-                } else if (userType == ApiEventType.UNCANCEL) {
-                    result = new ApiEventUncancel(builder);
-                }
-            } else {
-                throw new EntitlementError(String.format("Can't deserialize event %s", eventType));
-            }
-            return result;
+            return new EntitlementEventModelDao(id, totalOrdering, eventType, userType, requestedDate, effectiveDate, subscriptionId,
+                                                planName, phaseName, priceListName, currentVersion, isActive, createdDate, updatedDate);
+
         }
     }
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/model/EntitlementEventModelDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/model/EntitlementEventModelDao.java
new file mode 100644
index 0000000..7972c84
--- /dev/null
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/model/EntitlementEventModelDao.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright 2010-2012 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.model;
+
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
+import com.ning.billing.entitlement.api.user.EntitlementUserApi;
+import com.ning.billing.entitlement.events.EntitlementEvent;
+import com.ning.billing.entitlement.events.EntitlementEvent.EventType;
+import com.ning.billing.entitlement.events.EventBaseBuilder;
+import com.ning.billing.entitlement.events.phase.PhaseEventBuilder;
+import com.ning.billing.entitlement.events.phase.PhaseEventData;
+import com.ning.billing.entitlement.events.user.ApiEvent;
+import com.ning.billing.entitlement.events.user.ApiEventBuilder;
+import com.ning.billing.entitlement.events.user.ApiEventCancel;
+import com.ning.billing.entitlement.events.user.ApiEventChange;
+import com.ning.billing.entitlement.events.user.ApiEventCreate;
+import com.ning.billing.entitlement.events.user.ApiEventMigrateBilling;
+import com.ning.billing.entitlement.events.user.ApiEventMigrateEntitlement;
+import com.ning.billing.entitlement.events.user.ApiEventReCreate;
+import com.ning.billing.entitlement.events.user.ApiEventTransfer;
+import com.ning.billing.entitlement.events.user.ApiEventType;
+import com.ning.billing.entitlement.events.user.ApiEventUncancel;
+import com.ning.billing.entitlement.exceptions.EntitlementError;
+import com.ning.billing.util.entity.EntityBase;
+
+public class EntitlementEventModelDao extends EntityBase {
+
+    private final long totalOrdering;
+    private final EventType eventType;
+    private final ApiEventType userType;
+    private final DateTime requestedDate;
+    private final DateTime effectiveDate;
+    private final UUID subscriptionId;
+    private final String planName;
+    private final String phaseName;
+    private final String priceListName;
+    private final long currentVersion;
+    private final boolean isActive;
+
+    public EntitlementEventModelDao(final UUID id, final long totalOrdering, final EventType eventType, final ApiEventType userType,
+                                    final DateTime requestedDate, final DateTime effectiveDate, final UUID subscriptionId,
+                                    final String planName, final String phaseName, final String priceListName, final long currentVersion,
+                                    final boolean active, final DateTime createDate, final DateTime updateDate) {
+        super(id, createDate, updateDate);
+        this.totalOrdering = totalOrdering;
+        this.eventType = eventType;
+        this.userType = userType;
+        this.requestedDate = requestedDate;
+        this.effectiveDate = effectiveDate;
+        this.subscriptionId = subscriptionId;
+        this.planName = planName;
+        this.phaseName = phaseName;
+        this.priceListName = priceListName;
+        this.currentVersion = currentVersion;
+        this.isActive = active;
+    }
+
+    public EntitlementEventModelDao(final EntitlementEvent src) {
+        super(src.getId(), src.getCreatedDate(), src.getUpdatedDate());
+        this.totalOrdering = src.getTotalOrdering();
+        this.eventType = src.getType();
+        this.userType = eventType == EventType.API_USER ? ((ApiEvent) src).getEventType() : null;
+        this.requestedDate = src.getRequestedDate();
+        this.effectiveDate = src.getEffectiveDate();
+        this.subscriptionId = src.getSubscriptionId();
+        this.planName = eventType == EventType.API_USER ? ((ApiEvent) src).getEventPlan() : null;
+        this.phaseName = eventType == EventType.API_USER ? ((ApiEvent) src).getEventPlanPhase() : null;
+        this.priceListName = eventType == EventType.API_USER ? ((ApiEvent) src).getPriceList() : null;
+        this.currentVersion = src.getActiveVersion();
+        this.isActive = src.isActive();
+    }
+
+    public long getTotalOrdering() {
+        return totalOrdering;
+    }
+
+    public EventType getEventType() {
+        return eventType;
+    }
+
+    public ApiEventType getUserType() {
+        return userType;
+    }
+
+    public DateTime getRequestedDate() {
+        return requestedDate;
+    }
+
+    public DateTime getEffectiveDate() {
+        return effectiveDate;
+    }
+
+    public UUID getSubscriptionId() {
+        return subscriptionId;
+    }
+
+    public String getPlanName() {
+        return planName;
+    }
+
+    public String getPhaseName() {
+        return phaseName;
+    }
+
+    public String getPriceListName() {
+        return priceListName;
+    }
+
+    public long getCurrentVersion() {
+        return currentVersion;
+    }
+
+    public boolean isActive() {
+        return isActive;
+    }
+
+    public static EntitlementEvent toEntitlementEvent(EntitlementEventModelDao src) {
+
+        final EventBaseBuilder<?> base = ((src.getEventType() == EventType.PHASE) ?
+                                          new PhaseEventBuilder() :
+                                          new ApiEventBuilder())
+                .setTotalOrdering(src.getTotalOrdering())
+                .setUuid(src.getId())
+                .setSubscriptionId(src.getSubscriptionId())
+                .setCreatedDate(src.getCreatedDate())
+                .setUpdatedDate(src.getUpdatedDate())
+                .setRequestedDate(src.getRequestedDate())
+                .setEffectiveDate(src.getEffectiveDate())
+                .setProcessedDate(src.getCreatedDate())
+                .setActiveVersion(src.getCurrentVersion())
+                .setActive(src.isActive());
+
+        EntitlementEvent result = null;
+        if (src.getEventType() == EventType.PHASE) {
+            result = new PhaseEventData(new PhaseEventBuilder(base).setPhaseName(src.getPhaseName()));
+        } else if (src.getEventType() == EventType.API_USER) {
+            final ApiEventBuilder builder = new ApiEventBuilder(base)
+                    .setEventPlan(src.getPlanName())
+                    .setEventPlanPhase(src.getPhaseName())
+                    .setEventPriceList(src.getPriceListName())
+                    .setEventType(src.getUserType())
+                    .setFromDisk(true);
+
+            if (src.getUserType() == ApiEventType.CREATE) {
+                result = new ApiEventCreate(builder);
+            } else if (src.getUserType() == ApiEventType.RE_CREATE) {
+                result = new ApiEventReCreate(builder);
+            } else if (src.getUserType() == ApiEventType.MIGRATE_ENTITLEMENT) {
+                result = new ApiEventMigrateEntitlement(builder);
+            } else if (src.getUserType() == ApiEventType.MIGRATE_BILLING) {
+                result = new ApiEventMigrateBilling(builder);
+            } else if (src.getUserType() == ApiEventType.TRANSFER) {
+                result = new ApiEventTransfer(builder);
+            } else if (src.getUserType() == ApiEventType.CHANGE) {
+                result = new ApiEventChange(builder);
+            } else if (src.getUserType() == ApiEventType.CANCEL) {
+                result = new ApiEventCancel(builder);
+            } else if (src.getUserType() == ApiEventType.RE_CREATE) {
+                result = new ApiEventReCreate(builder);
+            } else if (src.getUserType() == ApiEventType.UNCANCEL) {
+                result = new ApiEventUncancel(builder);
+            }
+        } else {
+            throw new EntitlementError(String.format("Can't figure out event %s", src.getEventType()));
+        }
+        return result;
+    }
+}
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/model/SubscriptionBundleModelDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/model/SubscriptionBundleModelDao.java
new file mode 100644
index 0000000..1f470f2
--- /dev/null
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/model/SubscriptionBundleModelDao.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2010-2012 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.model;
+
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
+import com.ning.billing.entitlement.api.user.SubscriptionBundle;
+import com.ning.billing.entitlement.api.user.SubscriptionBundleData;
+import com.ning.billing.util.entity.EntityBase;
+
+public class SubscriptionBundleModelDao extends EntityBase {
+
+    private final String key;
+    private final UUID accountId;
+    private final DateTime lastSysUpdateDate;
+
+    public SubscriptionBundleModelDao(final UUID id, final String key, final UUID accountId, final DateTime lastSysUpdateDate, final DateTime createdDate, final DateTime updateDate) {
+        super(id, createdDate, updateDate);
+        this.key = key;
+        this.accountId = accountId;
+        this.lastSysUpdateDate = lastSysUpdateDate;
+    }
+
+
+    public SubscriptionBundleModelDao(SubscriptionBundleData input) {
+        this(input.getId(), input.getExternalKey(), input.getAccountId(), input.getLastSysUpdateDate(), input.getCreatedDate(), input.getUpdatedDate());
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public UUID getAccountId() {
+        return accountId;
+    }
+
+    public DateTime getLastSysUpdateDate() {
+        return lastSysUpdateDate;
+    }
+
+    public static SubscriptionBundle toSubscriptionbundle(SubscriptionBundleModelDao src) {
+        if (src == null) {
+            return null;
+        }
+        return new SubscriptionBundleData(src.getId(), src.getKey(), src.getAccountId(), src.getLastSysUpdateDate());
+    }
+}
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/model/SubscriptionModelDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/model/SubscriptionModelDao.java
new file mode 100644
index 0000000..d58021f
--- /dev/null
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/model/SubscriptionModelDao.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2010-2012 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.model;
+
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
+import com.ning.billing.catalog.api.ProductCategory;
+import com.ning.billing.entitlement.api.user.DefaultSubscriptionFactory.SubscriptionBuilder;
+import com.ning.billing.entitlement.api.user.Subscription;
+import com.ning.billing.entitlement.api.user.SubscriptionData;
+import com.ning.billing.util.entity.EntityBase;
+
+public class SubscriptionModelDao extends EntityBase {
+
+    private final UUID bundleId;
+    private final ProductCategory category;
+    private final DateTime startDate;
+    private final DateTime bundleStartDate;
+    private final long activeVersion;
+    private final DateTime chargedThroughDate;
+    private final DateTime paidThroughDate;
+
+    public SubscriptionModelDao(final UUID id, final UUID bundleId, final ProductCategory category, final DateTime startDate, final DateTime bundleStartDate,
+                                final long activeVersion, final DateTime chargedThroughDate, final DateTime paidThroughDate, final DateTime createdDate, final DateTime updateDate) {
+        super(id, createdDate, updateDate);
+        this.bundleId = bundleId;
+        this.category = category;
+        this.startDate = startDate;
+        this.bundleStartDate = bundleStartDate;
+        this.activeVersion = activeVersion;
+        this.chargedThroughDate = chargedThroughDate;
+        this.paidThroughDate = paidThroughDate;
+    }
+
+    public SubscriptionModelDao(final SubscriptionData src) {
+        this(src.getId(), src.getBundleId(), src.getCategory(), src.getAlignStartDate(), src.getBundleStartDate(), src.getActiveVersion(),
+             src.getChargedThroughDate(), src.getPaidThroughDate(), src.getCreatedDate(), src.getUpdatedDate());
+    }
+
+    public UUID getBundleId() {
+        return bundleId;
+    }
+
+    public ProductCategory getCategory() {
+        return category;
+    }
+
+    public DateTime getStartDate() {
+        return startDate;
+    }
+
+    public DateTime getBundleStartDate() {
+        return bundleStartDate;
+    }
+
+    public long getActiveVersion() {
+        return activeVersion;
+    }
+
+    public DateTime getChargedThroughDate() {
+        return chargedThroughDate;
+    }
+
+    public DateTime getPaidThroughDate() {
+        return paidThroughDate;
+    }
+
+    public static Subscription toSubscription(SubscriptionModelDao src) {
+        if (src == null) {
+            return null;
+        }
+        return new SubscriptionData(new SubscriptionBuilder()
+                                            .setId(src.getId())
+                                            .setBundleId(src.getBundleId())
+                                            .setCategory(src.getCategory())
+                                            .setCreatedDate(src.getCreatedDate())
+                                            .setUpdatedDate(src.getUpdatedDate())
+                                            .setBundleStartDate(src.getBundleStartDate())
+                                            .setAlignStartDate(src.getStartDate())
+                                            .setActiveVersion(src.getActiveVersion())
+                                            .setChargedThroughDate(src.getChargedThroughDate())
+                                            .setPaidThroughDate(src.getPaidThroughDate())
+                                            .setCreatedDate(src.getCreatedDate())
+                                            .setUpdatedDate(src.getUpdatedDate()));
+    }
+}
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.java
index e7545eb..aa6793e 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.java
@@ -38,6 +38,7 @@ import com.ning.billing.entitlement.api.user.DefaultSubscriptionFactory.Subscrip
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.SubscriptionData;
 import com.ning.billing.entitlement.engine.dao.SubscriptionSqlDao.SubscriptionMapper;
+import com.ning.billing.entitlement.engine.dao.model.SubscriptionModelDao;
 import com.ning.billing.util.audit.ChangeType;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
@@ -50,19 +51,10 @@ import com.ning.billing.util.entity.dao.EntitySqlDaoStringTemplate;
 
 @EntitySqlDaoStringTemplate
 @RegisterMapper(SubscriptionMapper.class)
-public interface SubscriptionSqlDao extends EntitySqlDao<Subscription> {
-
-    @SqlUpdate
-    @Audited(ChangeType.INSERT)
-    public void insertSubscription(@BindBean SubscriptionData sub,
-                                   @BindBean final InternalCallContext context);
+public interface SubscriptionSqlDao extends EntitySqlDao<SubscriptionModelDao> {
 
     @SqlQuery
-    public Subscription getSubscriptionFromId(@Bind("id") String id,
-                                              @BindBean final InternalTenantContext context);
-
-    @SqlQuery
-    public List<Subscription> getSubscriptionsFromBundleId(@Bind("bundleId") String bundleId,
+    public List<SubscriptionModelDao> getSubscriptionsFromBundleId(@Bind("bundleId") String bundleId,
                                                            @BindBean final InternalTenantContext context);
 
     @SqlUpdate
@@ -83,10 +75,10 @@ public interface SubscriptionSqlDao extends EntitySqlDao<Subscription> {
                                 @BindBean final InternalCallContext context);
 
 
-    public static class SubscriptionMapper extends MapperBase implements ResultSetMapper<Subscription> {
+    public static class SubscriptionMapper extends MapperBase implements ResultSetMapper<SubscriptionModelDao> {
 
         @Override
-        public SubscriptionData map(final int arg0, final ResultSet r, final StatementContext ctx)
+        public SubscriptionModelDao map(final int arg0, final ResultSet r, final StatementContext ctx)
                 throws SQLException {
             final UUID id = UUID.fromString(r.getString("id"));
             final UUID bundleId = UUID.fromString(r.getString("bundle_id"));
@@ -98,17 +90,8 @@ public interface SubscriptionSqlDao extends EntitySqlDao<Subscription> {
             final long activeVersion = r.getLong("active_version");
             final DateTime createdDate = getDateTime(r, "created_date");
             final DateTime updatedDate = getDateTime(r, "updated_date");
-            return new SubscriptionData(new SubscriptionBuilder()
-                                                .setId(id)
-                                                .setBundleId(bundleId)
-                                                .setCategory(category)
-                                                .setCreatedDate(createdDate)
-                                                .setUpdatedDate(updatedDate)
-                                                .setBundleStartDate(bundleStartDate)
-                                                .setAlignStartDate(startDate)
-                                                .setActiveVersion(activeVersion)
-                                                .setChargedThroughDate(ctd)
-                                                .setPaidThroughDate(ptd));
+            return new SubscriptionModelDao(id, bundleId, category, startDate, bundleStartDate, activeVersion, ctd, ptd, createdDate, updatedDate);
+
         }
     }
 }
diff --git a/entitlement/src/main/resources/com/ning/billing/entitlement/ddl.sql b/entitlement/src/main/resources/com/ning/billing/entitlement/ddl.sql
index ee822a9..913c472 100644
--- a/entitlement/src/main/resources/com/ning/billing/entitlement/ddl.sql
+++ b/entitlement/src/main/resources/com/ning/billing/entitlement/ddl.sql
@@ -58,6 +58,10 @@ CREATE TABLE bundles (
     external_key varchar(64) NOT NULL,
     account_id char(36) NOT NULL,
     last_sys_update_date datetime,
+    created_by varchar(50) NOT NULL,
+    created_date datetime NOT NULL,
+    updated_by varchar(50) NOT NULL,
+    updated_date datetime NOT NULL,
     account_record_id int(11) unsigned default null,
     tenant_record_id int(11) unsigned default null,
     PRIMARY KEY(record_id)
diff --git a/entitlement/src/main/resources/com/ning/billing/entitlement/engine/dao/BundleSqlDao.sql.stg b/entitlement/src/main/resources/com/ning/billing/entitlement/engine/dao/BundleSqlDao.sql.stg
index 2ac9ebc..6c0d371 100644
--- a/entitlement/src/main/resources/com/ning/billing/entitlement/engine/dao/BundleSqlDao.sql.stg
+++ b/entitlement/src/main/resources/com/ning/billing/entitlement/engine/dao/BundleSqlDao.sql.stg
@@ -1,58 +1,61 @@
 group BundleSqlDao: EntitySqlDao;
 
+tableName() ::= "bundles"
+
+
 tableFields(prefix) ::= <<
   <prefix>external_key
 , <prefix>account_id
 , <prefix>last_sys_update_date
+, <prefix>created_by
+, <prefix>created_date
+, <prefix>updated_by
+, <prefix>updated_date
 >>
 
 tableValues() ::= <<
   :externalKey
 , :accountId
 , :lastSysUpdateDate
+, :createdBy
+, :createdDate
+, :updatedBy
+, :updatedDate
 >>
 
 updateBundleLastSysTime()  ::= <<
-    update bundles
-    set
-        last_sys_update_date = :lastSysUpdateDate
-    where id = :id
-    <AND_CHECK_TENANT()>
-    ;
->>
-
-getBundleFromId() ::= <<
-    select <fields()>
-    from bundles
-    where
-      id = :id
-    <AND_CHECK_TENANT()>
-    ;
+update <tableName()>
+set
+last_sys_update_date = :lastSysUpdateDate
+where id = :id
+<AND_CHECK_TENANT()>
+;
 >>
 
 getBundlesForKey() ::= <<
-    select <fields()>
-    from bundles
-    where
-      external_key = :externalKey
-    <AND_CHECK_TENANT()>
-    ;
+select <allTableFields()>
+from bundles
+where
+external_key = :externalKey
+<AND_CHECK_TENANT()>
+;
 >>
 
 getBundleFromAccountAndKey() ::= <<
-    select <fields()>
-    from bundles
-    where
-      external_key = :externalKey AND account_id = :accountId
-    <AND_CHECK_TENANT()>
-    ;
+select <allTableFields()>
+from bundles
+where
+external_key = :externalKey
+and account_id = :accountId
+<AND_CHECK_TENANT()>
+;
 >>
 
 getBundleFromAccount() ::= <<
-    select <fields()>
-    from bundles
-    where
-      account_id = :accountId
-    <AND_CHECK_TENANT()>
-    ;
+select <allTableFields()>
+from bundles
+where
+account_id = :accountId
+<AND_CHECK_TENANT()>
+;
 >>
diff --git a/entitlement/src/main/resources/com/ning/billing/entitlement/engine/dao/EntitlementEventSqlDao.sql.stg b/entitlement/src/main/resources/com/ning/billing/entitlement/engine/dao/EntitlementEventSqlDao.sql.stg
index 20b3721..9fd5b30 100644
--- a/entitlement/src/main/resources/com/ning/billing/entitlement/engine/dao/EntitlementEventSqlDao.sql.stg
+++ b/entitlement/src/main/resources/com/ning/billing/entitlement/engine/dao/EntitlementEventSqlDao.sql.stg
@@ -1,5 +1,6 @@
 group EventSqlDao: EntitySqlDao;
 
+tableName() ::= "subscription_events"
 
 tableFields(prefix) ::= <<
   <prefix> event_type
@@ -37,73 +38,64 @@ tableValues() ::= <<
 , :updated_date
 >>
 
-getEventById() ::= <<
-  select record_id, <fields()>
-  from subscription_events
-  where
-      id = :id
-  <AND_CHECK_TENANT()>
-  ;
->>
-
 
 updateVersion() ::= <<
-    update subscription_events
-    set
-      current_version = :currentVersion
-    where
-      id = :id
-    <AND_CHECK_TENANT()>
-    ;
+update <tableName()>
+set
+current_version = :currentVersion
+where
+id = :id
+<AND_CHECK_TENANT()>
+;
 >>
 
 unactiveEvent() ::= <<
-    update subscription_events
-    set
-      is_active = 0
-      , updated_by = :userName
-      , updated_date = :updatedDate
-    where
-      id = :id
-    <AND_CHECK_TENANT()>
-    ;
+update <tableName()>
+set
+is_active = 0
+, updated_by = :userName
+, updated_date = :updatedDate
+where
+id = :id
+<AND_CHECK_TENANT()>
+;
 >>
 
 reactiveEvent() ::= <<
-    update subscription_events
-    set
-      is_active = 1
-      , updated_by = :userName
-      , updated_date = :updatedDate
-    where
-      event_id = :eventId
-    <AND_CHECK_TENANT()>
-    ;
+update <tableName()>
+set
+is_active = 1
+, updated_by = :userName
+, updated_date = :updatedDate
+where
+event_id = :eventId
+<AND_CHECK_TENANT()>
+;
 >>
 
 
 getFutureActiveEventForSubscription() ::= <<
-    select record_id, <fields()>
-    from subscription_events
-    where
-      subscription_id = :subscriptionId
-      and is_active = 1
-      and effective_date > :now
-    <AND_CHECK_TENANT()>
-    order by
-      effective_date asc
-      , record_id asc
-    ;
+select <allTableFields()>
+from <tableName()>
+where
+subscription_id = :subscriptionId
+and is_active = 1
+and effective_date > :now
+<AND_CHECK_TENANT()>
+order by
+effective_date asc
+, record_id asc
+;
 >> 
 
 getEventsForSubscription() ::= <<
-    select record_id, <fields()>
-    from subscription_events
-    where
-      subscription_id = :subscriptionId
-    <AND_CHECK_TENANT()>
-    order by
-      effective_date asc
-      , record_id asc
-    ;      
+select <allTableFields()>
+from <tableName()>
+where
+subscription_id = :subscriptionId
+<AND_CHECK_TENANT()>
+order by
+effective_date asc
+, record_id asc
+;
 >>
diff --git a/entitlement/src/main/resources/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.sql.stg b/entitlement/src/main/resources/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.sql.stg
index 58022e9..8455c9d 100644
--- a/entitlement/src/main/resources/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.sql.stg
+++ b/entitlement/src/main/resources/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.sql.stg
@@ -1,5 +1,6 @@
 group SubscriptionSqlDao: EntitySqlDao;
 
+tableName() ::= "subscriptions"
 
 tableFields(prefix) ::= <<
   <prefix>bundle_id
@@ -31,53 +32,44 @@ tableValues() ::= <<
 
 
 getSubscriptionsFromBundleId() ::= <<
-    select
-      id
-      , bundle_id
-      , category
-      , start_date
-      , bundle_start_date
-      , active_version
-      , charged_through_date
-      , paid_through_date
-      , created_date
-      , updated_date
-    from subscriptions
-    where bundle_id = :bundleId
-    <AND_CHECK_TENANT()>
-    ;
+select
+<allTableFields()>
+from <tableName()>
+where bundle_id = :bundleId
+<AND_CHECK_TENANT()>
+;
 >>
 
 updateChargedThroughDate() ::= <<
-    update subscriptions
-    set
-      charged_through_date = :chargedThroughDate
-      , updated_by = :userName
-      , updated_date = :updatedDate
-    where id = :id
-    <AND_CHECK_TENANT()>
-    ;
+update <tableName()>
+set
+charged_through_date = :chargedThroughDate
+, updated_by = :userName
+, updated_date = :updatedDate
+where id = :id
+<AND_CHECK_TENANT()>
+;
 >>
 
 updateActiveVersion() ::= <<
-    update subscriptions
-    set
-      active_version = :activeVersion
-      , updated_by = :userName
-      , updated_date = :updatedDate
-    where id = :id
-    ;
+update <tableName()>
+set
+active_version = :activeVersion
+, updated_by = :userName
+, updated_date = :updatedDate
+where id = :id
+;
 >>
 
 updateForRepair() ::= <<
-    update subscriptions
-    set
-      active_version = :activeVersion
-      , start_date = :startDate
-      , bundle_start_date = :bundleStartDate
-      , updated_by = :userName
-      , updated_date = :updatedDate
-    where id = :id
-    <AND_CHECK_TENANT()>
-    ;
+update <tableName()>
+set
+active_version = :activeVersion
+, start_date = :startDate
+, bundle_start_date = :bundleStartDate
+, updated_by = :userName
+, updated_date = :updatedDate
+where id = :id
+<AND_CHECK_TENANT()>
+;
 >>
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/transfer/TestTransfer.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/transfer/TestTransfer.java
index f36d904..ec61b63 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/transfer/TestTransfer.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/transfer/TestTransfer.java
@@ -104,7 +104,7 @@ public class TestTransfer extends TestApiBase {
 
             testListener.pushExpectedEvent(NextEvent.TRANSFER);
             testListener.pushExpectedEvent(NextEvent.CANCEL);
-            transferApi.transferBundle(bundle.getAccountId(), newAccountId, bundle.getKey(), transferRequestedDate, false, true, callContext);
+            transferApi.transferBundle(bundle.getAccountId(), newAccountId, bundle.getExternalKey(), transferRequestedDate, false, true, callContext);
             assertTrue(testListener.isCompleted(3000));
 
             final Subscription oldBaseSubscription = entitlementApi.getBaseSubscription(bundle.getId(), callContext);
@@ -142,7 +142,7 @@ public class TestTransfer extends TestApiBase {
 
         testListener.pushExpectedEvent(NextEvent.TRANSFER);
         testListener.pushExpectedEvent(NextEvent.CANCEL);
-        transferApi.transferBundle(bundle.getAccountId(), newAccountId, bundle.getKey(), transferRequestedDate, false, false, callContext);
+        transferApi.transferBundle(bundle.getAccountId(), newAccountId, bundle.getExternalKey(), transferRequestedDate, false, false, callContext);
         assertTrue(testListener.isCompleted(3000));
         final DateTime afterTransferDate = clock.getUTCNow();
 
@@ -153,7 +153,7 @@ public class TestTransfer extends TestApiBase {
         assertTrue(oldBaseSubscription.getEndDate().compareTo(transferRequestedDate) == 0);
 
         // CHECK NEW BUNDLE EXIST, WITH ONE SUBSCRIPTION STARTING ON TRANSFER_DATE
-        final SubscriptionBundle newBundle = entitlementApi.getBundleForAccountAndKey(newAccountId, bundle.getKey(), callContext);
+        final SubscriptionBundle newBundle = entitlementApi.getBundleForAccountAndKey(newAccountId, bundle.getExternalKey(), callContext);
 
         final List<Subscription> subscriptions = entitlementApi.getSubscriptionsForBundle(newBundle.getId(), callContext);
         assertEquals(subscriptions.size(), 1);
@@ -193,7 +193,7 @@ public class TestTransfer extends TestApiBase {
 
         testListener.pushExpectedEvent(NextEvent.TRANSFER);
         final DateTime transferRequestedDate = clock.getUTCNow();
-        transferApi.transferBundle(bundle.getAccountId(), newAccountId, bundle.getKey(), transferRequestedDate, false, false, callContext);
+        transferApi.transferBundle(bundle.getAccountId(), newAccountId, bundle.getExternalKey(), transferRequestedDate, false, false, callContext);
         assertTrue(testListener.isCompleted(3000));
 
         // CHECK OLD BASE IS CANCEL AT THE TRANSFER DATE
@@ -202,7 +202,7 @@ public class TestTransfer extends TestApiBase {
         assertTrue(oldBaseSubscription.getFutureEndDate().compareTo(ctd) == 0);
 
         // CHECK NEW BUNDLE EXIST, WITH ONE SUBSCRIPTION STARTING ON TRANSFER_DATE
-        final SubscriptionBundle newBundle = entitlementApi.getBundleForAccountAndKey(newAccountId, bundle.getKey(), callContext);
+        final SubscriptionBundle newBundle = entitlementApi.getBundleForAccountAndKey(newAccountId, bundle.getExternalKey(), callContext);
 
         final List<Subscription> subscriptions = entitlementApi.getSubscriptionsForBundle(newBundle.getId(), callContext);
         assertEquals(subscriptions.size(), 1);
@@ -241,7 +241,7 @@ public class TestTransfer extends TestApiBase {
         final DateTime transferRequestedDate = clock.getUTCNow();
         testListener.pushExpectedEvent(NextEvent.TRANSFER);
         testListener.pushExpectedEvent(NextEvent.CANCEL);
-        transferApi.transferBundle(bundle.getAccountId(), newAccountId, bundle.getKey(), transferRequestedDate, false, false, callContext);
+        transferApi.transferBundle(bundle.getAccountId(), newAccountId, bundle.getExternalKey(), transferRequestedDate, false, false, callContext);
         assertTrue(testListener.isCompleted(3000));
         final DateTime afterTransferDate = clock.getUTCNow();
 
@@ -252,7 +252,7 @@ public class TestTransfer extends TestApiBase {
         assertTrue(oldBaseSubscription.getEndDate().compareTo(transferRequestedDate) == 0);
 
         // CHECK NEW BUNDLE EXIST, WITH ONE SUBSCRIPTION STARTING ON TRANSFER_DATE
-        final SubscriptionBundle newBundle = entitlementApi.getBundleForAccountAndKey(newAccountId, bundle.getKey(), callContext);
+        final SubscriptionBundle newBundle = entitlementApi.getBundleForAccountAndKey(newAccountId, bundle.getExternalKey(), callContext);
 
         final List<Subscription> subscriptions = entitlementApi.getSubscriptionsForBundle(newBundle.getId(), callContext);
         assertEquals(subscriptions.size(), 1);
@@ -292,7 +292,7 @@ public class TestTransfer extends TestApiBase {
 
         final DateTime transferRequestedDate = clock.getUTCNow();
         testListener.pushExpectedEvent(NextEvent.TRANSFER);
-        transferApi.transferBundle(bundle.getAccountId(), newAccountId, bundle.getKey(), transferRequestedDate, false, false, callContext);
+        transferApi.transferBundle(bundle.getAccountId(), newAccountId, bundle.getExternalKey(), transferRequestedDate, false, false, callContext);
         assertTrue(testListener.isCompleted(3000));
 
         // CHECK OLD BASE IS CANCEL AT THE TRANSFER DATE
@@ -301,7 +301,7 @@ public class TestTransfer extends TestApiBase {
         assertTrue(oldBaseSubscription.getFutureEndDate().compareTo(ctd) == 0);
 
         // CHECK NEW BUNDLE EXIST, WITH ONE SUBSCRIPTION STARTING ON TRANSFER_DATE
-        final SubscriptionBundle newBundle = entitlementApi.getBundleForAccountAndKey(newAccountId, bundle.getKey(), callContext);
+        final SubscriptionBundle newBundle = entitlementApi.getBundleForAccountAndKey(newAccountId, bundle.getExternalKey(), callContext);
 
         final List<Subscription> subscriptions = entitlementApi.getSubscriptionsForBundle(newBundle.getId(), callContext);
         assertEquals(subscriptions.size(), 1);
@@ -387,11 +387,11 @@ public class TestTransfer extends TestApiBase {
 
         final DateTime transferRequestedDate = clock.getUTCNow();
         testListener.pushExpectedEvent(NextEvent.TRANSFER);
-        transferApi.transferBundle(bundle.getAccountId(), newAccountId, bundle.getKey(), transferRequestedDate, true, false, callContext);
+        transferApi.transferBundle(bundle.getAccountId(), newAccountId, bundle.getExternalKey(), transferRequestedDate, true, false, callContext);
         assertTrue(testListener.isCompleted(3000));
 
         // RETRIEVE NEW BUNDLE AND CHECK SUBSCRIPTIONS
-        final SubscriptionBundle newBundle = entitlementApi.getBundleForAccountAndKey(newAccountId, bundle.getKey(), callContext);
+        final SubscriptionBundle newBundle = entitlementApi.getBundleForAccountAndKey(newAccountId, bundle.getExternalKey(), callContext);
         final List<Subscription> subscriptions = entitlementApi.getSubscriptionsForBundle(newBundle.getId(), callContext);
         assertEquals(subscriptions.size(), 3);
         boolean foundBP = false;
@@ -432,7 +432,7 @@ public class TestTransfer extends TestApiBase {
         final UUID finalNewAccountId = UUID.randomUUID();
         final DateTime newTransferRequestedDate = clock.getUTCNow();
         testListener.pushExpectedEvent(NextEvent.TRANSFER);
-        transferApi.transferBundle(newBundle.getAccountId(), finalNewAccountId, newBundle.getKey(), newTransferRequestedDate, true, false, callContext);
+        transferApi.transferBundle(newBundle.getAccountId(), finalNewAccountId, newBundle.getExternalKey(), newTransferRequestedDate, true, false, callContext);
         assertTrue(testListener.isCompleted(3000));
 
     }
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoMemory.java b/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoMemory.java
index 2acd5d5..453d64d 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoMemory.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoMemory.java
@@ -27,7 +27,6 @@ import java.util.TreeSet;
 import java.util.UUID;
 
 import org.joda.time.DateTime;
-import org.skife.jdbi.v2.sqlobject.mixins.Transmogrifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -108,7 +107,7 @@ public class MockEntitlementDaoMemory implements EntitlementDao {
     public List<SubscriptionBundle> getSubscriptionBundlesForKey(final String bundleKey, final InternalTenantContext context) {
         final List<SubscriptionBundle> results = new ArrayList<SubscriptionBundle>();
         for (final SubscriptionBundle cur : bundles) {
-            if (cur.getKey().equals(bundleKey)) {
+            if (cur.getExternalKey().equals(bundleKey)) {
                 results.add(cur);
             }
         }
@@ -128,7 +127,7 @@ public class MockEntitlementDaoMemory implements EntitlementDao {
     @Override
     public SubscriptionBundle getSubscriptionBundleFromAccountAndKey(final UUID accountId, final String bundleKey, final InternalTenantContext context) {
         for (final SubscriptionBundle cur : bundles) {
-            if (cur.getKey().equals(bundleKey) && cur.getAccountId().equals(accountId)) {
+            if (cur.getExternalKey().equals(bundleKey) && cur.getAccountId().equals(accountId)) {
                 return cur;
             }
         }
@@ -160,7 +159,7 @@ public class MockEntitlementDaoMemory implements EntitlementDao {
     public List<Subscription> getSubscriptionsForAccountAndKey(final SubscriptionFactory factory, final UUID accountId, final String bundleKey, final InternalTenantContext context) {
 
         for (final SubscriptionBundle cur : bundles) {
-            if (cur.getKey().equals(bundleKey) && cur.getAccountId().equals(bundleKey)) {
+            if (cur.getExternalKey().equals(bundleKey) && cur.getAccountId().equals(bundleKey)) {
                 return getSubscriptions(factory, cur.getId(), context);
             }
         }
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/BundleJsonNoSubscriptions.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/BundleJsonNoSubscriptions.java
index ded56fe..b9a75a9 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/BundleJsonNoSubscriptions.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/BundleJsonNoSubscriptions.java
@@ -44,7 +44,7 @@ public class BundleJsonNoSubscriptions extends BundleJsonSimple {
     }
 
     public BundleJsonNoSubscriptions(final SubscriptionBundle bundle) {
-        super(bundle.getId().toString(), bundle.getKey(), null);
+        super(bundle.getId().toString(), bundle.getExternalKey(), null);
         this.accountId = bundle.getAccountId().toString();
     }
 
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/BundleResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/BundleResource.java
index 4c3de42..9549904 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/BundleResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/BundleResource.java
@@ -195,7 +195,7 @@ public class BundleResource extends JaxRsResourceBase {
         final CallContext callContext = context.createContext(createdBy, reason, comment, request);
         final SubscriptionBundle bundle = entitlementApi.getBundleFromId(UUID.fromString(id), callContext);
         final DateTime inputDate = (requestedDate != null) ? DATE_TIME_FORMATTER.parseDateTime(requestedDate) : null;
-        final SubscriptionBundle newBundle = transferApi.transferBundle(bundle.getAccountId(), UUID.fromString(json.getAccountId()), bundle.getKey(), inputDate, transferAddOn,
+        final SubscriptionBundle newBundle = transferApi.transferBundle(bundle.getAccountId(), UUID.fromString(json.getAccountId()), bundle.getExternalKey(), inputDate, transferAddOn,
                                                                         cancelImmediatley, callContext);
 
         return uriBuilder.buildResponse(BundleResource.class, "getBundle", newBundle.getId(), uriInfo.getBaseUri().toString());
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleJsonNoSubscriptions.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleJsonNoSubscriptions.java
index d87274a..3702e5b 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleJsonNoSubscriptions.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestBundleJsonNoSubscriptions.java
@@ -52,7 +52,7 @@ public class TestBundleJsonNoSubscriptions extends JaxrsTestSuite {
         final String externalKey = UUID.randomUUID().toString();
         final UUID accountId = UUID.randomUUID();
         Mockito.when(bundle.getId()).thenReturn(bundleId);
-        Mockito.when(bundle.getKey()).thenReturn(externalKey);
+        Mockito.when(bundle.getExternalKey()).thenReturn(externalKey);
         Mockito.when(bundle.getAccountId()).thenReturn(accountId);
 
         final BundleJsonNoSubscriptions bundleJsonNoSubscriptions = new BundleJsonNoSubscriptions(bundle);
diff --git a/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingSubscriptionBundle.java b/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingSubscriptionBundle.java
index b852ac8..c69407e 100644
--- a/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingSubscriptionBundle.java
+++ b/junction/src/main/java/com/ning/billing/junction/plumbing/api/BlockingSubscriptionBundle.java
@@ -60,8 +60,8 @@ public class BlockingSubscriptionBundle implements SubscriptionBundle {
     }
 
     @Override
-    public String getKey() {
-        return subscriptionBundle.getKey();
+    public String getExternalKey() {
+        return subscriptionBundle.getExternalKey();
     }
 
     @Override
diff --git a/junction/src/test/java/com/ning/billing/junction/blocking/TestBlockingChecker.java b/junction/src/test/java/com/ning/billing/junction/blocking/TestBlockingChecker.java
index f3b2856..7607964 100644
--- a/junction/src/test/java/com/ning/billing/junction/blocking/TestBlockingChecker.java
+++ b/junction/src/test/java/com/ning/billing/junction/blocking/TestBlockingChecker.java
@@ -106,7 +106,7 @@ public class TestBlockingChecker extends JunctionTestSuite {
         Mockito.when(bundle.getAccountId()).thenReturn(accountId);
         final UUID bundleId = UUID.randomUUID();
         Mockito.when(bundle.getId()).thenReturn(bundleId);
-        Mockito.when(bundle.getKey()).thenReturn("key");
+        Mockito.when(bundle.getExternalKey()).thenReturn("key");
 
         subscription = Mockito.mock(Subscription.class);
         Mockito.when(subscription.getId()).thenReturn(UUID.randomUUID());
diff --git a/util/src/test/java/com/ning/billing/mock/api/MockEntitlementUserApi.java b/util/src/test/java/com/ning/billing/mock/api/MockEntitlementUserApi.java
index 8a9a6dc..e95dfaa 100644
--- a/util/src/test/java/com/ning/billing/mock/api/MockEntitlementUserApi.java
+++ b/util/src/test/java/com/ning/billing/mock/api/MockEntitlementUserApi.java
@@ -74,7 +74,7 @@ public class MockEntitlementUserApi implements EntitlementUserApi {
             }
 
             @Override
-            public String getKey() {
+            public String getExternalKey() {
                 return key;
             }