killbill-memoizeit

Invoice tests refactoring to use InvoiceTestSuiteWithEmbeddedDB

2/1/2013 9:47:19 PM

Changes

invoice/src/test/java/com/ning/billing/invoice/api/migration/InvoiceApiTestBase.java 180(+0 -180)

invoice/src/test/java/com/ning/billing/invoice/api/migration/MockModuleNoEntitlement.java 51(+0 -51)

invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java 174(+0 -174)

invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleWithEmbeddedDb.java 100(+0 -100)

invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleWithMocks.java 59(+0 -59)

invoice/src/test/java/com/ning/billing/invoice/MockModule.java 114(+0 -114)

invoice/src/test/java/com/ning/billing/invoice/tests/InvoicingTestBase.java 214(+0 -214)

Details

diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/invoice/TestDefaultInvoicePaymentApi.java b/invoice/src/test/java/com/ning/billing/invoice/api/invoice/TestDefaultInvoicePaymentApi.java
index 7d9c2f9..de924b2 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/invoice/TestDefaultInvoicePaymentApi.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/invoice/TestDefaultInvoicePaymentApi.java
@@ -16,17 +16,13 @@
 
 package com.ning.billing.invoice.api.invoice;
 
-import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 
-import org.mockito.Mockito;
-import org.skife.jdbi.v2.IDBI;
 import org.testng.Assert;
-import org.testng.annotations.BeforeSuite;
 import org.testng.annotations.Test;
 
 import com.ning.billing.catalog.api.Currency;
@@ -35,22 +31,6 @@ import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoicePayment;
 import com.ning.billing.invoice.api.InvoicePayment.InvoicePaymentType;
-import com.ning.billing.invoice.api.InvoicePaymentApi;
-import com.ning.billing.invoice.api.svcs.DefaultInvoiceInternalApi;
-import com.ning.billing.invoice.dao.DefaultInvoiceDao;
-import com.ning.billing.invoice.dao.InvoiceDao;
-import com.ning.billing.invoice.dao.InvoiceItemSqlDao;
-import com.ning.billing.invoice.dao.InvoiceSqlDao;
-import com.ning.billing.invoice.notification.MockNextBillingDatePoster;
-import com.ning.billing.invoice.notification.NextBillingDatePoster;
-import com.ning.billing.util.cache.CacheControllerDispatcher;
-import com.ning.billing.util.callcontext.InternalCallContextFactory;
-import com.ning.billing.util.clock.Clock;
-import com.ning.billing.util.clock.ClockMock;
-import com.ning.billing.util.dao.DefaultNonEntityDao;
-import com.ning.billing.util.dao.NonEntityDao;
-import com.ning.billing.util.svcapi.invoice.InvoiceInternalApi;
-import com.ning.billing.util.svcsapi.bus.InternalBus;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -86,7 +66,7 @@ public class TestDefaultInvoicePaymentApi extends InvoiceTestSuiteWithEmbeddedDB
     @Test(groups = "slow")
     public void testFullRefundWithBothInvoiceItemAdjustments() throws Exception {
         // Create an invoice with two items (30 \u20ac and 10 \u20ac)
-        final Invoice invoice = createAndPersistInvoice(invoiceDao,  clock,
+        final Invoice invoice = createAndPersistInvoice(invoiceDao, clock,
                                                         ImmutableList.<BigDecimal>of(THIRTY, BigDecimal.TEN), CURRENCY, internalCallContext);
 
         // Fully adjust both items
@@ -100,7 +80,7 @@ public class TestDefaultInvoicePaymentApi extends InvoiceTestSuiteWithEmbeddedDB
     @Test(groups = "slow")
     public void testPartialRefundWithSingleInvoiceItemAdjustment() throws Exception {
         // Create an invoice with two items (30 \u20ac and 10 \u20ac)
-        final Invoice invoice = createAndPersistInvoice(invoiceDao,  clock,
+        final Invoice invoice = createAndPersistInvoice(invoiceDao, clock,
                                                         ImmutableList.<BigDecimal>of(THIRTY, BigDecimal.TEN), CURRENCY, internalCallContext);
 
         // Fully adjust both items
@@ -113,7 +93,7 @@ public class TestDefaultInvoicePaymentApi extends InvoiceTestSuiteWithEmbeddedDB
     @Test(groups = "slow")
     public void testPartialRefundWithTwoInvoiceItemAdjustment() throws Exception {
         // Create an invoice with two items (30 \u20ac and 10 \u20ac)
-        final Invoice invoice = createAndPersistInvoice(invoiceDao,  clock,
+        final Invoice invoice = createAndPersistInvoice(invoiceDao, clock,
                                                         ImmutableList.<BigDecimal>of(THIRTY, BigDecimal.TEN), CURRENCY, internalCallContext);
         // Adjust partially both items: the invoice posted was 40 \u20ac, but we should really just have charged you 2 \u20ac
         final ImmutableMap<UUID, BigDecimal> adjustments = ImmutableMap.<UUID, BigDecimal>of(invoice.getInvoiceItems().get(0).getId(), new BigDecimal("29"),
@@ -123,7 +103,7 @@ public class TestDefaultInvoicePaymentApi extends InvoiceTestSuiteWithEmbeddedDB
 
     private void verifyRefund(final BigDecimal invoiceAmount, final BigDecimal refundAmount, final BigDecimal finalInvoiceAmount,
                               final boolean adjusted, final Map<UUID, BigDecimal> invoiceItemIdsWithAmounts) throws InvoiceApiException {
-        final Invoice invoice = createAndPersistInvoice(invoiceDao,  clock, invoiceAmount, CURRENCY, internalCallContext);
+        final Invoice invoice = createAndPersistInvoice(invoiceDao, clock, invoiceAmount, CURRENCY, internalCallContext);
         verifyRefund(invoice, invoiceAmount, refundAmount, finalInvoiceAmount, adjusted, invoiceItemIdsWithAmounts);
     }
 
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java b/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
index 6aaa407..c57a359 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
@@ -31,12 +31,13 @@ import org.testng.annotations.Test;
 
 import com.ning.billing.account.api.Account;
 import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.invoice.InvoiceTestSuiteWithEmbeddedDB;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.dao.InvoiceModelDao;
 import com.ning.billing.invoice.dao.InvoiceModelDaoHelper;
 
-public class TestDefaultInvoiceMigrationApi extends InvoiceApiTestBase {
+public class TestDefaultInvoiceMigrationApi extends InvoiceTestSuiteWithEmbeddedDB {
 
     private final Logger log = LoggerFactory.getLogger(TestDefaultInvoiceMigrationApi.class);
 
@@ -51,14 +52,15 @@ public class TestDefaultInvoiceMigrationApi extends InvoiceApiTestBase {
     private static final Currency MIGRATION_INVOICE_CURRENCY = Currency.USD;
 
     @BeforeMethod(groups = "slow")
-    public void setupMethod() throws Exception {
+    public void setupTest() throws Exception {
+        super.setupTest();
         date_migrated = clock.getUTCToday().minusYears(1);
         date_regular = clock.getUTCNow();
 
-        final Account account = createAccount();
+        final Account account = invoiceUtil.createAccount();
         accountId = account.getId();
         migrationInvoiceId = createAndCheckMigrationInvoice(accountId);
-        regularInvoiceId = generateRegularInvoice(account, date_regular);
+        regularInvoiceId = invoiceUtil.generateRegularInvoice(account, date_regular);
     }
 
     private UUID createAndCheckMigrationInvoice(final UUID accountId) throws InvoiceApiException {
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/user/TestDefaultInvoiceUserApi.java b/invoice/src/test/java/com/ning/billing/invoice/api/user/TestDefaultInvoiceUserApi.java
index b576cc3..e50738c 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/user/TestDefaultInvoiceUserApi.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/user/TestDefaultInvoiceUserApi.java
@@ -22,7 +22,6 @@ import java.util.UUID;
 
 import javax.annotation.Nullable;
 
-import org.mockito.Mockito;
 import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
@@ -30,61 +29,53 @@ import org.testng.annotations.Test;
 import com.ning.billing.ErrorCode;
 import com.ning.billing.ObjectType;
 import com.ning.billing.account.api.Account;
+import com.ning.billing.invoice.InvoiceTestSuiteWithEmbeddedDB;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoiceItemType;
-import com.ning.billing.invoice.api.migration.InvoiceApiTestBase;
 import com.ning.billing.invoice.model.InvoicingConfiguration;
 import com.ning.billing.util.api.TagApiException;
-import com.ning.billing.util.callcontext.CallContext;
-import com.ning.billing.util.callcontext.CallOrigin;
-import com.ning.billing.util.callcontext.DefaultCallContextFactory;
-import com.ning.billing.util.callcontext.TenantContext;
-import com.ning.billing.util.callcontext.UserType;
 import com.ning.billing.util.tag.ControlTagType;
 import com.ning.billing.util.tag.Tag;
 
 import static org.testng.Assert.assertEquals;
 
-public class TestDefaultInvoiceUserApi extends InvoiceApiTestBase {
+public class TestDefaultInvoiceUserApi extends InvoiceTestSuiteWithEmbeddedDB {
 
     private UUID accountId;
     private UUID invoiceId;
-    private CallContext context;
-    private TenantContext tenantContext;
 
     @BeforeMethod(groups = "slow")
-    public void setupMethod() throws Exception {
-        final Account account = createAccount();
+    public void setupTest() throws Exception {
+        super.setupTest();
+        final Account account = invoiceUtil.createAccount();
         accountId = account.getId();
-        invoiceId = generateRegularInvoice(account, clock.getUTCNow());
-        context = new DefaultCallContextFactory(clock).createCallContext(callContext.getTenantId(), "Unit test", CallOrigin.TEST, UserType.TEST);
-        tenantContext = Mockito.mock(TenantContext.class);
+        invoiceId = invoiceUtil.generateRegularInvoice(account, clock.getUTCNow());
     }
 
     @Test(groups = "slow")
     public void testPostExternalChargeOnNewInvoice() throws Exception {
         // Initial account balance
-        final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId, tenantContext);
+        final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId, callContext);
 
         // Post an external charge
         final BigDecimal externalChargeAmount = BigDecimal.TEN;
         final InvoiceItem externalChargeInvoiceItem = invoiceUserApi.insertExternalCharge(accountId, externalChargeAmount, UUID.randomUUID().toString(),
-                                                                                          clock.getUTCToday(), accountCurrency, context);
+                                                                                          clock.getUTCToday(), accountCurrency, callContext);
         verifyExternalChargeOnNewInvoice(accountBalance, null, externalChargeAmount, externalChargeInvoiceItem);
     }
 
     @Test(groups = "slow")
     public void testPostExternalChargeForBundleOnNewInvoice() throws Exception {
         // Initial account balance
-        final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId, tenantContext);
+        final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId, callContext);
 
         // Post an external charge
         final BigDecimal externalChargeAmount = BigDecimal.TEN;
         final UUID bundleId = UUID.randomUUID();
         final InvoiceItem externalChargeInvoiceItem = invoiceUserApi.insertExternalChargeForBundle(accountId, bundleId, externalChargeAmount,
                                                                                                    UUID.randomUUID().toString(), clock.getUTCToday(),
-                                                                                                   accountCurrency, context);
+                                                                                                   accountCurrency, callContext);
         verifyExternalChargeOnNewInvoice(accountBalance, bundleId, externalChargeAmount, externalChargeInvoiceItem);
     }
 
@@ -100,40 +91,40 @@ public class TestDefaultInvoiceUserApi extends InvoiceApiTestBase {
         Assert.assertNull(externalChargeInvoiceItem.getLinkedItemId());
 
         // Verify the adjusted invoice balance
-        final BigDecimal adjustedInvoiceBalance = invoiceUserApi.getInvoice(externalChargeInvoiceItem.getInvoiceId(), tenantContext).getBalance();
+        final BigDecimal adjustedInvoiceBalance = invoiceUserApi.getInvoice(externalChargeInvoiceItem.getInvoiceId(), callContext).getBalance();
         Assert.assertEquals(adjustedInvoiceBalance.compareTo(externalChargeAmount), 0);
 
         // Verify the adjusted account balance
-        final BigDecimal adjustedAccountBalance = invoiceUserApi.getAccountBalance(accountId, tenantContext);
+        final BigDecimal adjustedAccountBalance = invoiceUserApi.getAccountBalance(accountId, callContext);
         Assert.assertEquals(adjustedAccountBalance, initialAccountBalance.add(externalChargeAmount));
     }
 
     @Test(groups = "slow")
     public void testPostExternalChargeOnExistingInvoice() throws Exception {
         // Verify the initial invoice balance
-        final BigDecimal invoiceBalance = invoiceUserApi.getInvoice(invoiceId, tenantContext).getBalance();
+        final BigDecimal invoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance();
         Assert.assertEquals(invoiceBalance.compareTo(BigDecimal.ZERO), 1);
 
         // Verify the initial account balance
-        final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId, tenantContext);
+        final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId, callContext);
         Assert.assertEquals(accountBalance, invoiceBalance);
 
         // Post an external charge
         final BigDecimal externalChargeAmount = BigDecimal.TEN;
         final InvoiceItem externalChargeInvoiceItem = invoiceUserApi.insertExternalChargeForInvoice(accountId, invoiceId,
                                                                                                     externalChargeAmount, UUID.randomUUID().toString(),
-                                                                                                    clock.getUTCToday(), accountCurrency, context);
+                                                                                                    clock.getUTCToday(), accountCurrency, callContext);
         verifyExternalChargeOnExistingInvoice(invoiceBalance, null, externalChargeAmount, externalChargeInvoiceItem);
     }
 
     @Test(groups = "slow")
     public void testPostExternalChargeForBundleOnExistingInvoice() throws Exception {
         // Verify the initial invoice balance
-        final BigDecimal invoiceBalance = invoiceUserApi.getInvoice(invoiceId, tenantContext).getBalance();
+        final BigDecimal invoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance();
         Assert.assertEquals(invoiceBalance.compareTo(BigDecimal.ZERO), 1);
 
         // Verify the initial account balance
-        final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId, tenantContext);
+        final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId, callContext);
         Assert.assertEquals(accountBalance, invoiceBalance);
 
         // Post an external charge
@@ -141,7 +132,7 @@ public class TestDefaultInvoiceUserApi extends InvoiceApiTestBase {
         final UUID bundleId = UUID.randomUUID();
         final InvoiceItem externalChargeInvoiceItem = invoiceUserApi.insertExternalChargeForInvoiceAndBundle(accountId, invoiceId, bundleId,
                                                                                                              externalChargeAmount, UUID.randomUUID().toString(),
-                                                                                                             clock.getUTCToday(), accountCurrency, context);
+                                                                                                             clock.getUTCToday(), accountCurrency, callContext);
         verifyExternalChargeOnExistingInvoice(invoiceBalance, bundleId, externalChargeAmount, externalChargeInvoiceItem);
     }
 
@@ -156,27 +147,27 @@ public class TestDefaultInvoiceUserApi extends InvoiceApiTestBase {
         Assert.assertNull(externalChargeInvoiceItem.getLinkedItemId());
 
         // Verify the adjusted invoice balance
-        final BigDecimal adjustedInvoiceBalance = invoiceUserApi.getInvoice(invoiceId, tenantContext).getBalance();
+        final BigDecimal adjustedInvoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance();
         Assert.assertEquals(adjustedInvoiceBalance.compareTo(initialInvoiceBalance.add(externalChargeAmount)), 0);
 
         // Verify the adjusted account balance
-        final BigDecimal adjustedAccountBalance = invoiceUserApi.getAccountBalance(accountId, tenantContext);
+        final BigDecimal adjustedAccountBalance = invoiceUserApi.getAccountBalance(accountId, callContext);
         Assert.assertEquals(adjustedAccountBalance, adjustedInvoiceBalance);
     }
 
     @Test(groups = "slow")
     public void testAdjustFullInvoice() throws Exception {
         // Verify the initial invoice balance
-        final BigDecimal invoiceBalance = invoiceUserApi.getInvoice(invoiceId, tenantContext).getBalance();
+        final BigDecimal invoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance();
         Assert.assertEquals(invoiceBalance.compareTo(BigDecimal.ZERO), 1);
 
         // Verify the initial account balance
-        final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId, tenantContext);
+        final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId, callContext);
         Assert.assertEquals(accountBalance, invoiceBalance);
 
         // Adjust the invoice for the full amount
         final InvoiceItem creditInvoiceItem = invoiceUserApi.insertCreditForInvoice(accountId, invoiceId, invoiceBalance,
-                                                                                    clock.getUTCToday(), accountCurrency, context);
+                                                                                    clock.getUTCToday(), accountCurrency, callContext);
         Assert.assertEquals(creditInvoiceItem.getInvoiceId(), invoiceId);
         Assert.assertEquals(creditInvoiceItem.getInvoiceItemType(), InvoiceItemType.CREDIT_ADJ);
         Assert.assertEquals(creditInvoiceItem.getAccountId(), accountId);
@@ -185,28 +176,28 @@ public class TestDefaultInvoiceUserApi extends InvoiceApiTestBase {
         Assert.assertNull(creditInvoiceItem.getLinkedItemId());
 
         // Verify the adjusted invoice balance
-        final BigDecimal adjustedInvoiceBalance = invoiceUserApi.getInvoice(invoiceId, tenantContext).getBalance();
+        final BigDecimal adjustedInvoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance();
         Assert.assertEquals(adjustedInvoiceBalance.compareTo(BigDecimal.ZERO), 0);
 
         // Verify the adjusted account balance
-        final BigDecimal adjustedAccountBalance = invoiceUserApi.getAccountBalance(accountId, tenantContext);
+        final BigDecimal adjustedAccountBalance = invoiceUserApi.getAccountBalance(accountId, callContext);
         Assert.assertEquals(adjustedAccountBalance, adjustedInvoiceBalance);
     }
 
     @Test(groups = "slow")
     public void testAdjustPartialInvoice() throws Exception {
         // Verify the initial invoice balance
-        final BigDecimal invoiceBalance = invoiceUserApi.getInvoice(invoiceId, tenantContext).getBalance();
+        final BigDecimal invoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance();
         Assert.assertEquals(invoiceBalance.compareTo(BigDecimal.ZERO), 1);
 
         // Verify the initial account balance
-        final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId, tenantContext);
+        final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId, callContext);
         Assert.assertEquals(accountBalance, invoiceBalance);
 
         // Adjust the invoice for a fraction of the balance
         final BigDecimal creditAmount = invoiceBalance.divide(BigDecimal.TEN);
         final InvoiceItem creditInvoiceItem = invoiceUserApi.insertCreditForInvoice(accountId, invoiceId, creditAmount,
-                                                                                    clock.getUTCToday(), accountCurrency, context);
+                                                                                    clock.getUTCToday(), accountCurrency, callContext);
         Assert.assertEquals(creditInvoiceItem.getInvoiceId(), invoiceId);
         Assert.assertEquals(creditInvoiceItem.getInvoiceItemType(), InvoiceItemType.CREDIT_ADJ);
         Assert.assertEquals(creditInvoiceItem.getAccountId(), accountId);
@@ -215,19 +206,19 @@ public class TestDefaultInvoiceUserApi extends InvoiceApiTestBase {
         Assert.assertNull(creditInvoiceItem.getLinkedItemId());
 
         // Verify the adjusted invoice balance
-        final BigDecimal adjustedInvoiceBalance = invoiceUserApi.getInvoice(invoiceId, tenantContext).getBalance();
+        final BigDecimal adjustedInvoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance();
         // Note! The invoice code will round (see InvoiceItemList)
         verifyAdjustedInvoiceBalance(invoiceBalance, creditAmount, adjustedInvoiceBalance);
 
         // Verify the adjusted account balance
-        final BigDecimal adjustedAccountBalance = invoiceUserApi.getAccountBalance(accountId, tenantContext);
+        final BigDecimal adjustedAccountBalance = invoiceUserApi.getAccountBalance(accountId, callContext);
         Assert.assertEquals(adjustedAccountBalance, adjustedInvoiceBalance);
     }
 
     @Test(groups = "slow")
     public void testCantAdjustInvoiceWithNegativeAmount() throws Exception {
         try {
-            invoiceUserApi.insertCreditForInvoice(accountId, invoiceId, BigDecimal.TEN.negate(), clock.getUTCToday(), accountCurrency, context);
+            invoiceUserApi.insertCreditForInvoice(accountId, invoiceId, BigDecimal.TEN.negate(), clock.getUTCToday(), accountCurrency, callContext);
             Assert.fail("Should not have been able to adjust an invoice with a negative amount");
         } catch (InvoiceApiException e) {
             Assert.assertEquals(e.getCode(), ErrorCode.CREDIT_AMOUNT_INVALID.getCode());
@@ -236,21 +227,21 @@ public class TestDefaultInvoiceUserApi extends InvoiceApiTestBase {
 
     @Test(groups = "slow")
     public void testAdjustFullInvoiceItem() throws Exception {
-        final InvoiceItem invoiceItem = invoiceUserApi.getInvoice(invoiceId, tenantContext).getInvoiceItems().get(0);
+        final InvoiceItem invoiceItem = invoiceUserApi.getInvoice(invoiceId, callContext).getInvoiceItems().get(0);
         // Verify we picked a non zero item
         Assert.assertEquals(invoiceItem.getAmount().compareTo(BigDecimal.ZERO), 1);
 
         // Verify the initial invoice balance
-        final BigDecimal invoiceBalance = invoiceUserApi.getInvoice(invoiceId, tenantContext).getBalance();
+        final BigDecimal invoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance();
         Assert.assertEquals(invoiceBalance.compareTo(BigDecimal.ZERO), 1);
 
         // Verify the initial account balance
-        final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId, tenantContext);
+        final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId, callContext);
         Assert.assertEquals(accountBalance, invoiceBalance);
 
         // Adjust the invoice for the full amount
         final InvoiceItem adjInvoiceItem = invoiceUserApi.insertInvoiceItemAdjustment(accountId, invoiceId, invoiceItem.getId(),
-                                                                                      clock.getUTCToday(), context);
+                                                                                      clock.getUTCToday(), callContext);
         Assert.assertEquals(adjInvoiceItem.getInvoiceId(), invoiceId);
         Assert.assertEquals(adjInvoiceItem.getInvoiceItemType(), InvoiceItemType.ITEM_ADJ);
         Assert.assertEquals(adjInvoiceItem.getAccountId(), accountId);
@@ -259,34 +250,34 @@ public class TestDefaultInvoiceUserApi extends InvoiceApiTestBase {
         Assert.assertEquals(adjInvoiceItem.getLinkedItemId(), invoiceItem.getId());
 
         // Verify the adjusted invoice balance
-        final BigDecimal adjustedInvoiceBalance = invoiceUserApi.getInvoice(invoiceId, tenantContext).getBalance();
+        final BigDecimal adjustedInvoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance();
         // Note! The invoice code will round (see InvoiceItemList)
         verifyAdjustedInvoiceBalance(invoiceBalance, invoiceItem.getAmount(), adjustedInvoiceBalance);
 
         // Verify the adjusted account balance
-        final BigDecimal adjustedAccountBalance = invoiceUserApi.getAccountBalance(accountId, tenantContext);
+        final BigDecimal adjustedAccountBalance = invoiceUserApi.getAccountBalance(accountId, callContext);
         Assert.assertEquals(adjustedAccountBalance, adjustedInvoiceBalance);
     }
 
     @Test(groups = "slow")
     public void testAdjustPartialInvoiceItem() throws Exception {
-        final InvoiceItem invoiceItem = invoiceUserApi.getInvoice(invoiceId, tenantContext).getInvoiceItems().get(0);
+        final InvoiceItem invoiceItem = invoiceUserApi.getInvoice(invoiceId, callContext).getInvoiceItems().get(0);
         // Verify we picked a non zero item
         Assert.assertEquals(invoiceItem.getAmount().compareTo(BigDecimal.ZERO), 1);
 
         // Verify the initial invoice balance
-        final BigDecimal invoiceBalance = invoiceUserApi.getInvoice(invoiceId, tenantContext).getBalance();
+        final BigDecimal invoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance();
         Assert.assertEquals(invoiceBalance.compareTo(BigDecimal.ZERO), 1);
 
         // Verify the initial account balance
-        final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId, tenantContext);
+        final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId, callContext);
         Assert.assertEquals(accountBalance, invoiceBalance);
 
         // Adjust the invoice for a fraction of the balance
         final BigDecimal adjAmount = invoiceItem.getAmount().divide(BigDecimal.TEN);
         final InvoiceItem adjInvoiceItem = invoiceUserApi.insertInvoiceItemAdjustment(accountId, invoiceId, invoiceItem.getId(),
                                                                                       clock.getUTCToday(), adjAmount, accountCurrency,
-                                                                                      context);
+                                                                                      callContext);
         Assert.assertEquals(adjInvoiceItem.getInvoiceId(), invoiceId);
         Assert.assertEquals(adjInvoiceItem.getInvoiceItemType(), InvoiceItemType.ITEM_ADJ);
         Assert.assertEquals(adjInvoiceItem.getAccountId(), accountId);
@@ -295,22 +286,22 @@ public class TestDefaultInvoiceUserApi extends InvoiceApiTestBase {
         Assert.assertEquals(adjInvoiceItem.getLinkedItemId(), invoiceItem.getId());
 
         // Verify the adjusted invoice balance
-        final BigDecimal adjustedInvoiceBalance = invoiceUserApi.getInvoice(invoiceId, tenantContext).getBalance();
+        final BigDecimal adjustedInvoiceBalance = invoiceUserApi.getInvoice(invoiceId, callContext).getBalance();
         // Note! The invoice code will round (see InvoiceItemList)
         verifyAdjustedInvoiceBalance(invoiceBalance, adjAmount, adjustedInvoiceBalance);
 
         // Verify the adjusted account balance
-        final BigDecimal adjustedAccountBalance = invoiceUserApi.getAccountBalance(accountId, tenantContext);
+        final BigDecimal adjustedAccountBalance = invoiceUserApi.getAccountBalance(accountId, callContext);
         Assert.assertEquals(adjustedAccountBalance, adjustedInvoiceBalance);
     }
 
     @Test(groups = "slow")
     public void testCantAdjustInvoiceItemWithNegativeAmount() throws Exception {
-        final InvoiceItem invoiceItem = invoiceUserApi.getInvoice(invoiceId, tenantContext).getInvoiceItems().get(0);
+        final InvoiceItem invoiceItem = invoiceUserApi.getInvoice(invoiceId, callContext).getInvoiceItems().get(0);
 
         try {
             invoiceUserApi.insertInvoiceItemAdjustment(accountId, invoiceId, invoiceItem.getId(), clock.getUTCToday(),
-                                                       BigDecimal.TEN.negate(), accountCurrency, context);
+                                                       BigDecimal.TEN.negate(), accountCurrency, callContext);
             Assert.fail("Should not have been able to adjust an item with a negative amount");
         } catch (InvoiceApiException e) {
             Assert.assertEquals(e.getCode(), ErrorCode.INVOICE_ITEM_ADJUSTMENT_AMOUNT_INVALID.getCode());
@@ -328,12 +319,12 @@ public class TestDefaultInvoiceUserApi extends InvoiceApiTestBase {
     public void testAddRemoveWrittenOffTag() throws InvoiceApiException, TagApiException {
         invoiceUserApi.tagInvoiceAsWrittenOff(invoiceId, callContext);
 
-        List<Tag> tags = tagUserApi.getTags(invoiceId, ObjectType.INVOICE, tenantContext);
+        List<Tag> tags = tagUserApi.getTags(invoiceId, ObjectType.INVOICE, callContext);
         assertEquals(tags.size(), 1);
         assertEquals(tags.get(0).getTagDefinitionId(), ControlTagType.WRITTEN_OFF.getId());
 
         invoiceUserApi.tagInvoiceAsNotWrittenOff(invoiceId, callContext);
-        tags = tagUserApi.getTags(invoiceId, ObjectType.INVOICE, tenantContext);
+        tags = tagUserApi.getTags(invoiceId, ObjectType.INVOICE, callContext);
         assertEquals(tags.size(), 0);
     }
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
index b9e6825..d3fa3f2 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDao.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.invoice.dao;
 
+import static com.ning.billing.invoice.TestInvoiceUtil.*;
+
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -44,6 +46,7 @@ import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.entitlement.api.SubscriptionTransitionType;
 import com.ning.billing.entitlement.api.user.Subscription;
+import com.ning.billing.invoice.InvoiceTestSuiteWithEmbeddedDB;
 import com.ning.billing.invoice.MockBillingEventSet;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
@@ -71,17 +74,17 @@ import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 
-public class TestInvoiceDao extends InvoiceDaoTestBase {
+public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
     @Test(groups = "slow")
     public void testSimple() throws Exception {
         final UUID accountId = UUID.randomUUID();
         final Invoice invoice = new DefaultInvoice(accountId, clock.getUTCToday(), clock.getUTCToday(), Currency.USD);
-        createInvoice(invoice, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice, true, internalCallContext);
 
         final InvoiceModelDao retrievedInvoice = invoiceDao.getById(invoice.getId(), internalCallContext);
-        checkInvoicesEqual(retrievedInvoice, invoice);
-        checkInvoicesEqual(invoiceDao.getByNumber(retrievedInvoice.getInvoiceNumber(), internalCallContext), invoice);
+        invoiceUtil.checkInvoicesEqual(retrievedInvoice, invoice);
+        invoiceUtil.checkInvoicesEqual(invoiceDao.getByNumber(retrievedInvoice.getInvoiceNumber(), internalCallContext), invoice);
     }
 
     @Test(groups = "slow")
@@ -90,7 +93,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final Invoice invoice = new DefaultInvoice(accountId, clock.getUTCToday(), clock.getUTCToday(), Currency.USD);
         final LocalDate invoiceDate = invoice.getInvoiceDate();
 
-        createInvoice(invoice, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice, true, internalCallContext);
 
         final List<InvoiceModelDao> invoices = invoiceDao.getInvoicesByAccount(accountId, internalCallContext);
         assertNotNull(invoices);
@@ -116,7 +119,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
                                                                  new BigDecimal("21.00"), new BigDecimal("7.00"), Currency.USD);
 
         invoice.addInvoiceItem(invoiceItem);
-        createInvoice(invoice, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice, true, internalCallContext);
 
         final InvoiceModelDao savedInvoice = invoiceDao.getById(invoiceId, internalCallContext);
         assertNotNull(savedInvoice);
@@ -167,7 +170,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         // Create invoice 1 (subscriptions 1-4)
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, Currency.USD);
-        createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
 
         final UUID invoiceId1 = invoice1.getId();
 
@@ -176,23 +179,23 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         final RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate, endDate,
                                                                     rate1, rate1, Currency.USD);
