killbill-aplcache

Details

diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithEntilementPlugin.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithEntilementPlugin.java
index 698b887..93920a0 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithEntilementPlugin.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithEntilementPlugin.java
@@ -103,7 +103,7 @@ public class TestWithEntilementPlugin extends TestIntegrationBase {
         clock.setDay(new LocalDate(2012, 4, 1));
 
         final List<PlanPhasePriceOverride> overrides = new ArrayList<PlanPhasePriceOverride>();
-        overrides.add(new DefaultPlanPhasePriceOverride("shotgun-monthly-evergreen", account.getCurrency(), null, BigDecimal.TEN));
+        overrides.add(new DefaultPlanPhasePriceOverride("shotgun-monthly-evergreen", account.getCurrency(), null, BigDecimal.TEN, null));
 
         testEntitlementPluginApi.setPlanPhasePriceOverride(overrides);
 
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithPriceOverride.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithPriceOverride.java
index 144514f..b2c1f6b 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithPriceOverride.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithPriceOverride.java
@@ -57,7 +57,7 @@ public class TestWithPriceOverride extends TestIntegrationBase {
         clock.setDay(new LocalDate(2012, 4, 1));
 
         final List<PlanPhasePriceOverride> overrides = new ArrayList<PlanPhasePriceOverride>();
-        overrides.add(new DefaultPlanPhasePriceOverride("shotgun-monthly-trial", account.getCurrency(), BigDecimal.ONE, null));
+        overrides.add(new DefaultPlanPhasePriceOverride("shotgun-monthly-trial", account.getCurrency(), BigDecimal.ONE, null, null));
 
         final DefaultEntitlement bpSubscription = createBaseEntitlementWithPriceOverrideAndCheckForCompletion(account.getId(), "bundleKey", "Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, overrides, NextEvent.CREATE, NextEvent.INVOICE, NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT);
         // Check bundle after BP got created otherwise we get an error from auditApi.
@@ -77,7 +77,7 @@ public class TestWithPriceOverride extends TestIntegrationBase {
         clock.setDay(new LocalDate(2012, 4, 1));
 
         final List<PlanPhasePriceOverride> overrides = new ArrayList<PlanPhasePriceOverride>();
-        overrides.add(new DefaultPlanPhasePriceOverride("shotgun-monthly-evergreen", account.getCurrency(), null, BigDecimal.TEN));
+        overrides.add(new DefaultPlanPhasePriceOverride("shotgun-monthly-evergreen", account.getCurrency(), null, BigDecimal.TEN, null));
 
         final DefaultEntitlement bpSubscription = createBaseEntitlementWithPriceOverrideAndCheckForCompletion(account.getId(), "bundleKey", "Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, overrides, NextEvent.CREATE, NextEvent.INVOICE);
         // Check bundle after BP got created otherwise we get an error from auditApi.
@@ -120,7 +120,7 @@ public class TestWithPriceOverride extends TestIntegrationBase {
         invoiceChecker.checkInvoice(account.getId(), 2, callContext, new ExpectedInvoiceItemCheck(new LocalDate(2012, 5, 1), new LocalDate(2012, 6, 1), InvoiceItemType.RECURRING, new BigDecimal("249.95")));
 
         final List<PlanPhasePriceOverride> overrides = new ArrayList<PlanPhasePriceOverride>();
-        overrides.add(new DefaultPlanPhasePriceOverride("shotgun-monthly-evergreen", account.getCurrency(), null, new BigDecimal("279.95")));
+        overrides.add(new DefaultPlanPhasePriceOverride("shotgun-monthly-evergreen", account.getCurrency(), null, new BigDecimal("279.95"), null));
 
         busHandler.pushExpectedEvents(NextEvent.CHANGE, NextEvent.INVOICE, NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT);
         bpSubscription.changePlanOverrideBillingPolicy("Shotgun", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, overrides, new LocalDate(2012, 5, 1), BillingActionPolicy.IMMEDIATE, ImmutableList.<PluginProperty>of(), callContext);
@@ -167,7 +167,7 @@ public class TestWithPriceOverride extends TestIntegrationBase {
         clock.addDays(4);
 
         final List<PlanPhasePriceOverride> overrides = new ArrayList<PlanPhasePriceOverride>();
-        overrides.add(new DefaultPlanPhasePriceOverride("telescopic-scope-monthly-evergreen", account.getCurrency(), null, new BigDecimal("1200.00")));
+        overrides.add(new DefaultPlanPhasePriceOverride("telescopic-scope-monthly-evergreen", account.getCurrency(), null, new BigDecimal("1200.00"), null));
 
         busHandler.pushExpectedEvents(NextEvent.CHANGE, NextEvent.INVOICE, NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT);
         aoEntitlement.changePlanOverrideBillingPolicy("Telescopic-Scope", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, overrides, new LocalDate(2012, 5, 5), BillingActionPolicy.IMMEDIATE, ImmutableList.<PluginProperty>of(), callContext);
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/dao/DefaultCatalogOverrideDao.java b/catalog/src/main/java/org/killbill/billing/catalog/dao/DefaultCatalogOverrideDao.java
index 6cc7549..3696b2f 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/dao/DefaultCatalogOverrideDao.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/dao/DefaultCatalogOverrideDao.java
@@ -72,15 +72,12 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
             @Override
             public CatalogOverridePlanDefinitionModelDao inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
 
-
-
-
-               final CatalogOverridePhaseDefinitionModelDao[] overridePhaseDefinitionModelDaos = new CatalogOverridePhaseDefinitionModelDao[resolvedOverride.length];
+                final CatalogOverridePhaseDefinitionModelDao[] overridePhaseDefinitionModelDaos = new CatalogOverridePhaseDefinitionModelDao[resolvedOverride.length];
                 for (int i = 0; i < resolvedOverride.length; i++) {
                     final PlanPhasePriceOverride curOverride = resolvedOverride[i];
                     if (curOverride != null) {
                         PlanPhase parentPlanPhase = parentPlan.getAllPhases()[i];
-                        final CatalogOverridePhaseDefinitionModelDao createdOverridePhaseDefinitionModelDao = getOrCreateOverridePhaseDefinitionFromTransaction(parentPlanPhase, curOverride.getPhaseName(), catalogEffectiveDate, curOverride, handle, context);
+                        final CatalogOverridePhaseDefinitionModelDao createdOverridePhaseDefinitionModelDao = getOrCreateOverridePhaseDefinitionFromTransaction(parentPlanPhase, curOverride.getPhaseName(),curOverride.getCurrency(), catalogEffectiveDate, curOverride, handle, context);
                         overridePhaseDefinitionModelDaos[i] = createdOverridePhaseDefinitionModelDao;
                     }
                 }
@@ -106,51 +103,6 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
         });
     }
 
-    @Override
-    public List<CatalogOverridePhaseDefinitionModelDao> getOverriddenPlanPhases(final Long planDefRecordId, final InternalTenantContext context) {
-        return dbi.inTransaction(new TransactionCallback<List<CatalogOverridePhaseDefinitionModelDao>>() {
-            @Override
-            public List<CatalogOverridePhaseDefinitionModelDao> inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
-                final CatalogOverridePhaseDefinitionSqlDao sqlDao = handle.attach(CatalogOverridePhaseDefinitionSqlDao.class);
-                return sqlDao.getOverriddenPlanPhases(planDefRecordId, context);
-            }
-        });
-    }
-
-    @Override
-    public List<CatalogOverrideUsageDefinitionModelDao> getOverriddenPhaseUsages(final Long phaseDefRecordId, final InternalTenantContext context) {
-        return dbi.inTransaction(new TransactionCallback<List<CatalogOverrideUsageDefinitionModelDao>>() {
-            @Override
-            public List<CatalogOverrideUsageDefinitionModelDao> inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
-                final CatalogOverrideUsageDefinitionSqlDao sqlDao = handle.attach(CatalogOverrideUsageDefinitionSqlDao.class);
-                return sqlDao.getOverriddenPhaseUsages(phaseDefRecordId, context);
-            }
-        });
-    }
-
-    @Override
-    public List<CatalogOverrideTierDefinitionModelDao> getOverriddenUsageTiers(final Long usageDefRecordId, final InternalTenantContext context) {
-        return dbi.inTransaction(new TransactionCallback<List<CatalogOverrideTierDefinitionModelDao>>() {
-            @Override
-            public List<CatalogOverrideTierDefinitionModelDao> inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
-                final CatalogOverrideTierDefinitionSqlDao sqlDao = handle.attach(CatalogOverrideTierDefinitionSqlDao.class);
-                return sqlDao.getOverriddenUsageTiers(usageDefRecordId, context);
-            }
-        });
-    }
-
-
-    @Override
-    public List<CatalogOverrideBlockDefinitionModelDao> getOverriddenTierBlocks(final Long tierDefRecordId, final InternalTenantContext context) {
-        return dbi.inTransaction(new TransactionCallback<List<CatalogOverrideBlockDefinitionModelDao>>() {
-            @Override
-            public List<CatalogOverrideBlockDefinitionModelDao> inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
-                final CatalogOverrideBlockDefinitionSqlDao sqlDao = handle.attach(CatalogOverrideBlockDefinitionSqlDao.class);
-                return sqlDao.getOverriddenTierBlocks(tierDefRecordId, context);
-            }
-        });
-    }
-
     private Long getOverridePlanDefinitionFromTransaction(final CatalogOverridePhaseDefinitionModelDao[] overridePhaseDefinitionModelDaos, final Handle inTransactionHandle, final InternalCallContext context) {
         final CatalogOverridePlanPhaseSqlDao sqlDao = inTransactionHandle.attach(CatalogOverridePlanPhaseSqlDao.class);
 
@@ -159,11 +111,7 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
             final CatalogOverridePhaseDefinitionModelDao cur = overridePhaseDefinitionModelDaos[i];
             if (cur != null) {
                 // Each key is the concatenation of the phase_number, phase_definition_record_id
-                final StringBuffer key = new StringBuffer();
-                key.append(i);
-                key.append(",");
-                key.append(cur.getRecordId());
-                keys.add(key.toString());
+                keys.add(getConcatenatedKey(i, cur.getRecordId()).toString());
             }
         }
         return keys.size() > 0 ? sqlDao.getTargetPlanDefinition(keys, keys.size(), context) : null;