-        createInvoiceItem(item1, internalCallContext);
+        invoiceUtil.createInvoiceItem(item1, internalCallContext);
 
         final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId2, "test plan", "test B", startDate, endDate,
                                                                     rate2, rate2, Currency.USD);
-        createInvoiceItem(item2, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2, internalCallContext);
 
         final RecurringInvoiceItem item3 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId3, "test plan", "test C", startDate, endDate,
                                                                     rate3, rate3, Currency.USD);
-        createInvoiceItem(item3, internalCallContext);
+        invoiceUtil.createInvoiceItem(item3, internalCallContext);
 
         final RecurringInvoiceItem item4 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId4, "test plan", "test D", startDate, endDate,
                                                                     rate4, rate4, Currency.USD);
-        createInvoiceItem(item4, internalCallContext);
+        invoiceUtil.createInvoiceItem(item4, internalCallContext);
 
         // Create invoice 2 (subscriptions 1-3)
         final DefaultInvoice invoice2 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, Currency.USD);
-        createInvoice(invoice2, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice2, true, internalCallContext);
 
         final UUID invoiceId2 = invoice2.getId();
 
@@ -201,15 +204,15 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         final RecurringInvoiceItem item5 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId1, "test plan", "test phase A", startDate, endDate,
                                                                     rate1, rate1, Currency.USD);
-        createInvoiceItem(item5, internalCallContext);
+        invoiceUtil.createInvoiceItem(item5, internalCallContext);
 
         final RecurringInvoiceItem item6 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId2, "test plan", "test phase B", startDate, endDate,
                                                                     rate2, rate2, Currency.USD);
-        createInvoiceItem(item6, internalCallContext);
+        invoiceUtil.createInvoiceItem(item6, internalCallContext);
 
         final RecurringInvoiceItem item7 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId3, "test plan", "test phase C", startDate, endDate,
                                                                     rate3, rate3, Currency.USD);
-        createInvoiceItem(item7, internalCallContext);
+        invoiceUtil.createInvoiceItem(item7, internalCallContext);
 
         // Check that each subscription returns the correct number of invoices
         final List<InvoiceModelDao> items1 = invoiceDao.getInvoicesBySubscription(subscriptionId1, internalCallContext);
@@ -243,7 +246,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         // Create invoice 1 (subscriptions 1-4)
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, Currency.USD);
-        createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
 
         final UUID invoiceId1 = invoice1.getId();
 
@@ -252,23 +255,23 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         final FixedPriceInvoiceItem item1 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate,
                                                                       rate1, Currency.USD);
-        createInvoiceItem(item1, internalCallContext);
+        invoiceUtil.createInvoiceItem(item1, internalCallContext);
 
         final FixedPriceInvoiceItem item2 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId2, "test plan", "test B", startDate,
                                                                       rate2, Currency.USD);
-        createInvoiceItem(item2, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2, internalCallContext);
 
         final FixedPriceInvoiceItem item3 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId3, "test plan", "test C", startDate,
                                                                       rate3, Currency.USD);
-        createInvoiceItem(item3, internalCallContext);
+        invoiceUtil.createInvoiceItem(item3, internalCallContext);
 
         final FixedPriceInvoiceItem item4 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId4, "test plan", "test D", startDate,
                                                                       rate4, Currency.USD);
-        createInvoiceItem(item4, internalCallContext);
+        invoiceUtil.createInvoiceItem(item4, internalCallContext);
 
         // create invoice 2 (subscriptions 1-3)
         final DefaultInvoice invoice2 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, Currency.USD);
-        createInvoice(invoice2, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice2, true, internalCallContext);
 
         final UUID invoiceId2 = invoice2.getId();
 
@@ -276,15 +279,15 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         final FixedPriceInvoiceItem item5 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId1, "test plan", "test phase A", startDate,
                                                                       rate1, Currency.USD);
-        createInvoiceItem(item5, internalCallContext);
+        invoiceUtil.createInvoiceItem(item5, internalCallContext);
 
         final FixedPriceInvoiceItem item6 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId2, "test plan", "test phase B", startDate,
                                                                       rate2, Currency.USD);
-        createInvoiceItem(item6, internalCallContext);
+        invoiceUtil.createInvoiceItem(item6, internalCallContext);
 
         final FixedPriceInvoiceItem item7 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId3, "test plan", "test phase C", startDate,
                                                                       rate3, Currency.USD);
-        createInvoiceItem(item7, internalCallContext);
+        invoiceUtil.createInvoiceItem(item7, internalCallContext);
 
         // check that each subscription returns the correct number of invoices
         final List<InvoiceModelDao> items1 = invoiceDao.getInvoicesBySubscription(subscriptionId1, internalCallContext);
@@ -318,7 +321,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         // Create invoice 1 (subscriptions 1-4)
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, Currency.USD);
-        createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
 
         final UUID invoiceId1 = invoice1.getId();
 
@@ -327,39 +330,39 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         final RecurringInvoiceItem recurringItem1 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate, endDate,
                                                                              rate1, rate1, Currency.USD);
-        createInvoiceItem(recurringItem1, internalCallContext);
+        invoiceUtil.createInvoiceItem(recurringItem1, internalCallContext);
 
         final RecurringInvoiceItem recurringItem2 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId2, "test plan", "test B", startDate, endDate,
                                                                              rate2, rate2, Currency.USD);
-        createInvoiceItem(recurringItem2, internalCallContext);
+        invoiceUtil.createInvoiceItem(recurringItem2, internalCallContext);
 
         final RecurringInvoiceItem recurringItem3 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId3, "test plan", "test C", startDate, endDate,
                                                                              rate3, rate3, Currency.USD);
-        createInvoiceItem(recurringItem3, internalCallContext);
+        invoiceUtil.createInvoiceItem(recurringItem3, internalCallContext);
 
         final RecurringInvoiceItem recurringItem4 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId4, "test plan", "test D", startDate, endDate,
                                                                              rate4, rate4, Currency.USD);
-        createInvoiceItem(recurringItem4, internalCallContext);
+        invoiceUtil.createInvoiceItem(recurringItem4, internalCallContext);
 
         final FixedPriceInvoiceItem fixedItem1 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate,
                                                                            rate1, Currency.USD);
-        createInvoiceItem(fixedItem1, internalCallContext);
+        invoiceUtil.createInvoiceItem(fixedItem1, internalCallContext);
 
         final FixedPriceInvoiceItem fixedItem2 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId2, "test plan", "test B", startDate,
                                                                            rate2, Currency.USD);
-        createInvoiceItem(fixedItem2, internalCallContext);
+        invoiceUtil.createInvoiceItem(fixedItem2, internalCallContext);
 
         final FixedPriceInvoiceItem fixedItem3 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId3, "test plan", "test C", startDate,
                                                                            rate3, Currency.USD);
-        createInvoiceItem(fixedItem3, internalCallContext);
+        invoiceUtil.createInvoiceItem(fixedItem3, internalCallContext);
 
         final FixedPriceInvoiceItem fixedItem4 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId4, "test plan", "test D", startDate,
                                                                            rate4, Currency.USD);
-        createInvoiceItem(fixedItem4, internalCallContext);
+        invoiceUtil.createInvoiceItem(fixedItem4, internalCallContext);
 
         // create invoice 2 (subscriptions 1-3)
         final DefaultInvoice invoice2 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, Currency.USD);
-        createInvoice(invoice2, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice2, true, internalCallContext);
 
         final UUID invoiceId2 = invoice2.getId();
 
@@ -368,26 +371,26 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         final RecurringInvoiceItem recurringItem5 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId1, "test plan", "test phase A", startDate, endDate,
                                                                              rate1, rate1, Currency.USD);
-        createInvoiceItem(recurringItem5, internalCallContext);
+        invoiceUtil.createInvoiceItem(recurringItem5, internalCallContext);
 
         final RecurringInvoiceItem recurringItem6 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId2, "test plan", "test phase B", startDate, endDate,
                                                                              rate2, rate2, Currency.USD);
-        createInvoiceItem(recurringItem6, internalCallContext);
+        invoiceUtil.createInvoiceItem(recurringItem6, internalCallContext);
 
         final RecurringInvoiceItem recurringItem7 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId3, "test plan", "test phase C", startDate, endDate,
                                                                              rate3, rate3, Currency.USD);
-        createInvoiceItem(recurringItem7, internalCallContext);
+        invoiceUtil.createInvoiceItem(recurringItem7, internalCallContext);
         final FixedPriceInvoiceItem fixedItem5 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId1, "test plan", "test phase A", startDate,
                                                                            rate1, Currency.USD);
-        createInvoiceItem(fixedItem5, internalCallContext);
+        invoiceUtil.createInvoiceItem(fixedItem5, internalCallContext);
 
         final FixedPriceInvoiceItem fixedItem6 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId2, "test plan", "test phase B", startDate,
                                                                            rate2, Currency.USD);
-        createInvoiceItem(fixedItem6, internalCallContext);
+        invoiceUtil.createInvoiceItem(fixedItem6, internalCallContext);
 
         final FixedPriceInvoiceItem fixedItem7 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId3, "test plan", "test phase C", startDate,
                                                                            rate3, Currency.USD);
-        createInvoiceItem(fixedItem7, internalCallContext);
+        invoiceUtil.createInvoiceItem(fixedItem7, internalCallContext);
 
         // check that each subscription returns the correct number of invoices
         final List<InvoiceModelDao> items1 = invoiceDao.getInvoicesBySubscription(subscriptionId1, internalCallContext);
@@ -408,11 +411,11 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final UUID accountId = UUID.randomUUID();
         final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
-        createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
 
         final LocalDate targetDate2 = new LocalDate(2011, 12, 6);
         final Invoice invoice2 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate2, Currency.USD);
-        createInvoice(invoice2, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice2, true, internalCallContext);
 
         List<InvoiceModelDao> invoices;
         invoices = invoiceDao.getInvoicesByAccount(accountId, new LocalDate(2011, 1, 1), internalCallContext);
@@ -437,7 +440,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final UUID bundleId = UUID.randomUUID();
         final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
-        createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
 
         final LocalDate startDate = new LocalDate(2011, 3, 1);
         final LocalDate endDate = startDate.plusMonths(1);
@@ -447,15 +450,15 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         final RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate,
                                                                     endDate, rate1, rate1, Currency.USD);
-        createInvoiceItem(item1, internalCallContext);
+        invoiceUtil.createInvoiceItem(item1, internalCallContext);
 
         final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate,
                                                                     endDate, rate2, rate2, Currency.USD);
-        createInvoiceItem(item2, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2, internalCallContext);
 
         final BigDecimal payment1 = new BigDecimal("48.0");
         final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice1.getId(), new DateTime(), payment1, Currency.USD);
-        createPayment(payment, internalCallContext);
+        invoiceUtil.createPayment(payment, internalCallContext);
 
         final BigDecimal balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
         assertEquals(balance.compareTo(rate1.add(rate2).subtract(payment1)), 0);
@@ -467,7 +470,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final UUID bundleId = UUID.randomUUID();
         final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
-        createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
 
         final LocalDate startDate = new LocalDate(2011, 3, 1);
         final LocalDate endDate = startDate.plusMonths(1);
@@ -476,10 +479,10 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         final RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate,
                                                                     endDate, rate1, rate1, Currency.USD);
-        createInvoiceItem(item1, internalCallContext);
+        invoiceUtil.createInvoiceItem(item1, internalCallContext);
 
         final CreditAdjInvoiceItem creditItem = new CreditAdjInvoiceItem(invoice1.getId(), accountId, new LocalDate(), rate1.negate(), Currency.USD);
-        createInvoiceItem(creditItem, internalCallContext);
+        invoiceUtil.createInvoiceItem(creditItem, internalCallContext);
 
         final BigDecimal balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
         assertEquals(balance.compareTo(BigDecimal.ZERO), 0);
@@ -491,7 +494,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final UUID bundleId = UUID.randomUUID();
         final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
-        createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
 
         final LocalDate startDate = new LocalDate(2011, 3, 1);
         final LocalDate endDate = startDate.plusMonths(1);
@@ -501,11 +504,11 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         final RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate, endDate,
                                                                     rate1, rate1, Currency.USD);
-        createInvoiceItem(item1, internalCallContext);
+        invoiceUtil.createInvoiceItem(item1, internalCallContext);
 
         final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate, endDate,
                                                                     rate2, rate2, Currency.USD);
-        createInvoiceItem(item2, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2, internalCallContext);
 
         final BigDecimal balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
         assertEquals(balance.compareTo(rate1.add(rate2)), 0);
@@ -516,11 +519,11 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final UUID accountId = UUID.randomUUID();
         final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
-        createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
 
         final BigDecimal payment1 = new BigDecimal("48.0");
         final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice1.getId(), new DateTime(), payment1, Currency.USD);
-        createPayment(payment, internalCallContext);
+        invoiceUtil.createPayment(payment, internalCallContext);
 
         final BigDecimal balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
         assertEquals(balance.compareTo(BigDecimal.ZERO.subtract(payment1)), 0);
@@ -542,7 +545,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final UUID bundleId = UUID.randomUUID();
         final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
-        createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
 
         final LocalDate startDate = new LocalDate(2011, 3, 1);
         final LocalDate endDate = startDate.plusMonths(1);
@@ -553,7 +556,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         // Recurring item
         final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate,
                                                                     endDate, rate1, rate1, Currency.USD);
-        createInvoiceItem(item2, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2, internalCallContext);
         BigDecimal balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
         assertEquals(balance.compareTo(new BigDecimal("20.00")), 0);
 
@@ -561,7 +564,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final UUID paymentId = UUID.randomUUID();
         final BigDecimal payment1 = rate1;
         final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoice1.getId(), new DateTime(), payment1, Currency.USD);
-        createPayment(payment, internalCallContext);
+        invoiceUtil.createPayment(payment, internalCallContext);
         balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
         assertEquals(balance.compareTo(new BigDecimal("0.00")), 0);
 
@@ -592,7 +595,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
 
         final Invoice invoice = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
-        createInvoice(invoice, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice, true, internalCallContext);
 
         final LocalDate startDate = new LocalDate(2011, 3, 1);
         final LocalDate endDate = startDate.plusMonths(1);
@@ -602,7 +605,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         // Recurring item
         final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate,
                                                                     endDate, amount, amount, Currency.USD);
-        createInvoiceItem(item2, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2, internalCallContext);
         BigDecimal balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
         assertEquals(balance.compareTo(new BigDecimal("20.00")), 0);
 
@@ -610,16 +613,16 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final UUID paymentId = UUID.randomUUID();
         final BigDecimal payment1 = amount;
         final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoice.getId(), new DateTime(), payment1, Currency.USD);
-        createPayment(payment, internalCallContext);
+        invoiceUtil.createPayment(payment, internalCallContext);
         balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
         assertEquals(balance.compareTo(new BigDecimal("0.00")), 0);
 
         // Repair the item (And add CBA item that should be generated)
         final InvoiceItem repairItem = new RepairAdjInvoiceItem(invoice.getId(), accountId, startDate, endDate, amount.negate(), Currency.USD, item2.getId());
-        createInvoiceItem(repairItem, internalCallContext);
+        invoiceUtil.createInvoiceItem(repairItem, internalCallContext);
 
         final InvoiceItem cbaItem = new CreditBalanceAdjInvoiceItem(invoice.getId(), accountId, startDate, amount, Currency.USD);
-        createInvoiceItem(cbaItem, internalCallContext);
+        invoiceUtil.createInvoiceItem(cbaItem, internalCallContext);
 
         final Map<UUID, BigDecimal> itemAdjustment = new HashMap<UUID, BigDecimal>();
         itemAdjustment.put(item2.getId(), refundAmount);
@@ -676,7 +679,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final UUID bundleId = UUID.randomUUID();
         final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
-        createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
 
         final LocalDate startDate = new LocalDate(2011, 3, 1);
         final LocalDate endDate = startDate.plusMonths(1);
@@ -688,7 +691,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         // Fixed Item
         final FixedPriceInvoiceItem item1 = new FixedPriceInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate,
                                                                       amount1, Currency.USD);
-        createInvoiceItem(item1, internalCallContext);
+        invoiceUtil.createInvoiceItem(item1, internalCallContext);
 
         BigDecimal balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
         assertEquals(balance.compareTo(new BigDecimal("5.00")), 0);
@@ -696,7 +699,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         // Recurring item
         final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate,
                                                                     endDate, rate1, rate1, Currency.USD);
-        createInvoiceItem(item2, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2, internalCallContext);
         balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
         assertEquals(balance.compareTo(new BigDecimal("25.00")), 0);
 
@@ -704,7 +707,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final UUID paymentId = UUID.randomUUID();
         final BigDecimal payment1 = amount1.add(rate1);
         final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, paymentId, invoice1.getId(), new DateTime(), payment1, Currency.USD);
-        createPayment(payment, internalCallContext);
+        invoiceUtil.createPayment(payment, internalCallContext);
         balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
         assertEquals(balance.compareTo(new BigDecimal("0.00")), 0);
 
@@ -712,14 +715,14 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final RepairAdjInvoiceItem item2Repair = new RepairAdjInvoiceItem(invoice1.getId(), accountId, startDate, endDate, rate1.negate(), Currency.USD, item2.getId());
         final RecurringInvoiceItem item2Replace = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate,
                                                                            endDate, rate2, rate2, Currency.USD);
-        createInvoiceItem(item2Repair, internalCallContext);
-        createInvoiceItem(item2Replace, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2Repair, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2Replace, internalCallContext);
         balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
         assertEquals(balance.compareTo(new BigDecimal("-10.00")), 0);
 
         // CBA
         final CreditBalanceAdjInvoiceItem cbaItem = new CreditBalanceAdjInvoiceItem(invoice1.getId(), accountId, new LocalDate(), balance.negate(), Currency.USD);
-        createInvoiceItem(cbaItem, internalCallContext);
+        invoiceUtil.createInvoiceItem(cbaItem, internalCallContext);
         balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
         assertEquals(balance.compareTo(new BigDecimal("-10.00")), 0);
         BigDecimal cba = invoiceDao.getAccountCBA(accountId, internalCallContext);
@@ -763,7 +766,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final UUID bundleId = UUID.randomUUID();
         final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
-        createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
 
         final LocalDate startDate = new LocalDate(2011, 3, 1);
         final LocalDate endDate = startDate.plusMonths(1);
@@ -775,7 +778,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         // Fixed Item
         final FixedPriceInvoiceItem item1 = new FixedPriceInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate,
                                                                       amount1, Currency.USD);
-        createInvoiceItem(item1, internalCallContext);
+        invoiceUtil.createInvoiceItem(item1, internalCallContext);
 
         BigDecimal balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
         assertEquals(balance.compareTo(new BigDecimal("5.00")), 0);
@@ -783,14 +786,14 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         // Recurring item
         final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate,
                                                                     endDate, rate1, rate1, Currency.USD);
-        createInvoiceItem(item2, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2, internalCallContext);
         balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
         assertEquals(balance.compareTo(new BigDecimal("25.00")), 0);
 
         // Pay the whole thing
         final BigDecimal payment1 = amount1.add(rate1);
         final InvoicePayment payment = new DefaultInvoicePayment(InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice1.getId(), new DateTime(), payment1, Currency.USD);
-        createPayment(payment, internalCallContext);
+        invoiceUtil.createPayment(payment, internalCallContext);
         balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
         assertEquals(balance.compareTo(new BigDecimal("0.00")), 0);
 
@@ -798,14 +801,14 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final RepairAdjInvoiceItem item2Repair = new RepairAdjInvoiceItem(invoice1.getId(), accountId, startDate, endDate, rate1.negate(), Currency.USD, item2.getId());
         final RecurringInvoiceItem item2Replace = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate,
                                                                            endDate, rate2, rate2, Currency.USD);
-        createInvoiceItem(item2Repair, internalCallContext);
-        createInvoiceItem(item2Replace, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2Repair, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2Replace, internalCallContext);
         balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
         assertEquals(balance.compareTo(new BigDecimal("-10.00")), 0);
 
         // CBA
         final CreditBalanceAdjInvoiceItem cbaItem = new CreditBalanceAdjInvoiceItem(invoice1.getId(), accountId, new LocalDate(), balance.negate(), Currency.USD);
-        createInvoiceItem(cbaItem, internalCallContext);
+        invoiceUtil.createInvoiceItem(cbaItem, internalCallContext);
         balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
         assertEquals(balance.compareTo(new BigDecimal("-10.00")), 0);
         BigDecimal cba = invoiceDao.getAccountCBA(accountId, internalCallContext);
@@ -813,9 +816,9 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         // partial REFUND on the payment (along with CBA generated by the system)
         final InvoicePayment refund = new DefaultInvoicePayment(UUID.randomUUID(), InvoicePaymentType.ATTEMPT, UUID.randomUUID(), invoice1.getId(), new DateTime(), rate2.negate(), Currency.USD, null, payment.getId());
-        createPayment(refund, internalCallContext);
+        invoiceUtil.createPayment(refund, internalCallContext);
         final CreditBalanceAdjInvoiceItem cbaItem2 = new CreditBalanceAdjInvoiceItem(invoice1.getId(), accountId, new LocalDate(), rate2.negate(), Currency.USD);
-        createInvoiceItem(cbaItem2, internalCallContext);
+        invoiceUtil.createInvoiceItem(cbaItem2, internalCallContext);
 
         balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
         assertEquals(balance.compareTo(BigDecimal.ZERO), 0);
@@ -825,11 +828,11 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         // NEXT RECURRING on invoice 2
 
         final Invoice invoice2 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1.plusMonths(1), Currency.USD);
-        createInvoice(invoice2, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice2, true, internalCallContext);
 
         final RecurringInvoiceItem nextItem = new RecurringInvoiceItem(invoice2.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test bla", startDate.plusMonths(1),
                                                                        endDate.plusMonths(1), rate2, rate2, Currency.USD);
-        createInvoiceItem(nextItem, internalCallContext);
+        invoiceUtil.createInvoiceItem(nextItem, internalCallContext);
         balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
         assertEquals(balance.compareTo(new BigDecimal("10.00")), 0);
         cba = invoiceDao.getAccountCBA(accountId, internalCallContext);
@@ -837,7 +840,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         // FINALLY ISSUE A CREDIT ADJ
         final CreditAdjInvoiceItem creditItem = new CreditAdjInvoiceItem(invoice2.getId(), accountId, new LocalDate(), rate2.negate(), Currency.USD);
-        createInvoiceItem(creditItem, internalCallContext);
+        invoiceUtil.createInvoiceItem(creditItem, internalCallContext);
         balance = invoiceDao.getAccountBalance(accountId, internalCallContext);
         assertEquals(balance.compareTo(new BigDecimal("0.00")), 0);
         cba = invoiceDao.getAccountCBA(accountId, internalCallContext);
@@ -910,7 +913,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         // Create one invoice with a fixed invoice item
         final LocalDate targetDate = new LocalDate(2011, 2, 15);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, Currency.USD);
-        createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
 
         final LocalDate startDate = new LocalDate(2011, 3, 1);
 
@@ -919,7 +922,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         // Fixed Item
         final FixedPriceInvoiceItem item1 = new FixedPriceInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate,
                                                                       amount1, Currency.USD);
-        createInvoiceItem(item1, internalCallContext);
+        invoiceUtil.createInvoiceItem(item1, internalCallContext);
 
         // Create the credit item
         final LocalDate effectiveDate = new LocalDate(2011, 3, 1);
@@ -953,7 +956,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final UUID bundleId = UUID.randomUUID();
         final LocalDate targetDate1 = new LocalDate(2011, 10, 6);
         final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate1, Currency.USD);
-        createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
 
         final LocalDate startDate = new LocalDate(2011, 3, 1);
         final LocalDate endDate = startDate.plusMonths(1);
@@ -963,11 +966,11 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         final RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate, endDate,
                                                                     rate1, rate1, Currency.USD);
-        createInvoiceItem(item1, internalCallContext);
+        invoiceUtil.createInvoiceItem(item1, internalCallContext);
 
         final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate, endDate,
                                                                     rate2, rate2, Currency.USD);
-        createInvoiceItem(item2, internalCallContext);
+        invoiceUtil.createInvoiceItem(item2, internalCallContext);
 
         LocalDate upToDate;
         Collection<InvoiceModelDao> invoices;
@@ -982,7 +985,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         final LocalDate targetDate2 = new LocalDate(2011, 7, 1);
         final Invoice invoice2 = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate2, Currency.USD);
-        createInvoice(invoice2, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice2, true, internalCallContext);
 
         final LocalDate startDate2 = new LocalDate(2011, 6, 1);
         final LocalDate endDate2 = startDate2.plusMonths(3);
@@ -991,7 +994,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         final RecurringInvoiceItem item3 = new RecurringInvoiceItem(invoice2.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase C", startDate2, endDate2,
                                                                     rate3, rate3, Currency.USD);
-        createInvoiceItem(item3, internalCallContext);
+        invoiceUtil.createInvoiceItem(item3, internalCallContext);
 
         upToDate = new LocalDate(2011, 1, 1);
         invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId, upToDate, internalCallContext);
@@ -1023,7 +1026,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final Subscription subscription = getZombieSubscription();
 
         final DateTime effectiveDate1 = new DateTime(2011, 2, 1, 0, 0, 0);
-        final BillingEvent event1 = createMockBillingEvent(null, subscription, effectiveDate1, plan1, phase1, null,
+        final BillingEvent event1 = invoiceUtil.createMockBillingEvent(null, subscription, effectiveDate1, plan1, phase1, null,
                                                            recurringPrice.getPrice(currency), currency, BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
                                                            "testEvent1", 1L, SubscriptionTransitionType.CREATE);
 
@@ -1041,7 +1044,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final MockPlan plan2 = new MockPlan(phase2);
 
         final DateTime effectiveDate2 = new DateTime(2011, 2, 15, 0, 0, 0);
-        final BillingEvent event2 = createMockBillingEvent(null, subscription, effectiveDate2, plan2, phase2, null,
+        final BillingEvent event2 = invoiceUtil.createMockBillingEvent(null, subscription, effectiveDate2, plan2, phase2, null,
                                                            recurringPrice2.getPrice(currency), currency, BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
                                                            "testEvent2", 2L, SubscriptionTransitionType.CREATE);
         events.add(event2);
@@ -1052,8 +1055,8 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         assertEquals(invoice2.getBalance(), FIVE);
         invoiceList.add(invoice2);
 
-        createInvoice(invoice1, true, internalCallContext);
-        createInvoice(invoice2, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice2, true, internalCallContext);
 
         final InvoiceModelDao savedInvoice1 = invoiceDao.getById(invoice1.getId(), internalCallContext);
         assertEquals(InvoiceModelDaoHelper.getBalance(savedInvoice1), ZERO);
@@ -1071,15 +1074,15 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final MockPlan plan = new MockPlan(phase);
 
         final Subscription subscription = getZombieSubscription();
-        final DateTime effectiveDate = buildDate(2011, 1, 1).toDateTimeAtStartOfDay();
+        final DateTime effectiveDate = invoiceUtil.buildDate(2011, 1, 1).toDateTimeAtStartOfDay();
 
-        final BillingEvent event = createMockBillingEvent(null, subscription, effectiveDate, plan, phase, null,
+        final BillingEvent event = invoiceUtil.createMockBillingEvent(null, subscription, effectiveDate, plan, phase, null,
                                                           recurringPrice.getPrice(currency), currency, BillingPeriod.MONTHLY, 15, BillingModeType.IN_ADVANCE,
                                                           "testEvent", 1L, SubscriptionTransitionType.CREATE);
         final BillingEventSet events = new MockBillingEventSet();
         events.add(event);
 
-        final LocalDate targetDate = buildDate(2011, 1, 15);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 15);
         final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate, Currency.USD);
 
         // expect one pro-ration item and one full-period item
@@ -1110,9 +1113,9 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final MockPlan plan = new MockPlan();
 
         final Subscription subscription = getZombieSubscription();
-        final DateTime effectiveDate1 = buildDate(2011, 1, 1).toDateTimeAtStartOfDay();
+        final DateTime effectiveDate1 = invoiceUtil.buildDate(2011, 1, 1).toDateTimeAtStartOfDay();
 
-        final BillingEvent event1 = createMockBillingEvent(null, subscription, effectiveDate1, plan, phase1, fixedPrice.getPrice(currency),
+        final BillingEvent event1 = invoiceUtil.createMockBillingEvent(null, subscription, effectiveDate1, plan, phase1, fixedPrice.getPrice(currency),
                                                            null, currency, BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
                                                            "testEvent1", 1L, SubscriptionTransitionType.CREATE);
         final BillingEventSet events = new MockBillingEventSet();
@@ -1127,10 +1130,10 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final List<Invoice> invoiceList = new ArrayList<Invoice>();
         invoiceList.add(invoice1);
 
-        //createInvoice(invoice1, invoice1.getTargetDate().getDayOfMonth(), internalCallContext);
+        //invoiceUtil.createInvoice(invoice1, invoice1.getTargetDate().getDayOfMonth(), internalCallContext);
 
         final DateTime effectiveDate2 = effectiveDate1.plusDays(30);
-        final BillingEvent event2 = createMockBillingEvent(null, subscription, effectiveDate2, plan, phase2, null,
+        final BillingEvent event2 = invoiceUtil.createMockBillingEvent(null, subscription, effectiveDate2, plan, phase2, null,
                                                            recurringPrice.getPrice(currency), currency, BillingPeriod.MONTHLY, 31, BillingModeType.IN_ADVANCE,
                                                            "testEvent2", 2L, SubscriptionTransitionType.PHASE);
         events.add(event2);
@@ -1142,7 +1145,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         invoiceList.add(invoice2);
 
-        //createInvoice(invoice2, invoice2.getTargetDate().getDayOfMonth(), internalCallContext);
+        //invoiceUtil.createInvoice(invoice2, invoice2.getTargetDate().getDayOfMonth(), internalCallContext);
 
         final DateTime effectiveDate3 = effectiveDate2.plusMonths(1);
         final Invoice invoice3 = generator.generateInvoice(accountId, events, invoiceList, new LocalDate(effectiveDate3), Currency.USD);
@@ -1150,7 +1153,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         assertEquals(invoice3.getNumberOfItems(), 1);
         assertEquals(invoice3.getBalance().compareTo(cheapAmount), 0);
 
-        //createInvoice(invoice3, invoice3.getTargetDate().getDayOfMonth(), internalCallContext);
+        //invoiceUtil.createInvoice(invoice3, invoice3.getTargetDate().getDayOfMonth(), internalCallContext);
     }
 
     @Test(groups = "slow")
@@ -1175,9 +1178,9 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final MockPlan plan = new MockPlan();
 
         final Subscription subscription = getZombieSubscription();
-        final DateTime effectiveDate1 = buildDate(2011, 1, 1).toDateTimeAtStartOfDay();
+        final DateTime effectiveDate1 = invoiceUtil.buildDate(2011, 1, 1).toDateTimeAtStartOfDay();
 
-        final BillingEvent event1 = createMockBillingEvent(null, subscription, effectiveDate1, plan, phase1,
+        final BillingEvent event1 = invoiceUtil.createMockBillingEvent(null, subscription, effectiveDate1, plan, phase1,
                                                            fixedPrice.getPrice(currency), null, currency,
                                                            BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
                                                            "testEvent1", 1L, SubscriptionTransitionType.CREATE);
@@ -1185,7 +1188,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         events.add(event1);
 
         final DateTime effectiveDate2 = effectiveDate1.plusDays(30);
-        final BillingEvent event2 = createMockBillingEvent(null, subscription, effectiveDate2, plan, phase2, null,
+        final BillingEvent event2 = invoiceUtil.createMockBillingEvent(null, subscription, effectiveDate2, plan, phase2, null,
                                                            recurringPrice.getPrice(currency), currency, BillingPeriod.MONTHLY, 31, BillingModeType.IN_ADVANCE,
                                                            "testEvent2", 2L, SubscriptionTransitionType.CHANGE);
         events.add(event2);
@@ -1195,7 +1198,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         assertEquals(invoice.getNumberOfItems(), 2);
         assertEquals(invoice.getBalance().compareTo(cheapAmount), 0);
 
-        createInvoice(invoice, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice, true, internalCallContext);
         final InvoiceModelDao savedInvoice = invoiceDao.getById(invoice.getId(), internalCallContext);
 
         assertNotNull(savedInvoice);
@@ -1225,7 +1228,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
                                                                  recuringStartDate, recuringEndDate, new BigDecimal("239.00"), new BigDecimal("239.00"), Currency.USD);
 
         invoice.addInvoiceItem(invoiceItem);
-        createInvoice(invoice, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice, true, internalCallContext);
 
         ((ClockMock) clock).addDays(1);
 
@@ -1260,13 +1263,13 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final PlanPhase phase2 = Mockito.mock(PlanPhase.class);
         Mockito.when(phase2.getName()).thenReturn("plan-phase2");
 
-        final BillingEvent event1 = createMockBillingEvent(null, subscription, recuringStartDate.toDateTimeAtStartOfDay(), plan, phase1, null,
+        final BillingEvent event1 = invoiceUtil.createMockBillingEvent(null, subscription, recuringStartDate.toDateTimeAtStartOfDay(), plan, phase1, null,
                                                            TEN, Currency.USD,
                                                            BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
                                                            "new-event", 1L, SubscriptionTransitionType.CREATE);
         events.add(event1);
         final Invoice newInvoice = generator.generateInvoice(UUID.randomUUID(), events, invoices, targetDate, Currency.USD);
-        createInvoice(newInvoice, true, internalCallContext);
+        invoiceUtil.createInvoice(newInvoice, true, internalCallContext);
 
         // VERIFY THAT WE STILL HAVE ONLY 2 ITEMS, MENAING THERE WERE NO REPAIR AND NO CBA GENERATED
         final Invoice firstInvoice = new DefaultInvoice(invoiceDao.getById(invoiceId, internalCallContext));
@@ -1294,7 +1297,7 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final BillingEventSet events = new MockBillingEventSet();
         final List<Invoice> invoices = new ArrayList<Invoice>();
 
-        final BillingEvent event1 = createMockBillingEvent(null, subscription, targetDate1, plan, phase1, null,
+        final BillingEvent event1 = invoiceUtil.createMockBillingEvent(null, subscription, targetDate1, plan, phase1, null,
                                                            TEN, currency,
                                                            BillingPeriod.MONTHLY, 31, BillingModeType.IN_ADVANCE,
                                                            "testEvent1", 1L, SubscriptionTransitionType.CHANGE);
@@ -1302,17 +1305,17 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         Invoice invoice1 = generator.generateInvoice(UUID.randomUUID(), events, invoices, new LocalDate(targetDate1), Currency.USD);
         invoices.add(invoice1);
-        createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
         invoice1 = new DefaultInvoice(invoiceDao.getById(invoice1.getId(), internalCallContext));
         assertNotNull(invoice1.getInvoiceNumber());
 
-        final BillingEvent event2 = createMockBillingEvent(null, subscription, targetDate1, plan, phase2, null,
+        final BillingEvent event2 = invoiceUtil.createMockBillingEvent(null, subscription, targetDate1, plan, phase2, null,
                                                            TWENTY, currency,
                                                            BillingPeriod.MONTHLY, 31, BillingModeType.IN_ADVANCE,
                                                            "testEvent2", 2L, SubscriptionTransitionType.CHANGE);
         events.add(event2);
         Invoice invoice2 = generator.generateInvoice(UUID.randomUUID(), events, invoices, new LocalDate(targetDate2), Currency.USD);
-        createInvoice(invoice2, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice2, true, internalCallContext);
         invoice2 = new DefaultInvoice(invoiceDao.getById(invoice2.getId(), internalCallContext));
         assertNotNull(invoice2.getInvoiceNumber());
     }
@@ -1337,21 +1340,21 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final CreditBalanceAdjInvoiceItem creditBalanceAdjInvoiceItem1 = new CreditBalanceAdjInvoiceItem(fixedItem1.getInvoiceId(), fixedItem1.getAccountId(),
                                                                                                          fixedItem1.getStartDate(), fixedItem1.getAmount(),
                                                                                                          fixedItem1.getCurrency());
-        createInvoice(invoice1, true, internalCallContext);
-        createInvoiceItem(fixedItem1, internalCallContext);
-        createInvoiceItem(repairAdjInvoiceItem, internalCallContext);
-        createInvoiceItem(creditBalanceAdjInvoiceItem1, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoiceItem(fixedItem1, internalCallContext);
+        invoiceUtil.createInvoiceItem(repairAdjInvoiceItem, internalCallContext);
+        invoiceUtil.createInvoiceItem(creditBalanceAdjInvoiceItem1, internalCallContext);
 
         // Verify scenario - no CBA should have been used
         Assert.assertEquals(invoiceDao.getAccountCBA(accountId, internalCallContext).doubleValue(), 10.00);
-        verifyInvoice(invoice1.getId(), 10.00, 10.00);
+        invoiceUtil.verifyInvoice(invoice1.getId(), 10.00, 10.00);
 
         // Delete the CBA on invoice 1
         invoiceDao.deleteCBA(accountId, invoice1.getId(), creditBalanceAdjInvoiceItem1.getId(), internalCallContext);
 
         // Verify the result
         Assert.assertEquals(invoiceDao.getAccountCBA(accountId, internalCallContext).doubleValue(), 0.00);
-        verifyInvoice(invoice1.getId(), 0.00, 0.00);
+        invoiceUtil.verifyInvoice(invoice1.getId(), 0.00, 0.00);
     }
 
     @Test(groups = "slow")
@@ -1380,10 +1383,10 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         invoiceDao.notifyOfPayment(new InvoicePaymentModelDao(defaultInvoicePayment), internalCallContext);
 
-        createInvoice(invoice1, true, internalCallContext);
-        createInvoiceItem(fixedItem1, internalCallContext);
-        createInvoiceItem(repairAdjInvoiceItem, internalCallContext);
-        createInvoiceItem(creditBalanceAdjInvoiceItem1, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoiceItem(fixedItem1, internalCallContext);
+        invoiceUtil.createInvoiceItem(repairAdjInvoiceItem, internalCallContext);
+        invoiceUtil.createInvoiceItem(creditBalanceAdjInvoiceItem1, internalCallContext);
 
         // Create invoice 2
         // Scenario: single item
@@ -1395,22 +1398,22 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final CreditBalanceAdjInvoiceItem creditBalanceAdjInvoiceItem2 = new CreditBalanceAdjInvoiceItem(fixedItem2.getInvoiceId(), fixedItem2.getAccountId(),
                                                                                                          fixedItem2.getStartDate(), fixedItem2.getAmount().negate(),
                                                                                                          fixedItem2.getCurrency());
-        createInvoice(invoice2, true, internalCallContext);
-        createInvoiceItem(fixedItem2, internalCallContext);
-        createInvoiceItem(creditBalanceAdjInvoiceItem2, internalCallContext);
+        invoiceUtil.createInvoice(invoice2, true, internalCallContext);
+        invoiceUtil.createInvoiceItem(fixedItem2, internalCallContext);
+        invoiceUtil.createInvoiceItem(creditBalanceAdjInvoiceItem2, internalCallContext);
 
         // Verify scenario - half of the CBA should have been used
         Assert.assertEquals(invoiceDao.getAccountCBA(accountId, internalCallContext).doubleValue(), 5.00);
-        verifyInvoice(invoice1.getId(), 0.00, 10.00);
-        verifyInvoice(invoice2.getId(), 0.00, -5.00);
+        invoiceUtil.verifyInvoice(invoice1.getId(), 0.00, 10.00);
+        invoiceUtil.verifyInvoice(invoice2.getId(), 0.00, -5.00);
 
         // Refund Payment before we can deleted CBA
         invoiceDao.createRefund(paymentId, new BigDecimal("10.0"), false, ImmutableMap.<UUID,BigDecimal>of(), UUID.randomUUID(), internalCallContext);
 
         // Verify all three invoices were affected
         Assert.assertEquals(invoiceDao.getAccountCBA(accountId, internalCallContext).doubleValue(), 0.00);
-        verifyInvoice(invoice1.getId(), 5.00, 5.00);
-        verifyInvoice(invoice2.getId(), 0.00, -5.00);
+        invoiceUtil.verifyInvoice(invoice1.getId(), 5.00, 5.00);
+        invoiceUtil.verifyInvoice(invoice2.getId(), 0.00, -5.00);
     }
 
     @Test(groups = "slow")
@@ -1433,10 +1436,10 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final CreditBalanceAdjInvoiceItem creditBalanceAdjInvoiceItem1 = new CreditBalanceAdjInvoiceItem(fixedItem1.getInvoiceId(), fixedItem1.getAccountId(),
                                                                                                          fixedItem1.getStartDate(), fixedItem1.getAmount(),
                                                                                                          fixedItem1.getCurrency());
-        createInvoice(invoice1, true, internalCallContext);
-        createInvoiceItem(fixedItem1, internalCallContext);
-        createInvoiceItem(repairAdjInvoiceItem, internalCallContext);
-        createInvoiceItem(creditBalanceAdjInvoiceItem1, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoiceItem(fixedItem1, internalCallContext);
+        invoiceUtil.createInvoiceItem(repairAdjInvoiceItem, internalCallContext);
+        invoiceUtil.createInvoiceItem(creditBalanceAdjInvoiceItem1, internalCallContext);
 
 
         final BigDecimal paymentAmount = new BigDecimal("10.00");
@@ -1455,9 +1458,9 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final CreditBalanceAdjInvoiceItem creditBalanceAdjInvoiceItem2 = new CreditBalanceAdjInvoiceItem(fixedItem2.getInvoiceId(), fixedItem2.getAccountId(),
                                                                                                          fixedItem2.getStartDate(), fixedItem2.getAmount().negate(),
                                                                                                          fixedItem2.getCurrency());
-        createInvoice(invoice2, true, internalCallContext);
-        createInvoiceItem(fixedItem2, internalCallContext);
-        createInvoiceItem(creditBalanceAdjInvoiceItem2, internalCallContext);
+        invoiceUtil.createInvoice(invoice2, true, internalCallContext);
+        invoiceUtil.createInvoiceItem(fixedItem2, internalCallContext);
+        invoiceUtil.createInvoiceItem(creditBalanceAdjInvoiceItem2, internalCallContext);
 
         // Create invoice 3
         // Scenario: single item
@@ -1469,23 +1472,23 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final CreditBalanceAdjInvoiceItem creditBalanceAdjInvoiceItem3 = new CreditBalanceAdjInvoiceItem(fixedItem3.getInvoiceId(), fixedItem3.getAccountId(),
                                                                                                          fixedItem3.getStartDate(), fixedItem3.getAmount().negate(),
                                                                                                          fixedItem3.getCurrency());
-        createInvoice(invoice3, true, internalCallContext);
-        createInvoiceItem(fixedItem3, internalCallContext);
-        createInvoiceItem(creditBalanceAdjInvoiceItem3, internalCallContext);
+        invoiceUtil.createInvoice(invoice3, true, internalCallContext);
+        invoiceUtil.createInvoiceItem(fixedItem3, internalCallContext);
+        invoiceUtil.createInvoiceItem(creditBalanceAdjInvoiceItem3, internalCallContext);
 
         // Verify scenario - all CBA should have been used
         Assert.assertEquals(invoiceDao.getAccountCBA(accountId, internalCallContext).doubleValue(), 0.00);
-        verifyInvoice(invoice1.getId(), 0.00, 10.00);
-        verifyInvoice(invoice2.getId(), 0.00, -5.00);
-        verifyInvoice(invoice3.getId(), 0.00, -5.00);
+        invoiceUtil.verifyInvoice(invoice1.getId(), 0.00, 10.00);
+        invoiceUtil.verifyInvoice(invoice2.getId(), 0.00, -5.00);
+        invoiceUtil.verifyInvoice(invoice3.getId(), 0.00, -5.00);
 
         invoiceDao.createRefund(paymentId, paymentAmount, false, ImmutableMap.<UUID, BigDecimal>of(), UUID.randomUUID(), internalCallContext);
 
         // Verify all three invoices were affected
         Assert.assertEquals(invoiceDao.getAccountCBA(accountId, internalCallContext).doubleValue(), 0.00);
-        verifyInvoice(invoice1.getId(), 10.00, 10.00);
-        verifyInvoice(invoice2.getId(), 0.00, -5.00);
-        verifyInvoice(invoice3.getId(), 0.00, -5.00);
+        invoiceUtil.verifyInvoice(invoice1.getId(), 10.00, 10.00);
+        invoiceUtil.verifyInvoice(invoice2.getId(), 0.00, -5.00);
+        invoiceUtil.verifyInvoice(invoice3.getId(), 0.00, -5.00);
     }
 
     @Test(groups = "slow")
@@ -1504,13 +1507,13 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
         final CreditBalanceAdjInvoiceItem creditBalanceAdjInvoiceItem1 = new CreditBalanceAdjInvoiceItem(invoice1.getId(), invoice1.getAccountId(),
                                                                                                          invoice1.getInvoiceDate(), repairAdjInvoiceItem.getAmount().negate(),
                                                                                                          invoice1.getCurrency());
-        createInvoice(invoice1, true, internalCallContext);
-        createInvoiceItem(repairAdjInvoiceItem, internalCallContext);
-        createInvoiceItem(creditBalanceAdjInvoiceItem1, internalCallContext);
+        invoiceUtil.createInvoice(invoice1, true, internalCallContext);
+        invoiceUtil.createInvoiceItem(repairAdjInvoiceItem, internalCallContext);
+        invoiceUtil.createInvoiceItem(creditBalanceAdjInvoiceItem1, internalCallContext);
 
         // Verify scenario
         Assert.assertEquals(invoiceDao.getAccountCBA(accountId, internalCallContext).doubleValue(), 10.00);
-        verifyInvoice(invoice1.getId(), 0.00, 10.00);
+        invoiceUtil.verifyInvoice(invoice1.getId(), 0.00, 10.00);
 
         // Delete the CBA on invoice 1
         try {
@@ -1523,6 +1526,6 @@ public class TestInvoiceDao extends InvoiceDaoTestBase {
 
         // Verify the result
         Assert.assertEquals(invoiceDao.getAccountCBA(accountId, internalCallContext).doubleValue(), 10.00);
-        verifyInvoice(invoice1.getId(), 0.00, 10.00);
+        invoiceUtil.verifyInvoice(invoice1.getId(), 0.00, 10.00);
     }
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDaoForItemAdjustment.java b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDaoForItemAdjustment.java
index 9cc7557..978cee5 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDaoForItemAdjustment.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceDaoForItemAdjustment.java
@@ -26,6 +26,7 @@ import org.testng.annotations.Test;
 
 import com.ning.billing.ErrorCode;
 import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.invoice.InvoiceTestSuiteWithEmbeddedDB;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoiceItem;
@@ -33,7 +34,7 @@ import com.ning.billing.invoice.api.InvoiceItemType;
 import com.ning.billing.invoice.model.DefaultInvoice;
 import com.ning.billing.invoice.model.RecurringInvoiceItem;
 
-public class TestInvoiceDaoForItemAdjustment extends InvoiceDaoTestBase {
+public class TestInvoiceDaoForItemAdjustment extends InvoiceTestSuiteWithEmbeddedDB {
 
     private static final BigDecimal INVOICE_ITEM_AMOUNT = new BigDecimal("21.00");
 
@@ -60,7 +61,7 @@ public class TestInvoiceDaoForItemAdjustment extends InvoiceDaoTestBase {
                                                                  new LocalDate(2010, 1, 1), new LocalDate(2010, 4, 1),
                                                                  INVOICE_ITEM_AMOUNT, new BigDecimal("7.00"), Currency.USD);
         invoice.addInvoiceItem(invoiceItem);
-        createInvoice(invoice, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice, true, internalCallContext);
 
         try {
             invoiceDao.insertInvoiceItemAdjustment(invoice.getAccountId(), UUID.randomUUID(), invoiceItem.getId(), new LocalDate(2010, 1, 1), null, null, internalCallContext);
@@ -78,7 +79,7 @@ public class TestInvoiceDaoForItemAdjustment extends InvoiceDaoTestBase {
                                                                  new LocalDate(2010, 1, 1), new LocalDate(2010, 4, 1),
                                                                  INVOICE_ITEM_AMOUNT, new BigDecimal("7.00"), Currency.USD);
         invoice.addInvoiceItem(invoiceItem);
-        createInvoice(invoice, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice, true, internalCallContext);
 
         final InvoiceItemModelDao adjustedInvoiceItem = createAndCheckAdjustment(invoice, invoiceItem, null);
         Assert.assertEquals(adjustedInvoiceItem.getAmount().compareTo(invoiceItem.getAmount().negate()), 0);
@@ -92,7 +93,7 @@ public class TestInvoiceDaoForItemAdjustment extends InvoiceDaoTestBase {
                                                                  new LocalDate(2010, 1, 1), new LocalDate(2010, 4, 1),
                                                                  INVOICE_ITEM_AMOUNT, new BigDecimal("7.00"), Currency.USD);
         invoice.addInvoiceItem(invoiceItem);
-        createInvoice(invoice, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice, true, internalCallContext);
 
         final InvoiceItemModelDao adjustedInvoiceItem = createAndCheckAdjustment(invoice, invoiceItem, BigDecimal.TEN);
         Assert.assertEquals(adjustedInvoiceItem.getAmount().compareTo(BigDecimal.TEN.negate()), 0);
@@ -116,7 +117,7 @@ public class TestInvoiceDaoForItemAdjustment extends InvoiceDaoTestBase {
         Assert.assertNull(adjustedInvoiceItem.getSubscriptionId());
 
         // Retrieve the item by id
-        final InvoiceItemModelDao retrievedInvoiceItem = invoiceItemSqlDao.getById(adjustedInvoiceItem.getId().toString(), internalCallContext);
+        final InvoiceItemModelDao retrievedInvoiceItem = invoiceUtil.getInvoiceItemById(adjustedInvoiceItem.getId(), internalCallContext);
         // TODO We can't use equals() due to the createdDate field
         Assert.assertEquals(retrievedInvoiceItem.getAccountId(), adjustedInvoiceItem.getAccountId());
         Assert.assertNull(retrievedInvoiceItem.getBundleId());
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceItemDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceItemDao.java
index 513a95d..1608bd5 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceItemDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/TestInvoiceItemDao.java
@@ -24,6 +24,7 @@ import org.joda.time.LocalDate;
 import org.testng.annotations.Test;
 
 import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.invoice.InvoiceTestSuiteWithEmbeddedDB;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.model.CreditBalanceAdjInvoiceItem;
 import com.ning.billing.invoice.model.DefaultInvoice;
@@ -33,11 +34,12 @@ import com.ning.billing.invoice.model.InvoiceItemFactory;
 import com.ning.billing.invoice.model.RecurringInvoiceItem;
 import com.ning.billing.util.entity.EntityPersistenceException;
 
+import static com.ning.billing.invoice.TestInvoiceUtil.TEN;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
 
-public class TestInvoiceItemDao extends InvoiceDaoTestBase {
+public class TestInvoiceItemDao extends InvoiceTestSuiteWithEmbeddedDB {
 
     @Test(groups = "slow")
     public void testInvoiceItemCreation() throws EntityPersistenceException {
@@ -51,9 +53,9 @@ public class TestInvoiceItemDao extends InvoiceDaoTestBase {
 
         final RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, "test plan", "test phase", startDate, endDate,
                                                                    rate, rate, Currency.USD);
-        createInvoiceItem(item, internalCallContext);
+        invoiceUtil.createInvoiceItem(item, internalCallContext);
 
-        final InvoiceItemModelDao thisItem = invoiceItemSqlDao.getById(item.getId().toString(), internalCallContext);
+        final InvoiceItemModelDao thisItem = invoiceUtil.getInvoiceItemById(item.getId(), internalCallContext);
         assertNotNull(thisItem);
         assertEquals(thisItem.getId(), item.getId());
         assertEquals(thisItem.getInvoiceId(), item.getInvoiceId());
@@ -81,10 +83,10 @@ public class TestInvoiceItemDao extends InvoiceDaoTestBase {
             final RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId,
                                                                        "test plan", "test phase", startDate.plusMonths(i), startDate.plusMonths(i + 1),
                                                                        rate, rate, Currency.USD);
-            createInvoiceItem(item, internalCallContext);
+            invoiceUtil.createInvoiceItem(item, internalCallContext);
         }
 
-        final List<InvoiceItemModelDao> items = invoiceItemSqlDao.getInvoiceItemsBySubscription(subscriptionId.toString(), internalCallContext);
+        final List<InvoiceItemModelDao> items = invoiceUtil.getInvoiceItemBySubscriptionId(subscriptionId, internalCallContext);
         assertEquals(items.size(), 3);
     }
 
@@ -103,10 +105,10 @@ public class TestInvoiceItemDao extends InvoiceDaoTestBase {
             final RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId,
                                                                        "test plan", "test phase", startDate, startDate.plusMonths(1),
                                                                        amount, amount, Currency.USD);
-            createInvoiceItem(item, internalCallContext);
+            invoiceUtil.createInvoiceItem(item, internalCallContext);
         }
 
-        final List<InvoiceItemModelDao> items = invoiceItemSqlDao.getInvoiceItemsByInvoice(invoiceId.toString(), internalCallContext);
+        final List<InvoiceItemModelDao> items = invoiceUtil.getInvoiceItemByInvoiceId(invoiceId, internalCallContext);
         assertEquals(items.size(), 5);
     }
 
@@ -117,7 +119,7 @@ public class TestInvoiceItemDao extends InvoiceDaoTestBase {
         final LocalDate targetDate = new LocalDate(2011, 5, 23);
         final DefaultInvoice invoice = new DefaultInvoice(accountId, clock.getUTCToday(), targetDate, Currency.USD);
 
-        createInvoice(invoice, true, internalCallContext);
+        invoiceUtil.createInvoice(invoice, true, internalCallContext);
 
         final UUID invoiceId = invoice.getId();
         final LocalDate startDate = new LocalDate(2011, 3, 1);
@@ -128,9 +130,9 @@ public class TestInvoiceItemDao extends InvoiceDaoTestBase {
         final RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId,
                                                                    "test plan", "test phase", startDate, startDate.plusMonths(1),
                                                                    rate, rate, Currency.USD);
-        createInvoiceItem(item, internalCallContext);
+        invoiceUtil.createInvoiceItem(item, internalCallContext);
 
-        final List<InvoiceItemModelDao> items = invoiceItemSqlDao.getInvoiceItemsByAccount(accountId.toString(), internalCallContext);
+        final List<InvoiceItemModelDao> items = invoiceUtil.getInvoiceItemByAccountId(accountId, internalCallContext);
         assertEquals(items.size(), 1);
     }
 
@@ -141,9 +143,9 @@ public class TestInvoiceItemDao extends InvoiceDaoTestBase {
         final LocalDate creditDate = new LocalDate(2012, 4, 1);
 
         final InvoiceItem creditInvoiceItem = new CreditBalanceAdjInvoiceItem(invoiceId, accountId, creditDate, TEN, Currency.USD);
-        createInvoiceItem(creditInvoiceItem, internalCallContext);
+        invoiceUtil.createInvoiceItem(creditInvoiceItem, internalCallContext);
 
-        final InvoiceItemModelDao savedItem = invoiceItemSqlDao.getById(creditInvoiceItem.getId().toString(), internalCallContext);
+        final InvoiceItemModelDao savedItem = invoiceUtil.getInvoiceItemById(creditInvoiceItem.getId(), internalCallContext);
         assertEquals(InvoiceItemFactory.fromModelDao(savedItem), creditInvoiceItem);
     }
 
@@ -155,9 +157,9 @@ public class TestInvoiceItemDao extends InvoiceDaoTestBase {
 
         final InvoiceItem fixedPriceInvoiceItem = new FixedPriceInvoiceItem(invoiceId, accountId, UUID.randomUUID(),
                                                                             UUID.randomUUID(), "test plan", "test phase", startDate, TEN, Currency.USD);
-        createInvoiceItem(fixedPriceInvoiceItem, internalCallContext);
+        invoiceUtil.createInvoiceItem(fixedPriceInvoiceItem, internalCallContext);
 
-        final InvoiceItemModelDao savedItem = invoiceItemSqlDao.getById(fixedPriceInvoiceItem.getId().toString(), internalCallContext);
+        final InvoiceItemModelDao savedItem = invoiceUtil.getInvoiceItemById(fixedPriceInvoiceItem.getId(), internalCallContext);
         assertEquals(InvoiceItemFactory.fromModelDao(savedItem), fixedPriceInvoiceItem);
     }
 
@@ -170,9 +172,9 @@ public class TestInvoiceItemDao extends InvoiceDaoTestBase {
         final LocalDate startDate = new LocalDate(2012, 4, 1);
         final InvoiceItem externalChargeInvoiceItem = new ExternalChargeInvoiceItem(invoiceId, accountId, bundleId, description,
                                                                                     startDate, TEN, Currency.USD);
-        createInvoiceItem(externalChargeInvoiceItem, internalCallContext);
+        invoiceUtil.createInvoiceItem(externalChargeInvoiceItem, internalCallContext);
 
-        final InvoiceItemModelDao savedItem = invoiceItemSqlDao.getById(externalChargeInvoiceItem.getId().toString(), internalCallContext);
+        final InvoiceItemModelDao savedItem = invoiceUtil.getInvoiceItemById(externalChargeInvoiceItem.getId(), internalCallContext);
         assertEquals(InvoiceItemFactory.fromModelDao(savedItem), externalChargeInvoiceItem);
     }
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java
index 5514da0..59fecc9 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.invoice.generator;
 
+import static com.ning.billing.invoice.TestInvoiceUtil.*;
+
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -46,6 +48,7 @@ import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.entitlement.api.SubscriptionTransitionType;
 import com.ning.billing.entitlement.api.user.Subscription;
+import com.ning.billing.invoice.InvoiceTestSuiteNoDB;
 import com.ning.billing.invoice.MockBillingEventSet;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
@@ -56,7 +59,6 @@ import com.ning.billing.invoice.model.DefaultInvoice;
 import com.ning.billing.invoice.model.DefaultInvoicePayment;
 import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
 import com.ning.billing.invoice.model.RecurringInvoiceItem;
-import com.ning.billing.invoice.tests.InvoicingTestBase;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.clock.ClockMock;
 import com.ning.billing.util.clock.DefaultClock;
@@ -70,14 +72,10 @@ import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 
-public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
+public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
 
     private static final Logger log = LoggerFactory.getLogger(TestDefaultInvoiceGenerator.class);
 
-    private final Clock clock = new ClockMock();
-
-    private final InvoiceGenerator generator;
-
     public TestDefaultInvoiceGenerator() {
         final Clock clock = new DefaultClock();
         final InvoiceConfig invoiceConfig = new InvoiceConfig() {
@@ -117,7 +115,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
         final BillingEventSet events = new MockBillingEventSet();
 
         final Subscription sub = createZombieSubscription();
-        final LocalDate startDate = buildDate(2011, 9, 1);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 9, 1);
 
         final Plan plan = new MockPlan();
         final BigDecimal rate1 = TEN;
@@ -126,7 +124,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
         final BillingEvent event = createBillingEvent(sub.getId(), startDate, plan, phase, 1);
         events.add(event);
 
-        final LocalDate targetDate = buildDate(2011, 10, 3);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 10, 3);
         final UUID accountId = UUID.randomUUID();
         final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
 
@@ -159,23 +157,23 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
         // Start date was the 16 local, but was the 17 UTC
         final int bcdLocal = 16;
         final int bcdUTC = 17;
-        final LocalDate startDate = buildDate(2012, 7, bcdLocal);
+        final LocalDate startDate = invoiceUtil.buildDate(2012, 7, bcdLocal);
 
         final BillingEventSet events = new MockBillingEventSet();
         final BillingEvent event = createBillingEvent(sub.getId(), startDate, plan, phase, bcdUTC, bcdLocal);
         events.add(event);
 
         // Target date is the next BCD, in local time
-        final LocalDate targetDate = buildDate(2012, 8, bcdLocal);
+        final LocalDate targetDate = invoiceUtil.buildDate(2012, 8, bcdLocal);
         final DateTimeZone accountTimeZone = DateTimeZone.forID("HST");
         final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
 
         assertNotNull(invoice);
         assertEquals(invoice.getNumberOfItems(), 2);
-        assertEquals(invoice.getInvoiceItems().get(0).getStartDate(), buildDate(2012, 7, 16));
-        assertEquals(invoice.getInvoiceItems().get(0).getEndDate(), buildDate(2012, 8, 16));
-        assertEquals(invoice.getInvoiceItems().get(1).getStartDate(), buildDate(2012, 8, 16));
-        assertEquals(invoice.getInvoiceItems().get(1).getEndDate(), buildDate(2012, 9, 16));
+        assertEquals(invoice.getInvoiceItems().get(0).getStartDate(), invoiceUtil.buildDate(2012, 7, 16));
+        assertEquals(invoice.getInvoiceItems().get(0).getEndDate(), invoiceUtil.buildDate(2012, 8, 16));
+        assertEquals(invoice.getInvoiceItems().get(1).getStartDate(), invoiceUtil.buildDate(2012, 8, 16));
+        assertEquals(invoice.getInvoiceItems().get(1).getEndDate(), invoiceUtil.buildDate(2012, 9, 16));
     }
 
     @Test(groups = "fast")
@@ -186,7 +184,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
         final PlanPhase phaseEvergreen = createMockMonthlyPlanPhase(EIGHT, PhaseType.DISCOUNT);
         final DateTimeZone accountTimeZone = DateTimeZone.UTC;
         final int bcdUTC = 16;
-        final LocalDate startDate = buildDate(2012, 7, 16);
+        final LocalDate startDate = invoiceUtil.buildDate(2012, 7, 16);
 
         final BillingEventSet events = new MockBillingEventSet();
         events.add(createBillingEvent(sub.getId(), startDate, plan, phaseEvergreen, bcdUTC));
@@ -197,8 +195,8 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
 
         assertNotNull(invoice);
         assertEquals(invoice.getNumberOfItems(), 1);
-        assertEquals(invoice.getInvoiceItems().get(0).getStartDate(), buildDate(2012, 7, 16));
-        assertEquals(invoice.getInvoiceItems().get(0).getEndDate(), buildDate(2012, 8, 16));
+        assertEquals(invoice.getInvoiceItems().get(0).getStartDate(), invoiceUtil.buildDate(2012, 7, 16));
+        assertEquals(invoice.getInvoiceItems().get(0).getEndDate(), invoiceUtil.buildDate(2012, 8, 16));
     }
 
     @Test(groups = "fast")
@@ -206,7 +204,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
         final BillingEventSet events = new MockBillingEventSet();
 
         final Subscription sub = createZombieSubscription();
-        final LocalDate startDate = buildDate(2011, 9, 1);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 9, 1);
 
         final Plan plan = new MockPlan();
         final BigDecimal rate = TEN;
@@ -214,7 +212,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
         final BillingEvent event = createBillingEvent(sub.getId(), startDate, plan, phase, 15);
         events.add(event);
 
-        final LocalDate targetDate = buildDate(2011, 10, 3);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 10, 3);
         final UUID accountId = UUID.randomUUID();
         final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
 
@@ -241,13 +239,13 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
 
         final Subscription sub = createZombieSubscription();
 
-        final BillingEvent event1 = createBillingEvent(sub.getId(), buildDate(2011, 9, 1), plan1, phase1, 1);
+        final BillingEvent event1 = createBillingEvent(sub.getId(), invoiceUtil.buildDate(2011, 9, 1), plan1, phase1, 1);
         events.add(event1);
 
-        final BillingEvent event2 = createBillingEvent(sub.getId(), buildDate(2011, 10, 1), plan2, phase2, 1);
+        final BillingEvent event2 = createBillingEvent(sub.getId(), invoiceUtil.buildDate(2011, 10, 1), plan2, phase2, 1);
         events.add(event2);
 
-        final LocalDate targetDate = buildDate(2011, 10, 3);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 10, 3);
         final UUID accountId = UUID.randomUUID();
         final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
 
@@ -265,15 +263,15 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
         final PlanPhase phase1 = createMockMonthlyPlanPhase(rate1);
 
         final Subscription sub = createZombieSubscription();
-        final BillingEvent event1 = createBillingEvent(sub.getId(), buildDate(2011, 9, 1), plan1, phase1, 1);
+        final BillingEvent event1 = createBillingEvent(sub.getId(), invoiceUtil.buildDate(2011, 9, 1), plan1, phase1, 1);
         events.add(event1);
 
         final BigDecimal rate2 = TEN;
         final PlanPhase phase2 = createMockMonthlyPlanPhase(rate2);
-        final BillingEvent event2 = createBillingEvent(sub.getId(), buildDate(2011, 10, 15), plan1, phase2, 15);
+        final BillingEvent event2 = createBillingEvent(sub.getId(), invoiceUtil.buildDate(2011, 10, 15), plan1, phase2, 15);
         events.add(event2);
 
-        final LocalDate targetDate = buildDate(2011, 12, 3);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 12, 3);
         final UUID accountId = UUID.randomUUID();
         final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
 
@@ -302,20 +300,20 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
         final PlanPhase phase1 = createMockMonthlyPlanPhase(rate1);
 
         final Subscription sub = createZombieSubscription();
-        final BillingEvent event1 = createBillingEvent(sub.getId(), buildDate(2011, 9, 1), plan1, phase1, 1);
+        final BillingEvent event1 = createBillingEvent(sub.getId(), invoiceUtil.buildDate(2011, 9, 1), plan1, phase1, 1);
         events.add(event1);
 
         final BigDecimal rate2 = TEN;
         final PlanPhase phase2 = createMockMonthlyPlanPhase(rate2);
-        final BillingEvent event2 = createBillingEvent(sub.getId(), buildDate(2011, 10, 1), plan1, phase2, 1);
+        final BillingEvent event2 = createBillingEvent(sub.getId(), invoiceUtil.buildDate(2011, 10, 1), plan1, phase2, 1);
         events.add(event2);
 
         final BigDecimal rate3 = THIRTY;
         final PlanPhase phase3 = createMockMonthlyPlanPhase(rate3);
-        final BillingEvent event3 = createBillingEvent(sub.getId(), buildDate(2011, 11, 1), plan1, phase3, 1);
+        final BillingEvent event3 = createBillingEvent(sub.getId(), invoiceUtil.buildDate(2011, 11, 1), plan1, phase3, 1);
         events.add(event3);
 
-        final LocalDate targetDate = buildDate(2011, 12, 3);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 12, 3);
         final UUID accountId = UUID.randomUUID();
         final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
 
@@ -329,7 +327,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
         final BillingEventSet events = new MockBillingEventSet();
 
         final Subscription sub = createZombieSubscription();
-        final LocalDate startDate = buildDate(2011, 9, 1);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 9, 1);
 
         final Plan plan1 = new MockPlan();
         final BigDecimal rate = FIVE;
@@ -338,13 +336,13 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
         final BillingEvent event1 = createBillingEvent(sub.getId(), startDate, plan1, phase1, 1);
         events.add(event1);
 
-        LocalDate targetDate = buildDate(2011, 12, 1);
+        LocalDate targetDate = invoiceUtil.buildDate(2011, 12, 1);
         final UUID accountId = UUID.randomUUID();
         final Invoice invoice1 = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
         final List<Invoice> existingInvoices = new ArrayList<Invoice>();
         existingInvoices.add(invoice1);
 
-        targetDate = buildDate(2011, 12, 3);
+        targetDate = invoiceUtil.buildDate(2011, 12, 3);
         final Invoice invoice2 = generator.generateInvoice(accountId, events, existingInvoices, targetDate, Currency.USD);
 
         assertNull(invoice2);
@@ -369,37 +367,37 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
         final PlanPhase plan1Phase1 = createMockMonthlyPlanPhase(EIGHT, PhaseType.TRIAL);
         final PlanPhase plan1Phase2 = createMockMonthlyPlanPhase(TWELVE, PhaseType.DISCOUNT);
         final PlanPhase plan1Phase3 = createMockMonthlyPlanPhase();
-        final LocalDate plan1StartDate = buildDate(2011, 1, 5);
-        final LocalDate plan1PhaseChangeDate = buildDate(2011, 4, 5);
-        final LocalDate plan1CancelDate = buildDate(2011, 4, 29);
+        final LocalDate plan1StartDate = invoiceUtil.buildDate(2011, 1, 5);
+        final LocalDate plan1PhaseChangeDate = invoiceUtil.buildDate(2011, 4, 5);
+        final LocalDate plan1CancelDate = invoiceUtil.buildDate(2011, 4, 29);
 
         final Plan plan2 = new MockPlan("Change phase from trial to discount to evergreen");
         final PlanPhase plan2Phase1 = createMockMonthlyPlanPhase(TWENTY, PhaseType.TRIAL);
         final PlanPhase plan2Phase2 = createMockMonthlyPlanPhase(THIRTY, PhaseType.DISCOUNT);
         final PlanPhase plan2Phase3 = createMockMonthlyPlanPhase(FORTY, PhaseType.EVERGREEN);
-        final LocalDate plan2StartDate = buildDate(2011, 3, 10);
-        final LocalDate plan2PhaseChangeToDiscountDate = buildDate(2011, 6, 10);
-        final LocalDate plan2PhaseChangeToEvergreenDate = buildDate(2011, 9, 10);
+        final LocalDate plan2StartDate = invoiceUtil.buildDate(2011, 3, 10);
+        final LocalDate plan2PhaseChangeToDiscountDate = invoiceUtil.buildDate(2011, 6, 10);
+        final LocalDate plan2PhaseChangeToEvergreenDate = invoiceUtil.buildDate(2011, 9, 10);
 
         final Plan plan3 = new MockPlan("Upgrade with immediate change, BCD = 31");
         final PlanPhase plan3Phase1 = createMockMonthlyPlanPhase(TEN, PhaseType.EVERGREEN);
         final PlanPhase plan3Phase2 = createMockAnnualPlanPhase(ONE_HUNDRED, PhaseType.EVERGREEN);
-        final LocalDate plan3StartDate = buildDate(2011, 5, 20);
-        final LocalDate plan3UpgradeToAnnualDate = buildDate(2011, 7, 31);
+        final LocalDate plan3StartDate = invoiceUtil.buildDate(2011, 5, 20);
+        final LocalDate plan3UpgradeToAnnualDate = invoiceUtil.buildDate(2011, 7, 31);
 
         final Plan plan4a = new MockPlan("Plan change effective EOT; plan 1");
         final Plan plan4b = new MockPlan("Plan change effective EOT; plan 2");
         final PlanPhase plan4aPhase1 = createMockMonthlyPlanPhase(FIFTEEN);
         final PlanPhase plan4bPhase1 = createMockMonthlyPlanPhase(TWENTY_FOUR);
 
-        final LocalDate plan4StartDate = buildDate(2011, 6, 7);
-        final LocalDate plan4ChangeOfPlanDate = buildDate(2011, 8, 7);
+        final LocalDate plan4StartDate = invoiceUtil.buildDate(2011, 6, 7);
+        final LocalDate plan4ChangeOfPlanDate = invoiceUtil.buildDate(2011, 8, 7);
 
         final Plan plan5 = new MockPlan("Add-on");
         final PlanPhase plan5Phase1 = createMockMonthlyPlanPhase(TWENTY);
         final PlanPhase plan5Phase2 = createMockMonthlyPlanPhase();
-        final LocalDate plan5StartDate = buildDate(2011, 6, 21);
-        final LocalDate plan5CancelDate = buildDate(2011, 10, 7);
+        final LocalDate plan5StartDate = invoiceUtil.buildDate(2011, 6, 21);
+        final LocalDate plan5CancelDate = invoiceUtil.buildDate(2011, 10, 7);
 
         BigDecimal expectedAmount;
         final List<Invoice> invoices = new ArrayList<Invoice>();
@@ -412,11 +410,11 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
 
         // on 2/5/2011, invoice subscription 1 (trial)
         expectedAmount = EIGHT;
-        testInvoiceGeneration(accountId, events, invoices, buildDate(2011, 2, 5), 1, expectedAmount);
+        testInvoiceGeneration(accountId, events, invoices, invoiceUtil.buildDate(2011, 2, 5), 1, expectedAmount);
 
         // on 3/5/2011, invoice subscription 1 (trial)
         expectedAmount = EIGHT;
-        testInvoiceGeneration(accountId, events, invoices, buildDate(2011, 3, 5), 1, expectedAmount);
+        testInvoiceGeneration(accountId, events, invoices, invoiceUtil.buildDate(2011, 3, 5), 1, expectedAmount);
 
         // on 3/10/2011, create subscription 2 (trial)
         events.add(createBillingEvent(subscriptionId2, plan2StartDate, plan2, plan2Phase1, 10));
@@ -430,7 +428,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
 
         // on 4/10/2011, invoice subscription 2 (trial)
         expectedAmount = TWENTY;
-        testInvoiceGeneration(accountId, events, invoices, buildDate(2011, 4, 10), 1, expectedAmount);
+        testInvoiceGeneration(accountId, events, invoices, invoiceUtil.buildDate(2011, 4, 10), 1, expectedAmount);
 
         // on 4/29/2011, cancel subscription 1
         events.add(createBillingEvent(subscriptionId1, plan1CancelDate, plan1, plan1Phase3, 5));
@@ -440,7 +438,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
 
         // on 5/10/2011, invoice subscription 2 (trial)
         expectedAmount = TWENTY;
-        testInvoiceGeneration(accountId, events, invoices, buildDate(2011, 5, 10), 1, expectedAmount);
+        testInvoiceGeneration(accountId, events, invoices, invoiceUtil.buildDate(2011, 5, 10), 1, expectedAmount);
 
         // on 5/20/2011, create subscription 3 (monthly)
         events.add(createBillingEvent(subscriptionId3, plan3StartDate, plan3, plan3Phase1, 20));
@@ -459,7 +457,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
 
         // on 6/20/2011, invoice subscription 3 (monthly)
         expectedAmount = TEN;
-        testInvoiceGeneration(accountId, events, invoices, buildDate(2011, 6, 20), 1, expectedAmount);
+        testInvoiceGeneration(accountId, events, invoices, invoiceUtil.buildDate(2011, 6, 20), 1, expectedAmount);
 
         // on 6/21/2011, create add-on (subscription 5)
         events.add(createBillingEvent(subscriptionId5, plan5StartDate, plan5, plan5Phase1, 10));
@@ -468,15 +466,15 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
 
         // on 7/7/2011, invoice subscription 4 (plan 1)
         expectedAmount = FIFTEEN;
-        testInvoiceGeneration(accountId, events, invoices, buildDate(2011, 7, 7), 1, expectedAmount);
+        testInvoiceGeneration(accountId, events, invoices, invoiceUtil.buildDate(2011, 7, 7), 1, expectedAmount);
 
         // on 7/10/2011, invoice subscription 2 (discount), invoice subscription 5
         expectedAmount = THIRTY.add(TWENTY);
-        testInvoiceGeneration(accountId, events, invoices, buildDate(2011, 7, 10), 2, expectedAmount);
+        testInvoiceGeneration(accountId, events, invoices, invoiceUtil.buildDate(2011, 7, 10), 2, expectedAmount);
 
         // on 7/20/2011, invoice subscription 3 (monthly)
         expectedAmount = TEN;
-        testInvoiceGeneration(accountId, events, invoices, buildDate(2011, 7, 20), 1, expectedAmount);
+        testInvoiceGeneration(accountId, events, invoices, invoiceUtil.buildDate(2011, 7, 20), 1, expectedAmount);
 
         // on 7/31/2011, convert subscription 3 to annual
         events.add(createBillingEvent(subscriptionId3, plan3UpgradeToAnnualDate, plan3, plan3Phase2, 31));
@@ -491,11 +489,11 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
 
         // on 8/10/2011, invoice plan 2 (discount), invoice subscription 5
         expectedAmount = THIRTY.add(TWENTY);
-        testInvoiceGeneration(accountId, events, invoices, buildDate(2011, 8, 10), 2, expectedAmount);
+        testInvoiceGeneration(accountId, events, invoices, invoiceUtil.buildDate(2011, 8, 10), 2, expectedAmount);
 
         // on 9/7/2011, invoice subscription 4 (plan 2)
         expectedAmount = TWENTY_FOUR;
-        testInvoiceGeneration(accountId, events, invoices, buildDate(2011, 9, 7), 1, expectedAmount);
+        testInvoiceGeneration(accountId, events, invoices, invoiceUtil.buildDate(2011, 9, 7), 1, expectedAmount);
 
         // on 9/10/2011, invoice plan 2 (evergreen), invoice subscription 5
         events.add(createBillingEvent(subscriptionId2, plan2PhaseChangeToEvergreenDate, plan2, plan2Phase3, 10));
@@ -509,7 +507,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
 
         // on 10/10/2011, invoice plan 2 (evergreen)
         expectedAmount = FORTY;
-        testInvoiceGeneration(accountId, events, invoices, buildDate(2011, 10, 10), 1, expectedAmount);
+        testInvoiceGeneration(accountId, events, invoices, invoiceUtil.buildDate(2011, 10, 10), 1, expectedAmount);
     }
 
     @Test(groups = "fast")