@@ -175,74 +123,91 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
         sqlDao.create(modelDao, context);
     }
 
-    private CatalogOverridePhaseDefinitionModelDao getOrCreateOverridePhaseDefinitionFromTransaction(final PlanPhase parentPlanPhase, final String parentPhaseName, final DateTime catalogEffectiveDate, final PlanPhasePriceOverride override, final Handle inTransactionHandle, final InternalCallContext context) {
-            final CatalogOverridePhaseDefinitionSqlDao sqlDao = inTransactionHandle.attach(CatalogOverridePhaseDefinitionSqlDao.class);
-
-             boolean isUsageOverrideNull = true;
-              for (UsagePriceOverride usagePriceOverride: override.getUsagePriceOverrides()) {
-                 if (usagePriceOverride != null) {
-                     isUsageOverrideNull = false;
-                    break;
-                 }
-              }
-
-             if(isUsageOverrideNull) {
-                List<CatalogOverridePhaseDefinitionModelDao> results = sqlDao.getByAttributes(parentPhaseName, override.getCurrency().name(), override.getFixedPrice(), override.getRecurringPrice(), context);
-                for(CatalogOverridePhaseDefinitionModelDao resultPhase : results)
-                if (resultPhase != null && getOverriddenPhaseUsages(resultPhase.getRecordId(), context).size() == 0)
-                    return resultPhase;
-
-                final CatalogOverridePhaseDefinitionModelDao phaseDef = new CatalogOverridePhaseDefinitionModelDao(parentPhaseName, override.getCurrency().name(), override.getFixedPrice(), override.getRecurringPrice(),
-                        catalogEffectiveDate);
-                sqlDao.create(phaseDef, context);
-                final Long recordId = sqlDao.getLastInsertId();
-                CatalogOverridePhaseDefinitionModelDao result = sqlDao.getByRecordId(recordId, context);
-                return result;
-            }
+    private CatalogOverridePhaseDefinitionModelDao getOrCreateOverridePhaseDefinitionFromTransaction(final PlanPhase parentPlanPhase, final String parentPhaseName,final Currency currency, final DateTime catalogEffectiveDate, final PlanPhasePriceOverride override, final Handle inTransactionHandle, final InternalCallContext context) {
+        final CatalogOverridePhaseDefinitionSqlDao sqlDao = inTransactionHandle.attach(CatalogOverridePhaseDefinitionSqlDao.class);
 
-         final CatalogOverrideUsageDefinitionModelDao[] overrideUsageDefinitionModelDaos = new CatalogOverrideUsageDefinitionModelDao[override.getUsagePriceOverrides().size()];
+        if(override.getUsagePriceOverrides() != null && isUsageOverrideListHasOnlyNull(override.getUsagePriceOverrides())) {
+            getOrCreatePhaseDefinitionFromTransactionWithoutUsageOverrides(parentPhaseName, catalogEffectiveDate, override, inTransactionHandle, context);
+        }
+
+        final CatalogOverrideUsageDefinitionModelDao[] overrideUsageDefinitionModelDaos = new CatalogOverrideUsageDefinitionModelDao[override.getUsagePriceOverrides().size()];
         List<UsagePriceOverride> resolvedUsageOverrides = override.getUsagePriceOverrides();
-            for (int i = 0; i < resolvedUsageOverrides.size(); i++) {
-                final UsagePriceOverride curOverride = resolvedUsageOverrides.get(i);
-                if (curOverride != null) {
-                    Usage parentUsage = parentPlanPhase.getUsages()[i];
-                    final CatalogOverrideUsageDefinitionModelDao createdOverrideUsageDefinitionModelDao = getOrCreateOverrideUsageDefinitionFromTransaction(parentUsage, curOverride.getName(), catalogEffectiveDate, curOverride, inTransactionHandle, context);
-                    overrideUsageDefinitionModelDaos[i] = createdOverrideUsageDefinitionModelDao;
-                }
+        for (int i = 0; i < resolvedUsageOverrides.size(); i++) {
+            final UsagePriceOverride curOverride = resolvedUsageOverrides.get(i);
+            if (curOverride != null) {
+                Usage parentUsage = parentPlanPhase.getUsages()[i];
+                final CatalogOverrideUsageDefinitionModelDao createdOverrideUsageDefinitionModelDao = getOrCreateOverrideUsageDefinitionFromTransaction(parentUsage,currency, catalogEffectiveDate, curOverride, inTransactionHandle, context);
+                overrideUsageDefinitionModelDaos[i] = createdOverrideUsageDefinitionModelDao;
             }
+        }
+
+        final List<Long> targetPhaseDefinitionRecordIds = getOverridePhaseDefinitionFromTransaction(overrideUsageDefinitionModelDaos, inTransactionHandle, context);
+        List<CatalogOverridePhaseDefinitionModelDao> results = sqlDao.getByAttributes(parentPhaseName, override.getCurrency().name(), override.getFixedPrice(), override.getRecurringPrice(), context);
 
-              final List<Long> targetPhaseDefinitionRecordIds = getOverridePhaseDefinitionFromTransaction(overrideUsageDefinitionModelDaos, inTransactionHandle, context);
-              List<CatalogOverridePhaseDefinitionModelDao> results = sqlDao.getByAttributes(parentPhaseName, override.getCurrency().name(), override.getFixedPrice(), override.getRecurringPrice(), context);
-        for(CatalogOverridePhaseDefinitionModelDao phase : results)
-        if(targetPhaseDefinitionRecordIds!= null && targetPhaseDefinitionRecordIds.contains(phase.getRecordId()))
-            return phase;
+        for(CatalogOverridePhaseDefinitionModelDao phase : results) {
+            if (targetPhaseDefinitionRecordIds != null && targetPhaseDefinitionRecordIds.contains(phase.getRecordId()))
+                return phase;
+        }
 
         final CatalogOverridePhaseDefinitionModelDao inputPhaseDef = new CatalogOverridePhaseDefinitionModelDao(parentPhaseName, override.getCurrency().name(), override.getFixedPrice(), override.getRecurringPrice(),
                 catalogEffectiveDate);
-                sqlDao.create(inputPhaseDef, context);
-               final Long recordId = sqlDao.getLastInsertId();
-                final CatalogOverridePhaseDefinitionModelDao resultPhaseDef = sqlDao.getByRecordId(recordId, context);
+        sqlDao.create(inputPhaseDef, context);
+        final Long recordId = sqlDao.getLastInsertId();
+        final CatalogOverridePhaseDefinitionModelDao resultPhaseDef = sqlDao.getByRecordId(recordId, context);
 
-                for (short i = 0; i < overrideUsageDefinitionModelDaos.length; i++) {
-                    if (overrideUsageDefinitionModelDaos[i] != null) {
-                        createCatalogOverridePhaseUsageFromTransaction(i, overrideUsageDefinitionModelDaos[i], resultPhaseDef, inTransactionHandle, context);
-                    }
-                }
-                return resultPhaseDef;
+        for (short i = 0; i < overrideUsageDefinitionModelDaos.length; i++) {
+            if (overrideUsageDefinitionModelDaos[i] != null) {
+                createCatalogOverridePhaseUsageFromTransaction(i, overrideUsageDefinitionModelDaos[i], resultPhaseDef, inTransactionHandle, context);
+            }
+        }
+        return resultPhaseDef;
+    }
+
+    private CatalogOverridePhaseDefinitionModelDao getOrCreatePhaseDefinitionFromTransactionWithoutUsageOverrides(String parentPhaseName,final DateTime catalogEffectiveDate, final PlanPhasePriceOverride override, final Handle inTransactionHandle, final InternalCallContext context) {
+
+        final CatalogOverridePhaseDefinitionSqlDao sqlDao = inTransactionHandle.attach(CatalogOverridePhaseDefinitionSqlDao.class);
+        List<CatalogOverridePhaseDefinitionModelDao> resultPhases = sqlDao.getByAttributes(parentPhaseName, override.getCurrency().name(), override.getFixedPrice(), override.getRecurringPrice(), context);
+        for(CatalogOverridePhaseDefinitionModelDao resultPhase : resultPhases)
+            if (resultPhase != null && getOverriddenPhaseUsages(resultPhase.getRecordId(), context).size() == 0)
+                return resultPhase;
+
+        final CatalogOverridePhaseDefinitionModelDao phaseDef = new CatalogOverridePhaseDefinitionModelDao(parentPhaseName, override.getCurrency().name(), override.getFixedPrice(), override.getRecurringPrice(),
+                catalogEffectiveDate);
+        sqlDao.create(phaseDef, context);
+        final Long recordId = sqlDao.getLastInsertId();
+        return sqlDao.getByRecordId(recordId, context);
+    }
+
+    private List<Long> getOverridePhaseDefinitionFromTransaction(final CatalogOverrideUsageDefinitionModelDao[] overrideUsageDefinitionModelDaos, final Handle inTransactionHandle, final InternalCallContext context) {
+        final CatalogOverridePhaseUsageSqlDao sqlDao = inTransactionHandle.attach(CatalogOverridePhaseUsageSqlDao.class);
+
+        final List<String> keys = new ArrayList<String>();
+        for (int i = 0; i < overrideUsageDefinitionModelDaos.length; i++) {
+            final CatalogOverrideUsageDefinitionModelDao cur = overrideUsageDefinitionModelDaos[i];
+            // Each key is the concatenation of the usage_number, usage_definition_record_id
+            if (cur != null) {
+                keys.add(getConcatenatedKey(i, cur.getRecordId()).toString());
+            }
+        }
+        return keys.size() > 0 ? sqlDao.getTargetPhaseDefinition(keys, keys.size(), context) : null;
     }
 
+    private void createCatalogOverridePhaseUsageFromTransaction(final short usageNum, final CatalogOverrideUsageDefinitionModelDao usageDef, final CatalogOverridePhaseDefinitionModelDao phaseDef, final Handle inTransactionHandle, final InternalCallContext context) {
+        final CatalogOverridePhaseUsageSqlDao sqlDao = inTransactionHandle.attach(CatalogOverridePhaseUsageSqlDao.class);
+        final CatalogOverridePhaseUsageModelDao modelDao = new CatalogOverridePhaseUsageModelDao(usageNum, usageDef.getRecordId(), phaseDef.getRecordId());
+        sqlDao.create(modelDao, context);
+    }
 
-    private CatalogOverrideUsageDefinitionModelDao getOrCreateOverrideUsageDefinitionFromTransaction(final Usage parentUsage, final String parentUsageName, final DateTime catalogEffectiveDate, final UsagePriceOverride override, final Handle inTransactionHandle, final InternalCallContext context){
+    private CatalogOverrideUsageDefinitionModelDao getOrCreateOverrideUsageDefinitionFromTransaction(final Usage parentUsage, Currency currency, final DateTime catalogEffectiveDate, final UsagePriceOverride override, final Handle inTransactionHandle, final InternalCallContext context){
 
         final List<TierPriceOverride> resolvedTierOverrides = override.getTierPriceOverrides();
-        int index = 0;
 
         final CatalogOverrideTierDefinitionModelDao[] overrideTierDefinitionModelDaos = new CatalogOverrideTierDefinitionModelDao[resolvedTierOverrides.size()];
         for (int i = 0; i < resolvedTierOverrides.size(); i++) {
             final TierPriceOverride curOverride = resolvedTierOverrides.get(i);
             if (curOverride != null) {
                 Tier parentTier = parentUsage.getTiers()[i];
-                final CatalogOverrideTierDefinitionModelDao createdOverrideTierDefinitionModelDao = getOrCreateOverrideTierDefinitionFromTransaction(parentTier, curOverride,catalogEffectiveDate, inTransactionHandle, context);
+                final CatalogOverrideTierDefinitionModelDao createdOverrideTierDefinitionModelDao = getOrCreateOverrideTierDefinitionFromTransaction(parentTier, curOverride, currency, catalogEffectiveDate, inTransactionHandle, context);
                 overrideTierDefinitionModelDaos[i] = createdOverrideTierDefinitionModelDao;
             }
         }
@@ -253,7 +218,7 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
             return sqlDao.getByRecordId(targetUsageDefinitionRecordId, context);
         }
 
-        final CatalogOverrideUsageDefinitionModelDao inputUsageDef = new CatalogOverrideUsageDefinitionModelDao(parentUsage.getName(), parentUsage.getUsageType().name(), "USD", null, null, catalogEffectiveDate);
+        final CatalogOverrideUsageDefinitionModelDao inputUsageDef = new CatalogOverrideUsageDefinitionModelDao(parentUsage.getName(), parentUsage.getUsageType().name(), currency.name(), null, null, catalogEffectiveDate);
         sqlDao.create(inputUsageDef, context);
         final Long recordId = sqlDao.getLastInsertId();
         final CatalogOverrideUsageDefinitionModelDao resultUsageDef = sqlDao.getByRecordId(recordId, context);
@@ -266,7 +231,27 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
         return resultUsageDef;
     }
 
-    private CatalogOverrideTierDefinitionModelDao getOrCreateOverrideTierDefinitionFromTransaction(final Tier parentTier, final TierPriceOverride tierPriceOverride, final DateTime catalogEffectiveDate,  final Handle inTransactionHandle, final InternalCallContext context){
+    private Long getOverrideUsageDefinitionFromTransaction(final CatalogOverrideTierDefinitionModelDao[] overrideTierDefinitionModelDaos, final Handle inTransactionHandle, final InternalCallContext context) {
+        final CatalogOverrideUsageTierSqlDao sqlDao = inTransactionHandle.attach(CatalogOverrideUsageTierSqlDao.class);
+
+        final List<String> keys = new ArrayList<String>();
+        for (int i = 0; i < overrideTierDefinitionModelDaos.length; i++) {
+            final CatalogOverrideTierDefinitionModelDao cur = overrideTierDefinitionModelDaos[i];
+            if (cur != null) {
+                // Each key is the concatenation of the tier_number, tier_definition_record_id
+                keys.add(getConcatenatedKey(i, cur.getRecordId()).toString());
+            }
+        }
+        return keys.size() > 0 ? sqlDao.getTargetUsageDefinition(keys, keys.size(), context) : null;
+    }
+
+    private void createCatalogOverrideUsageTierFromTransaction(final short tierNum, final CatalogOverrideTierDefinitionModelDao tierDef, final CatalogOverrideUsageDefinitionModelDao usageDef, final Handle inTransactionHandle, final InternalCallContext context) {
+        final CatalogOverrideUsageTierSqlDao sqlDao = inTransactionHandle.attach(CatalogOverrideUsageTierSqlDao.class);
+        final CatalogOverrideUsageTierModelDao modelDao = new CatalogOverrideUsageTierModelDao(tierNum, tierDef.getRecordId(), usageDef.getRecordId());
+        sqlDao.create(modelDao, context);
+    }
+
+    private CatalogOverrideTierDefinitionModelDao getOrCreateOverrideTierDefinitionFromTransaction(final Tier parentTier, final TierPriceOverride tierPriceOverride,Currency currency, final DateTime catalogEffectiveDate,  final Handle inTransactionHandle, final InternalCallContext context){
 
         final List<TieredBlockPriceOverride> resolvedTierBlockOverrides =  tierPriceOverride.getTieredBlockPriceOverrides();
 
@@ -274,7 +259,7 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
         for (int i = 0; i < resolvedTierBlockOverrides.size(); i++) {
             final TieredBlockPriceOverride curOverride = resolvedTierBlockOverrides.get(i);
             if (curOverride != null) {
-                final CatalogOverrideBlockDefinitionModelDao createdOverrideBlockDefinitionModelDao = getOrCreateOverriddenBlockDefinitionFromTransaction(curOverride,catalogEffectiveDate,"USD", inTransactionHandle, context);
+                final CatalogOverrideBlockDefinitionModelDao createdOverrideBlockDefinitionModelDao = getOrCreateOverriddenBlockDefinitionFromTransaction(curOverride,catalogEffectiveDate, currency.name(), inTransactionHandle, context);
                 overrideBlockDefinitionModelDaos[i] = createdOverrideBlockDefinitionModelDao;
             }
         }
@@ -285,7 +270,7 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
             return sqlDao.getByRecordId(targetTierDefinitionRecordId, context);
         }
 
-        final CatalogOverrideTierDefinitionModelDao inputTierDef = new CatalogOverrideTierDefinitionModelDao("USD", null, null, catalogEffectiveDate);
+        final CatalogOverrideTierDefinitionModelDao inputTierDef = new CatalogOverrideTierDefinitionModelDao(currency.name(), null, null, catalogEffectiveDate);
         sqlDao.create(inputTierDef, context);
         final Long recordId = sqlDao.getLastInsertId();
         final CatalogOverrideTierDefinitionModelDao resultTierDef = sqlDao.getByRecordId(recordId, context);
@@ -299,6 +284,12 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
 
     }
 
+    private void createCatalogOverrideTierBlockFromTransaction(final short blockNum, final CatalogOverrideBlockDefinitionModelDao blockDef, final CatalogOverrideTierDefinitionModelDao tierDef, final Handle inTransactionHandle, final InternalCallContext context) {
+        final CatalogOverrideTierBlockSqlDao sqlDao = inTransactionHandle.attach(CatalogOverrideTierBlockSqlDao.class);
+        final CatalogOverrideTierBlockModelDao modelDao = new CatalogOverrideTierBlockModelDao(blockNum, blockDef.getRecordId(), tierDef.getRecordId());
+        sqlDao.create(modelDao, context);
+    }
+
     private Long getOverrideTierDefinitionFromTransaction(final CatalogOverrideBlockDefinitionModelDao[] overrideBlockDefinitionModelDaos, final Handle inTransactionHandle, final InternalCallContext context) {
         final CatalogOverrideTierBlockSqlDao sqlDao = inTransactionHandle.attach(CatalogOverrideTierBlockSqlDao.class);
 
@@ -307,86 +298,86 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
             final CatalogOverrideBlockDefinitionModelDao cur = overrideBlockDefinitionModelDaos[i];
             if (cur != null) {
                 // Each key is the concatenation of the block_number, block_definition_record_id
-                final StringBuffer key = new StringBuffer();
-                key.append(i);
-                key.append(",");
-                key.append(cur.getRecordId());
-                keys.add(key.toString());
+                keys.add(getConcatenatedKey(i, cur.getRecordId()).toString());
             }
         }
         return keys.size() > 0 ? sqlDao.getTargetTierDefinition(keys, keys.size(), context) : null;
     }
 
-    private void createCatalogOverrideTierBlockFromTransaction(final short blockNum, final CatalogOverrideBlockDefinitionModelDao blockDef, final CatalogOverrideTierDefinitionModelDao tierDef, final Handle inTransactionHandle, final InternalCallContext context) {
-        final CatalogOverrideTierBlockSqlDao sqlDao = inTransactionHandle.attach(CatalogOverrideTierBlockSqlDao.class);
-        final CatalogOverrideTierBlockModelDao modelDao = new CatalogOverrideTierBlockModelDao(blockNum, blockDef.getRecordId(), tierDef.getRecordId());
-        sqlDao.create(modelDao, context);
-    }
-
-
-    private Long getOverrideUsageDefinitionFromTransaction(final CatalogOverrideTierDefinitionModelDao[] overrideTierDefinitionModelDaos, final Handle inTransactionHandle, final InternalCallContext context) {
-        final CatalogOverrideUsageTierSqlDao sqlDao = inTransactionHandle.attach(CatalogOverrideUsageTierSqlDao.class);
+    private CatalogOverrideBlockDefinitionModelDao getOrCreateOverriddenBlockDefinitionFromTransaction(TieredBlockPriceOverride tieredBlockPriceOverride,final DateTime catalogEffectiveDate, String currency, final Handle inTransactionHandle, final InternalCallContext context)
+    {
+        final CatalogOverrideBlockDefinitionSqlDao sqlDao = inTransactionHandle.attach(CatalogOverrideBlockDefinitionSqlDao.class);
 
-        final List<String> keys = new ArrayList<String>();
-        for (int i = 0; i < overrideTierDefinitionModelDaos.length; i++) {
-            final CatalogOverrideTierDefinitionModelDao cur = overrideTierDefinitionModelDaos[i];
-            if (cur != null) {
-                // Each key is the concatenation of the tier_number, tier_definition_record_id
-                final StringBuffer key = new StringBuffer();
-                key.append(i);
-                key.append(",").append(cur.getRecordId());
-                keys.add(key.toString());
-            }
+        CatalogOverrideBlockDefinitionModelDao result = sqlDao.getByAttributes(tieredBlockPriceOverride.getUnitName(),
+                currency, tieredBlockPriceOverride.getPrice(), tieredBlockPriceOverride.getMax(),
+                tieredBlockPriceOverride.getSize(),context);
+        if (result == null) {
+            final CatalogOverrideBlockDefinitionModelDao blockDef = new CatalogOverrideBlockDefinitionModelDao(tieredBlockPriceOverride.getUnitName(),currency, tieredBlockPriceOverride.getPrice(),
+                    tieredBlockPriceOverride.getSize(),tieredBlockPriceOverride.getMax(), catalogEffectiveDate);
+            sqlDao.create(blockDef, context);
+            final Long recordId = sqlDao.getLastInsertId();
+            result = sqlDao.getByRecordId(recordId, context);
         }
-        return keys.size() > 0 ? sqlDao.getTargetUsageDefinition(keys, keys.size(), context) : null;
+        return result;
     }
 
-    private void createCatalogOverrideUsageTierFromTransaction(final short tierNum, final CatalogOverrideTierDefinitionModelDao tierDef, final CatalogOverrideUsageDefinitionModelDao usageDef, final Handle inTransactionHandle, final InternalCallContext context) {
-        final CatalogOverrideUsageTierSqlDao sqlDao = inTransactionHandle.attach(CatalogOverrideUsageTierSqlDao.class);
-        final CatalogOverrideUsageTierModelDao modelDao = new CatalogOverrideUsageTierModelDao(tierNum, tierDef.getRecordId(), usageDef.getRecordId());
-        sqlDao.create(modelDao, context);
+    @Override
+    public List<CatalogOverridePhaseDefinitionModelDao> getOverriddenPlanPhases(final Long planDefRecordId, final InternalTenantContext context) {
+        return dbi.inTransaction(new TransactionCallback<List<CatalogOverridePhaseDefinitionModelDao>>() {
+            @Override
+            public List<CatalogOverridePhaseDefinitionModelDao> inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
+                final CatalogOverridePhaseDefinitionSqlDao sqlDao = handle.attach(CatalogOverridePhaseDefinitionSqlDao.class);
+                return sqlDao.getOverriddenPlanPhases(planDefRecordId, context);
+            }
+        });
     }
 
+    @Override
+    public List<CatalogOverrideUsageDefinitionModelDao> getOverriddenPhaseUsages(final Long phaseDefRecordId, final InternalTenantContext context) {
+        return dbi.inTransaction(new TransactionCallback<List<CatalogOverrideUsageDefinitionModelDao>>() {
+            @Override
+            public List<CatalogOverrideUsageDefinitionModelDao> inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
+                final CatalogOverrideUsageDefinitionSqlDao sqlDao = handle.attach(CatalogOverrideUsageDefinitionSqlDao.class);
+                return sqlDao.getOverriddenPhaseUsages(phaseDefRecordId, context);
+            }
+        });
+    }
 
-    private List<Long> getOverridePhaseDefinitionFromTransaction(final CatalogOverrideUsageDefinitionModelDao[] overrideUsageDefinitionModelDaos, final Handle inTransactionHandle, final InternalCallContext context) {
-        final CatalogOverridePhaseUsageSqlDao sqlDao = inTransactionHandle.attach(CatalogOverridePhaseUsageSqlDao.class);
-
-        final List<String> keys = new ArrayList<String>();
-        for (int i = 0; i < overrideUsageDefinitionModelDaos.length; i++) {
-            final CatalogOverrideUsageDefinitionModelDao cur = overrideUsageDefinitionModelDaos[i];
-            if (cur != null) {
-                 StringBuffer key = new StringBuffer();
-                key.append(i);
-                key.append(",");
-                key.append(cur.getRecordId());
-                keys.add(key.toString());
+    @Override
+    public List<CatalogOverrideTierDefinitionModelDao> getOverriddenUsageTiers(final Long usageDefRecordId, final InternalTenantContext context) {
+        return dbi.inTransaction(new TransactionCallback<List<CatalogOverrideTierDefinitionModelDao>>() {
+            @Override
+            public List<CatalogOverrideTierDefinitionModelDao> inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
+                final CatalogOverrideTierDefinitionSqlDao sqlDao = handle.attach(CatalogOverrideTierDefinitionSqlDao.class);
+                return sqlDao.getOverriddenUsageTiers(usageDefRecordId, context);
             }
-        }
-        return keys.size() > 0 ? sqlDao.getTargetPhaseDefinition(keys, keys.size(), context) : null;
+        });
     }
 
-    private void createCatalogOverridePhaseUsageFromTransaction(final short usageNum, final CatalogOverrideUsageDefinitionModelDao usageDef, final CatalogOverridePhaseDefinitionModelDao phaseDef, final Handle inTransactionHandle, final InternalCallContext context) {
-        final CatalogOverridePhaseUsageSqlDao sqlDao = inTransactionHandle.attach(CatalogOverridePhaseUsageSqlDao.class);
-        final CatalogOverridePhaseUsageModelDao modelDao = new CatalogOverridePhaseUsageModelDao(usageNum, usageDef.getRecordId(), phaseDef.getRecordId());
-        sqlDao.create(modelDao, context);
+    @Override
+    public List<CatalogOverrideBlockDefinitionModelDao> getOverriddenTierBlocks(final Long tierDefRecordId, final InternalTenantContext context) {
+        return dbi.inTransaction(new TransactionCallback<List<CatalogOverrideBlockDefinitionModelDao>>() {
+            @Override
+            public List<CatalogOverrideBlockDefinitionModelDao> inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
+                final CatalogOverrideBlockDefinitionSqlDao sqlDao = handle.attach(CatalogOverrideBlockDefinitionSqlDao.class);
+                return sqlDao.getOverriddenTierBlocks(tierDefRecordId, context);
+            }
+        });
     }
 
-    private CatalogOverrideBlockDefinitionModelDao getOrCreateOverriddenBlockDefinitionFromTransaction(TieredBlockPriceOverride tieredBlockPriceOverride,final DateTime catalogEffectiveDate, String currency, final Handle inTransactionHandle, final InternalCallContext context)
-    {
-        final CatalogOverrideBlockDefinitionSqlDao sqlDao = inTransactionHandle.attach(CatalogOverrideBlockDefinitionSqlDao.class);
 
-        CatalogOverrideBlockDefinitionModelDao result = sqlDao.getByAttributes(tieredBlockPriceOverride.getUnitName(),
-                                                                               currency, tieredBlockPriceOverride.getPrice(), tieredBlockPriceOverride.getMax(),
-                                                                               tieredBlockPriceOverride.getSize(),context);
-       if (result == null) {
-            final CatalogOverrideBlockDefinitionModelDao blockDef = new CatalogOverrideBlockDefinitionModelDao(tieredBlockPriceOverride.getUnitName(),currency, tieredBlockPriceOverride.getPrice(),
-                                                                                                               tieredBlockPriceOverride.getSize(),tieredBlockPriceOverride.getMax(), catalogEffectiveDate);
-            sqlDao.create(blockDef, context);
-            final Long recordId = sqlDao.getLastInsertId();
-            result = sqlDao.getByRecordId(recordId, context);
-        }
-        return result;
+    private boolean isUsageOverrideListHasOnlyNull(List<UsagePriceOverride> usagePriceOverrides) {
+        for (UsagePriceOverride override : usagePriceOverrides)
+            if (override != null) return false;
+        return true;
     }
 
+    private StringBuffer getConcatenatedKey(int index, Long recordId) {
+        final StringBuffer key = new StringBuffer();
+        key.append(index);
+        key.append(",");
+        key.append(recordId);
+        return key;
+    }
 
 }
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/DefaultBlock.java b/catalog/src/main/java/org/killbill/billing/catalog/DefaultBlock.java
index 12c8ab3..112c7c3 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultBlock.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultBlock.java
@@ -91,7 +91,7 @@ public class DefaultBlock extends ValidatingConfig<StandaloneCatalog> implements
     }
 
 
-    public DefaultBlock(final DefaultUnit unit, final Double size,final DefaultInternationalPrice prices, final BigDecimal overriddenPrice, Currency currency) {
+    public DefaultBlock(final DefaultUnit unit, final Double size, final DefaultInternationalPrice prices, final BigDecimal overriddenPrice, Currency currency) {
 
         this.unit = unit;
         this.size = size;
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/DefaultInternationalPrice.java b/catalog/src/main/java/org/killbill/billing/catalog/DefaultInternationalPrice.java
index b5c36d3..7e40cfc 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultInternationalPrice.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultInternationalPrice.java
@@ -62,7 +62,6 @@ public class DefaultInternationalPrice extends ValidatingConfig<StandaloneCatalo
 
     public DefaultInternationalPrice(final DefaultInternationalPrice in, final BigDecimal overriddenPrice, final Currency currency) {
         this.prices = in.getPrices() != null ? new DefaultPrice[in.getPrices().length] : null;
-        // There is a question on whether we keep the other prices that were not overridden or only have one entry for the overridden price on that currency.
         for (int i = 0; i < in.getPrices().length; i++) {
             final DefaultPrice curPrice = (DefaultPrice)  in.getPrices()[i];
             if (curPrice.getCurrency().equals(currency)){
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/DefaultUsage.java b/catalog/src/main/java/org/killbill/billing/catalog/DefaultUsage.java
index 6f39664..2043107 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultUsage.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultUsage.java
@@ -83,6 +83,7 @@ public class DefaultUsage extends ValidatingConfig<StandaloneCatalog> implements
     public DefaultUsage(final Usage in, UsagePriceOverride override, Currency currency) {
               this.name = in.getName();
               this.usageType = in.getUsageType();
+              this.billingPeriod = in.getBillingPeriod();
               this.billingMode = in.getBillingMode();
               this.limits = (DefaultLimit[]) in.getLimits();
               this.blocks = (DefaultBlock[]) in.getBlocks();
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/override/DefaultPriceOverride.java b/catalog/src/main/java/org/killbill/billing/catalog/override/DefaultPriceOverride.java
index 3a0424d..1f7ccdd 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/override/DefaultPriceOverride.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/override/DefaultPriceOverride.java
@@ -99,17 +99,14 @@ public class DefaultPriceOverride implements PriceOverride {
     }
 
 
-    public List<UsagePriceOverride> getResolvedUsageOverrides(Usage[] usages, List<UsagePriceOverride> usagePriceOverrides){
+    public List<UsagePriceOverride> getResolvedUsageOverrides(Usage[] usages, List<UsagePriceOverride> usagePriceOverrides) throws CatalogApiException{
         List<UsagePriceOverride> resolvedUsageOverrides = new ArrayList<UsagePriceOverride>();
-        int index = 0;
+
         for (final Usage curUsage : usages) {
             final UsagePriceOverride curOverride = Iterables.tryFind(usagePriceOverrides, new Predicate<UsagePriceOverride>() {
                 @Override
                 public boolean apply(final UsagePriceOverride input) {
-                    if (input.getName() != null) {
-                        return input.getName().equals(curUsage.getName());
-                    }
-                    return false;
+                    return input.getName() != null && input.getName().equals(curUsage.getName());
                 }
             }).orNull();
               if(curOverride != null)
@@ -117,18 +114,19 @@ public class DefaultPriceOverride implements PriceOverride {
               else
                  resolvedUsageOverrides.add(null);
         }
+
         return resolvedUsageOverrides;
     }
 
-    public List<TierPriceOverride> getResolvedTierOverrides(Tier[] tiers, List<TierPriceOverride> tierPriceOverrides){
+    public List<TierPriceOverride> getResolvedTierOverrides(Tier[] tiers, List<TierPriceOverride> tierPriceOverrides) throws CatalogApiException{
         List<TierPriceOverride> resolvedTierOverrides = new ArrayList<TierPriceOverride>();
-        int index = 0;
+
         for (final Tier curTier : tiers) {
             final TierPriceOverride curOverride = Iterables.tryFind(tierPriceOverrides, new Predicate<TierPriceOverride>() {
                 @Override
                 public boolean apply(final TierPriceOverride input) {
 
-                    if (input.getTieredBlockPriceOverrides() != null)
+                    if (input.getTieredBlockPriceOverrides() != null) {
                         for (TieredBlockPriceOverride blockPriceOverride : input.getTieredBlockPriceOverrides()) {
                             String unitName = blockPriceOverride.getUnitName();
                             Double max = blockPriceOverride.getMax();
@@ -143,12 +141,13 @@ public class DefaultPriceOverride implements PriceOverride {
                                 }
                             }
                         }
+                    }
                     return false;
                 }
             }).orNull();
 
             if(curOverride != null)
-            resolvedTierOverrides.add(new DefaultTierPriceOverride(getResolvedTieredBlockPriceOverrides(curTier.getTieredBlocks(),curOverride.getTieredBlockPriceOverrides())));
+                resolvedTierOverrides.add(new DefaultTierPriceOverride(getResolvedTieredBlockPriceOverrides(curTier.getTieredBlocks(),curOverride.getTieredBlockPriceOverrides())));
             else
                 resolvedTierOverrides.add(null);
         }
@@ -156,19 +155,18 @@ public class DefaultPriceOverride implements PriceOverride {
         return resolvedTierOverrides;
     }
 
-    public List<TieredBlockPriceOverride> getResolvedTieredBlockPriceOverrides(TieredBlock[] tieredBlocks, List<TieredBlockPriceOverride> tieredBlockPriceOverrides){
+    public List<TieredBlockPriceOverride> getResolvedTieredBlockPriceOverrides(TieredBlock[] tieredBlocks, List<TieredBlockPriceOverride> tieredBlockPriceOverrides) throws CatalogApiException {
         List<TieredBlockPriceOverride> resolvedTieredBlockPriceOverrides = new ArrayList<TieredBlockPriceOverride>();
-        int index = 0;
+
         for (final TieredBlock curTieredBlock : tieredBlocks) {
 
             final TieredBlockPriceOverride curOverride = Iterables.tryFind(tieredBlockPriceOverrides, new Predicate<TieredBlockPriceOverride>() {
                 @Override
                 public boolean apply(final TieredBlockPriceOverride input) {
-                    if (input.getUnitName() != null  && input.getSize()!=null && input.getMax()!=null) {
-
-                        return (input.getUnitName().equals(curTieredBlock.getUnit().getName()) && Double.compare(input.getSize(),curTieredBlock.getSize())==0 && Double.compare(input.getMax(),curTieredBlock.getMax())==0);
-                    }
-                    return false;
+                    return input.getUnitName() != null && input.getSize() != null && input.getMax() != null &&
+                            (input.getUnitName().equals(curTieredBlock.getUnit().getName()) &&
+                             Double.compare(input.getSize(), curTieredBlock.getSize()) == 0 &&
+                             Double.compare(input.getMax(), curTieredBlock.getMax()) == 0);
                 }
             }).orNull();
 
@@ -179,7 +177,19 @@ public class DefaultPriceOverride implements PriceOverride {
                 resolvedTieredBlockPriceOverrides.add(null);
         }
 
-      return resolvedTieredBlockPriceOverrides;
+        for (int i = 0; i < resolvedTieredBlockPriceOverrides.size(); i++) {
+            final TieredBlockPriceOverride curOverride = resolvedTieredBlockPriceOverrides.get(i);
+            if (curOverride != null) {
+                final DefaultTieredBlock curTieredBlock = (DefaultTieredBlock)tieredBlocks[i];
+
+                if (curTieredBlock.getPrice() == null && curOverride.getPrice() != null) {
+                    final String error = String.format("There is no existing price for the tiered block %s", curTieredBlock.getUnit().getName());
+                    throw new CatalogApiException(ErrorCode.CAT_INVALID_INVALID_UNIT_PRICE_OVERRIDE, curTieredBlock.getUnit().getName() , error);
+                }
+            }
+        }
+
+        return resolvedTieredBlockPriceOverrides;
     }
 
 
diff --git a/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideTierDefinitionSqlDao.sql.stg b/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideTierDefinitionSqlDao.sql.stg
index 316e1dc..c9582cc 100644
--- a/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideTierDefinitionSqlDao.sql.stg
+++ b/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideTierDefinitionSqlDao.sql.stg
@@ -8,6 +8,7 @@ tableFields(prefix) ::= <<
 , <prefix>effective_date
 , <prefix>created_date
 , <prefix>created_by
+, <prefix>currency
 , <prefix>tenant_record_id
 >>
 
@@ -23,6 +24,7 @@ tableValues() ::= <<
 , :effectiveDate
 , :createdDate
 , :createdBy
+, :currency
 , :tenantRecordId
 >>
 
diff --git a/catalog/src/main/resources/org/killbill/billing/catalog/ddl.sql b/catalog/src/main/resources/org/killbill/billing/catalog/ddl.sql
index 8b5aa8e..aa2c415 100644
--- a/catalog/src/main/resources/org/killbill/billing/catalog/ddl.sql
+++ b/catalog/src/main/resources/org/killbill/billing/catalog/ddl.sql
@@ -42,12 +42,78 @@ CREATE TABLE catalog_override_plan_phase (
 ) /*! CHARACTER SET utf8 COLLATE utf8_bin */;
 CREATE INDEX catalog_override_plan_phase_idx ON catalog_override_plan_phase(tenant_record_id, phase_number, phase_def_record_id);
 
+DROP TABLE IF EXISTS catalog_override_usage_definition;
+create table catalog_override_usage_definition
+(
+record_id serial unique,
+parent_usage_name varchar(255) NOT NULL,
+type varchar(255) NOT NULL,
+fixed_price decimal(15,9) NULL,
+recurring_price decimal(15,9) NULL,
+currency varchar(3) NOT NULL,
+effective_date datetime NOT NULL,
+created_date datetime NOT NULL,
+created_by varchar(50) NOT NULL,
+tenant_record_id bigint /*! unsigned */ not null default 0,
+PRIMARY KEY(record_id)
+);
+CREATE INDEX catalog_override_usage_definition_idx ON catalog_override_usage_definition(tenant_record_id, parent_usage_name, currency);
+
+
+DROP TABLE IF EXISTS catalog_override_tier_definition;
+create table catalog_override_tier_definition
+(
+record_id serial unique,
+fixed_price decimal(15,9) NULL,
+recurring_price decimal(15,9) NULL,
+currency varchar(3) NOT NULL,
+effective_date datetime NOT NULL,
+created_date datetime NOT NULL,
+created_by varchar(50) NOT NULL,
+tenant_record_id bigint /*! unsigned */ not null default 0,
+PRIMARY KEY(record_id)
+);
+CREATE INDEX catalog_override_tier_definition_idx ON catalog_override_usage_definition(tenant_record_id, currency);
+
+DROP TABLE IF EXISTS catalog_override_block_definition;
+create table catalog_override_block_definition
+(
+record_id serial unique,
+parent_unit_name varchar(255) NOT NULL,
+size double NOT NULL,
+max double NULL,
+currency varchar(3) NOT NULL,
+price decimal(15,9) NOT NULL,
+effective_date datetime NOT NULL,
+created_date datetime NOT NULL,
+created_by varchar(50) NOT NULL,
+tenant_record_id bigint /*! unsigned */ not null default 0,
+PRIMARY KEY(record_id)
+);
+CREATE INDEX catalog_override_block_definition_idx ON catalog_override_block_definition(tenant_record_id, parent_unit_name, currency);
+
+
+DROP TABLE IF EXISTS catalog_override_phase_usage;
+create table catalog_override_phase_usage
+(
+record_id serial unique,
+usage_number smallint(5) unsigned,
+usage_def_record_id  bigint /*! unsigned */ not null,
+target_phase_def_record_id bigint /*! unsigned */ not null,
+created_date datetime NOT NULL,
+created_by varchar(50) NOT NULL,
+tenant_record_id bigint /*! unsigned */ not null default 0,
+PRIMARY KEY(record_id)
+);
+CREATE INDEX catalog_override_phase_usage_idx ON catalog_override_phase_usage(tenant_record_id, usage_number, usage_def_record_id);
+
+
 DROP TABLE IF EXISTS catalog_override_usage_tier;
 create table catalog_override_usage_tier
 (
 
 record_id serial unique,
-tier_number smallint(5) /*! unsigned */ unsigned,
+tier_number smallint(5) unsigned,
 tier_def_record_id bigint /*! unsigned */ not null,
 target_usage_def_record_id bigint /*! unsigned */ not null,
 created_date datetime NOT NULL,
@@ -56,3 +122,20 @@ tenant_record_id bigint /*! unsigned */ not null default 0,
 PRIMARY KEY(record_id)
 );
 CREATE INDEX catalog_override_usage_tier_idx ON catalog_override_usage_tier(tenant_record_id, tier_number, tier_def_record_id);
+
+
+DROP TABLE IF EXISTS catalog_override_tier_block;
+create table catalog_override_tier_block
+(
+block_number smallint(5) unsigned,
+record_id serial unique,
+block_def_record_id bigint /*! unsigned */ not null,
+target_tier_def_record_id bigint /*! unsigned */ not null,
+created_date datetime NOT NULL,
+created_by varchar(50) NOT NULL,
+tenant_record_id bigint /*! unsigned */ NOT NULL default 0,
+PRIMARY KEY(record_id)
+);
+CREATE INDEX catalog_override_tier_block_idx ON catalog_override_tier_block(tenant_record_id, block_number, block_def_record_id);
+
+
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideDao.java b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideDao.java
index cbff820..348af33 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideDao.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverrideDao.java
@@ -45,8 +45,8 @@ public class TestCatalogOverrideDao extends CatalogTestSuiteWithEmbeddedDB {
 
         final PlanPhasePriceOverride[] resolvedOverrides = new PlanPhasePriceOverride[plan.getAllPhases().length];
         resolvedOverrides[0] = null;
-        resolvedOverrides[1] = new DefaultPlanPhasePriceOverride(plan.getFinalPhase().getName(), Currency.USD, null, new BigDecimal("128.76"));
-        final CatalogOverridePlanDefinitionModelDao newPlan = catalogOverrideDao.getOrCreateOverridePlanDefinition(plan.getName(), new DateTime(catalog.getEffectiveDate()), resolvedOverrides, internalCallContext);
+        resolvedOverrides[1] = new DefaultPlanPhasePriceOverride(plan.getFinalPhase().getName(), Currency.USD, null, new BigDecimal("128.76"), null);
+        final CatalogOverridePlanDefinitionModelDao newPlan = catalogOverrideDao.getOrCreateOverridePlanDefinition(plan, new DateTime(catalog.getEffectiveDate()), resolvedOverrides, internalCallContext);
         assertEquals(newPlan.getParentPlanName(), "standard-monthly");
         assertTrue(newPlan.getIsActive());
     }
@@ -58,15 +58,29 @@ public class TestCatalogOverrideDao extends CatalogTestSuiteWithEmbeddedDB {
         final Plan plan = catalog.findCurrentPlan("discount-standard-monthly");
 
         final PlanPhasePriceOverride[] resolvedOverrides = new PlanPhasePriceOverride[plan.getAllPhases().length];
-        resolvedOverrides[0] = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, BigDecimal.TEN, null);
+        resolvedOverrides[0] = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, BigDecimal.TEN, null, null);
         resolvedOverrides[1] = null;
-        resolvedOverrides[2] = new DefaultPlanPhasePriceOverride(plan.getFinalPhase().getName(), Currency.USD, null, new BigDecimal("348.64"));
-        final CatalogOverridePlanDefinitionModelDao newPlan = catalogOverrideDao.getOrCreateOverridePlanDefinition(plan.getName(), new DateTime(catalog.getEffectiveDate()), resolvedOverrides, internalCallContext);
+        resolvedOverrides[2] = new DefaultPlanPhasePriceOverride(plan.getFinalPhase().getName(), Currency.USD, null, new BigDecimal("348.64"), null);
+        final CatalogOverridePlanDefinitionModelDao newPlan = catalogOverrideDao.getOrCreateOverridePlanDefinition(plan, new DateTime(catalog.getEffectiveDate()), resolvedOverrides, internalCallContext);
+
+        final PlanPhasePriceOverride[] resolvedOverrides1 = new PlanPhasePriceOverride[plan.getAllPhases().length];
+        resolvedOverrides1[0] = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, BigDecimal.TEN, null, null);
+        resolvedOverrides1[1] = null;
+        resolvedOverrides1[2] = null;
+        final CatalogOverridePlanDefinitionModelDao newPlan1 = catalogOverrideDao.getOrCreateOverridePlanDefinition(plan, new DateTime(catalog.getEffectiveDate()), resolvedOverrides1, internalCallContext);
+
+
         assertEquals(newPlan.getParentPlanName(), "discount-standard-monthly");
         assertTrue(newPlan.getIsActive());
 
+        assertEquals(newPlan1.getParentPlanName(), "discount-standard-monthly");
+        assertTrue(newPlan1.getIsActive());
+
         final List<CatalogOverridePhaseDefinitionModelDao> phases = catalogOverrideDao.getOverriddenPlanPhases(newPlan.getRecordId(), internalCallContext);
         assertEquals(phases.size(), 2);
+
+        final List<CatalogOverridePhaseDefinitionModelDao> phases1 = catalogOverrideDao.getOverriddenPlanPhases(newPlan1.getRecordId(), internalCallContext);
+        assertEquals(phases1.size(), 1);
     }
 
     @Test(groups = "slow")
@@ -76,11 +90,11 @@ public class TestCatalogOverrideDao extends CatalogTestSuiteWithEmbeddedDB {
         final Plan plan = catalog.findCurrentPlan("discount-standard-monthly");
 
         final PlanPhasePriceOverride[] resolvedOverrides = new PlanPhasePriceOverride[plan.getAllPhases().length];
-        resolvedOverrides[0] = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, BigDecimal.TEN, BigDecimal.ONE);
-        resolvedOverrides[1] = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[1].getName(), Currency.USD, BigDecimal.ONE, BigDecimal.TEN);
-        resolvedOverrides[2] = new DefaultPlanPhasePriceOverride(plan.getFinalPhase().getName(), Currency.USD, BigDecimal.ZERO, new BigDecimal("348.64"));
+        resolvedOverrides[0] = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, BigDecimal.TEN, BigDecimal.ONE, null);
+        resolvedOverrides[1] = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[1].getName(), Currency.USD, BigDecimal.ONE, BigDecimal.TEN, null);
+        resolvedOverrides[2] = new DefaultPlanPhasePriceOverride(plan.getFinalPhase().getName(), Currency.USD, BigDecimal.ZERO, new BigDecimal("348.64"), null);
 
-        final CatalogOverridePlanDefinitionModelDao newPlan = catalogOverrideDao.getOrCreateOverridePlanDefinition(plan.getName(), new DateTime(catalog.getEffectiveDate()), resolvedOverrides, internalCallContext);
+        final CatalogOverridePlanDefinitionModelDao newPlan = catalogOverrideDao.getOrCreateOverridePlanDefinition(plan, new DateTime(catalog.getEffectiveDate()), resolvedOverrides, internalCallContext);
 
         final List<CatalogOverridePhaseDefinitionModelDao> phases = catalogOverrideDao.getOverriddenPlanPhases(newPlan.getRecordId(), internalCallContext);
         assertEquals(phases.size(), 3);
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePhaseDefinitionSqlDao.java b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePhaseDefinitionSqlDao.java
index aa2dc48..6090a65 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePhaseDefinitionSqlDao.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/dao/TestCatalogOverridePhaseDefinitionSqlDao.java
@@ -103,7 +103,7 @@ public class TestCatalogOverridePhaseDefinitionSqlDao extends CatalogTestSuiteWi
             }
 
             private void checkRehydrated(final CatalogOverridePhaseDefinitionModelDao obj, final CatalogOverridePhaseDefinitionSqlDao sqlDao) {
-                final CatalogOverridePhaseDefinitionModelDao rehydrated = sqlDao.getByAttributes(obj.getParentPhaseName(), obj.getCurrency(), obj.getFixedPrice(), obj.getRecurringPrice(), internalCallContext);
+                final CatalogOverridePhaseDefinitionModelDao rehydrated = sqlDao.getByAttributes(obj.getParentPhaseName(), obj.getCurrency(), obj.getFixedPrice(), obj.getRecurringPrice(), internalCallContext).get(0);
                 assertEquals(rehydrated.getParentPhaseName(), obj.getParentPhaseName());
                 if (obj.getFixedPrice() != null) {
                     assertEquals(rehydrated.getFixedPrice().compareTo(obj.getFixedPrice()), 0);
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/TestDefaultPriceOverride.java b/catalog/src/test/java/org/killbill/billing/catalog/TestDefaultPriceOverride.java
index 0af9c4a..2813984 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/TestDefaultPriceOverride.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/TestDefaultPriceOverride.java
@@ -51,9 +51,9 @@ public class TestDefaultPriceOverride extends CatalogTestSuiteWithEmbeddedDB {
         final Plan plan = catalog.findCurrentPlan("discount-standard-monthly");
 
         final List<PlanPhasePriceOverride> overrides = new ArrayList<PlanPhasePriceOverride>();
-        final PlanPhasePriceOverride phase1 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, BigDecimal.ONE, null);
+        final PlanPhasePriceOverride phase1 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, BigDecimal.ONE, null,null);
         overrides.add(phase1);
-        final PlanPhasePriceOverride phase3 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[2].getName(), Currency.USD, null, new BigDecimal("142.41"));
+        final PlanPhasePriceOverride phase3 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[2].getName(), Currency.USD, null, new BigDecimal("142.41"),null);
         overrides.add(phase3);
 
         final DefaultPlan overriddenPlan = priceOverride.getOrCreateOverriddenPlan(plan, new DateTime(catalog.getEffectiveDate()), overrides, internalCallContext);
@@ -104,7 +104,7 @@ public class TestDefaultPriceOverride extends CatalogTestSuiteWithEmbeddedDB {
         final Plan plan = catalog.findCurrentPlan("discount-standard-monthly");
 
         final List<PlanPhasePriceOverride> overrides = new ArrayList<PlanPhasePriceOverride>();
-        final PlanPhasePriceOverride phase1 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, null, BigDecimal.ONE);
+        final PlanPhasePriceOverride phase1 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, null, BigDecimal.ONE,null);
         overrides.add(phase1);
 
         priceOverride.getOrCreateOverriddenPlan(plan, new DateTime(catalog.getEffectiveDate()), overrides, internalCallContext);
@@ -118,9 +118,9 @@ public class TestDefaultPriceOverride extends CatalogTestSuiteWithEmbeddedDB {
         final Plan plan = catalog.findCurrentPlan("discount-standard-monthly");
 
         final List<PlanPhasePriceOverride> overrides = new ArrayList<PlanPhasePriceOverride>();
-        final PlanPhasePriceOverride phase1 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, BigDecimal.ONE, null);
+        final PlanPhasePriceOverride phase1 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, BigDecimal.ONE, null, null);
         overrides.add(phase1);
-        final PlanPhasePriceOverride phase3 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[2].getName(), Currency.USD, null, new BigDecimal("142.41"));
+        final PlanPhasePriceOverride phase3 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[2].getName(), Currency.USD, null, new BigDecimal("142.41"),null);
         overrides.add(phase3);
 
         final DefaultPlan overriddenPlanCreated = priceOverride.getOrCreateOverriddenPlan(plan, new DateTime(catalog.getEffectiveDate()), overrides, internalCallContext);
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PhasePriceOverrideJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PhasePriceOverrideJson.java
index 07053ca..32eb734 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PhasePriceOverrideJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PhasePriceOverrideJson.java
@@ -41,34 +41,34 @@ public class PhasePriceOverrideJson {
     private final String phaseType;
     private final BigDecimal fixedPrice;
     private final BigDecimal recurringPrice;
-    private final List<UsageOverrideJson> usageOverrides;
+    private final List<UsagePriceOverrideJson> usagePriceOverrides;
 
     @JsonCreator
     public PhasePriceOverrideJson(@JsonProperty("phaseName") final String phaseName,
                                   @JsonProperty("phaseType") final String phaseType,
                                   @Nullable @JsonProperty("fixedPrice") final BigDecimal fixedPrice,
                                   @Nullable @JsonProperty("recurringPrice") final BigDecimal recurringPrice,
-                                  @Nullable @JsonProperty("usageOverrides") final List<UsageOverrideJson> usageOverrides) {
+                                  @Nullable @JsonProperty("usageOverrides") final List<UsagePriceOverrideJson> usagePriceOverrides) {
         this.phaseName = phaseName;
         this.phaseType = phaseType;
         this.fixedPrice = fixedPrice;
         this.recurringPrice = recurringPrice;
-        this.usageOverrides = usageOverrides;
+        this.usagePriceOverrides = usagePriceOverrides;
     }
 
     public PhasePriceOverrideJson(final String phaseName,
                                   final String phaseType,
                                   final BigDecimal fixedPrice,
                                   final BigDecimal recurringPrice,
-                                  final Usage[] usageOverrides,
+                                  final Usage[] usagePriceOverrides,
                                   final Currency currency) throws CatalogApiException {
         this.phaseName = phaseName;
         this.phaseType = phaseType;
         this.fixedPrice = fixedPrice;
         this.recurringPrice = recurringPrice;
-        this.usageOverrides = new LinkedList<UsageOverrideJson>();
+        this.usagePriceOverrides = new LinkedList<UsagePriceOverrideJson>();
 
-        for (final Usage usage : usageOverrides) {
+        for (final Usage usage : usagePriceOverrides) {
             List <TierPriceOverrideJson> tierPriceOverridesJson = new LinkedList<TierPriceOverrideJson>();
              for(final Tier tier :usage.getTiers())
              {
@@ -82,8 +82,8 @@ public class PhasePriceOverrideJson {
                      TierPriceOverrideJson tierPriceOverrideJson  = new TierPriceOverrideJson(blockPriceOverridesJson);
                      tierPriceOverridesJson.add(tierPriceOverrideJson);
              }
-            final UsageOverrideJson usageOverrideJson = new UsageOverrideJson(usage.getName(), usage.getUsageType(),usage.getBillingMode(), tierPriceOverridesJson);
-            this.usageOverrides.add(usageOverrideJson);
+            final UsagePriceOverrideJson usagePriceOverrideJson = new UsagePriceOverrideJson(usage.getName(), usage.getUsageType(),usage.getBillingMode(), tierPriceOverridesJson);
+            this.usagePriceOverrides.add(usagePriceOverrideJson);
         }
 
     }
@@ -104,8 +104,8 @@ public class PhasePriceOverrideJson {
         return phaseType;
     }
 
-    public List<UsageOverrideJson> getUsageOverrides() {
-        return usageOverrides;
+    public List<UsagePriceOverrideJson> getUsagePriceOverrides() {
+        return usagePriceOverrides;
     }
 
 
@@ -116,7 +116,7 @@ public class PhasePriceOverrideJson {
                "phaseType='" + phaseType + '\'' +
                ", fixedPrice=" + fixedPrice +
                ", recurringPrice=" + recurringPrice +
-                ", usageOverrides=" + usageOverrides +
+                ", usageOverrides=" + usagePriceOverrides +
                '}';
     }
 
@@ -144,7 +144,7 @@ public class PhasePriceOverrideJson {
         if (recurringPrice != null ? recurringPrice.compareTo(that.recurringPrice) != 0 : that.recurringPrice != null) {
             return false;
         }
-        if (usageOverrides != null ? usageOverrides.equals(that.usageOverrides)  : that.usageOverrides != null) {
+        if (usagePriceOverrides != null ? usagePriceOverrides.equals(that.usagePriceOverrides)  : that.usagePriceOverrides != null) {
             return false;
         }
         return true;
@@ -156,7 +156,7 @@ public class PhasePriceOverrideJson {
         result = 31 * result + (recurringPrice != null ? recurringPrice.hashCode() : 0);
         result = 31 * result + (phaseType != null ? phaseType.hashCode() : 0);
         result = 31 * result + (recurringPrice != null ? recurringPrice.hashCode() : 0);
-        result = 31 * result + (usageOverrides != null ? usageOverrides.hashCode() : 0);
+        result = 31 * result + (usagePriceOverrides != null ? usagePriceOverrides.hashCode() : 0);
         return result;
     }
 
@@ -170,10 +170,10 @@ public class PhasePriceOverrideJson {
             public PlanPhasePriceOverride apply(@Nullable final PhasePriceOverrideJson input) {
 
                 List <UsagePriceOverride> usagePriceOverrides = new LinkedList<UsagePriceOverride>();
-                if(input.getUsageOverrides()!=null) {
-                    for (final UsageOverrideJson usageOverrideJson : input.getUsageOverrides()) {
+                assert input != null;
+                if(input.getUsagePriceOverrides()!=null) {
+                    for (final UsagePriceOverrideJson usageOverrideJson : input.getUsagePriceOverrides()) {
                         List<TierPriceOverride> tierPriceOverrides = new LinkedList<TierPriceOverride>();
-
                         for (final TierPriceOverrideJson tierPriceOverrideJson : usageOverrideJson.getTierPriceOverrides()) {
                             List<TieredBlockPriceOverride> blockPriceOverrides = new LinkedList<TieredBlockPriceOverride>();
                             for (final BlockPriceOverrideJson block : tierPriceOverrideJson.getBlockPriceOverrides()) {
diff --git a/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestEntitlementJsonWithEvents.java b/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestEntitlementJsonWithEvents.java
index 170187f..14e7b6e 100644
--- a/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestEntitlementJsonWithEvents.java
+++ b/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestEntitlementJsonWithEvents.java
@@ -51,8 +51,7 @@ public class TestEntitlementJsonWithEvents extends JaxrsTestSuiteNoDB {
         final DateTime effectiveDate = DefaultClock.toUTCDateTime(new DateTime(DateTimeZone.UTC));
         final UUID eventId = UUID.randomUUID();
         final List<AuditLogJson> auditLogs = createAuditLogsJson(clock.getUTCNow());
-        final List<UsageOverrideJson> usageOverrideJson = new ArrayList<UsageOverrideJson>();
-        usageOverrideJson.add(new UsageOverrideJson("test",null,null,null));
+
         final EventSubscriptionJson newEvent = new EventSubscriptionJson(eventId.toString(),
                                                                          BillingPeriod.NO_BILLING_PERIOD.toString(),
                                                                          requestedDate.toLocalDate(),
@@ -67,7 +66,7 @@ public class TestEntitlementJsonWithEvents extends JaxrsTestSuiteNoDB {
                                                                          PhaseType.DISCOUNT.toString(),
                                                                          auditLogs);
 
-        final PhasePriceOverrideJson priceOverride = new PhasePriceOverrideJson("bar", null, BigDecimal.TEN, BigDecimal.ONE,usageOverrideJson);
+        final PhasePriceOverrideJson priceOverride = new PhasePriceOverrideJson("bar", null, BigDecimal.TEN, BigDecimal.ONE,null);
 
         final SubscriptionJson entitlementJsonWithEvents = new SubscriptionJson(accountId,
                                                                                 bundleId,