@@ -517,7 +515,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
         final Plan plan = new MockPlan();
         final PlanPhase planPhase = createMockMonthlyPlanPhase(ZERO);
         final BillingEventSet events = new MockBillingEventSet();
-        final LocalDate targetDate = buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 1);
         events.add(createBillingEvent(UUID.randomUUID(), targetDate, plan, planPhase, 1));
 
         final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate, Currency.USD);
@@ -558,13 +556,13 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
 
         final BillingEventSet events = new MockBillingEventSet();
 
-        final BillingEvent event1 = createMockBillingEvent(null, subscription, new DateTime("2012-01-1"),
+        final BillingEvent event1 = invoiceUtil.createMockBillingEvent(null, subscription, new DateTime("2012-01-1"),
                                                            plan, phase1,
                                                            ZERO, null, Currency.USD, BillingPeriod.NO_BILLING_PERIOD, 1,
                                                            BillingModeType.IN_ADVANCE, "Test Event 1", 1L,
                                                            SubscriptionTransitionType.CREATE);
 
-        final BillingEvent event2 = createMockBillingEvent(null, subscription, changeDate,
+        final BillingEvent event2 = invoiceUtil.createMockBillingEvent(null, subscription, changeDate,
                                                            plan, phase2,
                                                            ZERO, null, Currency.USD, BillingPeriod.NO_BILLING_PERIOD, 1,
                                                            BillingModeType.IN_ADVANCE, "Test Event 2", 2L,
@@ -761,7 +759,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
         final Subscription sub = createZombieSubscription(subscriptionId);
         final Currency currency = Currency.USD;
 
-        return createMockBillingEvent(null, sub, startDate.toDateTimeAtStartOfDay(), plan, planPhase,
+        return invoiceUtil.createMockBillingEvent(null, sub, startDate.toDateTimeAtStartOfDay(), plan, planPhase,
                                       planPhase.getFixedPrice() == null ? null : planPhase.getFixedPrice().getPrice(currency),
                                       planPhase.getRecurringPrice() == null ? null : planPhase.getRecurringPrice().getPrice(currency),
                                       currency, planPhase.getBillingPeriod(),
@@ -933,7 +931,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
         events.setAccountInvoiceOff(true);
 
         final Subscription sub = createZombieSubscription();
-        final LocalDate startDate = buildDate(2011, 9, 1);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 9, 1);
 
         final Plan plan = new MockPlan();
         final BigDecimal rate1 = TEN;
@@ -942,7 +940,7 @@ public class TestDefaultInvoiceGenerator extends InvoicingTestBase {
         final BillingEvent event = createBillingEvent(sub.getId(), startDate, plan, phase, 1);
         events.add(event);
 
-        final LocalDate targetDate = buildDate(2011, 10, 3);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 10, 3);
         final UUID accountId = UUID.randomUUID();
         final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
 
diff --git a/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGeneratorUnit.java b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGeneratorUnit.java
index c5c7168..eedaa03 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGeneratorUnit.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGeneratorUnit.java
@@ -22,10 +22,10 @@ import java.util.List;
 import java.util.UUID;
 
 import org.joda.time.LocalDate;
-import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.invoice.InvoiceTestSuiteNoDB;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoiceItemType;
@@ -33,19 +33,12 @@ import com.ning.billing.invoice.model.CreditBalanceAdjInvoiceItem;
 import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
 import com.ning.billing.invoice.model.RecurringInvoiceItem;
 import com.ning.billing.invoice.model.RepairAdjInvoiceItem;
-import com.ning.billing.invoice.tests.InvoicingTestBase;
-import com.ning.billing.util.clock.Clock;
-import com.ning.billing.util.clock.ClockMock;
-import com.ning.billing.util.config.InvoiceConfig;
 
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 import static org.testng.Assert.assertEquals;
 
-public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
-
-    private DefaultInvoiceGenerator gen;
-    private Clock clock;
+public class TestDefaultInvoiceGeneratorUnit extends InvoiceTestSuiteNoDB {
 
     private final UUID invoiceId = UUID.randomUUID();
     private final UUID accountId = UUID.randomUUID();
@@ -55,28 +48,6 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
     private final String phaseName = "my-phase";
     private final Currency currency = Currency.USD;
 
-    public static final class TestDefaultInvoiceGeneratorMock extends DefaultInvoiceGenerator {
-
-        public TestDefaultInvoiceGeneratorMock(final Clock clock, final InvoiceConfig config) {
-            super(clock, config);
-        }
-    }
-
-    @BeforeClass(groups = "fast")
-    public void setup() {
-        clock = new ClockMock();
-        gen = new TestDefaultInvoiceGeneratorMock(clock, new InvoiceConfig() {
-            @Override
-            public boolean isEmailNotificationsEnabled() {
-                return false;
-            }
-
-            @Override
-            public int getNumberOfMonthsInFuture() {
-                return 5;
-            }
-        });
-    }
 
     @Test(groups = "fast")
     public void testRemoveCancellingInvoiceItemsFixedPrice() {
@@ -92,7 +63,7 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
         items.add(item1);
         items.add(new RepairAdjInvoiceItem(invoiceId, accountId, startDate, endDate, amount.negate(), currency, item1.getId()));
         items.add(new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, endDate, nextEndDate, amount2, rate2, currency));
-        gen.removeCancellingInvoiceItems(items);
+        ((DefaultInvoiceGenerator) generator).removeCancellingInvoiceItems(items);
         assertEquals(items.size(), 1);
         final InvoiceItem leftItem = items.get(0);
         assertEquals(leftItem.getInvoiceItemType(), InvoiceItemType.RECURRING);
@@ -114,7 +85,7 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
         items.add(item1);
         items.add(new RepairAdjInvoiceItem(invoiceId, accountId, startDate, endDate, amount1.negate(), currency, item1.getId()));
         items.add(new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, endDate, nextEndDate, amount2, rate2, currency));
-        gen.removeCancellingInvoiceItems(items);
+        ((DefaultInvoiceGenerator) generator).removeCancellingInvoiceItems(items);
         assertEquals(items.size(), 1);
         final InvoiceItem leftItem = items.get(0);
         assertEquals(leftItem.getInvoiceItemType(), InvoiceItemType.RECURRING);
@@ -138,7 +109,7 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
         final InvoiceItem other1 = new FixedPriceInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, amount, currency);
         proposed.add(other1);
 
-        gen.removeDuplicatedInvoiceItems(proposed, existing);
+        ((DefaultInvoiceGenerator) generator).removeDuplicatedInvoiceItems(proposed, existing);
         assertEquals(existing.size(), 1);
         assertEquals(proposed.size(), 0);
     }
@@ -160,7 +131,7 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
         proposed.add(other1);
         proposed.add(other2);
 
-        gen.removeDuplicatedInvoiceItems(proposed, existing);
+        ((DefaultInvoiceGenerator) generator).removeDuplicatedInvoiceItems(proposed, existing);
         assertEquals(existing.size(), 0);
         assertEquals(proposed.size(), 1);
     }
@@ -187,7 +158,7 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
         proposed.add(other1);
         proposed.add(other2);
 
-        gen.removeDuplicatedInvoiceItems(proposed, existing);
+        ((DefaultInvoiceGenerator) generator).removeDuplicatedInvoiceItems(proposed, existing);
         assertEquals(existing.size(), 0);
         assertEquals(proposed.size(), 1);
     }
@@ -214,7 +185,7 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
         proposed.add(item1);
         proposed.add(other);
 
-        gen.removeDuplicatedInvoiceItems(proposed, existing);
+        ((DefaultInvoiceGenerator) generator).removeDuplicatedInvoiceItems(proposed, existing);
         assertEquals(existing.size(), 0);
         assertEquals(proposed.size(), 1);
         final InvoiceItem leftItem = proposed.get(0);
@@ -243,7 +214,7 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
         proposed.add(item1);
         proposed.add(other);
 
-        gen.removeDuplicatedInvoiceItems(proposed, existing);
+        ((DefaultInvoiceGenerator) generator).removeDuplicatedInvoiceItems(proposed, existing);
         assertEquals(existing.size(), 0);
         assertEquals(proposed.size(), 1);
         final InvoiceItem leftItem = proposed.get(0);
@@ -273,7 +244,7 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
         final InvoiceItem other = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, endDate, nextEndDate, amount2, rate2, currency);
         proposed.add(other);
 
-        gen.addRepairedItems(existing, proposed);
+        ((DefaultInvoiceGenerator) generator).addRepairedItems(existing, proposed);
         assertEquals(existing.size(), 1);
         assertEquals(proposed.size(), 2);
         final InvoiceItem leftItem1 = proposed.get(0);
@@ -318,7 +289,7 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
         proposed.add(reversedItem1);
         proposed.add(newItem1);
 
-        gen.generateCBAForExistingInvoices(accountId, existingInvoices, proposed, currency);
+        ((DefaultInvoiceGenerator) generator).generateCBAForExistingInvoices(accountId, existingInvoices, proposed, currency);
 
         assertEquals(proposed.size(), 3);
         final InvoiceItem reversedItemCheck1 = proposed.get(0);
@@ -379,7 +350,7 @@ public class TestDefaultInvoiceGeneratorUnit extends InvoicingTestBase {
         final InvoiceItem item2 = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate.plusMonths(1), endDate.plusMonths(1), newAmount2, newRate2, currency);
         proposed.add(item2);
 
-        gen.consumeExistingCredit(invoiceId, firstInvoiceId, existing, proposed, currency);
+        ((DefaultInvoiceGenerator) generator).consumeExistingCredit(invoiceId, firstInvoiceId, existing, proposed, currency);
         assertEquals(proposed.size(), 2);
         final InvoiceItem item2Check = proposed.get(0);
         assertEquals(item2Check.getInvoiceId(), invoiceId);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/generator/TestInvoiceDateUtils.java b/invoice/src/test/java/com/ning/billing/invoice/generator/TestInvoiceDateUtils.java
index 311b0a2..5958a34 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/generator/TestInvoiceDateUtils.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/generator/TestInvoiceDateUtils.java
@@ -24,8 +24,9 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import com.ning.billing.catalog.api.BillingPeriod;
+import com.ning.billing.invoice.InvoiceTestSuiteNoDB;
 
-public class TestInvoiceDateUtils {
+public class TestInvoiceDateUtils extends InvoiceTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testLastBCDShouldNotBeBeforePreviousBCD() throws Exception {
diff --git a/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModule.java b/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModule.java
index dc73fed..01c1eb6 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModule.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModule.java
@@ -18,24 +18,21 @@ package com.ning.billing.invoice.glue;
 
 import org.mockito.Mockito;
 
-import com.ning.billing.GuicyKillbillTestWithEmbeddedDBModule;
 import com.ning.billing.catalog.glue.CatalogModule;
+import com.ning.billing.invoice.TestInvoiceUtil;
 import com.ning.billing.mock.glue.MockGlobalLockerModule;
 import com.ning.billing.util.email.EmailModule;
 import com.ning.billing.util.email.templates.TemplateModule;
 import com.ning.billing.util.glue.CacheModule;
-import com.ning.billing.util.glue.CallContextModule;
 import com.ning.billing.util.glue.CustomFieldModule;
-import com.ning.billing.util.glue.NonEntityDaoModule;
 import com.ning.billing.util.glue.NotificationQueueModule;
 import com.ning.billing.util.glue.TagStoreModule;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
 import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
 import com.ning.billing.util.svcapi.junction.BillingInternalApi;
 
-public class TestInvoiceModule extends DefaultInvoiceModule {
-
 
+public class TestInvoiceModule extends DefaultInvoiceModule {
 
     private void installExternalApis() {
         bind(EntitlementInternalApi.class).toInstance(Mockito.mock(EntitlementInternalApi.class));
@@ -60,5 +57,6 @@ public class TestInvoiceModule extends DefaultInvoiceModule {
 
         installExternalApis();
 
+        bind(TestInvoiceUtil.class).asEagerSingleton();
     }
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleWithEmbeddedDb.java b/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleWithEmbeddedDb.java
index f52f819..5986a0f 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleWithEmbeddedDb.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModuleWithEmbeddedDb.java
@@ -17,14 +17,18 @@
 package com.ning.billing.invoice.glue;
 
 import com.ning.billing.GuicyKillbillTestWithEmbeddedDBModule;
+import com.ning.billing.invoice.InvoiceListener;
+import com.ning.billing.invoice.TestInvoiceNotificationQListener;
 import com.ning.billing.util.glue.BusModule;
-import com.ning.billing.util.glue.CustomFieldModule;
 import com.ning.billing.util.glue.NonEntityDaoModule;
-import com.ning.billing.util.glue.NotificationQueueModule;
-import com.ning.billing.util.glue.TagStoreModule;
 
 public class TestInvoiceModuleWithEmbeddedDb extends TestInvoiceModule {
 
+    @Override
+    protected void installInvoiceListener() {
+        bind(InvoiceListener.class).to(TestInvoiceNotificationQListener.class).asEagerSingleton();
+        bind(TestInvoiceNotificationQListener.class).asEagerSingleton();
+    }
 
     @Override
     public void configure() {
diff --git a/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteNoDB.java b/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteNoDB.java
index 8c7dd0a..d322910 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteNoDB.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteNoDB.java
@@ -26,13 +26,11 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 
 import com.ning.billing.KillbillTestSuite;
-import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.InvoiceMigrationApi;
 import com.ning.billing.invoice.api.InvoicePaymentApi;
 import com.ning.billing.invoice.api.InvoiceUserApi;
 import com.ning.billing.invoice.dao.InvoiceDao;
 import com.ning.billing.invoice.generator.InvoiceGenerator;
-import com.ning.billing.invoice.glue.InvoiceModuleWithEmbeddedDb;
 import com.ning.billing.invoice.glue.TestInvoiceModuleNoDB;
 import com.ning.billing.util.api.TagUserApi;
 import com.ning.billing.util.cache.CacheControllerDispatcher;
@@ -57,8 +55,6 @@ public abstract class InvoiceTestSuiteNoDB extends KillbillTestSuite {
     private static final Logger log = LoggerFactory.getLogger(InvoiceTestSuiteNoDB.class);
 
 
-    protected static final Currency accountCurrency = Currency.USD;
-
     @Inject
     protected InternalBus bus;
     @Inject
@@ -91,6 +87,8 @@ public abstract class InvoiceTestSuiteNoDB extends KillbillTestSuite {
     protected InvoiceInternalApi invoiceInternalApi;
     @Inject
     protected InvoiceDao invoiceDao;
+    @Inject
+    protected TestInvoiceUtil invoiceUtil;
 
 
     @BeforeClass(groups = "fast")
@@ -113,7 +111,7 @@ public abstract class InvoiceTestSuiteNoDB extends KillbillTestSuite {
     }
 
     private static void loadSystemPropertiesFromClasspath(final String resource) {
-        final URL url = InvoiceModuleWithEmbeddedDb.class.getResource(resource);
+        final URL url = InvoiceTestSuiteNoDB.class.getResource(resource);
         assertNotNull(url);
         try {
             System.getProperties().load(url.openStream());
diff --git a/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java b/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java
index 683267b..25e4a60 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java
@@ -19,7 +19,6 @@ package com.ning.billing.invoice;
 import java.io.IOException;
 import java.net.URL;
 
-import org.skife.jdbi.v2.IDBI;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.annotations.AfterMethod;
@@ -28,21 +27,21 @@ import org.testng.annotations.BeforeMethod;
 
 import com.ning.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
 import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.invoice.api.DefaultInvoiceService;
 import com.ning.billing.invoice.api.InvoiceMigrationApi;
 import com.ning.billing.invoice.api.InvoicePaymentApi;
+import com.ning.billing.invoice.api.InvoiceService;
 import com.ning.billing.invoice.api.InvoiceUserApi;
 import com.ning.billing.invoice.dao.InvoiceDao;
-import com.ning.billing.invoice.dao.InvoiceItemSqlDao;
-import com.ning.billing.invoice.dao.InvoicePaymentSqlDao;
-import com.ning.billing.invoice.dao.InvoiceSqlDao;
 import com.ning.billing.invoice.generator.InvoiceGenerator;
-import com.ning.billing.invoice.glue.InvoiceModuleWithEmbeddedDb;
 import com.ning.billing.invoice.glue.TestInvoiceModuleWithEmbeddedDb;
+import com.ning.billing.invoice.notification.NextBillingDateNotifier;
 import com.ning.billing.util.api.TagUserApi;
 import com.ning.billing.util.cache.CacheControllerDispatcher;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.globallocker.GlobalLocker;
+import com.ning.billing.util.notificationq.NotificationQueueService;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
 import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
 import com.ning.billing.util.svcapi.invoice.InvoiceInternalApi;
@@ -64,6 +63,8 @@ public abstract class InvoiceTestSuiteWithEmbeddedDB extends GuicyKillbillTestSu
     protected static final Currency accountCurrency = Currency.USD;
 
     @Inject
+    protected InvoiceService invoiceService;
+    @Inject
     protected InternalBus bus;
     @Inject
     protected CacheControllerDispatcher controllerDispatcher;
@@ -95,6 +96,14 @@ public abstract class InvoiceTestSuiteWithEmbeddedDB extends GuicyKillbillTestSu
     protected InternalCallContextFactory internalCallContextFactory;
     @Inject
     protected InvoiceInternalApi invoiceInternalApi;
+    @Inject
+    protected NextBillingDateNotifier nextBillingDateNotifier;
+    @Inject
+    protected NotificationQueueService notificationQueueService;
+    @Inject
+    protected TestInvoiceUtil invoiceUtil;
+    @Inject
+    protected TestInvoiceNotificationQListener testInvoiceNotificationQListener;
 
 
     @BeforeClass(groups = "slow")
@@ -107,17 +116,30 @@ public abstract class InvoiceTestSuiteWithEmbeddedDB extends GuicyKillbillTestSu
     }
 
     @BeforeMethod(groups = "slow")
-    public void setupTest() {
+    public void setupTest() throws Exception {
         bus.start();
+        restartInvoiceService(invoiceService);
+    }
+
+    private void restartInvoiceService(final InvoiceService invoiceService) throws Exception {
+        ((DefaultInvoiceService) invoiceService).initialize();
+        ((DefaultInvoiceService) invoiceService).registerForNotifications();
+        ((DefaultInvoiceService) invoiceService).start();
+    }
+
+    private void stopInvoiceService(final InvoiceService invoiceService) throws Exception {
+        ((DefaultInvoiceService) invoiceService).unregisterForNotifications();
+        ((DefaultInvoiceService) invoiceService).stop();
     }
 
     @AfterMethod(groups = "slow")
-    public void cleanupTest() {
+    public void cleanupTest() throws Exception {
         bus.stop();
+        stopInvoiceService(invoiceService);
     }
 
     private static void loadSystemPropertiesFromClasspath(final String resource) {
-        final URL url = InvoiceModuleWithEmbeddedDb.class.getResource(resource);
+        final URL url = InvoiceTestSuiteWithEmbeddedDB.class.getResource(resource);
         assertNotNull(url);
         try {
             System.getProperties().load(url.openStream());
@@ -125,5 +147,4 @@ public abstract class InvoiceTestSuiteWithEmbeddedDB extends GuicyKillbillTestSu
             throw new RuntimeException(e);
         }
     }
-
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/model/TestExternalChargeInvoiceItem.java b/invoice/src/test/java/com/ning/billing/invoice/model/TestExternalChargeInvoiceItem.java
index c525627..178f3da 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/model/TestExternalChargeInvoiceItem.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/model/TestExternalChargeInvoiceItem.java
@@ -24,13 +24,12 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.invoice.InvoiceTestSuiteNoDB;
 import com.ning.billing.invoice.api.InvoiceItemType;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.clock.ClockMock;
 
-public class TestExternalChargeInvoiceItem {
-
-    private final Clock clock = new ClockMock();
+public class TestExternalChargeInvoiceItem extends InvoiceTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testEquals() throws Exception {
diff --git a/invoice/src/test/java/com/ning/billing/invoice/model/TestInAdvanceBillingMode.java b/invoice/src/test/java/com/ning/billing/invoice/model/TestInAdvanceBillingMode.java
index 3231760..a144342 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/model/TestInAdvanceBillingMode.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/model/TestInAdvanceBillingMode.java
@@ -27,8 +27,9 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import com.ning.billing.catalog.api.BillingPeriod;
+import com.ning.billing.invoice.InvoiceTestSuiteNoDB;
 
-public class TestInAdvanceBillingMode {
+public class TestInAdvanceBillingMode extends InvoiceTestSuiteNoDB {
 
     private static final DateTimeZone TIMEZONE = DateTimeZone.forID("Pacific/Pitcairn");
     private static final BillingPeriod BILLING_PERIOD = BillingPeriod.MONTHLY;
diff --git a/invoice/src/test/java/com/ning/billing/invoice/model/TestItemAdjInvoiceItem.java b/invoice/src/test/java/com/ning/billing/invoice/model/TestItemAdjInvoiceItem.java
index 316b613..00dbcca 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/model/TestItemAdjInvoiceItem.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/model/TestItemAdjInvoiceItem.java
@@ -24,10 +24,11 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.invoice.InvoiceTestSuiteNoDB;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoiceItemType;
 
-public class TestItemAdjInvoiceItem {
+public class TestItemAdjInvoiceItem extends InvoiceTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testType() throws Exception {
diff --git a/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java b/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java
index 3d5cc76..0090f26 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java
@@ -16,187 +16,38 @@
 
 package com.ning.billing.invoice.notification;
 
-import java.io.IOException;
-import java.sql.SQLException;
 import java.util.UUID;
 import java.util.concurrent.Callable;
 
 import org.joda.time.DateTime;
-import org.mockito.Mockito;
-import org.skife.config.ConfigurationObjectFactory;
-import org.skife.jdbi.v2.IDBI;
 import org.testng.Assert;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-import com.ning.billing.KillbillTestSuiteWithEmbeddedDB;
-import com.ning.billing.catalog.MockCatalogModule;
-import com.ning.billing.dbi.DBIProvider;
-import com.ning.billing.dbi.DBTestingHelper;
-import com.ning.billing.dbi.DbiConfig;
-import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.Subscription;
-import com.ning.billing.invoice.InvoiceDispatcher;
-import com.ning.billing.invoice.InvoiceListener;
 import com.ning.billing.invoice.InvoiceTestSuiteWithEmbeddedDB;
-import com.ning.billing.invoice.api.formatters.InvoiceFormatterFactory;
-import com.ning.billing.invoice.glue.InvoiceModuleWithMocks;
-import com.ning.billing.invoice.template.formatters.DefaultInvoiceFormatterFactory;
-import com.ning.billing.lifecycle.KillbillService;
-import com.ning.billing.mock.glue.MockJunctionModule;
-import com.ning.billing.util.cache.CacheControllerDispatcher;
-import com.ning.billing.util.callcontext.InternalCallContextFactory;
-import com.ning.billing.util.callcontext.InternalTenantContext;
-import com.ning.billing.util.clock.Clock;
+import com.ning.billing.invoice.api.DefaultInvoiceService;
 import com.ning.billing.util.clock.ClockMock;
-import com.ning.billing.util.config.InvoiceConfig;
-import com.ning.billing.util.dao.NonEntityDao;
-import com.ning.billing.util.email.templates.TemplateModule;
-import com.ning.billing.util.entity.dao.EntitySqlDao;
-import com.ning.billing.util.entity.dao.EntitySqlDaoTransactionWrapper;
-import com.ning.billing.util.entity.dao.EntitySqlDaoTransactionalJdbiWrapper;
-import com.ning.billing.util.entity.dao.EntitySqlDaoWrapperFactory;
-import com.ning.billing.util.glue.BusModule;
-import com.ning.billing.util.glue.BusModule.BusType;
-import com.ning.billing.util.glue.CacheModule;
-import com.ning.billing.util.glue.NonEntityDaoModule;
-import com.ning.billing.util.glue.NotificationQueueModule;
-import com.ning.billing.util.glue.TagStoreModule;
-import com.ning.billing.util.notificationq.NotificationQueueService;
-import com.ning.billing.util.svcapi.account.AccountInternalApi;
-import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
-import com.ning.billing.util.svcsapi.bus.InternalBus;
-
-import com.google.inject.AbstractModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import com.google.inject.Stage;
+import com.ning.billing.util.notificationq.NotificationQueue;
 
 import static com.jayway.awaitility.Awaitility.await;
 import static java.util.concurrent.TimeUnit.MINUTES;
 
 public class TestNextBillingDateNotifier extends InvoiceTestSuiteWithEmbeddedDB {
 
-    private Clock clock;
-    private DefaultNextBillingDateNotifier notifier;
-    private InternalBus eventBus;
-    private InvoiceListenerMock listener;
-    private NotificationQueueService notificationQueueService;
-    private InternalCallContextFactory internalCallContextFactory;
-    private EntitySqlDaoTransactionalJdbiWrapper entitySqlDaoTransactionalJdbiWrapper;
-    private CacheControllerDispatcher controllerDispatcher;
-    private NonEntityDao nonEntityDao;
-
-    private static final class InvoiceListenerMock extends InvoiceListener {
-
-        int eventCount = 0;
-        UUID latestSubscriptionId = null;
-
-        public InvoiceListenerMock(final InternalCallContextFactory internalCallContextFactory, final InvoiceDispatcher dispatcher) {
-            super(internalCallContextFactory, dispatcher);
-        }
-
-        @Override
-        public void handleNextBillingDateEvent(final UUID subscriptionId, final DateTime eventDateTime, final UUID userToken, final Long accountRecordId, final Long tenantRecordId) {
-            eventCount++;
-            latestSubscriptionId = subscriptionId;
-        }
-
-        public int getEventCount() {
-            return eventCount;
-        }
-
-        public UUID getLatestSubscriptionId() {
-            return latestSubscriptionId;
-        }
-
-    }
-
-    @BeforeClass(groups = {"slow"})
-    public void setup() throws KillbillService.ServiceException, IOException, ClassNotFoundException, SQLException, EntitlementUserApiException {
-        //TestApiBase.loadSystemPropertiesFromClasspath("/entitlement.properties");
-        final Injector g = Guice.createInjector(Stage.PRODUCTION, new AbstractModule() {
-            @Override
-            protected void configure() {
-
-                final ClockMock clock = new ClockMock();
-                bind(Clock.class).toInstance(clock);
-                bind(ClockMock.class).toInstance(clock);
-
-                install(new BusModule(BusType.MEMORY));
-                install(new InvoiceModuleWithMocks());
-                install(new MockJunctionModule());
-                install(new MockCatalogModule());
-                install(new NotificationQueueModule());
-                install(new TemplateModule());
-                install(new TagStoreModule());
-                install(new CacheModule());
-                install(new NonEntityDaoModule());
-
-                final DBTestingHelper helper = KillbillTestSuiteWithEmbeddedDB.getDBTestingHelper();
-                if (helper.isUsingLocalInstance()) {
-                    bind(IDBI.class).toProvider(DBIProvider.class).asEagerSingleton();
-                    final DbiConfig config = new ConfigurationObjectFactory(System.getProperties()).build(DbiConfig.class);
-                    bind(DbiConfig.class).toInstance(config);
-                } else {
-                    final IDBI dbi = helper.getDBI();
-                    bind(IDBI.class).toInstance(dbi);
-                }
-
-                /*
-                final InternalCallContextFactory internalCallContextFactory = new InternalCallContextFactory(helper.getDBI(), clock, nonEntityDao);
-                bind(InternalCallContextFactory.class).toInstance(internalCallContextFactory);
-*/
-                bind(InvoiceFormatterFactory.class).to(DefaultInvoiceFormatterFactory.class).asEagerSingleton();
-
-                bind(AccountInternalApi.class).toInstance(Mockito.mock(AccountInternalApi.class));
-                bind(EntitlementInternalApi.class).toInstance(Mockito.mock(EntitlementInternalApi.class));
-            }
-        });
-
-        clock = g.getInstance(Clock.class);
-        final IDBI dbi = g.getInstance(IDBI.class);
-
-        nonEntityDao = g.getInstance(NonEntityDao.class);
-        controllerDispatcher = g.getInstance(CacheControllerDispatcher.class);
-
-        entitySqlDaoTransactionalJdbiWrapper = new EntitySqlDaoTransactionalJdbiWrapper(dbi, clock, controllerDispatcher, nonEntityDao);
-
-        eventBus = g.getInstance(InternalBus.class);
-        notificationQueueService = g.getInstance(NotificationQueueService.class);
-        final InvoiceDispatcher dispatcher = g.getInstance(InvoiceDispatcher.class);
-
-        final Subscription subscription = Mockito.mock(Subscription.class);
-        final EntitlementInternalApi entitlementUserApi = Mockito.mock(EntitlementInternalApi.class);
-        Mockito.when(entitlementUserApi.getSubscriptionFromId(Mockito.<UUID>any(), Mockito.<InternalTenantContext>any())).thenReturn(subscription);
-
-        internalCallContextFactory = g.getInstance(InternalCallContextFactory.class);
-        listener = new InvoiceListenerMock(internalCallContextFactory, dispatcher);
-        notifier = new DefaultNextBillingDateNotifier(notificationQueueService, g.getInstance(InvoiceConfig.class), entitlementUserApi,
-                                                      listener, internalCallContextFactory);
-    }
-
     @Test(groups = "slow")
     public void testInvoiceNotifier() throws Exception {
 
         final UUID accountId = UUID.randomUUID();
-        final UUID subscriptionId = new UUID(0L, 1L);
+        final Subscription subscription = invoiceUtil.createSubscription();
+        final UUID subscriptionId = subscription.getId();
         final DateTime now = new DateTime();
         final DateTime readyTime = now.plusMillis(2000);
-        final NextBillingDatePoster poster = new DefaultNextBillingDatePoster(notificationQueueService, internalCallContextFactory);
 
-        eventBus.start();
-        notifier.initialize();
-        notifier.start();
 
-        entitySqlDaoTransactionalJdbiWrapper.execute(new EntitySqlDaoTransactionWrapper<Void>() {
-            @Override
-            public Void inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
-                poster.insertNextBillingNotification(entitySqlDaoWrapperFactory, accountId, subscriptionId, readyTime, UUID.randomUUID());
-                return null;
-            }
-        });
+        final NotificationQueue nextBillingQueue = notificationQueueService.getNotificationQueue(DefaultInvoiceService.INVOICE_SERVICE_NAME, DefaultNextBillingDateNotifier.NEXT_BILLING_DATE_NOTIFIER_QUEUE);
+
+
+        nextBillingQueue.recordFutureNotification(now, new NextBillingDateNotificationKey(subscriptionId), internalCallContext);
 
         // Move time in the future after the notification effectiveDate
         ((ClockMock) clock).setDeltaFromReality(3000);
@@ -204,16 +55,11 @@ public class TestNextBillingDateNotifier extends InvoiceTestSuiteWithEmbeddedDB 
         await().atMost(1, MINUTES).until(new Callable<Boolean>() {
             @Override
             public Boolean call() throws Exception {
-                return listener.getEventCount() == 1;
+                return testInvoiceNotificationQListener.getEventCount() == 1;
             }
         });
 
-        Assert.assertEquals(listener.getEventCount(), 1);
-        Assert.assertEquals(listener.getLatestSubscriptionId(), subscriptionId);
-    }
-
-    @AfterClass(groups = "slow")
-    public void tearDown() throws Exception {
-        notifier.stop();
+        Assert.assertEquals(testInvoiceNotificationQListener.getEventCount(), 1);
+        Assert.assertEquals(testInvoiceNotificationQListener.getLatestSubscriptionId(), subscriptionId);
     }
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java b/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java
index 1c6726c..1bad422 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java
@@ -26,6 +26,7 @@ import java.util.UUID;
 import org.joda.time.LocalDate;
 import org.skife.config.ConfigurationObjectFactory;
 import org.testng.Assert;
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeSuite;
 import org.testng.annotations.Test;
 
@@ -49,8 +50,9 @@ public class TestDefaultInvoiceFormatter extends InvoiceTestSuiteNoDB {
     private TranslatorConfig config;
     private MustacheTemplateEngine templateEngine;
 
-    @BeforeSuite(groups = "fast")
-    public void setup() {
+    @BeforeClass(groups = "fast")
+    public void setup() throws Exception {
+        super.setup();
         config = new ConfigurationObjectFactory(System.getProperties()).build(TranslatorConfig.class);
         templateEngine = new MustacheTemplateEngine();
     }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceItemFormatter.java b/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceItemFormatter.java
index 9c14d71..becf514 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceItemFormatter.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/template/formatters/TestDefaultInvoiceItemFormatter.java
@@ -26,6 +26,7 @@ import org.joda.time.LocalDate;
 import org.joda.time.format.DateTimeFormat;
 import org.skife.config.ConfigurationObjectFactory;
 import org.testng.Assert;
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeSuite;
 import org.testng.annotations.Test;
 
@@ -43,8 +44,9 @@ public class TestDefaultInvoiceItemFormatter extends InvoiceTestSuiteNoDB {
     private TranslatorConfig config;
     private MustacheTemplateEngine templateEngine;
 
-    @BeforeSuite(groups = "fast")
-    public void setup() {
+    @BeforeClass(groups = "fast")
+    public void setup() throws Exception {
+        super.setup();
         config = new ConfigurationObjectFactory(System.getProperties()).build(TranslatorConfig.class);
         templateEngine = new MustacheTemplateEngine();
     }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/TestHtmlInvoiceGenerator.java b/invoice/src/test/java/com/ning/billing/invoice/TestHtmlInvoiceGenerator.java
index ce08611..fabe13b 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/TestHtmlInvoiceGenerator.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/TestHtmlInvoiceGenerator.java
@@ -27,6 +27,7 @@ import org.joda.time.LocalDate;
 import org.mockito.Mockito;
 import org.skife.config.ConfigurationObjectFactory;
 import org.testng.Assert;
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeSuite;
 import org.testng.annotations.Test;
 
@@ -45,8 +46,9 @@ public class TestHtmlInvoiceGenerator extends InvoiceTestSuiteNoDB {
 
     private HtmlInvoiceGenerator g;
 
-    @BeforeSuite(groups = "fast")
-    public void setup() {
+    @BeforeClass(groups = "fast")
+    public void setup() throws Exception {
+        super.setup();
         final TranslatorConfig config = new ConfigurationObjectFactory(System.getProperties()).build(TranslatorConfig.class);
         final TemplateEngine templateEngine = new MustacheTemplateEngine();
         final InvoiceFormatterFactory factory = new DefaultInvoiceFormatterFactory();
diff --git a/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java b/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java
index c339485..ccd09f7 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java
@@ -29,9 +29,7 @@ import org.mockito.Mockito;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.Assert;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.Guice;
+import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.ning.billing.account.api.Account;
@@ -51,101 +49,25 @@ import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoiceItemType;
 import com.ning.billing.invoice.api.InvoiceNotifier;
-import com.ning.billing.invoice.dao.InvoiceDao;
 import com.ning.billing.invoice.dao.InvoiceItemModelDao;
 import com.ning.billing.invoice.dao.InvoiceModelDao;
-import com.ning.billing.invoice.generator.InvoiceGenerator;
-import com.ning.billing.invoice.notification.NextBillingDateNotifier;
 import com.ning.billing.invoice.notification.NullInvoiceNotifier;
-import com.ning.billing.invoice.tests.InvoicingTestBase;
-import com.ning.billing.mock.api.MockBillCycleDay;
-import com.ning.billing.util.bus.DefaultBusService;
 import com.ning.billing.util.callcontext.InternalCallContext;
-import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.clock.ClockMock;
-import com.ning.billing.util.globallocker.GlobalLocker;
-import com.ning.billing.util.svcapi.account.AccountInternalApi;
-import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
 import com.ning.billing.util.svcapi.junction.BillingEventSet;
-import com.ning.billing.util.svcapi.junction.BillingInternalApi;
 import com.ning.billing.util.svcapi.junction.BillingModeType;
-import com.ning.billing.util.svcsapi.bus.BusService;
 
-import com.google.inject.Inject;
-
-@Guice(modules = {MockModule.class})
-public class TestInvoiceDispatcher extends InvoicingTestBase {
-
-    private final Logger log = LoggerFactory.getLogger(TestInvoiceDispatcher.class);
-
-    @Inject
-    private InvoiceGenerator generator;
-
-    @Inject
-    private InvoiceDao invoiceDao;
-
-    @Inject
-    private GlobalLocker locker;
-
-    @Inject
-    private NextBillingDateNotifier notifier;
-
-    @Inject
-    private BusService busService;
-
-    @Inject
-    private BillingInternalApi billingApi;
-
-    @Inject
-    private ClockMock clock;
-
-    @Inject
-    private AccountInternalApi accountInternalApi;
-
-    @Inject
-    private EntitlementInternalApi entitlementInternalApi;
-
-    @Inject
-    private InternalCallContextFactory internalCallContextFactory;
+public class TestInvoiceDispatcher extends InvoiceTestSuiteWithEmbeddedDB {
 
     private Account account;
     private Subscription subscription;
 
-    @BeforeSuite(groups = "slow")
-    public void setup() throws Exception {
-        notifier.initialize();
-        notifier.start();
-
-        busService.getBus().start();
-
-        account = Mockito.mock(Account.class);
-
-        final UUID accountId = UUID.randomUUID();
-
-        Mockito.when(accountInternalApi.getAccountById(Mockito.<UUID>any(), Mockito.<InternalTenantContext>any())).thenReturn(account);
-
-        Mockito.when(account.getCurrency()).thenReturn(Currency.USD);
-        Mockito.when(account.getId()).thenReturn(accountId);
-        Mockito.when(account.isNotifiedForInvoices()).thenReturn(true);
-        Mockito.when(account.getBillCycleDay()).thenReturn(new MockBillCycleDay(30));
-        // The timezone is required to compute the date of the next invoice notification
-        Mockito.when(account.getTimeZone()).thenReturn(DateTimeZone.UTC);
-
-        subscription = Mockito.mock(Subscription.class);
-        final UUID subscriptionId = UUID.randomUUID();
-        Mockito.when(subscription.getId()).thenReturn(subscriptionId);
-        Mockito.when(subscription.getBundleId()).thenReturn(new UUID(0L, 0L));
-    }
-
-    @AfterClass(groups = "slow")
-    public void tearDown() {
-        try {
-            ((DefaultBusService) busService).stopBus();
-            notifier.stop();
-        } catch (Exception e) {
-            log.warn("Failed to tearDown test properly ", e);
-        }
+    @BeforeMethod(groups = "slow")
+    public void setupTest() throws Exception {
+        super.setupTest();
+        account = invoiceUtil.createAccount();
+        subscription = invoiceUtil.createSubscription();
     }
 
     @Test(groups = "slow")
@@ -158,16 +80,16 @@ public class TestInvoiceDispatcher extends InvoicingTestBase {
         final DateTime effectiveDate = new DateTime().minusDays(1);
         final Currency currency = Currency.USD;
         final BigDecimal fixedPrice = null;
-        events.add(createMockBillingEvent(account, subscription, effectiveDate, plan, planPhase,
-                                          fixedPrice, BigDecimal.ONE, currency, BillingPeriod.MONTHLY, 1,
-                                          BillingModeType.IN_ADVANCE, "", 1L, SubscriptionTransitionType.CREATE));
+        events.add(invoiceUtil.createMockBillingEvent(account, subscription, effectiveDate, plan, planPhase,
+                                                      fixedPrice, BigDecimal.ONE, currency, BillingPeriod.MONTHLY, 1,
+                                                      BillingModeType.IN_ADVANCE, "", 1L, SubscriptionTransitionType.CREATE));
 
         Mockito.when(billingApi.getBillingEventsForAccountAndUpdateAccountBCD(Mockito.<UUID>any(), Mockito.<InternalCallContext>any())).thenReturn(events);
 
         final DateTime target = new DateTime();
 
         final InvoiceNotifier invoiceNotifier = new NullInvoiceNotifier();
-        final InvoiceDispatcher dispatcher = new InvoiceDispatcher(generator, accountInternalApi, billingApi, entitlementInternalApi, invoiceDao,
+        final InvoiceDispatcher dispatcher = new InvoiceDispatcher(generator, accountApi, billingApi, entitlementApi, invoiceDao,
                                                                    invoiceNotifier, locker, busService.getBus(),
                                                                    clock);
 
@@ -199,29 +121,29 @@ public class TestInvoiceDispatcher extends InvoicingTestBase {
 
         // Initial trial
         final MockPlan bicycleTrialEvergreen1USD = MockPlan.createBicycleTrialEvergreen1USD();
-        events.add(createMockBillingEvent(account, subscription, new DateTime("2012-05-01T00:03:42.000Z"), bicycleTrialEvergreen1USD,
-                                          new MockPlanPhase(bicycleTrialEvergreen1USD, PhaseType.TRIAL), BigDecimal.ZERO, null, account.getCurrency(), BillingPeriod.NO_BILLING_PERIOD,
-                                          31, 31, BillingModeType.IN_ADVANCE, "CREATE", 1L, SubscriptionTransitionType.CREATE));
+        events.add(invoiceUtil.createMockBillingEvent(account, subscription, new DateTime("2012-05-01T00:03:42.000Z"), bicycleTrialEvergreen1USD,
+                                                      new MockPlanPhase(bicycleTrialEvergreen1USD, PhaseType.TRIAL), BigDecimal.ZERO, null, account.getCurrency(), BillingPeriod.NO_BILLING_PERIOD,
+                                                      31, 31, BillingModeType.IN_ADVANCE, "CREATE", 1L, SubscriptionTransitionType.CREATE));
         // Phase change to evergreen
-        events.add(createMockBillingEvent(account, subscription, new DateTime("2012-05-31T00:03:42.000Z"), bicycleTrialEvergreen1USD,
-                                          new MockPlanPhase(bicycleTrialEvergreen1USD, PhaseType.EVERGREEN), null, new BigDecimal("249.95"), account.getCurrency(), BillingPeriod.MONTHLY,
-                                          31, 31, BillingModeType.IN_ADVANCE, "PHASE", 2L, SubscriptionTransitionType.PHASE));
+        events.add(invoiceUtil.createMockBillingEvent(account, subscription, new DateTime("2012-05-31T00:03:42.000Z"), bicycleTrialEvergreen1USD,
+                                                      new MockPlanPhase(bicycleTrialEvergreen1USD, PhaseType.EVERGREEN), null, new BigDecimal("249.95"), account.getCurrency(), BillingPeriod.MONTHLY,
+                                                      31, 31, BillingModeType.IN_ADVANCE, "PHASE", 2L, SubscriptionTransitionType.PHASE));
         // Overdue period
-        events.add(createMockBillingEvent(account, subscription, new DateTime("2012-07-15T00:00:00.000Z"), bicycleTrialEvergreen1USD,
-                                          new MockPlanPhase(bicycleTrialEvergreen1USD, PhaseType.EVERGREEN), null, null, account.getCurrency(), BillingPeriod.NO_BILLING_PERIOD,
-                                          31, 31, BillingModeType.IN_ADVANCE, "", 0L, SubscriptionTransitionType.START_BILLING_DISABLED));
-        events.add(createMockBillingEvent(account, subscription, new DateTime("2012-07-25T00:00:00.000Z"), bicycleTrialEvergreen1USD,
-                                          new MockPlanPhase(bicycleTrialEvergreen1USD, PhaseType.EVERGREEN), null, new BigDecimal("249.95"), account.getCurrency(), BillingPeriod.MONTHLY,
-                                          31, 31, BillingModeType.IN_ADVANCE, "", 1L, SubscriptionTransitionType.END_BILLING_DISABLED));
+        events.add(invoiceUtil.createMockBillingEvent(account, subscription, new DateTime("2012-07-15T00:00:00.000Z"), bicycleTrialEvergreen1USD,
+                                                      new MockPlanPhase(bicycleTrialEvergreen1USD, PhaseType.EVERGREEN), null, null, account.getCurrency(), BillingPeriod.NO_BILLING_PERIOD,
+                                                      31, 31, BillingModeType.IN_ADVANCE, "", 0L, SubscriptionTransitionType.START_BILLING_DISABLED));
+        events.add(invoiceUtil.createMockBillingEvent(account, subscription, new DateTime("2012-07-25T00:00:00.000Z"), bicycleTrialEvergreen1USD,
+                                                      new MockPlanPhase(bicycleTrialEvergreen1USD, PhaseType.EVERGREEN), null, new BigDecimal("249.95"), account.getCurrency(), BillingPeriod.MONTHLY,
+                                                      31, 31, BillingModeType.IN_ADVANCE, "", 1L, SubscriptionTransitionType.END_BILLING_DISABLED));
         // Upgrade after the overdue period
         final MockPlan jetTrialEvergreen1000USD = MockPlan.createJetTrialEvergreen1000USD();
-        events.add(createMockBillingEvent(account, subscription, new DateTime("2012-07-25T00:04:00.000Z"), jetTrialEvergreen1000USD,
-                                          new MockPlanPhase(jetTrialEvergreen1000USD, PhaseType.EVERGREEN), null, new BigDecimal("1000"), account.getCurrency(), BillingPeriod.MONTHLY,
-                                          31, 31, BillingModeType.IN_ADVANCE, "CHANGE", 3L, SubscriptionTransitionType.CHANGE));
+        events.add(invoiceUtil.createMockBillingEvent(account, subscription, new DateTime("2012-07-25T00:04:00.000Z"), jetTrialEvergreen1000USD,
+                                                      new MockPlanPhase(jetTrialEvergreen1000USD, PhaseType.EVERGREEN), null, new BigDecimal("1000"), account.getCurrency(), BillingPeriod.MONTHLY,
+                                                      31, 31, BillingModeType.IN_ADVANCE, "CHANGE", 3L, SubscriptionTransitionType.CHANGE));
 
         Mockito.when(billingApi.getBillingEventsForAccountAndUpdateAccountBCD(Mockito.<UUID>any(), Mockito.<InternalCallContext>any())).thenReturn(events);
         final InvoiceNotifier invoiceNotifier = new NullInvoiceNotifier();
-        final InvoiceDispatcher dispatcher = new InvoiceDispatcher(generator, accountInternalApi, billingApi, entitlementInternalApi, invoiceDao,
+        final InvoiceDispatcher dispatcher = new InvoiceDispatcher(generator, accountApi, billingApi, entitlementApi, invoiceDao,
                                                                    invoiceNotifier, locker, busService.getBus(),
                                                                    clock);
 
@@ -269,19 +191,19 @@ public class TestInvoiceDispatcher extends InvoicingTestBase {
     public void testCreateNextFutureNotificationDate() throws Exception {
 
 
-
         final LocalDate startDate = new LocalDate("2012-10-26");
         final LocalDate endDate = new LocalDate("2012-11-26");
 
-        clock.setTime(new DateTime(2012, 10, 26, 1, 12, 23, DateTimeZone.UTC));
 
-        final InvoiceDispatcher.DateAndTimeZoneContext dateAndTimeZoneContext = new DateAndTimeZoneContext(clock.getUTCNow(),DateTimeZone.forID("Pacific/Pitcairn"), clock);
+        ((ClockMock) clock).setTime(new DateTime(2012, 10, 26, 1, 12, 23, DateTimeZone.UTC));
+
+        final InvoiceDispatcher.DateAndTimeZoneContext dateAndTimeZoneContext = new DateAndTimeZoneContext(clock.getUTCNow(), DateTimeZone.forID("Pacific/Pitcairn"), clock);
 
         final InvoiceItemModelDao item = new InvoiceItemModelDao(UUID.randomUUID(), clock.getUTCNow(), InvoiceItemType.RECURRING, UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(),
                                                                  "planName", "phaseName", startDate, endDate, new BigDecimal("23.9"), new BigDecimal("23.9"), Currency.EUR, null);
 
         final InvoiceNotifier invoiceNotifier = new NullInvoiceNotifier();
-        final InvoiceDispatcher dispatcher = new InvoiceDispatcher(generator, accountInternalApi, billingApi, entitlementInternalApi, invoiceDao,
+        final InvoiceDispatcher dispatcher = new InvoiceDispatcher(generator, accountApi, billingApi, entitlementApi, invoiceDao,
                                                                    invoiceNotifier, locker, busService.getBus(),
                                                                    clock);
 
diff --git a/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceNotificationQListener.java b/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceNotificationQListener.java
new file mode 100644
index 0000000..d426de5
--- /dev/null
+++ b/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceNotificationQListener.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010-2013 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.invoice;
+
+import java.util.UUID;
+
+import javax.inject.Inject;
+
+import org.joda.time.DateTime;
+
+import com.ning.billing.util.callcontext.InternalCallContextFactory;
+
+public class TestInvoiceNotificationQListener extends InvoiceListener {
+
+    int eventCount = 0;
+    UUID latestSubscriptionId = null;
+
+    @Inject
+    public TestInvoiceNotificationQListener(final InternalCallContextFactory internalCallContextFactory, final InvoiceDispatcher dispatcher) {
+        super(internalCallContextFactory, dispatcher);
+    }
+
+    @Override
+    public void handleNextBillingDateEvent(final UUID subscriptionId, final DateTime eventDateTime, final UUID userToken, final Long accountRecordId, final Long tenantRecordId) {
+        eventCount++;
+        latestSubscriptionId = subscriptionId;
+    }
+
+    public int getEventCount() {
+        return eventCount;
+    }
+
+    public UUID getLatestSubscriptionId() {
+        return latestSubscriptionId;
+    }
+
+}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceUtil.java b/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceUtil.java
new file mode 100644
index 0000000..e248328
--- /dev/null
+++ b/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceUtil.java
@@ -0,0 +1,420 @@
+/*
+ * Copyright 2010-2013 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.invoice;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.UUID;
+
+import javax.annotation.Nullable;
+import javax.inject.Inject;
+
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
+import org.mockito.Mockito;
+import org.skife.jdbi.v2.IDBI;
+import org.testng.Assert;
+
+import com.ning.billing.account.api.Account;
+import com.ning.billing.account.api.AccountApiException;
+import com.ning.billing.account.api.BillCycleDay;
+import com.ning.billing.catalog.MockPlan;
+import com.ning.billing.catalog.MockPlanPhase;
+import com.ning.billing.catalog.api.BillingPeriod;
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.catalog.api.Plan;
+import com.ning.billing.catalog.api.PlanPhase;
+import com.ning.billing.entitlement.api.SubscriptionTransitionType;
+import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
+import com.ning.billing.entitlement.api.user.Subscription;
+import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.invoice.api.InvoiceApiException;
+import com.ning.billing.invoice.api.InvoiceItem;
+import com.ning.billing.invoice.api.InvoiceMigrationApi;
+import com.ning.billing.invoice.api.InvoiceNotifier;
+import com.ning.billing.invoice.api.InvoicePayment;
+import com.ning.billing.invoice.api.InvoicePaymentApi;
+import com.ning.billing.invoice.api.InvoiceUserApi;
+import com.ning.billing.invoice.dao.InvoiceDao;
+import com.ning.billing.invoice.dao.InvoiceItemModelDao;
+import com.ning.billing.invoice.dao.InvoiceItemSqlDao;
+import com.ning.billing.invoice.dao.InvoiceModelDao;
+import com.ning.billing.invoice.dao.InvoiceModelDaoHelper;
+import com.ning.billing.invoice.dao.InvoicePaymentModelDao;
+import com.ning.billing.invoice.dao.InvoicePaymentSqlDao;
+import com.ning.billing.invoice.dao.InvoiceSqlDao;
+import com.ning.billing.invoice.generator.InvoiceGenerator;
+import com.ning.billing.invoice.model.InvoicingConfiguration;
+import com.ning.billing.invoice.notification.NullInvoiceNotifier;
+import com.ning.billing.mock.api.MockBillCycleDay;
+import com.ning.billing.util.api.TagUserApi;
+import com.ning.billing.util.callcontext.InternalCallContext;
+import com.ning.billing.util.callcontext.InternalCallContextFactory;
+import com.ning.billing.util.callcontext.InternalTenantContext;
+import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.entity.EntityPersistenceException;
+import com.ning.billing.util.globallocker.GlobalLocker;
+import com.ning.billing.util.svcapi.account.AccountInternalApi;
+import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
+import com.ning.billing.util.svcapi.junction.BillingEvent;
+import com.ning.billing.util.svcapi.junction.BillingEventSet;
+import com.ning.billing.util.svcapi.junction.BillingInternalApi;
+import com.ning.billing.util.svcapi.junction.BillingModeType;
+import com.ning.billing.util.svcsapi.bus.BusService;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
+public class TestInvoiceUtil {
+
+
+    public static final Currency accountCurrency = Currency.USD;
+
+    public static final int NUMBER_OF_DECIMALS = InvoicingConfiguration.getNumberOfDecimals();
+    public static final int ROUNDING_METHOD = InvoicingConfiguration.getRoundingMode();
+
+    public static final BigDecimal ZERO = new BigDecimal("0.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal ONE_HALF = new BigDecimal("0.5").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal ONE = new BigDecimal("1.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal ONE_AND_A_HALF = new BigDecimal("1.5").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal TWO = new BigDecimal("2.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal THREE = new BigDecimal("3.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal FOUR = new BigDecimal("4.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal FIVE = new BigDecimal("5.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal SIX = new BigDecimal("6.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal SEVEN = new BigDecimal("7.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal EIGHT = new BigDecimal("8.0").setScale(NUMBER_OF_DECIMALS);
+
+    public static final BigDecimal TEN = new BigDecimal("10.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal ELEVEN = new BigDecimal("11.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal TWELVE = new BigDecimal("12.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal THIRTEEN = new BigDecimal("13.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal FOURTEEN = new BigDecimal("14.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal FIFTEEN = new BigDecimal("15.0").setScale(NUMBER_OF_DECIMALS);
+
+    public static final BigDecimal NINETEEN = new BigDecimal("19.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal TWENTY = new BigDecimal("20.0").setScale(NUMBER_OF_DECIMALS);
+
+    public static final BigDecimal TWENTY_FOUR = new BigDecimal("24.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal TWENTY_FIVE = new BigDecimal("25.0").setScale(NUMBER_OF_DECIMALS);
+
+    public static final BigDecimal TWENTY_SEVEN = new BigDecimal("27.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal TWENTY_EIGHT = new BigDecimal("28.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal TWENTY_NINE = new BigDecimal("29.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal THIRTY = new BigDecimal("30.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal THIRTY_ONE = new BigDecimal("31.0").setScale(NUMBER_OF_DECIMALS);
+
+    public static final BigDecimal FORTY = new BigDecimal("40.0").setScale(NUMBER_OF_DECIMALS);
+
+    public static final BigDecimal EIGHTY_NINE = new BigDecimal("89.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal NINETY = new BigDecimal("90.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal NINETY_ONE = new BigDecimal("91.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal NINETY_TWO = new BigDecimal("92.0").setScale(NUMBER_OF_DECIMALS);
+
+    public static final BigDecimal ONE_HUNDRED = new BigDecimal("100.0").setScale(NUMBER_OF_DECIMALS);
+
+    public static final BigDecimal THREE_HUNDRED_AND_SIXTY_FIVE = new BigDecimal("365.0").setScale(NUMBER_OF_DECIMALS);
+    public static final BigDecimal THREE_HUNDRED_AND_SIXTY_SIX = new BigDecimal("366.0").setScale(NUMBER_OF_DECIMALS);
+
+
+    private final InvoiceGenerator generator;
+    private final BillingInternalApi billingApi;
+    private final AccountInternalApi accountApi;
+    private final EntitlementInternalApi entitlementApi;
+    private final  BusService busService;
+    private final  InvoiceDao invoiceDao;
+    private final  GlobalLocker locker;
+    private final  Clock clock;
+    private final InternalCallContext internalCallContext;
+
+    // Low level SqlDao used by the tests to directly insert rows
+    private final InvoicePaymentSqlDao invoicePaymentSqlDao;
+    private final InvoiceItemSqlDao invoiceItemSqlDao;
+
+
+
+    @Inject
+    public TestInvoiceUtil(final InvoiceGenerator generator, final IDBI dbi,
+                           final BillingInternalApi billingApi, final AccountInternalApi accountApi, final EntitlementInternalApi entitlementApi, final BusService busService,
+                           final InvoiceDao invoiceDao, final GlobalLocker locker, final Clock clock, final InternalCallContext internalCallContext) {
+        this.generator = generator;
+        this.billingApi = billingApi;
+        this.accountApi = accountApi;
+        this.entitlementApi = entitlementApi;
+        this.busService = busService;
+        this.invoiceDao = invoiceDao;
+        this.locker = locker;
+        this.clock = clock;
+        this.internalCallContext = internalCallContext;
+        this.invoiceItemSqlDao = dbi.onDemand(InvoiceItemSqlDao.class);
+        this.invoicePaymentSqlDao = dbi.onDemand(InvoicePaymentSqlDao.class);
+    }
+
+    public UUID generateRegularInvoice(final Account account, final DateTime targetDate) throws Exception {
+        final Subscription subscription = Mockito.mock(Subscription.class);
+        Mockito.when(subscription.getId()).thenReturn(UUID.randomUUID());
+        Mockito.when(subscription.getBundleId()).thenReturn(new UUID(0L, 0L));
+        final BillingEventSet events = new MockBillingEventSet();
+        final Plan plan = MockPlan.createBicycleNoTrialEvergreen1USD();
+        final PlanPhase planPhase = MockPlanPhase.create1USDMonthlyEvergreen();
+        final DateTime effectiveDate = new DateTime().minusDays(1);
+        final Currency currency = Currency.USD;
+        final BigDecimal fixedPrice = null;
+        events.add(createMockBillingEvent(account, subscription, effectiveDate, plan, planPhase,
+                                          fixedPrice, BigDecimal.ONE, currency, BillingPeriod.MONTHLY, 1,
+                                          BillingModeType.IN_ADVANCE, "", 1L, SubscriptionTransitionType.CREATE));
+
+        Mockito.when(billingApi.getBillingEventsForAccountAndUpdateAccountBCD(Mockito.<UUID>any(), Mockito.<InternalCallContext>any())).thenReturn(events);
+
+        final InvoiceNotifier invoiceNotifier = new NullInvoiceNotifier();
+        final InvoiceDispatcher dispatcher = new InvoiceDispatcher(generator, accountApi, billingApi, entitlementApi,
+                                                                   invoiceDao, invoiceNotifier, locker, busService.getBus(),
+                                                                   clock);
+
+        Invoice invoice = dispatcher.processAccount(account.getId(), targetDate, true, internalCallContext);
+        Assert.assertNotNull(invoice);
+
+        List<InvoiceModelDao> invoices = invoiceDao.getInvoicesByAccount(account.getId(), internalCallContext);
+        Assert.assertEquals(invoices.size(), 0);
+
+        invoice = dispatcher.processAccount(account.getId(), targetDate, false, internalCallContext);
+        Assert.assertNotNull(invoice);
+
+        invoices = invoiceDao.getInvoicesByAccount(account.getId(), internalCallContext);
+        Assert.assertEquals(invoices.size(), 1);
+
+        return invoice.getId();
+    }
+
+    public Subscription createSubscription() throws EntitlementUserApiException {
+        UUID uuid = UUID.randomUUID();
+        final Subscription subscription = Mockito.mock(Subscription.class);
+        Mockito.when(subscription.getId()).thenReturn(uuid);
+        Mockito.when(entitlementApi.getSubscriptionFromId(Mockito.<UUID>any(), Mockito.<InternalTenantContext>any())).thenReturn(subscription);
+        return subscription;
+    }
+
+    public Account createAccount() throws AccountApiException {
+        final UUID accountId = UUID.randomUUID();
+        final Account account = Mockito.mock(Account.class);
+        Mockito.when(accountApi.getAccountById(Mockito.<UUID>any(), Mockito.<InternalCallContext>any())).thenReturn(account);
+        Mockito.when(account.getCurrency()).thenReturn(accountCurrency);
+        Mockito.when(account.getId()).thenReturn(accountId);
+        Mockito.when(account.isNotifiedForInvoices()).thenReturn(true);
+        Mockito.when(account.getBillCycleDay()).thenReturn(new MockBillCycleDay(31));
+        // The timezone is required to compute the date of the next invoice notification
+        Mockito.when(account.getTimeZone()).thenReturn(DateTimeZone.UTC);
+
+        return account;
+    }
+
+    public void createInvoiceItem(final InvoiceItem invoiceItem, final InternalCallContext internalCallContext) throws EntityPersistenceException {
+        invoiceItemSqlDao.create(new InvoiceItemModelDao(invoiceItem), internalCallContext);
+    }
+
+    public InvoiceItemModelDao getInvoiceItemById(final UUID invoiceItemId, final InternalCallContext internalCallContext) {
+        return invoiceItemSqlDao.getById(invoiceItemId.toString(), internalCallContext);
+    }
+
+    public List<InvoiceItemModelDao> getInvoiceItemBySubscriptionId(final UUID subscriptionId, final InternalCallContext internalCallContext) {
+        return invoiceItemSqlDao.getInvoiceItemsBySubscription(subscriptionId.toString(), internalCallContext);
+    }
+
+    public List<InvoiceItemModelDao> getInvoiceItemByAccountId(final UUID accountId, final InternalCallContext internalCallContext) {
+        return invoiceItemSqlDao.getInvoiceItemsByAccount(accountId.toString(), internalCallContext);
+    }
+
+    public List<InvoiceItemModelDao> getInvoiceItemByInvoiceId(final UUID invoiceId, final InternalCallContext internalCallContext) {
+        return invoiceItemSqlDao.getInvoiceItemsByInvoice(invoiceId.toString(), internalCallContext);
+    }
+
+    public void createInvoice(final Invoice invoice, final boolean isRealInvoiceWithItems, final InternalCallContext internalCallContext) {
+        final InvoiceModelDao invoiceModelDao = new InvoiceModelDao(invoice);
+        final List<InvoiceItemModelDao> invoiceItemModelDaos = ImmutableList.<InvoiceItemModelDao>copyOf(Collections2.transform(invoice.getInvoiceItems(),
+                                                                                                                                new Function<InvoiceItem, InvoiceItemModelDao>() {
+                                                                                                                                    @Override
+                                                                                                                                    public InvoiceItemModelDao apply(final InvoiceItem input) {
+                                                                                                                                        return new InvoiceItemModelDao(input);
+                                                                                                                                    }
+                                                                                                                                }));
+        // Not really needed, there shouldn't be any payment at this stage
+        final List<InvoicePaymentModelDao> invoicePaymentModelDaos = ImmutableList.<InvoicePaymentModelDao>copyOf(Collections2.transform(invoice.getPayments(),
+                                                                                                                                         new Function<InvoicePayment, InvoicePaymentModelDao>() {
+                                                                                                                                             @Override
+                                                                                                                                             public InvoicePaymentModelDao apply(final InvoicePayment input) {
+                                                                                                                                                 return new InvoicePaymentModelDao(input);
+                                                                                                                                             }
+                                                                                                                                         }));
+
+        // The test does not use the invoice callback notifier hence the empty map
+        invoiceDao.createInvoice(invoiceModelDao, invoiceItemModelDaos, invoicePaymentModelDaos, isRealInvoiceWithItems, ImmutableMap.<UUID, DateTime>of(), internalCallContext);
+    }
+
+    public void createPayment(final InvoicePayment invoicePayment, final InternalCallContext internalCallContext) {
+        try {
+            invoicePaymentSqlDao.create(new InvoicePaymentModelDao(invoicePayment), internalCallContext);
+        } catch (EntityPersistenceException e) {
+            Assert.fail(e.getMessage());
+        }
+    }
+
+    public void verifyInvoice(final UUID invoiceId, final double balance, final double cbaAmount) throws InvoiceApiException {
+        final InvoiceModelDao invoice = invoiceDao.getById(invoiceId, internalCallContext);
+        Assert.assertEquals(InvoiceModelDaoHelper.getBalance(invoice).doubleValue(), balance);
+        Assert.assertEquals(InvoiceModelDaoHelper.getCBAAmount(invoice).doubleValue(), cbaAmount);
+    }
+
+    public void checkInvoicesEqual(final InvoiceModelDao retrievedInvoice, final Invoice invoice) {
+        Assert.assertEquals(retrievedInvoice.getId(), invoice.getId());
+        Assert.assertEquals(retrievedInvoice.getAccountId(), invoice.getAccountId());
+        Assert.assertEquals(retrievedInvoice.getCurrency(), invoice.getCurrency());
+        Assert.assertEquals(retrievedInvoice.getInvoiceDate(), invoice.getInvoiceDate());
+        Assert.assertEquals(retrievedInvoice.getTargetDate(), invoice.getTargetDate());
+        Assert.assertEquals(retrievedInvoice.getInvoiceItems().size(), invoice.getInvoiceItems().size());
+        Assert.assertEquals(retrievedInvoice.getInvoicePayments().size(), invoice.getPayments().size());
+    }
+
+    public LocalDate buildDate(final int year, final int month, final int day) {
+        return new LocalDate(year, month, day);
+    }
+
+    public BillingEvent createMockBillingEvent(@Nullable final Account account, final Subscription subscription,
+                                               final DateTime effectiveDate,
+                                               final Plan plan, final PlanPhase planPhase,
+                                               @Nullable final BigDecimal fixedPrice, @Nullable final BigDecimal recurringPrice,
+                                               final Currency currency, final BillingPeriod billingPeriod, final int billCycleDayUTC,
+                                               final BillingModeType billingModeType, final String description,
+                                               final long totalOrdering,
+                                               final SubscriptionTransitionType type) {
+        return createMockBillingEvent(account, subscription, effectiveDate, plan, planPhase, fixedPrice, recurringPrice,
+                                      currency, billingPeriod, billCycleDayUTC, billCycleDayUTC, billingModeType, description,
+                                      totalOrdering, type);
+    }
+
+    public BillingEvent createMockBillingEvent(@Nullable final Account account, final Subscription subscription,
+                                               final DateTime effectiveDate,
+                                               final Plan plan, final PlanPhase planPhase,
+                                               @Nullable final BigDecimal fixedPrice, @Nullable final BigDecimal recurringPrice,
+                                               final Currency currency, final BillingPeriod billingPeriod,
+                                               final int billCycleDayUTC, final int billCycleDayLocal,
+                                               final BillingModeType billingModeType, final String description,
+                                               final long totalOrdering,
+                                               final SubscriptionTransitionType type) {
+        return new BillingEvent() {
+            @Override
+            public Account getAccount() {
+                return account;
+            }
+
+            @Override
+            public BillCycleDay getBillCycleDay() {
+                return new BillCycleDay() {
+                    @Override
+                    public int getDayOfMonthUTC() {
+                        return billCycleDayUTC;
+                    }
+
+                    @Override
+                    public int getDayOfMonthLocal() {
+                        return billCycleDayLocal;
+                    }
+                };
+            }
+
+            @Override
+            public Subscription getSubscription() {
+                return subscription;
+            }
+
+            @Override
+            public DateTime getEffectiveDate() {
+                return effectiveDate;
+            }
+
+            @Override
+            public PlanPhase getPlanPhase() {
+                return planPhase;
+            }
+
+            @Override
+            public Plan getPlan() {
+                return plan;
+            }
+
+            @Override
+            public BillingPeriod getBillingPeriod() {
+                return billingPeriod;
+            }
+
+            @Override
+            public BillingModeType getBillingMode() {
+                return billingModeType;
+            }
+
+            @Override
+            public String getDescription() {
+                return description;
+            }
+
+            @Override
+            public BigDecimal getFixedPrice() {
+                return fixedPrice;
+            }
+
+            @Override
+            public BigDecimal getRecurringPrice() {
+                return recurringPrice;
+            }
+
+            @Override
+            public Currency getCurrency() {
+                return currency;
+            }
+
+            @Override
+            public SubscriptionTransitionType getTransitionType() {
+                return type;
+            }
+
+            @Override
+            public Long getTotalOrdering() {
+                return totalOrdering;
+            }
+
+            @Override
+            public DateTimeZone getTimeZone() {
+                return DateTimeZone.UTC;
+            }
+
+            @Override
+            public int compareTo(final BillingEvent e1) {
+                if (!getSubscription().getId().equals(e1.getSubscription().getId())) { // First order by subscription
+                    return getSubscription().getId().compareTo(e1.getSubscription().getId());
+                } else { // subscriptions are the same
+                    if (!getEffectiveDate().equals(e1.getEffectiveDate())) { // Secondly order by date
+                        return getEffectiveDate().compareTo(e1.getEffectiveDate());
+                    } else { // dates and subscriptions are the same
+                        return getTotalOrdering().compareTo(e1.getTotalOrdering());
+                    }
+                }
+            }
+        };
+    }
+}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/GenericProRationTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/GenericProRationTests.java
index b1c5ab6..b345775 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/GenericProRationTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/GenericProRationTests.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.invoice.tests.inAdvance.annual;
 
+import static com.ning.billing.invoice.TestInvoiceUtil.*;
+
 import java.math.BigDecimal;
 
 import com.ning.billing.catalog.api.BillingPeriod;
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestDoubleProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestDoubleProRation.java
index e2e8e55..9c48331 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestDoubleProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestDoubleProRation.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.invoice.tests.inAdvance.annual;
 
+import static com.ning.billing.invoice.TestInvoiceUtil.*;
+
 import java.math.BigDecimal;
 
 import org.joda.time.LocalDate;
@@ -34,9 +36,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateOnStartDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 1, 1);
-        final LocalDate endDate = buildDate(2012, 1, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate endDate = invoiceUtil.buildDate(2012, 1, 27);
 
         final BigDecimal expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
@@ -44,9 +46,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateInFirstProRationPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 1, 7);
-        final LocalDate endDate = buildDate(2012, 1, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 7);
+        final LocalDate endDate = invoiceUtil.buildDate(2012, 1, 27);
 
         final BigDecimal expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
@@ -54,9 +56,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateOnFirstBillingCycleDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 1, 15);
-        final LocalDate endDate = buildDate(2012, 1, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 15);
+        final LocalDate endDate = invoiceUtil.buildDate(2012, 1, 27);
 
         final BigDecimal expectedValue = ONE.add(FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
@@ -64,9 +66,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateInFullBillingPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 1, 22);
-        final LocalDate endDate = buildDate(2012, 1, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 22);
+        final LocalDate endDate = invoiceUtil.buildDate(2012, 1, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -77,9 +79,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateOnSecondBillingCycleDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2012, 1, 15);
-        final LocalDate endDate = buildDate(2012, 1, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2012, 1, 15);
+        final LocalDate endDate = invoiceUtil.buildDate(2012, 1, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -92,9 +94,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateInSecondProRationPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2012, 1, 17);
-        final LocalDate endDate = buildDate(2012, 1, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2012, 1, 17);
+        final LocalDate endDate = invoiceUtil.buildDate(2012, 1, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -107,9 +109,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateOnEndDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2012, 1, 27);
-        final LocalDate endDate = buildDate(2012, 1, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2012, 1, 27);
+        final LocalDate endDate = invoiceUtil.buildDate(2012, 1, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -122,9 +124,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateAfterEndDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2012, 3, 7);
-        final LocalDate endDate = buildDate(2012, 1, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2012, 3, 7);
+        final LocalDate endDate = invoiceUtil.buildDate(2012, 1, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -137,9 +139,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRationWithMultiplePeriods_TargetDateInSecondFullBillingPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2012, 2, 26);
-        final LocalDate endDate = buildDate(2013, 4, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2012, 2, 26);
+        final LocalDate endDate = invoiceUtil.buildDate(2013, 4, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestLeadingProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestLeadingProRation.java
index 3ac8120..462529a 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestLeadingProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestLeadingProRation.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.invoice.tests.inAdvance.annual;
 
+import static com.ning.billing.invoice.TestInvoiceUtil.*;
+
 import java.math.BigDecimal;
 
 import org.joda.time.LocalDate;
@@ -34,8 +36,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_Evergreen_TargetDateOnStartDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 1);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 1);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -45,8 +47,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_Evergreen_TargetDateInProRationPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 4);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 4);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -56,8 +58,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_Evergreen_TargetDateOnFirstBillingDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
@@ -67,8 +69,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_Evergreen_TargetDateAfterFirstBillingPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 4, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 4, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
@@ -78,9 +80,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_WithEndDate_TargetDateOnStartDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 1);
-        final LocalDate endDate = buildDate(2012, 2, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate endDate = invoiceUtil.buildDate(2012, 2, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -90,9 +92,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_WithEndDate_TargetDateInProRationPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 4);
-        final LocalDate endDate = buildDate(2012, 2, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 4);
+        final LocalDate endDate = invoiceUtil.buildDate(2012, 2, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -102,9 +104,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_WithEndDate_TargetDateOnFirstBillingDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 13);
-        final LocalDate endDate = buildDate(2012, 2, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 13);
+        final LocalDate endDate = invoiceUtil.buildDate(2012, 2, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
@@ -114,9 +116,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_WithEndDate_TargetDateInFinalBillingPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 4, 10);
-        final LocalDate endDate = buildDate(2012, 2, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 4, 10);
+        final LocalDate endDate = invoiceUtil.buildDate(2012, 2, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
@@ -126,9 +128,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_WithEndDate_TargetDateOnEndDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2012, 2, 13);
-        final LocalDate endDate = buildDate(2012, 2, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2012, 2, 13);
+        final LocalDate endDate = invoiceUtil.buildDate(2012, 2, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
@@ -138,9 +140,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_WithEndDate_TargetDateAfterEndDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2012, 4, 10);
-        final LocalDate endDate = buildDate(2012, 2, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2012, 4, 10);
+        final LocalDate endDate = invoiceUtil.buildDate(2012, 2, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestProRation.java
index 16e1407..b15e144 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestProRation.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.invoice.tests.inAdvance.annual;
 
+import static com.ning.billing.invoice.TestInvoiceUtil.*;
+
 import java.math.BigDecimal;
 
 import org.joda.time.LocalDate;
@@ -34,8 +36,8 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testSinglePlan_PrecedingProRation() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 31);
-        final LocalDate targetDate = buildDate(2011, 2, 24);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 31);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 24);
 
         final BigDecimal expectedValue = ONE.add(FIFTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, expectedValue);
@@ -43,8 +45,8 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testSinglePlan_PrecedingProRation_CrossingYearBoundary() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 12, 15);
-        final LocalDate targetDate = buildDate(2011, 1, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 12, 15);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 13);
 
         final BigDecimal expectedValue = ONE.add(TWENTY.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, targetDate, 4, expectedValue);
@@ -53,9 +55,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
     // TODO Test fails, needs to be investigated
     @Test(groups = "fast", enabled = false)
     public void testSinglePlanDoubleProRation() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 10);
-        final LocalDate endDate = buildDate(2012, 3, 4);
-        final LocalDate targetDate = buildDate(2012, 4, 5);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 10);
+        final LocalDate endDate = invoiceUtil.buildDate(2012, 3, 4);
+        final LocalDate targetDate = invoiceUtil.buildDate(2012, 4, 5);
 
         final BigDecimal expectedValue = BigDecimal.ZERO;
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestTrailingProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestTrailingProRation.java
index d6f38ac..860fe92 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestTrailingProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TestTrailingProRation.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.invoice.tests.inAdvance.annual;
 
+import static com.ning.billing.invoice.TestInvoiceUtil.*;
+
 import java.math.BigDecimal;
 
 import org.joda.time.LocalDate;
@@ -34,27 +36,27 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testTargetDateOnStartDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 6, 17);
-        final LocalDate endDate = buildDate(2012, 6, 25);
-        final LocalDate targetDate = buildDate(2010, 6, 17);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 6, 17);
+        final LocalDate endDate = invoiceUtil.buildDate(2012, 6, 25);
+        final LocalDate targetDate = invoiceUtil.buildDate(2010, 6, 17);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, ONE);
     }
 
     @Test(groups = "fast")
     public void testTargetDateInFirstBillingPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 6, 17);
-        final LocalDate endDate = buildDate(2011, 6, 25);
-        final LocalDate targetDate = buildDate(2010, 6, 20);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 6, 17);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 6, 25);
+        final LocalDate targetDate = invoiceUtil.buildDate(2010, 6, 20);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, ONE);
     }
 
     @Test(groups = "fast")
     public void testTargetDateAtEndOfFirstBillingCycle() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 6, 17);
-        final LocalDate endDate = buildDate(2011, 6, 25);
-        final LocalDate targetDate = buildDate(2011, 6, 17);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 6, 17);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 6, 25);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 6, 17);
 
         final BigDecimal expectedValue = ONE.add(EIGHT.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
@@ -62,9 +64,9 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testTargetDateInProRationPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 6, 17);
-        final LocalDate endDate = buildDate(2011, 6, 25);
-        final LocalDate targetDate = buildDate(2011, 6, 18);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 6, 17);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 6, 25);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 6, 18);
 
         final BigDecimal expectedValue = ONE.add(EIGHT.divide(THREE_HUNDRED_AND_SIXTY_SIX, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
@@ -72,8 +74,8 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testTargetDateOnEndDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 6, 17);
-        final LocalDate endDate = buildDate(2011, 6, 25);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 6, 17);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 6, 25);
 
         final BigDecimal expectedValue = ONE.add(EIGHT.divide(THREE_HUNDRED_AND_SIXTY_SIX, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, endDate, 17, expectedValue);
@@ -81,9 +83,9 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testTargetDateAfterEndDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 6, 17);
-        final LocalDate endDate = buildDate(2011, 6, 25);
-        final LocalDate targetDate = buildDate(2011, 7, 30);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 6, 17);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 6, 25);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 7, 30);
 
         final BigDecimal expectedValue = ONE.add(EIGHT.divide(THREE_HUNDRED_AND_SIXTY_SIX, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/GenericProRationTestBase.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/GenericProRationTestBase.java
index a23a534..6794f6b 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/GenericProRationTestBase.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/GenericProRationTestBase.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.invoice.tests.inAdvance;
 
+import static com.ning.billing.invoice.TestInvoiceUtil.*;
+
 import java.math.BigDecimal;
 
 import org.joda.time.LocalDate;
@@ -34,22 +36,22 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
 
     @Test(groups = "fast")
     public void testSinglePlan_OnStartDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 15);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 15);
 
         testCalculateNumberOfBillingCycles(startDate, startDate, 15, ONE);
     }
 
     @Test(groups = "fast")
     public void testSinglePlan_LessThanOnePeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 15);
-        final LocalDate targetDate = buildDate(2011, 3, 1);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 15);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 3, 1);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, ONE);
     }
 
     @Test(groups = "fast")
     public void testSinglePlan_OnePeriodLessADayAfterStart() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 15);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 15);
         final LocalDate targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths()).plusDays(-1);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, ONE);
@@ -57,7 +59,7 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
 
     @Test(groups = "fast")
     public void testSinglePlan_ExactlyOnePeriodAfterStart() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 15);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 15);
         final LocalDate targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
@@ -65,7 +67,7 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
 
     @Test(groups = "fast")
     public void testSinglePlan_SlightlyMoreThanOnePeriodAfterStart() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 15);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 15);
         final LocalDate targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths()).plusDays(1);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
@@ -73,7 +75,7 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
 
     @Test(groups = "fast")
     public void testSinglePlan_CrossingYearBoundary() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 12, 15);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 12, 15);
         final LocalDate oneCycleLater = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
 
         // test just before the billing cycle day
@@ -88,7 +90,7 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
 
     @Test(groups = "fast")
     public void testSinglePlan_StartingMidFebruary() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 15);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 15);
         final LocalDate targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
@@ -96,7 +98,7 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
 
     @Test(groups = "fast")
     public void testSinglePlan_StartingMidFebruaryOfLeapYear() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2012, 2, 15);
+        final LocalDate startDate = invoiceUtil.buildDate(2012, 2, 15);
         final LocalDate targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
@@ -104,7 +106,7 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
 
     @Test(groups = "fast")
     public void testSinglePlan_MovingForwardThroughTime() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 31);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 31);
         BigDecimal expectedValue = ONE;
 
         for (int i = 1; i <= 12; i++) {
@@ -125,9 +127,9 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
     // tests for cancellation in less than one period, beginning Jan 1
     @Test(groups = "fast")
     public void testCancelledBeforeOnePeriod_TargetDateInStartDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 1, 1);
-        final LocalDate endDate = buildDate(2011, 1, 15);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 1, 15);
 
         final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
@@ -135,9 +137,9 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
 
     @Test(groups = "fast")
     public void testCancelledBeforeOnePeriod_TargetDateInSubscriptionPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 1, 7);
-        final LocalDate endDate = buildDate(2011, 1, 15);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 7);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 1, 15);
 
         final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
@@ -145,9 +147,9 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
 
     @Test(groups = "fast")
     public void testCancelledBeforeOnePeriod_TargetDateOnEndDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 1, 15);
-        final LocalDate endDate = buildDate(2011, 1, 15);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 15);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 1, 15);
 
         final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
@@ -155,9 +157,9 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
 
     @Test(groups = "fast")
     public void testCancelledBeforeOnePeriod_TargetDateAfterEndDateButInFirstBillingPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 1, 17);
-        final LocalDate endDate = buildDate(2011, 1, 15);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 17);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 1, 15);
 
         final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
@@ -165,9 +167,9 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
 
     @Test(groups = "fast")
     public void testCancelledBeforeOnePeriod_TargetDateAtEndOfFirstBillingPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 1);
-        final LocalDate endDate = buildDate(2011, 1, 15);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 1, 15);
 
         final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
@@ -175,9 +177,9 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
 
     @Test(groups = "fast")
     public void testCancelledBeforeOnePeriod_TargetDateAfterFirstBillingPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 4, 5);
-        final LocalDate endDate = buildDate(2011, 1, 15);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 4, 5);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 1, 15);
 
         final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/GenericProRationTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/GenericProRationTests.java
index 42f4c62..f79e158 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/GenericProRationTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/GenericProRationTests.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.invoice.tests.inAdvance.monthly;
 
+import static com.ning.billing.invoice.TestInvoiceUtil.*;
+
 import java.math.BigDecimal;
 
 import com.ning.billing.catalog.api.BillingPeriod;
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestDoubleProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestDoubleProRation.java
index cbf4ce1..e009506 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestDoubleProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestDoubleProRation.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.invoice.tests.inAdvance.monthly;
 
+import static com.ning.billing.invoice.TestInvoiceUtil.*;
+
 import java.math.BigDecimal;
 
 import org.joda.time.LocalDate;
@@ -34,9 +36,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateOnStartDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 1, 1);
-        final LocalDate endDate = buildDate(2011, 2, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 2, 27);
 
         final BigDecimal expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
@@ -44,9 +46,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateInFirstProRationPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 1, 7);
-        final LocalDate endDate = buildDate(2011, 2, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 7);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 2, 27);
 
         final BigDecimal expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
@@ -54,9 +56,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateOnFirstBillingCycleDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 1, 15);
-        final LocalDate endDate = buildDate(2011, 2, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 15);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 2, 27);
 
         final BigDecimal expectedValue = ONE.add(FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
@@ -64,9 +66,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateInFullBillingPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 1, 22);
-        final LocalDate endDate = buildDate(2011, 2, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 22);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 2, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -77,9 +79,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateOnSecondBillingCycleDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 27);
-        final LocalDate endDate = buildDate(2011, 2, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 27);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 2, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -91,9 +93,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateInSecondProRationPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 26);
-        final LocalDate endDate = buildDate(2011, 2, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 26);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 2, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -105,9 +107,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateOnEndDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 27);
-        final LocalDate endDate = buildDate(2011, 2, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 27);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 2, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -119,9 +121,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateAfterEndDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 3, 7);
-        final LocalDate endDate = buildDate(2011, 2, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 3, 7);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 2, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -133,9 +135,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRationWithMultiplePeriods_TargetDateInSecondFullBillingPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 26);
-        final LocalDate endDate = buildDate(2011, 4, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 26);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 4, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestLeadingProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestLeadingProRation.java
index 34de837..ff60c31 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestLeadingProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestLeadingProRation.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.invoice.tests.inAdvance.monthly;
 
+import static com.ning.billing.invoice.TestInvoiceUtil.*;
+
 import java.math.BigDecimal;
 
 import org.joda.time.LocalDate;
@@ -34,8 +36,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_Evergreen_TargetDateOnStartDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 1);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 1);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -45,8 +47,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_Evergreen_TargetDateInProRationPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 4);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 4);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -56,8 +58,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_Evergreen_TargetDateOnFirstBillingDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
@@ -67,8 +69,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_Evergreen_TargetDateAfterFirstBillingPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 4, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 4, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(THREE);
@@ -78,9 +80,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_WithEndDate_TargetDateOnStartDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 1);
-        final LocalDate endDate = buildDate(2011, 4, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 4, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -90,9 +92,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_WithEndDate_TargetDateInProRationPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 4);
-        final LocalDate endDate = buildDate(2011, 4, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 4);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 4, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -102,9 +104,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_WithEndDate_TargetDateOnFirstBillingDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 13);
-        final LocalDate endDate = buildDate(2011, 4, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 13);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 4, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
@@ -114,9 +116,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_WithEndDate_TargetDateInFinalBillingPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 4, 10);
-        final LocalDate endDate = buildDate(2011, 4, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 4, 10);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 4, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
@@ -126,9 +128,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_WithEndDate_TargetDateOnEndDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 4, 13);
-        final LocalDate endDate = buildDate(2011, 4, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 4, 13);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 4, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
@@ -138,9 +140,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_WithEndDate_TargetDateAfterEndDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 4, 10);
-        final LocalDate endDate = buildDate(2011, 4, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 4, 10);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 4, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestProRation.java
index 0206b88..375b92a 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestProRation.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.invoice.tests.inAdvance.monthly;
 
+import static com.ning.billing.invoice.TestInvoiceUtil.*;
+
 import java.math.BigDecimal;
 
 import org.joda.time.LocalDate;
@@ -34,9 +36,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testSinglePlan_WithPhaseChange() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 10);
-        final LocalDate phaseChangeDate = buildDate(2011, 2, 24);
-        final LocalDate targetDate = buildDate(2011, 3, 6);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 10);
+        final LocalDate phaseChangeDate = invoiceUtil.buildDate(2011, 2, 24);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 3, 6);
 
         testCalculateNumberOfBillingCycles(startDate, phaseChangeDate, targetDate, 10, ONE_HALF);
         testCalculateNumberOfBillingCycles(phaseChangeDate, targetDate, 10, ONE_HALF);
@@ -44,9 +46,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testSinglePlan_WithPhaseChange_BeforeBillCycleDay() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 3);
-        final LocalDate phaseChangeDate = buildDate(2011, 2, 17);
-        final LocalDate targetDate = buildDate(2011, 3, 1);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 3);
+        final LocalDate phaseChangeDate = invoiceUtil.buildDate(2011, 2, 17);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 3, 1);
 
         testCalculateNumberOfBillingCycles(startDate, phaseChangeDate, targetDate, 3, ONE_HALF);
         testCalculateNumberOfBillingCycles(phaseChangeDate, targetDate, 3, ONE_HALF);
@@ -54,9 +56,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testSinglePlan_WithPhaseChange_OnBillCycleDay() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 3);
-        final LocalDate phaseChangeDate = buildDate(2011, 2, 17);
-        final LocalDate targetDate = buildDate(2011, 3, 3);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 3);
+        final LocalDate phaseChangeDate = invoiceUtil.buildDate(2011, 2, 17);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 3, 3);
 
         testCalculateNumberOfBillingCycles(startDate, phaseChangeDate, targetDate, 3, ONE_HALF);
         testCalculateNumberOfBillingCycles(phaseChangeDate, targetDate, 3, ONE_AND_A_HALF);
@@ -64,9 +66,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testSinglePlan_WithPhaseChange_AfterBillCycleDay() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 3);
-        final LocalDate phaseChangeDate = buildDate(2011, 2, 17);
-        final LocalDate targetDate = buildDate(2011, 3, 4);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 3);
+        final LocalDate phaseChangeDate = invoiceUtil.buildDate(2011, 2, 17);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 3, 4);
 
         testCalculateNumberOfBillingCycles(startDate, phaseChangeDate, targetDate, 3, ONE_HALF);
         testCalculateNumberOfBillingCycles(phaseChangeDate, targetDate, 3, ONE_AND_A_HALF);
@@ -74,9 +76,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testPlanChange_WithChangeOfBillCycleDayToLaterDay() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate planChangeDate = buildDate(2011, 2, 15);
-        final LocalDate targetDate = buildDate(2011, 3, 1);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate planChangeDate = invoiceUtil.buildDate(2011, 2, 15);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 3, 1);
 
         testCalculateNumberOfBillingCycles(startDate, planChangeDate, targetDate, 1, ONE_HALF);
         testCalculateNumberOfBillingCycles(planChangeDate, targetDate, 15, ONE);
@@ -84,9 +86,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testPlanChange_WithChangeOfBillCycleDayToEarlierDay() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 20);
-        final LocalDate planChangeDate = buildDate(2011, 3, 6);
-        final LocalDate targetDate = buildDate(2011, 3, 9);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 20);
+        final LocalDate planChangeDate = invoiceUtil.buildDate(2011, 3, 6);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 3, 9);
 
         testCalculateNumberOfBillingCycles(startDate, planChangeDate, targetDate, 20, ONE_HALF);
         testCalculateNumberOfBillingCycles(planChangeDate, targetDate, 6, ONE);
@@ -94,41 +96,41 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testSinglePlan_CrossingYearBoundary() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 12, 15);
-        final LocalDate targetDate = buildDate(2011, 1, 16);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 12, 15);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 16);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
     }
 
     @Test(groups = "fast")
     public void testSinglePlan_LeapYear_StartingMidFebruary() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2012, 2, 15);
-        final LocalDate targetDate = buildDate(2012, 3, 15);
+        final LocalDate startDate = invoiceUtil.buildDate(2012, 2, 15);
+        final LocalDate targetDate = invoiceUtil.buildDate(2012, 3, 15);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
     }
 
     @Test(groups = "fast")
     public void testSinglePlan_LeapYear_StartingBeforeFebruary() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2012, 1, 15);
-        final LocalDate targetDate = buildDate(2012, 2, 3);
+        final LocalDate startDate = invoiceUtil.buildDate(2012, 1, 15);
+        final LocalDate targetDate = invoiceUtil.buildDate(2012, 2, 3);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, ONE);
     }
 
     @Test(groups = "fast")
     public void testSinglePlan_LeapYear_IncludingAllOfFebruary() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2012, 1, 30);
-        final LocalDate targetDate = buildDate(2012, 3, 1);
+        final LocalDate startDate = invoiceUtil.buildDate(2012, 1, 30);
+        final LocalDate targetDate = invoiceUtil.buildDate(2012, 3, 1);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 30, TWO);
     }
 
     @Test(groups = "fast")
     public void testSinglePlan_ChangeBCDTo31() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate planChangeDate = buildDate(2011, 2, 14);
-        final LocalDate targetDate = buildDate(2011, 3, 1);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate planChangeDate = invoiceUtil.buildDate(2011, 2, 14);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 3, 1);
 
         BigDecimal expectedValue;
 
@@ -141,9 +143,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testSinglePlan_ChangeBCD() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate planChangeDate = buildDate(2011, 2, 14);
-        final LocalDate targetDate = buildDate(2011, 3, 1);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate planChangeDate = invoiceUtil.buildDate(2011, 2, 14);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 3, 1);
 
         BigDecimal expectedValue;
 
@@ -156,9 +158,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testSinglePlan_LeapYearFebruaryProRation() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2012, 2, 1);
-        final LocalDate endDate = buildDate(2012, 2, 15);
-        final LocalDate targetDate = buildDate(2012, 2, 19);
+        final LocalDate startDate = invoiceUtil.buildDate(2012, 2, 1);
+        final LocalDate endDate = invoiceUtil.buildDate(2012, 2, 15);
+        final LocalDate targetDate = invoiceUtil.buildDate(2012, 2, 19);
 
         final BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(TWENTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -168,9 +170,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testPlanChange_BeforeBillingDay() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 7);
-        final LocalDate changeDate = buildDate(2011, 2, 15);
-        final LocalDate targetDate = buildDate(2011, 4, 21);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 7);
+        final LocalDate changeDate = invoiceUtil.buildDate(2011, 2, 15);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 4, 21);
 
         final BigDecimal expectedValue;
 
@@ -182,9 +184,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testPlanChange_OnBillingDay() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 7);
-        final LocalDate changeDate = buildDate(2011, 3, 7);
-        final LocalDate targetDate = buildDate(2011, 4, 21);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 7);
+        final LocalDate changeDate = invoiceUtil.buildDate(2011, 3, 7);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 4, 21);
 
         testCalculateNumberOfBillingCycles(startDate, changeDate, targetDate, 7, ONE);
 
@@ -195,9 +197,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testPlanChange_AfterBillingDay() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 7);
-        final LocalDate changeDate = buildDate(2011, 3, 10);
-        final LocalDate targetDate = buildDate(2011, 4, 21);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 7);
+        final LocalDate changeDate = invoiceUtil.buildDate(2011, 3, 10);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 4, 21);
 
         BigDecimal expectedValue;
 
@@ -210,9 +212,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testPlanChange_DoubleProRation() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 31);
-        final LocalDate planChangeDate = buildDate(2011, 3, 10);
-        final LocalDate targetDate = buildDate(2011, 4, 21);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 31);
+        final LocalDate planChangeDate = invoiceUtil.buildDate(2011, 3, 10);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 4, 21);
 
         BigDecimal expectedValue;
         expectedValue = SEVEN.divide(THIRTY_ONE, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -227,9 +229,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testStartTargetEnd() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 12, 15);
-        final LocalDate targetDate = buildDate(2011, 3, 15);
-        final LocalDate endDate = buildDate(2011, 3, 17);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 12, 15);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 3, 15);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 3, 17);
 
         final BigDecimal expectedValue = THREE.add(TWO.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestTrailingProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestTrailingProRation.java
index 1eaa8a6..205e075 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestTrailingProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TestTrailingProRation.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.invoice.tests.inAdvance.monthly;
 
+import static com.ning.billing.invoice.TestInvoiceUtil.*;
+
 import java.math.BigDecimal;
 
 import org.joda.time.LocalDate;
@@ -34,27 +36,27 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testTargetDateOnStartDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 6, 17);
-        final LocalDate endDate = buildDate(2010, 7, 25);
-        final LocalDate targetDate = buildDate(2010, 6, 17);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 6, 17);
+        final LocalDate endDate = invoiceUtil.buildDate(2010, 7, 25);
+        final LocalDate targetDate = invoiceUtil.buildDate(2010, 6, 17);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, ONE);
     }
 
     @Test(groups = "fast")
     public void testTargetDateInFirstBillingPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 6, 17);
-        final LocalDate endDate = buildDate(2010, 7, 25);
-        final LocalDate targetDate = buildDate(2010, 6, 20);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 6, 17);
+        final LocalDate endDate = invoiceUtil.buildDate(2010, 7, 25);
+        final LocalDate targetDate = invoiceUtil.buildDate(2010, 6, 20);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, ONE);
     }
 
     @Test(groups = "fast")
     public void testTargetDateAtEndOfFirstBillingCycle() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 6, 17);
-        final LocalDate endDate = buildDate(2010, 7, 25);
-        final LocalDate targetDate = buildDate(2010, 7, 17);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 6, 17);
+        final LocalDate endDate = invoiceUtil.buildDate(2010, 7, 25);
+        final LocalDate targetDate = invoiceUtil.buildDate(2010, 7, 17);
 
         final BigDecimal expectedValue = ONE.add(EIGHT.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
@@ -62,9 +64,9 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testTargetDateInProRationPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 6, 17);
-        final LocalDate endDate = buildDate(2010, 7, 25);
-        final LocalDate targetDate = buildDate(2010, 7, 18);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 6, 17);
+        final LocalDate endDate = invoiceUtil.buildDate(2010, 7, 25);
+        final LocalDate targetDate = invoiceUtil.buildDate(2010, 7, 18);
 
         final BigDecimal expectedValue = ONE.add(EIGHT.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
@@ -72,8 +74,8 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testTargetDateOnEndDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 6, 17);
-        final LocalDate endDate = buildDate(2010, 7, 25);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 6, 17);
+        final LocalDate endDate = invoiceUtil.buildDate(2010, 7, 25);
 
         final BigDecimal expectedValue = ONE.add(EIGHT.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, endDate, 17, expectedValue);
@@ -81,9 +83,9 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testTargetDateAfterEndDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 6, 17);
-        final LocalDate endDate = buildDate(2010, 7, 25);
-        final LocalDate targetDate = buildDate(2010, 7, 30);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 6, 17);
+        final LocalDate endDate = invoiceUtil.buildDate(2010, 7, 25);
+        final LocalDate targetDate = invoiceUtil.buildDate(2010, 7, 30);
 
         final BigDecimal expectedValue = ONE.add(EIGHT.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/ProRationInAdvanceTestBase.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/ProRationInAdvanceTestBase.java
index 9652fea..31e3e56 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/ProRationInAdvanceTestBase.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/ProRationInAdvanceTestBase.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.invoice.tests.inAdvance;
 
+import static com.ning.billing.invoice.TestInvoiceUtil.*;
+
 import com.ning.billing.invoice.model.BillingMode;
 import com.ning.billing.invoice.model.InAdvanceBillingMode;
 import com.ning.billing.invoice.tests.ProRationTestBase;
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/GenericProRationTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/GenericProRationTests.java
index e2342cd..51f6408 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/GenericProRationTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/GenericProRationTests.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.invoice.tests.inAdvance.quarterly;
 
+import static com.ning.billing.invoice.TestInvoiceUtil.*;
+
 import java.math.BigDecimal;
 
 import com.ning.billing.catalog.api.BillingPeriod;
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestDoubleProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestDoubleProRation.java
index df71741..7e624a8 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestDoubleProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestDoubleProRation.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.invoice.tests.inAdvance.quarterly;
 
+import static com.ning.billing.invoice.TestInvoiceUtil.*;
+
 import java.math.BigDecimal;
 
 import org.joda.time.LocalDate;
@@ -34,9 +36,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateOnStartDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 1, 1);
-        final LocalDate endDate = buildDate(2011, 4, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 4, 27);
 
         BigDecimal expectedValue = FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         expectedValue = expectedValue.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -45,9 +47,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateInFirstProRationPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 1, 7);
-        final LocalDate endDate = buildDate(2011, 4, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 7);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 4, 27);
 
         BigDecimal expectedValue = FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         expectedValue = expectedValue.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -56,9 +58,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateOnFirstBillingCycleDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 1, 15);
-        final LocalDate endDate = buildDate(2011, 4, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 15);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 4, 27);
 
         BigDecimal expectedValue = ONE.add(FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         expectedValue = expectedValue.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -67,9 +69,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateInFullBillingPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 1, 22);
-        final LocalDate endDate = buildDate(2011, 4, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 22);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 4, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -81,9 +83,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateOnSecondBillingCycleDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 4, 15);
-        final LocalDate endDate = buildDate(2011, 4, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 4, 15);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 4, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -96,9 +98,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateInSecondProRationPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 4, 26);
-        final LocalDate endDate = buildDate(2011, 4, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 4, 26);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 4, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -111,9 +113,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateOnEndDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 4, 27);
-        final LocalDate endDate = buildDate(2011, 4, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 4, 27);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 4, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -126,9 +128,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRation_TargetDateAfterEndDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 5, 7);
-        final LocalDate endDate = buildDate(2011, 4, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 5, 7);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 4, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -141,9 +143,9 @@ public class TestDoubleProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testDoubleProRationWithMultiplePeriods_TargetDateInSecondFullBillingPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 1);
-        final LocalDate targetDate = buildDate(2011, 6, 26);
-        final LocalDate endDate = buildDate(2011, 8, 27);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 6, 26);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 8, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestLeadingProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestLeadingProRation.java
index cd13b01..131cf25 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestLeadingProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestLeadingProRation.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.invoice.tests.inAdvance.quarterly;
 
+import static com.ning.billing.invoice.TestInvoiceUtil.*;
+
 import java.math.BigDecimal;
 
 import org.joda.time.LocalDate;
@@ -34,8 +36,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_Evergreen_TargetDateOnStartDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 1);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 1);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -45,8 +47,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_Evergreen_TargetDateInProRationPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 4);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 4);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -56,8 +58,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_Evergreen_TargetDateOnFirstBillingDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
@@ -67,8 +69,8 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_Evergreen_TargetDateAfterFirstBillingPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 6, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 6, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
@@ -78,9 +80,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_WithEndDate_TargetDateOnStartDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 1);
-        final LocalDate endDate = buildDate(2011, 8, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 8, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -90,9 +92,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_WithEndDate_TargetDateInProRationPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 4);
-        final LocalDate endDate = buildDate(2011, 8, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 4);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 8, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -102,9 +104,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_WithEndDate_TargetDateOnFirstBillingDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 2, 13);
-        final LocalDate endDate = buildDate(2011, 8, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 13);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 8, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
@@ -114,9 +116,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_WithEndDate_TargetDateInFinalBillingPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 8, 10);
-        final LocalDate endDate = buildDate(2011, 8, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 8, 10);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 8, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
@@ -126,9 +128,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_WithEndDate_TargetDateOnEndDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 8, 13);
-        final LocalDate endDate = buildDate(2011, 8, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 8, 13);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 8, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
@@ -138,9 +140,9 @@ public class TestLeadingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testLeadingProRation_WithEndDate_TargetDateAfterEndDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate targetDate = buildDate(2011, 9, 10);
-        final LocalDate endDate = buildDate(2011, 8, 13);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 9, 10);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 8, 13);
 
         final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestProRation.java
index a46c7a8..67db47e 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestProRation.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.invoice.tests.inAdvance.quarterly;
 
+import static com.ning.billing.invoice.TestInvoiceUtil.*;
+
 import java.math.BigDecimal;
 
 import org.joda.time.LocalDate;
@@ -34,9 +36,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testSinglePlan_WithPhaseChange() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 10);
-        final LocalDate phaseChangeDate = buildDate(2011, 2, 24);
-        final LocalDate targetDate = buildDate(2011, 3, 6);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 10);
+        final LocalDate phaseChangeDate = invoiceUtil.buildDate(2011, 2, 24);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 3, 6);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(EIGHTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -48,9 +50,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testSinglePlan_WithPhaseChange_BeforeBillCycleDay() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 3);
-        final LocalDate phaseChangeDate = buildDate(2011, 2, 17);
-        final LocalDate targetDate = buildDate(2011, 3, 1);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 3);
+        final LocalDate phaseChangeDate = invoiceUtil.buildDate(2011, 2, 17);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 3, 1);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(EIGHTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -62,9 +64,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testSinglePlan_WithPhaseChange_OnBillCycleDay() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 3);
-        final LocalDate phaseChangeDate = buildDate(2011, 2, 17);
-        final LocalDate targetDate = buildDate(2011, 3, 3);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 3);
+        final LocalDate phaseChangeDate = invoiceUtil.buildDate(2011, 2, 17);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 3, 3);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(EIGHTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -76,9 +78,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testSinglePlan_WithPhaseChange_AfterBillCycleDay() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 3);
-        final LocalDate phaseChangeDate = buildDate(2011, 2, 17);
-        final LocalDate targetDate = buildDate(2011, 3, 4);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 3);
+        final LocalDate phaseChangeDate = invoiceUtil.buildDate(2011, 2, 17);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 3, 4);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(EIGHTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -90,9 +92,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testPlanChange_WithChangeOfBillCycleDayToLaterDay() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate planChangeDate = buildDate(2011, 2, 15);
-        final LocalDate targetDate = buildDate(2011, 3, 1);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate planChangeDate = invoiceUtil.buildDate(2011, 2, 15);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 3, 1);
 
         final BigDecimal expectedValue = FOURTEEN.divide(EIGHTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, planChangeDate, targetDate, 1, expectedValue);
@@ -101,9 +103,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testPlanChange_WithChangeOfBillCycleDayToEarlierDay() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 20);
-        final LocalDate planChangeDate = buildDate(2011, 3, 6);
-        final LocalDate targetDate = buildDate(2011, 3, 9);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 20);
+        final LocalDate planChangeDate = invoiceUtil.buildDate(2011, 3, 6);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 3, 9);
 
         final BigDecimal expectedValue = FOURTEEN.divide(EIGHTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, planChangeDate, targetDate, 20, expectedValue);
@@ -112,41 +114,41 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testSinglePlan_CrossingYearBoundary() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 12, 15);
-        final LocalDate targetDate = buildDate(2011, 1, 16);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 12, 15);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 16);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, ONE);
     }
 
     @Test(groups = "fast")
     public void testSinglePlan_LeapYear_StartingMidFebruary() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2012, 2, 15);
-        final LocalDate targetDate = buildDate(2012, 3, 15);
+        final LocalDate startDate = invoiceUtil.buildDate(2012, 2, 15);
+        final LocalDate targetDate = invoiceUtil.buildDate(2012, 3, 15);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, ONE);
     }
 
     @Test(groups = "fast")
     public void testSinglePlan_LeapYear_StartingBeforeFebruary() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2012, 1, 15);
-        final LocalDate targetDate = buildDate(2012, 2, 3);
+        final LocalDate startDate = invoiceUtil.buildDate(2012, 1, 15);
+        final LocalDate targetDate = invoiceUtil.buildDate(2012, 2, 3);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, ONE);
     }
 
     @Test(groups = "fast")
     public void testSinglePlan_LeapYear_IncludingAllOfFebruary() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2012, 1, 30);
-        final LocalDate targetDate = buildDate(2012, 3, 1);
+        final LocalDate startDate = invoiceUtil.buildDate(2012, 1, 30);
+        final LocalDate targetDate = invoiceUtil.buildDate(2012, 3, 1);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 30, ONE);
     }
 
     @Test(groups = "fast")
     public void testSinglePlan_ChangeBCDTo31() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate planChangeDate = buildDate(2011, 2, 14);
-        final LocalDate targetDate = buildDate(2011, 3, 1);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate planChangeDate = invoiceUtil.buildDate(2011, 2, 14);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 3, 1);
 
         BigDecimal expectedValue;
 
@@ -159,9 +161,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testSinglePlan_ChangeBCD() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 1);
-        final LocalDate planChangeDate = buildDate(2011, 2, 14);
-        final LocalDate targetDate = buildDate(2011, 5, 1);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 1);
+        final LocalDate planChangeDate = invoiceUtil.buildDate(2011, 2, 14);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 5, 1);
 
         BigDecimal expectedValue;
 
@@ -174,9 +176,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testSinglePlan_LeapYearFebruaryProRation() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2012, 2, 1);
-        final LocalDate endDate = buildDate(2012, 2, 15);
-        final LocalDate targetDate = buildDate(2012, 2, 19);
+        final LocalDate startDate = invoiceUtil.buildDate(2012, 2, 1);
+        final LocalDate endDate = invoiceUtil.buildDate(2012, 2, 15);
+        final LocalDate targetDate = invoiceUtil.buildDate(2012, 2, 19);
 
         final BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(NINETY, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -186,9 +188,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testPlanChange_BeforeBillingDay() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 7);
-        final LocalDate changeDate = buildDate(2011, 2, 15);
-        final LocalDate targetDate = buildDate(2011, 9, 21);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 7);
+        final LocalDate changeDate = invoiceUtil.buildDate(2011, 2, 15);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 9, 21);
 
         final BigDecimal expectedValue;
 
@@ -200,9 +202,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testPlanChange_OnBillingDay() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 7);
-        final LocalDate changeDate = buildDate(2011, 5, 7);
-        final LocalDate targetDate = buildDate(2011, 7, 21);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 7);
+        final LocalDate changeDate = invoiceUtil.buildDate(2011, 5, 7);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 7, 21);
 
         testCalculateNumberOfBillingCycles(startDate, changeDate, targetDate, 7, ONE);
 
@@ -213,9 +215,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testPlanChange_AfterBillingDay() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 2, 7);
-        final LocalDate changeDate = buildDate(2011, 5, 10);
-        final LocalDate targetDate = buildDate(2011, 9, 21);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 2, 7);
+        final LocalDate changeDate = invoiceUtil.buildDate(2011, 5, 10);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 9, 21);
 
         BigDecimal expectedValue;
 
@@ -228,9 +230,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testPlanChange_DoubleProRation() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 31);
-        final LocalDate planChangeDate = buildDate(2011, 5, 10);
-        final LocalDate targetDate = buildDate(2011, 5, 21);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 31);
+        final LocalDate planChangeDate = invoiceUtil.buildDate(2011, 5, 10);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 5, 21);
 
         BigDecimal expectedValue;
         expectedValue = SEVEN.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -244,9 +246,9 @@ public class TestProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testStartTargetEnd() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 12, 15);
-        final LocalDate targetDate = buildDate(2011, 6, 15);
-        final LocalDate endDate = buildDate(2011, 6, 17);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 12, 15);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 6, 15);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 6, 17);
 
         final BigDecimal expectedValue = TWO.add(TWO.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestTrailingProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestTrailingProRation.java
index 15a9b4c..31151bf 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestTrailingProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TestTrailingProRation.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.invoice.tests.inAdvance.quarterly;
 
+import static com.ning.billing.invoice.TestInvoiceUtil.*;
+
 import java.math.BigDecimal;
 
 import org.joda.time.LocalDate;
@@ -34,27 +36,27 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testTargetDateOnStartDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 6, 17);
-        final LocalDate endDate = buildDate(2010, 9, 25);
-        final LocalDate targetDate = buildDate(2010, 6, 17);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 6, 17);
+        final LocalDate endDate = invoiceUtil.buildDate(2010, 9, 25);
+        final LocalDate targetDate = invoiceUtil.buildDate(2010, 6, 17);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, ONE);
     }
 
     @Test(groups = "fast")
     public void testTargetDateInFirstBillingPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 6, 17);
-        final LocalDate endDate = buildDate(2010, 9, 25);
-        final LocalDate targetDate = buildDate(2010, 6, 20);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 6, 17);
+        final LocalDate endDate = invoiceUtil.buildDate(2010, 9, 25);
+        final LocalDate targetDate = invoiceUtil.buildDate(2010, 6, 20);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, ONE);
     }
 
     @Test(groups = "fast")
     public void testTargetDateAtEndOfFirstBillingCycle() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 6, 17);
-        final LocalDate endDate = buildDate(2010, 9, 25);
-        final LocalDate targetDate = buildDate(2010, 9, 17);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 6, 17);
+        final LocalDate endDate = invoiceUtil.buildDate(2010, 9, 25);
+        final LocalDate targetDate = invoiceUtil.buildDate(2010, 9, 17);
 
         final BigDecimal expectedValue = ONE.add(EIGHT.divide(NINETY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
@@ -62,9 +64,9 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testTargetDateInProRationPeriod() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 6, 17);
-        final LocalDate endDate = buildDate(2010, 9, 25);
-        final LocalDate targetDate = buildDate(2010, 9, 18);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 6, 17);
+        final LocalDate endDate = invoiceUtil.buildDate(2010, 9, 25);
+        final LocalDate targetDate = invoiceUtil.buildDate(2010, 9, 18);
 
         final BigDecimal expectedValue = ONE.add(EIGHT.divide(NINETY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
@@ -72,8 +74,8 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testTargetDateOnEndDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 6, 17);
-        final LocalDate endDate = buildDate(2010, 9, 25);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 6, 17);
+        final LocalDate endDate = invoiceUtil.buildDate(2010, 9, 25);
 
         final BigDecimal expectedValue = ONE.add(EIGHT.divide(NINETY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, endDate, 17, expectedValue);
@@ -81,9 +83,9 @@ public class TestTrailingProRation extends ProRationInAdvanceTestBase {
 
     @Test(groups = "fast")
     public void testTargetDateAfterEndDate() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2010, 6, 17);
-        final LocalDate endDate = buildDate(2010, 9, 25);
-        final LocalDate targetDate = buildDate(2010, 9, 30);
+        final LocalDate startDate = invoiceUtil.buildDate(2010, 6, 17);
+        final LocalDate endDate = invoiceUtil.buildDate(2010, 9, 25);
+        final LocalDate targetDate = invoiceUtil.buildDate(2010, 9, 30);
 
         final BigDecimal expectedValue = ONE.add(EIGHT.divide(NINETY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/TestValidationProRation.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/TestValidationProRation.java
index e6fb631..cc75729 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/TestValidationProRation.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/TestValidationProRation.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.invoice.tests.inAdvance;
 
+import static com.ning.billing.invoice.TestInvoiceUtil.*;
+
 import java.math.BigDecimal;
 
 import org.joda.time.LocalDate;
@@ -43,44 +45,44 @@ public class TestValidationProRation extends ProRationTestBase {
 
     @Test(groups = "fast", expectedExceptions = InvalidDateSequenceException.class)
     public void testTargetStartEnd() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 30);
-        final LocalDate endDate = buildDate(2011, 3, 15);
-        final LocalDate targetDate = buildDate(2011, 1, 15);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 30);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 3, 15);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 1, 15);
 
         calculateNumberOfBillingCycles(startDate, endDate, targetDate, 15);
     }
 
     @Test(groups = "fast", expectedExceptions = InvalidDateSequenceException.class)
     public void testTargetEndStart() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 4, 30);
-        final LocalDate endDate = buildDate(2011, 3, 15);
-        final LocalDate targetDate = buildDate(2011, 2, 15);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 4, 30);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 3, 15);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 15);
 
         calculateNumberOfBillingCycles(startDate, endDate, targetDate, 15);
     }
 
     @Test(groups = "fast", expectedExceptions = InvalidDateSequenceException.class)
     public void testEndTargetStart() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 3, 30);
-        final LocalDate endDate = buildDate(2011, 1, 15);
-        final LocalDate targetDate = buildDate(2011, 2, 15);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 3, 30);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 1, 15);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 15);
 
         calculateNumberOfBillingCycles(startDate, endDate, targetDate, 15);
     }
 
     @Test(groups = "fast", expectedExceptions = InvalidDateSequenceException.class)
     public void testEndStartTarget() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 1, 30);
-        final LocalDate endDate = buildDate(2011, 1, 15);
-        final LocalDate targetDate = buildDate(2011, 2, 15);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 1, 30);
+        final LocalDate endDate = invoiceUtil.buildDate(2011, 1, 15);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 15);
 
         calculateNumberOfBillingCycles(startDate, endDate, targetDate, 15);
     }
 
     @Test(groups = "fast", expectedExceptions = InvalidDateSequenceException.class)
     public void testTargetStart() throws InvalidDateSequenceException {
-        final LocalDate startDate = buildDate(2011, 4, 30);
-        final LocalDate targetDate = buildDate(2011, 2, 15);
+        final LocalDate startDate = invoiceUtil.buildDate(2011, 4, 30);
+        final LocalDate targetDate = invoiceUtil.buildDate(2011, 2, 15);
 
         calculateNumberOfBillingCycles(startDate, targetDate, 15);
     }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/ProRationTestBase.java b/invoice/src/test/java/com/ning/billing/invoice/tests/ProRationTestBase.java
index 676b612..dd270d8 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/ProRationTestBase.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/ProRationTestBase.java
@@ -16,12 +16,15 @@
 
 package com.ning.billing.invoice.tests;
 
+import static com.ning.billing.invoice.TestInvoiceUtil.*;
+
 import java.math.BigDecimal;
 import java.util.List;
 
 import org.joda.time.LocalDate;
 
 import com.ning.billing.catalog.api.BillingPeriod;
+import com.ning.billing.invoice.InvoiceTestSuiteNoDB;
 import com.ning.billing.invoice.model.BillingMode;
 import com.ning.billing.invoice.model.InvalidDateSequenceException;
 import com.ning.billing.invoice.model.RecurringInvoiceItemData;
@@ -29,7 +32,7 @@ import com.ning.billing.invoice.model.RecurringInvoiceItemData;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.fail;
 
-public abstract class ProRationTestBase extends InvoicingTestBase {
+public abstract class ProRationTestBase extends InvoiceTestSuiteNoDB {
 
     protected abstract BillingMode getBillingMode();
 
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/TestChargeBacks.java b/invoice/src/test/java/com/ning/billing/invoice/tests/TestChargeBacks.java
index 461a8d8..9fb553e 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/TestChargeBacks.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/TestChargeBacks.java
@@ -16,16 +16,11 @@
 
 package com.ning.billing.invoice.tests;
 
-import java.io.IOException;
 import java.math.BigDecimal;
-import java.net.URL;
 import java.util.List;
 import java.util.UUID;
 
-import org.mockito.Mockito;
-import org.skife.jdbi.v2.IDBI;
 import org.skife.jdbi.v2.exceptions.TransactionFailedException;
-import org.testng.annotations.BeforeSuite;
 import org.testng.annotations.Test;
 
 import com.ning.billing.ErrorCode;
@@ -34,23 +29,6 @@ import com.ning.billing.invoice.InvoiceTestSuiteWithEmbeddedDB;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoicePayment;
-import com.ning.billing.invoice.api.InvoicePaymentApi;
-import com.ning.billing.invoice.api.invoice.DefaultInvoicePaymentApi;
-import com.ning.billing.invoice.api.svcs.DefaultInvoiceInternalApi;
-import com.ning.billing.invoice.dao.DefaultInvoiceDao;
-import com.ning.billing.invoice.dao.InvoiceDao;
-import com.ning.billing.invoice.dao.InvoiceItemSqlDao;
-import com.ning.billing.invoice.glue.InvoiceModuleWithEmbeddedDb;
-import com.ning.billing.invoice.notification.MockNextBillingDatePoster;
-import com.ning.billing.invoice.notification.NextBillingDatePoster;
-import com.ning.billing.util.cache.CacheControllerDispatcher;
-import com.ning.billing.util.callcontext.InternalCallContextFactory;
-import com.ning.billing.util.clock.Clock;
-import com.ning.billing.util.clock.ClockMock;
-import com.ning.billing.util.dao.DefaultNonEntityDao;
-import com.ning.billing.util.dao.NonEntityDao;
-import com.ning.billing.util.svcapi.invoice.InvoiceInternalApi;
-import com.ning.billing.util.svcsapi.bus.InternalBus;
 
 import static com.ning.billing.invoice.tests.InvoiceTestUtils.createAndPersistInvoice;
 import static com.ning.billing.invoice.tests.InvoiceTestUtils.createAndPersistPayment;
@@ -64,48 +42,13 @@ public class TestChargeBacks extends InvoiceTestSuiteWithEmbeddedDB {
     private static final BigDecimal FIFTEEN = new BigDecimal("15.00");
     private static final BigDecimal THIRTY = new BigDecimal("30.00");
     private static final BigDecimal ONE_MILLION = new BigDecimal("1000000.00");
-    private InvoiceItemSqlDao invoiceItemSqlDao;
-    private InvoicePaymentApi invoicePaymentApi;
-    private InvoiceInternalApi invoiceApi;
-    private InternalCallContextFactory internalCallContextFactory;
-
-    private final Clock clock = new ClockMock();
-    private final CacheControllerDispatcher controllerDispatcher = new CacheControllerDispatcher();
 
     private static final Currency CURRENCY = Currency.EUR;
 
-    @BeforeSuite(groups = "slow")
-    public void setup() throws IOException {
-        loadSystemPropertiesFromClasspath("/resource.properties");
-
-        final IDBI dbi = getDBI();
-
-        invoiceDao.test(internalCallContext);
-
-        final NonEntityDao nonEntityDao = new DefaultNonEntityDao(dbi);
-        invoiceItemSqlDao = dbi.onDemand(InvoiceItemSqlDao.class);
-        invoiceItemSqlDao.test(internalCallContext);
-        final NextBillingDatePoster nextBillingDatePoster = new MockNextBillingDatePoster();
-        internalCallContextFactory = new InternalCallContextFactory(clock, nonEntityDao, controllerDispatcher);
-        final InvoiceDao invoiceDao = new DefaultInvoiceDao(dbi, nextBillingDatePoster, Mockito.mock(InternalBus.class), clock, controllerDispatcher, nonEntityDao);
-        invoicePaymentApi = new DefaultInvoicePaymentApi(invoiceDao, internalCallContextFactory);
-        invoiceApi = new DefaultInvoiceInternalApi(invoiceDao);
-    }
-
-    private static void loadSystemPropertiesFromClasspath(final String resource) {
-        final URL url = InvoiceModuleWithEmbeddedDb.class.getResource(resource);
-        assertNotNull(url);
-        try {
-            System.getProperties().load(url.openStream());
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
     @Test(groups = "slow")
     public void testCompleteChargeBack() throws InvoiceApiException {
-        final Invoice invoice = createAndPersistInvoice(invoiceDao,  clock, THIRTY, CURRENCY, internalCallContext);
-        final InvoicePayment payment = createAndPersistPayment(invoiceApi, clock, invoice.getId(), THIRTY, CURRENCY, internalCallContext);
+        final Invoice invoice = createAndPersistInvoice(invoiceDao, clock, THIRTY, CURRENCY, internalCallContext);
+        final InvoicePayment payment = createAndPersistPayment(invoiceInternalApi, clock, invoice.getId(), THIRTY, CURRENCY, internalCallContext);
 
         // create a full charge back
         invoicePaymentApi.createChargeback(payment.getId(), THIRTY, callContext);
@@ -117,8 +60,8 @@ public class TestChargeBacks extends InvoiceTestSuiteWithEmbeddedDB {
 
     @Test(groups = "slow")
     public void testPartialChargeBack() throws InvoiceApiException {
-        final Invoice invoice = createAndPersistInvoice(invoiceDao,  clock, THIRTY, CURRENCY, internalCallContext);
-        final InvoicePayment payment = createAndPersistPayment(invoiceApi, clock, invoice.getId(), THIRTY, CURRENCY, internalCallContext);
+        final Invoice invoice = createAndPersistInvoice(invoiceDao, clock, THIRTY, CURRENCY, internalCallContext);
+        final InvoicePayment payment = createAndPersistPayment(invoiceInternalApi, clock, invoice.getId(), THIRTY, CURRENCY, internalCallContext);
 
         // create a partial charge back
         invoicePaymentApi.createChargeback(payment.getId(), FIFTEEN, callContext);
@@ -131,8 +74,8 @@ public class TestChargeBacks extends InvoiceTestSuiteWithEmbeddedDB {
     @Test(groups = "slow", expectedExceptions = InvoiceApiException.class)
     public void testChargeBackLargerThanPaymentAmount() throws InvoiceApiException {
         try {
-            final Invoice invoice = createAndPersistInvoice(invoiceDao,  clock, THIRTY, CURRENCY, internalCallContext);
-            final InvoicePayment payment = createAndPersistPayment(invoiceApi, clock, invoice.getId(), THIRTY, CURRENCY, internalCallContext);
+            final Invoice invoice = createAndPersistInvoice(invoiceDao, clock, THIRTY, CURRENCY, internalCallContext);
+            final InvoicePayment payment = createAndPersistPayment(invoiceInternalApi, clock, invoice.getId(), THIRTY, CURRENCY, internalCallContext);
 
             // create a large charge back
             invoicePaymentApi.createChargeback(payment.getId(), ONE_MILLION, callContext);
@@ -145,8 +88,8 @@ public class TestChargeBacks extends InvoiceTestSuiteWithEmbeddedDB {
     @Test(groups = "slow", expectedExceptions = InvoiceApiException.class)
     public void testNegativeChargeBackAmount() throws InvoiceApiException {
         try {
-            final Invoice invoice = createAndPersistInvoice(invoiceDao,  clock, THIRTY, CURRENCY, internalCallContext);
-            final InvoicePayment payment = createAndPersistPayment(invoiceApi, clock, invoice.getId(), THIRTY, CURRENCY, internalCallContext);
+            final Invoice invoice = createAndPersistInvoice(invoiceDao, clock, THIRTY, CURRENCY, internalCallContext);
+            final InvoicePayment payment = createAndPersistPayment(invoiceInternalApi, clock, invoice.getId(), THIRTY, CURRENCY, internalCallContext);
 
             // create a partial charge back
             invoicePaymentApi.createChargeback(payment.getId(), BigDecimal.ONE.negate(), callContext);
@@ -157,8 +100,8 @@ public class TestChargeBacks extends InvoiceTestSuiteWithEmbeddedDB {
 
     @Test(groups = "slow")
     public void testGetAccountIdFromPaymentIdHappyPath() throws InvoiceApiException {
-        final Invoice invoice = createAndPersistInvoice(invoiceDao,  clock, THIRTY, CURRENCY, internalCallContext);
-        final InvoicePayment payment = createAndPersistPayment(invoiceApi, clock, invoice.getId(), THIRTY, CURRENCY, internalCallContext);
+        final Invoice invoice = createAndPersistInvoice(invoiceDao, clock, THIRTY, CURRENCY, internalCallContext);
+        final InvoicePayment payment = createAndPersistPayment(invoiceInternalApi, clock, invoice.getId(), THIRTY, CURRENCY, internalCallContext);
         final UUID accountId = invoicePaymentApi.getAccountIdFromInvoicePaymentId(payment.getId(), callContext);
         assertEquals(accountId, invoice.getAccountId());
     }
@@ -183,8 +126,8 @@ public class TestChargeBacks extends InvoiceTestSuiteWithEmbeddedDB {
 
     @Test(groups = "slow")
     public void testGetChargeBacksByAccountIdHappyPath() throws InvoiceApiException {
-        final Invoice invoice = createAndPersistInvoice(invoiceDao,  clock, THIRTY, CURRENCY, internalCallContext);
-        final InvoicePayment payment = createAndPersistPayment(invoiceApi, clock, invoice.getId(), THIRTY, CURRENCY, internalCallContext);
+        final Invoice invoice = createAndPersistInvoice(invoiceDao, clock, THIRTY, CURRENCY, internalCallContext);
+        final InvoicePayment payment = createAndPersistPayment(invoiceInternalApi, clock, invoice.getId(), THIRTY, CURRENCY, internalCallContext);
 
         // create a partial charge back
         invoicePaymentApi.createChargeback(payment.getId(), FIFTEEN, callContext);
@@ -204,8 +147,8 @@ public class TestChargeBacks extends InvoiceTestSuiteWithEmbeddedDB {
 
     @Test(groups = "slow")
     public void testGetChargeBacksByInvoicePaymentIdHappyPath() throws InvoiceApiException {
-        final Invoice invoice = createAndPersistInvoice(invoiceDao,  clock, THIRTY, CURRENCY, internalCallContext);
-        final InvoicePayment payment = createAndPersistPayment(invoiceApi, clock, invoice.getId(), THIRTY, CURRENCY, internalCallContext);
+        final Invoice invoice = createAndPersistInvoice(invoiceDao, clock, THIRTY, CURRENCY, internalCallContext);
+        final InvoicePayment payment = createAndPersistPayment(invoiceInternalApi, clock, invoice.getId(), THIRTY, CURRENCY, internalCallContext);
 
         // create a partial charge back
         invoicePaymentApi.createChargeback(payment.getId(), FIFTEEN, callContext);